Atlas / MCP servers / amurshak / Congress

CongressCAUTION

mcp/amurshak/congress

An MCP server allowing AI agents and MCP clients to interface with the Congress.gov API

Verdict
CAUTION
Grade
F
Trust score
60 /100
Exposed tools
24 24r · 0w · 0d
Transport
streamable-http
License
NOASSERTION
Stars
33
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Live U.S. Congressional data for any MCP client — Claude Code, ChatGPT, Copilot, Codex, Cursor, OpenCode, Gemini CLI, Grok Build, and more.

Bills, full bill text, votes, members, committees, hearings, nominations, and the Congressional Record — queried in natural language through the Model Context Protocol. Runs locally on your machine against the free Congress.gov and GovInfo APIs. No account, no hosted service, no telemetry.

Quick Start

1. Get a free Congress.gov API key

Sign up at [api.congress.gov/sign-up](https://api.congress.gov/sign-up/) — takes 30 seconds. The same key also works for GovInfo (full bill text).

2. Install uv

CongressMCP is published on PyPI and launched with uvx, which ships with uv:

# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

(brew install uv, winget install astral-sh.uv, and pipx install uv also work.) Prefer pip? pip install congressmcp gives you a congressmcp command you can use in place of uvx congressmcp below.

3. Connect your client

Every client needs the same three facts: command uvx, args ["congressmcp"], env CONGRESS_API_KEY. Clients are listed roughly by how many professional developers use them today (JetBrains Developer Ecosystem survey, mid-2026, then Pragmatic Engineer's 2026 tooling survey), so the one you want is probably near the top:

Read from source at commit 67ee24b04287OBSERVED · 2026-10-08
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add congressmcp --env CONGRESS_API_KEY=${CONGRESS_API_KEY} --env GOVINFO_API_KEY=${GOVINFO_API_KEY} --env OPENAI_API_KEY=${OPENAI_API_KEY} -- uvx congressmcp
claude-desktop
{
  "mcpServers": {
    "congressmcp": {
      "command": "uvx",
      "args": [
        "congressmcp"
      ],
      "env": {
        "CONGRESS_API_KEY": "${CONGRESS_API_KEY}",
        "GOVINFO_API_KEY": "${GOVINFO_API_KEY}",
        "OPENAI_API_KEY": "${OPENAI_API_KEY}"
      }
    }
  }
}
03

Exposed tools (24)

24 read · 0 write · 0 destructive.

ToolRiskDescription
amendmentsread
billsread
committee_intelligenceread
get_bill_sectionread
get_bill_tocread
get_committee_billsread
get_committee_communicationsread
get_committee_nominationsread
get_committee_reportsread
get_member_cosponsored_legislationread
get_member_detailsread
get_member_sponsored_legislationread
get_members_by_congressread
get_members_by_congress_state_districtread
get_members_by_districtread
get_members_by_stateread
lawsread
records_and_hearingsread
research_and_professionalread
search_bill_textread
search_committeesread
search_membersread
treaties_and_summariesread
voting_and_nominationsread
04

Trust audit

CAUTIONgrade F · trust 60/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
none-observed
Network
declared (6 observation(s))
Shell
declared (4 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (22)

MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
congress_api/features/bill_text/index.py:470
module = _parser if module_name == "parser" else __import__(__name__, fromlist=["_"])
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
scripts/audit_tool_schemas.py:245
resolved_module = importlib.import_module(rel_name, package=container_package)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
scripts/audit_tool_schemas.py:399
handler_module = importlib.import_module(call.module_name)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
scripts/audit_tool_schemas.py:430
handler_module = importlib.import_module(call.module_name)
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
scripts/init_database.py:65
logger.info(f"   API Key: {api_key}")
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/govinfo_search_acceptance.py:85
self.url = f"http://127.0.0.1:{self.port}"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/send_test_email.py:29
api_key="test_api_key_12345_demo",
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/test_e2e_harness.py:137
secret = "ZZfakekeyfakekeyfakekey00"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/test_e2e_harness.py:187
secret = "ZZfakekeyfakekeyfakekey00"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/test_email_templates.py:33
api_key="lawgiver_free_test12345_WelcomeDemo789",
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
tests/test_bare_call_missing_params.py:218
handler_module = __import__(call.module_name, fromlist=[call.orig_name])
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
tests/test_bill_text_wire_conformance.py:406
logger.info("HTTP Request: %s", f"GET https://x/?api_key={secret}")
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
tests/test_bill_text_wire_conformance.py:407
logger.info("bare message carrying %s inline" % f"key={secret}")
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
tests/test_user_creation.py:52
logger.info(f"   🔑 API Key: {api_key}")
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
requirements.txt
mcp, pydantic, pydantic-settings, starlette, uvicorn, annotated-types, anyio, certifi
Why it matters. 26 requirement(s) not pinned with ==
Fix. pin exact versions
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
documentation/fulltext/01-status.md:37
**`"pinned"` shipped (`5242055`) and V11 CLOSED 2026-08-22 — 14/14 scenarios, every check green** (`5e2bb22`; artifact `runs/v11/2026-08-22T035126Z/`, report read by this session; offline sweep indepe
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
documentation/fulltext/01-status.md:54
- **Codex driver (2026-08-18):** the maintainer had the implementation session add a Codex CLI driver to the §17 harness (`012bf8a`, a claim not yet adjudicated here). The cross-vendor cell (§17) is n
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
documentation/fulltext/12-e2e-prompts.md:168
2. **The per-cell canary returns — F23's ratification is amended for new drivers.** The no-canary ratification (import probe + sibling heuristic) was argued on the Claude path, where the only kill mod
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
documentation/fulltext/12-e2e-prompts.md:222
**Fifth adjudication — the F32 re-run (2026-08-20, runs `2026-08-20T171204Z` / `171229Z` / `171300Z`, maintainer-run, build `d24e376` with the F32 fix an ancestor).** Instrument certified per run: can
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
documentation/fulltext/14-defect-priority.md:339
- **F38 — malformed `version` (e.g. `"e nr!"`) surfaced as `internal_error` on `get_bill_section`/`get_bill_toc`; `package_filename()`'s `ValueError` escaped their handlers while `search_bill_text` ca
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
README.md:512
| `CONGRESS_API_ENV` | No | `local` | Set to `development`/`staging`/`production` to load the matching `.env.*` file; unset loads only a plain `.env`. Files never override exported variables |
Why it matters. asks the agent to read credentials
INFOSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
README.md:19
curl -LsSf https://astral.sh/uv/install.sh | sh

Gates applied: no_behavioural_pass.

Audited 2026-10-08 · audit v0.4.1 · source sha 67ee24b04287full audit observations/trust-audit/mcp-server/amurshak__congress.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-0867ee24b04287CAUTIONF60first audit
06

Questions

What is the Congress MCP server?

An MCP server allowing AI agents and MCP clients to interface with the Congress.gov API

What tools does Congress expose?

24 in total: 24 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is Congress safe to connect to an agent?

With care. The audit graded it F (60/100) and found 22 things worth knowing before you trust this server, listed below with the exact line each was found on.

What credentials does Congress need?

It reads CONGRESS_API_KEY, GOVINFO_API_KEY and OPENAI_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does Congress run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on PyPI as congressmcp.

How current is this page?

The grade is for one exact copy of the source (67ee24b04287), read on 2026-10-08. The repository is watched and re-audited when it changes.

Advertisement