openstates-mcp-server
Server Details
Search bills, legislators, committees, and events across all 50 US states, DC, and 5 US territories.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- cyanheads/openstates-mcp-server
- GitHub Stars
- 1
- Server Listing
- @cyanheads/openstates-mcp-server
Available Tools
10 toolsopenstates_get_billGet BillARead-onlyIdempotentInspect
Fetch full detail for a specific state bill. Accepts either the three-part path (jurisdiction + session + bill_id) or a direct OCD bill ID (openstates_id from search results). Use include to request votes, actions, sponsorships, documents, and versions in one call rather than searching again. include=votes returns the full vote tally and per-legislator positions. include=actions returns the complete action history. Prefer openstates_id when available to avoid session identifier lookup.
| Name | Required | Description | Default |
|---|---|---|---|
| bill_id | No | Bill identifier as used by the legislature (e.g., "HB 1000", "SB 42"). Required with jurisdiction + session. | |
| include | No | Related data to inline. "sponsorships", "actions", "votes" are most commonly needed. "versions" and "documents" provide links to bill text and fiscal notes. | |
| session | No | Session identifier. Required with jurisdiction + bill_id. | |
| jurisdiction | No | State name, abbreviation, or OCD-ID. Required when using path-based lookup with session + bill_id. | |
| openstates_id | No | OCD bill ID from openstates_search_bills results (e.g., "ocd-bill/..."). Preferred over the three-part path when available. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | 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 readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds behavioral context by explaining what include does for votes and actions (full tally, per-legislator positions, complete history), and states that 'full detail' is returned. However, it doesn't clarify the default response when include is not specified, nor does it describe the response structure or potential errors. This is adequate given annotations but leaves some behavioral ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, with exactly four sentences that are front-loaded: the first sentence states the core purpose, the second explains parameter options, the third gives examples of include behavior, and the fourth provides a preference tip. No word is wasted, and the structure is logical for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 parameters, output schema present, annotations covering safety), the description covers the essential aspects: how to identify the bill, the include parameter's role and common uses, and the preferred parameter choice. It does not mention error handling, rate limits, or defaults, but these are less critical for correct invocation. The existence of an output schema reduces the need to explain return values. Overall, it is sufficiently complete for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides descriptions for each parameter, covering 100% of them. The description adds value by explaining the relationship between parameters: it clarifies that jurisdiction, session, and bill_id form a three-part path, and that openstates_id is an alternative and preferred. This relational knowledge goes beyond the schema's individual parameter descriptions, so the description compensates 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?
The description clearly states the tool 'Fetch full detail for a specific state bill.' It specifies the resource (bill) and the action (fetch), and distinguishes it from sibling tools like search_bills (which searches) and get_committee/get_event (which target different entity types). It also clarifies the two identification methods, removing ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance: it recommends preferring openstates_id when available to avoid session identifier lookup, and suggests using include to request related data in one call instead of searching again. This implies a workflow (first search, then get). It does not explicitly mention alternatives like search_bills for when no ID exists, but the guidance is sufficient and actionable.
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 readOnlyHint=true and idempotentHint=true, so the description does not need to restate safety. It adds meaningful behavioral context: 'Experimental — not all states have committee data' warns the agent about potential empty results. This goes beyond annotations by alerting to incomplete dataset coverage. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary action and resource. The first sentence states what and when (with include=memberships), the second adds the experimental caveat and sourcing direction. No redundant phrasing; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return format is covered. The description covers the essential context: the lookup key (OCD ID), optional include values (implicitly via schema but also mentioned for memberships), availability caveat, and how to obtain the ID. For a simple fetch-by-ID tool, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for both parameters, so the baseline is 3. The description adds value by explicitly tying committee_id to its source ('from openstates_search_committees results') and by mentioning the effect of include=memberships in its opening sentence, reinforcing the schema's description. It does not add syntax beyond schema but provides operational context that helps correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the function: 'Fetch committee detail by OCD organization ID.' It specifies the exact resource (committee) and the identifying parameter. It also indicates what is returned ('Returns name, classification, and membership roster') and differentiates from sibling search tools by referencing how to obtain the ID from openstates_search_committees.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete usage guidance: it states the prerequisite (obtain committee_id from openstates_search_committees) and flags the experimental nature with state availability caveat. However, it does not explicitly contrast with alternative get_* tools or state when to use search instead, though the 'obtain from' hint implies a workflow. This is clear context but lacks explicit exclusions.
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 | Media links 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 | Document links 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 cover readOnlyHint, openWorldHint, and idempotentHint, so the description need not repeat them. It adds valuable context by stating what is returned (agenda, participants, media links, associated documents) and the experimental limitation. This goes beyond the annotations and gives the agent a fuller understanding of the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no fluff. The primary purpose is front-loaded in the first sentence, with return details and a caveat in the second, and a practical source hint in the third. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (two parameters, one required, an output schema exists, and annotations declare safety properties), the description is fully sufficient. It covers the input source, expected return types, and a limitation. Nothing an agent needs to call the tool 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% for both parameters, so the schema already provides detailed descriptions. The description adds no new information about the parameters beyond what the schema states — the event_id hint ('from openstates_search_events') duplicates the schema's own wording, and the include explanation mirrors the schema's enum descriptions. With full schema coverage, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Fetch full event detail by OCD event ID' which is a clear verb+resource. It distinguishes from sibling tools like openstates_get_bill and openstates_get_committee by focusing specifically on events, and even directs the agent to the correct source tool for the ID, showing awareness of the tool's role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to 'Obtain the event_id from openstates_search_events', which is a clear usage guideline. It also warns that the tool is 'Experimental — event coverage is limited', setting correct expectations. It does not explicitly exclude alternatives, but since this is the only event-fetching tool, the guidance is sufficient.
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 is covered. The description adds value by describing the returned metadata (sessions, identifiers, coverage dates) and accepted ID formats, which goes beyond the annotations. There is no contradiction with the read-only and idempotent hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. It is front-loaded with the action and purpose, then gives the use case and ID formats. Every sentence contributes essential information, making it concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and annotations that cover safety, the description provides everything an agent needs: the purpose, the trigger condition, the parameter formats, and what data to expect. No critical information is missing for correct invocation.
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% and both parameters are well documented in the schema. The description reinforces the jurisdiction_id formats but adds little beyond that. It implies sessions are always included, whereas the 'include' parameter makes them optional, which is slightly ambiguous. Thus the description provides only marginal added value over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('fetch full metadata'), a clear resource ('a specific jurisdiction'), and the key content returned (legislative sessions, identifiers, coverage dates). It also gives a concrete use case (getting session identifiers for bill searches) and names the exact OCD format, which distinguishes it from sibling tools like list_jurisdictions or search_bills.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly instructs when to use this tool: 'Use when you need to know the exact session identifier for a state before filtering bill searches.' This is a strong contextual trigger. However, it does not explicitly mention alternatives or when not to use it, so it falls short of the full 'when-not/alternatives' criterion.
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 readOnlyHint: true, openWorldHint: true, and idempotentHint: true, so the safety profile is covered. The description adds genuinely useful behavior context: the jurisdictional classification nuance ('jurisdiction.classification separates the tiers... current_role.org_classification does not') and the include=offices tip. No contradiction with annotations, and the added context goes beyond what annotations provide, though it doesn't detail pagination or error cases, which are minor.
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 sentences, each packing a distinct piece of information: purpose, tier breakdown, classification nuance, geocoding limitation, and include advice. No repetition of schema text, and the structure front-loads the core action. It is slightly long but does not waste words; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values. It covers all essential operational context: both tiers, classification caveat, no geocoding, and the include trick. For a read-only, idempotent lookup tool, nothing an agent needs to invoke 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 baseline is 3, but the description adds substantial meaning: it gives concrete coordinate examples ('47.6062 for Seattle, WA'), explains the include enum values in detail (offices, links, other_names, etc.), and explicitly calls out that include=offices returns contact information. This is far beyond the schema and helps an agent construct proper calls without guesswork.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Find every legislator representing a geographic coordinate — both tiers,' which is a specific verb, resource, and scope. It immediately distinguishes this from siblings like 'search_people' by focusing on location-based lookup and explicitly mentions both state and federal tiers, making its unique purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states use cases ('constituent-to-representative matching, address-based policy research, and electoral boundary analysis') and provides an important limitation ('This server does not geocode addresses — the caller must provide decimal-degree coordinates'). However, it does not explicitly contrast with alternative tools (e.g., when to prefer search_people), so it lacks an exclusion clause. Still, the context is strong enough to guide an agent.
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 declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is clear. The description adds valuable behavioral context: it reveals the default call returns the complete inventory by 'fetching and merging the pages server-side' (a non-obvious implementation detail), describes the return metadata (latest update times, optional sessions), and warns that session formats vary widely by state. These details go beyond what annotations provide, though it doesn't cover potential rate limits or error cases, which are not critical for this read-only, idempotent tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured: it opens with the core purpose, then details the count and return metadata, follows with a specific use case, and ends with a caveat about session formats. Each sentence adds meaningful information; there's no fluff. It's slightly long but appropriate given the tool's nuances (session formats, include option). The key information is front-loaded, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list endpoint with an output schema (not shown here), the description covers all essential aspects: what it returns, the default complete response, the optional includes, and the primary use case for session discovery. It doesn't explicitly mention the classification or page parameters, but those are fully documented in the schema. Given the output schema exists and annotations cover safety, the description is complete enough for an agent to call the tool correctly without ambiguity.
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 meaning beyond the schema by emphasizing the include parameter's role: 'The legislative_sessions include option returns all historical and current sessions — always check valid session identifiers here before using them in bill searches.' This provides practical guidance on when to set include=legislative_sessions, which is not fully expressed in the schema alone. It also clarifies the default behavior of per_page and classification, but those are already covered in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description immediately states the precise scope: 'List all jurisdictions covered by Open States — all 50 states, DC, and 5 US territories' and notes the total count (56). This is a specific verb+resource definition, and it distinguishes itself from sibling tools by emphasizing it is a list operation, implicitly contrasting with openstates_get_jurisdiction which targets a single entity. The added detail about returning the complete inventory in one call further clarifies the tool's function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this when you need to discover valid session identifiers for a state before calling openstates_search_bills with a session filter.' This gives a clear condition for when to use the tool. It also instructs to 'always check valid session identifiers here before using them in bill searches', which is actionable. However, it does not explicitly mention alternatives like openstates_get_jurisdiction for other use cases, so it lacks a direct comparison for the listing vs. single-jurisdiction scenario.
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 declare readOnlyHint, openWorldHint, and idempotentHint, so the description's job is to add behavioral nuance beyond that. It adds a critical caveat about the upstream timeout for q-only searches, explains the inline include behaviors, and clarifies session discovery via a sibling tool. This is more than just echoing annotations. It does not, however, mention pagination limits or rate limits, but those are less central for a read-only search tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but efficient, packing essential usage rules into six short sentences. The core purpose is front-loaded, followed by the most critical usage caveat (timeout on q-only searches), then concrete recommendations for include and sort, and finally a pointer to a sibling for session IDs. No filler or repetition; every sentence adds value.
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?
For a tool with 15 parameters and a rich filter set, the description covers all the crucial contextual information: the required and recommended parameter combinations, timeout behavior, inline data inclusion, sort semantics, and how to obtain valid session identifiers. The schema already documents individual parameter formats and constraints, and the output schema presumably describes return structure, so the description addresses the higher-level usage context. Nothing essential for correct invocation 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 each parameter has a description, but the tool description significantly amplifies parameter meaning. It explains that q and jurisdiction are conditionally required, how to pair them for reliability, the purpose of include (sponsorships/actions for most research needs), the meaning of sort=latest_action_desc, and where to get session identifiers. This is invaluable guidance that goes well beyond the schema's individual parameter descriptions, directly helping an agent select and combine parameters correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Search state legislative bills across all covered US jurisdictions.' It also immediately distinguishes itself from siblings like openstates_search_committees or openstates_get_bill by emphasizing the search scope and filter dimensions (full-text, jurisdiction, session, subjects, sponsors, sort). The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives actionable guidance: it explains that jurisdiction or q is required, strongly recommends pairing them to avoid timeouts, and gives a concrete example of a timeout (q-only common term). It also recommends include=sponsorships,actions for inline data, sort=latest_action_desc for moving bills, and points to openstates_get_jurisdiction for session identifiers. However, it does not explicitly state when to use this tool over a sibling like openstates_get_bill for a known bill ID, so it's not fully explicit about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openstates_search_committeesSearch CommitteesARead-onlyIdempotentInspect
List committees for a jurisdiction. jurisdiction is required — a request spanning all 56 jurisdictions exceeds the upstream timeout, so scope every call to a single state; use openstates_list_jurisdictions to pick one. Experimental — Open States is actively working to restore committee support and not all states have data. Use chamber to scope to upper (senate) or lower (house) committees. Use classification=subcommittee to find subcommittees of a parent. Use include=memberships to get the full roster with member roles. The coverageNote field in the output will always note the experimental coverage limitations.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-indexed). | |
| parent | No | OCD organization ID of a parent committee to retrieve its subcommittees. | |
| chamber | No | Filter by chamber. "upper" = Senate, "lower" = House/Assembly. | |
| include | No | Related data to inline. "memberships" includes the full roster with member roles. "links" includes the committee homepage and reference links, and "sources" the provenance URLs behind the record. | |
| per_page | No | Results per page. Maximum 20. | |
| jurisdiction | Yes | State name, abbreviation, or OCD-ID. Required — an all-states request exceeds the upstream timeout, so every call must be scoped to a single jurisdiction. | |
| classification | No | Filter to parent committees or subcommittees only. Omit for all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | 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 readOnlyHint, openWorldHint, and idempotentHint. The description adds valuable behavioral context beyond these: notes the experimental nature, coverage gaps (not all states have data), the timeout risk if unscoped, and the coverageNote field in output. This is transparent about limitations and usage constraints without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise despite covering multiple aspects—requirement, timeout warning, experimental status, filter usage, and coverageNote. Each sentence serves a purpose and the most critical constraint (jurisdiction) is front-loaded. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, return values need not be explained. The description covers all essential context: required parameter, timeout constraint, experimental limitations, filter options, and output note. For a 7-parameter tool with an output schema, this is complete and actionable.
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 meaningful parameter guidance: explains the purpose of chamber (upper/lower), classification (subcommittee filtering), and include=memberships (full roster with roles). It also reinforces the critical jurisdiction requirement. This adds value beyond the schema's field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('committees') with an explicit scope ('for a jurisdiction'). It distinguishes itself from sibling search tools by focusing on committees and emphasizing the required jurisdiction scoping. The purpose is unambiguous and distinct from tools like openstates_search_bills or openstates_get_committee.
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?
Provides explicit when-to-use guidance: 'jurisdiction is required' and warns about timeout, directing to openstates_list_jurisdictions as an alternative for picking a state. It also gives concrete usage examples for chamber, classification, and include filters. This is exemplary guidance that prevents misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openstates_search_eventsSearch EventsARead-onlyIdempotentInspect
Search hearings, floor sessions, and committee meetings. jurisdiction is required — the Open States events endpoint has no all-states search, so scope every call to a single state; use openstates_list_jurisdictions to pick one. Experimental — most states do not publish event data to Open States. Use after and before to scope to a date range. Set require_bills=true to filter to events with bills on the agenda, which is the most useful filter for tracking legislation through committee. Use include=agenda,participants for full meeting context. Empty results often indicate the state lacks event data rather than no events occurring.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-indexed). | |
| after | No | ISO 8601 datetime — events starting after this time. Use to find upcoming hearings. | |
| before | No | ISO 8601 datetime — events starting before this time. | |
| include | No | Related data to inline. "agenda" includes the meeting agenda with bill references. "participants" includes the committee or chamber hosting the event. "links" and "media" add related URLs and recordings, "documents" the attached files, and "sources" the provenance URLs behind the record. | |
| per_page | No | Results per page. Maximum 20. | |
| jurisdiction | Yes | State name, abbreviation, or OCD-ID. Required — the Open States events endpoint has no all-states search, so every call must be scoped to a single jurisdiction. | |
| require_bills | No | When true, only return events with at least one bill on the agenda. Most useful for tracking legislation through committee. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | 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 declare readOnlyHint, openWorldHint, and idempotentHint, which cover safety and repeatability. The description adds meaningful behavioral context beyond that: the experimental nature, the fact that most states lack event data, and the interpretation of empty results. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is about four sentences and front-loads the core purpose and the mandatory jurisdiction constraint. It is reasonably tight, though some advice (like require_bills and include) is also present in the schema and could be considered slightly redundant, keeping it from a 5.
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 need not explain return values. It covers the sole required parameter, the experimental caveat, common filters, and empty-result interpretation—everything an agent needs to correctly scope and call the tool. It is fully complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so each parameter already has solid descriptions. The description adds extra value by explaining the rationale behind jurisdiction (no all-states search), suggesting after for upcoming hearings, and highlighting require_bills for tracking legislation. This goes just beyond the schema, warranting a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches hearings, floor sessions, and committee meetings, which is a specific verb and resource. It distinguishes from sibling get_event by focusing on search, and the opening sentence leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit, actionable guidance: jurisdiction is required and why, use openstates_list_jurisdictions to choose one, use after/before for date scoping, require_bills for filtering, and include for context. It also warns about experimental status and how to interpret empty results, which directly informs usage decisions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openstates_search_peopleSearch PeopleARead-onlyIdempotentInspect
Search state legislators and officials by name, jurisdiction, chamber, or district, or fetch specific people by OCD person ID. Party is reported on every result but cannot be filtered on — narrow by party after the call. Either jurisdiction or id is required — a search spanning all 56 jurisdictions exceeds the upstream timeout, including a name-only one, so scope every call to a single state or to specific person IDs. Use openstates_list_jurisdictions to pick a jurisdiction, or openstates_get_legislators_by_location when you have coordinates but no state. id takes the person IDs that openstates_get_bill sponsorships and openstates_get_committee memberships hand back, and resolves any number of them in one call. Supports name substring matching (case-insensitive). org_classification targets a role type: "upper" for Senate, "lower" for House/Assembly, "executive" for governors and executive officials, and "legislature" for every legislator — both chambers merged into one paginated set (all upper members, then all lower), which excludes executive-branch officials. Omitting org_classification is not the same as "legislature": it returns every officeholder, executive officials included. include=offices adds phone, fax, and address. include=links adds website and social links.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | OCD person IDs (e.g., "ocd-person/9eddb3cd-868e-42ba-831a-b415fd7ed445"). Required unless jurisdiction is provided — it returns exactly these people, so it scopes the call on its own and needs no jurisdiction alongside it. Resolves the IDs that openstates_search_people results, openstates_get_bill sponsorships[].person.id, and openstates_get_committee memberships[].person_id hand back — any number of them in one call, subject to per_page. An ID Open States does not know matches nothing rather than failing, as does an ID paired with a jurisdiction that person does not belong to. | |
| name | No | Name or partial name to match (case-insensitive substring). Narrows within the jurisdiction; it does not substitute for one. | |
| page | No | Page number (1-indexed). | |
| include | No | Related data to inline. "offices" includes phone, fax, and address. "links" includes website and social links. "other_names" includes alternate/former names, "other_identifiers" cross-system IDs, and "sources" the provenance URLs behind the record. | |
| district | No | District label (e.g., "1", "37", "At-Large"). Formats vary by state. | |
| per_page | No | Results per page. Maximum 20. | |
| jurisdiction | No | State name, abbreviation, or OCD-ID. Required unless id is provided — an all-states search exceeds the upstream timeout, so every call must be scoped to a single jurisdiction or to specific person IDs. | |
| org_classification | No | Filter by role type. "upper" = Senate, "lower" = House/Assembly, "executive" = governors and executive officials, "legislature" = every legislator (both chambers merged into one paginated set, all upper members then all lower, excluding executive officials). Omitting this filter returns every officeholder including executive ones — it is not equivalent to "legislature". |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | 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 readOnlyHint, openWorldHint, and idempotentHint, so safety and non-mutating behavior are covered. The description goes beyond that with critical behavioral details: the all-jurisdiction timeout, the page-ordering semantics for 'legislature' (upper then lower), the non-equivalence of omitting org_classification vs 'legislature', and the behavior of include options. This adds meaningful context not present in annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a dense paragraph but is front-loaded with purpose and core constraints. Each sentence adds distinct information (timeout, alternatives, ID usage, include options, org_classification nuance). While it is long, it earns its length given the tool's complexity. It could be restructured with bullets for readability, but no sentence 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?
The tool has 8 parameters, an output schema, and complex filtering logic. The description covers all the essential usage aspects: the required scoping, the distinction between filters, the integration with other tools' output IDs, and the behavior of include options. It leaves nothing ambiguous for an agent to resolve at runtime.
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 documents each parameter in detail (e.g., id, jurisdiction, org_classification, include). The description reinforces but does not significantly extend parameter semantics beyond what the schema provides. For instance, the optionality and timeout constraint are restated, but the schema already explains the required-ness and the meaning of org_classification values. Thus baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the exact resource ('state legislators and officials'), the actions ('search by name, jurisdiction, chamber, or district, or fetch specific people by OCD person ID'), and clearly distinguishes it from sibling search tools. It uses specific verbs and mentions the key distinguishing capability (fetching by ID), which sets it apart from openstates_search_bills, _committees, and _events.
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?
Provides explicit when-to-use and when-not-to-use guidance: 'Use openstates_list_jurisdictions to pick a jurisdiction, or openstates_get_legislators_by_location when you have coordinates but no state.' It also states the hard constraint that jurisdiction or id is required and explains the timeout limitation, which tells the agent not to attempt unscoped searches. The alternatives are named and conditions for choosing them are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user or an account that owns the GitHub organization, then choose Claim with GitHub.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
Search bills and speaker-attributed hearing transcripts across all 50 US state legislatures.
Search 209k+ US state bills, all 50 states + DC: full text, sponsors, votes, status. Free.
OpenStates MCP — bills, legislators, votes in all 50 US states
U.S. federal policy data — bills, Congress members, voting records, and civic info.
Related MCP Servers
- AlicenseAqualityCmaintenanceSearch bills and speaker-attributed hearing transcripts across all 50 US state legislatures.71MIT
- 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.102110MIT
- AlicenseNot gradedqualityCmaintenanceAccess U.S. state legislative data including bills, legislators, and votes across all 50 states via the OpenStates API.11MIT
- AlicenseAqualityDmaintenanceProvides tools to search and retrieve US federal and state legislative data, including bills, votes, campaign contributions, and legislator information, with provenance tracking.81MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
Each tool serves a distinct purpose: get_* fetches a single entity by ID, search_* finds multiple entities via criteria, and list_jurisdictions enumerates all jurisdictions. The location-based people lookup is unique and clearly differentiated from name-based search_people. No two tools have overlapping functionality.
All tools follow a consistent pattern: openstates_<action>_<entity>, where actions are either get (singular fetch), search (query-based), or list (enumerate all). The entity names are consistent (bill, committee, event, jurisdiction, people) and the special 'legislators_by_location' still fits the verb_noun structure. No mixed conventions or vague verbs.
10 tools is well within the optimal 3-15 range. The server covers the primary legislative data entities—bills, committees, events, jurisdictions, and people—without redundancy. Each tool earns its place for a comprehensive public policy data API.
The surface provides full read capability for the domain: search and detail retrieval for all core entities, jurisdiction metadata listing, and a special location-based people lookup. Given the read-only nature of the data source, there are no obvious gaps—every plausible query scenario is addressed.