openstates-mcp-server
Server Details
Search bills, legislators, committees, and events across all 50 US states, DC, and 5 US territories.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- cyanheads/openstates-mcp-server
- GitHub Stars
- 1
- Server Listing
- @cyanheads/openstates-mcp-server
Glama MCP Gateway
Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.
Full call logging
Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.
Tool access control
Enable or disable individual tools per connector, so you decide what your agents can and cannot do.
Managed credentials
Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.
Usage analytics
See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.
Tool Definition Quality
Average 4.6/5 across 10 of 10 tools scored.
Each tool has a clearly distinct purpose: get_* fetches a single entity, search_* queries for entities, list_jurisdictions enumerates all jurisdictions, and get_legislators_by_location is specifically for location-based lookups. Even similar tools (search_people vs get_legislators_by_location) are differentiated by input and use case.
All tools follow a consistent 'openstates_<verb>_<object>' pattern with verbs get, list, and search. No mixed casing or naming styles; long names like get_legislators_by_location are still readable and pattern-compliant.
With 10 tools, the server is well-scoped for a legislative data API. It covers the main resources (bills, committees, events, jurisdictions, people) without unnecessary duplication or bloat.
The tool surface provides comprehensive read-only coverage: search and fetch for bills, committees, events, and people, plus jurisdiction metadata and location-based legislator lookup. Votes, actions, sponsorships, and memberships are available via include parameters, filling potential gaps.
Available Tools
10 toolsopenstates_get_billGet BillARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| bill_id | No | Bill identifier as used by the legislature (e.g., "HB 1000", "SB 42"). Required with jurisdiction + session. | |
| include | No | Related data to inline. "sponsorships", "actions", "votes" are most commonly needed. "versions" and "documents" provide links to bill text and fiscal notes. | |
| session | No | Session identifier. Required with jurisdiction + bill_id. | |
| jurisdiction | No | State name, abbreviation, or OCD-ID. Required when using path-based lookup with session + bill_id. | |
| openstates_id | No | OCD bill ID from openstates_search_bills results (e.g., "ocd-bill/..."). Preferred over the three-part path when available. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | OCD bill ID. |
| title | Yes | Bill title. |
| votes | No | Vote events when include=votes is requested. |
| actions | No | Full action history when include=actions is requested. |
| session | Yes | Legislative session identifier. |
| sources | No | Source documents when include=sources is requested. |
| subject | Yes | Subject tags. |
| versions | No | Bill text versions when include=versions is requested. |
| abstracts | No | Bill abstracts when include=abstracts is requested. |
| documents | No | Bill documents (fiscal notes, etc.) when include=documents is requested. |
| identifier | Yes | Bill identifier as used by the legislature. |
| updated_at | No | Timestamp Open States last updated this record — the field openstates_search_bills sorts by under the default sort=updated_desc. |
| jurisdiction | Yes | Originating jurisdiction. |
| other_titles | No | Alternate titles when include=other_titles is requested. |
| sponsorships | No | Sponsorships when include=sponsorships is requested. |
| related_bills | No | Related bills when include=related_bills is requested. |
| classification | Yes | Bill classifications. |
| openstates_url | No | Open States URL for this bill. |
| first_action_date | Yes | Date of first recorded action. |
| from_organization | Yes | Originating chamber. |
| other_identifiers | No | Alternate identifiers when include=other_identifiers is requested. |
| latest_action_date | Yes | Date of most recent action. |
| latest_passage_date | Yes | Date bill passed (when applicable). |
| latest_action_description | Yes | Most recent action description. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, and idempotent hints, so the description doesn't need to restate safety. It adds useful behavioral context by explaining that `include=votes` returns full vote tallies and per-legislator positions, and that `include=actions` returns complete history. It also clarifies the two distinct identifier input methods.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences long, front-loaded with the core purpose, and every sentence conveys distinct information: purpose, identifier alternatives, include behavior, and preference. No redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main usage paths and include options. It does not explicitly state that at least one identifier must be supplied, and the schema lists 0 required parameters, which could be ambiguous. However, the phrasing 'Accepts either...' strongly implies a required choice. With a full schema and an output schema present, the description is otherwise complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While schema descriptions cover each parameter individually (100% coverage), the description adds critical grouping semantics: it explains that `jurisdiction`, `session`, and `bill_id` form a three-part path alternative to a single `openstates_id`. This relationship is not evident from the schema alone and meaningfully guides parameter selection.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Fetch full detail for a specific state bill.' It clearly distinguishes from sibling tools that fetch other entity types (committees, events, jurisdictions). The alternate identifier formats are also described.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises using `include` to get related data in one call 'rather than searching again' and explicitly recommends preferring `openstates_id` to avoid session lookup. It implies the tool is for when you already have a bill identifier, but it doesn't explicitly say 'use only when you have an ID; otherwise search first.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openstates_get_committeeGet CommitteeARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Related data to inline. "memberships" includes the full roster with member roles. "links" includes the committee homepage and reference links, and "sources" the provenance URLs behind the record. | |
| committee_id | Yes | OCD organization ID (from openstates_search_committees results). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | OCD organization ID. |
| name | Yes | Committee name. |
| links | No | Committee homepage and reference links when include=links is requested. |
| sources | No | Provenance sources when include=sources is requested. |
| parent_id | Yes | OCD ID of parent committee, or null for top-level committees. |
| memberships | No | Membership roster when include=memberships is requested. |
| classification | Yes | Committee classification: "committee" or "subcommittee". |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, which cover the safety profile. The description adds value by disclosing that the tool is 'Experimental,' that data is not available for all states, and that the return includes name, classification, and membership roster conditionally. This goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, consisting of three clear sentences: purpose, conditional return, and workflow/caveat. Every sentence earns its place, with no fluff or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (get by ID), the presence of a detailed output schema, rich parameter descriptions, and annotations covering safety, the description is complete. It adds the crucial experimental caveat and directs users to the correct source for the ID, making it well-rounded for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage with detailed descriptions for both parameters, including the meaning of 'memberships,' 'links,' and 'sources.' The description restates the memberships behavior but adds no new parameter semantics beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetch') and resource ('committee detail') with an explicit identifier ('OCD organization ID'), clearly distinguishing this from sibling search tools. It also names the source tool (openstates_search_committees) for obtaining the ID, reinforcing its unique role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear workflow by stating 'Obtain the committee_id from openstates_search_committees,' implying this tool is used after a search. It also warns that 'not all states have committee data,' offering context for when the tool may not work. However, it does not explicitly state when-not to use it or list alternative tools beyond the search step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openstates_get_eventGet EventARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Related data to inline. "agenda" and "participants" are most useful; "links", "media", and "documents" add related URLs, recordings, and files, and "sources" the provenance URLs behind the record. | |
| event_id | Yes | OCD event ID (from openstates_search_events results). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | OCD event ID. |
| name | Yes | Event name. |
| links | No | Event links when include=links is requested. |
| media | No | Media links when include=media is requested. |
| agenda | No | Agenda items when include=agenda is requested. |
| status | Yes | Event status. |
| sources | No | Provenance sources when include=sources is requested. |
| end_date | No | Event end datetime. Absent when not recorded. |
| location | No | Event location when available. |
| documents | No | Document links when include=documents is requested. |
| start_date | Yes | Event start datetime. |
| description | Yes | Event description. |
| jurisdiction | Yes | Hosting jurisdiction. |
| participants | No | Participants when include=participants is requested. |
| classification | Yes | Event classification. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds valuable behavioral context: the include parameter controls which related data is returned, and the experimental nature with limited event coverage. This goes beyond what annotations provide without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences, each with a clear purpose: action and return types, experimental warning, and ID acquisition. It is front-loaded and contains no redundant phrasing or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a simple getter, an output schema present, and annotations covering safety, the description provides everything needed: purpose, parameter usage, dependency on search_events, and a caveat about data coverage. The return values are covered by the output schema, so no further detail is necessary. It is complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with detailed descriptions for event_id and include. The description reinforces the source of event_id and summarizes the effect of include, but does not add significant new meaning beyond the schema. The include enum values are already well-documented in the schema, so the description adds marginal value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Fetch full event detail by OCD event ID') and clearly distinguishes this getter from sibling search tools like openstates_search_events. It also specifies what the tool returns (agenda, participants, media links, documents) when requested via include, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The instruction to 'Obtain the event_id from openstates_search_events' clearly indicates the prerequisite workflow and implies that this tool is for fetching a specific event after search. It also warns about experimental coverage, which is useful context. However, it does not explicitly name alternatives or state when not to use this tool, though sibling getters are for other entities.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openstates_get_jurisdictionGet JurisdictionARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Related data to inline. "legislative_sessions" returns all historical and current sessions with identifiers and date ranges. "organizations" lists the jurisdiction's legislative chambers and executive bodies. "latest_runs" shows last scraper run metadata. | |
| jurisdiction_id | Yes | OCD jurisdiction ID, state name (e.g., "Washington"), or two-letter abbreviation (e.g., "wa"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | OCD jurisdiction ID. |
| url | Yes | Official legislature URL. |
| name | Yes | Jurisdiction name. |
| latest_runs | No | Recent scraper runs when include=latest_runs is requested. |
| organizations | No | Legislative chambers and executive bodies when include=organizations is requested. |
| classification | Yes | Jurisdiction type. |
| latest_bill_update | Yes | ISO 8601 timestamp of most recent bill data update. |
| latest_people_update | Yes | ISO 8601 timestamp of most recent people data update. |
| legislative_sessions | No | All legislative sessions when include=legislative_sessions is requested. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Given the annotations already declare readOnlyHint, openWorldHint, and idempotentHint, the description adds valuable context by explaining session format variability and accepted jurisdiction ID formats (OCD, state name, abbreviation). It does not contradict annotations and provides useful behavioral context for expected input flexibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the primary purpose, and each sentence adds value: purpose, usage scenario, and ID format examples. There is no redundancy or wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core purpose, parameter formats, and use case. However, it does not clarify that legislative sessions are only included when the 'include' parameter is specified, which could cause ambiguity about default behavior. Given the presence of an output schema and rich annotations, the description is mostly complete but has a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaning beyond the schema by providing concrete examples of session formats and clarifying accepted jurisdiction_id forms (e.g., 'Washington' or 'wa'), which helps the agent understand parameter usage beyond the raw type descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Fetch full metadata for a specific jurisdiction including all legislative sessions, their identifiers, and coverage dates.' It uses a specific verb ('Fetch') and resource ('metadata for a specific jurisdiction'), and distinguishes from siblings by highlighting the use case of obtaining session identifiers before bill searches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'Use when you need to know the exact session identifier for a state before filtering bill searches.' However, it does not mention when not to use this tool or explicitly name alternative tools, so it falls slightly short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openstates_get_legislators_by_locationGet Legislators by LocationARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Related data to inline. "offices" includes phone, fax, and address. "links" includes website and social links. "other_names" includes alternate/former names, "other_identifiers" cross-system IDs, and "sources" the provenance URLs behind the record. | |
| latitude | Yes | Latitude in decimal degrees (e.g., 47.6062 for Seattle, WA). | |
| longitude | Yes | Longitude in decimal degrees (e.g., -122.3321 for Seattle, WA). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | Number of legislators returned for this coordinate. |
| notice | No | Present when no legislators were found — explains why (e.g., location outside US boundaries or unsupported territory). |
| stateCount | Yes | Results serving a state legislature (jurisdiction.classification = "state"). |
| legislators | Yes | Legislators representing the given coordinate. |
| federalCount | Yes | Results serving the US Congress (jurisdiction.classification = "country") — the coordinate's two US Senators and its US Representative. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/idempotent annotations, the description adds rich behavioral context: the two-tier structure explained via jurisdiction.classification, the specific pitfall about current_role.org_classification (how a US Senator is 'upper' just like a state senator), and the note about not geocoding addresses. This is exactly the kind of nuance that prevents misinvocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but every sentence earns its place: purpose, tiers, classifier distinction, use cases, geocoding caveat, and include hint. It is front-loaded with the core action and tapers into nuance, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values don't need explanation. The description covers the tool's main input requirements, behavioral quirks, and usage scenarios comprehensively. It even addresses a likely source of confusion (org_classification vs jurisdiction.classification), which is above and beyond for a typical tool description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already has 100% coverage for all three parameters, so baseline is 3. The description adds value by explaining include=offices for contact info and emphasizing that latitude/longitude must be decimal-degree coordinates (though the schema also says that). The deeper semantic context about jurisdiction.classification vs current_role.org_classification helps interpret results, even though it's not strictly a parameter explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb + resource: 'Find every legislator representing a geographic coordinate'. It clearly states scope (both state and federal tiers) and differentiates from sibling tools by focusing on location-based legislator lookup rather than bills, committees, events, or jurisdictions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit use cases ('constituent-to-representative matching, address-based policy research, electoral boundary analysis') and a critical constraint ('This server does not geocode addresses'). It does not explicitly name alternatives, but the purpose and sibling context make it clear when to choose this over search_people or other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openstates_list_jurisdictionsList JurisdictionsARead-onlyIdempotentInspect
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").
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-indexed). | |
| include | No | Related data to inline. "legislative_sessions" returns all session identifiers and date ranges — required when you need to discover valid session values for bill searches. "organizations" lists the jurisdiction's legislative chambers and executive bodies, and "latest_runs" the recent scraper run history. | |
| per_page | No | Results per page (upstream maximum 52). The default call returns the complete state inventory (56) in one response by fetching and merging the pages server-side; set a smaller value only to page manually. | |
| classification | No | Filter by jurisdiction type. Use "state" (default) for all 50 states, DC, and the 5 US territories. | state |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | Current page returned. |
| maxPage | Yes | Total pages available. |
| results | Yes | Jurisdictions matching the filter. |
| pagination | Yes | Pagination metadata. |
| totalCount | Yes | Total jurisdictions matching the filter across all pages. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds meaningful behavior beyond these: it notes the tool 'returned complete in a single default call' despite pagination, and warns that session formats 'vary widely by state' with concrete examples. It also clarifies that the legislative_sessions include option returns all historical and current sessions, which is critical for correct usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, with the core listing activity in the first sentence followed by detail on return metadata, usage context, and session-format variability. Every sentence adds unique, non-redundant information, and the structure front-loads the primary purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (all params optional, read-only, output schema available), the description is complete: it states the full inventory, describes coverage metadata, names the session-discovery workflow, and warns about varying session formats. It also details the include options sufficiently for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers all parameters at 100%, so the baseline is 3. The description enriches the semantic context by explaining the practical effect of the 'include' parameter (legislative_sessions returns all session identifiers and is 'required when you need to discover valid session values') and by clarifying that the default per_page value fetches and merges pages server-side to return the full 56 jurisdictions in one response.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List all jurisdictions covered by Open States — all 50 states, DC, and 5 US territories', providing a specific verb and resource. It enumerates the exact count (56) and clearly distinguishes from sibling tools by emphasizing the complete collection and its role in discovering session identifiers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states 'Use this when you need to discover valid session identifiers for a state before calling openstates_search_bills with a session filter,' giving a clear context and precondition. It does not mention alternatives like openstates_get_jurisdiction for a single jurisdiction, so it lacks an explicit when-not or alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openstates_search_billsSearch BillsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Full-text search across bill titles, abstracts, and text. Required unless jurisdiction is provided. Pair it with jurisdiction whenever a state is known — a q-only search over every jurisdiction times out upstream for a common term. | |
| page | No | Page number (1-indexed). | |
| sort | No | Sort order. Use "latest_action_desc" for bills currently moving through the legislature. | updated_desc |
| chamber | No | Filter by originating chamber. "upper" = Senate, "lower" = House/Assembly. | |
| include | No | Related data to inline. "sponsorships" and "actions" cover most research needs without a separate openstates_get_bill call. "votes" adds full vote tallies and per-legislator positions. | |
| session | No | Session identifier (e.g., "2025", "2025-2026", "2025rs"). Use openstates_get_jurisdiction with include=legislative_sessions to discover valid values. Omit to search across all sessions. | |
| sponsor | No | Filter by sponsor name or OCD person ID. | |
| subject | No | Filter to bills tagged with one or more subject categories. | |
| per_page | No | Results per page. Maximum 20. Default 10. | |
| action_since | No | ISO 8601 date — only return bills with an action after this date (e.g., "2025-01-01"). | |
| jurisdiction | No | State name, two-letter abbreviation, or OCD-ID (e.g., "Washington", "wa", or "ocd-jurisdiction/country:us/state:wa/government"). Required unless q is provided. | |
| created_since | No | ISO 8601 date — only return bills first entered in Open States after this date (e.g., "2025-01-01"). Use to find newly-introduced bills, as opposed to recently-updated or recently-acted-on. | |
| updated_since | No | ISO 8601 date — only return bills updated after this date (e.g., "2025-01-01"). | |
| classification | No | Bill classification: "bill", "resolution", "constitutional amendment", etc. | |
| sponsor_classification | No | Filter sponsor type: "primary", "cosponsor". |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | Current page returned. |
| notice | No | Recovery hint when results are empty — names every filter that narrowed the query and suggests how to broaden. Absent when results are returned. |
| maxPage | Yes | Total pages available. |
| results | Yes | Bills matching the search criteria. |
| pagination | Yes | Pagination metadata. |
| totalCount | Yes | Total bills matching the query across all pages. |
| appliedFilters | Yes | Filters applied to this query as the server received them, for agent self-verification of zero or unexpected results. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint, openWorldHint, and idempotentHint, so safety profile is already known. The description adds real behavioral context beyond that: the timeout risk for q-only searches, the reliability benefit of pairing q with jurisdiction, and the effect of include=sponsorships,actions on inline data. Does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat long but every sentence contributes: purpose, required-parameter logic, performance caveat, include guidance, sort tip, and session lookup pointer. It is front-loaded with the core use case and structured information efficiently, though a slightly tighter wording could be possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex tool with 15 parameters and an output schema, but the description covers all critical aspects: required vs optional parameters, performance constraints, related-data include options, sort behavior, and how to obtain valid session identifiers. It gives an agent enough context to invoke the tool effectively without needing additional research.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed descriptions for every parameter. The description still adds value by explaining the strategic relationship between q and jurisdiction, warning about timeout, and explaining the practical meaning of sort=latest_action_desc. This goes beyond a simple restatement of schema fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Search') and resource ('state legislative bills across all covered US jurisdictions'), and enumerates the major filtering dimensions. This clearly distinguishes it from siblings like openstates_get_bill or openstates_search_committees.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the required pairing of jurisdiction and q, warns against q-only searches due to timeout, and points to openstates_get_jurisdiction for session discovery. It also gives concrete guidance for include and sort values, which serves as clear when-to-use instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openstates_search_committeesSearch CommitteesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-indexed). | |
| parent | No | OCD organization ID of a parent committee to retrieve its subcommittees. | |
| chamber | No | Filter by chamber. "upper" = Senate, "lower" = House/Assembly. | |
| include | No | Related data to inline. "memberships" includes the full roster with member roles. "links" includes the committee homepage and reference links, and "sources" the provenance URLs behind the record. | |
| per_page | No | Results per page. Maximum 20. | |
| jurisdiction | Yes | State name, abbreviation, or OCD-ID. Required — an all-states request exceeds the upstream timeout, so every call must be scoped to a single jurisdiction. | |
| classification | No | Filter to parent committees or subcommittees only. Omit for all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | Current page returned. |
| maxPage | Yes | Total pages available. |
| results | Yes | Committees matching the search criteria. |
| pagination | Yes | Pagination metadata. |
| totalCount | Yes | Total committees matching the query across all pages. |
| coverageNote | Yes | Committee data is experimental — not all states have coverage in Open States. Empty results may indicate the state lacks data, not that no committees exist. |
| appliedFilters | Yes | Filters applied to this query as the server received them, for agent self-verification of zero or unexpected results. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly, idempotent, and openWorld annotations, the description discloses critical behavioral traits: upstream timeout risk, experimental status with incomplete data coverage, and the guaranteed presence of a coverageNote field. This is substantial context not available from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently packed into four sentences, front-loading the core purpose and mandatory parameter, then providing warnings and usage tips in a logical order. Every sentence contributes unique value without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, output schema) and the rich annotations, the description covers the essential context: required scope, experimental caveats, parameter usage examples, and the output field caveat. It is fully sufficient for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though the schema has 100% description coverage, the tool description adds practical semantics: jurisdiction is required due to timeout, chamber maps to 'upper'/'lower', classification=subcommittee finds subcommittees, and include=memberships retrieves full rosters. This actionable guidance goes beyond the schema, enriching parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List committees for a jurisdiction,' a specific verb+resource statement that clearly distinguishes this search tool from sibling tools like get_committee or search_bills. It also notes the experimental nature and scope requirements, further clarifying its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states that jurisdiction is required and provides a warning about all-jurisdiction timeouts, instructing users to scope to a single state and pointing to openstates_list_jurisdictions as a helper. It also gives concrete parameter usage guidance for chamber, classification, and include, covering when to use different options.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openstates_search_eventsSearch EventsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-indexed). | |
| after | No | ISO 8601 datetime — events starting after this time. Use to find upcoming hearings. | |
| before | No | ISO 8601 datetime — events starting before this time. | |
| include | No | Related data to inline. "agenda" includes the meeting agenda with bill references. "participants" includes the committee or chamber hosting the event. "links" and "media" add related URLs and recordings, "documents" the attached files, and "sources" the provenance URLs behind the record. | |
| per_page | No | Results per page. Maximum 20. | |
| jurisdiction | Yes | State name, abbreviation, or OCD-ID. Required — the Open States events endpoint has no all-states search, so every call must be scoped to a single jurisdiction. | |
| require_bills | No | When true, only return events with at least one bill on the agenda. Most useful for tracking legislation through committee. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | Current page returned. |
| notice | No | Recovery hint when results are empty. Absent when results are returned. |
| maxPage | Yes | Total pages available. |
| results | Yes | Events matching the search criteria. |
| pagination | Yes | Pagination metadata. |
| totalCount | Yes | Total events matching the query across all pages. |
| coverageNote | Yes | Event data is experimental — most states do not publish event data to Open States. Empty results may indicate the state lacks data, not that no events occurred. |
| appliedFilters | Yes | Filters applied to this query as the server received them, for agent self-verification of zero or unexpected results. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly, openWorld, and idempotent, but the description adds valuable context: the experimental nature, that most states lack event data, and that empty results often mean missing data rather than no events. It also explains the scoping constraint and the meaning of include options, going well beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, each carrying distinct value: core purpose, jurisdiction constraint/remedy, experimental warning, and filtering guidance. No redundancy or fluff; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 params, 1 required, output schema present), the description covers all critical invocation aspects: required parameter, key filter behaviors, data availability caveats, and interpretation of empty results. The existence of an output schema means return-value details need not be spelled out, making the description complete for agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description enhances parameters by explaining why jurisdiction is required, how after/before are used for date ranges, that require_bills=true is 'most useful for tracking legislation through committee', and that include=agenda,participants provides 'full meeting context'. This adds strategic guidance beyond the schema's field-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches for 'hearings, floor sessions, and committee meetings', which is a specific verb+resource combination. It distinguishes this search tool from the singular openstates_get_event sibling by focusing on the search capability across event types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context: jurisdiction is required, no all-states search, and it explicitly recommends openstates_list_jurisdictions for picking one. It also gives filtering guidance (after/before, require_bills, include) and warns about experimental data coverage. However, it doesn't explicitly contrast with sibling tools like openstates_get_event for single-event lookups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openstates_search_peopleSearch PeopleARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | OCD person IDs (e.g., "ocd-person/9eddb3cd-868e-42ba-831a-b415fd7ed445"). Required unless jurisdiction is provided — it returns exactly these people, so it scopes the call on its own and needs no jurisdiction alongside it. Resolves the IDs that openstates_search_people results, openstates_get_bill sponsorships[].person.id, and openstates_get_committee memberships[].person_id hand back — any number of them in one call, subject to per_page. An ID Open States does not know matches nothing rather than failing, as does an ID paired with a jurisdiction that person does not belong to. | |
| name | No | Name or partial name to match (case-insensitive substring). Narrows within the jurisdiction; it does not substitute for one. | |
| page | No | Page number (1-indexed). | |
| include | No | Related data to inline. "offices" includes phone, fax, and address. "links" includes website and social links. "other_names" includes alternate/former names, "other_identifiers" cross-system IDs, and "sources" the provenance URLs behind the record. | |
| district | No | District label (e.g., "1", "37", "At-Large"). Formats vary by state. | |
| per_page | No | Results per page. Maximum 20. | |
| jurisdiction | No | State name, abbreviation, or OCD-ID. Required unless id is provided — an all-states search exceeds the upstream timeout, so every call must be scoped to a single jurisdiction or to specific person IDs. | |
| org_classification | No | Filter by role type. "upper" = Senate, "lower" = House/Assembly, "executive" = governors and executive officials, "legislature" = every legislator (both chambers merged into one paginated set, all upper members then all lower, excluding executive officials). Omitting this filter returns every officeholder including executive ones — it is not equivalent to "legislature". |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | Current page returned. |
| notice | No | Recovery hint when results are empty. Absent when results are returned. |
| maxPage | Yes | Total pages available. |
| results | Yes | Legislators matching the search criteria. |
| pagination | Yes | Pagination metadata. |
| totalCount | Yes | Total legislators matching the query across all pages. |
| appliedFilters | Yes | Filters applied to this query as the server received them, for agent self-verification of zero or unexpected results. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial context beyond the readOnlyHint/openWorldHint/idempotentHint annotations: timeout constraints for all-state searches, party being unfilterable, org_classification semantics including the merged pagination order and executive exclusion, the exact meaning of omitting org_classification, include option effects, and id resolution behavior (unknown IDs match nothing). No contradictions with annotations; openWorldHint aligns with the 'matches nothing' behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a dense but well-structured paragraph. It is front-loaded with the primary purpose, then covers required scoping, alternatives, id usage, substring matching, org_classification semantics, and include options. Every sentence conveys necessary guidance without fluff, making it appropriately sized for a tool with 8 parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (8 params, 0 required), the description covers all critical operational constraints: jurisdiction/id requirement, timeout mitigation, org_classification behavior, include effects, and id resolution edge cases. With a full input schema, output schema present, and annotations, the description is complete enough for an agent to invoke this tool correctly without further lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by clarifying cross-parameter relationships: jurisdiction and id are mutually required/exclusive, org_classification omission is not equivalent to 'legislature,' and id resolves multiple person IDs in one call. These nuances go beyond individual schema descriptions, justifying a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Search state legislators and officials by name, jurisdiction, chamber, or district, or fetch specific people by OCD person ID.' This clearly distinguishes the tool from sibling search tools (bills, committees, events) and from openstates_get_legislators_by_location, which it explicitly names. The scoping and dual search/fetch modes are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is provided: 'Either jurisdiction or id is required' to avoid timeout; 'Use openstates_list_jurisdictions to pick a jurisdiction, or openstates_get_legislators_by_location when you have coordinates but no state.' It also explains when to use id (IDs from bills/committees) and the nuance that omitting org_classification differs from 'legislature.' This gives an agent clear when-to-use and when-not-to-use direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Claim this connector by publishing a /.well-known/glama.json file on your server's domain with the following structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"maintainers": [{ "email": "your-email@example.com" }]
}The email address must match the email associated with your Glama account. Once published, Glama will automatically detect and verify the file within a few minutes.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Servers
- AlicenseAqualityCmaintenanceSearch bills and speaker-attributed hearing transcripts across all 50 US state legislatures.71MIT
- AlicenseAqualityCmaintenanceProvides access to legislative data from all 50 US states through the LegiScan API, enabling comprehensive search and retrieval of bills, votes, legislators, and legislative session information.101710MIT
- Alicense-qualityCmaintenanceAccess U.S. state legislative data including bills, legislators, and votes across all 50 states via the OpenStates API.11MIT
- AlicenseAqualityDmaintenanceProvides tools to search and retrieve US federal and state legislative data, including bills, votes, campaign contributions, and legislator information, with provenance tracking.81MIT
Your Connectors
Sign in to create a connector for this server.