bill-commons

Search 209k+ US state bills, all 50 states + DC: full text, sponsors, votes, status. Free.

Should I use this

Quality & Safety

A
Description quality
97%
Schema completeness
58%
Naming quality
96%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (2)

  • LOWTool 'get_jurisdiction_coverage' description lacks action verbin get_jurisdiction_coverage
  • LOWTool 'build_legislative_evidence_packet' name length outside 3-30 rangein build_legislative_evidence_packet

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,783Tokens (tool definitions)
~830 BTypical response size
Moderate attention impact (1.39% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "bill-commons": {
      "url": "https://mcp.billcommons.org/mcp"
    }
  }
}

Remote endpoints

https://mcp.billcommons.org/mcpstreamable-http

What it can do

Tool inventory

Tools (11)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢search_legislation(q, jurisdiction, chamber, status, limit)

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. For a curated cross-state slice of a subject (e.g. "every AI bill in the country") rather than an ad-hoc keyword search, call list_topics first -- its membership rules also match on structured subject tags this full-text search does not see.

Input Schema

{
  "type": "object",
  "properties": {
    "q": {
      "title": "Q",
      "type": "string"
    },
    "jurisdiction": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Jurisdiction"
    },
    "chamber": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Chamber"
    },
    "status": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Status"
    },
    "limit": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Limit"
    }
  },
  "required": [
    "q"
  ],
  "title": "search_legislationArguments"
}
🟢get_bill_record(bill_id, jurisdiction, session, identifier, include_full_text)

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). For a human bill number like HB 123, use jurisdiction="NC", identifier="HB 123"; bill_id is for UUIDs.

Input Schema

{
  "type": "object",
  "properties": {
    "bill_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Bill Id"
    },
    "jurisdiction": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Jurisdiction"
    },
    "session": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Session"
    },
    "identifier": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Identifier"
    },
    "include_full_text": {
      "default": false,
      "title": "Include Full Text",
      "type": "boolean"
    }
  },
  "title": "get_bill_recordArguments"
}
⚪compare_bill_versions(bill_id, version_id_a, version_id_b)

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

Input Schema

{
  "type": "object",
  "properties": {
    "bill_id": {
      "title": "Bill Id",
      "type": "string"
    },
    "version_id_a": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Version Id A"
    },
    "version_id_b": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Version Id B"
    }
  },
  "required": [
    "bill_id"
  ],
  "title": "compare_bill_versionsArguments"
}
🟢find_similar_bills(bill_id, limit)

Find bills with similar titles via deterministic trigram similarity, across jurisdictions. Labeled 'derived' -- not an official cross-reference or companion-bill designation.

Input Schema

{
  "type": "object",
  "properties": {
    "bill_id": {
      "title": "Bill Id",
      "type": "string"
    },
    "limit": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Limit"
    }
  },
  "required": [
    "bill_id"
  ],
  "title": "find_similar_billsArguments"
}
🟢get_vote_details(vote_event_id, bill_id)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "vote_event_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Vote Event Id"
    },
    "bill_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Bill Id"
    }
  },
  "title": "get_vote_detailsArguments"
}
🟢get_upcoming_hearings(jurisdiction, bill_id, limit)

List upcoming (future-dated) legislative hearings/events, optionally filtered by jurisdiction and/or bill.

Input Schema

{
  "type": "object",
  "properties": {
    "jurisdiction": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Jurisdiction"
    },
    "bill_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Bill Id"
    },
    "limit": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Limit"
    }
  },
  "title": "get_upcoming_hearingsArguments"
}
⚪trace_legislative_history(bill_id)

Full chronological legislative history for a bill: merged timeline of actions, version publications, and votes, plus related-bill links.

Input Schema

{
  "type": "object",
  "properties": {
    "bill_id": {
      "title": "Bill Id",
      "type": "string"
    }
  },
  "required": [
    "bill_id"
  ],
  "title": "trace_legislative_historyArguments"
}
🟡build_legislative_evidence_packet(bill_id, include_full_text, question)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "bill_id": {
      "title": "Bill Id",
      "type": "string"
    },
    "include_full_text": {
      "default": false,
      "title": "Include Full Text",
      "type": "boolean"
    },
    "question": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Question"
    }
  },
  "required": [
    "bill_id"
  ],
  "title": "build_legislative_evidence_packetArguments"
}
🟢get_jurisdiction_coverage(state)

Return the jurisdiction_coverage state-machine status for one state (abbreviation or name), or the full 51-jurisdiction coverage matrix if state is omitted.

Input Schema

{
  "type": "object",
  "properties": {
    "state": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "State"
    }
  },
  "title": "get_jurisdiction_coverageArguments"
}
🟢get_active_sessions(jurisdiction)

List legislative sessions currently flagged active, optionally filtered by jurisdiction (two-letter state code or name).

Input Schema

{
  "type": "object",
  "properties": {
    "jurisdiction": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Jurisdiction"
    }
  },
  "title": "get_active_sessionsArguments"
}
🟢list_topics

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.

Input Schema

{
  "type": "object",
  "properties": {},
  "title": "list_topicsArguments"
}

Recommended Prompts

search_research
Search for information about [topic] using bill-commons
Expected tools: search_legislation
find_specific
Find [specific item] using bill-commons
Expected tools: search_legislation
retrieve_data
Get details about [item] from bill-commons
Expected tools: get_bill_record
fetch_info
Fetch [information type] using bill-commons
Expected tools: get_bill_record
list_items
List all [items] available in bill-commons
Expected tools: list_topics

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded11 tools
verifiedversion not recorded11 tools