Koskamo

Delilah MCP

An official MCP server provided by Delilah that connects AI agents to real-time U.S. legislative data. It allows users to track bills, view roll-call votes, identify legislators, and access election information for all 50 states, D.C., and Congress, with explanations in plain English.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Delilah MCP logo, by DelilahVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-08Operated by Delilah
MCP endpoint (Streamable HTTP)
https://mcp.delilahusa.com/
Vendor documentation

What its tools do

43 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

43 of 43 have a description · 43 of 43 declare behavior hints · 38 of 41 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Endpoint and vendor documentation share a domain
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Track live U.S. bills and their status
  • View roll-call votes and lawmaker positions
  • Access election data for all 50 states and Congress
  • Get plain English explanations of legislation

Source and maintenance

Vendor evidence
mcp-registry: com.delilahusa/legislation@0.7.2

Protocol and capabilities

Server
legislation 0.8.1
MCP protocol negotiated in check
2025-11-25
Tools
43 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Delilah gives you real U.S. legislative data for all 50 states, D.C. and Congress: bills, sponsors, roll-call votes with individual member positions, action history, bill texts, committees, hearings, session analytics, legislator scorecards, trending bills, the 2026 election slate, a change feed and per-state coverage. Search with semantic_search_bills (a plain-English question) or search_bills (structured filters), then pull the full record with get_bill detail:true. status_id: 1=Introduced, 2=In Committee, 3=Passed One Chamber, 4=Passed Both Chambers, 5=Signed into Law, 6=Vetoed, 7=Failed/Dead, 8=Chaptered. passed={4,5,8}, failed={6,7}, alive={1,2,3}. You are on the shared free tier (no API key was supplied). It is rate-limited per client and shares one monthly cap with every other free user. For your own cap, pass a Delilah API key as Authorization: Bearer <key> — get one at https://delilahusa.com/developers/request.

Tools

43 advertised

search_bills — Search bills
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Search or list legislation with structured filters (GET /v1/bills). Use this when you know the jurisdiction, sponsor, topic, or status you want. Every filter is optional and they combine with AND. A bill number typed into q (e.g. 'HB 1', 'SB0002') matches that bill directly. Returns bill summaries plus pagination; call get_bill for the full record. Corpus is 2026-forward only. status_id values: 1=Introduced, 2=In Committee, 3=Passed One Chamber, 4=Passed Both Chambers (for a simple resolution, bill_type_id 2: Adopted, its final step), 5=Signed into Law, 6=Vetoed, 7=Failed/Dead, 8=Chaptered. Aggregate buckets: passed={4,5,8}, failed={6,7}, alive={1,2,3}.

search_bills input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "q": {
      "type": "string",
      "description": "Free-text search across title, description, and subject names."
    },
    "limit": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1,
      "description": "Max rows to return (default 25)."
    },
    "state": {
      "type": "string",
      "description": "2-letter postal code (e.g. FL), DC, or US for Congress."
    },
    "topic": {
      "type": "string",
      "description": "Canonical topic slug, e.g. 'healthcare'. See list_topics."
    },
    "offset": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "Pagination offset."
    },
    "subject": {
      "type": "string",
      "description": "Raw subject name (ILIKE match)."
    },
    "status_id": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Filter by status. status_id values: 1=Introduced, 2=In Committee, 3=Passed One Chamber, 4=Passed Both Chambers (for a simple resolution, bill_type_id 2: Adopted, its final step), 5=Signed into Law, 6=Vetoed, 7=Failed/Dead, 8=Chaptered. Aggregate buckets: passed={4,5,8}, failed={6,7}, alive={1,2,3}."
    },
    "session_id": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Narrow to one session."
    },
    "bill_number": {
      "type": "string",
      "description": "Bill number, compact (HB1) or padded (HB0001)."
    },
    "updated_since": {
      "type": "string",
      "description": "ISO-8601 date or timestamp; only bills changed since then."
    },
    "title_contains": {
      "type": "string",
      "description": "Substring match against the bill title only."
    },
    "include_sponsors": {
      "type": "boolean",
      "description": "Attach a sponsors array (people_id, name, party, district, sponsor_type) to every bill. Use this whenever the answer needs to name who sponsored the bills."
    },
    "sponsor_last_name": {
      "type": "string",
      "description": "Last name of a bill sponsor."
    }
  },
  "additionalProperties": false
}
search_bills annotations
{
  "title": "Search bills",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
semantic_search_bills — Search bills by meaning
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Vector search over the full text of every bill (GET /v1/search/semantic): describe what you want in plain English — 'protecting kids from social media', 'limits on rent increases' — and get the closest bills with a match_score. Prefer this over search_bills for questions and topics; prefer search_bills for a known bill number, sponsor, or status filter, and keyword_search_bills for exact terms that must all appear. Returns bill_id, bill_number, title, description, state_abbr, status_id. Corpus is 2026-forward only. status_id values: 1=Introduced, 2=In Committee, 3=Passed One Chamber, 4=Passed Both Chambers (for a simple resolution, bill_type_id 2: Adopted, its final step), 5=Signed into Law, 6=Vetoed, 7=Failed/Dead, 8=Chaptered. Aggregate buckets: passed={4,5,8}, failed={6,7}, alive={1,2,3}.

semantic_search_bills input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "query"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1,
      "description": "Max rows (default 25)."
    },
    "query": {
      "type": "string",
      "maxLength": 1000,
      "minLength": 1,
      "description": "The question or description, in plain English."
    },
    "state": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 2,
        "minLength": 2
      },
      "description": "Restrict to these jurisdictions (postal codes, DC, US). Omit for all."
    },
    "threshold": {
      "type": "number",
      "maximum": 1,
      "minimum": 0,
      "description": "Minimum similarity 0-1 (default 0.3). Lower it to widen the net."
    }
  },
  "additionalProperties": false
}
semantic_search_bills annotations
{
  "title": "Search bills by meaning",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_bill — Get one bill
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Fetch a single bill by its numeric bill_id (GET /v1/bills/{bill_id}), optionally merging in sub-resources: votes (roll calls with tallies), sponsors, history (action timeline), texts (version metadata), amendments, subjects, analyses (staff analyses), calendar (scheduled events), citations (statutes the bill touches), referrals (committee referrals), sast (same-as / similar-to companion bills in the other chamber or other states), supplements (fiscal notes and summaries). analyses and citations are populated only for the deeper-coverage states. Each include is a separate API call, so ask only for what you need. Pass detail:true to get everything in one round trip instead. Get a bill_id from search_bills or semantic_search_bills. status_id values: 1=Introduced, 2=In Committee, 3=Passed One Chamber, 4=Passed Both Chambers (for a simple resolution, bill_type_id 2: Adopted, its final step), 5=Signed into Law, 6=Vetoed, 7=Failed/Dead, 8=Chaptered. Aggregate buckets: passed={4,5,8}, failed={6,7}, alive={1,2,3}.

get_bill input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "bill_id"
  ],
  "properties": {
    "detail": {
      "type": "boolean",
      "description": "true = one request to /v1/bills/{id}/detail with every sub-resource merged (the cheapest way to get everything). Ignores include."
    },
    "bill_id": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Numeric bill_id from a search result."
    },
    "include": {
      "type": "array",
      "items": {
        "enum": [
          "votes",
          "sponsors",
          "history",
          "texts",
          "amendments",
          "subjects",
          "analyses",
          "calendar",
          "citations",
          "referrals",
          "sast",
          "supplements"
        ],
        "type": "string"
      },
      "description": "Sub-resources to merge into the result: votes, sponsors, history, texts, amendments, subjects, analyses, calendar, citations, referrals, sast, supplements."
    },
    "max_items": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "description": "Cap on items per included list (default 50)."
    }
  },
  "additionalProperties": false
}
get_bill annotations
{
  "title": "Get one bill",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_bill_diff — Diff two bill-text versions
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Compare two versions of a bill's text (GET /v1/bills/{bill_id}/diff): a unified diff plus similarity, added/removed line and character counts, and changed-section highlights. Get the two version ids from get_bill with include:['texts'] — each text row's `text_id`. Pass them as `from` (the earlier version) and `to` (the later version). Diffs are precomputed, so only bills that have more than one text version return one.

get_bill_diff input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "bill_id",
    "from",
    "to"
  ],
  "properties": {
    "to": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        {
          "type": "string"
        }
      ],
      "description": "Text-version id of the later version to compare against."
    },
    "from": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        {
          "type": "string"
        }
      ],
      "description": "Text-version id of the earlier version (the baseline)."
    },
    "bill_id": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        {
          "type": "string"
        }
      ],
      "description": "bill_id the two texts belong to."
    }
  },
  "additionalProperties": false
}
get_bill_diff annotations
{
  "title": "Diff two bill-text versions",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
keyword_search_bills — Search bills by exact keywords (all must match)
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Keyword search where EVERY term must appear (GET /v1/search/bills). Use when the user gives specific words that all have to be present, e.g. ['short-term rental', 'tax']. Prefer semantic_search_bills for questions and search_bills for structured filters. Up to 10 terms. Returns bill summaries plus pagination. Corpus is 2026-forward only.

keyword_search_bills input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "keywords"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1,
      "description": "Max rows (default 25)."
    },
    "state": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 2,
        "minLength": 2
      },
      "description": "Jurisdictions (postal codes, DC, US). Omit for all."
    },
    "offset": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "Pagination offset."
    },
    "keywords": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1
      },
      "maxItems": 10,
      "minItems": 1,
      "description": "Terms that must all match."
    }
  },
  "additionalProperties": false
}
keyword_search_bills annotations
{
  "title": "Search bills by exact keywords (all must match)",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_bill_text — Get the text of one bill version
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

The cleaned plain text of one bill-text version (GET /v1/texts/{text_id}), entities decoded, ready to quote or summarize. Get text_id from get_bill with include:['texts'] (each version has a date and type). Texts longer than 40,000 characters are clipped with a '[truncated]' marker.

get_bill_text input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "text_id"
  ],
  "properties": {
    "text_id": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        {
          "type": "string"
        }
      ],
      "description": "text_id from get_bill include:['texts']."
    }
  },
  "additionalProperties": false
}
get_bill_text annotations
{
  "title": "Get the text of one bill version",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_bill_text_history — Get every text diff for a bill
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Timeline of all computed diffs between successive text versions of one bill (GET /v1/bills/{bill_id}/changes): what changed, when, and how much. Use get_bill_diff for one specific pair of versions. Get bill_id from search_bills or semantic_search_bills.

get_bill_text_history input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "bill_id"
  ],
  "properties": {
    "bill_id": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        {
          "type": "string"
        }
      ],
      "description": "bill_id from a search result."
    },
    "include_whitespace": {
      "type": "boolean",
      "description": "Include whitespace-only changes (default false)."
    }
  },
  "additionalProperties": false
}
get_bill_text_history annotations
{
  "title": "Get every text diff for a bill",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
list_legislators — Search legislators
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Search or list legislators (GET /v1/legislators) by jurisdiction, chamber, party, district, or name. This is how you turn a name into the people_id that get_legislator needs. Filters combine with AND.

list_legislators input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "q": {
      "type": "string",
      "description": "Name search."
    },
    "limit": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "description": "Max rows to return (default 50)."
    },
    "party": {
      "type": "string",
      "description": "Party filter."
    },
    "state": {
      "type": "string",
      "description": "2-letter postal code (e.g. FL), DC, or US for Congress."
    },
    "offset": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "Pagination offset."
    },
    "chamber": {
      "type": "string",
      "description": "Chamber filter, e.g. House or Senate."
    },
    "district": {
      "type": "string",
      "description": "District identifier."
    }
  },
  "additionalProperties": false
}
list_legislators annotations
{
  "title": "Search legislators",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_legislator — Get one legislator
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Fetch a legislator's profile by people_id (GET /v1/legislators/{people_id}), optionally merging in votes (every roll call they are recorded on, newest first, with their individual position: 1=Yea, 2=Nay, 3=Not Voting, 4=Absent) and bills (legislation they sponsor, with sponsor_type_id 1=primary, 2=cosponsor). Find a people_id with list_legislators or from a bill's sponsors. Corpus is 2026-forward only.

get_legislator input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "people_id"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1,
      "description": "Rows per included sub-resource (default 25)."
    },
    "include": {
      "type": "array",
      "items": {
        "enum": [
          "votes",
          "bills"
        ],
        "type": "string"
      },
      "description": "Sub-resources to merge in: votes, bills."
    },
    "people_id": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Numeric people_id (int64 — many exceed int32)."
    }
  },
  "additionalProperties": false
}
get_legislator annotations
{
  "title": "Get one legislator",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_roll_call — Get one roll-call vote
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Fetch a roll call by roll_call_id (GET /v1/votes/{roll_call_id}): the motion, chamber, date and yea/nay/absent tallies. Add include:['details'] to also pull how every individual member voted (vote_id 1=Yea, 2=Nay, 3=Not Voting, 4=Absent) — this is the tool for 'how did each legislator vote on this'. Get a roll_call_id from get_bill with include:['votes'].

get_roll_call input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "roll_call_id"
  ],
  "properties": {
    "include": {
      "type": "array",
      "items": {
        "enum": [
          "details"
        ],
        "type": "string"
      },
      "description": "Add 'details' for individual member positions."
    },
    "max_items": {
      "type": "integer",
      "maximum": 500,
      "minimum": 1,
      "description": "Cap on member rows returned (default 200 — enough for any single chamber)."
    },
    "roll_call_id": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Numeric roll_call_id (int64 — may exceed int32)."
    }
  },
  "additionalProperties": false
}
get_roll_call annotations
{
  "title": "Get one roll-call vote",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_legislator_scorecard — Get a legislator's scorecard
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

One-call voting and sponsorship profile for a legislator (GET /v1/legislators/{people_id}/scorecard): participation, party-line alignment, bills sponsored and passed, notable votes. This is the tool for 'how does X vote' or 'is X effective'. Get people_id from list_legislators (q=name).

get_legislator_scorecard input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "people_id"
  ],
  "properties": {
    "people_id": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        {
          "type": "string"
        }
      ],
      "description": "people_id from list_legislators."
    }
  },
  "additionalProperties": false
}
get_legislator_scorecard annotations
{
  "title": "Get a legislator's scorecard",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
list_committees — List committees
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

List legislative committees (GET /v1/committees), filterable by jurisdiction, chamber, or name search. Returns the committee_id values that get_committee needs.

list_committees input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "q": {
      "type": "string",
      "description": "Name search."
    },
    "limit": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "description": "Max rows to return (default 50)."
    },
    "state": {
      "type": "string",
      "description": "2-letter postal code (e.g. FL), DC, or US for Congress."
    },
    "chamber": {
      "type": "string",
      "description": "Chamber filter, e.g. House or Senate."
    }
  },
  "additionalProperties": false
}
list_committees annotations
{
  "title": "List committees",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_committee — Get one committee
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Fetch a committee by committee_id (GET /v1/committees/{committee_id}), optionally merging in members (its roster, with roles) and hearings (its scheduled meetings). Find a committee_id with list_committees.

get_committee input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "committee_id"
  ],
  "properties": {
    "include": {
      "type": "array",
      "items": {
        "enum": [
          "members",
          "hearings"
        ],
        "type": "string"
      },
      "description": "Sub-resources to merge in: members, hearings."
    },
    "max_items": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "description": "Cap on items per included list (default 50)."
    },
    "committee_id": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Numeric committee_id."
    }
  },
  "additionalProperties": false
}
get_committee annotations
{
  "title": "Get one committee",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
list_hearings — List hearings
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Committee hearings and meetings across committees (GET /v1/hearings), newest first, filterable by jurisdiction and start date. Use this to answer 'what is being heard this week' or to track when a committee next meets. Rows with has_transcript:true carry a verbatim transcript (transcript_chars long); read it with get_hearing. For hearings on one specific committee use get_committee with include:['hearings']; for one specific bill use get_bill with include:['calendar']. Floor sessions are in list_floor_transcripts.

list_hearings input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "description": "Max rows to return (default 50)."
    },
    "since": {
      "type": "string",
      "description": "ISO-8601 date or timestamp; only hearings on or after it."
    },
    "state": {
      "type": "string",
      "description": "2-letter postal code (e.g. FL), DC, or US for Congress."
    },
    "offset": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "Rows to skip, for paging."
    },
    "has_transcript": {
      "type": "boolean",
      "description": "true: only hearings with a transcript; false: only those without."
    }
  },
  "additionalProperties": false
}
list_hearings annotations
{
  "title": "List hearings",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_hearing — Get one hearing and read its transcript
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

One committee hearing or meeting (GET /v1/hearings/{hearing_id}) with its verbatim transcript where one exists (has_transcript in list_hearings; NY public hearings and FL committee meetings carry them). Transcripts can exceed a million characters, so this returns a window of the text (offset, max_chars, next_offset to keep reading) or, with search, every passage that mentions a phrase. transcript_url is the official document. Find hearing_id with list_hearings or get_committee include:['hearings'].

get_hearing input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "hearing_id"
  ],
  "properties": {
    "offset": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "Character offset to start reading the transcript from (default 0). Use next_offset to continue."
    },
    "search": {
      "type": "string",
      "minLength": 2,
      "description": "Instead of a window, return every passage that mentions this phrase (case-insensitive, up to 20), each with its offset. Use it to find what a member said about a topic or bill."
    },
    "max_chars": {
      "type": "integer",
      "maximum": 60000,
      "minimum": 1000,
      "description": "How many transcript characters to return (default 30000, max 60000)."
    },
    "hearing_id": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "hearing_id from list_hearings."
    }
  },
  "additionalProperties": false
}
get_hearing annotations
{
  "title": "Get one hearing and read its transcript",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
list_floor_transcripts — List floor-session transcripts
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Verbatim stenographic records of chamber floor sessions (GET /v1/floor-transcripts), newest first: each sitting's date, session type, length and official PDF. Coverage: the New York Senate, every sitting from 2025 on. Read one with get_floor_transcript. For committee hearings use list_hearings.

list_floor_transcripts input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "description": "Max rows to return (default 50)."
    },
    "since": {
      "type": "string",
      "description": "ISO date; sittings on or after it."
    },
    "state": {
      "type": "string",
      "description": "2-letter postal code (e.g. NY), DC, or US for Congress."
    },
    "until": {
      "type": "string",
      "description": "ISO date; sittings on or before it."
    },
    "offset": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "Rows to skip, for paging."
    },
    "chamber": {
      "type": "string",
      "description": "Senate, House or Assembly."
    }
  },
  "additionalProperties": false
}
list_floor_transcripts annotations
{
  "title": "List floor-session transcripts",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_floor_transcript — Read one floor-session transcript
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

The verbatim record of one chamber sitting (GET /v1/floor-transcripts/{transcript_id}): debate, explanations of vote and roll calls as spoken on the floor. A sitting can run to 850,000 characters, so this returns a window (offset, max_chars, next_offset) or, with search, every passage that mentions a phrase such as a bill number or a member's name. Get transcript_id from list_floor_transcripts.

get_floor_transcript input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "transcript_id"
  ],
  "properties": {
    "offset": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "Character offset to start reading the transcript from (default 0). Use next_offset to continue."
    },
    "search": {
      "type": "string",
      "minLength": 2,
      "description": "Instead of a window, return every passage that mentions this phrase (case-insensitive, up to 20), each with its offset. Use it to find what a member said about a topic or bill."
    },
    "max_chars": {
      "type": "integer",
      "maximum": 60000,
      "minimum": 1000,
      "description": "How many transcript characters to return (default 30000, max 60000)."
    },
    "transcript_id": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "transcript_id from list_floor_transcripts."
    }
  },
  "additionalProperties": false
}
get_floor_transcript annotations
{
  "title": "Read one floor-session transcript",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_changes — Get the bill change feed
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Near-real-time feed of what changed (GET /v1/changes). Poll with since=<ISO timestamp> to get everything newer than your cursor; with no since it defaults to the last hour. Reason types include NewBill, StatusChange, Text, Vote and Amendment. Use this for monitoring and incremental sync — 'what moved in Florida since yesterday' — rather than re-scanning search_bills.

get_changes input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "description": "Max rows to return (default 50)."
    },
    "since": {
      "type": "string",
      "description": "ISO-8601 cursor. Omit for the last hour. Pass the newest timestamp you have already seen."
    },
    "state": {
      "type": "string",
      "description": "2-letter postal code (e.g. FL), DC, or US for Congress."
    },
    "reason": {
      "type": "string",
      "description": "Restrict to one change type, e.g. NewBill, StatusChange, Text, Vote, Amendment."
    }
  },
  "additionalProperties": false
}
get_changes annotations
{
  "title": "Get the bill change feed",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
list_topics — List topics
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

The canonical topic taxonomy with per-topic bill counts (GET /v1/topics). Call this first to find the right slug for the topic filter on search_bills, instead of guessing one. Pass a slug to get that topic's detail and a sample of the raw subject names folded into it (GET /v1/topics/{slug}); to get the topic's actual bills, use search_bills with topic=<slug>.

list_topics input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "slug": {
      "type": "string",
      "description": "Optional topic slug, e.g. 'healthcare'. Omit to list the whole taxonomy."
    },
    "max_items": {
      "type": "integer",
      "maximum": 500,
      "minimum": 1,
      "description": "Cap on rows returned (default 200)."
    }
  },
  "additionalProperties": false
}
list_topics annotations
{
  "title": "List topics",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
list_subjects — List subjects
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

The raw subject taxonomy with per-subject bill counts (GET /v1/subjects). Subjects are the fine-grained categories the legislatures themselves assign to bills — narrower and more numerous than the curated topic slugs from list_topics. Use this to find a subject_id to filter search_bills by, or to gauge what a jurisdiction is legislating on. Scope with `state` and narrow with `q`.

list_subjects input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "q": {
      "type": "string",
      "description": "Case-insensitive subject-name search."
    },
    "state": {
      "type": "string",
      "description": "2-letter postal code (e.g. FL), DC, or US for Congress."
    },
    "max_items": {
      "type": "integer",
      "maximum": 500,
      "minimum": 1,
      "description": "Cap on rows returned (default 200)."
    }
  },
  "additionalProperties": false
}
list_subjects annotations
{
  "title": "List subjects",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
list_sessions — List legislative sessions
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Legislative sessions (GET /v1/sessions): regular and special sessions with their years, start/sine-die dates and a session_id. Use this to resolve which session a bill belongs to, to find the current session for a state, or to pass session_id as a filter to search_bills. Omit `state` to list every jurisdiction's sessions. Corpus is 2026-forward only.

list_sessions input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "state": {
      "type": "string",
      "description": "2-letter postal code (e.g. FL), DC, or US for Congress."
    },
    "max_items": {
      "type": "integer",
      "maximum": 500,
      "minimum": 1,
      "description": "Cap on rows returned (default 200)."
    }
  },
  "additionalProperties": false
}
list_sessions annotations
{
  "title": "List legislative sessions",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_session_dashboard — Session dashboard
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Headline counts for one legislative session (GET /v1/sessions/{id}/dashboard): bills filed, passed, signed, vetoed, roll calls, active legislators. Start here for 'how is the 2026 Florida session going'. Get session_id from list_sessions.

get_session_dashboard input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "session_id"
  ],
  "properties": {
    "session_id": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        {
          "type": "string"
        }
      ],
      "description": "session_id from list_sessions (filter by state)."
    }
  },
  "additionalProperties": false
}
get_session_dashboard annotations
{
  "title": "Session dashboard",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_session_sponsor_stats — Top sponsors in a session
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Legislators ranked by bills sponsored and passed in one session (GET /v1/sessions/{id}/sponsor-stats). Each row has bills_sponsored, bills_primary, bills_passed, bills_primary_passed and pass_rate (passed = status 4, 5 or 8). This is the one call for 'who is most active or effective this session' and 'which senator passed the most bills': set chamber and sort:'passed' (or 'primary_passed' to count only bills they carried). Committees filed as sponsors are excluded by default. Get session_id from list_sessions.

get_session_sponsor_stats input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "session_id"
  ],
  "properties": {
    "sort": {
      "enum": [
        "sponsored",
        "passed",
        "primary_passed",
        "pass_rate"
      ],
      "type": "string",
      "description": "Ranking key (default sponsored)."
    },
    "limit": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "description": "Max rows (default 40)."
    },
    "party": {
      "enum": [
        "D",
        "R"
      ],
      "type": "string",
      "description": "Restrict to one party."
    },
    "chamber": {
      "enum": [
        "senate",
        "house"
      ],
      "type": "string",
      "description": "Restrict to one chamber."
    },
    "session_id": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        {
          "type": "string"
        }
      ],
      "description": "session_id from list_sessions (filter by state)."
    },
    "include_committees": {
      "type": "boolean",
      "description": "Include committee sponsor rows (default false)."
    }
  },
  "additionalProperties": false
}
get_session_sponsor_stats annotations
{
  "title": "Top sponsors in a session",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_session_vote_participation — Roll-call participation per legislator
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

How many roll calls each legislator voted in versus missed during one session (GET /v1/sessions/{id}/vote-participation). Use for attendance questions. Get session_id from list_sessions.

get_session_vote_participation input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "session_id"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 500,
      "minimum": 1,
      "description": "Max rows (default 50)."
    },
    "session_id": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        {
          "type": "string"
        }
      ],
      "description": "session_id from list_sessions (filter by state)."
    }
  },
  "additionalProperties": false
}
get_session_vote_participation annotations
{
  "title": "Roll-call participation per legislator",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
list_session_legislators — Legislators active in a session
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Every legislator who served in one session (GET /v1/sessions/{id}/legislators), with people_id. Use list_legislators for the current roster by state; use this for a specific past or special session. Get session_id from list_sessions.

list_session_legislators input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "session_id"
  ],
  "properties": {
    "session_id": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        {
          "type": "string"
        }
      ],
      "description": "session_id from list_sessions (filter by state)."
    }
  },
  "additionalProperties": false
}
list_session_legislators annotations
{
  "title": "Legislators active in a session",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_session_breakdown — Bill counts by status or subject
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Bill count per status (by:'status', on the status_id ladder) or per subject (by:'subject') for one session (GET /v1/sessions/{id}/status-counts or /subject-counts). Get session_id from list_sessions. status_id values: 1=Introduced, 2=In Committee, 3=Passed One Chamber, 4=Passed Both Chambers (for a simple resolution, bill_type_id 2: Adopted, its final step), 5=Signed into Law, 6=Vetoed, 7=Failed/Dead, 8=Chaptered. Aggregate buckets: passed={4,5,8}, failed={6,7}, alive={1,2,3}.

get_session_breakdown input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "session_id",
    "by"
  ],
  "properties": {
    "by": {
      "enum": [
        "status",
        "subject"
      ],
      "type": "string",
      "description": "Group by status or by subject."
    },
    "session_id": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        {
          "type": "string"
        }
      ],
      "description": "session_id from list_sessions (filter by state)."
    }
  },
  "additionalProperties": false
}
get_session_breakdown annotations
{
  "title": "Bill counts by status or subject",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
list_states — List states & jurisdictions
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

The jurisdiction directory (GET /v1/states): the 50 states, D.C. and the U.S. Congress with their state_id, 2-letter code and full name. Returns the full list (52 rows) so you can resolve a name to a code or enumerate everything the corpus covers. For how COMPLETE each jurisdiction's data is, use get_coverage instead.

list_states input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {},
  "additionalProperties": false
}
list_states annotations
{
  "title": "List states & jurisdictions",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_coverage — Get per-state data coverage
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Per-state depth snapshot (GET /v1/coverage): how COMPLETE each jurisdiction's data is — bill counts, the share of bills holding at least one vote, text or sponsor, and whether the legislature is currently in session. Use it before drawing conclusions from a thin result set, to tell 'no such bills' apart from 'this state is thinly covered'. Read the completeness ratios rather than the raw percentages: most bills die in committee without ever getting a roll call, so a low pct_with_votes usually reflects the legislature, not a gap in the data. Served from a materialised snapshot; `computed_at` gives its age.

get_coverage input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "max_items": {
      "type": "integer",
      "maximum": 60,
      "minimum": 1,
      "description": "Cap on rows returned (default 60 — all jurisdictions)."
    }
  },
  "additionalProperties": false
}
get_coverage annotations
{
  "title": "Get per-state data coverage",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_trending_bills — Bills trending in the news
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Bills with the most news coverage in the window (GET /v1/trending), optionally for one state. Use for 'what's in the news' or 'hot bills right now'. Returns bill summaries with mention counts; call get_bill for detail.

get_trending_bills input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "days": {
      "type": "integer",
      "maximum": 365,
      "minimum": 1,
      "description": "Look-back window in days (default 7)."
    },
    "limit": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1,
      "description": "Max rows (default 20)."
    },
    "state": {
      "type": "string",
      "maxLength": 2,
      "minLength": 2,
      "description": "Postal code, DC, or US. Omit for all."
    }
  },
  "additionalProperties": false
}
get_trending_bills annotations
{
  "title": "Bills trending in the news",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
list_bills_by_stage — Bills that moved to a stage recently
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Bills whose LATEST action in the window falls in a stage (GET /v1/bills-by-stage): introduced, committee, passed, executive (with the governor, signed, or vetoed), amendments, other. Fleet-wide across all jurisdictions — there is no state filter, so filter the rows by state_id or state_name yourself. Classified from the action text, not status_id. Use for 'what passed this week' or 'what reached the governor'. Stage values are lowercase.

list_bills_by_stage input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "stage"
  ],
  "properties": {
    "days": {
      "type": "integer",
      "maximum": 365,
      "minimum": 1,
      "description": "Look-back window in days (default 7)."
    },
    "limit": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "description": "Max rows (default 100)."
    },
    "stage": {
      "enum": [
        "introduced",
        "committee",
        "passed",
        "executive",
        "amendments",
        "other"
      ],
      "type": "string",
      "description": "Lowercase stage name."
    }
  },
  "additionalProperties": false
}
list_bills_by_stage annotations
{
  "title": "Bills that moved to a stage recently",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_weekly_stage_breakdown — Fleet-wide counts per stage
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

One row per stage with the number of bills whose latest action landed there in the window (GET /v1/bills-weekly-breakdown). All jurisdictions combined. Use for a national 'how much moved this week' number; use get_session_dashboard for one state.

get_weekly_stage_breakdown input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "days": {
      "type": "integer",
      "maximum": 365,
      "minimum": 1,
      "description": "Look-back window in days (default 7)."
    }
  },
  "additionalProperties": false
}
get_weekly_stage_breakdown annotations
{
  "title": "Fleet-wide counts per stage",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
list_candidates — Search election candidates
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Search the election-candidate directory (GET /v1/candidates): people running for office. Filters combine with AND. Roughly a third carry an FEC filer id and sitting members of Congress carry a Bioguide id; both are null otherwise. Rows also carry people_id where the person has a legislative voting record — pass it to get_legislator / get_legislator_scorecard to go from candidate to voting history in one hop. Covers STATE and federal candidates. Pass a candidate id to get_candidate for the full record.

list_candidates input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "cycle": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        {
          "type": "string"
        }
      ],
      "description": "Election cycle / year filter, e.g. 2026."
    },
    "limit": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "description": "Max rows to return (default 50)."
    },
    "state": {
      "type": "string",
      "description": "2-letter postal code filter."
    },
    "fec_id": {
      "type": "string",
      "description": "Filter by FEC filer id."
    },
    "office": {
      "type": "string",
      "description": "Office filter: H, S, P, House, Senate, President, or a whole word from a state office name (min 3 chars; unknown short values are rejected)."
    },
    "offset": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "Pagination offset."
    },
    "bioguide": {
      "type": "string",
      "description": "Filter by federal Bioguide id."
    }
  },
  "additionalProperties": false
}
list_candidates annotations
{
  "title": "Search election candidates",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_candidate — Get a candidate
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Fetch one election candidate by id (GET /v1/candidates/{id}): their party, office, district and cycle, plus an FEC filer id where the campaign has filed and a Bioguide id for sitting members of Congress. When people_id is set, the candidate has a legislative voting record — pass it to get_legislator or get_legislator_scorecard to go from candidate to voting history in one hop. Get an id from list_candidates.

get_candidate input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        {
          "type": "string"
        }
      ],
      "description": "Candidate id from list_candidates or get_midterms."
    }
  },
  "additionalProperties": false
}
get_candidate annotations
{
  "title": "Get a candidate",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_midterms — 2026 midterm election slate
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

The election slate for 2026-11-03 (GET /v1/midterms): races, candidates and ballot measures per state, with official results where available. All data is official state election-office and FEC content collected by Delilah — no third-party attribution is required. live_results carries ONE ENTRY PER CONTEST, each with `contest` (e.g. primary:DEM, runoff:REP) and `party`: a closed primary returns each party separately and vote_pct is the share of THAT party's ballot, so never compare or rank candidates across two contests. Use for 'who is running for X' and results questions. Never call or project a race; report counts exactly as reported.

get_midterms input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "q": {
      "type": "string",
      "description": "Candidate or race name search."
    },
    "year": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Election year (default 2026)."
    },
    "level": {
      "enum": [
        "federal",
        "governor",
        "state_executive",
        "state_legislative"
      ],
      "type": "string",
      "description": "federal | governor | state_executive | state_legislative"
    },
    "limit": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1,
      "description": "Max rows (default 50)."
    },
    "state": {
      "type": "string",
      "maxLength": 2,
      "minLength": 2,
      "description": "Postal code. Omit for all states."
    },
    "offset": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "Pagination offset."
    },
    "chamber": {
      "type": "string",
      "description": "House | Senate"
    }
  },
  "additionalProperties": false
}
get_midterms annotations
{
  "title": "2026 midterm election slate",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_ballot_measure — Statewide ballot measures
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Ballot measures (GET /v1/measures): the list for a state, or one measure by its number (e.g. 'Amendment 1') with full text, summary and official source URL. Use for 'what's on the ballot in X' and 'what does Amendment N do'.

get_ballot_measure input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "state"
  ],
  "properties": {
    "q": {
      "type": "string",
      "description": "Title search."
    },
    "type": {
      "type": "string",
      "description": "Measure type filter."
    },
    "limit": {
      "type": "integer",
      "maximum": 200,
      "minimum": 1
    },
    "state": {
      "type": "string",
      "maxLength": 2,
      "minLength": 2,
      "description": "Postal code."
    },
    "number": {
      "type": "string",
      "description": "Exact measure number (e.g. 'Amendment 1') to fetch one measure."
    },
    "offset": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0
    }
  },
  "additionalProperties": false
}
get_ballot_measure annotations
{
  "title": "Statewide ballot measures",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
list_districts — Electoral districts (and boundaries)
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

District metadata by state and type (GET /v1/districts): congressional, state senate, state house. Pass district_id with boundary:true to get the polygon as GeoJSON (GET /v1/districts/{id}/boundary) — it is large, so set simplify (degrees, e.g. 0.01) to shrink it. Match districts NUMERICALLY (district_number), never by label text.

list_districts input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "type": {
      "enum": [
        "congressional",
        "sldu",
        "sldl"
      ],
      "type": "string",
      "description": "congressional | sldu (state senate/upper) | sldl (state house/lower)"
    },
    "limit": {
      "type": "integer",
      "maximum": 500,
      "minimum": 1
    },
    "state": {
      "type": "string",
      "maxLength": 2,
      "minLength": 2,
      "description": "Postal code."
    },
    "offset": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0
    },
    "boundary": {
      "type": "boolean",
      "description": "true = return the GeoJSON polygon for district_id."
    },
    "simplify": {
      "type": "number",
      "minimum": 0,
      "description": "Simplification tolerance in degrees."
    },
    "district_id": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        {
          "type": "string"
        }
      ],
      "description": "A district id from a previous list call (for boundary:true)."
    }
  },
  "additionalProperties": false
}
list_districts annotations
{
  "title": "Electoral districts (and boundaries)",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_candidate_photo — Candidate portrait URL
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

The URL of a candidate's official portrait (GET /v1/photos/{candidate_id} returns the image bytes). Sources are official state-legislature and congressional portraits, public-domain and licensed images only — never a third party's photo library — and each carries a license and attribution string that MUST be shown when the license requires it (Wikimedia CC BY). Returns null when the candidate has no accepted portrait — which is the COMMON case: only about a tenth of the 2026 field has one (11%), so design for an initials-avatar default. Candidate rows from list_candidates and get_midterms already include photo_url, so call this only when you have just an id.

get_candidate_photo input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "candidate_id"
  ],
  "properties": {
    "candidate_id": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        {
          "type": "string"
        }
      ],
      "description": "Candidate id."
    }
  },
  "additionalProperties": false
}
get_candidate_photo annotations
{
  "title": "Candidate portrait URL",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
list_statute_coverage — Statute coverage and codes
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Which jurisdictions' codified law is loaded, and how big and current it is (GET /v1/statutes/coverage): per state the number of codes, sections, bill links and the edition it is current through. Pass state to list that state's codes (GET /v1/statutes/codes) — the code_id values used by get_statute lookups. Call this first to know whether a state's statutes are available.

list_statute_coverage input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "state": {
      "type": "string",
      "maxLength": 2,
      "minLength": 2,
      "description": "2-letter postal code (e.g. NJ), DC, GU, or US for the U.S. Code."
    }
  },
  "additionalProperties": false
}
list_statute_coverage annotations
{
  "title": "Statute coverage and codes",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
search_statutes — Search statutes
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Full-text search of a state's codified law (GET /v1/statutes/search). Use for 'what does the law say about X' and to find the section a bill or ballot measure changes. Returns matching sections with headings and excerpts; fetch the whole section with get_statute. Only states whose code is loaded resolve to section text (see list_statute_coverage); a link to a section we hold carries resolved:true and the text, otherwise just the citation as written.

search_statutes input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "state",
    "q"
  ],
  "properties": {
    "q": {
      "type": "string",
      "minLength": 2,
      "description": "Words to find in section headings and text."
    },
    "code": {
      "type": "string",
      "description": "Restrict to one code (code_key from list_statute_coverage), e.g. a California code."
    },
    "limit": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1
    },
    "state": {
      "type": "string",
      "maxLength": 2,
      "minLength": 2,
      "description": "2-letter postal code (e.g. NJ), DC, GU, or US for the U.S. Code."
    }
  },
  "additionalProperties": false
}
search_statutes annotations
{
  "title": "Search statutes",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_statute — One statute section
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

One section of law with full text and its place in the code (GET /v1/statutes/sections/{section_id}, or by citation via GET /v1/statutes/lookup). Give section_id from a search or a bill/measure link, or state + citation exactly as the code prints it (e.g. '39:4-50', '790.01', '18-3-102'). Set include_bills:true to also return the bills that amend, create, repeal or cite the section. Only states whose code is loaded resolve to section text (see list_statute_coverage); a link to a section we hold carries resolved:true and the text, otherwise just the citation as written.

get_statute input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "code": {
      "type": "string",
      "description": "code_key when a citation exists in more than one code of the state."
    },
    "state": {
      "type": "string",
      "maxLength": 2,
      "minLength": 2,
      "description": "2-letter postal code (e.g. NJ), DC, GU, or US for the U.S. Code."
    },
    "citation": {
      "type": "string",
      "description": "Section citation without the code prefix, e.g. '39:4-50'."
    },
    "section_id": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "section_id from a statute search or link."
    },
    "include_bills": {
      "type": "boolean",
      "description": "Also fetch the bills that touch this section."
    }
  },
  "additionalProperties": false
}
get_statute annotations
{
  "title": "One statute section",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_bill_statutes — Laws a bill changes
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

The sections of existing law a bill amends, creates, repeals or cites (GET /v1/bills/{bill_id}/statutes), classified by how it touches each, with the current text of sections we hold. Use for 'what current law does this bill change'. Get bill_id from search_bills. Only states whose code is loaded resolve to section text (see list_statute_coverage); a link to a section we hold carries resolved:true and the text, otherwise just the citation as written.

get_bill_statutes input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "bill_id"
  ],
  "properties": {
    "bill_id": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Numeric bill_id from a search result."
    }
  },
  "additionalProperties": false
}
get_bill_statutes annotations
{
  "title": "Laws a bill changes",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_measure_statutes — Laws a ballot measure changes
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

The sections of existing law a 2026 ballot measure amends, creates, repeals or cites (GET /v1/measures/{state}/{number}/statutes). Use for 'which laws does Prop X / Question Y change'. Read from the measure's official text: constitutional amendments cite the constitution (not loaded), and a measure whose text is not yet published returns nothing. Treat the list as a floor. Only states whose code is loaded resolve to section text (see list_statute_coverage); a link to a section we hold carries resolved:true and the text, otherwise just the citation as written.

get_measure_statutes input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "state",
    "number"
  ],
  "properties": {
    "state": {
      "type": "string",
      "maxLength": 2,
      "minLength": 2,
      "description": "2-letter postal code (e.g. NJ), DC, GU, or US for the U.S. Code."
    },
    "number": {
      "type": "string",
      "description": "Measure number as served by get_ballot_measure, e.g. 'Proposition 319'."
    }
  },
  "additionalProperties": false
}
get_measure_statutes annotations
{
  "title": "Laws a ballot measure changes",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}
get_usage — Your API usage this month
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

The current key's tier, monthly cap, requests used and remaining, and when the period resets (GET /v1/_meta/usage). Call this when a request is rate-limited (HTTP 429) or the user asks about their plan.

get_usage input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {},
  "additionalProperties": false
}
get_usage annotations
{
  "title": "Your API usage this month",
  "readOnlyHint": true,
  "openWorldHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
385 ms
95th percentile latency
385 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 385 ms · metadata changed · 43 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http delilah-mcp https://mcp.delilahusa.com/

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add delilah-mcp --url https://mcp.delilahusa.com/

Cursor

Merge this server into .cursor/mcp.json in your project, then enable delilah-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "delilah-mcp": {
      "url": "https://mcp.delilahusa.com/"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "delilah-mcp": {
      "type": "streamableHttp",
      "url": "https://mcp.delilahusa.com/",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start delilah-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "delilah-mcp": {
      "type": "http",
      "url": "https://mcp.delilahusa.com/"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http delilah-mcp https://mcp.delilahusa.com/

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://mcp.delilahusa.com/

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "delilah-mcp": {
      "serverUrl": "https://mcp.delilahusa.com/"
    }
  }
}

Let your agent find its tools

Find servers like Delilah MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Delilah MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing