The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Legiscan MCP listing page.
A Model Context Protocol (MCP) server that gives terminal agents structured access to the LegiScan API for legislative data from all 50 US states and Congress.
Built for research workflows where you direct an agent (Codex, Claude Code, Claude Desktop, etc.) to gather bill history, sponsor context, and voting records quickly.
Add this server to whatever MCP host your terminal agent uses.
Claude Desktop config paths:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.jsonFor other MCP clients (Codex CLI, Claude Code, etc.), add the same mcpServers.legiscan entry in that client's MCP config file.
| Tool | Description |
|---|---|
legiscan_find_legislator | Find a legislator's people_id by name. Supports partial matching. |
legiscan_get_legislator_votes | Get how a legislator voted on multiple bills in one call. |
legiscan_get_primary_authored | Get only bills where legislator is primary author (not co-sponsor). |
| Tool | Description |
|---|---|
legiscan_get_bill | Get detailed bill info (sponsors, history, votes, texts) |
legiscan_find_bill_by_number | Find bill by number (handles AB 858, AB858, AB-858, A.B. 858). Best for exact bill lookup. |
legiscan_get_roll_call | Get vote details with individual legislator votes |
| Tool | Description |
|---|---|
legiscan_get_person | Get legislator info with third-party IDs (VoteSmart, OpenSecrets, etc.) |
legiscan_get_session_people | Get all legislators active in a session |
| Tool | Description |
|---|---|
legiscan_search | Full-text search across legislation. Accepts bill-number variants like AB858, but use legiscan_find_bill_by_number for exact matches. |
| Tool | Description |
|---|---|
legiscan_get_session_list | List available legislative sessions by state |
Give your agent a goal, state, timeframe, and output format.
Example prompt:
For high-quality results, tell the agent to do this order:
legiscan_get_session_list to identify the correct session.legiscan_search or legiscan_find_bill_by_number to locate target bills.legiscan_get_bill for sponsor/history/vote references.legiscan_get_roll_call for individual vote details.legiscan_get_person only when legislator enrichment is needed.If you start with legiscan_find_legislator, keep passing the returned session.session_id or the same state into follow-up authoring workflows so results stay in the intended legislature and timeframe.
These cut tool-call volume and simplify instructions to your agent:
legiscan_find_legislator: get people_id from a name query.legiscan_get_primary_authored: separate primary-authored from co-sponsored bills.legiscan_get_legislator_votes: pull vote positions across many bills in one request.The composite tools dramatically reduce agent-to-tool round trips for common workflows:
| Workflow | Manual MCP Steps | With Composites |
|---|---|---|
| Get votes for 1 legislator on 10 bills | Find legislator → search/resolve bills → inspect each bill → inspect each roll call | 1 tool call once you have bill_ids |
| Filter primary authored from 150 sponsored bills | Sponsored list → fetch each bill → inspect sponsors | 1 tool call, optionally scoped by state or session_id |
| Find legislator by name | Session discovery → session people lookup → manual matching | 1 tool call |
ca → CA). Invalid codes like ZZ pass local validation but return an API error from LegiScan.bill_id, roll_call_id, and people_id in intermediate output so you can audit traceability.legiscan_get_primary_authored can return all available sessions, but passing state or session_id keeps results aligned to the intended legislature and timeframe.legiscan_get_legislator_votes accepts up to 100 bill_ids per request; split larger jobs into chunks.legiscan_search retries compact bill-number queries like AB858 using a canonical spaced format. For exact bill resolution, prefer legiscan_find_bill_by_number.npm test / npm run test:unit: Fast deterministic tests with mocked network calls.npm run test:e2e: Research workflow tests based on real legislative analysis tasks. Skips if LEGISCAN_API_KEY is unavailable.npm run test:live: Real LegiScan API integration tests. Requires LEGISCAN_API_KEY.Build the container image locally:
Run it with your API key provided at runtime:
Glama checks expect a GitHub release. After merging your next repo changes, create and publish a tag such as v1.0.0 from GitHub or with:
MIT - see LICENSE for details.