io. github. cyanheads/ openstates-mcp-server
by cyanheads · remote · local (npm) · no sign-in to list tools · v0.3.3 · published by GitHub user cyanheads
Search bills, legislators, committees, and events across all 50 US states, DC, and 5 US territories.
10 tools: 10 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things0Claude Code: ask
- Only reads10Claude Code: allow: see these tools
No check matched anything in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http openstates https://openstates.caseyjhand.com/mcpTools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
10 tools
Only reads 10Claude Code: allow
openstates_get_billFetch full detail for a specific state bill.No findings
Why it is in this group
- The name "openstates_get_bill" says "get": a word for reading.
Description, as the server wrote it Fetch full detail for a specific state bill. Accepts either the three-part path (jurisdiction + session + bill_id) or a direct OCD bill ID (openstates_id from search results). Use include to request votes, actions, sponsorships, documents, and versions in one call rather than searching again. include=votes returns the full vote tally and per-legislator positions. include=actions returns the complete action history. Prefer openstates_id when available to avoid session identifier lookup.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
openstates_get_committeeFetch committee detail by OCD organization ID.No findings
Why it is in this group
- The name "openstates_get_committee" says "get": a word for reading.
Description, as the server wrote it Fetch committee detail by OCD organization ID. Returns name, classification, and membership roster when include=memberships is requested. Experimental — not all states have committee data in Open States. Obtain the committee_id from openstates_search_committees.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
openstates_get_eventFetch full event detail by OCD event ID.No findings
Why it is in this group
- The name "openstates_get_event" says "get": a word for reading.
Description, as the server wrote it Fetch full event detail by OCD event ID. Returns agenda, participants, media links, and associated documents when requested via include. Experimental — event coverage is limited in Open States. Obtain the event_id from openstates_search_events.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
openstates_get_jurisdictionFetch full metadata for a specific jurisdiction including all legislative sessions, their identifiers, and coverage dates.No findings
Why it is in this group
- The name "openstates_get_jurisdiction" says "get": a word for reading.
Description, as the server wrote it Fetch full metadata for a specific jurisdiction including all legislative sessions, their identifiers, and coverage dates. Use when you need to know the exact session identifier for a state before filtering bill searches — session formats vary widely (e.g., "2025", "2025rs", "2025s1"). Jurisdiction IDs follow OCD format: ocd-jurisdiction/country:us/state:{abbr}/government (e.g., ocd-jurisdiction/country:us/state:wa/government). State names (e.g., "Washington") and two-letter abbreviations (e.g., "wa") are also accepted.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
openstates_get_legislators_by_locationFind every legislator representing a geographic coordinate — both tiers.No findings
Why it is in this group
- The name "openstates_get_legislators_by_location" says "get": a word for reading.
Description, as the server wrote it Find every legislator representing a geographic coordinate — both tiers. Pass latitude and longitude to get the state senators and representatives for that location (and potentially governor/executive officials), plus the coordinate's two US Senators and its US Representative. jurisdiction.classification separates the tiers: "state" is a state legislature, "country" is the US Congress. current_role.org_classification does not — it is "upper"/"lower" for a US Senator exactly as for a state senator. Useful for constituent-to-representative matching, address-based policy research, and electoral boundary analysis. This server does not geocode addresses — the caller must provide decimal-degree coordinates. Use include=offices to get contact information alongside the legislator list.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
openstates_list_jurisdictionsList all jurisdictions covered by Open States — all 50 states, DC, and 5 US territories (American Samoa, Guam, Northern Mariana Islands, Puerto Rico, and the US Virgin Islands): 56…No findings
Why it is in this group
- The name "openstates_list_jurisdictions" says "list": a word for reading.
Description, as the server wrote it List all jurisdictions covered by Open States — all 50 states, DC, and 5 US territories (American Samoa, Guam, Northern Mariana Islands, Puerto Rico, and the US Virgin Islands): 56 in total, returned complete in a single default call. Returns coverage metadata: latest bill update time, latest people update time, and optionally all legislative sessions with their identifiers. Use this when you need to discover valid session identifiers for a state before calling openstates_search_bills with a session filter. The legislative_sessions include option returns all historical and current sessions — always check valid session identifiers here before using them in bill searches, since formats vary widely by state (e.g., "2025", "2025-2026", "2025rs", "2025s1").
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
openstates_search_billsSearch state legislative bills across all covered US jurisdictions.No findings
Why it is in this group
- The name "openstates_search_bills" says "search": a word for reading.
Description, as the server wrote it Search state legislative bills across all covered US jurisdictions. Supports full-text search, jurisdiction/session filtering, subject tags, sponsor lookups, and sort order. Either jurisdiction or q (full-text) is required, and pairing them is the reliable form — a q-only search spans all 56 jurisdictions and exceeds the upstream timeout for a common term, though a distinctive one still returns quickly. include=sponsorships,actions returns sponsor and action history inline. sort=latest_action_desc surfaces bills currently moving. openstates_get_jurisdiction with include=legislative_sessions returns valid session identifiers for session filtering.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
openstates_search_committeesList committees for a jurisdiction.No findings
Why it is in this group
- The name "openstates_search_committees" says "search": a word for reading.
Description, as the server wrote it List committees for a jurisdiction. jurisdiction is required — a request spanning all 56 jurisdictions exceeds the upstream timeout, so scope every call to a single state; use openstates_list_jurisdictions to pick one. Experimental — Open States is actively working to restore committee support and not all states have data. Use chamber to scope to upper (senate) or lower (house) committees. Use classification=subcommittee to find subcommittees of a parent. Use include=memberships to get the full roster with member roles. The coverageNote field in the output will always note the experimental coverage limitations.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
openstates_search_eventsSearch hearings, floor sessions, and committee meetings.No findings
Why it is in this group
- The name "openstates_search_events" says "search": a word for reading.
Description, as the server wrote it Search hearings, floor sessions, and committee meetings. jurisdiction is required — the Open States events endpoint has no all-states search, so scope every call to a single state; use openstates_list_jurisdictions to pick one. Experimental — most states do not publish event data to Open States. Use after and before to scope to a date range. Set require_bills=true to filter to events with bills on the agenda, which is the most useful filter for tracking legislation through committee. Use include=agenda,participants for full meeting context. Empty results often indicate the state lacks event data rather than no events occurring.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
openstates_search_peopleSearch state legislators and officials by name, jurisdiction, chamber, or district, or fetch specific people by OCD person ID.No findings
Why it is in this group
- The name "openstates_search_people" says "search": a word for reading.
Description, as the server wrote it Search state legislators and officials by name, jurisdiction, chamber, or district, or fetch specific people by OCD person ID. Party is reported on every result but cannot be filtered on — narrow by party after the call. Either jurisdiction or id is required — a search spanning all 56 jurisdictions exceeds the upstream timeout, including a name-only one, so scope every call to a single state or to specific person IDs. Use openstates_list_jurisdictions to pick a jurisdiction, or openstates_get_legislators_by_location when you have coordinates but no state. id takes the person IDs that openstates_get_bill sponsorships and openstates_get_committee memberships hand back, and resolves any number of them in one call. Supports name substring matching (case-insensitive). org_classification targets a role type: "upper" for Senate, "lower" for House/Assembly, "executive" for governors and executive officials, and "legislature" for every legislator — both chambers merged into one paginated set (all upper members, then all lower), which excludes executive-branch officials. Omitting org_classification is not the same as "legislature": it returns every officeholder, executive officials included. include=offices adds phone, fax, and address. include=links adds website and social links.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 0.3.3. Values in angle brackets are yours to fill in.
claude mcp add --transport http openstates https://openstates.caseyjhand.com/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__openstates__openstates_search_bills",
"mcp__openstates__openstates_get_bill",
"mcp__openstates__openstates_search_people",
"mcp__openstates__openstates_get_legislators_by_location",
"mcp__openstates__openstates_search_committees",
"mcp__openstates__openstates_get_committee",
"mcp__openstates__openstates_search_events",
"mcp__openstates__openstates_get_event",
"mcp__openstates__openstates_list_jurisdictions",
"mcp__openstates__openstates_get_jurisdiction"
],
"ask": [],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as openstates. Review it before you use it.
