
A comprehensive wrapper around the Congress.gov REST API v3 that brings legislative data into your MCP workflow. You get ten read-only tools covering bills, votes, members, committees, nominations, CRS reports, and the daily Congressional Record, plus resources for current session info and bill type lookups. Built on the developer's mcp-ts-core framework with declarative tool definitions and pluggable auth. Runs stdio or streamable HTTP, and there's a public hosted instance at congressgov.caseyjhand.com if you want to skip setup. Needs an api.data.gov key for serious use (1,000 req/hr vs the 30/hr demo limit). Reach for this when you're building legislative tracking, policy research tools, or anything that needs structured access to what's moving through Congress.
Public tool metadata for what this MCP can expose to an agent.
congressgov_bill_lookupBrowse and retrieve U.S. legislative bill data from Congress.gov. Discover bills by filtering on congress, bill type, and date range — there is no keyword search. Use 'list' to browse (requires congress), 'get' for full bill detail (sponsor, policy area, CBO estimates, law inf...8 paramsBrowse and retrieve U.S. legislative bill data from Congress.gov. Discover bills by filtering on congress, bill type, and date range — there is no keyword search. Use 'list' to browse (requires congress), 'get' for full bill detail (sponsor, policy area, CBO estimates, law inf...
billNumberintegerbillTypestringhr · s · hjres · sjres · hconres · sconrescongressintegerfromDateTimestringlimitintegeroffsetintegeroperationstringlist · get · actions · amendments · cosponsors · committeestoDateTimestringcongressgov_enacted_lawsBrowse enacted public and private laws from Congress.gov. Use 'list' to browse laws by congress, or 'get' for a specific law's full detail. Each law references its origin bill for the full legislative history. Law types: pub: Public laws (general application, most common); pri...6 paramsBrowse enacted public and private laws from Congress.gov. Use 'list' to browse laws by congress, or 'get' for a specific law's full detail. Each law references its origin bill for the full legislative history. Law types: pub: Public laws (general application, most common); pri...
congressintegerlawNumberintegerlawTypestringpub · privlimitintegeroffsetintegeroperationstringlist · getcongressgov_member_lookupDiscover congressional members and their legislative activity. There is no name search — use 'list' with stateCode (optionally with district), with a congress number, or with currentMember=true to find members. Once you have a bioguideId, use 'get' for full profile or 'sponsor...8 paramsDiscover congressional members and their legislative activity. There is no name search — use 'list' with stateCode (optionally with district), with a congress number, or with currentMember=true to find members. Once you have a bioguideId, use 'get' for full profile or 'sponsor...
bioguideIdstringcongressintegercurrentMemberbooleandistrictintegerlimitintegeroffsetintegeroperationstringlist · get · sponsored · cosponsoredstateCodestringcongressgov_committee_lookupBrowse congressional committees and their legislation, reports, and nominations. Committee codes follow the pattern chamber-prefix (h/s/j) + abbreviation + number — use 'list' to discover codes, then 'get' or drill into 'bills', 'reports', or 'nominations' ('nominations' is Se...7 paramsBrowse congressional committees and their legislation, reports, and nominations. Committee codes follow the pattern chamber-prefix (h/s/j) + abbreviation + number — use 'list' to discover codes, then 'get' or drill into 'bills', 'reports', or 'nominations' ('nominations' is Se...
chamberstringhouse · senate · jointcommitteeCodestringcongressintegerlimitintegeroffsetintegeroperationstringlist · get · bills · reports · nominationsorderstringrecent · oldestdefault: recentcongressgov_roll_votesRetrieve House roll call vote data and individual member voting positions — House-only, as Senate vote data is not yet in the Congress.gov API. Use 'list' to find votes by congress and session, 'get' for vote details (question, result, associated bill), or 'members' for how ea...6 paramsRetrieve House roll call vote data and individual member voting positions — House-only, as Senate vote data is not yet in the Congress.gov API. Use 'list' to find votes by congress and session, 'get' for vote details (question, result, associated bill), or 'members' for how ea...
congressintegerlimitintegeroffsetintegeroperationstringlist · get · memberssessionintegervoteNumberintegercongressgov_senate_nominationsBrowse presidential nominations to federal positions and track the Senate confirmation process. Nominations use 'PN' (Presidential Nomination) numbering, and a single nomination may contain multiple nominees — use 'nominees' to see individual appointees. Partitioned nomination...6 paramsBrowse presidential nominations to federal positions and track the Senate confirmation process. Nominations use 'PN' (Presidential Nomination) numbering, and a single nomination may contain multiple nominees — use 'nominees' to see individual appointees. Partitioned nomination...
congressintegerlimitintegernominationNumberstringoffsetintegeroperationstringlist · get · nominees · actions · committees · hearingsordinalintegercongressgov_bill_summariesBrowse recent CRS (Congressional Research Service) bill summaries — plain-language summaries of bills at each legislative stage, useful for answering "what's happening in Congress?". The fromDateTime/toDateTime filters apply to the summary's update time (lastSummaryUpdateDate)...6 paramsBrowse recent CRS (Congressional Research Service) bill summaries — plain-language summaries of bills at each legislative stage, useful for answering "what's happening in Congress?". The fromDateTime/toDateTime filters apply to the summary's update time (lastSummaryUpdateDate)...
billTypestringhr · s · hjres · sjres · hconres · sconrescongressintegerfromDateTimestringlimitintegeroffsetintegertoDateTimestringcongressgov_crs_reportsBrowse and retrieve CRS (Congressional Research Service) reports — nonpartisan policy analyses by subject-matter experts at the Library of Congress, covering policy areas, legislative proposals, and legal questions. Report IDs use letter-number codes (e.g., R40097, RL33612, IF...4 paramsBrowse and retrieve CRS (Congressional Research Service) reports — nonpartisan policy analyses by subject-matter experts at the Library of Congress, covering policy areas, legislative proposals, and legal questions. Report IDs use letter-number codes (e.g., R40097, RL33612, IF...
limitintegeroffsetintegeroperationstringlist · getreportNumberstringcongressgov_committee_reportsBrowse and retrieve committee reports from Congress.gov — reports accompany legislation reported out of committee and explain the bill's purpose, committee amendments, dissenting views, and the committee vote. Report types are 'hrpt' (House), 'srpt' (Senate), and 'erpt' (Execu...6 paramsBrowse and retrieve committee reports from Congress.gov — reports accompany legislation reported out of committee and explain the bill's purpose, committee amendments, dissenting views, and the committee vote. Report types are 'hrpt' (House), 'srpt' (Senate), and 'erpt' (Execu...
congressintegerlimitintegeroffsetintegeroperationstringlist · get · textreportNumberintegerreportTypestringhrpt · srpt · erptcongressgov_daily_recordBrowse the daily Congressional Record — floor speeches, debates, and legislative text published each day Congress is in session. Navigation is hierarchical: list → volumes, issues → individual articles. Use 'list' to find recent volumes, 'issues' to see what's in a volume, and...5 paramsBrowse the daily Congressional Record — floor speeches, debates, and legislative text published each day Congress is in session. Navigation is hierarchical: list → volumes, issues → individual articles. Use 'list' to find recent volumes, 'issues' to see what's in a volume, and...
issueNumberintegerlimitintegeroffsetintegeroperationstringlist · issues · articlesvolumeNumberintegerAccess U.S. congressional data (bills, votes, members, committees) via MCP. STDIO or Streamable HTTP.
Public Hosted Server: https://congressgov.caseyjhand.com/mcp
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, nominations, CRS and committee reports, and the Congressional Record. Browse legislative activity, read bill and report text, and follow the Senate confirmation pipeline from any MCP client. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.
| Tool | Description |
|---|---|
congressgov_bill_lookup | Browse and retrieve bills: actions, sponsors, summaries, text, related bills |
congressgov_enacted_laws | Browse enacted public and private laws by congress |
congressgov_member_lookup | Find members by state, district, or congress, and retrieve their legislative portfolios |
congressgov_committee_lookup | Browse committees and their legislation, reports, and nominations |
congressgov_roll_votes | Retrieve House and Senate roll call votes and each member's position |
congressgov_senate_nominations | Browse presidential nominations and track Senate confirmation |
congressgov_bill_summaries | Browse recently updated CRS bill summaries |
congressgov_crs_reports | Browse and retrieve nonpartisan CRS policy reports |
congressgov_committee_reports | Browse and read committee reports accompanying legislation |
congressgov_daily_record | Browse and read the daily Congressional Record |
congressgov_search_bills | Keyword-search bill titles and CRS summaries via a local full-text mirror (opt-in) |
| Resource | Description |
|---|---|
congress://current | Current congress number, session dates, chamber info |
congress://bill-types | Reference table of valid bill type codes |
congress://member/{bioguideId} | Member profile by bioguide ID |
congress://bill/{congress}/{billType}/{billNumber} | Bill detail by congress, type, and number |
congress://committee/{committeeCode} | 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), since many MCP clients are tool-only and never surface resources.
| Prompt | Description |
|---|---|
congressgov_bill_analysis | Structured framework for analyzing a bill |
congressgov_legislative_research | Research framework for a policy area across Congress |
congressgov_bill_lookup toollist browses one congress, narrowed by billType and a fromDateTime/toDateTime range on the record's update date, newest first unless order: 'oldest'; get, actions, amendments, cosponsors, committees, subjects, summaries, text, titles, related, and content need congress + billType + billNumbertype and number are accepted as billType and billNumber; bill type codes are case-insensitive, and relatedbills (any case) selects related. Send one name per field: canonical and alias keys together are rejected.content reads the text version at textVersionIndex (0-based in text order, 0 is the most recent) and returns one character window in content.text with totalCharacters, truncated, and nextOffsetsummaries takes an optional versionCode (00 introduced, 49 public law) and applies the same page budget and row window as congressgov_bill_summaries, steered by characterOffset/characterLimit; a cut row carries textTotalCharacters, textTruncated, and textNextOffsetcongressgov_enacted_laws toollist browses one congress, optionally by lawType (pub or priv), the enactment filter congressgov_bill_lookup lacks; get needs lawType + lawNumber, taken from a list row's laws[].number (118-90) or its bare number (90)get returns the origin bill record, with the law citation on its laws[] arraycongressgov_member_lookup toollist filters by stateCode (plus district, 0 for at-large, which requires stateCode), congress, and currentMemberget returns the profile for a bioguideId (e.g. P000197); sponsored and cosponsored return that member's legislationcongressgov_committee_lookup toolcommitteeCode is a chamber prefix (h/s/j), letters, and a 2-digit suffix (e.g. hsju00); get, bills, reports, and the Senate-only nominations infer chamber from the prefixcommitteeCode resolves when exactly one committee matches, and otherwise returns the candidate rows with a notice; list with filter name-matches every committee in scope, past the 250-row page cap, and fuzzy hits carry approximate: truebills is newest first by default (order), and its rows carry no titles, so chain congressgov_bill_lookup get per rowcongressgov_roll_votes toolchamber is house (default, Congress.gov API) or senate (the Senate's LIS feed); every call needs congress + session (1 or 2), and get/members add voteNumber, which resets each session and is specific to one chamberlist is newest first unless order: 'oldest'; get returns the question, result, tallies, and party breakdown, and members returns each member's positionvoteDate with a derived voteDateIsocongressgov_senate_nominations toollist browses one congress; get, actions, committees, hearings, and nominees need a nominationNumber (1000 for PN1000), and nominees also needs an ordinal from the nominees array get returns851-1, 851-2, …); an empty sub-resource call on the bare number returns a notice pointing therecongressgov_bill_summaries toolcongress and billType (which requires congress); fromDateTime/toDateTime filter on the summary's update time, not the bill's action date, and cover the last 7 days when both are omittedpagination.nextOffset resumes); a summary over 25,000 characters arrives windowed with textTotalCharacters, textTruncated, and textNextOffsetcongressgov_bill_lookup summariescongressgov_crs_reports toollist browses the catalog; get takes a reportNumber such as R40097, RL33612, or IF12345id, reportId, and report_id are accepted as reportNumber. Send only one identifier key; canonical and alias keys together, or multiple aliases, are rejected.get returns authors, topics, summary, and download formatscongressgov_committee_reports toollist browses one congress, optionally by reportType (hrpt House, srpt Senate, erpt Executive); get, text, and content need reportType + reportNumberget returns the citation, title, committees, and associated bill; text lists {type, url} format links, and content reads the report as one character windowcongressgov_daily_record toollist (volumes) → issues (by volumeNumber) → articles (by volumeNumber + issueNumber)content reads the article at articleIndex (0-based across the issue) as one character window; Record articles publish Formatted Text and PDF only, so format: 'xml' fails as format_unavailablecongressgov_search_bills toolquery keywords (AND-combined) over bill titles and CRS summaries, narrowed by congress, billType, and originChamber; limit 1–100, offset paginationbillId plus congress/billType/billNumber for congressgov_bill_lookup, and a summaryPreview; policy area and full bill text are not indexedCONGRESS_MIRROR_ENABLED=true; until bun run mirror:init builds the index, it returns an empty result with a noticecongress://current resourcecongress://bill-types resourcehr, s, hjres, sjres, hconres, sconres, hres, sres) with description, chamber, and an example citationcongress://member/{bioguideId} resourcebioguideId is one uppercase letter and 6 digits (e.g. P000197)congress://bill/{congress}/{billType}/{billNumber} resourcecongress and billNumber are positive integers; billType is one of the 8 bill type codescongress://committee/{committeeCode} resourcecommitteeCode is h/s/j followed by 3–8 lowercase alphanumeric characters (e.g. hsju00); chamber comes from the first lettercongressgov_bill_analysis promptcongress, billType, and billNumber, all requiredcongressgov_legislative_research prompttopic required; congress optional, defaulting to the current congressCONGRESS_MIRROR_ENABLED, the plan opens with congressgov_search_bills; without it, the prompt asks for a seed bill, member, committee, or CRS report ID, since no other tool takes a topicBuilt 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:
congress + billType + billNumber, members by bioguideId, and committees by system code; list operations page with limit 1–250 (default 20) and offsetcontent on bill text, committee reports, and Record articles reads format text (default) or xml through a characterOffset/characterLimit window (1–100,000 characters, default 25,000), fetched only from www.congress.gov under a 25 MB ceiling and a 30s deadlineDEMO_KEY 30 requests/hour and 50/day per IP, registered keys 5,000/hour. Valid upstream hourly quota headers override the fallback; actual quotas varyCONGRESS_MIRROR_ENABLED) adds keyword search over bill titles and CRS summariesAgent-friendly output:
effectiveQuery and totalCount; a notice fires when nothing matched, and a page past the end says so in the rendered outputlist rejects entity identities it would discard: bill billNumber, vote voteNumber, nomination nominationNumber, CRS/committee reportNumber, and Record volumeNumber. The incompatible_identity domain error names the detail operation to select or the field to remove; pagination and defaulted selectors remain accepted.content returns offset, truncated, and nextOffset, so walking a multi-megabyte bill never skips or repeats a charactercontent failures (document_unavailable, format_unavailable, document_fetch_failed, document_too_large, offset_past_end) alongside the shared not_found, rate_limited, invalid_request, upstream_error, and upstream_timeout reasons, each with a recovery hint. Document byte ceilings and exhausted document/summary offsets use domain validation (-32007); malformed arguments remain protocol invalid parameters (-32602)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"
}
}
}
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"
]
}
}
}
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/mcp
git clone https://github.com/cyanheads/congressgov-mcp-server.git
cd congressgov-mcp-server
bun install
cp .env.example .env
# edit .env and set CONGRESS_API_KEY (and the mirror vars, if you want keyword search)
| Variable | Description | Default |
|---|---|---|
CONGRESS_API_KEY | API key from api.data.gov. Fallbacks: DEMO_KEY 30/hour and 50/day per IP; registered key 5,000/hour. Upstream hourly quota headers take precedence. | DEMO_KEY |
CONGRESS_API_BASE_URL | Congress.gov API base URL. | https://api.congress.gov/v3 |
CONGRESS_MIRROR_ENABLED | Enable the local bill search mirror and the congressgov_search_bills tool. | false |
CONGRESS_MIRROR_PATH | Filesystem path to the SQLite mirror index. | .mirror/bills.sqlite3 |
CONGRESS_MIRROR_REFRESH_CRON | Cron schedule for the in-process mirror refresh (HTTP transport only). Unset means running mirror:refresh yourself. | — |
CONGRESS_MIRROR_CONGRESSES | Comma-separated congress numbers to mirror (e.g. 118,119). | current congress + 1 prior |
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | HTTP server port. | 3010 |
MCP_SESSION_MODE | HTTP session mode: stateless, stateful, or auto; auto resolves to stateful. | stateless |
MCP_AUTH_MODE | Authentication: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (debug, info, notice, warning, error, etc.). | info |
LOGS_DIR | Directory for log files (Node.js only). | <project-root>/logs |
OTEL_ENABLED | Enable OpenTelemetry. | false |
OTEL_EXPORTER_OTLP_ENDPOINT | Base OTLP endpoint for traces and metrics. | — |
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT | Explicit OTLP logs endpoint; the base endpoint does not enable log export. | — |
LOG_TOOL_FAILURE_PAYLOADS | Log failed-call input and output with key-based redaction; secrets inside free-form values are not redacted. | false |
LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES | Maximum bytes per failed-call input or output record. | 16384 |
See .env.example for the full list of optional overrides.
Build and run the production version:
bun run rebuild
bun run start:http # or start:stdio
Build the bill search mirror from this checkout (with CONGRESS_MIRROR_ENABLED=true):
bun run mirror:init # full build
bun run mirror:refresh # incremental refresh
bun run mirror:verify # readiness and integrity check
The mirror CLI requires this checkout or the Docker image's path mapping; an npm installation cannot run these scripts.
Run 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 build -t congressgov-mcp-server .
docker run --rm -e CONGRESS_API_KEY=your-api-key -p 3010:3010 congressgov-mcp-server
The 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. The image carries the mirror scripts, so docker exec <container> bun run mirror:init builds the index in place.
| Directory | Purpose |
|---|---|
src/index.ts | createApp() entry point: registers tools, resources, and prompts, inits services, and schedules the mirror refresh. |
src/config/ | Server-specific environment variable parsing and validation with Zod. |
src/mcp-server/tools/ | Tool definitions (definitions/*.tool.ts) plus shared input, formatting, and summary-window helpers. |
src/mcp-server/resources/definitions/ | Resource definitions (*.resource.ts). |
src/mcp-server/prompts/definitions/ | Prompt definitions (*.prompt.ts). |
src/services/congress-api/ | Congress.gov API client: auth, pagination, rate limiting. |
src/services/congress-documents/ | Bounded document-text fetch: host allowlist, byte ceiling, character window. |
src/services/congress-mirror/ | Local SQLite FTS5 bill-search mirror: ingest, normalize, schema. |
src/services/senate-lis/ | Senate LIS XML client for Senate roll call votes. |
src/utils/ | HTML/XML character-reference decoding. |
scripts/ | Build, devcheck, and release tooling, plus the mirror:init / mirror:refresh / mirror:verify CLIs. |
tests/ | Unit and integration tests, mirroring the src/ structure. |
See CLAUDE.md for development guidelines and architectural rules. The short version:
try/catch in tool logicctx.log for request-scoped logging, ctx.state for tenant-scoped storagereadOnlyHint: true and idempotentHint: true annotationsIssues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
Apache-2.0 — see LICENSE for details.
CONGRESS_API_KEYAPI key from api.data.gov — optional (falls back to DEMO_KEY: 30 req/hr). Own key: 1000 req/hr. Free signup at api.data.gov.
MCP_LOG_LEVELdefault: infoSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
MCP_HTTP_HOSTdefault: 127.0.0.1The hostname for the HTTP server.
MCP_HTTP_PORTdefault: 3010The port to run the HTTP server on.
MCP_HTTP_ENDPOINT_PATHdefault: /mcpThe endpoint path for the MCP server.
MCP_AUTH_MODEdefault: noneAuthentication mode to use: 'none', 'jwt', or 'oauth'.