@cyanheads/openfec-mcp-server 0.2.3 → 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.
- package/CLAUDE.md +1 -1
- package/README.md +1 -1
- package/dist/mcp-server/prompts/definitions/campaign-analysis.prompt.d.ts.map +1 -1
- package/dist/mcp-server/prompts/definitions/campaign-analysis.prompt.js +1 -2
- package/dist/mcp-server/prompts/definitions/campaign-analysis.prompt.js.map +1 -1
- package/dist/mcp-server/prompts/definitions/money-trail.prompt.d.ts.map +1 -1
- package/dist/mcp-server/prompts/definitions/money-trail.prompt.js +1 -3
- package/dist/mcp-server/prompts/definitions/money-trail.prompt.js.map +1 -1
- package/dist/mcp-server/resources/definitions/candidate.resource.d.ts.map +1 -1
- package/dist/mcp-server/resources/definitions/candidate.resource.js +3 -0
- package/dist/mcp-server/resources/definitions/candidate.resource.js.map +1 -1
- package/dist/mcp-server/tools/definitions/lookup-calendar.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/lookup-calendar.tool.js +5 -42
- package/dist/mcp-server/tools/definitions/lookup-calendar.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/lookup-elections.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/lookup-elections.tool.js +34 -35
- package/dist/mcp-server/tools/definitions/lookup-elections.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-candidates.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-candidates.tool.js +12 -18
- package/dist/mcp-server/tools/definitions/search-candidates.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-committees.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-committees.tool.js +5 -18
- package/dist/mcp-server/tools/definitions/search-committees.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-contributions.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-contributions.tool.js +28 -43
- package/dist/mcp-server/tools/definitions/search-contributions.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-disbursements.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-disbursements.tool.js +21 -37
- package/dist/mcp-server/tools/definitions/search-disbursements.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-expenditures.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-expenditures.tool.js +21 -37
- package/dist/mcp-server/tools/definitions/search-expenditures.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-filings.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-filings.tool.js +5 -30
- package/dist/mcp-server/tools/definitions/search-filings.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-legal.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-legal.tool.js +16 -25
- package/dist/mcp-server/tools/definitions/search-legal.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/utils/format-helpers.d.ts +5 -0
- package/dist/mcp-server/tools/definitions/utils/format-helpers.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/utils/format-helpers.js +36 -0
- package/dist/mcp-server/tools/definitions/utils/format-helpers.js.map +1 -1
- package/dist/services/openfec/openfec-service.d.ts +2 -0
- package/dist/services/openfec/openfec-service.d.ts.map +1 -1
- package/dist/services/openfec/openfec-service.js +12 -4
- package/dist/services/openfec/openfec-service.js.map +1 -1
- package/package.json +1 -1
- package/server.json +3 -3
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
8
8
|
import { invalidParams } from '@cyanheads/mcp-ts-core/errors';
|
|
9
9
|
import { decodeCursor, getOpenFecService } from '../../../services/openfec/openfec-service.js';
|
|
10
|
-
import {
|
|
10
|
+
import { renderRecord } from './utils/format-helpers.js';
|
|
11
11
|
import { validateCandidateId, validateCommitteeId } from './utils/id-validators.js';
|
|
12
12
|
/** Derive the current two-year election cycle (always even). */
|
|
13
13
|
const currentCycle = () => {
|
|
@@ -31,7 +31,7 @@ export const searchContributions = tool('openfec_search_contributions', {
|
|
|
31
31
|
candidate_id: z
|
|
32
32
|
.string()
|
|
33
33
|
.optional()
|
|
34
|
-
.describe('Candidate ID.
|
|
34
|
+
.describe('Candidate ID. Enables by_size and by_state aggregates without a committee_id.'),
|
|
35
35
|
contributor_name: z.string().optional().describe('Full-text donor name search. Itemized only.'),
|
|
36
36
|
contributor_employer: z
|
|
37
37
|
.string()
|
|
@@ -53,8 +53,7 @@ export const searchContributions = tool('openfec_search_contributions', {
|
|
|
53
53
|
cycle: z
|
|
54
54
|
.number()
|
|
55
55
|
.optional()
|
|
56
|
-
.describe('Two-year election cycle (e.g., 2024). Even years only. '
|
|
57
|
-
'Defaults to current cycle for itemized mode (API requires two_year_transaction_period).'),
|
|
56
|
+
.describe('Two-year election cycle (e.g., 2024). Even years only. Defaults to current cycle for itemized mode.'),
|
|
58
57
|
min_date: z
|
|
59
58
|
.string()
|
|
60
59
|
.optional()
|
|
@@ -176,18 +175,17 @@ export const searchContributions = tool('openfec_search_contributions', {
|
|
|
176
175
|
throw invalidParams(`Aggregate by ${mode.replace('by_', '')} requires a committee_id.`);
|
|
177
176
|
}
|
|
178
177
|
}
|
|
179
|
-
|
|
178
|
+
// /by_candidate variants require cycle — default to current if not provided
|
|
179
|
+
const useByCandidate = (mode === 'by_size' || mode === 'by_state') && input.candidate_id;
|
|
180
|
+
const cycle = input.cycle ?? (useByCandidate ? currentCycle() : undefined);
|
|
181
|
+
const params = { per_page: input.per_page, sort: '-total', sort_hide_null: true };
|
|
180
182
|
if (input.committee_id)
|
|
181
183
|
params.committee_id = input.committee_id;
|
|
182
184
|
if (input.candidate_id)
|
|
183
185
|
params.candidate_id = input.candidate_id;
|
|
184
|
-
if (
|
|
185
|
-
params.cycle =
|
|
186
|
-
|
|
187
|
-
let aggregateMode = mode;
|
|
188
|
-
if ((mode === 'by_size' || mode === 'by_state') && input.candidate_id) {
|
|
189
|
-
aggregateMode = `${mode}_candidate`;
|
|
190
|
-
}
|
|
186
|
+
if (cycle)
|
|
187
|
+
params.cycle = cycle;
|
|
188
|
+
const aggregateMode = useByCandidate ? `${mode}_candidate` : mode;
|
|
191
189
|
const result = await fec.getContributionAggregates(aggregateMode, params, ctx);
|
|
192
190
|
ctx.log.info('Contribution aggregates fetched', {
|
|
193
191
|
mode: aggregateMode,
|
|
@@ -208,45 +206,32 @@ export const searchContributions = tool('openfec_search_contributions', {
|
|
|
208
206
|
},
|
|
209
207
|
];
|
|
210
208
|
}
|
|
211
|
-
// Detect itemized vs aggregate by presence of next_cursor key
|
|
212
209
|
const isItemized = 'next_cursor' in result && result.next_cursor !== undefined;
|
|
210
|
+
const lines = [];
|
|
213
211
|
if (isItemized) {
|
|
214
|
-
|
|
215
|
-
`**${result.count
|
|
216
|
-
|
|
212
|
+
if (result.count != null) {
|
|
213
|
+
lines.push(`**${result.count.toLocaleString()} total contributions**\n`);
|
|
214
|
+
}
|
|
217
215
|
for (const r of result.results) {
|
|
218
|
-
const name = r.contributor_name ?? 'Unknown';
|
|
219
|
-
|
|
220
|
-
const amount = fmt$(r.contribution_receipt_amount);
|
|
221
|
-
const date = r.contribution_receipt_date ?? '';
|
|
222
|
-
const committee = r.committee_name ?? r.committee_id ?? '';
|
|
223
|
-
const city = r.contributor_city ?? '';
|
|
224
|
-
const state = r.contributor_state ?? '';
|
|
225
|
-
const location = [city, state].filter(Boolean).join(', ');
|
|
226
|
-
lines.push(`- **${name}** ${location ? `(${location})` : ''}`);
|
|
227
|
-
lines.push(` ${amount} on ${date} → ${committee}`);
|
|
228
|
-
if (employer)
|
|
229
|
-
lines.push(` Employer: ${employer}`);
|
|
216
|
+
const name = String(r.contributor_name ?? 'Unknown');
|
|
217
|
+
lines.push(`**${name}**\n${renderRecord(r, new Set(['contributor_name']))}`);
|
|
230
218
|
}
|
|
231
219
|
if (result.next_cursor) {
|
|
232
|
-
lines.push(
|
|
220
|
+
lines.push('\n_More results available — pass cursor to continue._');
|
|
233
221
|
}
|
|
234
|
-
return [{ type: 'text', text: lines.join('\n') }];
|
|
235
|
-
}
|
|
236
|
-
// Aggregate
|
|
237
|
-
const lines = [
|
|
238
|
-
`**${result.pagination?.count?.toLocaleString() ?? '?'} aggregate rows**\n`,
|
|
239
|
-
];
|
|
240
|
-
for (const r of result.results) {
|
|
241
|
-
const dimension = r.size ?? r.state ?? r.employer ?? r.occupation ?? r.state_full ?? 'Unknown';
|
|
242
|
-
const total = fmt$(r.total);
|
|
243
|
-
const count = typeof r.count === 'number' ? ` (${r.count.toLocaleString()} contributions)` : '';
|
|
244
|
-
lines.push(`- **${dimension}**: ${total}${count}`);
|
|
245
222
|
}
|
|
246
|
-
|
|
247
|
-
|
|
223
|
+
else {
|
|
224
|
+
if (result.pagination?.count != null) {
|
|
225
|
+
lines.push(`**${result.pagination.count.toLocaleString()} aggregate rows**\n`);
|
|
226
|
+
}
|
|
227
|
+
for (const r of result.results) {
|
|
228
|
+
lines.push(renderRecord(r));
|
|
229
|
+
}
|
|
230
|
+
if (result.pagination && result.pagination.page < result.pagination.pages) {
|
|
231
|
+
lines.push(`\n_Page ${result.pagination.page} of ${result.pagination.pages}_`);
|
|
232
|
+
}
|
|
248
233
|
}
|
|
249
|
-
return [{ type: 'text', text: lines.join('\n') }];
|
|
234
|
+
return [{ type: 'text', text: lines.join('\n\n') }];
|
|
250
235
|
},
|
|
251
236
|
});
|
|
252
237
|
//# sourceMappingURL=search-contributions.tool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-contributions.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-contributions.tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAExF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"search-contributions.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-contributions.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-disbursements.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-disbursements.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAQjD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"search-disbursements.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-disbursements.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAQjD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAoM9B,CAAC"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
7
7
|
import { decodeCursor, getOpenFecService } from '../../../services/openfec/openfec-service.js';
|
|
8
|
-
import {
|
|
8
|
+
import { renderRecord } from './utils/format-helpers.js';
|
|
9
9
|
import { validateCommitteeId } from './utils/id-validators.js';
|
|
10
10
|
const modes = ['itemized', 'by_purpose', 'by_recipient', 'by_recipient_id'];
|
|
11
11
|
export const searchDisbursements = tool('openfec_search_disbursements', {
|
|
@@ -139,6 +139,8 @@ export const searchDisbursements = tool('openfec_search_disbursements', {
|
|
|
139
139
|
const params = {
|
|
140
140
|
committee_id: input.committee_id,
|
|
141
141
|
per_page: input.per_page,
|
|
142
|
+
sort: '-total',
|
|
143
|
+
sort_hide_null: true,
|
|
142
144
|
};
|
|
143
145
|
if (input.cycle)
|
|
144
146
|
params.cycle = input.cycle;
|
|
@@ -164,49 +166,31 @@ export const searchDisbursements = tool('openfec_search_disbursements', {
|
|
|
164
166
|
];
|
|
165
167
|
}
|
|
166
168
|
const isItemized = 'next_cursor' in result && result.next_cursor !== undefined;
|
|
169
|
+
const lines = [];
|
|
167
170
|
if (isItemized) {
|
|
168
|
-
|
|
169
|
-
`**${result.count
|
|
170
|
-
|
|
171
|
+
if (result.count != null) {
|
|
172
|
+
lines.push(`**${result.count.toLocaleString()} total disbursements**\n`);
|
|
173
|
+
}
|
|
171
174
|
for (const r of result.results) {
|
|
172
|
-
const
|
|
173
|
-
|
|
174
|
-
const date = r.disbursement_date ?? '';
|
|
175
|
-
const desc = r.disbursement_description ?? '';
|
|
176
|
-
const purpose = r.disbursement_purpose_category ?? '';
|
|
177
|
-
const committee = r.committee_name ?? r.committee_id ?? '';
|
|
178
|
-
const city = r.recipient_city ?? '';
|
|
179
|
-
const state = r.recipient_state ?? '';
|
|
180
|
-
const location = [city, state].filter(Boolean).join(', ');
|
|
181
|
-
lines.push(`- **${recipient}** ${location ? `(${location})` : ''}`);
|
|
182
|
-
lines.push(` ${amount} on ${date} from ${committee}`);
|
|
183
|
-
if (desc)
|
|
184
|
-
lines.push(` ${desc}`);
|
|
185
|
-
if (purpose && purpose !== desc)
|
|
186
|
-
lines.push(` Purpose: ${purpose}`);
|
|
175
|
+
const name = String(r.recipient_name ?? 'Unknown');
|
|
176
|
+
lines.push(`**${name}**\n${renderRecord(r, new Set(['recipient_name']))}`);
|
|
187
177
|
}
|
|
188
178
|
if (result.next_cursor) {
|
|
189
|
-
lines.push(
|
|
179
|
+
lines.push('\n_More results available — pass cursor to continue._');
|
|
190
180
|
}
|
|
191
|
-
return [{ type: 'text', text: lines.join('\n') }];
|
|
192
181
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
: '';
|
|
204
|
-
lines.push(`- **${dimension}**: ${total}${count}${pct}`);
|
|
205
|
-
}
|
|
206
|
-
if (result.pagination && result.pagination.page < result.pagination.pages) {
|
|
207
|
-
lines.push(`\n_Page ${result.pagination.page} of ${result.pagination.pages}_`);
|
|
182
|
+
else {
|
|
183
|
+
if (result.pagination?.count != null) {
|
|
184
|
+
lines.push(`**${result.pagination.count.toLocaleString()} aggregate rows**\n`);
|
|
185
|
+
}
|
|
186
|
+
for (const r of result.results) {
|
|
187
|
+
lines.push(renderRecord(r));
|
|
188
|
+
}
|
|
189
|
+
if (result.pagination && result.pagination.page < result.pagination.pages) {
|
|
190
|
+
lines.push(`\n_Page ${result.pagination.page} of ${result.pagination.pages}_`);
|
|
191
|
+
}
|
|
208
192
|
}
|
|
209
|
-
return [{ type: 'text', text: lines.join('\n') }];
|
|
193
|
+
return [{ type: 'text', text: lines.join('\n\n') }];
|
|
210
194
|
},
|
|
211
195
|
});
|
|
212
196
|
//# sourceMappingURL=search-disbursements.tool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-disbursements.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-disbursements.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAExF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"search-disbursements.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-disbursements.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-expenditures.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-expenditures.tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAajD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"search-expenditures.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-expenditures.tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAajD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAkO7B,CAAC"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
8
8
|
import { invalidParams } from '@cyanheads/mcp-ts-core/errors';
|
|
9
9
|
import { decodeCursor, getOpenFecService } from '../../../services/openfec/openfec-service.js';
|
|
10
|
-
import {
|
|
10
|
+
import { renderRecord } from './utils/format-helpers.js';
|
|
11
11
|
import { validateCandidateId, validateCommitteeId } from './utils/id-validators.js';
|
|
12
12
|
/** Expand S/O indicator to a readable label. */
|
|
13
13
|
const supportOpposeLabel = (code) => code === 'S' ? 'SUPPORT' : code === 'O' ? 'OPPOSE' : String(code ?? '');
|
|
@@ -198,50 +198,34 @@ export const searchExpenditures = tool('openfec_search_expenditures', {
|
|
|
198
198
|
];
|
|
199
199
|
}
|
|
200
200
|
const isItemized = 'next_cursor' in result && result.next_cursor !== undefined;
|
|
201
|
+
const lines = [];
|
|
201
202
|
if (isItemized) {
|
|
202
|
-
|
|
203
|
-
`**${result.count
|
|
204
|
-
|
|
203
|
+
if (result.count != null) {
|
|
204
|
+
lines.push(`**${result.count.toLocaleString()} total independent expenditures**\n`);
|
|
205
|
+
}
|
|
205
206
|
for (const r of result.results) {
|
|
206
207
|
const indicator = supportOpposeLabel(r.support_oppose_indicator);
|
|
207
|
-
const
|
|
208
|
-
|
|
209
|
-
const committee = r.committee_name ?? r.committee_id ?? '';
|
|
210
|
-
const candidate = r.candidate_name ?? r.candidate_id ?? '';
|
|
211
|
-
const office = r.candidate_office ?? '';
|
|
212
|
-
const state = r.candidate_office_state ?? '';
|
|
213
|
-
const payee = r.payee_name ?? '';
|
|
214
|
-
const desc = r.expenditure_description ?? '';
|
|
215
|
-
const notice = r.is_notice ? ' [24/48h NOTICE]' : '';
|
|
216
|
-
lines.push(`- **[${indicator}]** ${amount} — ${candidate} (${office}${state ? `-${state}` : ''})${notice}`);
|
|
217
|
-
lines.push(` By: ${committee} on ${date}`);
|
|
218
|
-
if (payee)
|
|
219
|
-
lines.push(` Payee: ${payee}`);
|
|
220
|
-
if (desc)
|
|
221
|
-
lines.push(` ${desc}`);
|
|
208
|
+
const candidate = String(r.candidate_name ?? r.candidate_id ?? 'Unknown');
|
|
209
|
+
lines.push(`**[${indicator}] ${candidate}**\n${renderRecord(r, new Set(['candidate_name', 'support_oppose_indicator']))}`);
|
|
222
210
|
}
|
|
223
211
|
if (result.next_cursor) {
|
|
224
|
-
lines.push(
|
|
212
|
+
lines.push('\n_More results available — pass cursor to continue._');
|
|
225
213
|
}
|
|
226
|
-
return [{ type: 'text', text: lines.join('\n') }];
|
|
227
214
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
}
|
|
241
|
-
if (result.pagination && result.pagination.page < result.pagination.pages) {
|
|
242
|
-
lines.push(`\n_Page ${result.pagination.page} of ${result.pagination.pages}_`);
|
|
215
|
+
else {
|
|
216
|
+
if (result.pagination?.count != null) {
|
|
217
|
+
lines.push(`**${result.pagination.count.toLocaleString()} candidate-committee pairs**\n`);
|
|
218
|
+
}
|
|
219
|
+
for (const r of result.results) {
|
|
220
|
+
const indicator = supportOpposeLabel(r.support_oppose_indicator);
|
|
221
|
+
const candidate = String(r.candidate_name ?? r.candidate_id ?? 'Unknown');
|
|
222
|
+
lines.push(`**[${indicator}] ${candidate}**\n${renderRecord(r, new Set(['candidate_name', 'support_oppose_indicator']))}`);
|
|
223
|
+
}
|
|
224
|
+
if (result.pagination && result.pagination.page < result.pagination.pages) {
|
|
225
|
+
lines.push(`\n_Page ${result.pagination.page} of ${result.pagination.pages}_`);
|
|
226
|
+
}
|
|
243
227
|
}
|
|
244
|
-
return [{ type: 'text', text: lines.join('\n') }];
|
|
228
|
+
return [{ type: 'text', text: lines.join('\n\n') }];
|
|
245
229
|
},
|
|
246
230
|
});
|
|
247
231
|
//# sourceMappingURL=search-expenditures.tool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-expenditures.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-expenditures.tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAExF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"search-expenditures.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-expenditures.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-filings.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-filings.tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAKjD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"search-filings.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-filings.tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAKjD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;kBA0GxB,CAAC"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
8
8
|
import { getOpenFecService } from '../../../services/openfec/openfec-service.js';
|
|
9
|
-
import {
|
|
9
|
+
import { PaginationSchema, renderRecord, str } from './utils/format-helpers.js';
|
|
10
10
|
export const searchFilings = tool('openfec_search_filings', {
|
|
11
11
|
description: 'Search FEC filings and reports by committee, candidate, form type, or date range. ' +
|
|
12
12
|
'Covers financial reports (F3/F3P/F3X), statements of candidacy (F2), ' +
|
|
@@ -81,39 +81,14 @@ export const searchFilings = tool('openfec_search_filings', {
|
|
|
81
81
|
},
|
|
82
82
|
];
|
|
83
83
|
}
|
|
84
|
+
const headerKeys = new Set(['form_type', 'committee_name', 'committee_id']);
|
|
84
85
|
const lines = result.filings.map((f) => {
|
|
85
86
|
const formType = str(f, 'form_type');
|
|
86
87
|
const committeeName = str(f, 'committee_name');
|
|
87
88
|
const committeeId = str(f, 'committee_id');
|
|
88
|
-
const
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
const coverageEnd = str(f, 'coverage_end_date');
|
|
92
|
-
const candidateName = str(f, 'candidate_name');
|
|
93
|
-
const pdfUrl = str(f, 'pdf_url');
|
|
94
|
-
let line = `**${formType}** — ${committeeName} (${committeeId})`;
|
|
95
|
-
if (reportType)
|
|
96
|
-
line += `\n Report: ${reportType}`;
|
|
97
|
-
if (f.report_year)
|
|
98
|
-
line += ` (${f.report_year})`;
|
|
99
|
-
if (receiptDate)
|
|
100
|
-
line += ` | Filed: ${receiptDate}`;
|
|
101
|
-
if (candidateName)
|
|
102
|
-
line += `\n Candidate: ${candidateName}`;
|
|
103
|
-
// Financial totals
|
|
104
|
-
const hasFinancials = typeof f.total_receipts === 'number' || typeof f.total_disbursements === 'number';
|
|
105
|
-
if (hasFinancials) {
|
|
106
|
-
line += `\n Receipts: ${fmt$(f.total_receipts)} | Disbursements: ${fmt$(f.total_disbursements)}`;
|
|
107
|
-
line += ` | Cash: ${fmt$(f.cash_on_hand_end_period)} | Debt: ${fmt$(f.debts_owed_by_committee)}`;
|
|
108
|
-
}
|
|
109
|
-
if (coverageStart && coverageEnd) {
|
|
110
|
-
line += `\n Coverage: ${coverageStart} to ${coverageEnd}`;
|
|
111
|
-
}
|
|
112
|
-
if (f.is_amended === true)
|
|
113
|
-
line += ' | AMENDED';
|
|
114
|
-
if (pdfUrl)
|
|
115
|
-
line += `\n PDF: ${pdfUrl}`;
|
|
116
|
-
return line;
|
|
89
|
+
const header = `**${formType}** — ${committeeName} (${committeeId})`;
|
|
90
|
+
const fields = renderRecord(f, headerKeys);
|
|
91
|
+
return fields ? `${header}\n${fields}` : header;
|
|
117
92
|
});
|
|
118
93
|
const { page, pages, count } = result.pagination;
|
|
119
94
|
lines.push(`\n---\nPage ${page} of ${pages} (${count} total)`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-filings.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-filings.tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"search-filings.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-filings.tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAEhF,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,wBAAwB,EAAE;IAC1D,WAAW,EACT,oFAAoF;QACpF,uEAAuE;QACvE,wEAAwE;IAC1E,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE;IAEzD,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACpE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACxE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC1E,SAAS,EAAE,CAAC;aACT,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,oMAAoM,CACrM;QACH,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,mHAAmH,CACpH;QACH,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC3D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QAC7E,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QAC1F,WAAW,EAAE,CAAC;aACX,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,iFAAiF,CAAC;QAC9F,gBAAgB,EAAE,CAAC;aAChB,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,qDAAqD,CAAC;QAClE,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QACzF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;QAC3E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,CAAC;IAEF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,CAAC;aACP,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;aACxC,QAAQ,CACP,wFAAwF,CACzF;QACH,UAAU,EAAE,gBAAgB,CAAC,QAAQ,CAAC,iCAAiC,CAAC;KACzE,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;QACtB,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;QAEhC,MAAM,MAAM,GAAc;YACxB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,OAAO,EAAE,KAAK,CAAC,UAAU;YACzB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;YACtC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC;QAEF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE;YAChC,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAEpD,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,MAAM;QACX,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,+HAA+H;iBACtI;aACF,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC,CAAC;QAE5E,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACrC,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YACrC,MAAM,aAAa,GAAG,GAAG,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;YAC/C,MAAM,WAAW,GAAG,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,KAAK,QAAQ,QAAQ,aAAa,KAAK,WAAW,GAAG,CAAC;YACrE,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YAC3C,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,OAAO,KAAK,KAAK,KAAK,SAAS,CAAC,CAAC;QAE/D,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-legal.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-legal.tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAejD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"search-legal.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-legal.tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAejD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;kBAwKtB,CAAC"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
8
8
|
import { invalidParams } from '@cyanheads/mcp-ts-core/errors';
|
|
9
9
|
import { getOpenFecService } from '../../../services/openfec/openfec-service.js';
|
|
10
|
-
import {
|
|
10
|
+
import { renderRecord } from './utils/format-helpers.js';
|
|
11
11
|
/** Human-readable labels for document type discriminators. */
|
|
12
12
|
const typeLabels = {
|
|
13
13
|
advisory_opinion: 'Advisory Opinion',
|
|
@@ -25,7 +25,7 @@ export const searchLegal = tool('openfec_search_legal', {
|
|
|
25
25
|
type: z
|
|
26
26
|
.enum(['advisory_opinions', 'murs', 'adrs', 'admin_fines', 'statutes'])
|
|
27
27
|
.optional()
|
|
28
|
-
.describe('Document type filter. Omit to search all types.'),
|
|
28
|
+
.describe('Document type filter. Omit to search all types. admin_fines is slow without a query or respondent filter.'),
|
|
29
29
|
ao_number: z.string().optional().describe('Specific advisory opinion number (e.g. "2024-01").'),
|
|
30
30
|
case_number: z.string().optional().describe('Specific MUR or ADR case number.'),
|
|
31
31
|
respondent: z.string().optional().describe('Respondent name (enforcement cases).'),
|
|
@@ -134,7 +134,6 @@ export const searchLegal = tool('openfec_search_legal', {
|
|
|
134
134
|
},
|
|
135
135
|
];
|
|
136
136
|
}
|
|
137
|
-
/** Group results by document_type for readable output. */
|
|
138
137
|
const grouped = new Map();
|
|
139
138
|
for (const doc of result.results) {
|
|
140
139
|
const docType = String(doc.document_type ?? 'unknown');
|
|
@@ -145,32 +144,24 @@ export const searchLegal = tool('openfec_search_legal', {
|
|
|
145
144
|
}
|
|
146
145
|
group.push(doc);
|
|
147
146
|
}
|
|
147
|
+
const headerKeys = new Set(['ao_no', 'case_no', 'no', 'name', 'document_type']);
|
|
148
148
|
const sections = [];
|
|
149
149
|
for (const [docType, docs] of grouped) {
|
|
150
150
|
const label = typeLabels[docType] ?? docType;
|
|
151
|
-
const
|
|
152
|
-
const id = doc.ao_no ?? doc.case_no ?? doc.no ?? '';
|
|
153
|
-
const name = doc.name
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
?
|
|
157
|
-
:
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
if (name)
|
|
164
|
-
parts.push(String(name));
|
|
165
|
-
if (date)
|
|
166
|
-
parts.push(`(${date})`);
|
|
167
|
-
if (penalty)
|
|
168
|
-
parts.push(penalty);
|
|
169
|
-
if (summary)
|
|
170
|
-
parts.push(`\n ${String(summary).slice(0, 300)}`);
|
|
171
|
-
return parts.join(' ');
|
|
151
|
+
const items = docs.map((doc) => {
|
|
152
|
+
const id = String(doc.ao_no ?? doc.case_no ?? doc.no ?? '');
|
|
153
|
+
const name = doc.name ? String(doc.name) : '';
|
|
154
|
+
const header = id
|
|
155
|
+
? name
|
|
156
|
+
? `**${id}** — ${name}`
|
|
157
|
+
: `**${id}**`
|
|
158
|
+
: name
|
|
159
|
+
? `**${name}**`
|
|
160
|
+
: '**Document**';
|
|
161
|
+
const fields = renderRecord(doc, headerKeys);
|
|
162
|
+
return fields ? `${header}\n${fields}` : header;
|
|
172
163
|
});
|
|
173
|
-
sections.push(`### ${label}\n${
|
|
164
|
+
sections.push(`### ${label}\n${items.join('\n\n')}`);
|
|
174
165
|
}
|
|
175
166
|
sections.push(`\n_${result.total_count} total matching document(s)_`);
|
|
176
167
|
return [{ type: 'text', text: sections.join('\n\n') }];
|