Prototype · Preview: every server in the official registry, synced every 30 minutes. Reviews and accounts come in a later step.
PopNx MCPMCP servers for people who use AI · explained in plain words

Openstates MCP Server

by cyanheadsversion 0.4.0i★ –iComputer or cloud
Registry nameio.github.cyanheads/openstates-mcp-server

Install

Overview

Description from the maker (original English)

Search bills, legislators, committees, and events across all 50 US states, DC, and 5 US territories.

PopNx MCP’s three pillars

These three are never merged into one score: opinions, measurements and popularity are different things.

What you can do with it

We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.

  • Connection: Computer or cloud
  • Transport: stdio, Streamable HTTP
  • Category: Search & AI memory
  • You need to fill in: OPENSTATES_API_KEY

Install

Pick the AI app you use, then copy the settings.

Before you install

  • Basic checks: 3 of 3 passed
  • Runs on the maker’s server: what you ask it goes through their server.
  • Can do 10 things (tools) openstates_search_bills, openstates_get_bill, openstates_search_people, openstates_get_legislators_by_location …
  • You fill in yourself: OPENSTATES_API_KEY, OPENSTATES_DAILY_REQUEST_BUDGET, OPENSTATES_REQUEST_TIMEOUT_MS, OPENSTATES_TOTAL_REQUEST_BUDGET_MS, MCP_LOG_LEVEL

You need

  • Runs in the cloudNothing to install; it connects over the internet
  • npmNode.js installed (for the npx command)

Which app do you use?

Pick your app above. We remember it, so next time the button says “Install in …”.

Works in Claude on the web, desktop and mobile:

  1. Open Settings → Connectors
  2. Press Add custom connector
  3. Paste the address below and press Add
  4. If it asks you to sign in, sign in with the maker
SettingsConnectors1+ Add2https://…3
https://openstates.caseyjhand.com/mcp

Or run it on your computer

Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json

{
  "mcpServers": {
    "openstates": {
      "command": "npx",
      "args": [
        "-y",
        "@cyanheads/openstates-mcp-server"
      ],
      "env": {
        "OPENSTATES_API_KEY": "your-value",
        "OPENSTATES_DAILY_REQUEST_BUDGET": "your-value",
        "OPENSTATES_REQUEST_TIMEOUT_MS": "your-value",
        "OPENSTATES_TOTAL_REQUEST_BUDGET_MS": "your-value",
        "MCP_LOG_LEVEL": "your-value"
      }
    }
  }
}

Run this in your terminal

claude mcp add --transport http openstates https://openstates.caseyjhand.com/mcp

Or run it on your computer

claude mcp add openstates --env OPENSTATES_API_KEY=your-value --env OPENSTATES_DAILY_REQUEST_BUDGET=your-value --env OPENSTATES_REQUEST_TIMEOUT_MS=your-value --env OPENSTATES_TOTAL_REQUEST_BUDGET_MS=your-value --env MCP_LOG_LEVEL=your-value -- npx -y @cyanheads/openstates-mcp-server

Fill in the empty values before running it.

Open in Cursor

Or copy the settings yourself

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "openstates": {
      "url": "https://openstates.caseyjhand.com/mcp"
    }
  }
}

Or run it on your computer

Open in Cursor

Or copy the settings yourself

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "openstates": {
      "command": "npx",
      "args": [
        "-y",
        "@cyanheads/openstates-mcp-server"
      ],
      "env": {
        "OPENSTATES_API_KEY": "your-value",
        "OPENSTATES_DAILY_REQUEST_BUDGET": "your-value",
        "OPENSTATES_REQUEST_TIMEOUT_MS": "your-value",
        "OPENSTATES_TOTAL_REQUEST_BUDGET_MS": "your-value",
        "MCP_LOG_LEVEL": "your-value"
      }
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

Open in VS Code

Or copy the settings yourself

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "openstates": {
      "type": "http",
      "url": "https://openstates.caseyjhand.com/mcp"
    }
  }
}

Or run it on your computer

Open in VS Code

Or copy the settings yourself

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "openstates": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@cyanheads/openstates-mcp-server"
      ],
      "env": {
        "OPENSTATES_API_KEY": "your-value",
        "OPENSTATES_DAILY_REQUEST_BUDGET": "your-value",
        "OPENSTATES_REQUEST_TIMEOUT_MS": "your-value",
        "OPENSTATES_TOTAL_REQUEST_BUDGET_MS": "your-value",
        "MCP_LOG_LEVEL": "your-value"
      }
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

ChatGPT connects only to servers on the internet:

  1. Open ChatGPT on the web → Settings → Connectors (Apps)
  2. Press Create or Add (some plans need Developer mode under Advanced first)
  3. Paste the address below, give it a name and save
  4. If it asks you to sign in, sign in with the maker
SettingsConnectors1+ Create2https://…3
https://openstates.caseyjhand.com/mcp

Menu names can differ slightly by plan and over time.

Your choice stays on this device in a cookie; no account needed.

Values you fill in

  • OPENSTATES_API_KEY required env
    Open States API key from open.pluralpolicy.com. Required to make any API requests.
  • OPENSTATES_DAILY_REQUEST_BUDGET env
    Maximum upstream Open States requests per rolling 24 hours. Rejects before the request is issued once spent. Defaults to the v3 free-tier daily cap.
  • OPENSTATES_REQUEST_TIMEOUT_MS env
    Per-attempt upstream request deadline in milliseconds (minimum 1000). Expiry is non-retryable. Open States answers a scoped query in under a second to ~57s and its gateway gives up near 60s.
  • OPENSTATES_TOTAL_REQUEST_BUDGET_MS env
    Wall-clock ceiling in milliseconds for one call across every retry attempt and the backoff between them. Bounds a slow upstream that keeps failing retryably. Must be at least OPENSTATES_REQUEST_TIMEO…
  • MCP_LOG_LEVEL env
    Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').

These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.

What it can do

Tool names and descriptions exactly as the server reported them on Nov 7, 2026. The maker wrote them, not us; we show them as plain text.

  • openstates_search_bills

    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

  • openstates_get_bill

    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 sea

  • openstates_search_people

    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 a

  • openstates_get_legislators_by_location

    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. ju

  • openstates_search_committees

    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 com

  • openstates_get_committee

    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.

  • openstates_search_events

    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

  • openstates_get_event

    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.

  • openstates_list_jurisdictions

    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

  • openstates_get_jurisdiction

    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", "202

Basic checksi

We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 8, 2026

  • ✓ Pass

    Maker matches the repo

    The registry name was verified with the GitHub account cyanheads, which owns the repo

  • … Not checked yet

    Still maintained

    We have not read this repo from GitHub yet

  • … Not checked yet

    Has a licence

    We have not read this repo from GitHub yet

  • ✓ Pass

    Endpoint responds

    Responded in 229 ms (HTTP 200)

  • – Not applicable

    Sign-in with OAuth

    No sign-in needed

  • ✓ Pass

    No hidden instructions in tool descriptions

    Read 10 tool descriptions and found no hidden instructions to the AI

Compared with others in Search & AI memoryi

  • More stars than 0% of the other 5696 servers in this category
  • Published to the registry more recently than 78% of the other 5696 servers in this category
  • Basic checks equal to or better than 100% of the other 5696 servers in this category

Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.

Common questions

Is Openstates MCP Server safe?

It passed 3 of 3 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.

What keys or codes does it need?

You need to fill in: OPENSTATES_API_KEY

Does it run on my computer or in the cloud?

Either way works: install it on your computer or connect to the cloud version.

Is it still maintained?

The GitHub repo last changed –, and the latest version (0.4.0) reached the registry 11 days ago.

Which apps can use it?

Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. It connects by URL, so apps that accept remote MCP servers work too, such as ChatGPT in developer mode.

What can I use instead?

In the same category: Context7, Codebase Memory, Exa

Alternatives

Servers in the same category from other makers, sorted by stars.

Reading a card:↓ Downloads per weeki★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi

Context7

Feeds AI the latest docs for libraries and frameworks before it answers, so code it writes does not use outdated, removed functions.

by upstashWidely used↓ 972.7K/wk★ 64.2KUpdated 2 days ago

Computer or cloud

Codebase Memory

Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.

by DeusDataWidely used↓ 18K/wk★ 48.1KUpdated 22 days ago

Runs on your computer

Exa

Connect AI agents to Exa for web search, content fetching, and multi-step research.

by exa-labsGrowing★ 5.2KUpdated 2 months ago

Runs in the cloud✓ exa.ai

README from the maker

Open the README

Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.

@cyanheads/openstates-mcp-server Search bills, legislators, committees, and events across all 50 US states, DC, and 5 US territories via MCP. STDIO or Streamable HTTP. 10 Tools • 1 Resource • 2 Prompts

Public Hosted Server: https://openstates.caseyjhand.com/mcp


Overview

US state legislatures from Open States: all 50 states, DC, and 5 US territories. Search bills, legislators, committees, and events, and find who represents any location.

Tools
ToolDescription
openstates_search_billsSearch state legislative bills across all covered US jurisdictions with full-text search, jurisdiction/session filtering, subject tags, and sponsor lookups
openstates_get_billFetch full detail for a specific bill by OCD ID or three-part path (jurisdiction + session + bill_id)
openstates_search_peopleSearch state legislators and officials within a jurisdiction by name, chamber, or district, or fetch specific people by OCD person ID
openstates_get_legislators_by_locationFind every legislator representing a geographic coordinate (latitude/longitude) — state legislators and the federal delegation
openstates_search_committeesList committees for a jurisdiction (experimental — not all states have coverage)
openstates_get_committeeFetch committee detail by OCD organization ID, with optional membership roster
openstates_search_eventsSearch hearings, floor sessions, and committee meetings (experimental)
openstates_get_eventFetch full event detail including agenda, participants, and media links
openstates_list_jurisdictionsList all 56 jurisdictions (50 states, DC, and 5 US territories) covered by Open States with session identifiers and coverage metadata
openstates_get_jurisdictionFetch full metadata for a specific jurisdiction including all legislative sessions and their identifiers
Resources
ResourceDescription
openstates://jurisdiction/{+jurisdiction_id}Jurisdiction metadata including current sessions, coverage dates, and bill/people update timestamps

All resource data is also reachable via tools. Use openstates_get_jurisdiction for programmatic jurisdiction lookups; the resource is useful for injecting jurisdiction context as stable reference material.

Prompts
PromptDescription
openstates_bill_researchStructured framework for analyzing a state bill: summary, sponsors, committee referrals, action timeline, vote record, and related legislation
openstates_legislator_profileResearch framework for profiling a legislator: sponsored bills, committee assignments, voting record, and contact details
Skills
SkillDescription
openstates-guideIdentifier chains and gates for agents calling the tools: session pinning, reading vote events, committee roster scans, hearing searches, and the request budget

Plugin installs and the .mcpb bundle pick it up from skills/; MCP clients that support the Skills extension receive it from the server.

Capability reference

openstates_search_bills tool
  • Either jurisdiction or q is required by the schema — a q-only search spans all 56 jurisdictions and exceeds the upstream timeout for a common term, so pairing them is the reliable form
  • Filters: session, chamber (upper/lower), classification, subject tags, sponsor, sponsor_classification, and action_since/updated_since/created_since ISO 8601 date filters
  • include inlines sponsorships, actions, votes, abstracts, versions, documents, and related bills — avoids follow-up openstates_get_bill calls
  • sort defaults to updated_desc; sort=latest_action_desc surfaces bills currently moving; pagination up to 20 per page (default 10)
  • Empty-result notice echoes every applied filter and names the jurisdiction by name when it isn't recognized

openstates_get_bill tool
  • Lookup by openstates_id (preferred) or the three-part path jurisdiction + session + bill_id; a call missing both fails with missing_lookup_params
  • openstates_id is ocd-bill/ copied from openstates_search_bills (case and surrounding whitespace are normalized); a / / path is also accepted. Any other value fails locally with invalid_openstates_id, with no upstream call
  • Accepts legislature-format bill identifiers (e.g., HB 1000, SB 42)
  • include inlines sponsorships, actions, votes, versions, documents, abstracts, other titles/identifiers, and related bills
  • not_found when a well-formed ID or a three-part path resolves to nothing

openstates_search_people tool
  • Either jurisdiction or id (OCD person IDs) is required — an unscoped search exceeds the upstream timeout even for a name-only query
  • id resolves any number of specific OCD person IDs in one call — the IDs that bill sponsorships and committee memberships hand back — and needs no jurisdiction alongside it
  • org_classification: upper/lower/executive/legislature (every legislator — both chambers, or the single body in Nebraska and DC; executive officials excluded); omitting it returns every officeholder including executives
  • Case-insensitive substring name match, plus district; include adds offices, links, other_names, other_identifiers, sources
  • Party is reported on every result but cannot be filtered on
  • Pagination up to 20 per page

openstates_get_legislators_by_location tool
  • Pass decimal-degree latitude/longitude; does not geocode addresses
  • Returns both government tiers in one call: state legislators plus the coordinate's two US Senators and one US Representative
  • jurisdiction.classification (state vs country) is the tier discriminator — current_role.org_classification is not, since it's upper/lower for a US Senator exactly as for a state senator
  • stateCount/federalCount enrichment fields report the tier split
  • Out-of-range coordinates fail as invalid_coordinate; a location with no coverage returns an empty-result notice

openstates_search_committees tool
  • jurisdiction is required — the schema rejects an all-states request
  • Filter by classification (committee/subcommittee) and chamber (a chamber filter omits joint committees); parent scopes to one committee's subcommittees
  • include=memberships returns the full roster with member roles
  • Experimental: Open States is working to restore committee support and not all states have coverage — the output's coverageNote field always documents this
  • Pagination up to 20 per page

openstates_get_committee tool
  • Fetch by OCD committee_id (from openstates_search_committees)
  • include=memberships returns the roster; include=links/sources add reference URLs
  • Experimental — not all states have committee data; not_found when the ID doesn't exist

openstates_search_events tool
  • jurisdiction is required — the events endpoint has no all-states search
  • after/before scope to an ISO 8601 date range; require_bills=true filters to events with a bill on the agenda
  • include=agenda,participants returns full meeting context
  • Experimental: most states don't publish event data — an empty unfiltered result may mean no coverage, not no events; an empty filtered result (require_bills, after, before) names those filters in its notice
  • Pagination up to 20 per page

openstates_get_event tool
  • Fetch by OCD event_id (from openstates_search_events)
  • include adds agenda, participants, links, media, and documents
  • Experimental — event coverage is limited; not_found when the ID doesn't exist

openstates_list_jurisdictions tool
  • Returns all 56 jurisdictions (50 states, DC, and 5 US territories) in one default call — pages are merged server-side, since the upstream per_page ceiling of 52 no longer covers the full set
  • classification filter defaults to state
  • include=legislative_sessions returns every historical and current session identifier — required before filtering bill searches by session, since formats vary by state (e.g., 2025, 2025-2026, 2025rs, 2025s1)
  • include=organizations/latest_runs add chamber/executive-body and scraper-run metadata

openstates_get_jurisdiction tool
  • Fetch one jurisdiction by OCD-ID, state name, or two-letter abbreviation
  • include=legislative_sessions returns all session identifiers with date ranges
  • not_found when the identifier doesn't resolve

openstates://jurisdiction/{+jurisdiction_id} resource
  • jurisdiction_id accepts the raw OCD ID (slashes intact) as openstates_list_jurisdictions returns it, a state name (multi-word allowed), or a two-letter abbreviation; percent-encoded forms are decoded once, and a malformed escape is a validation error
  • Returns jurisdiction metadata as application/json: current legislative sessions, coverage dates, bill/people update timestamps
  • Always includes legislative_sessions — use to prime session identifiers without a tool call
  • not_found when the identifier doesn't resolve; rate_limited when the shared key's request cap is reached

openstates_bill_research prompt
  • Arguments: jurisdiction, session, bill_id — all required
  • Returns one user message directing a structured research brief: overview, sponsors, legislative history, vote record, related legislation, bill text, and a passage assessment

openstates_legislator_profile prompt

Only the beginning is shown; read the rest in the repo

Ask PopNx