MCP server exposing 10 tools for congress.
This URL is a JSON-RPC 2.0 endpoint over HTTP. Issue POST requests with a JSON-RPC body. Browsers and search crawlers land here on GET.
POST https://gateway.pipeworx.io/congress/mcp
Content-Type: application/json
{"jsonrpc":"2.0","id":1,"method":"tools/list"}
search_bills — ANSWERS "what bills about X has Congress introduced" / "recent congressional bills on X" / "federal legislation about X" / "find the <Named> Act" — searches US FEDERAL congressional bills (US House & Senate, national laws) BY BILL NAME, SUBJECT OR KEYWORD, including recently introduced ones. Full-text search is via GovInfo (the GPO's index of the same bill documents congress.gov itself searches — congress.gov's own /bill endpoint has no keyword query at all), then RE-RANKED locally by how well each bill's title matches the query — exact title first, then a title containing the phrase, then all query words, then partial overlap — so the first result is the best title match and each bill carries its match tier. Pass `congress` to restrict to one Congress (filtered locally against the search results — may miss a match if it falls outside GovInfo's own top results for that query). Prefer this over a date-sorted recent-bills listing whenever the question names a topic or a bill. Returns bill type, number, title, status, sponsor, and introduction date (via congress.gov). Use get_bill with congress + bill_type + number for full details. Requires an API key (see get_bill). NOTE: this is the US Congress (federal) ONLY — for STATE legislature bills (e.g. California, Texas, New York, or any US state legislation) use legiscan or openstates instead, not this tool.get_bill — Look up one congressional bill from congress.gov (the Library of Congress's official API) by its real-world identifier — congress number, bill type and bill number, e.g. the 118th Congress H.R. 1. Returns title, sponsor, current status (congress.gov's free-text `latestAction`) with its date, introduced date, whether/which law it became, and the congress.gov link. Does NOT return bill text, cosponsors, committee assignments or vote history. Requires an API key: a free api.data.gov key works — supplied automatically when called through the Pipeworx gateway.get_public_laws — ANSWERS "how many public laws has the 119th Congress passed" / "most recent public law" / "list of laws enacted this Congress" — returns public (or private) laws enacted in one Congress, from congress.gov's official /law endpoint. GovTrack never had an equivalent endpoint at all. Returns the total count, the most recent law (number, originating bill, title, enactment date), and the list of laws (newest first). Requires an API key (see get_bill).get_members — Get current members of Congress with their name, party, state, district (for representatives), chamber and first term-start year, from congress.gov. Requires an API key (see get_bill).get_votes — ANSWERS "how did the Senate vote on X" / "recent House roll calls" / "cloture vote tally" — recent roll-call votes for ONE chamber, newest first within that chamber + session. House votes come from the Clerk of the House's own records (via congress.gov's official API), addressed directly by roll-call number (House roll numbers are sequential 1..N within a session) — so this is capped at 25 per call for House, since each House vote costs its own upstream request; a higher `limit` is silently clamped with a note, not an error. Senate votes come from the Congressional Record (U.S. Government Publishing Office), which prints every Senate roll call with its member lists; senate.gov itself refuses automated requests and is not read. Each Senate vote carries its number, the Record issue date, the question and outcome sentence as the Record words them (null when the Record text has none this tool can match, never inferred from the tally), and its yea/nay tally; a roll the Record text could not be parsed with confidence is listed under `unparsed`, and a gap in the returned vote numbers is named in `note`. For HOW EACH SENATOR VOTED, attendance and party-line share use congress_member_votes (chamber "senate"). Pass chamber: "house" or "senate" — the two chambers number their votes independently, so there is no combined listing. Returns question, result, yes/no tallies and date for each vote; every response names its own chamber, congress, session and source. Pass congress + session to look at a specific past session (session can only be left out for the CURRENT Congress); omit both for the current session. A chamber/congress/session nothing has been published for returns a named reason, never a silent empty list. A House roll number that congress.gov has no record of (e.g. vacated and never reused) is skipped and named in `note`, not silently missing.get_recent_bills — List the most recent congressional bills — newest first by introduction date or by latest update — from congress.gov. This tool takes NO subject or keyword: it returns whatever Congress touched most recently, so it can only answer OPEN-ENDED recency questions — "what bills were introduced this week", "latest bills in Congress", "what is Congress working on now", "recent activity on bills". PREFER OVER congress_search_bills for exactly those (it ranks by keyword relevance and surfaces older bills). If the question NAMES a bill, act, or subject — "status of the NDAA", "the defense authorization bill", "bills about crypto" — use congress_search_bills instead, even when it asks for the CURRENT status: a named subject cannot be found in an unfiltered recency list, which is mostly routine post-office namings. Returns bill type, number, title, status, sponsor, and dates. Requires an API key (see get_bill).committee_leadership — ANSWERS "who chairs X committee" / "who are the ranking members of every House committee" / "list of committee chairs in Congress" — returns EVERY standing committee in one chamber (or all three chambers) of the 119th Congress with its chair and ranking member (name, party, bioguide id). Pass chamber to scope to "house", "senate" or "joint"; omit it for all three. For one committee's FULL roster (every member, not just the chair/ranking pair) use committee_members instead. SOURCE: github.com/unitedstates/congress-legislators (public domain), baked periodically — NOT GovTrack, which has no committee-leadership endpoint at all. data_as_of in the response is the source data's own last-update date.committee_members — ANSWERS "who is on the House Appropriations committee" / "roster of the Senate Judiciary committee" / "Democratic members of Ways and Means" / "chair of the Armed Services Subcommittee on Cybersecurity" — returns one committee OR SUBCOMMITTEE's full membership with each member's party, rank and title (Chair / Ranking Member / plain member), plus its own chair and ranking member. Identify it by committee_id (the exact id from committee_leadership, e.g. "HSWM" for House Ways and Means, or a subcommittee id like "SSAS21") OR by name — name matching searches SUBCOMMITTEE names too (bare, e.g. "Cybersecurity", or combined with the parent committee, e.g. "Senate Armed Services Subcommittee on Cybersecurity"), ranked exact-name-first; a looser match is disclosed as `alternatives` rather than silently dropped. A name matching only the parent committee (no subcommittee) is returned as the committee with `parent_only_match: true` and a note — never as if it were the more specific thing you asked for. A name with no chamber that matches equally well in BOTH the House and Senate (e.g. bare "Appropriations") returns both as `matches` rather than guessing; pass chamber to pick one directly. A subcommittee response names its parent separately (`parent_committee_id`/`parent_committee_name`) — its `chair`/`ranking_member` are its OWN, never the parent's. For the chair/ranking member of EVERY (top-level) committee at once, use committee_leadership instead — it is cheaper when you do not need the full roster, but does not search subcommittees. SOURCE: github.com/unitedstates/congress-legislators (public domain), baked periodically, current (119th) Congress only.member_committees — ANSWERS "what committees is X on" / "committee assignments for Senator X" — returns every committee and subcommittee assignment (committee name, chamber, rank, title) for one member of the 119th Congress, identified by their bioguide id (the standard Congress.gov/GovInfo member identifier, e.g. "N000015" for Richard Neal — committee_leadership and committee_members both return bioguide ids for the members they list, so look a member up there first if you only have a name). SOURCE: github.com/unitedstates/congress-legislators (public domain), baked periodically, current Congress only.member_legislative_stats — ANSWERS "how many bills has Rep. X sponsored", "how bipartisan is Senator Y", "what share of X's bills have other-party cosponsors" — legislative activity statistics for ONE member of Congress in one Congress, computed from congress.gov records: bills sponsored, bills cosponsored, sponsored bills that became law, and how many of the member's sponsored bills drew at least one cosponsor from the other major party (checked on the newest bills_analysed of them). These are our own computed counts, not an official score, and not GovTrack's ranked report-card metrics (no percentile/rank is computed). Requires an API key (see get_bill).Code samples (curl / TypeScript / one-click client install), schemas, and the live playground are on the pack page:
https://pipeworx.io/packs/congress/
Pipeworx is an open MCP gateway connecting AI agents to live data. pipeworx.io