# LFX MCP Server

A [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) server that connects AI assistants to the Linux Foundation's LFX platform.

## Features

- **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!

## Connecting to the LFX MCP Server

The LFX MCP Server is available as a hosted, production service at:

```text
https://mcp.lfx.dev/mcp
```

You will be prompted to log in with your Linux Foundation account (LFID) the first time you connect. *All MCP permissions correspond to LFX platform permissions granted to your LFID.*

**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 LFX MCP Server as a local (stdio) MCP server is not supported at this time.

### Goose

#### GUI (one-click install)

Copy-paste into your browser location bar:

```text
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.

#### CLI

1. Run `goose configure`.
2. Select **Add Extension** → **Remote Extension (Streamable HTTP)**.
3. Enter `LFX` as the name.
4. Enter `https://mcp.lfx.dev/mcp` as the URI.
5. Enter `300` for the timeout.
6. Enter `LFX MCP Server` as the description.
7. 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

*OpenCode requires a client ID. The following client ID only works with OpenCode.*

Add the following to your `~/.config/opencode/opencode.json`:

```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 MCP documentation](https://opencode.ai/docs/mcp-servers) for more details.

### Zed

In Zed, open the Agent panel settings (ellipsis button) → **Add Custom Server** → **Remote**. Enter the following:

```json
{
  "lfx": {
    "url": "https://mcp.lfx.dev/mcp"
  }
}
```

Click **Add Server** → **Authenticate** to open a browser window for LFID login.

### Claude (LF enterprise)

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.

#### Claude Desktop

1. From the sidebar, select **Customize** → **Connectors**.
2. Find **LFX** in the list.
3. Click **Connect** and sign in with your LFID.

#### Claude Code

Run `/mcp` inside Claude Code and select **claude.ai LFX** → **Authenticate**. Claude Code will open a browser window for LFID login.

### Claude Desktop (personal account)

1. From the sidebar, select **Customize** → **Connectors**.
2. Use the **+** button and select **Add Custom Connector**.
3. Enter **LFX** and the URL `https://mcp.lfx.dev/mcp`.
4. Press **Add**, then **Connect** and sign in with your LFID.

### Claude Code (personal account)

```bash
claude mcp add --transport http lfx https://mcp.lfx.dev/mcp
```

Run `/mcp` inside Claude Code and select **lfx** → **Authenticate**. Claude Code will open a browser for LFID login.

### Visual Studio Code

Run **MCP: Open User Configuration** to open the `mcp.json` file to add the LFX MCP server in your user-level config:

```json
{
  "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

*Cursor requires a client ID. The following client ID only works with Cursor.*

Add the following to your `~/.cursor/mcp.json`:

```json
{
  "mcpServers": {
    "lfx": {
      "url": "https://mcp.lfx.dev/mcp",
      "auth": {
        "CLIENT_ID": "HwGWwUy4uvqVQYDsuXb9IVamzcUhdZj5"
      }
    }
  }
}
```

### ChatGPT

*Must have a plan that supports Developer mode and MCP access.*

1. In ChatGPT, navigate to **Plugins → MCP → Add server**.
2. Enter **LFX** as the name.
3. Select **Streamable HTTP** as the type.
4. Enter `https://mcp.lfx.dev/mcp` as the URL.
5. Hit **Save**, then click the **Authenticate** button from the Servers list to open a browser window for LFID login.

### Additional clients (via mcp-remote)

If your MCP client is not listed here, you may try using [mcp-remote](https://github.com/geelen/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.

```json
{
  "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:

```bash
rm -rf ~/.mcp-auth
```

### MCP Inspector

*MCP Inspector requires a client ID. The following client ID only works with MCP Inspector.*

Add the following to your `~/.mcp-inspector/mcp.json`:

```json
{
  "mcpServers": {
    "lfx": {
      "type": "streamable-http",
      "url": "https://mcp.lfx.dev/mcp",
      "oauth": {
        "clientId": "4ibLLbnz9kwMEcE3RUCUH51F0RS3Hx3O"
      }
    }
  }
}
```

Run:

```bash
npx @modelcontextprotocol/inspector
```

## Available Tools

### Projects

| 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                 |

### Resource Counts

| 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 |

### Committees

| 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 |

### Mailing Lists

| 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      |

### Members

| 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                                                |

### Meetings

| Tool                         | Description                                                       |
|------------------------------|-------------------------------------------------------------------|
| `search_meetings`            | Search for meetings; filter by project, committee, date range     |
| `get_meeting`                | Get a meeting by UID                                              |
| `search_meeting_registrants` | Search meeting registrants; filter by meeting, committee, project |
| `get_meeting_registrant`     | Get a meeting registrant by UID                                   |

### Past Meeting Data

| 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, 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, committee, project    |
| `get_past_meeting_summary`         | Get a past meeting summary by UID                                       |

### Discord

| 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                          |

### Email

| Tool                   | Description                                      |
|------------------------|--------------------------------------------------|
| `list_email_templates` | List all available email templates for a project |
| `send_email`           | Send a templated email via LFX mail servers      |

### LFX Lens

| 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)                   |

### B2B Organizations

| Tool              | Description                                |
|-------------------|--------------------------------------------|
| `search_b2b_orgs` | Search B2B organizations by name or domain |

### Utility

| Tool          | Description                                         |
|---------------|-----------------------------------------------------|
| `hello_world` | Simple greeting tool for testing MCP connectivity   |
| `user_info`   | Get the authenticated user's OpenID Connect profile |

## License

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.
