@cyanheads/congressgov-mcp-server 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/AGENTS.md +22 -15
  2. package/CLAUDE.md +22 -15
  3. package/Dockerfile +2 -2
  4. package/README.md +211 -92
  5. package/changelog/0.1.x/0.1.0.md +36 -0
  6. package/changelog/0.2.x/0.2.0.md +26 -0
  7. package/changelog/0.2.x/0.2.1.md +16 -0
  8. package/changelog/0.3.x/0.3.0.md +26 -0
  9. package/changelog/0.3.x/0.3.1.md +14 -0
  10. package/changelog/0.3.x/0.3.10.md +15 -0
  11. package/changelog/0.3.x/0.3.11.md +18 -0
  12. package/changelog/0.3.x/0.3.12.md +15 -0
  13. package/changelog/0.3.x/0.3.13.md +20 -0
  14. package/changelog/0.3.x/0.3.14.md +30 -0
  15. package/changelog/0.3.x/0.3.15.md +28 -0
  16. package/changelog/0.3.x/0.3.16.md +34 -0
  17. package/changelog/0.3.x/0.3.17.md +28 -0
  18. package/changelog/0.3.x/0.3.18.md +18 -0
  19. package/changelog/0.3.x/0.3.19.md +36 -0
  20. package/changelog/0.3.x/0.3.2.md +12 -0
  21. package/changelog/0.3.x/0.3.20.md +22 -0
  22. package/changelog/0.3.x/0.3.21.md +15 -0
  23. package/changelog/0.3.x/0.3.22.md +29 -0
  24. package/changelog/0.3.x/0.3.23.md +25 -0
  25. package/changelog/0.3.x/0.3.24.md +20 -0
  26. package/changelog/0.3.x/0.3.25.md +12 -0
  27. package/changelog/0.3.x/0.3.26.md +25 -0
  28. package/changelog/0.3.x/0.3.27.md +16 -0
  29. package/changelog/0.3.x/0.3.28.md +18 -0
  30. package/changelog/0.3.x/0.3.29.md +13 -0
  31. package/changelog/0.3.x/0.3.3.md +11 -0
  32. package/changelog/0.3.x/0.3.30.md +28 -0
  33. package/changelog/0.3.x/0.3.31.md +28 -0
  34. package/changelog/0.3.x/0.3.32.md +21 -0
  35. package/changelog/0.3.x/0.3.4.md +18 -0
  36. package/changelog/0.3.x/0.3.5.md +23 -0
  37. package/changelog/0.3.x/0.3.6.md +10 -0
  38. package/changelog/0.3.x/0.3.7.md +15 -0
  39. package/changelog/0.3.x/0.3.8.md +29 -0
  40. package/changelog/0.3.x/0.3.9.md +21 -0
  41. package/changelog/0.4.x/0.4.0.md +28 -0
  42. package/changelog/0.4.x/0.4.1.md +17 -0
  43. package/changelog/0.4.x/0.4.2.md +39 -0
  44. package/changelog/0.4.x/0.4.3.md +16 -0
  45. package/changelog/0.5.x/0.5.0.md +22 -0
  46. package/changelog/0.5.x/0.5.1.md +16 -0
  47. package/changelog/0.5.x/0.5.2.md +29 -0
  48. package/changelog/0.6.x/0.6.0.md +24 -0
  49. package/changelog/0.7.x/0.7.0.md +13 -0
  50. package/changelog/0.7.x/0.7.1.md +35 -0
  51. package/changelog/template.md +151 -0
  52. package/dist/config/server-config.d.ts +3 -3
  53. package/dist/config/server-config.d.ts.map +1 -1
  54. package/dist/config/server-config.js +6 -3
  55. package/dist/config/server-config.js.map +1 -1
  56. package/dist/index.js +23 -3
  57. package/dist/index.js.map +1 -1
  58. package/dist/mcp-server/tools/definitions/bill-lookup.tool.d.ts +7 -0
  59. package/dist/mcp-server/tools/definitions/bill-lookup.tool.d.ts.map +1 -1
  60. package/dist/mcp-server/tools/definitions/bill-lookup.tool.js +2 -2
  61. package/dist/mcp-server/tools/definitions/bill-summaries.tool.d.ts +4 -0
  62. package/dist/mcp-server/tools/definitions/bill-summaries.tool.d.ts.map +1 -1
  63. package/dist/mcp-server/tools/definitions/bill-summaries.tool.js +2 -2
  64. package/dist/mcp-server/tools/definitions/committee-lookup.tool.d.ts +4 -0
  65. package/dist/mcp-server/tools/definitions/committee-lookup.tool.d.ts.map +1 -1
  66. package/dist/mcp-server/tools/definitions/committee-lookup.tool.js +2 -2
  67. package/dist/mcp-server/tools/definitions/committee-reports.tool.d.ts +7 -0
  68. package/dist/mcp-server/tools/definitions/committee-reports.tool.d.ts.map +1 -1
  69. package/dist/mcp-server/tools/definitions/committee-reports.tool.js +2 -2
  70. package/dist/mcp-server/tools/definitions/crs-reports.tool.d.ts +4 -0
  71. package/dist/mcp-server/tools/definitions/crs-reports.tool.d.ts.map +1 -1
  72. package/dist/mcp-server/tools/definitions/crs-reports.tool.js +2 -2
  73. package/dist/mcp-server/tools/definitions/daily-record.tool.d.ts +7 -0
  74. package/dist/mcp-server/tools/definitions/daily-record.tool.d.ts.map +1 -1
  75. package/dist/mcp-server/tools/definitions/daily-record.tool.js +2 -2
  76. package/dist/mcp-server/tools/definitions/enacted-laws.tool.d.ts +4 -0
  77. package/dist/mcp-server/tools/definitions/enacted-laws.tool.d.ts.map +1 -1
  78. package/dist/mcp-server/tools/definitions/enacted-laws.tool.js +2 -2
  79. package/dist/mcp-server/tools/definitions/member-lookup.tool.d.ts +4 -0
  80. package/dist/mcp-server/tools/definitions/member-lookup.tool.d.ts.map +1 -1
  81. package/dist/mcp-server/tools/definitions/member-lookup.tool.js +2 -2
  82. package/dist/mcp-server/tools/definitions/roll-votes.tool.d.ts +4 -0
  83. package/dist/mcp-server/tools/definitions/roll-votes.tool.d.ts.map +1 -1
  84. package/dist/mcp-server/tools/definitions/roll-votes.tool.js +2 -2
  85. package/dist/mcp-server/tools/definitions/search-bills.tool.d.ts +1 -1
  86. package/dist/mcp-server/tools/definitions/search-bills.tool.js +3 -3
  87. package/dist/mcp-server/tools/definitions/senate-nominations.tool.d.ts +4 -0
  88. package/dist/mcp-server/tools/definitions/senate-nominations.tool.d.ts.map +1 -1
  89. package/dist/mcp-server/tools/definitions/senate-nominations.tool.js +2 -2
  90. package/dist/mcp-server/tools/tool-helpers.d.ts +7 -0
  91. package/dist/mcp-server/tools/tool-helpers.d.ts.map +1 -1
  92. package/dist/mcp-server/tools/tool-helpers.js +7 -0
  93. package/dist/mcp-server/tools/tool-helpers.js.map +1 -1
  94. package/dist/services/congress-api/congress-api-service.d.ts.map +1 -1
  95. package/dist/services/congress-api/congress-api-service.js +8 -11
  96. package/dist/services/congress-api/congress-api-service.js.map +1 -1
  97. package/dist/services/congress-documents/congress-documents-service.d.ts.map +1 -1
  98. package/dist/services/congress-documents/congress-documents-service.js +10 -9
  99. package/dist/services/congress-documents/congress-documents-service.js.map +1 -1
  100. package/dist/services/congress-mirror/congress-mirror-service.js +1 -1
  101. package/dist/services/congress-mirror/ingest.d.ts +1 -1
  102. package/dist/services/congress-mirror/types.d.ts +1 -1
  103. package/dist/services/senate-lis/senate-vote-service.d.ts.map +1 -1
  104. package/dist/services/senate-lis/senate-vote-service.js +9 -7
  105. package/dist/services/senate-lis/senate-vote-service.js.map +1 -1
  106. package/package.json +11 -9
  107. package/server.json +3 -3
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  <div align="center">
9
9
 
10
- [![Version](https://img.shields.io/badge/Version-0.7.0-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/congressgov-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^2.0.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/congressgov-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/congressgov-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^7.0.2-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.4.0-blueviolet.svg?style=flat-square)](https://bun.sh/)
10
+ [![Version](https://img.shields.io/badge/Version-0.7.1-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/congressgov-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^2.0.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/congressgov-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/congressgov-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^7.0.2-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.4.0-blueviolet.svg?style=flat-square)](https://bun.sh/)
11
11
 
12
12
  </div>
13
13
 
@@ -27,9 +27,11 @@
27
27
 
28
28
  ---
29
29
 
30
- ## Tools
30
+ ## Overview
31
31
 
32
- Eleven read-only tools for querying U.S. legislative data:
32
+ U.S. congressional data from the Congress.gov API v3 and the Senate's official vote feed — bills, enacted laws, members, committees, roll call votes, and presidential nominations. Browse legislative activity, read bill and report text, and track the Senate confirmation pipeline from any MCP client. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.
33
+
34
+ ### Tools
33
35
 
34
36
  | Tool | Description |
35
37
  |:---|:---|
@@ -45,122 +47,188 @@ Eleven read-only tools for querying U.S. legislative data:
45
47
  | `congressgov_daily_record` | Browse the daily Congressional Record — floor speeches, debates, and proceedings |
46
48
  | `congressgov_search_bills` | Keyword-search bill titles and CRS summaries via a local full-text mirror (opt-in, off by default) |
47
49
 
48
- ### `congressgov_bill_lookup`
50
+ ### Resources
49
51
 
50
- Browse and retrieve U.S. legislative bill data from Congress.gov.
52
+ | Resource | Description |
53
+ |:---|:---|
54
+ | `congress://current` | Current congress number, session dates, chamber info |
55
+ | `congress://bill-types` | Reference table of valid bill type codes |
56
+ | `congress://member/{bioguideId}` | Member profile by bioguide ID |
57
+ | `congress://bill/{congress}/{billType}/{billNumber}` | Bill detail by congress, type, and number |
58
+ | `congress://committee/{committeeCode}` | Committee detail by committee code |
59
+
60
+ Bill, member, and committee data is also reachable through `congressgov_bill_lookup`, `congressgov_member_lookup`, and `congressgov_committee_lookup` (operation `get`) — many MCP clients are tool-only and never surface resources.
51
61
 
52
- - Filter by congress number, bill type, and update-date range
53
- - Retrieve detailed sub-resources: actions, amendments, committees, cosponsors, related bills, subjects, summaries, text versions, and titles
54
- - `content` reads a text version's actual document text, a bounded character window at a time — pick the version with `textVersionIndex`, the window with `characterOffset`/`characterLimit`, and follow `nextOffset` to walk a full bill
55
- - `list` defaults to `order='recent'` (newest update-date first); pass `order='oldest'` for ascending
56
- - Pagination support for browsing large result sets
62
+ ### Prompts
63
+
64
+ | Prompt | Description |
65
+ |:---|:---|
66
+ | `congressgov_bill_analysis` | Structured framework for analyzing a bill |
67
+ | `congressgov_legislative_research` | Research framework for a policy area across Congress |
68
+
69
+ ## Capability reference
70
+
71
+ ### `congressgov_bill_lookup` <sub>tool</sub>
72
+
73
+ - Operations: `list` (browse by congress/billType/date range — no keyword search), `get` (full detail), or drill into `actions`, `amendments`, `cosponsors`, `committees`, `subjects`, `summaries`, `text`, `titles`, `related`
74
+ - `list` defaults to `order='recent'` (newest update-date first); `limit` 1–250, `offset` pagination
75
+ - `content` reads a text version's actual document text: select the version with `textVersionIndex` (0-based, against `text`'s order), the window with `characterOffset`/`characterLimit` (1–100,000 chars, default 25,000), and follow `nextOffset` to walk a full bill
76
+ - Typed failures on `content`: `document_unavailable`, `format_unavailable`, `document_fetch_failed`, `document_too_large`, `offset_past_end`, alongside the shared `not_found` / `rate_limited` / `invalid_request` / `upstream_error` set
57
77
 
58
78
  ---
59
79
 
60
- ### `congressgov_member_lookup`
80
+ ### `congressgov_enacted_laws` <sub>tool</sub>
61
81
 
62
- Discover congressional members and their legislative activity.
82
+ - `list` filters by congress and `lawType` (`pub` public laws, `priv` private) — the enactment-status filter `congressgov_bill_lookup` doesn't offer
83
+ - `get` returns the origin bill record; the law citation lives on the bill's `laws[]` array (e.g. `{"number":"118-2","type":"Public Law"}`)
84
+ - `lawNumber` accepts either the bare number (`90`) or the full `{congress}-{number}` citation a `list` row carries; a citation naming a different congress than the `congress` param is rejected rather than silently resolved
85
+ - `limit` 1–250, `offset` pagination for `list`
63
86
 
64
- - Browse by state, district, congress number, and chamber
65
- - Retrieve a member's sponsored and cosponsored legislation
66
- - Look up specific members by bioguide ID
87
+ ---
88
+
89
+ ### `congressgov_member_lookup` <sub>tool</sub>
90
+
91
+ - No name search — `list` filters by `stateCode` (+ optional `district`, which requires `stateCode`), `congress`, and `currentMember`
92
+ - `get` returns the full profile by `bioguideId` (e.g. `P000197`); `sponsored`/`cosponsored` return that member's legislative portfolio
93
+ - `limit` 1–250, `offset` pagination
67
94
 
68
95
  ---
69
96
 
70
- ### `congressgov_committee_lookup`
97
+ ### `congressgov_committee_lookup` <sub>tool</sub>
98
+
99
+ - Committee codes are chamber-prefix (`h`/`s`/`j`) + abbreviation + 2-digit number (e.g. `hsju00`); `get` and sub-resources infer chamber from the prefix, or accept an explicit override
100
+ - `committeeCode` also accepts a committee name, resolved automatically (all-token match, then a bigram-similarity fallback labeled `approximate: true`) against the full cross-chamber roster
101
+ - `list` with `filter` name-matches the same way, paging past the 250-row upstream cap to search the complete roster before filtering
102
+ - `bills` sub-resource defaults to `order='recent'` (newest update-date first, computed client-side since upstream ignores sort); rows carry no titles — chain `congressgov_bill_lookup get` per row
103
+ - `nominations` sub-resource is Senate-only
104
+
105
+ ---
71
106
 
72
- Browse congressional committees and their legislation, reports, and nominations.
107
+ ### `congressgov_roll_votes` <sub>tool</sub>
73
108
 
74
- - Filter by chamber (House, Senate, Joint)
75
- - Retrieve committee bills, reports, and nominations
76
- - Detail and sub-resource lookups need only `committeeCode` — `chamber` is auto-detected from the code
77
- - Committee bills default to `order='recent'` (newest-first); pass `order='oldest'` for ascending update-date order
109
+ - `chamber` is `house` (default, Congress.gov API) or `senate` (the Senate's official LIS XML feed — the API exposes no Senate votes)
110
+ - `list` browses by congress + session (1 or 2), newest-first by default (computed client-side for strict ordering); `get` returns tallies and party breakdown, `members` returns each member's recorded position
111
+ - Roll call numbers reset each session and are specific to one chamber
112
+ - `limit` 1–250, `offset` pagination for `list` and `members`
78
113
 
79
114
  ---
80
115
 
81
- ### `congressgov_roll_votes`
116
+ ### `congressgov_senate_nominations` <sub>tool</sub>
117
+
118
+ - Nominations use `PN` numbering; `list` browses by congress, `get` returns detail, `actions`/`committees`/`hearings` cover the confirmation pipeline, `nominees` returns individuals in a batch (requires `ordinal`)
119
+ - Multi-part parents (e.g. `PN851`) carry no activity of their own — sub-resources live on partitioned children (`851-1`, `851-2`, …); a bare-parent sub-resource call on such a nomination returns an enrichment notice pointing at the partitioned form
120
+ - `ordinal` is discovered from the nomination's `nominees` array via `get` first
121
+
122
+ ---
82
123
 
83
- Retrieve House and Senate roll call votes and individual member voting positions.
124
+ ### `congressgov_bill_summaries` <sub>tool</sub>
84
125
 
85
- - Set `chamber` to `house` (default, from the Congress.gov API) or `senate` (from the Senate's official LIS feed — the API exposes no Senate votes)
86
- - `list` browses votes by congress and session, newest first; pass `order='oldest'` for ascending
87
- - `get` returns the question, result, tallies, party breakdown, and associated bill/nomination/amendment
88
- - `members` returns each member's recorded position
126
+ - Filters by `congress` and `billType` (requires `congress`); date filters apply to the CRS summary's update time, not the bill's action date
127
+ - Defaults to summaries updated in the last 7 days when neither date bound is supplied
128
+ - For summaries of one specific bill, use `congressgov_bill_lookup` with `operation='summaries'` instead
89
129
 
90
130
  ---
91
131
 
92
- ### `congressgov_bill_summaries`
132
+ ### `congressgov_crs_reports` <sub>tool</sub>
133
+
134
+ - Report IDs use letter-number codes (e.g. `R40097`, `RL33612`, `IF12345`)
135
+ - `list` browses the catalog; `get` returns full detail (authors, topics, summary, download formats) by `reportNumber`
136
+ - `limit` 1–250, `offset` pagination for `list`
93
137
 
94
- Browse recent CRS bill summaries.
138
+ ---
95
139
 
96
- - Filter by congress and bill type
97
- - Browse chronologically to see what's moving through Congress
140
+ ### `congressgov_committee_reports` <sub>tool</sub>
141
+
142
+ - Report types: `hrpt` (House), `srpt` (Senate), `erpt` (Executive); `list` browses by congress + optional `reportType`, `get` returns citation/title/committees/associated bill
143
+ - `text` lists each format's `{type, url}` link (report formats arrive one per entry, unlike bill text versions); `content` then reads the actual text, a bounded character window at a time via `characterOffset`/`characterLimit` (1–100,000 chars, default 25,000)
144
+ - Typed failures on `content`: `document_unavailable`, `format_unavailable`, `document_fetch_failed`, `document_too_large`, `offset_past_end`
98
145
 
99
146
  ---
100
147
 
101
- ### `congressgov_crs_reports`
148
+ ### `congressgov_daily_record` <sub>tool</sub>
149
+
150
+ - Hierarchical navigation: `list` (volumes) → `issues` (within a volume) → `articles` (within an issue)
151
+ - `content` reads one article's text, selected by `articleIndex` (0-based) and bounded by `characterOffset`/`characterLimit`; the Congressional Record publishes Formatted Text and PDF only (no XML)
152
+ - Typed failures on `content`: `document_unavailable`, `format_unavailable`, `document_fetch_failed`, `document_too_large`, `offset_past_end`
102
153
 
103
- Browse and retrieve CRS reports — nonpartisan policy analyses written by subject-matter experts at the Library of Congress.
154
+ ---
104
155
 
105
- - Browse the full report catalog
106
- - Retrieve individual reports by product number
156
+ ### `congressgov_search_bills` <sub>tool</sub>
157
+
158
+ - **Opt-in:** off by default and absent from `tools/list` entirely until `CONGRESS_MIRROR_ENABLED=true`
159
+ - Keyword-searches a local SQLite FTS5 mirror of bill titles + CRS summaries — the discovery path the Congress.gov API itself lacks; policy area and full bill text are not indexed
160
+ - Narrows with `congress`, `billType`, and `originChamber`; returns BM25-ranked matches with each bill's derived id, ready for a follow-up `congressgov_bill_lookup` call
161
+ - With the flag set but the index not yet built (`bun run mirror:init`), the tool answers with an empty result and a build-the-index notice instead of an error
162
+ - `limit` 1–100 (a narrower cap than the other tools' 1–250), `offset` pagination
107
163
 
108
164
  ---
109
165
 
110
- ### `congressgov_daily_record`
166
+ ### `congress://current` <sub>resource</sub>
111
167
 
112
- Browse the daily Congressional Record — floor speeches, debates, and legislative text published each day Congress is in session.
168
+ - Current congress number, session dates, and chamber info — baseline context for other queries
169
+ - Cached publicly for 1 hour
113
170
 
114
- - Browse volumes by congress number
115
- - Retrieve specific issue articles
116
- - `content` reads one article's actual text, selected by `articleIndex` and bounded by `characterOffset`/`characterLimit`
171
+ ---
172
+
173
+ ### `congress://bill-types` <sub>resource</sub>
174
+
175
+ - Static reference table of the 8 valid bill type codes (`hr`, `s`, `hjres`, `sjres`, `hconres`, `sconres`, `hres`, `sres`) with chamber and an example citation
176
+ - Cached publicly for 24 hours — fixed by chamber rules, not fetched upstream
117
177
 
118
178
  ---
119
179
 
120
- ### `congressgov_search_bills`
180
+ ### `congress://member/{bioguideId}` <sub>resource</sub>
121
181
 
122
- Keyword-search bill titles and CRS summaries against a local full-text mirror — the discovery path the Congress.gov API itself lacks.
182
+ - `bioguideId` must match one uppercase letter followed by 6 digits (e.g. `P000197`)
183
+ - Returns the member profile — name, state, party, terms, leadership, office, legislation counts
123
184
 
124
- - **Opt-in:** off by default, and not offered to clients until `CONGRESS_MIRROR_ENABLED=true`. With the flag set but the index not yet built (`bun run mirror:init`), the tool is callable and answers with an empty result and a build-the-index notice
125
- - Narrow with `congress`, `billType`, and `originChamber` filters
126
- - Returns BM25-ranked matches with each bill's derived id, ready for a follow-up `congressgov_bill_lookup` call
185
+ ---
127
186
 
128
- ## Resources
187
+ ### `congress://bill/{congress}/{billType}/{billNumber}` <sub>resource</sub>
129
188
 
130
- | URI Pattern | Description |
131
- |:---|:---|
132
- | `congress://current` | Current congress number, session dates, chamber info |
133
- | `congress://bill-types` | Reference table of valid bill type codes |
134
- | `congress://member/{bioguideId}` | Member profile by bioguide ID |
135
- | `congress://bill/{congress}/{billType}/{billNumber}` | Bill detail by congress, type, and number |
136
- | `congress://committee/{committeeCode}` | Committee detail by committee code |
189
+ - `congress` and `billNumber` must be positive integers; `billType` must be a valid bill type code
190
+ - Returns bill detail — sponsor, status, policy area, committees, latest action
137
191
 
138
- ## Prompts
192
+ ---
139
193
 
140
- | Prompt | Description |
141
- |:---|:---|
142
- | `congressgov_bill_analysis` | Structured framework for analyzing a bill |
143
- | `congressgov_legislative_research` | Research framework for a policy area across Congress |
194
+ ### `congress://committee/{committeeCode}` <sub>resource</sub>
144
195
 
145
- ## Features
196
+ - `committeeCode` must match `h`/`s`/`j` followed by 3–8 lowercase alphanumeric characters (e.g. `hsju00`); chamber is inferred from the first letter
197
+ - Returns committee detail — name, chamber, subcommittees, history, legislation counts
198
+
199
+ ---
200
+
201
+ ### `congressgov_bill_analysis` <sub>prompt</sub>
202
+
203
+ - Arguments: `congress`, `billType`, `billNumber` — all required strings
204
+ - Returns one user message framing a structured analysis (summary, sponsors, committee referrals, action timeline, related legislation, policy implications, outlook) and naming which tools to call for each section
205
+
206
+ ---
146
207
 
147
- Built on [`@cyanheads/mcp-ts-core`](https://github.com/cyanheads/mcp-ts-core):
208
+ ### `congressgov_legislative_research` <sub>prompt</sub>
148
209
 
149
- - Declarative tool definitions — single file per tool, framework handles registration and validation
150
- - Unified error handling across all tools
151
- - Pluggable auth (`none`, `jwt`, `oauth`)
152
- - Swappable storage backends: `in-memory`, `filesystem`, `Supabase`
153
- - Structured logging with optional OpenTelemetry tracing
154
- - Runs locally (stdio/HTTP) or in Docker from the same codebase
210
+ - Arguments: `topic` required; `congress` optional (defaults to the current congress)
211
+ - The discovery plan is configuration-aware: with `CONGRESS_MIRROR_ENABLED` it opens with `congressgov_search_bills`; without it, it asks for a seed (a bill, member, committee, or CRS report id) since no registered tool accepts a topic string
212
+ - Synthesizes findings into landscape, key players, substance, recent activity, and outlook
213
+
214
+ ## Features
215
+
216
+ Built on [`@cyanheads/mcp-ts-core`](https://github.com/cyanheads/mcp-ts-core): stdio and Streamable HTTP transports, pluggable auth (`none` / `jwt` / `oauth`), swappable storage (`in-memory`, `filesystem`, `Supabase`, `Cloudflare KV/R2/D1`), structured logging with optional OpenTelemetry tracing.
155
217
 
156
218
  Congress.gov-specific:
157
219
 
158
- - Type-safe client for the Congress.gov REST API v3
220
+ - Type-safe client for the Congress.gov REST API v3, plus a second client for the Senate's official LIS XML feed (`fast-xml-parser`) backing Senate roll votes
159
221
  - Optional API key from [api.data.gov](https://api.data.gov/signup/) — defaults to `DEMO_KEY` (30 req/hr); own key gets 5,000 req/hr
160
- - Automatic pagination and response normalization
161
- - Rate limiting awareness
222
+ - Bounded document-text retrieval for bill text, committee reports, and Congressional Record articles — a 25 MB fetch ceiling, 30s deadline, and a `www.congress.gov` host allowlist
223
+ - Opt-in local SQLite FTS5 mirror (`CONGRESS_MIRROR_ENABLED`) adds keyword search over bill titles and CRS summaries, the one discovery path the API itself lacks
162
224
  - All tools are read-only and idempotent
163
225
 
226
+ Agent-friendly output:
227
+
228
+ - Effective-query echo and total-count enrichment on every browse/list operation, plus a notice when a query resolves to zero matches or an offset runs past the end
229
+ - Character-exact document windows — `content` operations return `offset`/`nextOffset` so walking a multi-megabyte bill or report never skips or repeats a character
230
+ - Typed failure reasons on document reads (`document_unavailable`, `format_unavailable`, `document_too_large`, `offset_past_end`, …) alongside the shared upstream-error set, each resolved to a recovery hint
231
+
164
232
  ## Getting started
165
233
 
166
234
  ### Public Hosted Instance
@@ -190,6 +258,8 @@ Add the following to your MCP client configuration file.
190
258
  "command": "bunx",
191
259
  "args": ["@cyanheads/congressgov-mcp-server@latest"],
192
260
  "env": {
261
+ "MCP_TRANSPORT_TYPE": "stdio",
262
+ "MCP_LOG_LEVEL": "info",
193
263
  "CONGRESS_API_KEY": "your-api-key"
194
264
  }
195
265
  }
@@ -207,6 +277,8 @@ Or with npx (no Bun required):
207
277
  "command": "npx",
208
278
  "args": ["-y", "@cyanheads/congressgov-mcp-server@latest"],
209
279
  "env": {
280
+ "MCP_TRANSPORT_TYPE": "stdio",
281
+ "MCP_LOG_LEVEL": "info",
210
282
  "CONGRESS_API_KEY": "your-api-key"
211
283
  }
212
284
  }
@@ -214,11 +286,37 @@ Or with npx (no Bun required):
214
286
  }
215
287
  ```
216
288
 
289
+ Or with Docker:
290
+
291
+ ```json
292
+ {
293
+ "mcpServers": {
294
+ "congressgov-mcp-server": {
295
+ "type": "stdio",
296
+ "command": "docker",
297
+ "args": [
298
+ "run", "-i", "--rm",
299
+ "-e", "MCP_TRANSPORT_TYPE=stdio",
300
+ "-e", "CONGRESS_API_KEY=your-api-key",
301
+ "ghcr.io/cyanheads/congressgov-mcp-server:latest"
302
+ ]
303
+ }
304
+ }
305
+ }
306
+ ```
307
+
217
308
  Get a free API key at [api.data.gov/signup](https://api.data.gov/signup/) for 5,000 req/hr. Without a key the server falls back to `DEMO_KEY` (30 req/hr).
218
309
 
310
+ For Streamable HTTP, set the transport and start the server:
311
+
312
+ ```sh
313
+ MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 CONGRESS_API_KEY=your-api-key bun run start:http
314
+ # Server listens at http://localhost:3010/mcp
315
+ ```
316
+
219
317
  ### Prerequisites
220
318
 
221
- - [Bun v1.3.2](https://bun.sh/) or higher.
319
+ - [Bun v1.4.0](https://bun.sh/) or higher (or Node.js v24+).
222
320
 
223
321
  ### Installation
224
322
 
@@ -240,22 +338,33 @@ cd congressgov-mcp-server
240
338
  bun install
241
339
  ```
242
340
 
243
- ## Configuration
341
+ 4. **Configure environment:**
244
342
 
245
- All configuration is validated at startup via Zod schemas in `src/config/server-config.ts`. Key environment variables:
343
+ ```sh
344
+ cp .env.example .env
345
+ # edit .env and set required vars
346
+ ```
347
+
348
+ ## Configuration
246
349
 
247
350
  | Variable | Description | Default |
248
351
  |:---|:---|:---|
249
- | `CONGRESS_API_KEY` | Optional. API key from [api.data.gov](https://api.data.gov/signup/). Omit to use `DEMO_KEY` (30 req/hr); own key: 5,000 req/hr. | `DEMO_KEY` |
250
- | `CONGRESS_API_BASE_URL` | Congress.gov API base URL | `https://api.congress.gov/v3` |
251
- | `MCP_TRANSPORT_TYPE` | Transport: `stdio` or `http` | `stdio` |
252
- | `MCP_HTTP_PORT` | HTTP server port | `3010` |
253
- | `MCP_AUTH_MODE` | Authentication: `none`, `jwt`, or `oauth` | `none` |
254
- | `MCP_SESSION_MODE` | HTTP session mode: `auto`, `stateful`, or `stateless`. This server holds no per-session state; the Docker image runs `stateless`. | `auto` (resolves to `stateful`) |
255
- | `MCP_LOG_LEVEL` | Log level (`debug`, `info`, `warning`, `error`, etc.) | `info` |
352
+ | `CONGRESS_API_KEY` | API key from [api.data.gov](https://api.data.gov/signup/). Omit to use `DEMO_KEY` (30 req/hr); own key: 5,000 req/hr. | `DEMO_KEY` |
353
+ | `CONGRESS_API_BASE_URL` | Congress.gov API base URL. | `https://api.congress.gov/v3` |
354
+ | `CONGRESS_MIRROR_ENABLED` | Enable the local bill search mirror and the `congressgov_search_bills` tool. | `false` |
355
+ | `CONGRESS_MIRROR_PATH` | Filesystem path to the SQLite mirror index. | `.mirror/bills.sqlite3` |
356
+ | `CONGRESS_MIRROR_REFRESH_CRON` | Cron schedule for the in-process mirror refresh (HTTP transport only). Unset runs `mirror:refresh` manually. | — |
357
+ | `CONGRESS_MIRROR_CONGRESSES` | Comma-separated congress numbers to mirror (e.g. `118,119`). | current congress + 1 prior |
358
+ | `MCP_TRANSPORT_TYPE` | Transport: `stdio` or `http`. | `stdio` |
359
+ | `MCP_HTTP_PORT` | HTTP server port. | `3010` |
360
+ | `MCP_AUTH_MODE` | Authentication: `none`, `jwt`, or `oauth`. | `none` |
361
+ | `MCP_SESSION_MODE` | HTTP session mode: `auto`, `stateful`, or `stateless`; `auto` resolves to `stateful`. | `stateless` |
362
+ | `MCP_LOG_LEVEL` | Log level (`debug`, `info`, `notice`, `warning`, `error`, etc.). | `info` |
256
363
  | `LOGS_DIR` | Directory for log files (Node.js only). | `<project-root>/logs` |
257
- | `STORAGE_PROVIDER_TYPE` | Storage backend | `in-memory` |
258
- | `OTEL_ENABLED` | Enable [OpenTelemetry instrumentation](https://github.com/cyanheads/mcp-ts-core/tree/main/docs/telemetry) (spans, metrics, completion logs) | `false` |
364
+ | `STORAGE_PROVIDER_TYPE` | Storage backend. | `in-memory` |
365
+ | `OTEL_ENABLED` | Enable [OpenTelemetry instrumentation](https://github.com/cyanheads/mcp-ts-core/tree/main/docs/telemetry) (spans, metrics, completion logs). | `false` |
366
+
367
+ See [`.env.example`](./.env.example) for the full list of optional overrides.
259
368
 
260
369
  ## Running the server
261
370
 
@@ -269,27 +378,36 @@ All configuration is validated at startup via Zod schemas in `src/config/server-
269
378
  ```
270
379
 
271
380
  - **Run checks and tests:**
381
+
272
382
  ```sh
273
- bun run devcheck # Lints, formats, type-checks
274
- bun run test # Runs test suite
383
+ bun run devcheck # Lint, format, typecheck, security
384
+ bun run test # Vitest test suite
385
+ bun run lint:mcp # Validate MCP definitions against spec
275
386
  ```
276
387
 
277
388
  ### Docker
278
389
 
279
390
  ```sh
280
391
  docker build -t congressgov-mcp-server .
281
- docker run -e CONGRESS_API_KEY=your-api-key -p 3010:3010 congressgov-mcp-server
392
+ docker run --rm -e CONGRESS_API_KEY=your-api-key -p 3010:3010 congressgov-mcp-server
282
393
  ```
283
394
 
395
+ The Dockerfile defaults to HTTP transport, stateless session mode, and logs to `/var/log/congressgov-mcp-server`. OpenTelemetry peer dependencies are installed by default — build with `--build-arg OTEL_ENABLED=false` to omit them.
396
+
284
397
  ## Project structure
285
398
 
286
399
  | Directory | Purpose |
287
400
  |:---|:---|
288
- | `src/mcp-server/tools/definitions/` | Tool definitions (`*.tool.ts`). Eleven Congress.gov tools. |
289
- | `src/mcp-server/resources/definitions/` | Resource definitions. Congress, bill, member, and committee resources. |
290
- | `src/mcp-server/prompts/definitions/` | Prompt definitions. Bill analysis and legislative research prompts. |
291
- | `src/services/congress-api/` | Congress.gov API client — auth, pagination, rate limiting. |
401
+ | `src/index.ts` | `createApp()` entry point — registers tools/resources/prompts and inits services. |
292
402
  | `src/config/` | Server-specific environment variable parsing and validation with Zod. |
403
+ | `src/mcp-server/tools/definitions/` | Tool definitions (`*.tool.ts`) — eleven Congress.gov tools. |
404
+ | `src/mcp-server/resources/definitions/` | Resource definitions (`*.resource.ts`) — congress, bill, member, and committee resources. |
405
+ | `src/mcp-server/prompts/definitions/` | Prompt definitions (`*.prompt.ts`) — bill analysis and legislative research. |
406
+ | `src/services/congress-api/` | Congress.gov API client — auth, pagination, rate limiting. |
407
+ | `src/services/congress-documents/` | Bounded document-text fetch — host allowlist, byte ceiling, character window. |
408
+ | `src/services/congress-mirror/` | Local SQLite FTS5 bill-search mirror — ingest, normalize, schema. |
409
+ | `src/services/senate-lis/` | Senate LIS XML client for Senate roll call votes. |
410
+ | `scripts/` | Mirror lifecycle CLI scripts (`mirror:init` / `mirror:refresh` / `mirror:verify`). |
293
411
  | `tests/` | Unit and integration tests, mirroring the `src/` structure. |
294
412
 
295
413
  ## Development guide
@@ -297,12 +415,13 @@ docker run -e CONGRESS_API_KEY=your-api-key -p 3010:3010 congressgov-mcp-server
297
415
  See [`CLAUDE.md`](./CLAUDE.md) for development guidelines and architectural rules. The short version:
298
416
 
299
417
  - Handlers throw, framework catches — no `try/catch` in tool logic
300
- - Use `ctx.log` for logging, `ctx.state` for storage
301
- - All tools are read-only with `readOnlyHint: true` and `idempotentHint: true`
418
+ - Use `ctx.log` for request-scoped logging, `ctx.state` for tenant-scoped storage
419
+ - All tools are read-only, with `readOnlyHint: true` and `idempotentHint: true` annotations
420
+ - Wrap external API calls: validate raw → normalize to a domain type → return the output schema; never fabricate missing fields
302
421
 
303
422
  ## Contributing
304
423
 
305
- Issues and pull requests are welcome. Run checks and tests before submitting:
424
+ Issues are welcome. Run checks and tests before submitting:
306
425
 
307
426
  ```sh
308
427
  bun run devcheck
@@ -311,4 +430,4 @@ bun run test
311
430
 
312
431
  ## License
313
432
 
314
- This project is licensed under the Apache 2.0 License. See the [LICENSE](./LICENSE) file for details.
433
+ Apache-2.0 — see [LICENSE](./LICENSE) for details.
@@ -0,0 +1,36 @@
1
+ ---
2
+ summary: Initial release — MCP server wrapping Congress.gov API v3 with 10 tools, 5 resources, and 2 prompts for U.S. legislative data
3
+ breaking: false
4
+ ---
5
+
6
+ # 0.1.0 — 2026-03-24
7
+
8
+ Initial release. MCP server wrapping the Congress.gov API v3 — the official machine-readable interface to U.S. legislative data maintained by the Library of Congress.
9
+
10
+ ### Added
11
+
12
+ - **10 read-only tools** for querying legislative data:
13
+ - `congressgov_bill_lookup` — browse, filter, and retrieve bill data (actions, sponsors, summaries, text, related bills)
14
+ - `congressgov_enacted_laws` — browse enacted public and private laws by congress
15
+ - `congressgov_member_lookup` — discover members by state/district/congress, retrieve legislative portfolios
16
+ - `congressgov_committee_lookup` — browse committees and retrieve legislation, reports, nominations
17
+ - `congressgov_roll_votes` — retrieve House roll call votes and member voting positions
18
+ - `congressgov_senate_nominations` — browse presidential nominations, track Senate confirmation pipeline
19
+ - `congressgov_bill_summaries` — browse recent CRS bill summaries
20
+ - `congressgov_crs_reports` — browse and retrieve nonpartisan CRS policy analysis reports
21
+ - `congressgov_committee_reports` — browse and retrieve committee reports accompanying legislation
22
+ - `congressgov_daily_record` — browse daily Congressional Record (floor speeches, debates, proceedings)
23
+ - **5 resources** for direct data access:
24
+ - `congress://current` — current congress number, session dates, chamber info
25
+ - `congress://bill-types` — reference table of valid bill type codes
26
+ - `congress://member/{bioguideId}` — member profile
27
+ - `congress://bill/{congress}/{billType}/{billNumber}` — bill detail
28
+ - `congress://committee/{committeeCode}` — committee detail
29
+ - **2 prompt templates** for structured analysis:
30
+ - `congressgov_bill_analysis` — framework for analyzing a bill
31
+ - `congressgov_legislative_research` — research framework for a policy area across Congress
32
+ - **Congress API service** with authentication, pagination, rate limiting, and response normalization
33
+ - **Server configuration** via `CONGRESS_API_KEY` env var (free key from api.data.gov)
34
+ - Dual transport support: stdio and streamable HTTP
35
+ - Docker support
36
+ - Built on `@cyanheads/mcp-ts-core` framework
@@ -0,0 +1,26 @@
1
+ ---
2
+ summary: API response key corrections across four endpoints, getVoteMembers + getNominee service methods, dedicated members/nominees tool operations
3
+ breaking: false
4
+ ---
5
+
6
+ # 0.2.0 — 2026-03-24
7
+
8
+ ### Fixed
9
+
10
+ - Corrected API response keys for laws (`laws` → `bills`), House votes (`houseVotes` → `houseRollCallVotes`), committee reports (`committeeReports` → `reports`), and CRS reports endpoint path (`/crs-report` → `/crsreport`)
11
+ - Handled array-wrapped responses from committee report detail endpoint
12
+ - Added nested array unwrapping in `fetchList` for endpoints that nest arrays inside objects (e.g. committee-bills)
13
+ - Fixed committee bills sub-resource list key (`bills` → `committee-bills`)
14
+ - Stripped milliseconds from default ISO date in bill summaries for API compatibility
15
+
16
+ ### Added
17
+
18
+ - `getVoteMembers()` service method — dedicated endpoint for individual member voting positions
19
+ - `getNominee()` service method — individual nominee lookup by ordinal within a nomination
20
+ - Separate 'members' operation path in `congressgov_roll_votes` using the new vote members endpoint
21
+ - Separate 'nominees' operation in `congressgov_senate_nominations` with ordinal requirement and actionable error message
22
+
23
+ ### Changed
24
+
25
+ - Added missing `idempotentHint: true` annotation to all tool definitions
26
+ - Updated dev dependencies: `@biomejs/biome` 2.4.7→2.4.8, `tsx` 4.19.0→4.21.0, `vitest` 4.1.0→4.1.1
@@ -0,0 +1,16 @@
1
+ ---
2
+ summary: Full test suite (10 tool + 5 resource + 2 prompt tests + service), tree.md refresh
3
+ breaking: false
4
+ ---
5
+
6
+ # 0.2.1 — 2026-03-24
7
+
8
+ ### Added
9
+
10
+ - Full test suite: 10 tool tests, 5 resource tests, 2 prompt tests, and congress-api-service tests using `createMockContext` and Vitest
11
+ - Updated `docs/tree.md` to reflect new `tests/` directory structure
12
+
13
+ ### Fixed
14
+
15
+ - Operator precedence parentheses in `congress-api-service.ts` for nullish coalescing expressions
16
+ - Formatting in `senate-nominations.tool.ts`
@@ -0,0 +1,26 @@
1
+ ---
2
+ summary: Scoped package rename to @cyanheads/congressgov-mcp-server, TS 5.9 → 6.0, pagination improvements, format-helpers.ts, README overhaul
3
+ breaking: false
4
+ ---
5
+
6
+ # 0.3.0 — 2026-03-24
7
+
8
+ ### Changed
9
+
10
+ - Renamed package to `@cyanheads/congressgov-mcp-server` (scoped under `@cyanheads`)
11
+ - Bumped TypeScript from `^5.9.3` to `^6.0.2`
12
+ - `getDailyIssues` now uses `fetchList` with full pagination support
13
+ - `getMemberLegislation` simplified to return `fetchList` result directly
14
+ - Removed redundant duplicate key from `fetchList` return shape
15
+ - README overhaul: scoped package name, npm badge, npx/Docker/HTTP config examples, cleaner table formatting
16
+
17
+ ### Added
18
+
19
+ - `format-helpers.ts` — shared `formatResult` formatter for all tool output (readable text with HTML stripping, list summarization, pagination headers)
20
+ - All 10 tools now use `format: formatResult` for structured text output
21
+ - `notFound` error for missing committee reports instead of returning empty objects
22
+ - Detection of Congress.gov API 500-as-404 responses (structured JSON error bodies vs. real outages)
23
+
24
+ ### Fixed
25
+
26
+ - Daily record `issues` operation now passes `limit` and `offset` params through to the API
@@ -0,0 +1,14 @@
1
+ ---
2
+ summary: 5xx retry with exponential backoff (3 attempts, 1s/2s/4s), npm badge URL fix
3
+ breaking: false
4
+ ---
5
+
6
+ # 0.3.1 — 2026-03-24
7
+
8
+ ### Changed
9
+
10
+ - Added retry with exponential backoff for 5xx API errors (3 attempts with 1s/2s/4s delays)
11
+
12
+ ### Fixed
13
+
14
+ - npm badge URL now points to scoped package `@cyanheads/congressgov-mcp-server`
@@ -0,0 +1,15 @@
1
+ ---
2
+ summary: New `order` input on committee_lookup bills sub-resource, core 0.3.5 → 0.3.7 bump, tool description cleanup
3
+ breaking: false
4
+ ---
5
+
6
+ # 0.3.10 — 2026-04-19
7
+
8
+ ### Added
9
+
10
+ - Added an `order` input to `congressgov_committee_lookup` for the `bills` sub-resource (`'recent'` default, `'oldest'` alternative). `'recent'` surfaces newest-activity bills directly — the tool handles the count probe + tail fetch internally so callers no longer need the `offset = count - limit` workaround
11
+
12
+ ### Changed
13
+
14
+ - Bumped `@cyanheads/mcp-ts-core` from `^0.3.5` to `^0.3.7`
15
+ - Cleaned tool descriptions — removed cross-references to sibling tools and resource URIs, and dropped internal API/implementation notes from `congressgov_bill_lookup`, `congressgov_bill_summaries`, `congressgov_committee_lookup`, `congressgov_enacted_laws`, and `congressgov_member_lookup`
@@ -0,0 +1,18 @@
1
+ ---
2
+ summary: Security — API key moved from query string to X-Api-Key header (rotate keys); roll-votes members operation now paginates client-side; ordinal description clarified
3
+ breaking: false
4
+ ---
5
+
6
+ # 0.3.11 — 2026-04-19
7
+
8
+ ### Security
9
+
10
+ - Switched Congress.gov API auth from the `?api_key=` query parameter to the `X-Api-Key` header, so the key is no longer embedded in request URLs. Previously, upstream fetch failures (e.g., HTTP 500 on an unknown CRS report ID) surfaced the full URL — including the key — in the error message returned to clients. Rotate any key that was in use before this release
11
+
12
+ ### Fixed
13
+
14
+ - Fixed `congressgov_roll_votes` `members` operation silently ignoring `limit` and `offset` — the `/house-vote/.../members` endpoint returns the full ~435-member list and does not honor upstream pagination, so the service now paginates the `results` array client-side and returns a `pagination: { count, nextOffset }` alongside the vote record
15
+
16
+ ### Changed
17
+
18
+ - Clarified the `ordinal` parameter description on `congressgov_senate_nominations` — the value addresses a batch of nominees, not a single individual; the `nominees` operation returns every person in that batch
@@ -0,0 +1,15 @@
1
+ ---
2
+ summary: Core 0.3.7 → 0.5.2 bump, four tools relaxed to passthrough output schemas for format-parity compliance, test fixup
3
+ breaking: false
4
+ ---
5
+
6
+ # 0.3.12 — 2026-04-20
7
+
8
+ ### Changed
9
+
10
+ - Bumped `@cyanheads/mcp-ts-core` from `^0.3.7` to `^0.5.2`
11
+ - Simplified the output schemas on `congressgov_bill_lookup`, `congressgov_bill_summaries`, `congressgov_crs_reports`, and `congressgov_member_lookup` to `z.object({}).passthrough()`, aligning them with the other six tools in this server. The upstream Congress.gov API returns highly variable shapes across endpoint families, so the previously typed fields were aspirational documentation rather than a real contract — handler return values, rendered `content[]` markdown, and `structuredContent` payloads are unchanged. Only the advertised JSON Schema on `tools/list` is now looser for these four tools. This was also required to satisfy the new `format-parity` lint rule introduced in `@cyanheads/mcp-ts-core` 0.5.x; see [cyanheads/mcp-ts-core#37](https://github.com/cyanheads/mcp-ts-core/issues/37) for context on the tradeoff
12
+
13
+ ### Fixed
14
+
15
+ - Corrected a stale assertion in `tests/services/congress-api/congress-api-service.test.ts` that still expected the API key to appear in the URL `?api_key=` query parameter; the service has sent it via the `X-Api-Key` header since 0.3.11 (see that release's Security note). The production auth path was already correct — only the test was out of date