Skip to main content
Glama

Search Bills

openstates_search_bills
Read-onlyIdempotent

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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
qNoFull-text search across bill titles, abstracts, and text. Required unless jurisdiction is provided. Pair it with jurisdiction whenever a state is known — a q-only search over every jurisdiction times out upstream for a common term.
pageNoPage number (1-indexed).
sortNoSort order. Use "latest_action_desc" for bills currently moving through the legislature.updated_desc
chamberNoFilter by originating chamber. "upper" = Senate, "lower" = House/Assembly.
includeNoRelated data to inline. "sponsorships" and "actions" cover most research needs without a separate openstates_get_bill call. "votes" adds full vote tallies and per-legislator positions.
sessionNoSession identifier (e.g., "2025", "2025-2026", "2025rs"). Use openstates_get_jurisdiction with include=legislative_sessions to discover valid values. Omit to search across all sessions.
sponsorNoFilter by sponsor name or OCD person ID.
subjectNoFilter to bills tagged with one or more subject categories.
per_pageNoResults per page. Maximum 20. Default 10.
action_sinceNoISO 8601 date — only return bills with an action after this date (e.g., "2025-01-01").
jurisdictionNoState name, two-letter abbreviation, or OCD-ID (e.g., "Washington", "wa", or "ocd-jurisdiction/country:us/state:wa/government"). Required unless q is provided.
created_sinceNoISO 8601 date — only return bills first entered in Open States after this date (e.g., "2025-01-01"). Use to find newly-introduced bills, as opposed to recently-updated or recently-acted-on.
updated_sinceNoISO 8601 date — only return bills updated after this date (e.g., "2025-01-01").
classificationNoBill classification: "bill", "resolution", "constitutional amendment", etc.
sponsor_classificationNoFilter sponsor type: "primary", "cosponsor".

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
pageNoCurrent page returned.
errorNoPresent when the call failed. Absent on success.
noticeNoRecovery hint when results are empty — names every filter that narrowed the query and suggests how to broaden. Absent when results are returned.
maxPageNoTotal pages available.
resultsNoBills matching the search criteria.
paginationNoPagination metadata.
totalCountNoTotal bills matching the query across all pages.
appliedFiltersNoFilters applied to this query as the server received them, for agent self-verification of zero or unexpected results.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changed
    • removedOutput schema / properties / results / items / properties / first_action_date / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / results / items / properties / first_action_date / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / results / items / properties / latest_action_date / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / results / items / properties / latest_action_date / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / results / items / properties / latest_action_description / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / results / items / properties / latest_action_description / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / results / items / properties / latest_passage_date / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / results / items / properties / latest_passage_date / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  2. Changed6 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "results",
      +      "pagination",
      +      "totalCount",
      +      "page",
      +      "maxPage",
      +      "appliedFilters"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added 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"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "results",
      -  "pagination",
      -  "totalCount",
      -  "page",
      -  "maxPage",
      -  "appliedFilters"
      -]
  3. Changed2 schema fields changed
    • addedInput schema / properties / jurisdiction / minLength
      Added value: +1
    • addedInput schema / properties / q / minLength
      Added value: +1
  4. Changed10 schema fields changed
    • changedOutput schema / properties / results / items / properties / abstracts / items / properties / note / description
      Previous value: -"Source note."New value: +"Source note. Empty string when Open States recorded no note."
    • changedOutput schema / properties / results / items / properties / actions / items / properties / date / description
      Previous value: -"Action date."New value: +"Action date. Empty string when Open States recorded no date."
    • changedOutput schema / properties / results / items / properties / documents / items / properties / date / description
      Previous value: -"Document date."New value: +"Document date. Empty string when Open States recorded no date, which is the usual case for bill documents."
    • changedOutput schema / properties / results / items / properties / documents / items / properties / note / description
      Previous value: -"Document note."New value: +"Document note. Empty string when Open States recorded no note."
    • changedOutput schema / properties / results / items / properties / other_titles / items / properties / note / description
      Previous value: -"Note describing the alternate title."New value: +"Note describing the alternate title. Empty string when Open States recorded no note."
    • changedOutput schema / properties / results / items / properties / sources / items / properties / note / description
      Previous value: -"Source note."New value: +"Source note. Empty string when Open States recorded no note."
    • changedOutput schema / properties / results / items / properties / sponsorships / items / properties / person / properties / id / description
      Previous 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."
    • changedOutput schema / properties / results / items / properties / versions / items / properties / date / description
      Previous value: -"Version date."New value: +"Version date. Empty string when Open States recorded no date, which is the usual case for bill versions."
    • changedOutput schema / properties / results / items / properties / versions / items / properties / note / description
      Previous value: -"Version note."New value: +"Version note. Empty string when Open States recorded no note."
    • changedOutput schema / properties / results / items / properties / votes / items / properties / start_date / description
      Previous value: -"Vote date."New value: +"Vote date. Empty string when Open States recorded no date."
  5. Changed6 schema fields changed
    • addedOutput schema / properties / appliedFilters / properties / sponsor
      Added value: +{
      +  "description": "Sponsor filter as received.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / appliedFilters / properties / sponsor_classification
      Added value: +{
      +  "description": "Sponsor-type filter as received.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / appliedFilters / properties / subject
      Added value: +{
      +  "description": "Subject tags filtered on, as received. Absent when none were supplied.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / notice / description
      Previous 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."
    • changedOutput schema / properties / results / items / properties / other_identifiers / items / properties / scheme / description
      Previous 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."
    • changedOutput schema / properties / results / items / properties / other_identifiers / items / required
      Previous value: -[
      -  "identifier",
      -  "scheme"
      -]New value: +[
      +  "identifier"
      +]
  6. Changed4 schema fields changed
    • changedInput schema / properties / q / description
      Previous 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."
    • addedOutput schema / properties / results / items / properties / openstates_url
      Added value: +{
      +  "description": "Citable Open States page for this bill.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / results / items / properties / sponsorships / items / properties / person
      Added 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"
      +}
    • addedOutput schema / properties / results / items / properties / updated_at
      Added value: +{
      +  "description": "Timestamp Open States last updated this record — the field the default sort=updated_desc orders by.",
      +  "type": "string"
      +}
  7. Changed7 schema fields changed
    • addedOutput schema / properties / results / items / properties / documents
      Added 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"
      +}
    • addedOutput schema / properties / results / items / properties / other_identifiers
      Added 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"
      +}
    • addedOutput schema / properties / results / items / properties / other_titles
      Added 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"
      +}
    • addedOutput schema / properties / results / items / properties / related_bills
      Added 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"
      +}
    • addedOutput schema / properties / results / items / properties / sources
      Added 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"
      +}
    • addedOutput schema / properties / results / items / properties / versions
      Added 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"
      +}
    • addedOutput schema / properties / results / items / properties / votes
      Added 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"
      +}
  8. Changed2 schema fields changed
    • addedInput schema / properties / created_since
      Added 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"
      +}
    • addedOutput schema / properties / appliedFilters / properties / created_since
      Added value: +{
      +  "description": "created_since date filter as received.",
      +  "type": "string"
      +}
  9. Changed6 schema fields changed
    • changedInput schema / properties / action_since / description
      Previous 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\")."
    • addedInput schema / properties / action_since / pattern
      Added value: +"^\\d{4}-\\d{2}-\\d{2}(T[\\d:.Z+-]+)?$"
    • changedInput schema / properties / updated_since / description
      Previous 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\")."
    • addedInput schema / properties / updated_since / pattern
      Added value: +"^\\d{4}-\\d{2}-\\d{2}(T[\\d:.Z+-]+)?$"
    • addedOutput schema / properties / appliedFilters
      Added 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"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "results",
      -  "pagination",
      -  "totalCount",
      -  "page",
      -  "maxPage"
      -]New value: +[
      +  "results",
      +  "pagination",
      +  "totalCount",
      +  "page",
      +  "maxPage",
      +  "appliedFilters"
      +]
  10. Changed3 schema fields changed
    • addedOutput schema / properties / totalCount
      Added value: +{
      +  "description": "Total bills matching the query across all pages.",
      +  "type": "number"
      +}
    • removedOutput schema / properties / totalItems
      Removed value: -{
      -  "description": "Total bills matching the query across all pages.",
      -  "type": "number"
      -}
    • changedOutput schema / required
      Previous value: -[
      -  "results",
      -  "pagination",
      -  "totalItems",
      -  "page",
      -  "maxPage"
      -]New value: +[
      +  "results",
      +  "pagination",
      +  "totalCount",
      +  "page",
      +  "maxPage"
      +]
  11. Changed6 schema fields changed
    • addedOutput schema / properties / maxPage
      Added value: +{
      +  "description": "Total pages available.",
      +  "type": "number"
      +}
    • removedOutput schema / properties / message
      Removed value: -{
      -  "description": "Recovery hint when results are empty — echoes the filters applied and suggests how to broaden. Absent when results are returned.",
      -  "type": "string"
      -}
    • addedOutput schema / properties / notice
      Added value: +{
      +  "description": "Recovery hint when results are empty — echoes the filters applied and suggests how to broaden. Absent when results are returned.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / page
      Added value: +{
      +  "description": "Current page returned.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / totalItems
      Added value: +{
      +  "description": "Total bills matching the query across all pages.",
      +  "type": "number"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "results",
      -  "pagination"
      -]New value: +[
      +  "results",
      +  "pagination",
      +  "totalItems",
      +  "page",
      +  "maxPage"
      +]
  12. First observed

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry readOnlyHint, openWorldHint, and idempotentHint, and the description adds a genuine failure-mode disclosure: q-only search spans all 56 jurisdictions and can exceed the upstream timeout for common terms. It also surfaces the inline include behavior and session-discovery path. Much of this context is mirrored in the rich schema, so the incremental value beyond annotations is real but not extensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each earning its place: purpose, the critical pairing/timeout caveat, the two most useful invocation tweaks, and the session-discovery pointer. The most important behavioral warning is front-loaded immediately after the purpose statement, with zero filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter search tool with a full output schema and strong annotations, nothing essential is missing: required-parameter logic, the timeout risk, session discovery, and filter/sort guidance are all covered. The rich input schema and output schema relieve the description of return-format and pagination duties.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with unusually detailed per-parameter descriptions, so the baseline 3 applies. The description restates the q/jurisdiction requirement and the include/sort tips, but it adds little meaning beyond what the input schema already provides for the 15 parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+scope: 'Search state legislative bills across all covered US jurisdictions.' This clearly distinguishes it from sibling search_committees, search_events, and search_people, and from openstates_get_bill, which retrieves a single bill by ID. 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit invocation conditions: 'Either jurisdiction or q (full-text) is required, and pairing them is the reliable form,' and warns that a q-only search 'exceeds the upstream timeout for a common term.' It names openstates_get_jurisdiction as the sibling to use for discovering valid session identifiers, and recommends sort=latest_action_desc for bills currently moving.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.