openstates-mcp-server
Server Details
Search bills, legislators, committees, and events across all 50 US states, DC, and 5 US territories.
- Status
- Healthy
- Uptime
- 99.9% over 78 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/openstates-mcp-server
- GitHub Stars
- 2
- Server Listing
- @cyanheads/openstates-mcp-server
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 10 tools
Each tool maps to a distinct resource+action pair: get_* fetches by ID, search_* filters, list_* enumerates. The only near-neighbors (search_people vs get_legislators_by_location, list_jurisdictions vs get_jurisdiction) are explicitly differentiated by input type and purpose in their descriptions.
All tools use a uniform openstates_ prefix followed by a consistent verb_noun pattern (get_bill, search_bills, list_jurisdictions). The one longer name, get_legislators_by_location, still fits the verb_noun convention rather than breaking it.
Ten tools is well within the ideal 3-15 range and each maps to a real domain entity (bills, people, committees, events, jurisdictions) without redundancy. No tool feels padded or missing at the count level.
The surface covers discovery, detail retrieval, and cross-entity lookups (location, IDs) for the core legislative domain, with includes handling votes, actions, and sponsors. Minor gaps remain around committee/event reliability (experimental) and no dedicated district or full bill-text tool, but agents can work around these.
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: "ocd-bill/" followed by a UUID (e.g., "ocd-bill/4f255ccf-42a6-46ad-bbc6-0b027ebb15f2"). Preferred over the three-part path when available. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | OCD bill ID. |
| error | No | Present when the call failed. Absent on success. |
| title | No | Bill title. |
| votes | No | Vote events when include=votes is requested. |
| actions | No | Full action history when include=actions is requested. |
| session | No | Legislative session identifier. |
| sources | No | Source documents when include=sources is requested. |
| subject | No | 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 | No | 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 | No | 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 | No | Bill classifications. |
| openstates_url | No | Open States URL for this bill. |
| first_action_date | No | Date of first recorded action. |
| from_organization | No | Originating chamber. |
| other_identifiers | No | Alternate identifiers when include=other_identifiers is requested. |
| latest_action_date | No | Date of most recent action. |
| latest_passage_date | No | Date bill passed (when applicable). |
| latest_action_description | No | Most recent action description. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, so the safety profile is covered; the description adds real context beyond that by explaining the two mutually alternative lookup modes and what inlining via include actually returns. It does not say what happens on a lookup miss or whether include enlarges the payload cost.
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?
Front-loaded with purpose, then lookup modes, then the include tip — logical ordering with no filler. Slightly list-like but every sentence carries actionable information.
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 needn't be explained, and the description covers both access paths and the include mechanism. The notable gap is that required parameter count is 0, yet the description never states that at least one of the two lookup modes must be supplied — an agent could call it with empty arguments.
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 earns extra by explaining that include=votes yields tally plus per-legislator positions and include=actions yields full history, which goes beyond the schema's short list. It does not clarify the interaction of the two lookup modes with required parameters.
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?
States a specific verb and resource ("Fetch full detail for a specific state bill") and immediately distinguishes itself from openstates_search_bills by describing the two lookup keys (three-part path or OCD bill ID). An agent can tell it apart from siblings without opening the schema.
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 advises preferring openstates_id "to avoid session identifier lookup" and using include "rather than searching again," which routes the agent away from redundant search calls. It stops short of naming search_bills by name or stating when-not to use this tool (e.g., for bulk/listing needs).
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 | No | OCD organization ID. |
| name | No | Committee name. |
| error | No | Present when the call failed. Absent on success. |
| links | No | Committee homepage and reference links when include=links is requested. |
| sources | No | Provenance sources when include=sources is requested. |
| parent_id | No | OCD ID of parent committee, or null for top-level committees. |
| memberships | No | Membership roster when include=memberships is requested. |
| classification | No | Committee classification: "committee" or "subcommittee". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world semantics, so the description's added value is the data-availability caveat ("Experimental — not all states have committee data") and the conditional return of the membership roster tied to include=memberships. Return shape is left to the output schema, which exists.
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?
Three short sentences, front-loaded with the core action, followed by return behavior and the caveat. No filler or restatement of the title.
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?
An output schema exists so return-value detail is covered elsewhere, and the description adds the two things an agent can't infer structurally: the ID's provenance and the incomplete state coverage. Slightly light on what happens if the ID isn't found, but otherwise sufficient.
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 earns above that by explaining that the membership roster only appears when include=memberships is passed, which clarifies the practical effect of the include array beyond the enum 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?
States a specific verb and resource ("Fetch committee detail") plus the exact identifier type (OCD organization ID), and distinguishes itself from openstates_search_committees by routing users there for the ID. The experimental caveat further scopes expectations.
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 names the prerequisite source for committee_id (openstates_search_committees) and warns that not all states have committee data. Missing only an explicit when-not case (e.g., use search when you don't already hold an ID), but the routing is clear.
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 | No | OCD event ID. |
| name | No | Event name. |
| error | No | Present when the call failed. Absent on success. |
| links | No | Event links when include=links is requested. |
| media | No | Recordings and other media when include=media is requested. |
| agenda | No | Agenda items when include=agenda is requested. |
| status | No | 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 | Attached documents when include=documents is requested. |
| start_date | No | Event start datetime. |
| description | No | Event description. |
| jurisdiction | No | Hosting jurisdiction. |
| participants | No | Participants when include=participants is requested. |
| classification | No | Event classification. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered; the description adds genuinely non-structured context by disclosing that related data is only inlined on request via include and that event coverage is limited/experimental. Missing only rate-limit or pagination-style operational notes.
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?
Three tight sentences: purpose and return shape first, the include-gating second, the experimental caveat and ID source last. No filler and nothing buried.
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, the description doesn't need to detail return structure, and it covers the remaining agent-critical points: where the ID comes from, how to expand results, and the coverage limitation. Nothing needed to call it correctly is absent.
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 the baseline is 3, but the description goes further by explaining that agenda, participants, media, and documents are conditional on the include argument. This clarifies the cause-and-effect of the optional parameter rather than restating its type.
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?
States a specific verb and resource ("Fetch full event detail by OCD event ID") and immediately enumerates the payload (agenda, participants, media links, documents), which separates it cleanly from openstates_search_events. An agent knows exactly what this returns without opening the schema.
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 routes the agent to openstates_search_events to obtain the required event_id, and flags "Experimental — event coverage is limited in Open States" as a caveat on when results may be thin. It stops short of naming a true alternative tool or when-not-to-call condition, but the prerequisite path is unambiguous.
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 | No | OCD jurisdiction ID. |
| url | No | Official legislature URL. |
| name | No | Jurisdiction name. |
| error | No | Present when the call failed. Absent on success. |
| 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 | No | Jurisdiction type. |
| latest_bill_update | No | ISO 8601 timestamp of most recent bill data update. |
| latest_people_update | No | ISO 8601 timestamp of most recent people data update. |
| legislative_sessions | No | All legislative sessions when include=legislative_sessions is requested. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile needs no restating. The description adds genuinely new behavior facts: session identifier formats vary widely across states and the tool accepts three different ID/name forms, which tells the agent the input is forgiving. It stops short of describing pagination or behavior when a jurisdiction is not found, so not a 5.
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?
Four sentences, each doing work, with the core purpose and the primary use case front-loaded. The final sentence on ID formats is dense but necessary for correct invocation. Slightly long, but nothing is redundant.
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?
An output schema exists, so return values need not be described. With only two parameters, complete schema coverage, and annotations covering safety, the description supplies the remaining unknowns — the usage trigger and input format tolerance — leaving nothing an agent needs before calling it.
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%, so the baseline is 3. The description adds value beyond that by documenting the accepted input forms with concrete examples of the OCD format and noting state names and abbreviations work. The `include` parameter's behavior is left entirely to the schema, which already explains it well.
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?
States a specific verb (fetch) and resource (full metadata for a specific jurisdiction) and enumerates the payload: legislative sessions, identifiers, coverage dates. The word 'specific' plus the singular resource cleanly separates it from the sibling openstates_list_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?
Explicitly names the trigger: 'Use when you need to know the exact session identifier for a state before filtering bill searches.' That ties this tool to a concrete downstream action (openstates_search_bills filtering), so an agent knows why and when to call it rather than guessing.
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 | No | Number of legislators returned for this coordinate. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Present when no legislators were found — explains why (e.g., location outside US boundaries or unsupported territory). |
| stateCount | No | Results serving a state legislature (jurisdiction.classification = "state"). |
| legislators | No | Legislators representing the given coordinate. |
| federalCount | No | Results serving the US Congress (jurisdiction.classification = "country") — the coordinate's two US Senators and its US Representative. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world behavior, so the description's added value is in the caveats: 'This server does not geocode addresses — the caller must provide decimal-degree coordinates' and the note that results may include governor/executive officials. The clarification that jurisdiction.classification rather than current_role.org_classification separates tiers is genuinely useful disambiguation not available anywhere else in the structured fields.
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?
Front-loaded with the core action, then caveats and hints. The two sentences dissecting jurisdiction.classification vs. current_role.org_classification are dense but earn their place by preventing a common misclassification error. Slightly long for a 3-parameter read tool.
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?
An output schema exists, so return values need not be explained; the description instead covers the things that would trip an agent up — no geocoding, coordinate format, output variability across tiers, and how to request offices. What's missing is any statement of jurisdictional scope (e.g., whether non-US coordinates return anything), which openWorldHint leaves ambiguous.
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% and both latitude/longitude examples and the include enum meanings are already documented in the schema. The description only adds the constraint that values must be decimal degrees rather than addresses, which is marginal over what the schema already says. Baseline 3 applies.
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?
States a specific verb and resource ('Find every legislator representing a geographic coordinate') and immediately names the two tiers covered. It is clearly distinguishable from sibling search_people, which is a general people search rather than a coordinate lookup.
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 concrete use cases (constituent matching, address-based research, boundary analysis) and a conditional hint ('Use include=offices to get contact information'). However it never names a sibling alternative (e.g., search_people) for name-based lookups, so the routing guidance is implicit rather than explicit.
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 | No | Current page returned. |
| error | No | Present when the call failed. Absent on success. |
| maxPage | No | Total pages available. |
| results | No | Jurisdictions matching the filter. |
| pagination | No | Pagination metadata. |
| totalCount | No | Total jurisdictions matching the filter across all pages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint, idempotentHint, openWorldHint), and the description adds real behavior: the whole inventory returns in one call, coverage metadata fields (latest bill/people update times), and an optional expansion that inlines historical sessions. The genuinely non-obvious disclosure is that session identifier formats vary per state ("2025", "2025-2026", "2025rs"), which prevents downstream errors. It stops short of describing error or empty-result 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?
Front-loaded with the scope (56 jurisdictions, single call) so the most decision-relevant fact lands first, and the session-format warning at the end is actionable rather than filler. It runs long with heavy em-dash and parenthetical usage, and the county-by-county enumeration of the 5 territories is more detail than an agent needs to select the tool.
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, the description needn't enumerate return fields, and it still flags which metadata matter. Combined with full schema coverage and read-only annotations, an agent has everything required to call this correctly and to know why it would.
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%, so page, per_page, include, and classification are already fully documented upstream; baseline is 3. The description adds some value by motivating the include=legislative_sessions option and by explaining the session-format variance, but it adds no new semantics for page, per_page, or classification beyond what the schema states.
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?
Names a specific verb and resource ("List all jurisdictions covered by Open States") and pins the exact scope: 50 states, DC, 5 territories, 56 total. It also implicitly distinguishes itself from the singular sibling openstates_get_jurisdiction by framing this as the coverage inventory, so an agent can pick correctly without opening the schema.
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 trigger condition — "Use this when you need to discover valid session identifiers for a state before calling openstates_search_bills with a session filter" — and reinforces it with "always check valid session identifiers here before using them." The only gap is that it never contrasts itself with openstates_get_jurisdiction or says when-not to call this (e.g., for a single state's details).
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 | No | Current page returned. |
| error | No | Present when the call failed. Absent on success. |
| 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 | No | Total pages available. |
| results | No | Bills matching the search criteria. |
| pagination | No | Pagination metadata. |
| totalCount | No | Total bills matching the query across all pages. |
| appliedFilters | No | Filters applied to this query as the server received them, for agent self-verification of zero or unexpected results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/open-world, so the description correctly spends its words on non-obvious behavior: q-only searches span 56 jurisdictions and exceed the upstream timeout for common terms, though distinctive terms return quickly. That timeout characteristic is genuinely useful and not in the schema, though it stops short of describing result-size or pagination behavior beyond what the schema states.
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?
Five tight sentences with the scope constraint and required-parameter rule front-loaded, followed by the higher-value option hints. No padding or repetition of schema text.
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 15 parameters, an output schema, and full schema descriptions, the description supplies exactly the missing layer: timeout risk, cross-tool dependencies, and option combos. Nothing an agent needs to invoke it correctly is absent.
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 cross-tool meaning on top: include=sponsorships,actions replaces a follow-up get_bill call, sort=latest_action_desc surfaces bills currently moving, and session values come from get_jurisdiction. These are interpretive shortcuts rather than restatements, though several params (chamber, classification, sponsor_classification) get no prose attention.
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?
Opens with a specific verb+resource+scope: 'Search state legislative bills across all covered US jurisdictions,' then enumerates the supported search modes (full-text, jurisdiction/session, subjects, sponsors, sort). It is clearly distinguishable from openstates_get_bill, which fetches a single bill rather than searching.
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 selection logic: jurisdiction or q required, pairing them is 'the reliable form,' and a q-only search risks an upstream timeout. It also routes the agent to openstates_get_bill (via include=) and openstates_get_jurisdiction (for session IDs), naming the conditions that select each alternative.
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. A chamber filter omits joint committees; omit chamber to include them. | |
| 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 | No | Current page returned. |
| error | No | Present when the call failed. Absent on success. |
| maxPage | No | Total pages available. |
| results | No | Committees matching the search criteria. |
| pagination | No | Pagination metadata. |
| totalCount | No | Total committees matching the query across all pages. |
| coverageNote | No | 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 | No | Filters applied to this query as the server received them, for agent self-verification of zero or unexpected results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, and the description adds context annotations cannot express: an upstream timeout that forbids all-56-jurisdiction requests, that committee support is experimental with uneven state coverage, and that coverageNote in the output always flags these limitations. This is exactly the kind of constraint disclosure credited when annotations carry the safety profile.
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?
Front-loaded with the hard requirement and timeout rationale, then parameter usage tips, then the experimental caveat. Every sentence is informative, though the jurisdiction-required/timeout point is repeated in the schema and the five-sentence block is near the upper bound for a list tool.
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 available, the description needn't document return values, and it doesn't. It still covers the two things an agent would otherwise get wrong — unscopeable multi-state requests and unreliable experimental coverage — so nothing needed to call it correctly is missing.
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%, so the schema already explains page, per_page, parent, chamber, include and classification thoroughly. The description only restates chamber/include/classification behavior, adding a small amount of linkage (subcommittees belonging to a parent) but nothing on parent, page or per_page. Baseline 3 applies when the schema does the heavy lifting.
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?
Opens with a specific verb+resource and scope: 'List committees for a jurisdiction.' An agent immediately knows this is a jurisdiction-scoped listing operation. However, it never contrasts itself with the sibling openstates_get_committee (fetch by OCD ID), so sibling differentiation is left to the tool name rather than stated.
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?
Strong routing guidance: it names openstates_list_jurisdictions as the way to pick a jurisdiction, explains how to use chamber, classification=subcommittee, and include=memberships. It states a hard when-to-use constraint (must scope to a single state or hit the timeout) but gives no explicit 'when not to use this / use get_committee instead' exclusion.
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 from an unfiltered search 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 | No | Current page returned. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Recovery hint when results are empty. Absent when results are returned. |
| maxPage | No | Total pages available. |
| results | No | Events matching the search criteria. |
| pagination | No | Pagination metadata. |
| totalCount | No | Total events matching the query across all pages. |
| coverageNote | No | 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 | No | Filters applied to this query as the server received them, for agent self-verification of zero or unexpected results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so safety is covered; the description goes further by disclosing that the endpoint is experimental, that most states lack event coverage, and that empty results are ambiguous rather than informative. That false-negative warning is exactly the kind of context annotations cannot carry.
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 hard constraint (jurisdiction required, no all-states search) is front-loaded before the caveats and filter tips. Five sentences, each contributing a distinct decision-relevant fact, with no restatement of the name or title.
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?
Seven parameters, all documented at 100% schema coverage, an output schema present, and annotations covering the safety profile. The description fills the remaining gaps — jurisdiction scoping, data-availability caveats, filter recommendations — so nothing an agent needs to call this correctly is missing.
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 the baseline is 3; the description adds practical guidance beyond the schema by calling require_bills the most useful filter for committee tracking and by recommending the agenda,participants include combination rather than listing options neutrally. It does not add format or syntax detail, but the schema already handles that.
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?
Opens with a specific verb and three concrete resource types (hearings, floor sessions, committee meetings), immediately distinguishing it from openstates_search_bills and openstates_search_committees. An agent knows exactly what corpus this queries without opening the schema.
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 mandatory scoping constraint, names openstates_list_jurisdictions as the way to obtain a jurisdiction value, and recommends require_bills=true and include=agenda,participants for the legislative-tracking use case. It even pre-empts a failure mode: empty unfiltered results often mean the state publishes no event data.
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), or the single body in Nebraska and the DC Council, 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; the single body in Nebraska and the DC Council; excluding executive officials). Unicameral bodies have no "upper" or "lower" members. Omitting this filter returns every officeholder including executive ones — it is not equivalent to "legislature". |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | No | Current page returned. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Recovery hint when results are empty. Absent when results are returned. |
| maxPage | No | Total pages available. |
| results | No | Legislators matching the search criteria. |
| pagination | No | Pagination metadata. |
| totalCount | No | Total legislators matching the query across all pages. |
| appliedFilters | No | Filters applied to this query as the server received them, for agent self-verification of zero or unexpected results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the bar is lower, yet the description adds real operational context: the upstream timeout on unscoped searches, that unknown IDs match nothing rather than erroring, that 'legislature' merges both chambers into one paginated set in a fixed order, and that include=offices/links inlines contact data. This is behavior an agent cannot infer from 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?
Purpose and the jurisdiction/id requirement are front-loaded well, but the paragraph runs long and the entire org_classification explanation (upper/lower/executive/legislature, Nebraska, DC Council, omission semantics) duplicates the schema description word-for-word — space that buys nothing for the agent.
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?
An output schema exists, so return shape needs no explanation. For an 8-parameter, open-world search tool the description covers scoping constraints, failure modes, pagination caps, and sibling routing — nothing an agent needs to call it correctly is missing.
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 the schema already documents all eight parameters, and much of the description's parameter text (org_classification enum meanings, include values, name substring matching) restates the schema verbatim. The one genuinely additive piece is the cross-tool provenance of the id values, which the schema also covers. Baseline 3 is correct here.
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?
States a specific verb and resource (search state legislators and officials) plus the alternate retrieval mode (fetch by OCD person ID), and names the dimensions filterable (name, jurisdiction, chamber, district). An agent can distinguish it from openstates_get_legislators_by_location and the search_* siblings without opening any schema.
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 routing: 'Use openstates_list_jurisdictions to pick a jurisdiction, or openstates_get_legislators_by_location when you have coordinates but no state.' It also states a hard when-not ('Party is reported on every result but cannot be filtered on — narrow by party after the call') and the mandatory scoping rule with the reason (all-56-jurisdiction search exceeds the upstream timeout).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
- Changed
openstates_get_bill3 fields changed- changed
Input schema / properties / openstates_id / descriptionPrevious value: -"OCD bill ID from openstates_search_bills results (e.g., \"ocd-bill/...\"). Preferred over the three-part path when available."New value: +"OCD bill ID from openstates_search_bills results: \"ocd-bill/\" followed by a UUID (e.g., \"ocd-bill/4f255ccf-42a6-46ad-bbc6-0b027ebb15f2\"). Preferred over the three-part path when available." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `missing_lookup_params`: Neither openstates_id nor the complete jurisdiction+session+bill_id triple was provided. `not_found`: Bill does not exist at the given path or OCD ID. `upstream_timeout`: Open States did not answer within the per-request timeout. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `missing_lookup_params`: Neither openstates_id nor the complete jurisdiction+session+bill_id triple was provided. `invalid_openstates_id`: openstates_id is not an Open States bill ID — neither \"ocd-bill/\" followed by a UUID nor a jurisdiction/session/bill_id path. `not_found`: No bill exists at the given OCD bill ID or jurisdiction + session + bill_id path. `upstream_timeout`: Open States did not answer within the per-request timeout. `rate_limited`: The shared Open States API key reached a request cap — Open States' per-minute or daily limit, or this server's own daily budget. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "missing_lookup_params", - "not_found", - "upstream_timeout" -]New value: +[ + "missing_lookup_params", + "invalid_openstates_id", + "not_found", + "upstream_timeout", + "rate_limited" +]
- Changed
openstates_get_committee2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `not_found`: Committee ID does not exist in Open States. `upstream_timeout`: Open States did not answer within the per-request timeout. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: Committee ID does not exist in Open States. `upstream_timeout`: Open States did not answer within the per-request timeout. `rate_limited`: The shared Open States API key reached a request cap — Open States' per-minute or daily limit, or this server's own daily budget. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "not_found", - "upstream_timeout" -]New value: +[ + "not_found", + "upstream_timeout", + "rate_limited" +]
- Changed
openstates_get_event17 fields changed- changed
Output schema / properties / documents / descriptionPrevious value: -"Document links when include=documents is requested."New value: +"Attached documents when include=documents is requested." - changed
Output schema / properties / documents / items / descriptionPrevious value: -"Document link record."New value: +"Document record." - added
Output schema / properties / documents / items / properties / classificationAdded value: +{ + "description": "Document classification. Empty string when Open States recorded none.", + "type": "string" +} - added
Output schema / properties / documents / items / properties / dateAdded value: +{ + "description": "Document date. Empty string when Open States recorded no date.", + "type": "string" +} - added
Output schema / properties / documents / items / properties / linksAdded value: +{ + "description": "URLs for this document record — usually one, occasionally none.", + "items": { + "additionalProperties": false, + "description": "One URL for this document record.", + "properties": { + "note": { + "description": "Link description. Absent when Open States recorded none.", + "type": "string" + }, + "url": { + "description": "Document URL.", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "type": "array" +} - removed
Output schema / properties / documents / items / properties / urlRemoved value: -{ - "description": "Document URL.", - "type": "string" -} - changed
Output schema / properties / documents / items / requiredPrevious value: -[ - "url", - "note" -]New value: +[ + "note", + "date", + "classification", + "links" +] - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `not_found`: Event ID does not exist in Open States. `upstream_timeout`: Open States did not answer within the per-request timeout. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: Event ID does not exist in Open States. `upstream_timeout`: Open States did not answer within the per-request timeout. `rate_limited`: The shared Open States API key reached a request cap — Open States' per-minute or daily limit, or this server's own daily budget. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "not_found", - "upstream_timeout" -]New value: +[ + "not_found", + "upstream_timeout", + "rate_limited" +] - changed
Output schema / properties / media / descriptionPrevious value: -"Media links when include=media is requested."New value: +"Recordings and other media when include=media is requested." - changed
Output schema / properties / media / items / descriptionPrevious value: -"Media link record."New value: +"Media record." - added
Output schema / properties / media / items / properties / classificationAdded value: +{ + "description": "Media classification. Empty string when Open States recorded none.", + "type": "string" +} - added
Output schema / properties / media / items / properties / dateAdded value: +{ + "description": "Media date. Empty string when Open States recorded no date.", + "type": "string" +} - added
Output schema / properties / media / items / properties / linksAdded value: +{ + "description": "URLs for this media record — usually one, occasionally none.", + "items": { + "additionalProperties": false, + "description": "One URL for this media record.", + "properties": { + "note": { + "description": "Link description. Absent when Open States recorded none.", + "type": "string" + }, + "url": { + "description": "Media URL.", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / media / items / properties / offsetAdded value: +{ + "description": "Start offset into the recording as Open States recorded it. Absent when not recorded.", + "type": "number" +} - removed
Output schema / properties / media / items / properties / urlRemoved value: -{ - "description": "Media URL.", - "type": "string" -} - changed
Output schema / properties / media / items / requiredPrevious value: -[ - "url", - "note" -]New value: +[ + "note", + "date", + "classification", + "links" +]
- Changed
openstates_get_jurisdiction2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `not_found`: Jurisdiction ID does not exist in Open States. `upstream_timeout`: Open States did not answer within the per-request timeout. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: Jurisdiction ID does not exist in Open States. `upstream_timeout`: Open States did not answer within the per-request timeout. `rate_limited`: The shared Open States API key reached a request cap — Open States' per-minute or daily limit, or this server's own daily budget. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "not_found", - "upstream_timeout" -]New value: +[ + "not_found", + "upstream_timeout", + "rate_limited" +]
- Changed
openstates_get_legislators_by_location2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_coordinate`: Latitude or longitude is outside valid range. `upstream_timeout`: Open States did not answer within the per-request timeout. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_coordinate`: Latitude or longitude is outside valid range. `upstream_timeout`: Open States did not answer within the per-request timeout. `rate_limited`: The shared Open States API key reached a request cap — Open States' per-minute or daily limit, or this server's own daily budget. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_coordinate", - "upstream_timeout" -]New value: +[ + "invalid_coordinate", + "upstream_timeout", + "rate_limited" +]
- Changed
openstates_list_jurisdictions2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `upstream_timeout`: Open States did not answer within the per-request timeout. `invalid_page`: Open States rejected the request as not found — page is past the last page for this classification. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_timeout`: Open States did not answer within the per-request timeout. `invalid_page`: Open States rejected the request as not found — page is past the last page for this classification. `rate_limited`: The shared Open States API key reached a request cap — Open States' per-minute or daily limit, or this server's own daily budget. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "upstream_timeout", - "invalid_page" -]New value: +[ + "upstream_timeout", + "invalid_page", + "rate_limited" +]
- Changed
openstates_search_bills2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `upstream_timeout`: Open States did not answer within the per-request timeout — the query is too broad. `invalid_page`: Open States rejected the request as not found — page is past the last page for this query. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_timeout`: Open States did not answer within the per-request timeout — the query is too broad. `invalid_page`: Open States rejected the request as not found — page is past the last page for this query. `rate_limited`: The shared Open States API key reached a request cap — Open States' per-minute or daily limit, or this server's own daily budget. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "upstream_timeout", - "invalid_page" -]New value: +[ + "upstream_timeout", + "invalid_page", + "rate_limited" +]
- Changed
openstates_search_committees3 fields changed- changed
Input schema / properties / chamber / descriptionPrevious value: -"Filter by chamber. \"upper\" = Senate, \"lower\" = House/Assembly."New value: +"Filter by chamber. \"upper\" = Senate, \"lower\" = House/Assembly. A chamber filter omits joint committees; omit chamber to include them." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `upstream_timeout`: Open States did not answer within the per-request timeout — the query is too broad. `invalid_page`: Open States rejected the request as not found — page is past the last page for this query. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_timeout`: Open States did not answer within the per-request timeout — the query is too broad. `invalid_page`: Open States rejected the request as not found — page is past the last page for this query. `rate_limited`: The shared Open States API key reached a request cap — Open States' per-minute or daily limit, or this server's own daily budget. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "upstream_timeout", - "invalid_page" -]New value: +[ + "upstream_timeout", + "invalid_page", + "rate_limited" +]
- Changed
openstates_search_events17 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `upstream_timeout`: Open States did not answer within the per-request timeout — the query is too broad. `invalid_page`: Open States rejected the request as not found — page is past the last page for this query. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_timeout`: Open States did not answer within the per-request timeout — the query is too broad. `invalid_page`: Open States rejected the request as not found — page is past the last page for this query. `rate_limited`: The shared Open States API key reached a request cap — Open States' per-minute or daily limit, or this server's own daily budget. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "upstream_timeout", - "invalid_page" -]New value: +[ + "upstream_timeout", + "invalid_page", + "rate_limited" +] - changed
Output schema / properties / results / items / properties / documents / descriptionPrevious value: -"Document links when include=documents is requested."New value: +"Attached documents when include=documents is requested." - changed
Output schema / properties / results / items / properties / documents / items / descriptionPrevious value: -"Document link record."New value: +"Document record." - added
Output schema / properties / results / items / properties / documents / items / properties / classificationAdded value: +{ + "description": "Document classification. Empty string when Open States recorded none.", + "type": "string" +} - added
Output schema / properties / results / items / properties / documents / items / properties / dateAdded value: +{ + "description": "Document date. Empty string when Open States recorded no date.", + "type": "string" +} - added
Output schema / properties / results / items / properties / documents / items / properties / linksAdded value: +{ + "description": "URLs for this document record — usually one, occasionally none.", + "items": { + "additionalProperties": false, + "description": "One URL for this document record.", + "properties": { + "note": { + "description": "Link description. Absent when Open States recorded none.", + "type": "string" + }, + "url": { + "description": "Document URL.", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "type": "array" +} - removed
Output schema / properties / results / items / properties / documents / items / properties / urlRemoved value: -{ - "description": "Document URL.", - "type": "string" -} - changed
Output schema / properties / results / items / properties / documents / items / requiredPrevious value: -[ - "url", - "note" -]New value: +[ + "note", + "date", + "classification", + "links" +] - changed
Output schema / properties / results / items / properties / media / descriptionPrevious value: -"Media links when include=media is requested."New value: +"Recordings and other media when include=media is requested." - changed
Output schema / properties / results / items / properties / media / items / descriptionPrevious value: -"Media link record."New value: +"Media record." - added
Output schema / properties / results / items / properties / media / items / properties / classificationAdded value: +{ + "description": "Media classification. Empty string when Open States recorded none.", + "type": "string" +} - added
Output schema / properties / results / items / properties / media / items / properties / dateAdded value: +{ + "description": "Media date. Empty string when Open States recorded no date.", + "type": "string" +} - added
Output schema / properties / results / items / properties / media / items / properties / linksAdded value: +{ + "description": "URLs for this media record — usually one, occasionally none.", + "items": { + "additionalProperties": false, + "description": "One URL for this media record.", + "properties": { + "note": { + "description": "Link description. Absent when Open States recorded none.", + "type": "string" + }, + "url": { + "description": "Media URL.", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / results / items / properties / media / items / properties / offsetAdded value: +{ + "description": "Start offset into the recording as Open States recorded it. Absent when not recorded.", + "type": "number" +} - removed
Output schema / properties / results / items / properties / media / items / properties / urlRemoved value: -{ - "description": "Media URL.", - "type": "string" -} - changed
Output schema / properties / results / items / properties / media / items / requiredPrevious value: -[ - "url", - "note" -]New value: +[ + "note", + "date", + "classification", + "links" +]
- Changed
openstates_search_people3 fields changed- changed
Input schema / properties / org_classification / descriptionPrevious value: -"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\"."New value: +"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; the single body in Nebraska and the DC Council; excluding executive officials). Unicameral bodies have no \"upper\" or \"lower\" members. Omitting this filter returns every officeholder including executive ones — it is not equivalent to \"legislature\"." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `upstream_timeout`: Open States did not answer within the per-request timeout — the query is too broad. `invalid_page`: Open States rejected the request as not found — page is past the last page for this query. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_timeout`: Open States did not answer within the per-request timeout — the query is too broad. `invalid_page`: Open States rejected the request as not found — page is past the last page for this query. `rate_limited`: The shared Open States API key reached a request cap — Open States' per-minute or daily limit, or this server's own daily budget. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "upstream_timeout", - "invalid_page" -]New value: +[ + "upstream_timeout", + "invalid_page", + "rate_limited" +]
6 tool updates
- Changed
openstates_get_bill8 fields changed- removed
Output schema / properties / first_action_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / first_action_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / latest_action_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / latest_action_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / latest_action_description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / latest_action_description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / latest_passage_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / latest_passage_date / typeAdded value: +[ + "string", + "null" +]
- Changed
openstates_get_committee2 fields changed- removed
Output schema / properties / parent_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / parent_id / typeAdded value: +[ + "string", + "null" +]
- Changed
openstates_get_legislators_by_location1 field changed- changed
Output schema / properties / legislators / items / properties / current_role / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "district": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "District label or null." - }, - "division_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "OCD division the district maps to (e.g., \"ocd-division/country:us/state:wa/sldu:37\"). Null when undistricted, absent when upstream omits it." - }, - "org_classification": { - "description": "Chamber classification.", - "type": "string" - }, - "title": { - "description": "Role title.", - "type": "string" - } - }, - "required": [ - "title", - "org_classification", - "district" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "district": { + "description": "District label or null.", + "type": [ + "string", + "null" + ] + }, + "division_id": { + "description": "OCD division the district maps to (e.g., \"ocd-division/country:us/state:wa/sldu:37\"). Null when undistricted, absent when upstream omits it.", + "type": [ + "string", + "null" + ] + }, + "org_classification": { + "description": "Chamber classification.", + "type": "string" + }, + "title": { + "description": "Role title.", + "type": "string" + } + }, + "required": [ + "title", + "org_classification", + "district" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
openstates_search_bills8 fields changed- removed
Output schema / properties / results / items / properties / first_action_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / first_action_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / results / items / properties / latest_action_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / latest_action_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / results / items / properties / latest_action_description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / latest_action_description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / results / items / properties / latest_passage_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / latest_passage_date / typeAdded value: +[ + "string", + "null" +]
- Changed
openstates_search_committees2 fields changed- removed
Output schema / properties / results / items / properties / parent_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / parent_id / typeAdded value: +[ + "string", + "null" +]
- Changed
openstates_search_people1 field changed- changed
Output schema / properties / results / items / properties / current_role / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "district": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "District label or null when undistricted." - }, - "division_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "OCD division the district maps to (e.g., \"ocd-division/country:us/state:wa/sldu:37\"). Null when undistricted, absent when upstream omits it." - }, - "org_classification": { - "description": "Chamber classification (e.g., \"upper\", \"lower\").", - "type": "string" - }, - "title": { - "description": "Role title (e.g., \"Senator\", \"Representative\").", - "type": "string" - } - }, - "required": [ - "title", - "org_classification", - "district" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "district": { + "description": "District label or null when undistricted.", + "type": [ + "string", + "null" + ] + }, + "division_id": { + "description": "OCD division the district maps to (e.g., \"ocd-division/country:us/state:wa/sldu:37\"). Null when undistricted, absent when upstream omits it.", + "type": [ + "string", + "null" + ] + }, + "org_classification": { + "description": "Chamber classification (e.g., \"upper\", \"lower\").", + "type": "string" + }, + "title": { + "description": "Role title (e.g., \"Senator\", \"Representative\").", + "type": "string" + } + }, + "required": [ + "title", + "org_classification", + "district" + ], + "type": "object" + }, + { + "type": "null" + } +]
10 tool updates
- Changed
openstates_get_bill6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "id", + "identifier", + "title", + "session", + "jurisdiction", + "from_organization", + "classification", + "subject", + "first_action_date", + "latest_action_date", + "latest_action_description", + "latest_passage_date" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `missing_lookup_params`: Neither openstates_id nor the complete jurisdiction+session+bill_id triple was provided. `not_found`: Bill does not exist at the given path or OCD ID. `upstream_timeout`: Open States did not answer within the per-request timeout. Other values are possible when a failure originates below the handler.", + "examples": [ + "missing_lookup_params", + "not_found", + "upstream_timeout" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "id", - "identifier", - "title", - "session", - "jurisdiction", - "from_organization", - "classification", - "subject", - "first_action_date", - "latest_action_date", - "latest_action_description", - "latest_passage_date" -]
- Changed
openstates_get_committee6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "id", + "name", + "classification", + "parent_id" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `not_found`: Committee ID does not exist in Open States. `upstream_timeout`: Open States did not answer within the per-request timeout. Other values are possible when a failure originates below the handler.", + "examples": [ + "not_found", + "upstream_timeout" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "id", - "name", - "classification", - "parent_id" -]
- Changed
openstates_get_event6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "id", + "name", + "description", + "classification", + "start_date", + "status", + "jurisdiction" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `not_found`: Event ID does not exist in Open States. `upstream_timeout`: Open States did not answer within the per-request timeout. Other values are possible when a failure originates below the handler.", + "examples": [ + "not_found", + "upstream_timeout" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "id", - "name", - "description", - "classification", - "start_date", - "status", - "jurisdiction" -]
- Changed
openstates_get_jurisdiction6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "id", + "name", + "classification", + "url", + "latest_bill_update", + "latest_people_update" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `not_found`: Jurisdiction ID does not exist in Open States. `upstream_timeout`: Open States did not answer within the per-request timeout. Other values are possible when a failure originates below the handler.", + "examples": [ + "not_found", + "upstream_timeout" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "id", - "name", - "classification", - "url", - "latest_bill_update", - "latest_people_update" -]
- Changed
openstates_get_legislators_by_location6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "legislators", + "count", + "stateCount", + "federalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `invalid_coordinate`: Latitude or longitude is outside valid range. `upstream_timeout`: Open States did not answer within the per-request timeout. Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_coordinate", + "upstream_timeout" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "legislators", - "count", - "stateCount", - "federalCount" -]
- Changed
openstates_list_jurisdictions6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "results", + "pagination", + "totalCount", + "page", + "maxPage" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `upstream_timeout`: Open States did not answer within the per-request timeout. `invalid_page`: Open States rejected the request as not found — page is past the last page for this classification. Other values are possible when a failure originates below the handler.", + "examples": [ + "upstream_timeout", + "invalid_page" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "results", - "pagination", - "totalCount", - "page", - "maxPage" -]
- Changed
openstates_search_bills6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "results", + "pagination", + "totalCount", + "page", + "maxPage", + "appliedFilters" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `upstream_timeout`: Open States did not answer within the per-request timeout — the query is too broad. `invalid_page`: Open States rejected the request as not found — page is past the last page for this query. Other values are possible when a failure originates below the handler.", + "examples": [ + "upstream_timeout", + "invalid_page" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "results", - "pagination", - "totalCount", - "page", - "maxPage", - "appliedFilters" -]
- Changed
openstates_search_committees6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "results", + "pagination", + "totalCount", + "page", + "maxPage", + "coverageNote", + "appliedFilters" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `upstream_timeout`: Open States did not answer within the per-request timeout — the query is too broad. `invalid_page`: Open States rejected the request as not found — page is past the last page for this query. Other values are possible when a failure originates below the handler.", + "examples": [ + "upstream_timeout", + "invalid_page" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "results", - "pagination", - "totalCount", - "page", - "maxPage", - "coverageNote", - "appliedFilters" -]
- Changed
openstates_search_events6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "results", + "pagination", + "totalCount", + "page", + "maxPage", + "coverageNote", + "appliedFilters" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `upstream_timeout`: Open States did not answer within the per-request timeout — the query is too broad. `invalid_page`: Open States rejected the request as not found — page is past the last page for this query. Other values are possible when a failure originates below the handler.", + "examples": [ + "upstream_timeout", + "invalid_page" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "results", - "pagination", - "totalCount", - "page", - "maxPage", - "coverageNote", - "appliedFilters" -]
- Changed
openstates_search_people6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "results", + "pagination", + "totalCount", + "page", + "maxPage", + "appliedFilters" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `upstream_timeout`: Open States did not answer within the per-request timeout — the query is too broad. `invalid_page`: Open States rejected the request as not found — page is past the last page for this query. Other values are possible when a failure originates below the handler.", + "examples": [ + "upstream_timeout", + "invalid_page" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "results", - "pagination", - "totalCount", - "page", - "maxPage", - "appliedFilters" -]
1 tool update
- Changed
openstates_search_bills2 fields changed- added
Input schema / properties / jurisdiction / minLengthAdded value: +1 - added
Input schema / properties / q / minLengthAdded value: +1
10 tool updates
- Changed
openstates_get_bill10 fields changed- changed
Output schema / properties / abstracts / items / properties / note / descriptionPrevious value: -"Source note."New value: +"Source note. Empty string when Open States recorded no note." - changed
Output schema / properties / actions / items / properties / date / descriptionPrevious value: -"Action date."New value: +"Action date. Empty string when Open States recorded no date." - changed
Output schema / properties / documents / items / properties / date / descriptionPrevious value: -"Document date."New value: +"Document date. Empty string when Open States recorded no date, which is the usual case for bill documents." - changed
Output schema / properties / documents / items / properties / note / descriptionPrevious value: -"Document note."New value: +"Document note. Empty string when Open States recorded no note." - changed
Output schema / properties / other_titles / items / properties / note / descriptionPrevious value: -"Note describing the alternate title."New value: +"Note describing the alternate title. Empty string when Open States recorded no note." - changed
Output schema / properties / sources / items / properties / note / descriptionPrevious value: -"Source note."New value: +"Source note. Empty string when Open States recorded no note." - changed
Output schema / properties / sponsorships / items / properties / person / properties / id / descriptionPrevious value: -"OCD person ID."New value: +"OCD person ID. Pass it to openstates_search_people as id for the full legislator record, or back to openstates_search_bills as the sponsor filter for their other bills." - changed
Output schema / properties / versions / items / properties / date / descriptionPrevious value: -"Version date."New value: +"Version date. Empty string when Open States recorded no date, which is the usual case for bill versions." - changed
Output schema / properties / versions / items / properties / note / descriptionPrevious value: -"Version note."New value: +"Version note. Empty string when Open States recorded no note." - changed
Output schema / properties / votes / items / properties / start_date / descriptionPrevious value: -"Vote date."New value: +"Vote date. Empty string when Open States recorded no date."
- Changed
openstates_get_committee5 fields changed- changed
Output schema / properties / links / items / properties / note / descriptionPrevious value: -"Link description (e.g., \"homepage\")."New value: +"Link description (e.g., \"homepage\"). Empty string when Open States recorded no description." - changed
Output schema / properties / memberships / items / properties / person_id / descriptionPrevious value: -"OCD person ID of the member."New value: +"OCD person ID of the member — pass it to openstates_search_people as id for the full record. Empty string when the membership carries no linked person." - changed
Output schema / properties / memberships / items / properties / person_name / descriptionPrevious value: -"Member name."New value: +"Member name. Empty string when Open States recorded none." - changed
Output schema / properties / memberships / items / properties / role / descriptionPrevious value: -"Member role (e.g., \"chair\", \"member\")."New value: +"Member role (e.g., \"chair\", \"member\"). Empty string when Open States recorded none." - changed
Output schema / properties / sources / items / properties / note / descriptionPrevious value: -"Source note."New value: +"Source note. Empty string when Open States recorded no note."
- Changed
openstates_get_event4 fields changed- changed
Output schema / properties / documents / items / properties / note / descriptionPrevious value: -"Document description."New value: +"Document description. Empty string when Open States recorded no description." - changed
Output schema / properties / links / items / properties / note / descriptionPrevious value: -"Link description."New value: +"Link description. Empty string when Open States recorded no description." - changed
Output schema / properties / media / items / properties / note / descriptionPrevious value: -"Media description."New value: +"Media description. Empty string when Open States recorded no description." - changed
Output schema / properties / sources / items / properties / note / descriptionPrevious value: -"Source note."New value: +"Source note. Empty string when Open States recorded no note."
- Changed
openstates_get_jurisdiction3 fields changed- changed
Output schema / properties / legislative_sessions / items / properties / classification / descriptionPrevious value: -"Session classification: \"primary\", \"special\", etc."New value: +"Session classification: \"primary\", \"special\", etc. Empty string when Open States recorded none, which covers 28% of sessions — 13 jurisdictions carry no classification on any session at all." - changed
Output schema / properties / legislative_sessions / items / properties / end_date / descriptionPrevious value: -"Session end date."New value: +"Session end date. Empty string when Open States recorded no value; an absent endpoint means unknown, not ongoing." - changed
Output schema / properties / legislative_sessions / items / properties / start_date / descriptionPrevious value: -"Session start date."New value: +"Session start date. Empty string when Open States recorded no value; an absent endpoint means unknown, not ongoing."
- Changed
openstates_get_legislators_by_location6 fields changed- changed
Output schema / properties / legislators / items / properties / family_name / descriptionPrevious value: -"Family (last) name."New value: +"Family (last) name. Empty string when Open States recorded none." - changed
Output schema / properties / legislators / items / properties / given_name / descriptionPrevious value: -"Given (first) name."New value: +"Given (first) name. Empty string when Open States recorded none." - changed
Output schema / properties / legislators / items / properties / links / items / properties / note / descriptionPrevious value: -"Link description."New value: +"Link description. Empty string when Open States recorded no description — common on person links." - changed
Output schema / properties / legislators / items / properties / openstates_url / descriptionPrevious value: -"Open States profile URL."New value: +"Open States profile URL. Empty string when Open States recorded none." - changed
Output schema / properties / legislators / items / properties / other_names / items / properties / note / descriptionPrevious value: -"Note describing the alternate name."New value: +"Note describing the alternate name. Empty string when Open States recorded no note." - changed
Output schema / properties / legislators / items / properties / sources / items / properties / note / descriptionPrevious value: -"Source note."New value: +"Source note. Empty string when Open States recorded no note."
- Changed
openstates_list_jurisdictions3 fields changed- changed
Output schema / properties / results / items / properties / legislative_sessions / items / properties / classification / descriptionPrevious value: -"Session type: \"primary\", \"special\", etc."New value: +"Session type: \"primary\", \"special\", etc. Empty string when Open States recorded none, which covers 28% of sessions — 13 jurisdictions carry no classification on any session at all." - changed
Output schema / properties / results / items / properties / legislative_sessions / items / properties / end_date / descriptionPrevious value: -"Session end date."New value: +"Session end date. Empty string when Open States recorded no value; an absent endpoint means unknown, not ongoing." - changed
Output schema / properties / results / items / properties / legislative_sessions / items / properties / start_date / descriptionPrevious value: -"Session start date."New value: +"Session start date. Empty string when Open States recorded no value; an absent endpoint means unknown, not ongoing."
- Changed
openstates_search_bills10 fields changed- changed
Output schema / properties / results / items / properties / abstracts / items / properties / note / descriptionPrevious value: -"Source note."New value: +"Source note. Empty string when Open States recorded no note." - changed
Output schema / properties / results / items / properties / actions / items / properties / date / descriptionPrevious value: -"Action date."New value: +"Action date. Empty string when Open States recorded no date." - changed
Output schema / properties / results / items / properties / documents / items / properties / date / descriptionPrevious value: -"Document date."New value: +"Document date. Empty string when Open States recorded no date, which is the usual case for bill documents." - changed
Output schema / properties / results / items / properties / documents / items / properties / note / descriptionPrevious value: -"Document note."New value: +"Document note. Empty string when Open States recorded no note." - changed
Output schema / properties / results / items / properties / other_titles / items / properties / note / descriptionPrevious value: -"Note describing the alternate title."New value: +"Note describing the alternate title. Empty string when Open States recorded no note." - changed
Output schema / properties / results / items / properties / sources / items / properties / note / descriptionPrevious value: -"Source note."New value: +"Source note. Empty string when Open States recorded no note." - changed
Output schema / properties / results / items / properties / sponsorships / items / properties / person / properties / id / descriptionPrevious value: -"OCD person ID. Pass it back as the sponsor filter to find this legislator's other bills — an exact handle where the sponsor name string is often only a family name."New value: +"OCD person ID — an exact handle where the sponsor name string is often only a family name. Pass it to openstates_search_people as id for the full legislator record, or back as the sponsor filter to find this legislator's other bills." - changed
Output schema / properties / results / items / properties / versions / items / properties / date / descriptionPrevious value: -"Version date."New value: +"Version date. Empty string when Open States recorded no date, which is the usual case for bill versions." - changed
Output schema / properties / results / items / properties / versions / items / properties / note / descriptionPrevious value: -"Version note."New value: +"Version note. Empty string when Open States recorded no note." - changed
Output schema / properties / results / items / properties / votes / items / properties / start_date / descriptionPrevious value: -"Vote date."New value: +"Vote date. Empty string when Open States recorded no date."
- Changed
openstates_search_committees5 fields changed- changed
Output schema / properties / results / items / properties / links / items / properties / note / descriptionPrevious value: -"Link description (e.g., \"homepage\")."New value: +"Link description (e.g., \"homepage\"). Empty string when Open States recorded no description." - changed
Output schema / properties / results / items / properties / memberships / items / properties / person_id / descriptionPrevious value: -"OCD person ID of the member."New value: +"OCD person ID of the member — pass it to openstates_search_people as id for the full record. Empty string when the membership carries no linked person." - changed
Output schema / properties / results / items / properties / memberships / items / properties / person_name / descriptionPrevious value: -"Member name."New value: +"Member name. Empty string when Open States recorded none." - changed
Output schema / properties / results / items / properties / memberships / items / properties / role / descriptionPrevious value: -"Member role (e.g., \"chair\", \"member\")."New value: +"Member role (e.g., \"chair\", \"member\"). Empty string when Open States recorded none." - changed
Output schema / properties / results / items / properties / sources / items / properties / note / descriptionPrevious value: -"Source note."New value: +"Source note. Empty string when Open States recorded no note."
- Changed
openstates_search_events4 fields changed- changed
Output schema / properties / results / items / properties / documents / items / properties / note / descriptionPrevious value: -"Document description."New value: +"Document description. Empty string when Open States recorded no description." - changed
Output schema / properties / results / items / properties / links / items / properties / note / descriptionPrevious value: -"Link description."New value: +"Link description. Empty string when Open States recorded no description." - changed
Output schema / properties / results / items / properties / media / items / properties / note / descriptionPrevious value: -"Media description."New value: +"Media description. Empty string when Open States recorded no description." - changed
Output schema / properties / results / items / properties / sources / items / properties / note / descriptionPrevious value: -"Source note."New value: +"Source note. Empty string when Open States recorded no note."
- Changed
openstates_search_people10 fields changed- added
Input schema / properties / idAdded value: +{ + "description": "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.", + "items": { + "minLength": 1, + "type": "string" + }, + "minItems": 1, + "type": "array" +} - changed
Input schema / properties / jurisdiction / descriptionPrevious value: -"State name, abbreviation, or OCD-ID. Required — an all-states search exceeds the upstream timeout, so every call must be scoped to a single jurisdiction."New value: +"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." - removed
Input schema / requiredRemoved value: -[ - "jurisdiction" -] - added
Output schema / properties / appliedFilters / properties / idAdded value: +{ + "description": "Person IDs filtered on, as received. Absent when none were supplied.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / results / items / properties / family_name / descriptionPrevious value: -"Family (last) name."New value: +"Family (last) name. Empty string when Open States recorded none." - changed
Output schema / properties / results / items / properties / given_name / descriptionPrevious value: -"Given (first) name."New value: +"Given (first) name. Empty string when Open States recorded none." - changed
Output schema / properties / results / items / properties / links / items / properties / note / descriptionPrevious value: -"Link description (e.g., \"website\", \"twitter\")."New value: +"Link description (e.g., \"website\", \"twitter\"). Empty string when Open States recorded no description — common on person links." - changed
Output schema / properties / results / items / properties / openstates_url / descriptionPrevious value: -"Open States profile URL."New value: +"Open States profile URL. Empty string when Open States recorded none." - changed
Output schema / properties / results / items / properties / other_names / items / properties / note / descriptionPrevious value: -"Note describing the alternate name."New value: +"Note describing the alternate name. Empty string when Open States recorded no note." - changed
Output schema / properties / results / items / properties / sources / items / properties / note / descriptionPrevious value: -"Source note."New value: +"Source note. Empty string when Open States recorded no note."
6 tool updates
- Changed
openstates_get_bill2 fields changed- changed
Output schema / properties / other_identifiers / items / properties / scheme / descriptionPrevious value: -"Identifier scheme (the issuing system)."New value: +"Identifier scheme (the issuing system). Absent for bills — Open States omits it on every bill record observed." - changed
Output schema / properties / other_identifiers / items / requiredPrevious value: -[ - "identifier", - "scheme" -]New value: +[ + "identifier" +]
- Changed
openstates_get_legislators_by_location7 fields changed- added
Output schema / properties / federalCountAdded value: +{ + "description": "Results serving the US Congress (jurisdiction.classification = \"country\") — the coordinate's two US Senators and its US Representative.", + "type": "number" +} - added
Output schema / properties / legislators / items / properties / family_nameAdded value: +{ + "description": "Family (last) name.", + "type": "string" +} - added
Output schema / properties / legislators / items / properties / given_nameAdded value: +{ + "description": "Given (first) name.", + "type": "string" +} - added
Output schema / properties / legislators / items / properties / jurisdiction / properties / classificationAdded value: +{ + "description": "Government level this legislator serves: \"state\" for a state legislature, \"country\" for the US Congress. The field that separates the two tiers in this result set.", + "type": "string" +} - changed
Output schema / properties / legislators / items / requiredPrevious value: -[ - "id", - "name", - "party", - "current_role", - "jurisdiction", - "email", - "openstates_url" -]New value: +[ + "id", + "name", + "party", + "current_role", + "jurisdiction", + "given_name", + "family_name", + "email", + "openstates_url" +] - added
Output schema / properties / stateCountAdded value: +{ + "description": "Results serving a state legislature (jurisdiction.classification = \"state\").", + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "legislators", - "count" -]New value: +[ + "legislators", + "count", + "stateCount", + "federalCount" +]
- Changed
openstates_search_bills6 fields changed- added
Output schema / properties / appliedFilters / properties / sponsorAdded value: +{ + "description": "Sponsor filter as received.", + "type": "string" +} - added
Output schema / properties / appliedFilters / properties / sponsor_classificationAdded value: +{ + "description": "Sponsor-type filter as received.", + "type": "string" +} - added
Output schema / properties / appliedFilters / properties / subjectAdded value: +{ + "description": "Subject tags filtered on, as received. Absent when none were supplied.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Recovery hint when results are empty — echoes the filters applied and suggests how to broaden. Absent when results are returned."New value: +"Recovery hint when results are empty — names every filter that narrowed the query and suggests how to broaden. Absent when results are returned." - changed
Output schema / properties / results / items / properties / other_identifiers / items / properties / scheme / descriptionPrevious value: -"Identifier scheme (the issuing system)."New value: +"Identifier scheme (the issuing system). Absent for bills — Open States omits it on every bill record observed." - changed
Output schema / properties / results / items / properties / other_identifiers / items / requiredPrevious value: -[ - "identifier", - "scheme" -]New value: +[ + "identifier" +]
- Changed
openstates_search_committees3 fields changed- changed
Input schema / properties / jurisdiction / descriptionPrevious value: -"State name, abbreviation, or OCD-ID. Required — an all-states request exceeds the upstream timeout, so omitting it is rejected before any request is issued."New value: +"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." - added
Input schema / properties / jurisdiction / minLengthAdded value: +1 - added
Input schema / requiredAdded value: +[ + "jurisdiction" +]
- Changed
openstates_search_events3 fields changed- changed
Input schema / properties / jurisdiction / descriptionPrevious value: -"State name, abbreviation, or OCD-ID. Required — the Open States events endpoint has no all-states search and rejects requests that omit it."New value: +"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." - added
Input schema / properties / jurisdiction / minLengthAdded value: +1 - added
Input schema / requiredAdded value: +[ + "jurisdiction" +]
- Changed
openstates_search_people3 fields changed- changed
Input schema / properties / jurisdiction / descriptionPrevious value: -"State name, abbreviation, or OCD-ID. Required — an all-states search exceeds the upstream timeout, so omitting it is rejected before any request is issued."New value: +"State name, abbreviation, or OCD-ID. Required — an all-states search exceeds the upstream timeout, so every call must be scoped to a single jurisdiction." - added
Input schema / properties / jurisdiction / minLengthAdded value: +1 - added
Input schema / requiredAdded value: +[ + "jurisdiction" +]
5 tool updates
- Changed
openstates_get_bill1 field changed- added
Output schema / properties / updated_atAdded value: +{ + "description": "Timestamp Open States last updated this record — the field openstates_search_bills sorts by under the default sort=updated_desc.", + "type": "string" +}
- Changed
openstates_get_legislators_by_location2 fields changed- changed
Output schema / properties / legislators / items / properties / current_role / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "district": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "District label or null." - }, - "org_classification": { - "description": "Chamber classification.", - "type": "string" - }, - "title": { - "description": "Role title.", - "type": "string" - } - }, - "required": [ - "title", - "org_classification", - "district" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "district": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "District label or null." + }, + "division_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "OCD division the district maps to (e.g., \"ocd-division/country:us/state:wa/sldu:37\"). Null when undistricted, absent when upstream omits it." + }, + "org_classification": { + "description": "Chamber classification.", + "type": "string" + }, + "title": { + "description": "Role title.", + "type": "string" + } + }, + "required": [ + "title", + "org_classification", + "district" + ], + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / legislators / items / properties / imageAdded value: +{ + "description": "Official headshot URL. Absent when no photo is published.", + "type": "string" +}
- Changed
openstates_search_bills4 fields changed- changed
Input schema / properties / q / descriptionPrevious value: -"Full-text search across bill titles, abstracts, and text. Required unless jurisdiction is provided. Combining with jurisdiction is recommended for precision."New value: +"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." - added
Output schema / properties / results / items / properties / openstates_urlAdded value: +{ + "description": "Citable Open States page for this bill.", + "type": "string" +} - added
Output schema / properties / results / items / properties / sponsorships / items / properties / personAdded value: +{ + "additionalProperties": false, + "description": "Linked person record when the sponsor resolves to a known legislator.", + "properties": { + "id": { + "description": "OCD person ID. Pass it back as the sponsor filter to find this legislator's other bills — an exact handle where the sponsor name string is often only a family name.", + "type": "string" + }, + "name": { + "description": "Person name.", + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" +} - added
Output schema / properties / results / items / properties / updated_atAdded value: +{ + "description": "Timestamp Open States last updated this record — the field the default sort=updated_desc orders by.", + "type": "string" +}
- Changed
openstates_search_committees1 field changed- changed
Input schema / properties / jurisdiction / descriptionPrevious value: -"State name, abbreviation, or OCD-ID. Omitting returns no committees rather than searching all states — supply a jurisdiction to get results."New value: +"State name, abbreviation, or OCD-ID. Required — an all-states request exceeds the upstream timeout, so omitting it is rejected before any request is issued."
- Changed
openstates_search_people4 fields changed- changed
Input schema / properties / jurisdiction / descriptionPrevious value: -"State name, abbreviation, or OCD-ID. Omitting searches across all states."New value: +"State name, abbreviation, or OCD-ID. Required — an all-states search exceeds the upstream timeout, so omitting it is rejected before any request is issued." - changed
Input schema / properties / name / descriptionPrevious value: -"Name or partial name to match (case-insensitive substring)."New value: +"Name or partial name to match (case-insensitive substring). Narrows within the jurisdiction; it does not substitute for one." - changed
Output schema / properties / results / items / properties / current_role / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "district": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "District label or null when undistricted." - }, - "org_classification": { - "description": "Chamber classification (e.g., \"upper\", \"lower\").", - "type": "string" - }, - "title": { - "description": "Role title (e.g., \"Senator\", \"Representative\").", - "type": "string" - } - }, - "required": [ - "title", - "org_classification", - "district" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "district": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "District label or null when undistricted." + }, + "division_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "OCD division the district maps to (e.g., \"ocd-division/country:us/state:wa/sldu:37\"). Null when undistricted, absent when upstream omits it." + }, + "org_classification": { + "description": "Chamber classification (e.g., \"upper\", \"lower\").", + "type": "string" + }, + "title": { + "description": "Role title (e.g., \"Senator\", \"Representative\").", + "type": "string" + } + }, + "required": [ + "title", + "org_classification", + "district" + ], + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / results / items / properties / imageAdded value: +{ + "description": "Official headshot URL. Absent when no photo is published.", + "type": "string" +}
10 tool updates
- Changed
openstates_get_bill3 fields changed- added
Output schema / properties / other_identifiersAdded value: +{ + "description": "Alternate identifiers when include=other_identifiers is requested.", + "items": { + "additionalProperties": false, + "description": "Alternate identifier record.", + "properties": { + "identifier": { + "description": "Alternate bill identifier.", + "type": "string" + }, + "scheme": { + "description": "Identifier scheme (the issuing system).", + "type": "string" + } + }, + "required": [ + "identifier", + "scheme" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / other_titlesAdded value: +{ + "description": "Alternate titles when include=other_titles is requested.", + "items": { + "additionalProperties": false, + "description": "Alternate title record.", + "properties": { + "note": { + "description": "Note describing the alternate title.", + "type": "string" + }, + "title": { + "description": "Alternate bill title.", + "type": "string" + } + }, + "required": [ + "title", + "note" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / sourcesAdded value: +{ + "description": "Source documents when include=sources is requested.", + "items": { + "additionalProperties": false, + "description": "Source record.", + "properties": { + "note": { + "description": "Source note.", + "type": "string" + }, + "url": { + "description": "Source URL.", + "type": "string" + } + }, + "required": [ + "url", + "note" + ], + "type": "object" + }, + "type": "array" +}
- Changed
openstates_get_committee3 fields changed- changed
Input schema / properties / include / descriptionPrevious value: -"Related data to inline. \"memberships\" includes the full roster with member roles."New value: +"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." - added
Output schema / properties / linksAdded value: +{ + "description": "Committee homepage and reference links when include=links is requested.", + "items": { + "additionalProperties": false, + "description": "External link record.", + "properties": { + "note": { + "description": "Link description (e.g., \"homepage\").", + "type": "string" + }, + "url": { + "description": "Link URL.", + "type": "string" + } + }, + "required": [ + "url", + "note" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / sourcesAdded value: +{ + "description": "Provenance sources when include=sources is requested.", + "items": { + "additionalProperties": false, + "description": "Source record.", + "properties": { + "note": { + "description": "Source note.", + "type": "string" + }, + "url": { + "description": "Source URL.", + "type": "string" + } + }, + "required": [ + "url", + "note" + ], + "type": "object" + }, + "type": "array" +}
- Changed
openstates_get_event4 fields changed- changed
Input schema / properties / include / descriptionPrevious value: -"Related data to inline. \"agenda\" and \"participants\" are most useful."New value: +"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." - changed
Output schema / properties / participants / items / properties / role / descriptionPrevious value: -"Participant role."New value: +"Participant role. Absent when upstream omits it." - changed
Output schema / properties / participants / items / requiredPrevious value: -[ - "name", - "entity_type", - "role" -]New value: +[ + "name", + "entity_type" +] - added
Output schema / properties / sourcesAdded value: +{ + "description": "Provenance sources when include=sources is requested.", + "items": { + "additionalProperties": false, + "description": "Source record.", + "properties": { + "note": { + "description": "Source note.", + "type": "string" + }, + "url": { + "description": "Source URL.", + "type": "string" + } + }, + "required": [ + "url", + "note" + ], + "type": "object" + }, + "type": "array" +}
- Changed
openstates_get_jurisdiction3 fields changed- changed
Input schema / properties / include / descriptionPrevious value: -"Related data to inline. \"legislative_sessions\" returns all historical and current sessions with identifiers and date ranges. \"latest_runs\" shows last scraper run metadata."New value: +"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." - added
Output schema / properties / latest_runsAdded value: +{ + "description": "Recent scraper runs when include=latest_runs is requested.", + "items": { + "additionalProperties": false, + "description": "Scraper run record.", + "properties": { + "end_time": { + "description": "ISO 8601 timestamp when the run finished. Absent when unrecorded.", + "type": "string" + }, + "start_time": { + "description": "ISO 8601 timestamp when the scraper run started.", + "type": "string" + }, + "success": { + "description": "Whether the run succeeded. Absent when not recorded.", + "type": "boolean" + } + }, + "required": [ + "start_time" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / organizationsAdded value: +{ + "description": "Legislative chambers and executive bodies when include=organizations is requested.", + "items": { + "additionalProperties": false, + "description": "Organization record.", + "properties": { + "classification": { + "description": "Organization type (e.g., \"upper\", \"lower\", \"legislature\").", + "type": "string" + }, + "id": { + "description": "OCD organization ID.", + "type": "string" + }, + "name": { + "description": "Organization name (e.g., \"Washington State Senate\").", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" +}
- Changed
openstates_get_legislators_by_location4 fields changed- changed
Input schema / properties / include / descriptionPrevious value: -"Related data to inline. \"offices\" includes phone, fax, and address."New value: +"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." - added
Output schema / properties / legislators / items / properties / other_identifiersAdded value: +{ + "description": "Cross-system identifiers when include=other_identifiers is requested.", + "items": { + "additionalProperties": false, + "description": "Alternate identifier record.", + "properties": { + "identifier": { + "description": "Alternate identifier.", + "type": "string" + }, + "scheme": { + "description": "Identifier scheme (the issuing system).", + "type": "string" + } + }, + "required": [ + "identifier", + "scheme" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / legislators / items / properties / other_namesAdded value: +{ + "description": "Alternate/former names when include=other_names is requested.", + "items": { + "additionalProperties": false, + "description": "Alternate name record.", + "properties": { + "name": { + "description": "Alternate or former name.", + "type": "string" + }, + "note": { + "description": "Note describing the alternate name.", + "type": "string" + } + }, + "required": [ + "name", + "note" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / legislators / items / properties / sourcesAdded value: +{ + "description": "Provenance sources when include=sources is requested.", + "items": { + "additionalProperties": false, + "description": "Source record.", + "properties": { + "note": { + "description": "Source note.", + "type": "string" + }, + "url": { + "description": "Source URL.", + "type": "string" + } + }, + "required": [ + "url", + "note" + ], + "type": "object" + }, + "type": "array" +}
- Changed
openstates_list_jurisdictions3 fields changed- changed
Input schema / properties / include / descriptionPrevious value: -"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."New value: +"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." - added
Output schema / properties / results / items / properties / latest_runsAdded value: +{ + "description": "Recent scraper runs when include=latest_runs is requested.", + "items": { + "additionalProperties": false, + "description": "Scraper run record.", + "properties": { + "end_time": { + "description": "ISO 8601 timestamp when the run finished. Absent when unrecorded.", + "type": "string" + }, + "start_time": { + "description": "ISO 8601 timestamp when the scraper run started.", + "type": "string" + }, + "success": { + "description": "Whether the run succeeded. Absent when not recorded.", + "type": "boolean" + } + }, + "required": [ + "start_time" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / results / items / properties / organizationsAdded value: +{ + "description": "Legislative chambers and executive bodies when include=organizations is requested.", + "items": { + "additionalProperties": false, + "description": "Organization record.", + "properties": { + "classification": { + "description": "Organization type (e.g., \"upper\", \"lower\", \"legislature\").", + "type": "string" + }, + "id": { + "description": "OCD organization ID.", + "type": "string" + }, + "name": { + "description": "Organization name (e.g., \"Washington State Senate\").", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" +}
- Changed
openstates_search_bills7 fields changed- added
Output schema / properties / results / items / properties / documentsAdded value: +{ + "description": "Bill documents (fiscal notes, etc.) when include=documents is requested.", + "items": { + "additionalProperties": false, + "description": "Bill document record.", + "properties": { + "date": { + "description": "Document date.", + "type": "string" + }, + "id": { + "description": "Document ID.", + "type": "string" + }, + "links": { + "description": "Document links.", + "items": { + "additionalProperties": false, + "description": "Document link.", + "properties": { + "media_type": { + "description": "MIME type.", + "type": "string" + }, + "url": { + "description": "Document URL.", + "type": "string" + } + }, + "required": [ + "url", + "media_type" + ], + "type": "object" + }, + "type": "array" + }, + "note": { + "description": "Document note.", + "type": "string" + } + }, + "required": [ + "id", + "note", + "date", + "links" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / results / items / properties / other_identifiersAdded value: +{ + "description": "Alternate identifiers when include=other_identifiers is requested.", + "items": { + "additionalProperties": false, + "description": "Alternate identifier record.", + "properties": { + "identifier": { + "description": "Alternate bill identifier.", + "type": "string" + }, + "scheme": { + "description": "Identifier scheme (the issuing system).", + "type": "string" + } + }, + "required": [ + "identifier", + "scheme" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / results / items / properties / other_titlesAdded value: +{ + "description": "Alternate titles when include=other_titles is requested.", + "items": { + "additionalProperties": false, + "description": "Alternate title record.", + "properties": { + "note": { + "description": "Note describing the alternate title.", + "type": "string" + }, + "title": { + "description": "Alternate bill title.", + "type": "string" + } + }, + "required": [ + "title", + "note" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / results / items / properties / related_billsAdded value: +{ + "description": "Related bills when include=related_bills is requested.", + "items": { + "additionalProperties": false, + "description": "Related bill record.", + "properties": { + "identifier": { + "description": "Related bill identifier.", + "type": "string" + }, + "legislative_session": { + "description": "Session of the related bill.", + "type": "string" + }, + "relation_type": { + "description": "Relationship type (e.g., \"companion\", \"identical\").", + "type": "string" + } + }, + "required": [ + "identifier", + "legislative_session", + "relation_type" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / results / items / properties / sourcesAdded value: +{ + "description": "Source documents when include=sources is requested.", + "items": { + "additionalProperties": false, + "description": "Source record.", + "properties": { + "note": { + "description": "Source note.", + "type": "string" + }, + "url": { + "description": "Source URL.", + "type": "string" + } + }, + "required": [ + "url", + "note" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / results / items / properties / versionsAdded value: +{ + "description": "Bill text versions when include=versions is requested.", + "items": { + "additionalProperties": false, + "description": "Bill text version record.", + "properties": { + "date": { + "description": "Version date.", + "type": "string" + }, + "id": { + "description": "Version ID.", + "type": "string" + }, + "links": { + "description": "Document links.", + "items": { + "additionalProperties": false, + "description": "Document link.", + "properties": { + "media_type": { + "description": "MIME type.", + "type": "string" + }, + "url": { + "description": "Document URL.", + "type": "string" + } + }, + "required": [ + "url", + "media_type" + ], + "type": "object" + }, + "type": "array" + }, + "note": { + "description": "Version note.", + "type": "string" + } + }, + "required": [ + "id", + "note", + "date", + "links" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / results / items / properties / votesAdded value: +{ + "description": "Vote events when include=votes is requested.", + "items": { + "additionalProperties": false, + "description": "Vote event record.", + "properties": { + "counts": { + "description": "Vote tallies by option.", + "items": { + "additionalProperties": false, + "description": "Vote tally entry.", + "properties": { + "option": { + "description": "Vote option (e.g., \"yes\", \"no\", \"absent\").", + "type": "string" + }, + "value": { + "description": "Count of votes for this option.", + "type": "number" + } + }, + "required": [ + "option", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "id": { + "description": "Vote event ID.", + "type": "string" + }, + "identifier": { + "description": "Vote identifier.", + "type": "string" + }, + "motion_text": { + "description": "Motion text.", + "type": "string" + }, + "result": { + "description": "Vote result: \"pass\" or \"fail\".", + "type": "string" + }, + "start_date": { + "description": "Vote date.", + "type": "string" + }, + "votes": { + "description": "Per-legislator vote positions.", + "items": { + "additionalProperties": false, + "description": "Individual legislator vote.", + "properties": { + "option": { + "description": "How this legislator voted.", + "type": "string" + }, + "voter": { + "additionalProperties": false, + "description": "Linked person record when available.", + "properties": { + "id": { + "description": "OCD person ID.", + "type": "string" + }, + "name": { + "description": "Person name.", + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "voter_name": { + "description": "Voter name.", + "type": "string" + } + }, + "required": [ + "option", + "voter_name" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "id", + "motion_text", + "start_date", + "result", + "identifier", + "counts", + "votes" + ], + "type": "object" + }, + "type": "array" +}
- Changed
openstates_search_committees3 fields changed- changed
Input schema / properties / include / descriptionPrevious value: -"Related data to inline. \"memberships\" includes the full roster with member roles."New value: +"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." - added
Output schema / properties / results / items / properties / linksAdded value: +{ + "description": "Committee homepage and reference links when include=links is requested.", + "items": { + "additionalProperties": false, + "description": "External link record.", + "properties": { + "note": { + "description": "Link description (e.g., \"homepage\").", + "type": "string" + }, + "url": { + "description": "Link URL.", + "type": "string" + } + }, + "required": [ + "url", + "note" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / results / items / properties / sourcesAdded value: +{ + "description": "Provenance sources when include=sources is requested.", + "items": { + "additionalProperties": false, + "description": "Source record.", + "properties": { + "note": { + "description": "Source note.", + "type": "string" + }, + "url": { + "description": "Source URL.", + "type": "string" + } + }, + "required": [ + "url", + "note" + ], + "type": "object" + }, + "type": "array" +}
- Changed
openstates_search_events7 fields changed- changed
Input schema / properties / include / descriptionPrevious value: -"Related data to inline. \"agenda\" includes the meeting agenda with bill references. \"participants\" includes the committee or chamber hosting the event."New value: +"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." - added
Output schema / properties / results / items / properties / documentsAdded value: +{ + "description": "Document links when include=documents is requested.", + "items": { + "additionalProperties": false, + "description": "Document link record.", + "properties": { + "note": { + "description": "Document description.", + "type": "string" + }, + "url": { + "description": "Document URL.", + "type": "string" + } + }, + "required": [ + "url", + "note" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / results / items / properties / linksAdded value: +{ + "description": "Event links when include=links is requested.", + "items": { + "additionalProperties": false, + "description": "External link record.", + "properties": { + "note": { + "description": "Link description.", + "type": "string" + }, + "url": { + "description": "Link URL.", + "type": "string" + } + }, + "required": [ + "url", + "note" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / results / items / properties / mediaAdded value: +{ + "description": "Media links when include=media is requested.", + "items": { + "additionalProperties": false, + "description": "Media link record.", + "properties": { + "note": { + "description": "Media description.", + "type": "string" + }, + "url": { + "description": "Media URL.", + "type": "string" + } + }, + "required": [ + "url", + "note" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / results / items / properties / participants / items / properties / role / descriptionPrevious value: -"Participant role."New value: +"Participant role. Absent when upstream omits it." - changed
Output schema / properties / results / items / properties / participants / items / requiredPrevious value: -[ - "name", - "entity_type", - "role" -]New value: +[ + "name", + "entity_type" +] - added
Output schema / properties / results / items / properties / sourcesAdded value: +{ + "description": "Provenance sources when include=sources is requested.", + "items": { + "additionalProperties": false, + "description": "Source record.", + "properties": { + "note": { + "description": "Source note.", + "type": "string" + }, + "url": { + "description": "Source URL.", + "type": "string" + } + }, + "required": [ + "url", + "note" + ], + "type": "object" + }, + "type": "array" +}
- Changed
openstates_search_people4 fields changed- changed
Input schema / properties / include / descriptionPrevious value: -"Related data to inline. \"offices\" includes phone, fax, and address. \"links\" includes website and social links."New value: +"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." - added
Output schema / properties / results / items / properties / other_identifiersAdded value: +{ + "description": "Cross-system identifiers when include=other_identifiers is requested.", + "items": { + "additionalProperties": false, + "description": "Alternate identifier record.", + "properties": { + "identifier": { + "description": "Alternate identifier.", + "type": "string" + }, + "scheme": { + "description": "Identifier scheme (the issuing system).", + "type": "string" + } + }, + "required": [ + "identifier", + "scheme" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / results / items / properties / other_namesAdded value: +{ + "description": "Alternate/former names when include=other_names is requested.", + "items": { + "additionalProperties": false, + "description": "Alternate name record.", + "properties": { + "name": { + "description": "Alternate or former name.", + "type": "string" + }, + "note": { + "description": "Note describing the alternate name.", + "type": "string" + } + }, + "required": [ + "name", + "note" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / results / items / properties / sourcesAdded value: +{ + "description": "Provenance sources when include=sources is requested.", + "items": { + "additionalProperties": false, + "description": "Source record.", + "properties": { + "note": { + "description": "Source note.", + "type": "string" + }, + "url": { + "description": "Source URL.", + "type": "string" + } + }, + "required": [ + "url", + "note" + ], + "type": "object" + }, + "type": "array" +}
1 tool update
- Changed
openstates_list_jurisdictions2 fields changed- changed
Input schema / properties / classification / descriptionPrevious value: -"Filter by jurisdiction type. Use \"state\" (default) for all 50 states, DC, and Puerto Rico."New value: +"Filter by jurisdiction type. Use \"state\" (default) for all 50 states, DC, and the 5 US territories." - changed
Input schema / properties / per_page / descriptionPrevious value: -"Results per page. Default 52 to cover all states, DC, and Puerto Rico in one request."New value: +"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."
4 tool updates
- Changed
openstates_search_bills2 fields changed- added
Input schema / properties / created_sinceAdded value: +{ + "description": "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.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}(T[\\d:.Z+-]+)?$", + "type": "string" +} - added
Output schema / properties / appliedFilters / properties / created_sinceAdded value: +{ + "description": "created_since date filter as received.", + "type": "string" +}
- Changed
openstates_search_committees1 field changed- changed
Input schema / properties / jurisdiction / descriptionPrevious value: -"State name, abbreviation, or OCD-ID. Omitting searches across all states."New value: +"State name, abbreviation, or OCD-ID. Omitting returns no committees rather than searching all states — supply a jurisdiction to get results."
- Changed
openstates_search_events1 field changed- changed
Input schema / properties / jurisdiction / descriptionPrevious value: -"State name, abbreviation, or OCD-ID. Omitting searches across all states."New value: +"State name, abbreviation, or OCD-ID. Required — the Open States events endpoint has no all-states search and rejects requests that omit it."
- Changed
openstates_search_people1 field changed- changed
Input schema / properties / org_classification / descriptionPrevious value: -"Filter by role type. \"upper\" = Senate, \"lower\" = House/Assembly, \"legislature\" = all legislators, \"executive\" = governors and executive officials."New value: +"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\"."
4 tool updates
- Changed
openstates_search_bills6 fields changed- changed
Input schema / properties / action_since / descriptionPrevious value: -"ISO 8601 date — only return bills with an action after this date."New value: +"ISO 8601 date — only return bills with an action after this date (e.g., \"2025-01-01\")." - added
Input schema / properties / action_since / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}(T[\\d:.Z+-]+)?$" - changed
Input schema / properties / updated_since / descriptionPrevious value: -"ISO 8601 date — only return bills updated after this date."New value: +"ISO 8601 date — only return bills updated after this date (e.g., \"2025-01-01\")." - added
Input schema / properties / updated_since / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}(T[\\d:.Z+-]+)?$" - added
Output schema / properties / appliedFiltersAdded value: +{ + "additionalProperties": false, + "description": "Filters applied to this query as the server received them, for agent self-verification of zero or unexpected results.", + "properties": { + "action_since": { + "description": "action_since date filter as received.", + "type": "string" + }, + "chamber": { + "description": "Chamber filter as received.", + "type": "string" + }, + "classification": { + "description": "Classification filter as received.", + "type": "string" + }, + "jurisdiction": { + "description": "Jurisdiction filter as received.", + "type": "string" + }, + "page": { + "description": "Page number requested.", + "type": "number" + }, + "per_page": { + "description": "Results per page requested.", + "type": "number" + }, + "q": { + "description": "Full-text query as received.", + "type": "string" + }, + "session": { + "description": "Session filter as received.", + "type": "string" + }, + "sort": { + "description": "Sort order applied.", + "type": "string" + }, + "updated_since": { + "description": "updated_since date filter as received.", + "type": "string" + } + }, + "required": [ + "sort", + "page", + "per_page" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "results", - "pagination", - "totalCount", - "page", - "maxPage" -]New value: +[ + "results", + "pagination", + "totalCount", + "page", + "maxPage", + "appliedFilters" +]
- Changed
openstates_search_committees2 fields changed- added
Output schema / properties / appliedFiltersAdded value: +{ + "additionalProperties": false, + "description": "Filters applied to this query as the server received them, for agent self-verification of zero or unexpected results.", + "properties": { + "chamber": { + "description": "Chamber filter as received.", + "type": "string" + }, + "classification": { + "description": "Classification filter as received.", + "type": "string" + }, + "jurisdiction": { + "description": "Jurisdiction filter as received.", + "type": "string" + }, + "page": { + "description": "Page number requested.", + "type": "number" + }, + "parent": { + "description": "Parent committee filter as received.", + "type": "string" + }, + "per_page": { + "description": "Results per page requested.", + "type": "number" + } + }, + "required": [ + "page", + "per_page" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "results", - "pagination", - "totalCount", - "page", - "maxPage", - "coverageNote" -]New value: +[ + "results", + "pagination", + "totalCount", + "page", + "maxPage", + "coverageNote", + "appliedFilters" +]
- Changed
openstates_search_events4 fields changed- added
Input schema / properties / after / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}(T[\\d:.Z+-]+)?$" - added
Input schema / properties / before / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}(T[\\d:.Z+-]+)?$" - added
Output schema / properties / appliedFiltersAdded value: +{ + "additionalProperties": false, + "description": "Filters applied to this query as the server received them, for agent self-verification of zero or unexpected results.", + "properties": { + "after": { + "description": "after datetime filter as received.", + "type": "string" + }, + "before": { + "description": "before datetime filter as received.", + "type": "string" + }, + "jurisdiction": { + "description": "Jurisdiction filter as received.", + "type": "string" + }, + "page": { + "description": "Page number requested.", + "type": "number" + }, + "per_page": { + "description": "Results per page requested.", + "type": "number" + }, + "require_bills": { + "description": "require_bills flag as received.", + "type": "boolean" + } + }, + "required": [ + "require_bills", + "page", + "per_page" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "results", - "pagination", - "totalCount", - "page", - "maxPage", - "coverageNote" -]New value: +[ + "results", + "pagination", + "totalCount", + "page", + "maxPage", + "coverageNote", + "appliedFilters" +]
- Changed
openstates_search_people2 fields changed- added
Output schema / properties / appliedFiltersAdded value: +{ + "additionalProperties": false, + "description": "Filters applied to this query as the server received them, for agent self-verification of zero or unexpected results.", + "properties": { + "district": { + "description": "District filter as received.", + "type": "string" + }, + "jurisdiction": { + "description": "Jurisdiction filter as received.", + "type": "string" + }, + "name": { + "description": "Name filter as received.", + "type": "string" + }, + "org_classification": { + "description": "Role-type filter as received.", + "type": "string" + }, + "page": { + "description": "Page number requested.", + "type": "number" + }, + "per_page": { + "description": "Results per page requested.", + "type": "number" + } + }, + "required": [ + "page", + "per_page" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "results", - "pagination", - "totalCount", - "page", - "maxPage" -]New value: +[ + "results", + "pagination", + "totalCount", + "page", + "maxPage", + "appliedFilters" +]
5 tool updates
- Changed
openstates_list_jurisdictions3 fields changed- added
Output schema / properties / totalCountAdded value: +{ + "description": "Total jurisdictions matching the filter across all pages.", + "type": "number" +} - removed
Output schema / properties / totalItemsRemoved value: -{ - "description": "Total jurisdictions matching the filter across all pages.", - "type": "number" -} - changed
Output schema / requiredPrevious value: -[ - "results", - "pagination", - "totalItems", - "page", - "maxPage" -]New value: +[ + "results", + "pagination", + "totalCount", + "page", + "maxPage" +]
- Changed
openstates_search_bills3 fields changed- added
Output schema / properties / totalCountAdded value: +{ + "description": "Total bills matching the query across all pages.", + "type": "number" +} - removed
Output schema / properties / totalItemsRemoved value: -{ - "description": "Total bills matching the query across all pages.", - "type": "number" -} - changed
Output schema / requiredPrevious value: -[ - "results", - "pagination", - "totalItems", - "page", - "maxPage" -]New value: +[ + "results", + "pagination", + "totalCount", + "page", + "maxPage" +]
- Changed
openstates_search_committees3 fields changed- added
Output schema / properties / totalCountAdded value: +{ + "description": "Total committees matching the query across all pages.", + "type": "number" +} - removed
Output schema / properties / totalItemsRemoved value: -{ - "description": "Total committees matching the query across all pages.", - "type": "number" -} - changed
Output schema / requiredPrevious value: -[ - "results", - "pagination", - "totalItems", - "page", - "maxPage", - "coverageNote" -]New value: +[ + "results", + "pagination", + "totalCount", + "page", + "maxPage", + "coverageNote" +]
- Changed
openstates_search_events3 fields changed- added
Output schema / properties / totalCountAdded value: +{ + "description": "Total events matching the query across all pages.", + "type": "number" +} - removed
Output schema / properties / totalItemsRemoved value: -{ - "description": "Total events matching the query across all pages.", - "type": "number" -} - changed
Output schema / requiredPrevious value: -[ - "results", - "pagination", - "totalItems", - "page", - "maxPage", - "coverageNote" -]New value: +[ + "results", + "pagination", + "totalCount", + "page", + "maxPage", + "coverageNote" +]
- Changed
openstates_search_people3 fields changed- added
Output schema / properties / totalCountAdded value: +{ + "description": "Total legislators matching the query across all pages.", + "type": "number" +} - removed
Output schema / properties / totalItemsRemoved value: -{ - "description": "Total legislators matching the query across all pages.", - "type": "number" -} - changed
Output schema / requiredPrevious value: -[ - "results", - "pagination", - "totalItems", - "page", - "maxPage" -]New value: +[ + "results", + "pagination", + "totalCount", + "page", + "maxPage" +]
Related MCP Connectors
Search bills and speaker-attributed hearing transcripts across all 50 US state legislatures.
Bills, hearings, votes and legislators for all 50 US states, DC and Congress, from official sources.
Search 209k+ US state bills, all 50 states + DC: full text, sponsors, votes, status. Free.
U.S. bills, roll-call votes, legislators and 2026 elections for all 50 states, D.C. and Congress.
Related MCP Servers
- AlicenseAqualityDmaintenanceSearch bills and speaker-attributed hearing transcripts across all 50 US state legislatures.71MIT
- AlicenseNot gradedqualityBmaintenanceEnables searching US state bills by keyword, sponsor, committee, status, or chamber, and searching speaker-attributed committee hearing testimony across all 50 states and DC. Also retrieves full bill details, hearing transcripts, speaker activity histories, and the list of states with available data.MIT
- AlicenseAqualityBmaintenanceProvides 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.1018 npm12MIT
- AlicenseNot gradedqualityBmaintenanceAccess U.S. state legislative data including bills, legislators, and votes across all 50 states via the OpenStates API.43 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.