A Model Context Protocol (MCP) server that connects AI assistants to the Linux Foundation's LFX platform.
- Explore projects — Search and retrieve details for Linux Foundation projects
- Manage committees — Search, create, update, and delete project committees and their members
- Work with mailing lists — Search project mailing lists and their subscribers
- Track project meetings — Find upcoming meetings, registrants, past participants, and AI-generated summaries
- Query membership — Search project memberships by tier, status, organization, and more; get and manage key contacts
- Analyze data with LFX Lens — Compare and report on project activities and contributions over time
- ... and more!
The LFX MCP Server is available as a hosted, production service at:
https://mcp.lfx.dev/mcp
You sign in through LFX with your Linux Foundation account (LFID) the first time you connect. Sign-in succeeds only when your account has been enabled for MCP access and you use one of the supported clients below; to request access, see Using the LFX MCP Server as a community member. After sign-in, what you can see and do follows your LFX permissions; some analytics tools are available only to Linux Foundation staff (see LFX Lens).
The following clients are set up to work with the LFX MCP Server. Client-specific instructions (menu paths, settings names, etc.) are subject to change as vendors update their products; consult the client's own documentation if the steps below no longer match what you see. Please file an issue to request additional client support.
Running the server locally in stdio mode is also supported for development and debugging; see Local (stdio) mode below.
Copy-paste into your browser location bar:
goose://extension?url=https%3A%2F%2Fmcp.lfx.dev%2Fmcp&type=streamable_http&id=lfx&name=LFX&description=LFX%20MCP%20Server
Start a new chat and Goose will open a browser window for LFID login.
- Run
goose configure. - Select Add Extension → Remote Extension (Streamable HTTP).
- Enter
LFXas the name. - Enter
https://mcp.lfx.dev/mcpas the URI. - Enter
300for the timeout. - Enter
LFX MCP Serveras the description. - Select No for adding custom headers.
After it acknowledges that your configuration was saved, running goose will open a browser window for LFID login.
OpenCode v1 requires a client ID. The following client ID only works with OpenCode v1.
Add the following to your ~/.config/opencode/opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"lfx-mcp-server": {
"type": "remote",
"url": "https://mcp.lfx.dev/mcp",
"enabled": true,
"oauth": {
"clientId": "LnBd9qGpwjXNs26aZxeXSkTCs0ac4zgM"
}
}
}
}See the OpenCode v1 MCP documentation for more details.
OpenCode v2 supports Client ID Metadata Documents (CIMD), so no client ID is needed. Add the following to your ~/.config/opencode/opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"servers": {
"lfx": {
"type": "remote",
"url": "https://mcp.lfx.dev/mcp"
}
}
}
}See the OpenCode v2 MCP documentation for more details.
In Zed, open the Agent panel settings (ellipsis button) → Add Custom Server → Remote. Enter the following:
{
"lfx": {
"url": "https://mcp.lfx.dev/mcp"
}
}Click Add Server → Authenticate to open a browser window for LFID login.
If you use the Linux Foundation's enterprise Claude.ai organization, the LFX MCP Server is already provisioned as a connector in both Claude Desktop and Claude Code.
- From the sidebar, select Customize → Connectors.
- Find LFX in the list.
- Click Connect and sign in with your LFID.
Run /mcp inside Claude Code and select claude.ai LFX → Authenticate. Claude Code will open a browser window for LFID login.
- From the sidebar, select Customize → Connectors.
- Use the + button and select Add Custom Connector.
- Enter LFX and the URL
https://mcp.lfx.dev/mcp. - Press Add, then Connect and sign in with your LFID.
claude mcp add --transport http lfx https://mcp.lfx.dev/mcpRun /mcp inside Claude Code and select lfx → Authenticate. Claude Code will open a browser for LFID login.
Run MCP: Open User Configuration to open the mcp.json file to add the LFX MCP server in your user-level config:
{
"servers": {
"lfx": {
"type": "http",
"url": "https://mcp.lfx.dev/mcp"
}
}
}VS Code will prompt you to trust the server, then open a browser window for Linux Foundation SSO.
Cursor requires a client ID. The following client ID only works with Cursor.
Add the following to your ~/.cursor/mcp.json:
{
"mcpServers": {
"lfx": {
"url": "https://mcp.lfx.dev/mcp",
"auth": {
"CLIENT_ID": "HwGWwUy4uvqVQYDsuXb9IVamzcUhdZj5"
}
}
}
}Must have a plan that supports Developer mode and MCP access.
- In ChatGPT, navigate to Plugins → MCP → Add server.
- Enter LFX as the name.
- Select Streamable HTTP as the type.
- Enter
https://mcp.lfx.dev/mcpas the URL. - Hit Save, then click the Authenticate button from the Servers list to open a browser window for LFID login.
If your MCP client is not listed here, you may try using mcp-remote as a local proxy.
The client ID shown here is only for embedding mcp-remote as a proxy and does not support direct MCP client use.
The port 3334 is required so that the OAuth callback URL matches the registered client. Please refer to your client's documentation for the exact configuration syntax.
{
"mcpServers": {
"lfx": {
"command": "npx",
"args": [
"mcp-remote",
"https://mcp.lfx.dev/mcp",
"3334",
"--static-oauth-client-info",
"{\"client_id\":\"tjrXD5ZJORf6rpngMSRqqPmf3W1bnHEV\"}"
]
}
}
}A browser window will open for authentication on first use. To re-authenticate, clear cached credentials with:
rm -rf ~/.mcp-authMCP Inspector requires a client ID. The following client ID only works with MCP Inspector.
Add the following to your ~/.mcp-inspector/mcp.json:
{
"mcpServers": {
"lfx": {
"type": "streamable-http",
"url": "https://mcp.lfx.dev/mcp",
"oauth": {
"clientId": "4ibLLbnz9kwMEcE3RUCUH51F0RS3Hx3O"
}
}
}
}Run:
npx @modelcontextprotocol/inspectorThe server can run locally over stdio, authenticating with a bearer token supplied directly by the operator instead of the normal SSO, client-token-exchange (CTE), or M2M flows used in HTTP mode. This is intended to be used together with lfx-cli, which mints and refreshes that token on your behalf:
# Log in once (interactive device-code flow).
lfx auth login
# Run the server in stdio mode, passing a fresh token from lfx-cli.
LFXMCP_LFX_TOKEN="$(lfx auth token)" \
LFXMCP_LFX_API_URL="https://lfx-api.v2.cluster.lfx.dev" \
./bin/lfx-mcp-server -mode=stdioNotes:
lfx_token/LFXMCP_LFX_TOKENis only accepted in stdio mode; the server refuses to start in HTTP mode with it set, since HTTP mode is a shared, multi-tenant surface and a single static token must never be used to answer requests for arbitrary callers.- The token is used as-is for all LFX API calls — no token exchange, CTE, or M2M grant is performed for it. M2M flows to non-LFX downstream services (e.g. LFX Lens) are unaffected and continue to use their own configured client credentials.
- The server reads the token's expiry without verifying its signature — no authorization decision is ever made from this unverified peek; the LFX API itself independently verifies and authorizes every call — and refuses to start if it has already expired. Otherwise, the server automatically stops when the token expires; run it under a supervisor loop that re-invokes
lfx auth tokenand restarts the server so the token stays fresh. - The server also warns (without refusing to start) if the token's
audclaim doesn't appear to match-lfx_api_url/LFXMCP_LFX_API_URL, since a mismatched audience would otherwise only surface as a confusing 401 on the first LFX API call. - Because there is no MCP-level OAuth in stdio mode, all tools enabled via
-tools/LFXMCP_TOOLSare registered without the read/manage scope gating that applies to HTTP mode. - The
user_infotool also accepts-lfx_token/LFXMCP_LFX_TOKENas its/userinfobearer in stdio mode (the LF identity provider issues it withopenid profile emailscope, which/userinfoaccepts regardless of the token's LFX API audience).
People data (group members, meeting registrants, past meeting participants and the people fields of meeting records) is returned to non-staff callers as LFX Self Serve shows it to them on screen; LF staff, machine and API-key callers get the records as the services return them. Mailing-list members are returned to non-staff callers only for the lists they manage or audit, plus their own subscriptions on any list: this follows the platform's intended rule, which is stricter than what LFX Self Serve shows today. Member records, membership key contacts, org committee seats and project settings are not under this rule yet and are returned as the services return them, pending product decisions.
| Tool | Description |
|---|---|
search_projects |
Search LFX projects by name (typeahead), exact slug or exact name, optionally scoped to a parent or legal parent; include_total returns the count of indexed, caller-visible projects |
get_project |
Get a project's base info and settings by UID |
| Tool | Description |
|---|---|
count_lfx_resources |
Count indexed LFX v2 records (meetings, participants, committees, members, projects) visible to the caller; complete=false means a lower bound |
| Tool | Description |
|---|---|
search_committees |
Search for committees by name; optionally filter by project |
get_committee |
Get a committee's base info and settings by UID |
create_committee |
Create a new committee under a project |
update_committee |
Update a committee's base information |
update_committee_settings |
Update a committee's settings (visibility, email requirements, meeting attendee defaults) |
delete_committee |
Delete a committee by UID |
search_committee_members |
Search committee members; filter by committee, project, organization name, or name |
get_committee_member |
Get a specific committee member by committee and member UID |
create_committee_member |
Add a new member to a committee |
update_committee_member |
Update an existing committee member's information |
delete_committee_member |
Remove a member from a committee |
get_org_committee_seats |
Summarise an organisation's committee seats across a foundation and its direct child projects; filter by category, optionally list the seats (seats, not the membership's contact of record); include_membership_contacts adds the membership contacts of record and a per-project representation pairing |
audit_committee_coverage |
Audit a foundation and its direct child projects for committees onboarded into LFX v2, visible member counts per committee, and projects with active memberships but no committee or an empty board |
| Tool | Description |
|---|---|
search_mailing_lists |
Search for mailing lists by name; optionally filter by project |
get_mailing_list |
Get a mailing list's base info and settings by UID |
get_mailing_list_service |
Get a mailing list service's base info and settings by UID |
search_mailing_list_members |
Search mailing list members; filter by list, project, or name |
get_mailing_list_member |
Get a specific mailing list member by list and member UID |
| Tool | Description |
|---|---|
search_members |
Search and filter members (memberships) by project, tier, status, or B2B organization |
get_member_membership |
Get a single membership by membership UID |
get_membership_key_contacts |
Get a membership's key contacts (contacts of record, not committee seats) |
get_membership_key_contact |
Get a single key contact by membership UID and contact UID |
create_membership_key_contact |
Add a key contact to a membership |
update_membership_key_contact |
Update an existing key contact on a membership |
delete_membership_key_contact |
Remove a key contact from a membership |
| Tool | Description |
|---|---|
search_meetings |
Search meetings by project, committee, date; upcoming occurrences |
get_meeting |
Get a meeting by UID |
search_meeting_registrants |
Search meeting registrants; filter by meeting, committee, project (non-staff callers: per meeting) |
get_meeting_registrant |
Get a meeting registrant by UID |
| Tool | Description |
|---|---|
search_past_meetings |
Search past meetings; filter by project, committee, date range |
get_past_meeting |
Get a past meeting by UID |
search_past_meeting_participants |
Search past meeting participants; filter by meeting, committee, project, date range (non-staff callers: per past meeting, or a date range), attended_only or organisation name; count_only returns record counts; people are de-duplicated by identity like LFX Self Serve (dedupe=false returns raw records) |
get_past_meeting_participant |
Get a past meeting participant by UID |
search_past_meeting_summaries |
Search past meeting summaries; filter by meeting, project, name |
get_past_meeting_summary |
Get a past meeting summary by UID |
| Tool | Description |
|---|---|
list_discord_roles |
List all roles in a project's Discord guild |
find_discord_role |
Find a Discord role by name |
find_discord_user |
Find a Discord guild member by name and optional email |
check_discord_user_role |
Check whether a Discord user already has a specific role |
assign_discord_role |
Assign a Discord role to a user |
| Tool | Description |
|---|---|
list_email_templates |
List all available email templates for a project |
send_email |
Send a templated email via LFX mail servers |
These tools are available only to Linux Foundation staff; they do not appear in the tool list for other accounts.
| Tool | Description |
|---|---|
query_lfx_lens |
Ask natural-language questions about a project's data (events, contributors, health, value, and more) |
explore_lfx_semantic_layer |
Discover Insights metrics and the dimensions available to them |
query_lfx_semantic_layer |
Run a metric query against the Insights Semantic Layer (filter, group, rank, trend) |
query_lfx_standard_metrics |
Run a governed standard metric over LFX data, scoped by project, organization and dates |
read_lfx_semantic_layer_guidance |
Read the agent guidance for the semantic layer and lens tools (routing, query syntax, scoping, recipes) |
read_lfx_standard_metrics_guidance |
Read the agent guidance for the standard metrics (inventory, scoping, how to read results) |
| Tool | Description |
|---|---|
search_b2b_orgs |
Search B2B organizations by name or domain |
| Tool | Description |
|---|---|
user_info |
Get the authenticated user's OpenID Connect profile |
Copyright The Linux Foundation and each contributor to LFX.
This project's source code is licensed under the MIT License. A copy of the license is available in LICENSE.
This project's documentation is licensed under the Creative Commons Attribution 4.0 International License (CC-BY-4.0). A copy of the license is available in LICENSE-docs.