congressgov-mcp-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@congressgov-mcp-serverTrack the confirmation status of Supreme Court nominee Ketanji Brown Jackson"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Public Hosted Server: https://congressgov.caseyjhand.com/mcp
Overview
U.S. congressional data from the Congress.gov API v3 and the Senate's official vote feed — bills, enacted laws, members, committees, roll call votes, and presidential nominations. Browse legislative activity, read bill and report text, and track the Senate confirmation pipeline from any MCP client. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.
Tools
Tool | Description |
| Browse and retrieve U.S. legislative bill data — actions, sponsors, summaries, text, related bills |
| Browse enacted public and private laws by congress |
| Discover congressional members by state/district/congress, retrieve legislative portfolios |
| Browse congressional committees and their legislation, reports, and nominations |
| Retrieve House and Senate roll call votes and individual member voting positions |
| Browse presidential nominations to federal positions and track the Senate confirmation process |
| Browse recent CRS bill summaries — the "what's happening" feed |
| Browse and retrieve nonpartisan CRS policy analysis reports |
| Browse and retrieve committee reports accompanying legislation |
| Browse the daily Congressional Record — floor speeches, debates, and proceedings |
| Keyword-search bill titles and CRS summaries via a local full-text mirror (opt-in, off by default) |
Resources
Resource | Description |
| Current congress number, session dates, chamber info |
| Reference table of valid bill type codes |
| Member profile by bioguide ID |
| Bill detail by congress, type, and number |
| Committee detail by committee code |
Bill, member, and committee data is also reachable through congressgov_bill_lookup, congressgov_member_lookup, and congressgov_committee_lookup (operation get) — many MCP clients are tool-only and never surface resources.
Prompts
Prompt | Description |
| Structured framework for analyzing a bill |
| Research framework for a policy area across Congress |
Related MCP server: Congress.gov API MCP Server
Capability reference
congressgov_bill_lookup tool
Operations:
list(browse by congress/billType/date range — no keyword search),get(full detail), or drill intoactions,amendments,cosponsors,committees,subjects,summaries,text,titles,relatedlistdefaults toorder='recent'(newest update-date first);limit1–250,offsetpaginationcontentreads a text version's actual document text: select the version withtextVersionIndex(0-based, againsttext's order), the window withcharacterOffset/characterLimit(1–100,000 chars, default 25,000), and follownextOffsetto walk a full billTyped failures on
content:document_unavailable,format_unavailable,document_fetch_failed,document_too_large,offset_past_end, alongside the sharednot_found/rate_limited/invalid_request/upstream_errorset
congressgov_enacted_laws tool
listfilters by congress andlawType(pubpublic laws,privprivate) — the enactment-status filtercongressgov_bill_lookupdoesn't offergetreturns the origin bill record; the law citation lives on the bill'slaws[]array (e.g.{"number":"118-2","type":"Public Law"})lawNumberaccepts either the bare number (90) or the full{congress}-{number}citation alistrow carries; a citation naming a different congress than thecongressparam is rejected rather than silently resolvedlimit1–250,offsetpagination forlist
congressgov_member_lookup tool
No name search —
listfilters bystateCode(+ optionaldistrict, which requiresstateCode),congress, andcurrentMembergetreturns the full profile bybioguideId(e.g.P000197);sponsored/cosponsoredreturn that member's legislative portfoliolimit1–250,offsetpagination
congressgov_committee_lookup tool
Committee codes are chamber-prefix (
h/s/j) + abbreviation + 2-digit number (e.g.hsju00);getand sub-resources infer chamber from the prefix, or accept an explicit overridecommitteeCodealso accepts a committee name, resolved automatically (all-token match, then a bigram-similarity fallback labeledapproximate: true) against the full cross-chamber rosterlistwithfiltername-matches the same way, paging past the 250-row upstream cap to search the complete roster before filteringbillssub-resource defaults toorder='recent'(newest update-date first, computed client-side since upstream ignores sort); rows carry no titles — chaincongressgov_bill_lookup getper rownominationssub-resource is Senate-only
congressgov_roll_votes tool
chamberishouse(default, Congress.gov API) orsenate(the Senate's official LIS XML feed — the API exposes no Senate votes)listbrowses by congress + session (1 or 2), newest-first by default (computed client-side for strict ordering);getreturns tallies and party breakdown,membersreturns each member's recorded positionRoll call numbers reset each session and are specific to one chamber
limit1–250,offsetpagination forlistandmembers
congressgov_senate_nominations tool
Nominations use
PNnumbering;listbrowses by congress,getreturns detail,actions/committees/hearingscover the confirmation pipeline,nomineesreturns individuals in a batch (requiresordinal)Multi-part parents (e.g.
PN851) carry no activity of their own — sub-resources live on partitioned children (851-1,851-2, …); a bare-parent sub-resource call on such a nomination returns an enrichment notice pointing at the partitioned formordinalis discovered from the nomination'snomineesarray viagetfirst
congressgov_bill_summaries tool
Filters by
congressandbillType(requirescongress); date filters apply to the CRS summary's update time, not the bill's action dateDefaults to summaries updated in the last 7 days when neither date bound is supplied
For summaries of one specific bill, use
congressgov_bill_lookupwithoperation='summaries'instead
congressgov_crs_reports tool
Report IDs use letter-number codes (e.g.
R40097,RL33612,IF12345)listbrowses the catalog;getreturns full detail (authors, topics, summary, download formats) byreportNumberlimit1–250,offsetpagination forlist
congressgov_committee_reports tool
Report types:
hrpt(House),srpt(Senate),erpt(Executive);listbrowses by congress + optionalreportType,getreturns citation/title/committees/associated billtextlists each format's{type, url}link (report formats arrive one per entry, unlike bill text versions);contentthen reads the actual text, a bounded character window at a time viacharacterOffset/characterLimit(1–100,000 chars, default 25,000)Typed failures on
content:document_unavailable,format_unavailable,document_fetch_failed,document_too_large,offset_past_end
congressgov_daily_record tool
Hierarchical navigation:
list(volumes) →issues(within a volume) →articles(within an issue)contentreads one article's text, selected byarticleIndex(0-based) and bounded bycharacterOffset/characterLimit; the Congressional Record publishes Formatted Text and PDF only (no XML)Typed failures on
content:document_unavailable,format_unavailable,document_fetch_failed,document_too_large,offset_past_end
congressgov_search_bills tool
Opt-in: off by default and absent from
tools/listentirely untilCONGRESS_MIRROR_ENABLED=trueKeyword-searches a local SQLite FTS5 mirror of bill titles + CRS summaries — the discovery path the Congress.gov API itself lacks; policy area and full bill text are not indexed
Narrows with
congress,billType, andoriginChamber; returns BM25-ranked matches with each bill's derived id, ready for a follow-upcongressgov_bill_lookupcallWith the flag set but the index not yet built (
bun run mirror:init), the tool answers with an empty result and a build-the-index notice instead of an errorlimit1–100 (a narrower cap than the other tools' 1–250),offsetpagination
congress://current resource
Current congress number, session dates, and chamber info — baseline context for other queries
Cached publicly for 1 hour
congress://bill-types resource
Static reference table of the 8 valid bill type codes (
hr,s,hjres,sjres,hconres,sconres,hres,sres) with chamber and an example citationCached publicly for 24 hours — fixed by chamber rules, not fetched upstream
congress://member/{bioguideId} resource
bioguideIdmust match one uppercase letter followed by 6 digits (e.g.P000197)Returns the member profile — name, state, party, terms, leadership, office, legislation counts
congress://bill/{congress}/{billType}/{billNumber} resource
congressandbillNumbermust be positive integers;billTypemust be a valid bill type codeReturns bill detail — sponsor, status, policy area, committees, latest action
congress://committee/{committeeCode} resource
committeeCodemust matchh/s/jfollowed by 3–8 lowercase alphanumeric characters (e.g.hsju00); chamber is inferred from the first letterReturns committee detail — name, chamber, subcommittees, history, legislation counts
congressgov_bill_analysis prompt
Arguments:
congress,billType,billNumber— all required stringsReturns one user message framing a structured analysis (summary, sponsors, committee referrals, action timeline, related legislation, policy implications, outlook) and naming which tools to call for each section
congressgov_legislative_research prompt
Arguments:
topicrequired;congressoptional (defaults to the current congress)The discovery plan is configuration-aware: with
CONGRESS_MIRROR_ENABLEDit opens withcongressgov_search_bills; without it, it asks for a seed (a bill, member, committee, or CRS report id) since no registered tool accepts a topic stringSynthesizes findings into landscape, key players, substance, recent activity, and outlook
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
Congress.gov-specific:
Type-safe client for the Congress.gov REST API v3, plus a second client for the Senate's official LIS XML feed (
fast-xml-parser) backing Senate roll votesOptional API key from api.data.gov — defaults to
DEMO_KEY(30 req/hr); own key gets 5,000 req/hrBounded document-text retrieval for bill text, committee reports, and Congressional Record articles — a 25 MB fetch ceiling, 30s deadline, and a
www.congress.govhost allowlistOpt-in local SQLite FTS5 mirror (
CONGRESS_MIRROR_ENABLED) adds keyword search over bill titles and CRS summaries, the one discovery path the API itself lacksAll tools are read-only and idempotent
Agent-friendly output:
Effective-query echo and total-count enrichment on every browse/list operation, plus a notice when a query resolves to zero matches or an offset runs past the end
Character-exact document windows —
contentoperations returnoffset/nextOffsetso walking a multi-megabyte bill or report never skips or repeats a characterTyped failure reasons on document reads (
document_unavailable,format_unavailable,document_too_large,offset_past_end, …) alongside the shared upstream-error set, each resolved to a recovery hint
Getting started
Public Hosted Instance
A public instance is available at https://congressgov.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"congressgov-mcp-server": {
"type": "streamable-http",
"url": "https://congressgov.caseyjhand.com/mcp"
}
}
}Self-Hosted / Local
Add the following to your MCP client configuration file.
{
"mcpServers": {
"congressgov-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/congressgov-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"CONGRESS_API_KEY": "your-api-key"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"congressgov-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/congressgov-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"CONGRESS_API_KEY": "your-api-key"
}
}
}
}Or with Docker:
{
"mcpServers": {
"congressgov-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"-e", "CONGRESS_API_KEY=your-api-key",
"ghcr.io/cyanheads/congressgov-mcp-server:latest"
]
}
}
}Get a free API key at api.data.gov/signup for 5,000 req/hr. Without a key the server falls back to DEMO_KEY (30 req/hr).
For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 CONGRESS_API_KEY=your-api-key bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Bun v1.4.0 or higher (or Node.js v24+).
Installation
Clone the repository:
git clone https://github.com/cyanheads/congressgov-mcp-server.gitNavigate into the directory:
cd congressgov-mcp-serverInstall dependencies:
bun installConfigure environment:
cp .env.example .env
# edit .env and set required varsConfiguration
Variable | Description | Default |
| API key from api.data.gov. Omit to use |
|
| Congress.gov API base URL. |
|
| Enable the local bill search mirror and the |
|
| Filesystem path to the SQLite mirror index. |
|
| Cron schedule for the in-process mirror refresh (HTTP transport only). Unset runs | — |
| Comma-separated congress numbers to mirror (e.g. | current congress + 1 prior |
| Transport: |
|
| HTTP server port. |
|
| Authentication: |
|
| HTTP session mode: |
|
| Log level ( |
|
| Directory for log files (Node.js only). |
|
| Storage backend. |
|
| Enable OpenTelemetry instrumentation (spans, metrics, completion logs). |
|
See .env.example for the full list of optional overrides.
Running the server
Local development
Build and run the production version:
bun run rebuild bun run start:http # or start:stdioRun checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t congressgov-mcp-server .
docker run --rm -e CONGRESS_API_KEY=your-api-key -p 3010:3010 congressgov-mcp-serverThe Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/congressgov-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
Directory | Purpose |
|
|
| Server-specific environment variable parsing and validation with Zod. |
| Tool definitions ( |
| Resource definitions ( |
| Prompt definitions ( |
| Congress.gov API client — auth, pagination, rate limiting. |
| Bounded document-text fetch — host allowlist, byte ceiling, character window. |
| Local SQLite FTS5 bill-search mirror — ingest, normalize, schema. |
| Senate LIS XML client for Senate roll call votes. |
| Mirror lifecycle CLI scripts ( |
| Unit and integration tests, mirroring the |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storageAll tools are read-only, with
readOnlyHint: trueandidempotentHint: trueannotationsWrap external API calls: validate raw → normalize to a domain type → return the output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
This server cannot be deployed
Maintenance
Related MCP Connectors
Congress MCP — US Congress data via GovTrack API (free, no auth required)
Query SEC EDGAR filings, XBRL financials, and company data through MCP. STDIO & Streamable HTTP.
An MCP server that provides congressional transcripts
GovTrack MCP — federal US Congress data (free, no auth)
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceAn MCP server for the Congress.gov API that consolidates 91 operations into 6 comprehensive legislative tools that can be used by any MCP client (i.e. Claude Desktop), or MCP-compatible AI agent, to query and reason about congressional data.6 npm1JavaScriptMIT
- AlicenseNot gradedqualityDmaintenanceEnables querying U.S. legislative data from Congress.gov API using MCP resources for direct lookups and tools for searching and retrieving related data.8MIT
- AlicenseNot gradedqualityCmaintenanceEnables querying legislative data from the LegiScan API, including bills and votes, via natural language through an MCP gateway.2 npmMIT
- AlicenseNot gradedqualityAmaintenanceAccess FEC campaign finance data through MCP. Query data about candidates, money trails, and election filings. STDIO & Streamable HTTP.81 npm2Apache 2.0