Skip to main content

CongressMCP

Live U.S. Congressional data for any MCP client — Claude Code, ChatGPT, Copilot, Codex, Cursor, OpenCode, Gemini CLI, Grok Build, and more.

Bills, full bill text, votes, members, committees, hearings, nominations, and the Congressional Record — queried in natural language through the Model Context Protocol. Runs locally on your machine against the free Congress.gov and GovInfo APIs. No account, no hosted service, no telemetry.

Quick Start

1. Get a free Congress.gov API key

Sign up at api.congress.gov/sign-up — takes 30 seconds. The same key also works for GovInfo (full bill text).

2. Install uv

CongressMCP is published on PyPI and launched with uvx, which ships with uv:

# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

(brew install uv, winget install astral-sh.uv, and pipx install uv also work.) Prefer pip? pip install congressmcp gives you a congressmcp command you can use in place of uvx congressmcp below.

3. Connect your client

Every client needs the same three facts: command uvx, args ["congressmcp"], env CONGRESS_API_KEY. Clients are listed roughly by how many professional developers use them today (JetBrains Developer Ecosystem survey, mid-2026, then Pragmatic Engineer's 2026 tooling survey), so the one you want is probably near the top:

Client Where it's configured Notes
Claude Code claude mcp add … or .mcp.json
ChatGPT Developer mode → connector URL remote only — needs HTTP mode
VS Code / GitHub Copilot .vscode/mcp.json uses servers + inputs
OpenAI Codex CLI codex mcp add … or ~/.codex/config.toml TOML
Cursor ~/.cursor/mcp.json or .cursor/mcp.json
JetBrains AI Assistant / Junie Settings → AI Assistant → MCP paste the Claude Desktop JSON
OpenCode opencode.jsonmcp command is a single array
Gemini CLI gemini mcp add … or ~/.gemini/settings.json
Claude.ai Connectors → custom connector URL remote only — needs HTTP mode
Claude Desktop claude_desktop_config.json
Windsurf ~/.codeium/windsurf/mcp_config.json
Zed settings.jsoncontext_servers
Cline / Roo Code MCP settings panel → edit JSON
Goose goose configure or ~/.config/goose/config.yaml YAML
Grok Build grok mcp add … or ~/.grok/config.toml TOML; also auto-imports Claude Code / Cursor config
Hermes Agent hermes mcp add … or ~/.hermes/config.yaml YAML
OpenClaw openclaw mcp add … or ~/.openclaw/openclaw.json JSON5
Continue ~/.continue/config.yaml YAML, agent mode only
Open WebUI Admin → Integrations → MCP server URL remote only — needs HTTP mode
LM Studio Program tab → mcp.json Cursor-style JSON

Anything not listed that speaks MCP over stdio will work with the same three values.

Claude Code
# just for you
claude mcp add congressmcp --env CONGRESS_API_KEY=your-api-key-here -- uvx congressmcp

# shared with your team via .mcp.json in the repo root
claude mcp add --scope project congressmcp --env CONGRESS_API_KEY='${CONGRESS_API_KEY}' -- uvx congressmcp

Put the server name before --env as shown — if --env comes first, the CLI tries to parse the name as another KEY=value pair. Equivalent .mcp.json:

{
  "mcpServers": {
    "congressmcp": {
      "type": "stdio",
      "command": "uvx",
      "args": ["congressmcp"],
      "env": { "CONGRESS_API_KEY": "${CONGRESS_API_KEY}" }
    }
  }
}

${VAR} / ${VAR:-default} are expanded from your environment, so the key never has to be committed.

VS Code / GitHub Copilot

Workspace: .vscode/mcp.json (or Command Palette → MCP: Add Server / MCP: Open User Configuration for user-level). VS Code uses servers rather than mcpServers, and inputs lets it prompt for the key and store it securely instead of writing it to disk:

{
  "inputs": [
    {
      "type": "promptString",
      "id": "congress-api-key",
      "description": "Congress.gov API key",
      "password": true
    }
  ],
  "servers": {
    "congressmcp": {
      "type": "stdio",
      "command": "uvx",
      "args": ["congressmcp"],
      "env": { "CONGRESS_API_KEY": "${input:congress-api-key}" }
    }
  }
}

VS Code shows a trust prompt the first time the server starts.

OpenAI Codex CLI
codex mcp add congressmcp --env CONGRESS_API_KEY=your-api-key-here -- uvx congressmcp

Or in ~/.codex/config.toml (also read by the Codex IDE extension and the ChatGPT desktop app; project-level .codex/config.toml works in trusted projects):

[mcp_servers.congressmcp]
command = "uvx"
args = ["congressmcp"]
env_vars = ["CONGRESS_API_KEY"]   # forward from your shell — nothing secret in the file

To inline the key instead, replace the env_vars line with a [mcp_servers.congressmcp.env] table containing CONGRESS_API_KEY = "…". Check with codex mcp list or /mcp inside a session.

Cursor

Global: ~/.cursor/mcp.json. Per-project: .cursor/mcp.json.

{
  "mcpServers": {
    "congressmcp": {
      "command": "uvx",
      "args": ["congressmcp"],
      "env": { "CONGRESS_API_KEY": "${env:CONGRESS_API_KEY}" }
    }
  }
}

${env:NAME} reads from your shell environment; a literal key string works too.

JetBrains AI Assistant / Junie

AI Assistant: Settings → Tools → AI Assistant → Model Context Protocol (MCP) → Add → As JSON and paste the Claude Desktop block (there's also an Import from Claude button that reads claude_desktop_config.json).

Junie: Settings → Tools → Junie → MCP Settings, which edits ~/.junie/mcp/mcp.json (global) or .junie/mcp/mcp.json (project) — same mcpServers shape.

OpenCode

Global ~/.config/opencode/opencode.json or project-root opencode.json / opencode.jsonc (project overrides global). OpenCode puts the command and its args in one array and calls the env map environment:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "congressmcp": {
      "type": "local",
      "command": ["uvx", "congressmcp"],
      "environment": { "CONGRESS_API_KEY": "your-api-key-here" },
      "enabled": true
    }
  }
}

There's no opencode mcp add; edit the file, then check with opencode mcp list / opencode mcp debug congressmcp. Remote servers use "type": "remote", "url": "https://<host>/mcp".

Gemini CLI
gemini mcp add -s user -e CONGRESS_API_KEY=your-api-key-here congressmcp uvx congressmcp

(-s user makes it global; the default scope is the current project.) Or in ~/.gemini/settings.json / .gemini/settings.json:

{
  "mcpServers": {
    "congressmcp": {
      "command": "uvx",
      "args": ["congressmcp"],
      "env": { "CONGRESS_API_KEY": "$CONGRESS_API_KEY" }
    }
  }
}
Claude Desktop

Claude menu → Settings… → Developer → Edit Config, or edit the file directly:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "congressmcp": {
      "command": "uvx",
      "args": ["congressmcp"],
      "env": { "CONGRESS_API_KEY": "your-api-key-here" }
    }
  }
}

Restart Claude Desktop. If the server doesn't appear, use the absolute path to uvx (which uvx / where uvx) — GUI apps don't always inherit your shell PATH. Logs: ~/Library/Logs/Claude/mcp*.log or %APPDATA%\Claude\logs.

Windsurf

Cascade panel → MCPs icon → raw config, or edit ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "congressmcp": {
      "command": "uvx",
      "args": ["congressmcp"],
      "env": { "CONGRESS_API_KEY": "${env:CONGRESS_API_KEY}" }
    }
  }
}

Windsurf caps total tools across all servers at 100; CongressMCP registers 24 (each bundling related operations), so it fits comfortably.

Zed

Settings → AI → MCP Servers → Add Local Server, or edit settings.json (macOS ~/Library/Application Support/Zed/settings.json, Linux ~/.config/zed/settings.json, Windows %APPDATA%\Zed\settings.json; project-level .zed/settings.json):

{
  "context_servers": {
    "congressmcp": {
      "command": "uvx",
      "args": ["congressmcp"],
      "env": { "CONGRESS_API_KEY": "your-api-key-here" }
    }
  }
}
Cline / Roo Code

Cline: MCP Servers icon → Configure → Configure MCP Servers (opens cline_mcp_settings.json; the Cline CLI uses ~/.cline/mcp.json). Roo Code: MCP Servers → Edit Global MCP, or per-project .roo/mcp.json.

Both use the Claude Desktop shape plus a couple of client-specific fields:

{
  "mcpServers": {
    "congressmcp": {
      "command": "uvx",
      "args": ["congressmcp"],
      "env": { "CONGRESS_API_KEY": "your-api-key-here" },
      "disabled": false,
      "autoApprove": []
    }
  }
}

On Windows, Roo's docs recommend wrapping the command: "command": "cmd", "args": ["/c", "uvx", "congressmcp"].

Goose

Interactive: goose configureAdd Extension → Command-line Extension (command uvx congressmcp, then add CONGRESS_API_KEY when prompted for env vars). One-off: goose session --with-extension "CONGRESS_API_KEY=your-api-key-here uvx congressmcp". Or in ~/.config/goose/config.yaml:

extensions:
  congressmcp:
    name: congressmcp
    type: stdio
    cmd: uvx
    args: [congressmcp]
    envs: { "CONGRESS_API_KEY": "your-api-key-here" }
    enabled: true
    timeout: 300
Grok Build

xAI's terminal coding agent. If you already configured CongressMCP for Claude Code (~/.claude.json / .mcp.json) or Cursor (.cursor/mcp.json), Grok Build picks it up automatically — nothing more to do. Otherwise:

grok mcp add congressmcp -- uvx congressmcp      # add --scope project for .grok/config.toml

then set the key in ~/.grok/config.toml (or project .grok/config.toml):

[mcp_servers.congressmcp]
command = "uvx"
args = ["congressmcp"]
env = { CONGRESS_API_KEY = "${CONGRESS_API_KEY}" }

grok mcp list / grok mcp doctor congressmcp to verify; /mcps in a session toggles servers. Tools appear as congressmcp__<tool>.

Hermes Agent

Nous Research's Hermes Agent. ~/.hermes/config.yaml:

mcp_servers:
  congressmcp:
    command: "uvx"
    args: ["congressmcp"]
    env:
      CONGRESS_API_KEY: "${CONGRESS_API_KEY}"   # or a literal key
    enabled: true

Or hermes mcp add congressmcp --command uvx --args congressmcp and then add the env: block by hand. hermes mcp test congressmcp checks the connection; /reload-mcp in a session reloads without restarting. Tools appear as mcp__congressmcp__<tool>.

OpenClaw
openclaw mcp add congressmcp --command uvx --arg congressmcp --env CONGRESS_API_KEY=your-api-key-here

Or under mcp.servers in ~/.openclaw/openclaw.json (JSON5, so comments and trailing commas are fine):

{
  mcp: {
    servers: {
      congressmcp: {
        command: "uvx",
        args: ["congressmcp"],
        env: { CONGRESS_API_KEY: "your-api-key-here" },
      },
    },
  },
}

openclaw mcp status / openclaw mcp probe congressmcp to verify. OpenClaw does not read mcporter's registry — use mcp.servers. For a remote server, use url with an explicit transport: "streamable-http".

Continue

~/.continue/config.yaml, or one file per server under .continue/mcpServers/ in your workspace (Continue also accepts Claude/Cursor-style JSON files dropped in that folder). MCP tools are available in agent mode.

mcpServers:
  - name: congressmcp
    type: stdio
    command: uvx
    args:
      - congressmcp
    env:
      CONGRESS_API_KEY: ${{ secrets.CONGRESS_API_KEY }}
LM Studio

Program tab → Install → Edit mcp.json. LM Studio follows Cursor's mcp.json format, so the Cursor block works as-is — use a literal key string rather than ${env:…}. This gives any local model that supports tool calling access to congressional data.

Remote clients: ChatGPT, Claude.ai, Open WebUI

These clients can't launch a local process; they connect to an MCP server at a URL. Run CongressMCP in HTTP mode and give them the URL:

  • ChatGPT (Plus/Pro/Business/Enterprise/Edu, web): Settings → Security and login → Developer mode, then add a connector with your server URL. Requires a public HTTPS endpoint (or a Secure MCP Tunnel).
  • Claude.ai (web; synced to mobile): Customize → Connectors → Add custom connector (Team/Enterprise: Organization settings → Connectors). Must be reachable over the public internet.
  • Open WebUI: Admin Settings → Integrations → + Add Server → MCP (Streamable HTTP). Streamable HTTP only; it can be on your LAN.

The endpoint in every case is https://<your-host>/mcp. Most of the local clients above (OpenCode, Grok Build, Hermes, OpenClaw, Codex, Claude Code, Cursor, VS Code) can also connect to that URL instead of launching uvx — useful for sharing one install across a team.

4. Start asking questions

"Find recent climate change bills in the 119th Congress" "Where in the FY2026 NDAA is the Coast Guard's icebreaker funding?" "How did senators from California vote on the latest defense bill?" "Who are the members of the Senate Judiciary Committee?" "What's the latest action on H.R. 1234?"

Remote / HTTP mode

For clients that connect by URL (ChatGPT, Claude.ai connectors, Open WebUI, or several users sharing one install), run the server over Streamable HTTP:

CONGRESS_API_KEY=your-key congressmcp --transport streamable-http --host 0.0.0.0 --port 8000
# MCP endpoint: http://<host>:8000/mcp

CongressMCP has no built-in authentication. The server is designed to run on your own machine. If you expose it beyond localhost, put it behind something that does authenticate — a reverse proxy with an access policy, an HTTPS tunnel with an allow-list, or a VPN — and remember that anyone who can reach it is spending your Congress.gov quota. ChatGPT and Claude.ai additionally require HTTPS on a publicly resolvable hostname.

Tools

7 toolsets, 90+ operations covering the Congress.gov API, plus full-text bill retrieval from GovInfo:

Toolset Operations What it does
Bills 16 Search, details, text, actions, amendments, cosponsors, subjects
Laws 2 Enacted public/private laws by congress (get_laws, get_law_details)
Amendments 7 Search, details, actions, sponsors, text
Treaties & Summaries 5 Treaty search, actions, committees, text; bill summaries
Members & Committees 13 Member search by name/state/district, sponsored legislation, committee bills/reports/communications
Voting & Nominations 13 House/Senate votes, nominations, roll calls
Records & Hearings 10+ Congressional Record, hearings, CRS reports, committee prints

search_committees and search_summaries take an optional keywords argument — omit it to browse/list (committees can also be filtered by chamber/committee_type).

Full Bill Text Search

CongressMCP can fetch full Bill DTD XML from GovInfo, parse it locally, build a segment-level SQLite FTS5 index in memory, and return targeted bill sections instead of raw multi-megabyte XML or whole rendered bill pages.

Tool What it does
search_bill_text Searches full bill text and returns ranked addressable chunks with snippets, match_contexts, and amendatory flags
get_bill_section Retrieves a qualified section or chunk id, with max_bytes measured against UTF-8 bytes of the returned text field
get_bill_toc Returns a shallow navigation tree for finding section ids

No new API key is required. GovInfo and Congress.gov both use api.data.gov keys, so CongressMCP reuses CONGRESS_API_KEY; set GOVINFO_API_KEY only if you need an explicit GovInfo override.

First-call latency can be a few seconds for NDAA-scale bills because the current release re-parses and rebuilds the in-memory FTS5 index on every call. A persistent on-disk cache (per-package indexes, LRU eviction, offline reuse) is planned for a future release. Network egress for this feature goes to api.congress.gov for text-version metadata and api.govinfo.gov for bill XML.

The search response distinguishes matches in operative, quoted, and header segments. If quoted appears in match_contexts, the hit may include language the bill is removing, even when operative also appears; retrieve the section before drawing conclusions about strike-and-insert language.

Each hit also carries matched_queries — the subset of your queries that produced it. Read it before reasoning about retrieval behavior: in a multi-query call it attributes every hit to its originating query, so an unexpected result is explained by the field, not by guessing at tokenizer internals.

amends resolves U.S. Code citations only (the longhand Section {sec} of title {title}, United States Code form and the shorthand {title} U.S.C. {sec} form when an amendatory verb follows). It does not resolve named Acts, including the Internal Revenue Code cited by bare section number — so most Title VII tax units report is_amendatory: true with amends: []. Use is_amendatory and match_contexts to identify amendatory text; amends is a convenience, not a completeness guarantee.

Running from source

git clone https://github.com/amurshak/congressMCP
cd congressMCP
pip install -e .

# stdio (default — for MCP clients)
CONGRESS_API_KEY=your-key congressmcp

# HTTP (for self-hosting / remote access)
CONGRESS_API_KEY=your-key congressmcp --transport streamable-http --port 8000

Point a client at a source checkout by using "command": "congressmcp" (with the venv activated or its bin/ on PATH) or "command": "/path/to/venv/bin/congressmcp" in place of uvx.

Configuration

Variable Required Default Description
CONGRESS_API_KEY Yes Your free Congress.gov API key
GOVINFO_API_KEY No Optional override for GovInfo; otherwise CONGRESS_API_KEY is reused
ENABLE_CACHING No false Cache API responses in memory
CACHE_TIMEOUT No 300 Cache TTL in seconds
CONGRESSMCP_BILL_TEXT_ONLY No unset If truthy, register only the three bill-text tools (standalone bill-text server)
CONGRESSMCP_TRACE_DIR No unset If set to a directory, write one key-redacted JSONL record per bill-text tool call (debugging)
CONGRESSMCP_CACHE_DIR No Platform cache path Bill-text package cache root (persistent cache is planned; currently in-memory)
CONGRESSMCP_CACHE_MAX_BYTES No 524288000 Planned bill-text cache cap
CONGRESSMCP_CACHE_ENABLED No true Planned persistent bill-text cache toggle
CONGRESSMCP_VERSION_TTL No 86400 Planned version-resolution cache TTL
CONGRESSMCP_REVALIDATE_DAYS No 30 Planned explicit-version revalidation interval

Default bill-text cache locations (once persistence ships):

Platform Path
Linux $XDG_CACHE_HOME/congressmcp, else ~/.cache/congressmcp
macOS ~/Library/Caches/congressmcp
Windows %LOCALAPPDATA%\congressmcp\Cache

Cache CLI:

congressmcp cache info
congressmcp cache clear --yes

In the current release these commands report the planned cache location and remove any package DBs if present; bill-text indexes are still in-memory only.

Troubleshooting

  • "command not found: uvx" in a GUI client (Claude Desktop, Zed, LM Studio, JetBrains): use the absolute path from which uvx (macOS/Linux) or where uvx (Windows) as the command.
  • Windows: if a client can't spawn uvx directly, use "command": "cmd", "args": ["/c", "uvx", "congressmcp"].
  • First start is slow: uvx downloads and caches the package on first run; subsequent starts are fast. Pin a version with uvx congressmcp@2.1.0 if you want reproducibility.
  • 401 / 403 from the API: the key is missing or wrong. Confirm it works with curl "https://api.congress.gov/v3/bill?api_key=YOUR_KEY&limit=1".
  • Tools missing in the client: most clients need a restart or an explicit MCP reload after editing config.

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Submit a pull request

License

Sustainable Use License


Built for government transparency and accessible civic data.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

congressmcp-2.1.0.tar.gz (298.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

congressmcp-2.1.0-py3-none-any.whl (237.7 kB view details)

Uploaded Python 3

File details

Details for the file congressmcp-2.1.0.tar.gz.

File metadata

  • Download URL: congressmcp-2.1.0.tar.gz
  • Upload date:
  • Size: 298.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for congressmcp-2.1.0.tar.gz
Algorithm Hash digest
SHA256 31a19853c961ce4553e43a843168530de1dd417d6482c9d5e4336fa37939dbe7
MD5 15e574610c75594b9e72ae96a90ffa04
BLAKE2b-256 e6d63f06513b935d0c8da70e836f43a8cdc113f3d3600ad0f90765c0f9996b51

See more details on using hashes here.

Provenance

The following attestation bundles were made for congressmcp-2.1.0.tar.gz:

Publisher: publish.yml on amurshak/congressMCP

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file congressmcp-2.1.0-py3-none-any.whl.

File metadata

  • Download URL: congressmcp-2.1.0-py3-none-any.whl
  • Upload date:
  • Size: 237.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for congressmcp-2.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ec5ba92435825111718b9035e10a5ded6e45e9ef31c021a137889334798c3fc9
MD5 d2eb24ba3359ceb48ca06954cfeea4a8
BLAKE2b-256 32e565c9f5c22779d349739099ad4dcb6577f9947c2d8e6a5b361661d686ab1b

See more details on using hashes here.

Provenance

The following attestation bundles were made for congressmcp-2.1.0-py3-none-any.whl:

Publisher: publish.yml on amurshak/congressMCP

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

2.2.0

2 files

This release

2.1.0 This release

2 files

2.0.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page