@cyanheads/congressgov-mcp-server 0.3.25 → 0.3.26
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.
- package/AGENTS.md +16 -6
- package/CLAUDE.md +16 -6
- package/README.md +7 -6
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/tools/definitions/roll-votes.tool.d.ts +7 -1
- package/dist/mcp-server/tools/definitions/roll-votes.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/roll-votes.tool.js +64 -3
- package/dist/mcp-server/tools/definitions/roll-votes.tool.js.map +1 -1
- package/dist/mcp-server/tools/format-helpers.d.ts +5 -1
- package/dist/mcp-server/tools/format-helpers.d.ts.map +1 -1
- package/dist/mcp-server/tools/format-helpers.js +176 -4
- package/dist/mcp-server/tools/format-helpers.js.map +1 -1
- package/dist/services/senate-lis/parse.d.ts +32 -0
- package/dist/services/senate-lis/parse.d.ts.map +1 -0
- package/dist/services/senate-lis/parse.js +229 -0
- package/dist/services/senate-lis/parse.js.map +1 -0
- package/dist/services/senate-lis/senate-vote-service.d.ts +73 -0
- package/dist/services/senate-lis/senate-vote-service.d.ts.map +1 -0
- package/dist/services/senate-lis/senate-vote-service.js +182 -0
- package/dist/services/senate-lis/senate-vote-service.js.map +1 -0
- package/dist/services/senate-lis/types.d.ts +122 -0
- package/dist/services/senate-lis/types.d.ts.map +1 -0
- package/dist/services/senate-lis/types.js +16 -0
- package/dist/services/senate-lis/types.js.map +1 -0
- package/package.json +2 -1
- package/server.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"senate-vote-service.d.ts","sourceRoot":"","sources":["../../../src/services/senate-lis/senate-vote-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAStD,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA+BxF,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AACD,UAAU,aAAa;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AACD,UAAU,oBAAqB,SAAQ,aAAa;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,KAAK,UAAU,GAAG;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AACF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,QAAQ,CAAC;IAClB,IAAI,EAAE,iBAAiB,EAAE,CAAC;IAC1B,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AACF,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,QAAQ,CAAC;IAClB,IAAI,EAAE,gBAAgB,CAAC;CACxB,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,QAAQ,CAAC;IAClB,IAAI,EAAE,gBAAgB,EAAE,CAAC;IACzB,IAAI,EAAE,gBAAgB,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAkCF,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,GAAE,MAAyB;IAIxC,SAAS,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAsBhF,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAM9E,cAAc,CAClB,MAAM,EAAE,oBAAoB,EAC5B,GAAG,CAAC,EAAE,OAAO,GACZ,OAAO,CAAC,uBAAuB,CAAC;YAarB,SAAS;YAaT,QAAQ;YAiCR,OAAO;IA2BrB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,cAAc;CAIvB;AAID,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,wBAAgB,oBAAoB,IAAI,iBAAiB,CAKxD"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Senate LIS roll-call vote client — fetch, retry, XML parse, normalize.
|
|
3
|
+
*
|
|
4
|
+
* The Congress.gov API v3 exposes House votes only (validated 2026-05-31: the
|
|
5
|
+
* `/senate-vote/...` namespace 404s). Senate roll call votes live solely in the
|
|
6
|
+
* Senate's official LIS XML feed, which has no API key and no JSON. This service
|
|
7
|
+
* fetches and normalizes that feed into the same list/detail/members envelopes the
|
|
8
|
+
* House path returns, so a single tool can serve both chambers.
|
|
9
|
+
*
|
|
10
|
+
* Two endpoints back the three operations:
|
|
11
|
+
* - Session menu → `list` (the whole session is one file; paginate client-side).
|
|
12
|
+
* - Individual vote → `get` (metadata + derived party totals) and `members`
|
|
13
|
+
* (the roster from the same file; paginate client-side).
|
|
14
|
+
*
|
|
15
|
+
* The host returns HTTP 200 with an HTML error page for unknown congress/session/
|
|
16
|
+
* vote, so "not found" is detected from the body, not the status code.
|
|
17
|
+
*
|
|
18
|
+
* @module services/senate-lis/senate-vote-service
|
|
19
|
+
*/
|
|
20
|
+
import { JsonRpcErrorCode, McpError, notFound, serviceUnavailable, } from '@cyanheads/mcp-ts-core/errors';
|
|
21
|
+
import { fetchWithTimeout, withRetry } from '@cyanheads/mcp-ts-core/utils';
|
|
22
|
+
import { computePartyTotals, parseRollCallVote, parseVoteMenu } from './parse.js';
|
|
23
|
+
const DEFAULT_BASE_URL = 'https://www.senate.gov/legislative/LIS';
|
|
24
|
+
const REQUEST_TIMEOUT_MS = 12_000;
|
|
25
|
+
const MAX_ATTEMPTS = 3;
|
|
26
|
+
const BASE_BACKOFF_MS = 1000;
|
|
27
|
+
/** A 200 response whose body is an HTML page (the host's "not found" surface). */
|
|
28
|
+
const HTML_RESPONSE_RE = /^\s*<(!DOCTYPE|html[\s>])/i;
|
|
29
|
+
/** A valid feed body opens with one of these roots once the XML declaration is past. */
|
|
30
|
+
const FEED_ROOT_RE = /<(vote_summary|roll_call_vote)[\s>]/;
|
|
31
|
+
const NOT_FOUND_RECOVERY = {
|
|
32
|
+
reason: 'not_found',
|
|
33
|
+
recovery: {
|
|
34
|
+
hint: "Use operation 'list' with chamber 'senate' to find valid vote numbers for the congress and session, then retry.",
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
const UPSTREAM_ERROR_RECOVERY = {
|
|
38
|
+
reason: 'upstream_error',
|
|
39
|
+
recovery: {
|
|
40
|
+
hint: 'Retry after a short delay; the Senate.gov LIS feed may be temporarily unavailable.',
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
/** English ordinal for a congress number — "118" → "118th". */
|
|
44
|
+
function ordinal(n) {
|
|
45
|
+
const lastTwo = n % 100;
|
|
46
|
+
if (lastTwo >= 11 && lastTwo <= 13)
|
|
47
|
+
return `${n}th`;
|
|
48
|
+
switch (n % 10) {
|
|
49
|
+
case 1:
|
|
50
|
+
return `${n}st`;
|
|
51
|
+
case 2:
|
|
52
|
+
return `${n}nd`;
|
|
53
|
+
case 3:
|
|
54
|
+
return `${n}rd`;
|
|
55
|
+
default:
|
|
56
|
+
return `${n}th`;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function isNativeAbortSignal(value) {
|
|
60
|
+
if (typeof AbortSignal !== 'function' ||
|
|
61
|
+
typeof AbortSignal.prototype.throwIfAborted !== 'function' ||
|
|
62
|
+
!value) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
AbortSignal.prototype.throwIfAborted.call(value);
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
return !(error instanceof TypeError);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export class SenateVoteService {
|
|
74
|
+
baseUrl;
|
|
75
|
+
constructor(baseUrl = DEFAULT_BASE_URL) {
|
|
76
|
+
this.baseUrl = baseUrl.replace(/\/$/, '');
|
|
77
|
+
}
|
|
78
|
+
async listVotes(params, ctx) {
|
|
79
|
+
const url = `${this.baseUrl}/roll_call_lists/vote_menu_${params.congress}_${params.session}.xml`;
|
|
80
|
+
const xml = await this.fetchXml(url, `SenateVoteService GET vote_menu_${params.congress}_${params.session}`, ctx, `No Senate roll call votes found for the ${ordinal(params.congress)} Congress, session ${params.session}. Valid sessions are 1 and 2; the Senate publishes roll call votes from the 101st Congress (1989) onward.`, { congress: params.congress, session: params.session });
|
|
81
|
+
const all = parseVoteMenu(xml);
|
|
82
|
+
/** Roll number is chronological within a session; sort explicitly so order does
|
|
83
|
+
* not depend on feed ordering. */
|
|
84
|
+
const sorted = [...all].sort((a, b) => params.order === 'oldest' ? a.voteNumber - b.voteNumber : b.voteNumber - a.voteNumber);
|
|
85
|
+
const slice = sorted.slice(params.offset, params.offset + params.limit);
|
|
86
|
+
const nextOffset = params.offset + slice.length < sorted.length ? params.offset + slice.length : null;
|
|
87
|
+
return { chamber: 'senate', data: slice, pagination: { count: sorted.length, nextOffset } };
|
|
88
|
+
}
|
|
89
|
+
async getVote(params, ctx) {
|
|
90
|
+
const { vote, members } = await this.fetchVote(params, ctx);
|
|
91
|
+
/** Derive the party breakdown from the roster — the feed publishes none. */
|
|
92
|
+
return { chamber: 'senate', vote: { ...vote, partyTotals: computePartyTotals(members) } };
|
|
93
|
+
}
|
|
94
|
+
async getVoteMembers(params, ctx) {
|
|
95
|
+
const { vote, members } = await this.fetchVote(params, ctx);
|
|
96
|
+
const slice = members.slice(params.offset, params.offset + params.limit);
|
|
97
|
+
const nextOffset = params.offset + slice.length < members.length ? params.offset + slice.length : null;
|
|
98
|
+
return {
|
|
99
|
+
chamber: 'senate',
|
|
100
|
+
data: slice,
|
|
101
|
+
vote,
|
|
102
|
+
pagination: { count: members.length, nextOffset },
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
async fetchVote(params, ctx) {
|
|
106
|
+
const padded = String(params.voteNumber).padStart(5, '0');
|
|
107
|
+
const url = `${this.baseUrl}/roll_call_votes/vote${params.congress}${params.session}/vote_${params.congress}_${params.session}_${padded}.xml`;
|
|
108
|
+
const xml = await this.fetchXml(url, `SenateVoteService GET vote_${params.congress}_${params.session}_${padded}`, ctx, `Senate roll call vote ${params.voteNumber} was not found in the ${ordinal(params.congress)} Congress, session ${params.session}.`, { congress: params.congress, session: params.session, voteNumber: params.voteNumber });
|
|
109
|
+
return parseRollCallVote(xml);
|
|
110
|
+
}
|
|
111
|
+
async fetchXml(url, operation, ctx, notFoundMessage, data) {
|
|
112
|
+
const requestContext = this.getRequestContext(ctx, operation);
|
|
113
|
+
const signal = this.getAbortSignal(ctx);
|
|
114
|
+
const text = await withRetry(() => this.doFetch(url, requestContext, signal), {
|
|
115
|
+
operation,
|
|
116
|
+
context: requestContext,
|
|
117
|
+
baseDelayMs: BASE_BACKOFF_MS,
|
|
118
|
+
maxRetries: MAX_ATTEMPTS - 1,
|
|
119
|
+
isTransient: (error) => this.isRetryableError(error),
|
|
120
|
+
...(signal ? { signal } : {}),
|
|
121
|
+
});
|
|
122
|
+
const trimmed = text.trim();
|
|
123
|
+
if (!trimmed) {
|
|
124
|
+
throw serviceUnavailable('The Senate LIS feed returned an empty response.', {
|
|
125
|
+
...UPSTREAM_ERROR_RECOVERY,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/** The host serves a 200 HTML page for unknown congress/session/vote — treat any
|
|
129
|
+
* non-feed body as not found rather than letting the parser choke on it. */
|
|
130
|
+
if (HTML_RESPONSE_RE.test(trimmed) || !FEED_ROOT_RE.test(trimmed)) {
|
|
131
|
+
throw notFound(notFoundMessage, { ...data, ...NOT_FOUND_RECOVERY });
|
|
132
|
+
}
|
|
133
|
+
return trimmed;
|
|
134
|
+
}
|
|
135
|
+
async doFetch(url, requestContext, signal) {
|
|
136
|
+
try {
|
|
137
|
+
const response = await fetchWithTimeout(url, REQUEST_TIMEOUT_MS, requestContext, {
|
|
138
|
+
headers: { Accept: 'application/xml, text/xml, */*' },
|
|
139
|
+
...(signal ? { signal } : {}),
|
|
140
|
+
});
|
|
141
|
+
return await response.text();
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
/** fetchWithTimeout throws a status-mapped McpError whose message embeds the
|
|
145
|
+
* full URL. The missing-resource case never lands here (the host answers 200
|
|
146
|
+
* with HTML), so a genuine non-2xx is an outage/timeout — surface it as a clean,
|
|
147
|
+
* retryable upstream error without echoing the URL. */
|
|
148
|
+
if (error instanceof McpError) {
|
|
149
|
+
throw serviceUnavailable('The Senate.gov LIS feed is temporarily unavailable.', { ...UPSTREAM_ERROR_RECOVERY }, { cause: error });
|
|
150
|
+
}
|
|
151
|
+
throw error;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
isRetryableError(error) {
|
|
155
|
+
if (error instanceof McpError) {
|
|
156
|
+
return (error.code === JsonRpcErrorCode.ServiceUnavailable ||
|
|
157
|
+
error.code === JsonRpcErrorCode.Timeout);
|
|
158
|
+
}
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
getRequestContext(ctx, operation) {
|
|
162
|
+
const ctxRecord = ctx;
|
|
163
|
+
const requestId = typeof ctxRecord?.requestId === 'string' ? ctxRecord.requestId : 'senate-vote-service';
|
|
164
|
+
const timestamp = typeof ctxRecord?.timestamp === 'string' ? ctxRecord.timestamp : new Date().toISOString();
|
|
165
|
+
return { operation, requestId, timestamp };
|
|
166
|
+
}
|
|
167
|
+
getAbortSignal(ctx) {
|
|
168
|
+
const signal = ctx?.signal;
|
|
169
|
+
return isNativeAbortSignal(signal) ? signal : undefined;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
let _service;
|
|
173
|
+
export function initSenateVoteService() {
|
|
174
|
+
_service = new SenateVoteService();
|
|
175
|
+
}
|
|
176
|
+
export function getSenateVoteService() {
|
|
177
|
+
if (!_service) {
|
|
178
|
+
throw new Error('SenateVoteService not initialized — call initSenateVoteService() in setup()');
|
|
179
|
+
}
|
|
180
|
+
return _service;
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=senate-vote-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"senate-vote-service.js","sourceRoot":"","sources":["../../../src/services/senate-lis/senate-vote-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Domain types for Senate LIS roll-call vote data.
|
|
3
|
+
*
|
|
4
|
+
* The Congress.gov API v3 exposes House votes only; Senate roll call votes are
|
|
5
|
+
* published solely through the Senate's official LIS XML feed
|
|
6
|
+
* (https://www.senate.gov/legislative/LIS/roll_call_votes/). These types describe
|
|
7
|
+
* the normalized, camelCased shapes the parser produces from that XML — distinct
|
|
8
|
+
* from the House JSON shapes the Congress.gov API returns.
|
|
9
|
+
*
|
|
10
|
+
* Every record carries `chamber: 'senate'` so the shared vote formatter can route
|
|
11
|
+
* Senate payloads to the Senate renderers without inspecting field shapes.
|
|
12
|
+
*
|
|
13
|
+
* @module services/senate-lis/types
|
|
14
|
+
*/
|
|
15
|
+
/** A single row from the Senate vote menu (`vote_menu_{congress}_{session}.xml`). */
|
|
16
|
+
export type SenateVoteSummary = {
|
|
17
|
+
chamber: 'senate';
|
|
18
|
+
/** Roll call number within the session (1-based, not zero-padded). */
|
|
19
|
+
voteNumber: number;
|
|
20
|
+
/** Short date as published in the menu, e.g. "21-Dec" (no year — derive from session). */
|
|
21
|
+
voteDate?: string;
|
|
22
|
+
/** Associated measure label, e.g. "H.R. 10545", "PN373". */
|
|
23
|
+
issue?: string;
|
|
24
|
+
/** Vote question, e.g. "On Passage of the Bill", "On the Amendment". */
|
|
25
|
+
question?: string;
|
|
26
|
+
/** Amendment reference parsed from the menu question's nested `<measure>`, when present. */
|
|
27
|
+
measure?: string;
|
|
28
|
+
/** Outcome, e.g. "Passed", "Agreed to", "Rejected". */
|
|
29
|
+
result?: string;
|
|
30
|
+
yeas: number;
|
|
31
|
+
nays: number;
|
|
32
|
+
/** Full title / description of the matter voted on. */
|
|
33
|
+
title?: string;
|
|
34
|
+
};
|
|
35
|
+
/** Associated legislative document attached to a Senate vote (bill, nomination, amendment). */
|
|
36
|
+
export type SenateVoteDocument = {
|
|
37
|
+
congress?: number;
|
|
38
|
+
/** Document type, e.g. "PN" (nomination), "S.", "H.R.", "S.Amdt.". */
|
|
39
|
+
type?: string;
|
|
40
|
+
number?: string;
|
|
41
|
+
name?: string;
|
|
42
|
+
title?: string;
|
|
43
|
+
shortTitle?: string;
|
|
44
|
+
};
|
|
45
|
+
/** Amendment metadata, populated only on amendment votes. */
|
|
46
|
+
export type SenateVoteAmendment = {
|
|
47
|
+
number?: string;
|
|
48
|
+
toDocumentNumber?: string;
|
|
49
|
+
toDocumentShortTitle?: string;
|
|
50
|
+
purpose?: string;
|
|
51
|
+
};
|
|
52
|
+
/** Official tally block from the vote record. */
|
|
53
|
+
export type SenateVoteCount = {
|
|
54
|
+
yeas: number;
|
|
55
|
+
nays: number;
|
|
56
|
+
present: number;
|
|
57
|
+
absent: number;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Per-party tally derived from the member roster. The LIS feed does not publish a
|
|
61
|
+
* party breakdown, so this is computed from each member's party + cast — honest
|
|
62
|
+
* aggregation of real per-member data, not an upstream-provided figure.
|
|
63
|
+
*/
|
|
64
|
+
export type SenatePartyTotal = {
|
|
65
|
+
/** Party code: "D", "R", "I". */
|
|
66
|
+
party: string;
|
|
67
|
+
yea: number;
|
|
68
|
+
nay: number;
|
|
69
|
+
present: number;
|
|
70
|
+
/** "Not Voting" casts (the Senate term for absent). */
|
|
71
|
+
notVoting: number;
|
|
72
|
+
};
|
|
73
|
+
/** A fully parsed Senate roll call vote record (`vote_{congress}_{session}_{nnnnn}.xml`). */
|
|
74
|
+
export type SenateVoteDetail = {
|
|
75
|
+
chamber: 'senate';
|
|
76
|
+
congress: number;
|
|
77
|
+
session: number;
|
|
78
|
+
voteNumber: number;
|
|
79
|
+
/** Full timestamp, e.g. "January 8, 2024, 05:27 PM". */
|
|
80
|
+
voteDate?: string;
|
|
81
|
+
modifyDate?: string;
|
|
82
|
+
/** Short question, e.g. "On the Cloture Motion". */
|
|
83
|
+
question?: string;
|
|
84
|
+
/** Full question text, e.g. "On the Cloture Motion PN1020". */
|
|
85
|
+
voteQuestionText?: string;
|
|
86
|
+
voteTitle?: string;
|
|
87
|
+
/** Outcome label, e.g. "Cloture Motion Agreed to". */
|
|
88
|
+
voteResult?: string;
|
|
89
|
+
/** Outcome with tally, e.g. "Cloture Motion Agreed to (73-15)". */
|
|
90
|
+
voteResultText?: string;
|
|
91
|
+
/** Narrative describing the matter (nominee bio, amendment purpose). */
|
|
92
|
+
voteDocumentText?: string;
|
|
93
|
+
/** Threshold required to prevail, e.g. "1/2", "3/5", "2/3". */
|
|
94
|
+
majorityRequirement?: string;
|
|
95
|
+
count: SenateVoteCount;
|
|
96
|
+
document?: SenateVoteDocument;
|
|
97
|
+
amendment?: SenateVoteAmendment;
|
|
98
|
+
/** Party breakdown derived from the roster (present on `get`, omitted on `members`). */
|
|
99
|
+
partyTotals?: SenatePartyTotal[];
|
|
100
|
+
};
|
|
101
|
+
/** One member's recorded position on a Senate roll call. */
|
|
102
|
+
export type SenateMemberVote = {
|
|
103
|
+
chamber: 'senate';
|
|
104
|
+
/** Display name as published, e.g. "Baldwin (D-WI)". */
|
|
105
|
+
memberFull?: string;
|
|
106
|
+
firstName?: string;
|
|
107
|
+
lastName?: string;
|
|
108
|
+
/** Party code: "D", "R", "I". */
|
|
109
|
+
party?: string;
|
|
110
|
+
/** Two-letter state code. */
|
|
111
|
+
state?: string;
|
|
112
|
+
/** Cast: "Yea", "Nay", "Present", or "Not Voting". */
|
|
113
|
+
voteCast?: string;
|
|
114
|
+
/** Senate LIS member identifier, e.g. "S354". */
|
|
115
|
+
lisMemberId?: string;
|
|
116
|
+
};
|
|
117
|
+
/** Parsed individual-vote payload: the vote record plus its full member roster. */
|
|
118
|
+
export type ParsedRollCallVote = {
|
|
119
|
+
vote: SenateVoteDetail;
|
|
120
|
+
members: SenateMemberVote[];
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/senate-lis/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Domain types for Senate LIS roll-call vote data.
|
|
3
|
+
*
|
|
4
|
+
* The Congress.gov API v3 exposes House votes only; Senate roll call votes are
|
|
5
|
+
* published solely through the Senate's official LIS XML feed
|
|
6
|
+
* (https://www.senate.gov/legislative/LIS/roll_call_votes/). These types describe
|
|
7
|
+
* the normalized, camelCased shapes the parser produces from that XML — distinct
|
|
8
|
+
* from the House JSON shapes the Congress.gov API returns.
|
|
9
|
+
*
|
|
10
|
+
* Every record carries `chamber: 'senate'` so the shared vote formatter can route
|
|
11
|
+
* Senate payloads to the Senate renderers without inspecting field shapes.
|
|
12
|
+
*
|
|
13
|
+
* @module services/senate-lis/types
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/senate-lis/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cyanheads/congressgov-mcp-server",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.26",
|
|
4
4
|
"description": "Access U.S. congressional data - bills, votes, members, committees - through MCP. STDIO & Streamable HTTP.",
|
|
5
5
|
"mcpName": "io.github.cyanheads/congressgov-mcp-server",
|
|
6
6
|
"type": "module",
|
|
@@ -77,6 +77,7 @@
|
|
|
77
77
|
},
|
|
78
78
|
"dependencies": {
|
|
79
79
|
"@cyanheads/mcp-ts-core": "^0.9.16",
|
|
80
|
+
"fast-xml-parser": "^5.8.0",
|
|
80
81
|
"pino-pretty": "^13.1.3",
|
|
81
82
|
"zod": "^4.4.3"
|
|
82
83
|
},
|
package/server.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"url": "https://github.com/cyanheads/congressgov-mcp-server",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.3.
|
|
9
|
+
"version": "0.3.26",
|
|
10
10
|
"remotes": [
|
|
11
11
|
{
|
|
12
12
|
"type": "streamable-http",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
20
20
|
"identifier": "@cyanheads/congressgov-mcp-server",
|
|
21
21
|
"runtimeHint": "bun",
|
|
22
|
-
"version": "0.3.
|
|
22
|
+
"version": "0.3.26",
|
|
23
23
|
"packageArguments": [
|
|
24
24
|
{
|
|
25
25
|
"type": "positional",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
55
55
|
"identifier": "@cyanheads/congressgov-mcp-server",
|
|
56
56
|
"runtimeHint": "bun",
|
|
57
|
-
"version": "0.3.
|
|
57
|
+
"version": "0.3.26",
|
|
58
58
|
"packageArguments": [
|
|
59
59
|
{
|
|
60
60
|
"type": "positional",
|