CongressMCP
A government-affairs platform combining a legislative MCP substrate (bills, members, votes for the 119th Congress) with a workspace-scoped CRM, whip-count boards, member relationship scoring, and per-issue alignment math.
What is CongressMCP?
CongressMCP gives a government-affairs firm — Hill office, advocacy group, lobby shop, coalition — a single working surface for tracking bills, members, organizations, and the firm's relationships with each.
It runs as both:
- An MCP server — 80+ tools your AI assistant (Claude Code, Cursor, Claude Desktop) can call. Most workflows start by pasting a press release URL into Claude and letting the AI extract the org, bill, position, and contacts.
- A web app at
https://www.congressmcp.com— Kanban whip count boards, member portals, organization portals, a US heat map, and an entity browser.
The two share the same Postgres + RLS backend; whatever the AI writes, the web app reflects, and vice versa.
Sign up
- Go to /register, enter your name and email. Click the magic link in your inbox to activate.
- You'll get a personal API key (shown once after the magic-link click) and a default personal workspace.
- For team use, create an organization workspace via the MCP tool
create_workspace(name="Acme Government Affairs", owner_type="organization")after creating an organization withcreate_organization. - The web app's left sidebar has a workspace switcher pinned at the top — click to switch between workspaces.
Install the MCP server
Claude Code (CLI)
claude mcp add congressmcp \
--transport http \
https://www.congressmcp.com/mcp \
--header "Authorization=Bearer YOUR_API_KEY"
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"congressmcp": {
"transport": "http",
"url": "https://www.congressmcp.com/mcp",
"headers": { "Authorization": "Bearer YOUR_API_KEY" }
}
}
}
Cursor
Settings → MCP Servers → Add server with the same HTTP URL and Authorization header.
Once connected, ask Claude "call get_orientation" for the topic map, then "call get_orientation('whip_count')" (or any topic) for a focused playbook.
The web app shell
Every authenticated page has the same chrome:
- Left sidebar (collapsed 56px → expands on hover). Nav: Dashboard, Bills, Members, Caucuses, Organizations, Contacts, Map, Issues, Docs.
- Workspace switcher pinned at the top of the sidebar. Switching reloads the page with the new
workspace_id. - Global search —
⌘K(mac) /Ctrl+K(win) opens a full-screen overlay. Searches bills, members, organizations, contacts, caucuses, and issues. Direct bill_ref hits like119-s-3062are recognized. - User menu at the bottom (your name + email).
Bills
- /bills — all bills tracked by your workspace. Card per bill with sponsor portrait + cosponsor count + latest action.
/bills/:billRef— bill detail with summary stats, organization positions, news/resources (with pullquote treatment for tweets and op-eds), staff notes, timeline, whip count panel, and Whip Math projections./bills/:billRef/whip-count— full Kanban board for the bill (and its companion).
Track a bill via MCP: track_bill(workspace_id, bill_ref="119-s-3062"). Or via the canonical paste-a-URL workflow (see below).
Whip Count Boards
The working surface for a bill or issue. Modeled on the 6-stance vocabulary from whip-code-hub:
strongly-support support undecided against strongly-against not-tallied
Layout
- Bill/issue header — title, sponsor, companion bill (auto-detected from related-bills metadata).
- Master Tally Counter — combined House+Senate or single-chamber breakdown.
- Hero charts — donut chart of stance breakdown + progress bar to the majority threshold (218 House, 51 Senate).
- Chamber cards — click to filter to one chamber.
- Filter bar — search by name, filter state/party/chamber, plus pinned caucus quick-toggles.
- Not-Tallied tray — horizontal row of members with no data yet (or low-confidence "unknown").
- 5-column Kanban — strongly-support → strongly-against, sorted within each column by relationship tier (hot members at top of each column = your call list).
Drag & lean
Drag any member tile between columns to set their stance. The board updates optimistically; the change is persisted to whip_member_stance (for bill boards) or whip_issue_member_stance (for issue boards). Manual overrides always win over computed stance.
Each tile shows a small orange dot if the stance is a manual override. The lean indicator (→ S-Support) appears next to the name when a member is leaning toward an adjacent stance.
Member modal
Click any tile to open the detail modal:
- Stance buttons — set/change the manual override.
- Lean controls — pick an adjacent stance to indicate the direction they're leaning (and a "× clear lean" button).
- Per-bill member note — staff note tied specifically to this member on this bill.
- Computed reasoning — what the system thinks based on cosponsorship/alignment/signals.
- Recent engagements + recent touches — your relationship history with this member.
- Stance history — every stance change with timestamp and source (drag, modal, API).
- Notes tagged to this member on this bill (bill boards only) — quick-add composer for whip intel, vote recs, etc.
Whip Math
For every bill, the Whip Math panel surfaces three categories of projected peers based on cosponsors' voting alignment:
- Next likely cosponsors — same-party allies of current cosponsors with high alignment. The easy whip targets.
- Cross-party potential — opposite-party members with notable alignment. Bipartisan reach.
- In-party at risk — same-party members with LOW alignment. Defection risk.
Each row shows the per-supporter alignment breakdown. MCP tool: get_bill_whip_math(bill_ref).
Members
- /members — all 535 members of the 119th Congress. Filter by chamber/party/state. Toggle Group-by-state for delegation views. Each tile shows a relationship-tier dot from your workspace's touch history.
/members/:bioguide— member portal with the scorecard (relationship + per-issue alignment), sponsored bills, cosponsored bills, workspace signals, whip-count cells, engagements, linked CRM contacts.
Issues
- /issues — your workspace's policy issues with stance + priority + rated-bill count.
/issues/:id/whip-count— full Kanban board aggregated across all bills rated against this issue. Manual overrides win: drag a member to set their stance on the issue independent of cosponsorship inheritance.
Organizations
- /organizations — your workspace's organizations (advocacy groups, 501c3/c4s, trade associations, unions, coalitions, lobbying firms, competitors). Filter by type, coalition partner, or competitor.
/organizations/:id— organization portal with bill positions (support/oppose/monitor), resources sourced from the org (with pullquote rendering for tweets), affiliated contacts, and recent touchpoints.
Contacts
- /contacts — people in your CRM (staff at member offices, donors, journalists, allies). Filter by type.
/contacts/:id— contact portal with affiliations, "Quoted In" pullquote stream, recent activity, and notes.
Caucuses
/caucuses shows workspace-scoped member groups — caucuses (Freedom Caucus, Problem Solvers, CBC), coalitions ("our champions on AHI"), whip targets ("call list for HR-1"), or geographic blocs.
Pinned groups appear as quick-filter chips on every whip count board. Members can belong to multiple groups; groups can mix House + Senate.
Map
/map is a state-tile heat map of stance aggregation across your tracked bills. Each state tile is colored by dominant stance (intensity from a weighted score). Bill scope selector + group filter — switch to see how a specific caucus is distributed, or focus on a single bill.
Workspaces
A workspace is the isolation boundary. Bills, signals, organizations, contacts, notes, member stances all live inside one workspace. Two ownership modes:
owner_type='user'— personal workspace.owner_type='organization'— team workspace under an organization. Members get role-based access viaorganization_members.
Cross-workspace shares (controlled via create_cross_workspace_share) let one workspace's data be readable by another — typical use: a campaign workspace consuming an official-office workspace's bill intelligence under a defined legal-purpose tag.
Stance vocabulary
Six stances form the Kanban + Not-Tallied tray:
- strongly-support — confirmed cosponsor of this bill (or companion), or approved
supportsignal, or manual override. - support — same-party with ≥80% alignment to current cosponsors.
- undecided — same-party with middling alignment (50–70%) or no clear signal.
- against — same-party with low alignment (defection risk) or moderate cross-party signal against.
- strongly-against — approved
opposesignal or strong cross-party / low-alignment evidence. - not-tallied — no data yet. Drag here to clear stance.
Each member can also have a lean — an adjacent stance they're trending toward (e.g. "support, leaning strongly-support" or "undecided, leaning against").
Member scores
Two independent scores per elected official:
- Relationship score — workspace's decayed touch weight (60-day half-life) bucketed into hot ≥50, warm 20–50, cool 5–20, cold <5, never_engaged. Reflects who you know.
- Per-issue alignment scores — for each workspace issue, alignment ∈ [-1, +1] from cosponsorship × bill_rating × importance, normalized. Reflects who agrees with you policy-wise.
MCP tool: get_member_scores(workspace_id, bioguide_id). Surfaced on the member portal scorecard panel.
Tracking a bill
track_bill(workspace_id, bill_ref="119-s-3062") creates a project that anchors all per-bill workspace data: signals, engagements, notes, organization positions, resources, manual stances, etc.
MCP tools — overview
80+ tools across these topic areas. Always start a non-trivial session with get_orientation for the topic map.
get_orientation — start here
Returns the topic map. Then get_orientation(topic="whip_count") for a focused playbook with primary tools, typical workflows, implicit contracts, and pitfalls.
Topics: workspace, bills, members, activities, contacts, engagements, signals, opportunities, pipelines, fundraising, treasury, compliance, whip_count, reports, events, issues, scorecards.
The canonical "paste a URL" workflow
The fastest way to ingest org positions, news, and tweets:
- Paste a press release / tweet / news article URL into your AI client.
- Ask: "Record this in CongressMCP."
- The AI:
- WebFetches the URL and parses org name, bill, position, declared date.
- Calls
search_accountsto resolve the org → account_id (or creates one). - Calls
search_bills+ verifies bill identity by reading the bill text (load-bearing — short titles collide; e.g., 9 different "GUARD Act" bills exist). - Calls
set_organization_position(workspace_id, account_id, bill_ref, position, evidence_url, declared_date, position_strength). - Calls
link_resource_to_billto anchor the URL. - Optionally
analyze_organization_alignmentto surface aligned members.
For tweets specifically: ingest_social_post(workspace_id, bill_ref, url) auto-fetches via Twitter's oEmbed API, extracts the body, auto-resolves the source org by Twitter handle, and creates the resource. Renders as a HUGE pullquote on the bill detail page.
Built on the 119th Congress mirror. Issues, bug reports, feature requests: open a GitHub issue or DM the maintainer.