legismcp 0.3.0

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 (71) hide show
  1. package/README.md +69 -0
  2. package/bin/legismcp.js +2 -0
  3. package/dist/services/CongressApiService.d.ts +128 -0
  4. package/dist/services/CongressApiService.d.ts.map +1 -0
  5. package/dist/services/CongressApiService.js +355 -0
  6. package/dist/services/CongressApiService.js.map +1 -0
  7. package/dist/services/RateLimitService.d.ts +38 -0
  8. package/dist/services/RateLimitService.d.ts.map +1 -0
  9. package/dist/services/RateLimitService.js +57 -0
  10. package/dist/services/RateLimitService.js.map +1 -0
  11. package/dist/stdio.d.ts +3 -0
  12. package/dist/stdio.d.ts.map +1 -0
  13. package/dist/stdio.js +39 -0
  14. package/dist/stdio.js.map +1 -0
  15. package/dist/tools/analysis/billAnalysisParams.d.ts +11 -0
  16. package/dist/tools/analysis/billAnalysisParams.d.ts.map +1 -0
  17. package/dist/tools/analysis/billAnalysisParams.js +21 -0
  18. package/dist/tools/analysis/billAnalysisParams.js.map +1 -0
  19. package/dist/tools/analysis/billAnalysisTool.d.ts +9 -0
  20. package/dist/tools/analysis/billAnalysisTool.d.ts.map +1 -0
  21. package/dist/tools/analysis/billAnalysisTool.js +9 -0
  22. package/dist/tools/analysis/billAnalysisTool.js.map +1 -0
  23. package/dist/tools/analysis/enhancedBillAnalysisTool.d.ts +17 -0
  24. package/dist/tools/analysis/enhancedBillAnalysisTool.d.ts.map +1 -0
  25. package/dist/tools/analysis/enhancedBillAnalysisTool.js +202 -0
  26. package/dist/tools/analysis/enhancedBillAnalysisTool.js.map +1 -0
  27. package/dist/tools/bills/getBill.d.ts +13 -0
  28. package/dist/tools/bills/getBill.d.ts.map +1 -0
  29. package/dist/tools/bills/getBill.js +87 -0
  30. package/dist/tools/bills/getBill.js.map +1 -0
  31. package/dist/tools/bills/listRecentBills.d.ts +14 -0
  32. package/dist/tools/bills/listRecentBills.d.ts.map +1 -0
  33. package/dist/tools/bills/listRecentBills.js +83 -0
  34. package/dist/tools/bills/listRecentBills.js.map +1 -0
  35. package/dist/tools/errors/index.d.ts +25 -0
  36. package/dist/tools/errors/index.d.ts.map +1 -0
  37. package/dist/tools/errors/index.js +43 -0
  38. package/dist/tools/errors/index.js.map +1 -0
  39. package/dist/tools/index.d.ts +9 -0
  40. package/dist/tools/index.d.ts.map +1 -0
  41. package/dist/tools/index.js +52 -0
  42. package/dist/tools/index.js.map +1 -0
  43. package/dist/tools/members/memberDetails.d.ts +47 -0
  44. package/dist/tools/members/memberDetails.d.ts.map +1 -0
  45. package/dist/tools/members/memberDetails.js +173 -0
  46. package/dist/tools/members/memberDetails.js.map +1 -0
  47. package/dist/tools/members/memberSearch.d.ts +78 -0
  48. package/dist/tools/members/memberSearch.d.ts.map +1 -0
  49. package/dist/tools/members/memberSearch.js +244 -0
  50. package/dist/tools/members/memberSearch.js.map +1 -0
  51. package/dist/tools/subresource/subresourceTool.d.ts +56 -0
  52. package/dist/tools/subresource/subresourceTool.d.ts.map +1 -0
  53. package/dist/tools/subresource/subresourceTool.js +209 -0
  54. package/dist/tools/subresource/subresourceTool.js.map +1 -0
  55. package/dist/tools/trending/trendingBillsTool.d.ts +44 -0
  56. package/dist/tools/trending/trendingBillsTool.d.ts.map +1 -0
  57. package/dist/tools/trending/trendingBillsTool.js +140 -0
  58. package/dist/tools/trending/trendingBillsTool.js.map +1 -0
  59. package/dist/utils/congress.d.ts +6 -0
  60. package/dist/utils/congress.d.ts.map +1 -0
  61. package/dist/utils/congress.js +14 -0
  62. package/dist/utils/congress.js.map +1 -0
  63. package/dist/utils/errors.d.ts +66 -0
  64. package/dist/utils/errors.d.ts.map +1 -0
  65. package/dist/utils/errors.js +105 -0
  66. package/dist/utils/errors.js.map +1 -0
  67. package/dist/utils/member.d.ts +12 -0
  68. package/dist/utils/member.d.ts.map +1 -0
  69. package/dist/utils/member.js +35 -0
  70. package/dist/utils/member.js.map +1 -0
  71. package/package.json +50 -0
@@ -0,0 +1,244 @@
1
+ import { z } from "zod";
2
+ import { getMemberSummary } from "../../utils/member.js";
3
+ /**
4
+ * Zod schema for member search parameters
5
+ */
6
+ export const memberSearchParamsSchema = z.object({
7
+ query: z.string().optional().describe("Search query for member names"),
8
+ chamber: z.enum(["house", "senate"]).optional().describe("Chamber: 'house' or 'senate'"),
9
+ state: z.string().optional().describe("Two-letter state code (e.g., 'CA', 'TX')"),
10
+ party: z.enum(["D", "R", "I"]).optional().describe("Party: 'D' (Democrat), 'R' (Republican), 'I' (Independent)"),
11
+ currentMember: z.boolean().optional().default(true).describe("Whether to include only current members"),
12
+ congress: z.string().optional().describe("Specific congress number (e.g., '118')"),
13
+ limit: z.number().min(1).max(100).optional().default(20).describe("Maximum number of results to return"),
14
+ offset: z.number().min(0).optional().default(0).describe("Number of results to skip")
15
+ });
16
+ /**
17
+ * Member search tool with filtering
18
+ */
19
+ export class MemberSearchTool {
20
+ constructor(congressApi) {
21
+ this.congressApi = congressApi;
22
+ }
23
+ /**
24
+ * Search for members with filtering
25
+ */
26
+ async searchMembers(params) {
27
+ try {
28
+ console.log('Searching members', {
29
+ query: params.query,
30
+ chamber: params.chamber,
31
+ state: params.state,
32
+ party: params.party
33
+ });
34
+ // Build search filters
35
+ const filters = {};
36
+ if (params.congress) {
37
+ filters.congress = params.congress;
38
+ }
39
+ if (params.currentMember !== undefined) {
40
+ filters.currentMember = params.currentMember.toString();
41
+ }
42
+ // Over-fetch when local filters are active since the API doesn't support them.
43
+ // Also over-fetch when query (name) is provided, since the API ignores the query param
44
+ // for member endpoints and results aren't alphabetical.
45
+ const hasLocalFilters = !!(params.chamber || params.state || params.party || params.query);
46
+ const fetchLimit = hasLocalFilters ? 535 : params.limit;
47
+ // Execute search using CongressApiService — omit query since API ignores it for members
48
+ const searchResult = await this.congressApi.searchCollection('member', {
49
+ limit: fetchLimit,
50
+ offset: params.offset,
51
+ filters
52
+ });
53
+ if (!searchResult.members || searchResult.members.length === 0) {
54
+ return {
55
+ members: [],
56
+ totalCount: 0,
57
+ searchCriteria: this.formatSearchCriteria(params),
58
+ pagination: {
59
+ limit: params.limit,
60
+ offset: params.offset,
61
+ hasMore: false
62
+ },
63
+ metadata: {
64
+ searchedAt: new Date().toISOString(),
65
+ congress: params.congress
66
+ }
67
+ };
68
+ }
69
+ // Filter results based on local criteria (API may not support all filters)
70
+ let filteredMembers = this.applyLocalFilters(searchResult.members, params);
71
+ // Trim to requested limit after local filtering
72
+ filteredMembers = filteredMembers.slice(0, params.limit);
73
+ // Add summaries (no extra API calls needed)
74
+ const membersWithSummaries = filteredMembers.map(member => ({
75
+ ...member,
76
+ summary: this.generateMemberSummary(member)
77
+ }));
78
+ return {
79
+ members: membersWithSummaries,
80
+ totalCount: membersWithSummaries.length,
81
+ searchCriteria: this.formatSearchCriteria(params),
82
+ pagination: {
83
+ limit: params.limit,
84
+ offset: params.offset,
85
+ hasMore: hasLocalFilters ? false : (searchResult.pagination?.next ? true : false)
86
+ },
87
+ metadata: {
88
+ searchedAt: new Date().toISOString(),
89
+ congress: params.congress
90
+ }
91
+ };
92
+ }
93
+ catch (error) {
94
+ console.error('Error searching members', { error: error.message });
95
+ throw error;
96
+ }
97
+ }
98
+ /**
99
+ * Apply local filters that may not be supported by API
100
+ */
101
+ applyLocalFilters(members, params) {
102
+ let filtered = [...members];
103
+ // Name filtering — API ignores query param for member endpoint.
104
+ // API returns names in "Last, First" format (e.g., "Cruz, Ted").
105
+ // Match by checking that all query words appear in at least one name field.
106
+ if (params.query) {
107
+ const queryWords = params.query.toLowerCase().split(/\s+/).filter(Boolean);
108
+ filtered = filtered.filter(member => {
109
+ const nameFields = [
110
+ member.name,
111
+ member.directOrderName,
112
+ member.invertedOrderName,
113
+ member.firstName,
114
+ member.lastName,
115
+ member.firstName && member.lastName ? `${member.firstName} ${member.lastName}` : null
116
+ ].filter(Boolean).map((n) => n.toLowerCase());
117
+ // All query words must appear in at least one name field
118
+ return queryWords.every(word => nameFields.some(n => n.includes(word)));
119
+ });
120
+ }
121
+ if (params.chamber) {
122
+ const chamberFull = MemberSearchTool.CHAMBER_MAP[params.chamber.toLowerCase()] || params.chamber;
123
+ filtered = filtered.filter(member => {
124
+ // Chamber is in terms.item[].chamber
125
+ const terms = member.terms?.item;
126
+ if (!terms || terms.length === 0)
127
+ return false;
128
+ // Check the most recent term
129
+ const latestTerm = terms[terms.length - 1];
130
+ return latestTerm.chamber?.toLowerCase() === chamberFull.toLowerCase();
131
+ });
132
+ }
133
+ if (params.state) {
134
+ const stateFull = MemberSearchTool.STATE_MAP[params.state.toUpperCase()] || params.state;
135
+ filtered = filtered.filter(member => member.state?.toLowerCase() === stateFull.toLowerCase());
136
+ }
137
+ if (params.party) {
138
+ const partyFull = MemberSearchTool.PARTY_MAP[params.party.toUpperCase()] || params.party;
139
+ filtered = filtered.filter(member => member.partyName?.toLowerCase() === partyFull.toLowerCase());
140
+ }
141
+ return filtered;
142
+ }
143
+ /**
144
+ * Generate member summary
145
+ */
146
+ generateMemberSummary(member) {
147
+ return getMemberSummary(member);
148
+ }
149
+ /**
150
+ * Format search criteria for display
151
+ */
152
+ formatSearchCriteria(params) {
153
+ const criteria = [];
154
+ if (params.query)
155
+ criteria.push(`Query: "${params.query}"`);
156
+ if (params.chamber)
157
+ criteria.push(`Chamber: ${params.chamber}`);
158
+ if (params.state)
159
+ criteria.push(`State: ${params.state}`);
160
+ if (params.party)
161
+ criteria.push(`Party: ${params.party}`);
162
+ if (params.congress)
163
+ criteria.push(`Congress: ${params.congress}`);
164
+ if (params.currentMember === false)
165
+ criteria.push('Including former members');
166
+ return criteria.length > 0 ? criteria.join(', ') : 'No specific criteria';
167
+ }
168
+ }
169
+ // Map two-letter state codes to full state names used by Congress.gov API
170
+ MemberSearchTool.STATE_MAP = {
171
+ AL: 'Alabama', AK: 'Alaska', AZ: 'Arizona', AR: 'Arkansas', CA: 'California',
172
+ CO: 'Colorado', CT: 'Connecticut', DE: 'Delaware', FL: 'Florida', GA: 'Georgia',
173
+ HI: 'Hawaii', ID: 'Idaho', IL: 'Illinois', IN: 'Indiana', IA: 'Iowa',
174
+ KS: 'Kansas', KY: 'Kentucky', LA: 'Louisiana', ME: 'Maine', MD: 'Maryland',
175
+ MA: 'Massachusetts', MI: 'Michigan', MN: 'Minnesota', MS: 'Mississippi', MO: 'Missouri',
176
+ MT: 'Montana', NE: 'Nebraska', NV: 'Nevada', NH: 'New Hampshire', NJ: 'New Jersey',
177
+ NM: 'New Mexico', NY: 'New York', NC: 'North Carolina', ND: 'North Dakota', OH: 'Ohio',
178
+ OK: 'Oklahoma', OR: 'Oregon', PA: 'Pennsylvania', RI: 'Rhode Island', SC: 'South Carolina',
179
+ SD: 'South Dakota', TN: 'Tennessee', TX: 'Texas', UT: 'Utah', VT: 'Vermont',
180
+ VA: 'Virginia', WA: 'Washington', WV: 'West Virginia', WI: 'Wisconsin', WY: 'Wyoming',
181
+ DC: 'District of Columbia', PR: 'Puerto Rico', GU: 'Guam', VI: 'Virgin Islands',
182
+ AS: 'American Samoa', MP: 'Northern Mariana Islands',
183
+ };
184
+ MemberSearchTool.PARTY_MAP = {
185
+ D: 'Democratic', R: 'Republican', I: 'Independent',
186
+ };
187
+ MemberSearchTool.CHAMBER_MAP = {
188
+ house: 'House of Representatives', senate: 'Senate',
189
+ };
190
+ /**
191
+ * Handle member search tool execution
192
+ */
193
+ export async function handleMemberSearch(params, congressApi) {
194
+ try {
195
+ const tool = new MemberSearchTool(congressApi);
196
+ const result = await tool.searchMembers(params);
197
+ return {
198
+ content: [{
199
+ type: "text",
200
+ text: JSON.stringify(result, null, 2)
201
+ }]
202
+ };
203
+ }
204
+ catch (error) {
205
+ console.error('Error in handleMemberSearch:', error);
206
+ return {
207
+ content: [{
208
+ type: "text",
209
+ text: `Failed to search members: ${error instanceof Error ? error.message : String(error)}`
210
+ }],
211
+ isError: true
212
+ };
213
+ }
214
+ }
215
+ // Export constants for tool registration
216
+ export const TOOL_NAME = "member-search";
217
+ export const TOOL_DESCRIPTION = `Search for members of Congress with filtering.
218
+
219
+ Use this tool to find members by name, state, party, or chamber. This is the
220
+ starting point for member-related queries like "Who represents Texas?" or
221
+ "Find Ted Cruz". Use the returned bioguideId with member-details for full info.
222
+
223
+ Filtering capabilities:
224
+ - Name-based search with partial matching
225
+ - Chamber filtering (House/Senate)
226
+ - State and party filtering
227
+ - Current/former member filtering
228
+
229
+ Examples:
230
+ - Search by name: query = "Pelosi"
231
+ - Search by state: state = "CA"
232
+ - Search House Republicans: chamber = "house", party = "R"
233
+ - Search former members: currentMember = false`;
234
+ export const TOOL_PARAMS = {
235
+ query: z.string().optional().describe("Search query for member names"),
236
+ chamber: z.enum(["house", "senate"]).optional().describe("Chamber: 'house' or 'senate'"),
237
+ state: z.string().optional().describe("Two-letter state code (e.g., 'CA', 'TX')"),
238
+ party: z.enum(["D", "R", "I"]).optional().describe("Party: 'D' (Democrat), 'R' (Republican), 'I' (Independent)"),
239
+ currentMember: z.boolean().optional().default(true).describe("Whether to include only current members"),
240
+ congress: z.string().optional().describe("Specific congress number (e.g., '118')"),
241
+ limit: z.number().min(1).max(100).optional().default(20).describe("Maximum number of results to return"),
242
+ offset: z.number().min(0).optional().default(0).describe("Number of results to skip")
243
+ };
244
+ //# sourceMappingURL=memberSearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memberSearch.js","sourceRoot":"","sources":["../../../src/tools/members/memberSearch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
2
+ import { z } from "zod";
3
+ import { CongressApiService } from "../../services/CongressApiService.js";
4
+ /**
5
+ * Zod schema for subresource parameters
6
+ */
7
+ export declare const subresourceParamsSchema: z.ZodObject<{
8
+ parentUri: z.ZodString;
9
+ subresource: z.ZodString;
10
+ limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
11
+ offset: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
12
+ format: z.ZodDefault<z.ZodOptional<z.ZodEnum<["detailed", "summary", "raw"]>>>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ format: "detailed" | "summary" | "raw";
15
+ limit: number;
16
+ offset: number;
17
+ parentUri: string;
18
+ subresource: string;
19
+ }, {
20
+ parentUri: string;
21
+ subresource: string;
22
+ format?: "detailed" | "summary" | "raw" | undefined;
23
+ limit?: number | undefined;
24
+ offset?: number | undefined;
25
+ }>;
26
+ export type SubresourceParams = z.infer<typeof subresourceParamsSchema>;
27
+ /**
28
+ * Subresource tool — fetches sub-resource data and returns raw items
29
+ */
30
+ export declare class SubresourceTool {
31
+ private congressApi;
32
+ constructor(congressApi: CongressApiService);
33
+ /**
34
+ * Get subresource data
35
+ */
36
+ getSubresource(params: SubresourceParams): Promise<any>;
37
+ /**
38
+ * Parse parent URI to extract resource information
39
+ */
40
+ private parseParentUri;
41
+ private extractItems;
42
+ }
43
+ /**
44
+ * Handle subresource tool execution
45
+ */
46
+ export declare function handleSubresource(params: SubresourceParams, congressApi: CongressApiService): Promise<CallToolResult>;
47
+ export declare const TOOL_NAME = "subresource";
48
+ export declare const TOOL_DESCRIPTION = "Get detailed subresource data for a legislative resource.\n\nSupports all legislative subresources including:\n- Bill subresources: actions, cosponsors, committees, subjects, text, amendments, summaries\n- Member subresources: sponsored-legislation, cosponsored-legislation, committees\n- Committee subresources: bills, reports, members\n\nOutput formats:\n- detailed: Items array with count (default)\n- summary: Items array with count\n- raw: Unprocessed API response\n\nExamples:\n- Get bill actions: parentUri = \"congress-gov:/bill/118/hr/1\", subresource = \"actions\"\n- Get member committees: parentUri = \"congress-gov:/member/P000197\", subresource = \"committees\"\n- Raw format: parentUri = \"congress-gov:/bill/118/hr/1\", subresource = \"cosponsors\", format = \"raw\"\n- With pagination: parentUri = \"congress-gov:/bill/118/hr/1\", subresource = \"actions\", limit = 50, offset = 0";
49
+ export declare const TOOL_PARAMS: {
50
+ parentUri: z.ZodString;
51
+ subresource: z.ZodString;
52
+ limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
53
+ offset: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
54
+ format: z.ZodDefault<z.ZodOptional<z.ZodEnum<["detailed", "summary", "raw"]>>>;
55
+ };
56
+ //# sourceMappingURL=subresourceTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subresourceTool.d.ts","sourceRoot":"","sources":["../../../src/tools/subresource/subresourceTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAG1E;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;EAMlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE;;GAEG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,WAAW;gBAAX,WAAW,EAAE,kBAAkB;IAEnD;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC;IAqD7D;;OAEG;IACH,OAAO,CAAC,cAAc;IA2DtB,OAAO,CAAC,YAAY;CAqCrB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,iBAAiB,EACzB,WAAW,EAAE,kBAAkB,GAC9B,OAAO,CAAC,cAAc,CAAC,CAsBzB;AAGD,eAAO,MAAM,SAAS,gBAAgB,CAAC;AACvC,eAAO,MAAM,gBAAgB,s4BAgBiF,CAAC;AAE/G,eAAO,MAAM,WAAW;;;;;;CAMvB,CAAC"}
@@ -0,0 +1,209 @@
1
+ import { z } from "zod";
2
+ import { ValidationError } from "../../utils/errors.js";
3
+ /**
4
+ * Zod schema for subresource parameters
5
+ */
6
+ export const subresourceParamsSchema = z.object({
7
+ parentUri: z.string().min(1).describe("Parent resource URI (e.g., 'congress-gov:/bill/118/hr/1')"),
8
+ subresource: z.string().min(1).describe("Subresource name (e.g., 'actions', 'cosponsors', 'committees')"),
9
+ limit: z.number().min(1).max(100).optional().default(20).describe("Maximum number of results to return"),
10
+ offset: z.number().min(0).optional().default(0).describe("Number of results to skip"),
11
+ format: z.enum(["detailed", "summary", "raw"]).optional().default("detailed").describe("Output format: 'raw' returns API response unchanged, 'detailed' and 'summary' return items with count")
12
+ });
13
+ /**
14
+ * Subresource tool — fetches sub-resource data and returns raw items
15
+ */
16
+ export class SubresourceTool {
17
+ constructor(congressApi) {
18
+ this.congressApi = congressApi;
19
+ }
20
+ /**
21
+ * Get subresource data
22
+ */
23
+ async getSubresource(params) {
24
+ try {
25
+ console.log('Fetching subresource', {
26
+ parentUri: params.parentUri,
27
+ subresource: params.subresource
28
+ });
29
+ // Validate parent URI
30
+ const cleanUri = params.parentUri.replace(/^congress-gov:\/\/?/, '');
31
+ if (!cleanUri || cleanUri.split('/').length < 1) {
32
+ throw new ValidationError(`Invalid parent URI format: ${params.parentUri}`);
33
+ }
34
+ // Fetch subresource data using CongressApiService
35
+ const subresourceData = await this.congressApi.getSubResource(params.parentUri, params.subresource, { limit: params.limit, offset: params.offset });
36
+ // Parse parent URI for context
37
+ const parentInfo = this.parseParentUri(params.parentUri);
38
+ // Format the data
39
+ const format = params.format || 'detailed';
40
+ let data;
41
+ if (format === 'raw') {
42
+ data = subresourceData;
43
+ }
44
+ else {
45
+ const items = this.extractItems(subresourceData, params.subresource);
46
+ data = { count: items.length, items };
47
+ }
48
+ return {
49
+ parentResource: parentInfo,
50
+ subresource: params.subresource,
51
+ data,
52
+ metadata: {
53
+ fetchedAt: new Date().toISOString(),
54
+ format,
55
+ pagination: {
56
+ limit: params.limit,
57
+ offset: params.offset
58
+ }
59
+ }
60
+ };
61
+ }
62
+ catch (error) {
63
+ console.error('Error fetching subresource', { error: error.message });
64
+ throw error;
65
+ }
66
+ }
67
+ /**
68
+ * Parse parent URI to extract resource information
69
+ */
70
+ parseParentUri(uri) {
71
+ try {
72
+ const cleanUri = uri.replace(/^congress-gov:\/\/?/, '');
73
+ const parts = cleanUri.split('/');
74
+ if (parts.length < 1)
75
+ return null;
76
+ const collection = parts[0];
77
+ const resourceInfo = {
78
+ collection,
79
+ path: `/${cleanUri}`,
80
+ identifiers: {}
81
+ };
82
+ switch (collection) {
83
+ case 'bill':
84
+ if (parts.length >= 4) {
85
+ resourceInfo.identifiers = {
86
+ congress: parts[1],
87
+ billType: parts[2],
88
+ billNumber: parts[3]
89
+ };
90
+ }
91
+ break;
92
+ case 'amendment':
93
+ if (parts.length >= 4) {
94
+ resourceInfo.identifiers = {
95
+ congress: parts[1],
96
+ amendmentType: parts[2],
97
+ amendmentNumber: parts[3]
98
+ };
99
+ }
100
+ break;
101
+ case 'member':
102
+ if (parts.length >= 2) {
103
+ resourceInfo.identifiers = {
104
+ memberId: parts[1],
105
+ congress: parts[2]
106
+ };
107
+ }
108
+ break;
109
+ case 'committee':
110
+ if (parts.length >= 3) {
111
+ resourceInfo.identifiers = {
112
+ chamber: parts[1],
113
+ committeeCode: parts[2],
114
+ congress: parts[3]
115
+ };
116
+ }
117
+ break;
118
+ }
119
+ return resourceInfo;
120
+ }
121
+ catch (error) {
122
+ console.error('Error parsing parent URI:', error);
123
+ return null;
124
+ }
125
+ }
126
+ extractItems(data, subresource) {
127
+ if (!data)
128
+ return [];
129
+ const dataMapping = {
130
+ 'actions': 'actions',
131
+ 'cosponsors': 'cosponsors',
132
+ 'committees': 'committees',
133
+ 'subjects': 'subjects',
134
+ 'text': 'text',
135
+ 'amendments': 'amendments',
136
+ 'related-bills': 'relatedBills',
137
+ 'summaries': 'summaries',
138
+ 'titles': 'titles',
139
+ 'sponsored-legislation': 'sponsoredLegislation',
140
+ 'cosponsored-legislation': 'cosponsoredLegislation'
141
+ };
142
+ const propertyName = dataMapping[subresource] || subresource;
143
+ if (Array.isArray(data[propertyName])) {
144
+ return data[propertyName];
145
+ }
146
+ if (data[propertyName] && Array.isArray(data[propertyName][propertyName])) {
147
+ return data[propertyName][propertyName];
148
+ }
149
+ if (Array.isArray(data)) {
150
+ return data;
151
+ }
152
+ if (subresource === 'subjects' && data.subjects) {
153
+ return [data.subjects];
154
+ }
155
+ return [];
156
+ }
157
+ }
158
+ /**
159
+ * Handle subresource tool execution
160
+ */
161
+ export async function handleSubresource(params, congressApi) {
162
+ try {
163
+ const tool = new SubresourceTool(congressApi);
164
+ const result = await tool.getSubresource(params);
165
+ return {
166
+ content: [{
167
+ type: "text",
168
+ text: JSON.stringify(result, null, 2)
169
+ }]
170
+ };
171
+ }
172
+ catch (error) {
173
+ console.error('Error in handleSubresource:', error);
174
+ return {
175
+ content: [{
176
+ type: "text",
177
+ text: `Failed to get subresource: ${error instanceof Error ? error.message : String(error)}`
178
+ }],
179
+ isError: true
180
+ };
181
+ }
182
+ }
183
+ // Export constants for tool registration
184
+ export const TOOL_NAME = "subresource";
185
+ export const TOOL_DESCRIPTION = `Get detailed subresource data for a legislative resource.
186
+
187
+ Supports all legislative subresources including:
188
+ - Bill subresources: actions, cosponsors, committees, subjects, text, amendments, summaries
189
+ - Member subresources: sponsored-legislation, cosponsored-legislation, committees
190
+ - Committee subresources: bills, reports, members
191
+
192
+ Output formats:
193
+ - detailed: Items array with count (default)
194
+ - summary: Items array with count
195
+ - raw: Unprocessed API response
196
+
197
+ Examples:
198
+ - Get bill actions: parentUri = "congress-gov:/bill/118/hr/1", subresource = "actions"
199
+ - Get member committees: parentUri = "congress-gov:/member/P000197", subresource = "committees"
200
+ - Raw format: parentUri = "congress-gov:/bill/118/hr/1", subresource = "cosponsors", format = "raw"
201
+ - With pagination: parentUri = "congress-gov:/bill/118/hr/1", subresource = "actions", limit = 50, offset = 0`;
202
+ export const TOOL_PARAMS = {
203
+ parentUri: z.string().min(1).describe("Parent resource URI (e.g., 'congress-gov:/bill/118/hr/1')"),
204
+ subresource: z.string().min(1).describe("Subresource name (e.g., 'actions', 'cosponsors', 'committees')"),
205
+ limit: z.number().min(1).max(100).optional().default(20).describe("Maximum number of results to return"),
206
+ offset: z.number().min(0).optional().default(0).describe("Number of results to skip"),
207
+ format: z.enum(["detailed", "summary", "raw"]).optional().default("detailed").describe("Output format: 'raw' returns API response unchanged, 'detailed' and 'summary' return items with count")
208
+ };
209
+ //# sourceMappingURL=subresourceTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subresourceTool.js","sourceRoot":"","sources":["../../../src/tools/subresource/subresourceTool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
2
+ import { z } from "zod";
3
+ import { CongressApiService } from "../../services/CongressApiService.js";
4
+ /**
5
+ * Zod schema for trending bills parameters
6
+ */
7
+ export declare const trendingBillsParamsSchema: z.ZodObject<{
8
+ timeframe: z.ZodDefault<z.ZodOptional<z.ZodEnum<["week", "month", "quarter", "year"]>>>;
9
+ limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
10
+ congress: z.ZodOptional<z.ZodNumber>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ limit: number;
13
+ timeframe: "week" | "month" | "quarter" | "year";
14
+ congress?: number | undefined;
15
+ }, {
16
+ congress?: number | undefined;
17
+ limit?: number | undefined;
18
+ timeframe?: "week" | "month" | "quarter" | "year" | undefined;
19
+ }>;
20
+ export type TrendingBillsParams = z.infer<typeof trendingBillsParamsSchema>;
21
+ /**
22
+ * Trending bills tool — fetches recently active bills with sub-resource data
23
+ */
24
+ export declare class TrendingBillsTool {
25
+ private congressApi;
26
+ constructor(congressApi: CongressApiService);
27
+ /**
28
+ * Get recently active bills with sub-resource data
29
+ */
30
+ getTrendingBills(params: TrendingBillsParams): Promise<any>;
31
+ /**
32
+ * Fetch recent bills sorted by updateDate
33
+ */
34
+ private fetchRecentBills;
35
+ /**
36
+ * Enhance bills with sub-resource data using parallel fetching
37
+ */
38
+ private enhanceBillsWithData;
39
+ }
40
+ /**
41
+ * Handle trending bills tool execution
42
+ */
43
+ export declare function handleTrendingBills(params: TrendingBillsParams, congressApi: CongressApiService): Promise<CallToolResult>;
44
+ //# sourceMappingURL=trendingBillsTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trendingBillsTool.d.ts","sourceRoot":"","sources":["../../../src/tools/trending/trendingBillsTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAG1E;;GAEG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;EAIpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E;;GAEG;AACH,qBAAa,iBAAiB;IAChB,OAAO,CAAC,WAAW;gBAAX,WAAW,EAAE,kBAAkB;IAEnD;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC;IAkCjE;;OAEG;YACW,gBAAgB;IAiB9B;;OAEG;YACW,oBAAoB;CAqDnC;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,mBAAmB,EAC3B,WAAW,EAAE,kBAAkB,GAC9B,OAAO,CAAC,cAAc,CAAC,CAsBzB"}