openstates-mcp-server 0.1.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.
- package/CLAUDE.md +397 -0
- package/Dockerfile +99 -0
- package/LICENSE +201 -0
- package/README.md +324 -0
- package/changelog/0.1.x/0.1.0.md +23 -0
- package/changelog/0.1.x/0.1.1.md +29 -0
- package/changelog/template.md +119 -0
- package/dist/config/server-config.d.ts +13 -0
- package/dist/config/server-config.d.ts.map +1 -0
- package/dist/config/server-config.js +19 -0
- package/dist/config/server-config.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/bill-research.prompt.d.ts +11 -0
- package/dist/mcp-server/prompts/definitions/bill-research.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/bill-research.prompt.js +65 -0
- package/dist/mcp-server/prompts/definitions/bill-research.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/legislator-profile.prompt.d.ts +10 -0
- package/dist/mcp-server/prompts/definitions/legislator-profile.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/legislator-profile.prompt.js +55 -0
- package/dist/mcp-server/prompts/definitions/legislator-profile.prompt.js.map +1 -0
- package/dist/mcp-server/resources/definitions/jurisdiction.resource.d.ts +9 -0
- package/dist/mcp-server/resources/definitions/jurisdiction.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/jurisdiction.resource.js +60 -0
- package/dist/mcp-server/resources/definitions/jurisdiction.resource.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-bill.tool.d.ts +121 -0
- package/dist/mcp-server/tools/definitions/get-bill.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-bill.tool.js +319 -0
- package/dist/mcp-server/tools/definitions/get-bill.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-committee.tool.d.ts +30 -0
- package/dist/mcp-server/tools/definitions/get-committee.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-committee.tool.js +89 -0
- package/dist/mcp-server/tools/definitions/get-committee.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-event.tool.d.ts +65 -0
- package/dist/mcp-server/tools/definitions/get-event.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-event.tool.js +231 -0
- package/dist/mcp-server/tools/definitions/get-event.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-jurisdiction.tool.d.ts +34 -0
- package/dist/mcp-server/tools/definitions/get-jurisdiction.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-jurisdiction.tool.js +99 -0
- package/dist/mcp-server/tools/definitions/get-jurisdiction.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-legislators-by-location.tool.d.ts +53 -0
- package/dist/mcp-server/tools/definitions/get-legislators-by-location.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-legislators-by-location.tool.js +156 -0
- package/dist/mcp-server/tools/definitions/get-legislators-by-location.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/list-jurisdictions.tool.d.ts +42 -0
- package/dist/mcp-server/tools/definitions/list-jurisdictions.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/list-jurisdictions.tool.js +110 -0
- package/dist/mcp-server/tools/definitions/list-jurisdictions.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/search-bills.tool.d.ts +102 -0
- package/dist/mcp-server/tools/definitions/search-bills.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/search-bills.tool.js +285 -0
- package/dist/mcp-server/tools/definitions/search-bills.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/search-committees.tool.d.ts +44 -0
- package/dist/mcp-server/tools/definitions/search-committees.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/search-committees.tool.js +127 -0
- package/dist/mcp-server/tools/definitions/search-committees.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/search-events.tool.d.ts +62 -0
- package/dist/mcp-server/tools/definitions/search-events.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/search-events.tool.js +198 -0
- package/dist/mcp-server/tools/definitions/search-events.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/search-people.tool.d.ts +64 -0
- package/dist/mcp-server/tools/definitions/search-people.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/search-people.tool.js +193 -0
- package/dist/mcp-server/tools/definitions/search-people.tool.js.map +1 -0
- package/dist/services/openstates/openstates-service.d.ts +30 -0
- package/dist/services/openstates/openstates-service.d.ts.map +1 -0
- package/dist/services/openstates/openstates-service.js +246 -0
- package/dist/services/openstates/openstates-service.js.map +1 -0
- package/dist/services/openstates/types.d.ts +324 -0
- package/dist/services/openstates/types.d.ts.map +1 -0
- package/dist/services/openstates/types.js +6 -0
- package/dist/services/openstates/types.js.map +1 -0
- package/package.json +90 -0
- package/server.json +99 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Search state legislators and officials by name, jurisdiction, chamber, or district.
|
|
3
|
+
* @module mcp-server/tools/definitions/search-people
|
|
4
|
+
*/
|
|
5
|
+
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { getOpenStatesApiService } from '../../../services/openstates/openstates-service.js';
|
|
7
|
+
const PersonIncludeEnum = z.enum([
|
|
8
|
+
'other_names',
|
|
9
|
+
'other_identifiers',
|
|
10
|
+
'links',
|
|
11
|
+
'sources',
|
|
12
|
+
'offices',
|
|
13
|
+
]);
|
|
14
|
+
export const searchPeople = tool('openstates_search_people', {
|
|
15
|
+
title: 'Search People',
|
|
16
|
+
description: 'Search state legislators and officials by name, jurisdiction, chamber, district, or party. Supports name substring matching (case-insensitive). Use org_classification to target a specific chamber: "upper" for Senate, "lower" for House/Assembly, "legislature" for all legislators, "executive" for governors and executive officials. Use include=offices to get phone, fax, and address. Use include=links for website and social links. Strongly recommend providing jurisdiction to scope results — omitting it returns legislators across all states.',
|
|
17
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
18
|
+
input: z.object({
|
|
19
|
+
jurisdiction: z
|
|
20
|
+
.string()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe('State name, abbreviation, or OCD-ID. Strongly recommended — omitting returns legislators across all states.'),
|
|
23
|
+
name: z
|
|
24
|
+
.string()
|
|
25
|
+
.optional()
|
|
26
|
+
.describe('Name or partial name to match (case-insensitive substring).'),
|
|
27
|
+
org_classification: z
|
|
28
|
+
.enum(['legislature', 'executive', 'lower', 'upper', 'government'])
|
|
29
|
+
.optional()
|
|
30
|
+
.describe('Filter by role type. "upper" = Senate, "lower" = House/Assembly, "legislature" = all legislators, "executive" = governors and executive officials.'),
|
|
31
|
+
district: z
|
|
32
|
+
.string()
|
|
33
|
+
.optional()
|
|
34
|
+
.describe('District label (e.g., "1", "37", "At-Large"). Formats vary by state.'),
|
|
35
|
+
include: z
|
|
36
|
+
.array(PersonIncludeEnum)
|
|
37
|
+
.optional()
|
|
38
|
+
.describe('Related data to inline. "offices" includes phone, fax, and address. "links" includes website and social links.'),
|
|
39
|
+
page: z.coerce.number().int().min(1).default(1).describe('Page number (1-indexed).'),
|
|
40
|
+
per_page: z.coerce
|
|
41
|
+
.number()
|
|
42
|
+
.int()
|
|
43
|
+
.min(1)
|
|
44
|
+
.max(20)
|
|
45
|
+
.default(10)
|
|
46
|
+
.describe('Results per page. Maximum 20.'),
|
|
47
|
+
}),
|
|
48
|
+
output: z.object({
|
|
49
|
+
results: z
|
|
50
|
+
.array(z
|
|
51
|
+
.object({
|
|
52
|
+
id: z.string().describe('OCD person ID.'),
|
|
53
|
+
name: z.string().describe('Full name.'),
|
|
54
|
+
party: z.string().describe('Primary party label. Empty string when unknown.'),
|
|
55
|
+
current_role: z
|
|
56
|
+
.object({
|
|
57
|
+
title: z.string().describe('Role title (e.g., "Senator", "Representative").'),
|
|
58
|
+
org_classification: z
|
|
59
|
+
.string()
|
|
60
|
+
.describe('Chamber classification (e.g., "upper", "lower").'),
|
|
61
|
+
district: z
|
|
62
|
+
.string()
|
|
63
|
+
.nullable()
|
|
64
|
+
.describe('District label or null when undistricted.'),
|
|
65
|
+
})
|
|
66
|
+
.nullable()
|
|
67
|
+
.describe('Current role or null when no active role is recorded.'),
|
|
68
|
+
jurisdiction: z
|
|
69
|
+
.object({
|
|
70
|
+
id: z.string().describe('OCD jurisdiction ID.'),
|
|
71
|
+
name: z.string().describe('Jurisdiction name.'),
|
|
72
|
+
})
|
|
73
|
+
.describe('Home jurisdiction.'),
|
|
74
|
+
given_name: z.string().describe('Given (first) name.'),
|
|
75
|
+
family_name: z.string().describe('Family (last) name.'),
|
|
76
|
+
email: z.string().describe('Email address. Empty string when not available.'),
|
|
77
|
+
openstates_url: z.string().describe('Open States profile URL.'),
|
|
78
|
+
offices: z
|
|
79
|
+
.array(z
|
|
80
|
+
.object({
|
|
81
|
+
name: z.string().describe('Office name or label.'),
|
|
82
|
+
classification: z.string().describe('Office type.'),
|
|
83
|
+
voice: z.string().optional().describe('Phone number when available.'),
|
|
84
|
+
fax: z.string().optional().describe('Fax number when available.'),
|
|
85
|
+
address: z.string().optional().describe('Mailing address when available.'),
|
|
86
|
+
})
|
|
87
|
+
.describe('Contact office record.'))
|
|
88
|
+
.optional()
|
|
89
|
+
.describe('Contact offices when include=offices is requested.'),
|
|
90
|
+
links: z
|
|
91
|
+
.array(z
|
|
92
|
+
.object({
|
|
93
|
+
url: z.string().describe('Link URL.'),
|
|
94
|
+
note: z.string().describe('Link description (e.g., "website", "twitter").'),
|
|
95
|
+
})
|
|
96
|
+
.describe('External link record.'))
|
|
97
|
+
.optional()
|
|
98
|
+
.describe('Website and social links when include=links is requested.'),
|
|
99
|
+
})
|
|
100
|
+
.describe('Legislator record.'))
|
|
101
|
+
.describe('Legislators matching the search criteria.'),
|
|
102
|
+
pagination: z
|
|
103
|
+
.object({
|
|
104
|
+
page: z.number().describe('Current page.'),
|
|
105
|
+
per_page: z.number().describe('Results per page.'),
|
|
106
|
+
max_page: z.number().describe('Total pages.'),
|
|
107
|
+
total_items: z.number().describe('Total matching legislators.'),
|
|
108
|
+
})
|
|
109
|
+
.describe('Pagination metadata.'),
|
|
110
|
+
message: z
|
|
111
|
+
.string()
|
|
112
|
+
.optional()
|
|
113
|
+
.describe('Recovery hint when results are empty. Absent when results are returned.'),
|
|
114
|
+
}),
|
|
115
|
+
async handler(input, ctx) {
|
|
116
|
+
const svc = getOpenStatesApiService();
|
|
117
|
+
const result = await svc.searchPeople({
|
|
118
|
+
jurisdiction: input.jurisdiction,
|
|
119
|
+
name: input.name,
|
|
120
|
+
org_classification: input.org_classification,
|
|
121
|
+
district: input.district,
|
|
122
|
+
include: input.include && input.include.length > 0 ? input.include : undefined,
|
|
123
|
+
page: input.page,
|
|
124
|
+
per_page: input.per_page,
|
|
125
|
+
}, ctx);
|
|
126
|
+
ctx.log.info('Searched people', {
|
|
127
|
+
jurisdiction: input.jurisdiction,
|
|
128
|
+
count: result.results.length,
|
|
129
|
+
total: result.pagination.total_items,
|
|
130
|
+
});
|
|
131
|
+
if (result.results.length === 0) {
|
|
132
|
+
const filters = [];
|
|
133
|
+
if (input.jurisdiction)
|
|
134
|
+
filters.push(`jurisdiction="${input.jurisdiction}"`);
|
|
135
|
+
if (input.name)
|
|
136
|
+
filters.push(`name="${input.name}"`);
|
|
137
|
+
if (input.org_classification)
|
|
138
|
+
filters.push(`org_classification="${input.org_classification}"`);
|
|
139
|
+
if (input.district)
|
|
140
|
+
filters.push(`district="${input.district}"`);
|
|
141
|
+
return {
|
|
142
|
+
results: [],
|
|
143
|
+
pagination: result.pagination,
|
|
144
|
+
message: `No legislators matched ${filters.join(', ')}. Try broadening the name filter, checking the jurisdiction, or removing the district filter.`,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
return { results: result.results, pagination: result.pagination };
|
|
148
|
+
},
|
|
149
|
+
format: (result) => {
|
|
150
|
+
const lines = [
|
|
151
|
+
`**${result.pagination.total_items} legislators** (page ${result.pagination.page}/${result.pagination.max_page}, per page ${result.pagination.per_page}, showing ${result.results.length})`,
|
|
152
|
+
];
|
|
153
|
+
if (result.message) {
|
|
154
|
+
lines.push('');
|
|
155
|
+
lines.push(`> ${result.message}`);
|
|
156
|
+
}
|
|
157
|
+
for (const person of result.results) {
|
|
158
|
+
lines.push('');
|
|
159
|
+
lines.push(`## ${person.name}`);
|
|
160
|
+
lines.push(`**ID:** ${person.id}`);
|
|
161
|
+
lines.push(`**Given name:** ${person.given_name} | **Family name:** ${person.family_name}`);
|
|
162
|
+
lines.push(`**Party:** ${person.party || 'Not available'}`);
|
|
163
|
+
lines.push(`**Jurisdiction:** ${person.jurisdiction.name} (${person.jurisdiction.id})`);
|
|
164
|
+
if (person.current_role) {
|
|
165
|
+
const district = person.current_role.district
|
|
166
|
+
? ` — District ${person.current_role.district}`
|
|
167
|
+
: '';
|
|
168
|
+
lines.push(`**Role:** ${person.current_role.title} (${person.current_role.org_classification})${district}`);
|
|
169
|
+
}
|
|
170
|
+
if (person.email)
|
|
171
|
+
lines.push(`**Email:** ${person.email}`);
|
|
172
|
+
if (person.openstates_url)
|
|
173
|
+
lines.push(`**URL:** ${person.openstates_url}`);
|
|
174
|
+
if (person.offices?.length) {
|
|
175
|
+
for (const office of person.offices) {
|
|
176
|
+
const parts = [`${office.name} [${office.classification}]`];
|
|
177
|
+
if (office.voice)
|
|
178
|
+
parts.push(`Phone: ${office.voice}`);
|
|
179
|
+
if (office.fax)
|
|
180
|
+
parts.push(`Fax: ${office.fax}`);
|
|
181
|
+
if (office.address)
|
|
182
|
+
parts.push(`Address: ${office.address}`);
|
|
183
|
+
lines.push(`**Office:** ${parts.join(' | ')}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (person.links?.length) {
|
|
187
|
+
lines.push(`**Links:** ${person.links.map((l) => `${l.note}: ${l.url}`).join(', ')}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
//# sourceMappingURL=search-people.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-people.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-people.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Open States API v3 REST client — auth, pagination, retry, response normalization.
|
|
3
|
+
* @module services/openstates/openstates-service
|
|
4
|
+
*/
|
|
5
|
+
import type { Context } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import type { AppConfig } from '@cyanheads/mcp-ts-core/config';
|
|
7
|
+
import type { StorageService } from '@cyanheads/mcp-ts-core/storage';
|
|
8
|
+
import type { ServerConfig } from '../../config/server-config.js';
|
|
9
|
+
import type { Bill, BillListResponse, BillSearchParams, Committee, CommitteeListResponse, CommitteeSearchParams, Event, EventListResponse, EventSearchParams, Jurisdiction, JurisdictionListParams, JurisdictionListResponse, PeopleSearchParams, PersonListResponse } from './types.js';
|
|
10
|
+
export declare class OpenStatesApiService {
|
|
11
|
+
private readonly baseUrl;
|
|
12
|
+
private readonly apiKey;
|
|
13
|
+
constructor(_appConfig: AppConfig, _storage: StorageService, serverConfig: ServerConfig);
|
|
14
|
+
private buildUrl;
|
|
15
|
+
private fetchJson;
|
|
16
|
+
searchBills(params: BillSearchParams, ctx: Context): Promise<BillListResponse>;
|
|
17
|
+
getBillByPath(jurisdiction: string, session: string, billId: string, include: string[] | undefined, ctx: Context): Promise<Bill>;
|
|
18
|
+
getBillById(openstatesId: string, include: string[] | undefined, ctx: Context): Promise<Bill>;
|
|
19
|
+
searchPeople(params: PeopleSearchParams, ctx: Context): Promise<PersonListResponse>;
|
|
20
|
+
getPeopleByGeo(lat: number, lng: number, include: string[] | undefined, ctx: Context): Promise<PersonListResponse>;
|
|
21
|
+
searchCommittees(params: CommitteeSearchParams, ctx: Context): Promise<CommitteeListResponse>;
|
|
22
|
+
getCommittee(committeeId: string, include: string[] | undefined, ctx: Context): Promise<Committee>;
|
|
23
|
+
searchEvents(params: EventSearchParams, ctx: Context): Promise<EventListResponse>;
|
|
24
|
+
getEvent(eventId: string, include: string[] | undefined, ctx: Context): Promise<Event>;
|
|
25
|
+
listJurisdictions(params: JurisdictionListParams, ctx: Context): Promise<JurisdictionListResponse>;
|
|
26
|
+
getJurisdiction(jurisdictionId: string, include: string[] | undefined, ctx: Context): Promise<Jurisdiction>;
|
|
27
|
+
}
|
|
28
|
+
export declare function initOpenStatesApiService(appConfig: AppConfig, storage: StorageService, serverConfig: ServerConfig): void;
|
|
29
|
+
export declare function getOpenStatesApiService(): OpenStatesApiService;
|
|
30
|
+
//# sourceMappingURL=openstates-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openstates-service.d.ts","sourceRoot":"","sources":["../../../src/services/openstates/openstates-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EACV,IAAI,EACJ,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,EACL,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAElB,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AA0CpB,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY;IAOvF,OAAO,CAAC,QAAQ;YAeF,SAAS;IAwCjB,WAAW,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsB9E,aAAa,CACjB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAC7B,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,IAAI,CAAC;IAWV,WAAW,CACf,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAC7B,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,IAAI,CAAC;IAUV,YAAY,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAsBnF,cAAc,CAClB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAC7B,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,kBAAkB,CAAC;IAcxB,gBAAgB,CACpB,MAAM,EAAE,qBAAqB,EAC7B,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,qBAAqB,CAAC;IA2B3B,YAAY,CAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAC7B,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,SAAS,CAAC;IAYf,YAAY,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAejF,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;IAQtF,iBAAiB,CACrB,MAAM,EAAE,sBAAsB,EAC9B,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,wBAAwB,CAAC;IAY9B,eAAe,CACnB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAC7B,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,YAAY,CAAC;CAKzB;AAMD,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,YAAY,GACzB,IAAI,CAEN;AAED,wBAAgB,uBAAuB,IAAI,oBAAoB,CAO9D"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Open States API v3 REST client — auth, pagination, retry, response normalization.
|
|
3
|
+
* @module services/openstates/openstates-service
|
|
4
|
+
*/
|
|
5
|
+
import { httpErrorFromResponse, withRetry } from '@cyanheads/mcp-ts-core/utils';
|
|
6
|
+
/** Normalize the upstream `party` field — may be string or array of objects. */
|
|
7
|
+
function normalizeParty(party) {
|
|
8
|
+
if (!party)
|
|
9
|
+
return '';
|
|
10
|
+
if (typeof party === 'string')
|
|
11
|
+
return party;
|
|
12
|
+
// Array of party objects — prefer the one with no end_date (current)
|
|
13
|
+
const active = party.find((p) => !p.end_date);
|
|
14
|
+
return active?.name ?? party[0]?.name ?? '';
|
|
15
|
+
}
|
|
16
|
+
/** Normalize a raw membership record — API returns `person: {id, name}` not flat `person_id`. */
|
|
17
|
+
function normalizeMembership(raw) {
|
|
18
|
+
const person = raw['person'];
|
|
19
|
+
return {
|
|
20
|
+
person_id: person?.id ?? raw['person_id'] ?? '',
|
|
21
|
+
person_name: raw['person_name'] ?? person?.name ?? '',
|
|
22
|
+
role: raw['role'] ?? '',
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function normalizePerson(raw) {
|
|
26
|
+
const person = {
|
|
27
|
+
id: raw.id,
|
|
28
|
+
name: raw.name,
|
|
29
|
+
party: normalizeParty(raw.party),
|
|
30
|
+
current_role: raw.current_role ?? null,
|
|
31
|
+
jurisdiction: raw.jurisdiction ?? { id: '', name: '' },
|
|
32
|
+
given_name: raw.given_name ?? '',
|
|
33
|
+
family_name: raw.family_name ?? '',
|
|
34
|
+
email: raw.email ?? '',
|
|
35
|
+
openstates_url: raw.openstates_url ?? '',
|
|
36
|
+
};
|
|
37
|
+
if (raw.offices?.length)
|
|
38
|
+
person.offices = raw.offices;
|
|
39
|
+
if (raw.links?.length)
|
|
40
|
+
person.links = raw.links;
|
|
41
|
+
return person;
|
|
42
|
+
}
|
|
43
|
+
export class OpenStatesApiService {
|
|
44
|
+
baseUrl;
|
|
45
|
+
apiKey;
|
|
46
|
+
constructor(_appConfig, _storage, serverConfig) {
|
|
47
|
+
this.baseUrl = serverConfig.apiBaseUrl.replace(/\/$/, '');
|
|
48
|
+
this.apiKey = serverConfig.apiKey;
|
|
49
|
+
}
|
|
50
|
+
// --- Internal HTTP plumbing ---
|
|
51
|
+
buildUrl(path, params = {}) {
|
|
52
|
+
const url = new URL(`${this.baseUrl}${path}`);
|
|
53
|
+
for (const [key, value] of Object.entries(params)) {
|
|
54
|
+
if (value === undefined || value === null)
|
|
55
|
+
continue;
|
|
56
|
+
if (Array.isArray(value)) {
|
|
57
|
+
for (const item of value) {
|
|
58
|
+
url.searchParams.append(key, String(item));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
url.searchParams.set(key, String(value));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return url.toString();
|
|
66
|
+
}
|
|
67
|
+
async fetchJson(url, ctx) {
|
|
68
|
+
return withRetry(async () => {
|
|
69
|
+
const response = await fetch(url, {
|
|
70
|
+
headers: {
|
|
71
|
+
'X-API-KEY': this.apiKey,
|
|
72
|
+
Accept: 'application/json',
|
|
73
|
+
},
|
|
74
|
+
signal: ctx.signal,
|
|
75
|
+
});
|
|
76
|
+
if (!response.ok) {
|
|
77
|
+
throw await httpErrorFromResponse(response, {
|
|
78
|
+
service: 'OpenStates',
|
|
79
|
+
data: { url },
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const text = await response.text();
|
|
83
|
+
// HTML error page detection
|
|
84
|
+
if (/^\s*<(!DOCTYPE\s+html|html[\s>])/i.test(text)) {
|
|
85
|
+
const { serviceUnavailable } = await import('@cyanheads/mcp-ts-core/errors');
|
|
86
|
+
throw serviceUnavailable('Open States API returned HTML instead of JSON — likely rate-limited or unavailable.', { url });
|
|
87
|
+
}
|
|
88
|
+
return JSON.parse(text);
|
|
89
|
+
}, {
|
|
90
|
+
operation: 'OpenStatesApiService.fetchJson',
|
|
91
|
+
baseDelayMs: 1500,
|
|
92
|
+
signal: ctx.signal,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// --- Bills ---
|
|
96
|
+
async searchBills(params, ctx) {
|
|
97
|
+
const queryParams = {
|
|
98
|
+
jurisdiction: params.jurisdiction,
|
|
99
|
+
q: params.q,
|
|
100
|
+
session: params.session,
|
|
101
|
+
chamber: params.chamber,
|
|
102
|
+
classification: params.classification,
|
|
103
|
+
subject: params.subject,
|
|
104
|
+
sponsor: params.sponsor,
|
|
105
|
+
sponsor_classification: params.sponsor_classification,
|
|
106
|
+
sort: params.sort,
|
|
107
|
+
action_since: params.action_since,
|
|
108
|
+
updated_since: params.updated_since,
|
|
109
|
+
include: params.include,
|
|
110
|
+
page: params.page ?? 1,
|
|
111
|
+
per_page: params.per_page ?? 10,
|
|
112
|
+
};
|
|
113
|
+
const url = this.buildUrl('/bills', queryParams);
|
|
114
|
+
ctx.log.debug('Searching bills', { url: url.replace(this.apiKey, '[redacted]') });
|
|
115
|
+
return this.fetchJson(url, ctx);
|
|
116
|
+
}
|
|
117
|
+
async getBillByPath(jurisdiction, session, billId, include, ctx) {
|
|
118
|
+
const encodedJur = encodeURIComponent(jurisdiction);
|
|
119
|
+
const encodedSession = encodeURIComponent(session);
|
|
120
|
+
const encodedBillId = encodeURIComponent(billId);
|
|
121
|
+
const url = this.buildUrl(`/bills/${encodedJur}/${encodedSession}/${encodedBillId}`, {
|
|
122
|
+
include,
|
|
123
|
+
});
|
|
124
|
+
ctx.log.debug('Fetching bill by path', { jurisdiction, session, billId });
|
|
125
|
+
return this.fetchJson(url, ctx);
|
|
126
|
+
}
|
|
127
|
+
async getBillById(openstatesId, include, ctx) {
|
|
128
|
+
// OCD bill IDs are like "ocd-bill/..." — strip the prefix for URL routing
|
|
129
|
+
// The API accepts the full OCD ID in the path
|
|
130
|
+
const url = this.buildUrl(`/bills/${openstatesId}`, { include });
|
|
131
|
+
ctx.log.debug('Fetching bill by OCD ID', { openstatesId });
|
|
132
|
+
return this.fetchJson(url, ctx);
|
|
133
|
+
}
|
|
134
|
+
// --- People ---
|
|
135
|
+
async searchPeople(params, ctx) {
|
|
136
|
+
const queryParams = {
|
|
137
|
+
jurisdiction: params.jurisdiction,
|
|
138
|
+
name: params.name,
|
|
139
|
+
org_classification: params.org_classification,
|
|
140
|
+
district: params.district,
|
|
141
|
+
include: params.include,
|
|
142
|
+
page: params.page ?? 1,
|
|
143
|
+
per_page: params.per_page ?? 10,
|
|
144
|
+
};
|
|
145
|
+
const url = this.buildUrl('/people', queryParams);
|
|
146
|
+
ctx.log.debug('Searching people', { jurisdiction: params.jurisdiction });
|
|
147
|
+
const raw = await this.fetchJson(url, ctx);
|
|
148
|
+
return {
|
|
149
|
+
results: raw.results.map(normalizePerson),
|
|
150
|
+
pagination: raw.pagination,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
async getPeopleByGeo(lat, lng, include, ctx) {
|
|
154
|
+
const url = this.buildUrl('/people.geo', { lat, lng, include });
|
|
155
|
+
ctx.log.debug('Fetching legislators by geo', { lat, lng });
|
|
156
|
+
const raw = await this.fetchJson(url, ctx);
|
|
157
|
+
// geo endpoint doesn't return pagination — synthesize one
|
|
158
|
+
const results = raw.results.map(normalizePerson);
|
|
159
|
+
return {
|
|
160
|
+
results,
|
|
161
|
+
pagination: { page: 1, per_page: results.length, max_page: 1, total_items: results.length },
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
// --- Committees ---
|
|
165
|
+
async searchCommittees(params, ctx) {
|
|
166
|
+
const queryParams = {
|
|
167
|
+
jurisdiction: params.jurisdiction,
|
|
168
|
+
classification: params.classification,
|
|
169
|
+
chamber: params.chamber,
|
|
170
|
+
parent: params.parent,
|
|
171
|
+
include: params.include,
|
|
172
|
+
page: params.page ?? 1,
|
|
173
|
+
per_page: params.per_page ?? 10,
|
|
174
|
+
};
|
|
175
|
+
const url = this.buildUrl('/committees', queryParams);
|
|
176
|
+
ctx.log.debug('Searching committees', { jurisdiction: params.jurisdiction });
|
|
177
|
+
const raw = await this.fetchJson(url, ctx);
|
|
178
|
+
return {
|
|
179
|
+
pagination: raw.pagination,
|
|
180
|
+
results: raw.results.map((c) => {
|
|
181
|
+
const memberships = Array.isArray(c['memberships'])
|
|
182
|
+
? c['memberships'].map(normalizeMembership)
|
|
183
|
+
: undefined;
|
|
184
|
+
return { ...c, memberships };
|
|
185
|
+
}),
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
async getCommittee(committeeId, include, ctx) {
|
|
189
|
+
const url = this.buildUrl(`/committees/${encodeURIComponent(committeeId)}`, { include });
|
|
190
|
+
ctx.log.debug('Fetching committee', { committeeId });
|
|
191
|
+
const raw = await this.fetchJson(url, ctx);
|
|
192
|
+
const memberships = Array.isArray(raw['memberships'])
|
|
193
|
+
? raw['memberships'].map(normalizeMembership)
|
|
194
|
+
: undefined;
|
|
195
|
+
return { ...raw, memberships };
|
|
196
|
+
}
|
|
197
|
+
// --- Events ---
|
|
198
|
+
async searchEvents(params, ctx) {
|
|
199
|
+
const queryParams = {
|
|
200
|
+
jurisdiction: params.jurisdiction,
|
|
201
|
+
after: params.after,
|
|
202
|
+
before: params.before,
|
|
203
|
+
require_bills: params.require_bills ? 'true' : undefined,
|
|
204
|
+
include: params.include,
|
|
205
|
+
page: params.page ?? 1,
|
|
206
|
+
per_page: params.per_page ?? 10,
|
|
207
|
+
};
|
|
208
|
+
const url = this.buildUrl('/events', queryParams);
|
|
209
|
+
ctx.log.debug('Searching events', { jurisdiction: params.jurisdiction });
|
|
210
|
+
return this.fetchJson(url, ctx);
|
|
211
|
+
}
|
|
212
|
+
async getEvent(eventId, include, ctx) {
|
|
213
|
+
const url = this.buildUrl(`/events/${encodeURIComponent(eventId)}`, { include });
|
|
214
|
+
ctx.log.debug('Fetching event', { eventId });
|
|
215
|
+
return this.fetchJson(url, ctx);
|
|
216
|
+
}
|
|
217
|
+
// --- Jurisdictions ---
|
|
218
|
+
async listJurisdictions(params, ctx) {
|
|
219
|
+
const queryParams = {
|
|
220
|
+
classification: params.classification ?? 'state',
|
|
221
|
+
include: params.include,
|
|
222
|
+
page: params.page ?? 1,
|
|
223
|
+
per_page: params.per_page ?? 52,
|
|
224
|
+
};
|
|
225
|
+
const url = this.buildUrl('/jurisdictions', queryParams);
|
|
226
|
+
ctx.log.debug('Listing jurisdictions', { classification: params.classification });
|
|
227
|
+
return this.fetchJson(url, ctx);
|
|
228
|
+
}
|
|
229
|
+
async getJurisdiction(jurisdictionId, include, ctx) {
|
|
230
|
+
const url = this.buildUrl(`/jurisdictions/${encodeURIComponent(jurisdictionId)}`, { include });
|
|
231
|
+
ctx.log.debug('Fetching jurisdiction', { jurisdictionId });
|
|
232
|
+
return this.fetchJson(url, ctx);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// --- Init/accessor pattern ---
|
|
236
|
+
let _service;
|
|
237
|
+
export function initOpenStatesApiService(appConfig, storage, serverConfig) {
|
|
238
|
+
_service = new OpenStatesApiService(appConfig, storage, serverConfig);
|
|
239
|
+
}
|
|
240
|
+
export function getOpenStatesApiService() {
|
|
241
|
+
if (!_service) {
|
|
242
|
+
throw new Error('OpenStatesApiService not initialized — call initOpenStatesApiService() in setup()');
|
|
243
|
+
}
|
|
244
|
+
return _service;
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=openstates-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openstates-service.js","sourceRoot":"","sources":["../../../src/services/openstates/openstates-service.ts"],"names":[],"mappings":"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"}
|