MCP server for US federal and state legislative civic data
Civic-awareness-mcp has 17 tools with consistent naming (verb_noun pattern: recent_*, search_*, get_*, resolve_*, entity_*) and comprehensive descriptions (avg 180 chars, well above 10-char minimum). All tools are READ_ONLY with clear risk classification. Input schemas are present with typed parameters and descriptions. However, output schemas are not documented in the source code provided, only inferred from handler names. Parameter descriptions lack constraint details (enums, ranges, formats). No error handling guidance visible. Tool composition is sound (each does one thing), but descriptions could be more LLM-optimized with dependency hints and when-to-use guidance.
Given an entity ID, return co-occurrence edges to other entities via shared documents (bills, votes, contributions). Supports depth=1 (direct) or depth=2 (through one hop). Edges are capped at 100 and sorted by co_occurrence_count descending; truncated flag signals whether the cap was hit. Useful for 'who works with this legislator most' queries.
Given an entity ID, return co-occurrence edges to other entities via shared state bills. Supports depth=1 (direct) or depth=2 (through one hop). Edges are capped at 100 and sorted by co_occurrence_count descending.
Fetch full detail for a single state bill including actions, versions, sponsors, and subjects. Requires jurisdiction, session, and identifier.
Fetch a single entity by ID with recent related documents. For Persons, returns the cross-jurisdiction roles[] history spanning federal offices and campaign candidacies.
Fetch a single entity by ID with recent related documents. For state Persons, returns the cross-jurisdiction roles[] history.
Fetch full detail for a single roll-call vote, including per-legislator positions (entity_id, name, party, state, yea/nay/present/not_voting). Pass either `vote_id` (the documents.id returned by recent_votes) OR the federal composite `{ congress, chamber, session, roll_number }`. Federal (Congress.gov) only.
Output schemas not documented. Tool descriptions state what is returned (e.g., 'returns co-occurrence edges', 'returns matching Person entities') but formal output schema definitions are absent from visible source. LLMs cannot plan downstream tool calls or extract fields without knowing response structure.
Parameter constraints not specified. Numeric parameters (days, limit, depth, congress, session, roll_number) lack min/max bounds. String parameters (jurisdiction, chamber, role_hint) lack enum declarations or format patterns. LLMs will pass invalid values (e.g., days=999999, depth=5) without validation guidance.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
List recently-updated U.S. federal legislative bills from Congress.gov.
List U.S. state legislative bills from OpenStates. Defaults to the last `days` (default 7) of recently-updated bills. Optional filters: chamber, session, sponsor_entity_id (civic entity UUID, resolved to OpenStates OCD id), classification, subject, introduced_since/until, updated_since/until, sort. Any explicit date range overrides `days`. Pass a jurisdiction like 'us-tx' or 'us-ca'; '*' queries all cached jurisdictions locally. Useful for 'what did this legislator introduce' and 'recent bills on <subject>' queries.
List itemized federal campaign contributions from OpenFEC. A date window (from/to ISO datetimes) is required. Optionally filter by candidate or committee name and minimum amount. Contributor addresses and employer information are never exposed.
List recent roll-call votes for a U.S. federal jurisdiction (Congress.gov). Optionally filter by chamber (upper=Senate, lower=House) or bill identifier.
List recent roll-call votes from state legislatures via OpenStates. Pass a jurisdiction like 'us-tx' or 'us-ca'. Votes are sourced from recently-updated bills with embedded vote data. Use '*' to query all cached jurisdictions locally.
Disambiguate a person by name across state legislators. Returns all matching Person entities with confidence tiers. Supply jurisdiction_hint to trigger upstream OpenStates hydration.
Disambiguate a person by name. Returns all matching Person entities with confidence tiers (exact > alias > fuzzy) and disambiguators (role + jurisdiction + time span per role). Optional jurisdiction_hint and role_hint activate fuzzy matching — without a hint, fuzzy matches are suppressed to avoid false positives.
Search civic documents (U.S. federal bills, votes, and campaign contributions) by title.
Search state civic documents (bills) by title. Optionally filter by jurisdiction, kind, source, or date range.
Search for people or organizations by name across federal Congress and campaign committees.
Search for people or organizations by name across state legislatures (OpenStates). Pass a jurisdiction to trigger upstream hydration.
Error handling guidance absent. No visible error recovery paths, retryability classification, or actionable error messages. E.g., 'entity not found' should suggest 'Try search_entities() first' or 'Try resolve_person() with a jurisdiction_hint'. Agents cannot self-correct without guidance.
Duplicate tool names across federal and state scopes. 'recent_bills', 'search_entities', 'resolve_person', 'get_entity', 'entity_connections', 'search_civic_documents', 'recent_votes' appear in both federal and state servers. When both servers are loaded, LLM cannot disambiguate which to call. Recommend namespace prefix (e.g., 'federal_recent_bills', 'state_recent_bills') or separate server instances.
Dependency hints missing. Tools like 'get_entity' and 'entity_connections' require an entity_id, but descriptions do not explain how to obtain one (via search_entities or resolve_person). Multi-step workflows are not documented, forcing LLMs to infer the call sequence.