Skip to main content
Glama

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.

MCP client
Glama
MCP server

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.

100% free. Your data is private.
Tool DescriptionsA

Average 4.6/5 across 10 of 10 tools scored.

Server CoherenceA
Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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 tools
openstates_get_billGet BillA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bill_idNoBill identifier as used by the legislature (e.g., "HB 1000", "SB 42"). Required with jurisdiction + session.
includeNoRelated data to inline. "sponsorships", "actions", "votes" are most commonly needed. "versions" and "documents" provide links to bill text and fiscal notes.
sessionNoSession identifier. Required with jurisdiction + bill_id.
jurisdictionNoState name, abbreviation, or OCD-ID. Required when using path-based lookup with session + bill_id.
openstates_idNoOCD bill ID from openstates_search_bills results (e.g., "ocd-bill/..."). Preferred over the three-part path when available.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesOCD bill ID.
titleYesBill title.
votesNoVote events when include=votes is requested.
actionsNoFull action history when include=actions is requested.
sessionYesLegislative session identifier.
sourcesNoSource documents when include=sources is requested.
subjectYesSubject tags.
versionsNoBill text versions when include=versions is requested.
abstractsNoBill abstracts when include=abstracts is requested.
documentsNoBill documents (fiscal notes, etc.) when include=documents is requested.
identifierYesBill identifier as used by the legislature.
updated_atNoTimestamp Open States last updated this record — the field openstates_search_bills sorts by under the default sort=updated_desc.
jurisdictionYesOriginating jurisdiction.
other_titlesNoAlternate titles when include=other_titles is requested.
sponsorshipsNoSponsorships when include=sponsorships is requested.
related_billsNoRelated bills when include=related_bills is requested.
classificationYesBill classifications.
openstates_urlNoOpen States URL for this bill.
first_action_dateYesDate of first recorded action.
from_organizationYesOriginating chamber.
other_identifiersNoAlternate identifiers when include=other_identifiers is requested.
latest_action_dateYesDate of most recent action.
latest_passage_dateYesDate bill passed (when applicable).
latest_action_descriptionYesMost recent action description.
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 CommitteeA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoRelated 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_idYesOCD organization ID (from openstates_search_committees results).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesOCD organization ID.
nameYesCommittee name.
linksNoCommittee homepage and reference links when include=links is requested.
sourcesNoProvenance sources when include=sources is requested.
parent_idYesOCD ID of parent committee, or null for top-level committees.
membershipsNoMembership roster when include=memberships is requested.
classificationYesCommittee classification: "committee" or "subcommittee".
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 EventA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoRelated 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_idYesOCD event ID (from openstates_search_events results).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesOCD event ID.
nameYesEvent name.
linksNoEvent links when include=links is requested.
mediaNoMedia links when include=media is requested.
agendaNoAgenda items when include=agenda is requested.
statusYesEvent status.
sourcesNoProvenance sources when include=sources is requested.
end_dateNoEvent end datetime. Absent when not recorded.
locationNoEvent location when available.
documentsNoDocument links when include=documents is requested.
start_dateYesEvent start datetime.
descriptionYesEvent description.
jurisdictionYesHosting jurisdiction.
participantsNoParticipants when include=participants is requested.
classificationYesEvent classification.
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 JurisdictionA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoRelated 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_idYesOCD jurisdiction ID, state name (e.g., "Washington"), or two-letter abbreviation (e.g., "wa").

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesOCD jurisdiction ID.
urlYesOfficial legislature URL.
nameYesJurisdiction name.
latest_runsNoRecent scraper runs when include=latest_runs is requested.
organizationsNoLegislative chambers and executive bodies when include=organizations is requested.
classificationYesJurisdiction type.
latest_bill_updateYesISO 8601 timestamp of most recent bill data update.
latest_people_updateYesISO 8601 timestamp of most recent people data update.
legislative_sessionsNoAll legislative sessions when include=legislative_sessions is requested.
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 LocationA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoRelated 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.
latitudeYesLatitude in decimal degrees (e.g., 47.6062 for Seattle, WA).
longitudeYesLongitude in decimal degrees (e.g., -122.3321 for Seattle, WA).

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNumber of legislators returned for this coordinate.
noticeNoPresent when no legislators were found — explains why (e.g., location outside US boundaries or unsupported territory).
stateCountYesResults serving a state legislature (jurisdiction.classification = "state").
legislatorsYesLegislators representing the given coordinate.
federalCountYesResults serving the US Congress (jurisdiction.classification = "country") — the coordinate's two US Senators and its US Representative.
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 JurisdictionsA
Read-onlyIdempotent
Inspect

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").

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number (1-indexed).
includeNoRelated 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_pageNoResults 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.
classificationNoFilter by jurisdiction type. Use "state" (default) for all 50 states, DC, and the 5 US territories.state

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesCurrent page returned.
maxPageYesTotal pages available.
resultsYesJurisdictions matching the filter.
paginationYesPagination metadata.
totalCountYesTotal jurisdictions matching the filter across all pages.
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 BillsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoFull-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.
pageNoPage number (1-indexed).
sortNoSort order. Use "latest_action_desc" for bills currently moving through the legislature.updated_desc
chamberNoFilter by originating chamber. "upper" = Senate, "lower" = House/Assembly.
includeNoRelated 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.
sessionNoSession 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.
sponsorNoFilter by sponsor name or OCD person ID.
subjectNoFilter to bills tagged with one or more subject categories.
per_pageNoResults per page. Maximum 20. Default 10.
action_sinceNoISO 8601 date — only return bills with an action after this date (e.g., "2025-01-01").
jurisdictionNoState 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_sinceNoISO 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_sinceNoISO 8601 date — only return bills updated after this date (e.g., "2025-01-01").
classificationNoBill classification: "bill", "resolution", "constitutional amendment", etc.
sponsor_classificationNoFilter sponsor type: "primary", "cosponsor".

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesCurrent page returned.
noticeNoRecovery hint when results are empty — names every filter that narrowed the query and suggests how to broaden. Absent when results are returned.
maxPageYesTotal pages available.
resultsYesBills matching the search criteria.
paginationYesPagination metadata.
totalCountYesTotal bills matching the query across all pages.
appliedFiltersYesFilters applied to this query as the server received them, for agent self-verification of zero or unexpected results.
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 CommitteesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number (1-indexed).
parentNoOCD organization ID of a parent committee to retrieve its subcommittees.
chamberNoFilter by chamber. "upper" = Senate, "lower" = House/Assembly.
includeNoRelated 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_pageNoResults per page. Maximum 20.
jurisdictionYesState name, abbreviation, or OCD-ID. Required — an all-states request exceeds the upstream timeout, so every call must be scoped to a single jurisdiction.
classificationNoFilter to parent committees or subcommittees only. Omit for all.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesCurrent page returned.
maxPageYesTotal pages available.
resultsYesCommittees matching the search criteria.
paginationYesPagination metadata.
totalCountYesTotal committees matching the query across all pages.
coverageNoteYesCommittee data is experimental — not all states have coverage in Open States. Empty results may indicate the state lacks data, not that no committees exist.
appliedFiltersYesFilters applied to this query as the server received them, for agent self-verification of zero or unexpected results.
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 EventsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number (1-indexed).
afterNoISO 8601 datetime — events starting after this time. Use to find upcoming hearings.
beforeNoISO 8601 datetime — events starting before this time.
includeNoRelated 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_pageNoResults per page. Maximum 20.
jurisdictionYesState 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_billsNoWhen true, only return events with at least one bill on the agenda. Most useful for tracking legislation through committee.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesCurrent page returned.
noticeNoRecovery hint when results are empty. Absent when results are returned.
maxPageYesTotal pages available.
resultsYesEvents matching the search criteria.
paginationYesPagination metadata.
totalCountYesTotal events matching the query across all pages.
coverageNoteYesEvent 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.
appliedFiltersYesFilters applied to this query as the server received them, for agent self-verification of zero or unexpected results.
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 PeopleA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoOCD 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.
nameNoName or partial name to match (case-insensitive substring). Narrows within the jurisdiction; it does not substitute for one.
pageNoPage number (1-indexed).
includeNoRelated 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.
districtNoDistrict label (e.g., "1", "37", "At-Large"). Formats vary by state.
per_pageNoResults per page. Maximum 20.
jurisdictionNoState 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_classificationNoFilter 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

ParametersJSON Schema
NameRequiredDescription
pageYesCurrent page returned.
noticeNoRecovery hint when results are empty. Absent when results are returned.
maxPageYesTotal pages available.
resultsYesLegislators matching the search criteria.
paginationYesPagination metadata.
totalCountYesTotal legislators matching the query across all pages.
appliedFiltersYesFilters applied to this query as the server received them, for agent self-verification of zero or unexpected results.
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Provides 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.
    10
    17
    10
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Provides tools to search and retrieve US federal and state legislative data, including bills, votes, campaign contributions, and legislator information, with provenance tracking.
    8
    1
    MIT

View all MCP Servers

Try in Browser

Your Connectors

Sign in to create a connector for this server.