Public, open-source legislative search for all 50 US states + DC. Provides structured JSON with canonical ids, official source_url fields, retrieved_at freshness timestamps, and explicit official-vs-derived labeling.
Bill Commons MCP server demonstrates solid definition quality with well-structured tools, comprehensive parameter schemas, and detailed descriptions. All 11 tools have clear verb-noun naming (search_, get_, compare_, find_, trace_, build_, list_) and descriptions ranging 100-400+ characters. Input schemas are complete with typed parameters and descriptions. However, output schemas are not explicitly documented in the visible code, and error handling guidance is minimal. Tool descriptions are LLM-optimized but could be more concise (some exceed 200 chars). No tool annotations (readOnlyHint, destructiveHint) are visible despite all tools being read-only operations.
Compile a citation-ready evidence packet for a bill: full official record, legislative history timeline, votes with member-level detail, and hearings -- each explicitly labeled official vs. derived with source URLs. Returns a `how_to_cite` block with a one-line `cite_as` sentence, a human `permalink`, a JSON `download_url`, and a `snapshot_id` that changes if and only if a cited fact about the bill changes -- so a reader can check later whether the citation still holds. Snapshots are NOT archived; the id is a change detector, not a way to retrieve an older packet. Pass `question` to record what the packet was assembled to answer; it is echoed into the artifact so a filed packet carries its own scope.
Deterministic diff (unified + structured) between two versions of a bill's extracted text. Defaults to earliest vs. latest texted version if version ids are omitted. Errors if fewer than 2 versions have extracted text. Result is labeled 'derived' (computed by Bill Commons, not an official document).
Find bills with similar titles via deterministic trigram similarity, across jurisdictions. Labeled 'derived' -- not an official cross-reference or companion-bill designation.
List legislative sessions currently flagged active, optionally filtered by jurisdiction (two-letter state code or name).
Output schemas not documented in visible code. Tools return JSON-serializable dicts but LLMs cannot see field structure, types, or required fields. Downstream tool chaining and field extraction become error-prone.
No tool annotations visible (readOnlyHint, destructiveHint, idempotentHint). All 11 tools are read-only and idempotent, annotating them would help LLMs understand safety and retry semantics without reading descriptions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2026-07-28+ | v2 |
Fetch the full record for one bill: metadata, sponsors, subjects, actions, versions, and vote-event summaries. Look up by canonical bill_id (UUID), or by jurisdiction + identifier (+ optional session to disambiguate).
Return the jurisdiction_coverage state-machine status for one state (abbreviation or name), or the full 51-jurisdiction coverage matrix if state is omitted.
List upcoming (future-dated) legislative hearings/events, optionally filtered by jurisdiction and/or bill.
Fetch vote event(s) with member-level (yes/no/other/absent) vote records. Provide vote_event_id for one vote, or bill_id for all recorded votes on that bill.
List Bill Commons' curated cross-state topic trackers (e.g. artificial intelligence, youth online safety, platform accountability, cybersecurity, cryptocurrency, data privacy, local government & preemption) -- the entry point for "what subjects does Bill Commons track across all 50 states + DC" and "how do I get every bill in one". Each topic is a title/subject membership rule tuned for precision over recall, with a live bill_count and how_to_fetch_bills. This tool does not itself return bill rows -- pair it with search_legislation or the REST API's /topics/{slug} for the bills.
Search FULL BILL TEXT -- not just known-bill-number lookup. `q` is matched against titles, descriptions, AND ingested document text via Postgres websearch_to_tsquery (supports "quoted phrases", OR, and -exclusion, same syntax as a search engine), with a fuzzy pg_trgm title-similarity fallback when the exact query has no hits. `q` can ALSO be a bill number ("HB 123", "H.B. 123", "hb123" all match) and that fast path is tried first. Optionally filter by jurisdiction (two-letter state code or name), chamber, and status.
Full chronological legislative history for a bill: merged timeline of actions, version publications, and votes, plus related-bill links.
Error handling guidance minimal. Tools return 'error' or 'coverage_warning' keys but no recovery hints. E.g., if a bill_id is invalid, the LLM gets no suggestion to try search_legislation first.
Some descriptions exceed 200 characters (e.g., search_legislation at ~350 chars, build_legislative_evidence_packet at ~400 chars). Baseline for A+ tools is 50-200 chars. Verbose descriptions waste tokens and bury key intent.
Parameter 'limit' lacks explicit min/max constraints in schema. Tools accept limit up to 50 but no JSON Schema minItems/maxItems visible. LLMs may pass invalid values.