tn-elections-mcp 0.5.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/README.md +87 -0
- package/dist/api/easyvote-client.d.ts +51 -0
- package/dist/api/easyvote-client.js +254 -0
- package/dist/api/easyvote-client.js.map +1 -0
- package/dist/api/easyvote-client.test.d.ts +1 -0
- package/dist/api/easyvote-client.test.js +47 -0
- package/dist/api/easyvote-client.test.js.map +1 -0
- package/dist/api/gemini-pdf.d.ts +23 -0
- package/dist/api/gemini-pdf.js +261 -0
- package/dist/api/gemini-pdf.js.map +1 -0
- package/dist/api/sos-client.d.ts +15 -0
- package/dist/api/sos-client.js +74 -0
- package/dist/api/sos-client.js.map +1 -0
- package/dist/api/sumner-client.d.ts +12 -0
- package/dist/api/sumner-client.js +57 -0
- package/dist/api/sumner-client.js.map +1 -0
- package/dist/api/tncamp-client.d.ts +61 -0
- package/dist/api/tncamp-client.js +310 -0
- package/dist/api/tncamp-client.js.map +1 -0
- package/dist/data/sumner-cycles.d.ts +3 -0
- package/dist/data/sumner-cycles.js +19 -0
- package/dist/data/sumner-cycles.js.map +1 -0
- package/dist/data/sumner-cycles.test.d.ts +1 -0
- package/dist/data/sumner-cycles.test.js +29 -0
- package/dist/data/sumner-cycles.test.js.map +1 -0
- package/dist/data/tn-counties.d.ts +23 -0
- package/dist/data/tn-counties.js +162 -0
- package/dist/data/tn-counties.js.map +1 -0
- package/dist/data/tn-counties.test.d.ts +1 -0
- package/dist/data/tn-counties.test.js +71 -0
- package/dist/data/tn-counties.test.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/sos-xlsx.d.ts +24 -0
- package/dist/parsers/sos-xlsx.js +149 -0
- package/dist/parsers/sos-xlsx.js.map +1 -0
- package/dist/parsers/sos-xlsx.test.d.ts +1 -0
- package/dist/parsers/sos-xlsx.test.js +111 -0
- package/dist/parsers/sos-xlsx.test.js.map +1 -0
- package/dist/parsers/sumner-html.d.ts +8 -0
- package/dist/parsers/sumner-html.js +200 -0
- package/dist/parsers/sumner-html.js.map +1 -0
- package/dist/parsers/sumner-html.test.d.ts +1 -0
- package/dist/parsers/sumner-html.test.js +79 -0
- package/dist/parsers/sumner-html.test.js.map +1 -0
- package/dist/parsers/tncamp-form.d.ts +15 -0
- package/dist/parsers/tncamp-form.js +54 -0
- package/dist/parsers/tncamp-form.js.map +1 -0
- package/dist/parsers/tncamp-form.test.d.ts +1 -0
- package/dist/parsers/tncamp-form.test.js +114 -0
- package/dist/parsers/tncamp-form.test.js.map +1 -0
- package/dist/parsers/tncamp-report.d.ts +6 -0
- package/dist/parsers/tncamp-report.js +189 -0
- package/dist/parsers/tncamp-report.js.map +1 -0
- package/dist/parsers/tncamp-results.d.ts +10 -0
- package/dist/parsers/tncamp-results.js +113 -0
- package/dist/parsers/tncamp-results.js.map +1 -0
- package/dist/parsers/tncamp-results.test.d.ts +1 -0
- package/dist/parsers/tncamp-results.test.js +86 -0
- package/dist/parsers/tncamp-results.test.js.map +1 -0
- package/dist/tools/easyvote.d.ts +2 -0
- package/dist/tools/easyvote.js +382 -0
- package/dist/tools/easyvote.js.map +1 -0
- package/dist/tools/sos.d.ts +2 -0
- package/dist/tools/sos.js +130 -0
- package/dist/tools/sos.js.map +1 -0
- package/dist/tools/sumner.d.ts +2 -0
- package/dist/tools/sumner.js +134 -0
- package/dist/tools/sumner.js.map +1 -0
- package/dist/tools/tncamp.d.ts +2 -0
- package/dist/tools/tncamp.js +401 -0
- package/dist/tools/tncamp.js.map +1 -0
- package/dist/types.d.ts +270 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { searchCandidates, getCandidateReports, getReportDetail, searchContributions, searchExpenditures, getFormOptions, getDistricts, resolveOffice, resolveDistrict, resolveElectionYear, resolveParty, } from '../api/tncamp-client.js';
|
|
3
|
+
export function registerTncampTools(server) {
|
|
4
|
+
// ============================================================
|
|
5
|
+
// search_state_candidates
|
|
6
|
+
// ============================================================
|
|
7
|
+
server.tool('search_state_candidates', 'Search Tennessee state-level candidates and PACs in the tncamp system (apps.tn.gov/tncamp). Covers Governor, state Senate, state House, judges, DAs, and statewide PACs. Two search modes: (1) By name: provide name param. (2) By office: provide office param (and optionally district) to find all candidates for a seat — year is REQUIRED for office search. Use the candidate ID with get_candidate_reports to see filed reports. For county-level candidates, use search_county_filers instead.', {
|
|
8
|
+
name: z.string().optional().describe('Candidate or PAC name (last name or full name)'),
|
|
9
|
+
office: z.string().optional().describe('Office name (e.g., "circuit court", "governor", "district attorney"). Use list_tncamp_offices to see available offices.'),
|
|
10
|
+
district: z.string().optional().describe('District label (e.g., "18-2", "22"). Use list_tncamp_districts to see available districts for an office.'),
|
|
11
|
+
year: z.string().optional().describe('Election year (e.g., "2026"). Required when searching by office without name.'),
|
|
12
|
+
party: z.string().optional().describe('Party name (e.g., "Republican", "Democrat")'),
|
|
13
|
+
search_type: z.enum(['candidate', 'pac', 'both']).optional().describe('Search candidates, PACs, or both (default: both)'),
|
|
14
|
+
limit: z.number().optional().describe('Max results (default 50, 0 for all)'),
|
|
15
|
+
}, async ({ name, office, district, year, party, search_type, limit }) => {
|
|
16
|
+
try {
|
|
17
|
+
if (!name && !office) {
|
|
18
|
+
return { content: [{ type: 'text', text: 'Either name or office is required. Use name for candidate search, or office (+ district, year) to find all candidates for a seat.' }] };
|
|
19
|
+
}
|
|
20
|
+
// Resolve office/district/year/party to tncamp IDs
|
|
21
|
+
let officeId;
|
|
22
|
+
let districtId;
|
|
23
|
+
let yearId;
|
|
24
|
+
let partyId;
|
|
25
|
+
if (office) {
|
|
26
|
+
const resolved = await resolveOffice(office);
|
|
27
|
+
if (!resolved) {
|
|
28
|
+
const options = await getFormOptions();
|
|
29
|
+
const available = options.offices.map(o => o.name).join(', ');
|
|
30
|
+
return { content: [{ type: 'text', text: `Office "${office}" not found. Available: ${available}` }] };
|
|
31
|
+
}
|
|
32
|
+
officeId = resolved.id;
|
|
33
|
+
if (district) {
|
|
34
|
+
const resolvedDist = await resolveDistrict(officeId, district);
|
|
35
|
+
if (!resolvedDist) {
|
|
36
|
+
const dists = await getDistricts(officeId);
|
|
37
|
+
const available = dists.slice(0, 20).map(d => d.label).join(', ');
|
|
38
|
+
return { content: [{ type: 'text', text: `District "${district}" not found for ${resolved.name}. Available: ${available}${dists.length > 20 ? ` (${dists.length} total)` : ''}` }] };
|
|
39
|
+
}
|
|
40
|
+
districtId = resolvedDist.id;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (year) {
|
|
44
|
+
const resolvedYear = await resolveElectionYear(year);
|
|
45
|
+
if (!resolvedYear) {
|
|
46
|
+
return { content: [{ type: 'text', text: `Election year "${year}" not found. Try a year like "2026" or "2024".` }] };
|
|
47
|
+
}
|
|
48
|
+
yearId = resolvedYear.id;
|
|
49
|
+
}
|
|
50
|
+
else if (office && !name) {
|
|
51
|
+
return { content: [{ type: 'text', text: 'Year is required when searching by office without a name. Add year: "2026" (or another election year).' }] };
|
|
52
|
+
}
|
|
53
|
+
if (party) {
|
|
54
|
+
const resolvedParty = await resolveParty(party);
|
|
55
|
+
if (resolvedParty)
|
|
56
|
+
partyId = resolvedParty.id;
|
|
57
|
+
}
|
|
58
|
+
let results = await searchCandidates({
|
|
59
|
+
name,
|
|
60
|
+
searchType: search_type,
|
|
61
|
+
officeId,
|
|
62
|
+
district: districtId,
|
|
63
|
+
electionYearId: yearId,
|
|
64
|
+
partyId,
|
|
65
|
+
});
|
|
66
|
+
// If multi-word name returned nothing, retry with last word (likely last name)
|
|
67
|
+
// tncamp searches "Last, First" format — "Bill Lee" won't match but "Lee" will
|
|
68
|
+
if (results.length === 0 && name && name.includes(' ')) {
|
|
69
|
+
const words = name.trim().split(/\s+/);
|
|
70
|
+
const lastName = words[words.length - 1];
|
|
71
|
+
results = await searchCandidates({ name: lastName, searchType: search_type, officeId, district: districtId, electionYearId: yearId, partyId });
|
|
72
|
+
if (results.length > 0) {
|
|
73
|
+
const firstName = words[0].toLowerCase();
|
|
74
|
+
const filtered = results.filter(c => c.name.toLowerCase().includes(firstName));
|
|
75
|
+
if (filtered.length > 0)
|
|
76
|
+
results = filtered;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (results.length === 0) {
|
|
80
|
+
const searchDesc = name ? `name "${name}"` : `office "${office}"${district ? ` district "${district}"` : ''}${year ? ` year ${year}` : ''}`;
|
|
81
|
+
return { content: [{ type: 'text', text: `No state candidates or PACs found matching ${searchDesc}.` }] };
|
|
82
|
+
}
|
|
83
|
+
const effectiveLimit = limit === undefined ? 50 : limit;
|
|
84
|
+
const totalCount = results.length;
|
|
85
|
+
const limited = effectiveLimit > 0 ? results.slice(0, effectiveLimit) : results;
|
|
86
|
+
const limitNote = effectiveLimit > 0 && totalCount > effectiveLimit
|
|
87
|
+
? `Showing ${limited.length} of ${totalCount} results. Use limit=0 for all.\n\n`
|
|
88
|
+
: '';
|
|
89
|
+
return {
|
|
90
|
+
content: [{
|
|
91
|
+
type: 'text',
|
|
92
|
+
text: `${limitNote}${totalCount} state candidate/PAC result(s):\n\n${JSON.stringify(limited, null, 2)}`,
|
|
93
|
+
}],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
return {
|
|
98
|
+
content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
99
|
+
isError: true,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
// ============================================================
|
|
104
|
+
// get_candidate_reports
|
|
105
|
+
// ============================================================
|
|
106
|
+
server.tool('get_candidate_reports', 'Get the list of filed campaign finance reports for a Tennessee state candidate or PAC. Returns report names, election years, submission dates, amendment flags, and report IDs. Use the report ID with get_report_detail for the full financial breakdown. Requires candidate_id and candidate_name from search_state_candidates results.', {
|
|
107
|
+
candidate_id: z.number().describe('Candidate ID (from search_state_candidates candidateId field)'),
|
|
108
|
+
candidate_name: z.string().describe('Candidate name as it appears in search results (e.g., "POWERS, BILL")'),
|
|
109
|
+
}, async ({ candidate_id, candidate_name }) => {
|
|
110
|
+
try {
|
|
111
|
+
const reports = await getCandidateReports(candidate_id, candidate_name);
|
|
112
|
+
if (reports.length === 0) {
|
|
113
|
+
return { content: [{ type: 'text', text: `No reports found for candidate ID ${candidate_id} (${candidate_name}).` }] };
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
content: [{
|
|
117
|
+
type: 'text',
|
|
118
|
+
text: `${reports.length} report(s) for ${candidate_name}:\n\n${JSON.stringify(reports, null, 2)}`,
|
|
119
|
+
}],
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
return {
|
|
124
|
+
content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
125
|
+
isError: true,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
// ============================================================
|
|
130
|
+
// get_report_detail
|
|
131
|
+
// ============================================================
|
|
132
|
+
server.tool('get_report_detail', 'Get the full financial breakdown for a Tennessee state campaign finance report. Returns beginning/ending balance (cash on hand), total contributions, receipts, expenditures, disbursements, outstanding loans, and optionally itemized line items. Requires a report_id from get_candidate_reports. Set include_line_items=false for just the aggregate totals (faster, smaller response).', {
|
|
133
|
+
report_id: z.number().describe('Report ID (from get_candidate_reports reportId field)'),
|
|
134
|
+
include_line_items: z.boolean().optional().describe('Include itemized line items (default true). False for summary only.'),
|
|
135
|
+
}, async ({ report_id, include_line_items }) => {
|
|
136
|
+
try {
|
|
137
|
+
const detail = await getReportDetail(report_id);
|
|
138
|
+
const output = include_line_items === false
|
|
139
|
+
? {
|
|
140
|
+
...detail,
|
|
141
|
+
receipts: `${detail.receipts.length} item(s) (omitted — set include_line_items=true)`,
|
|
142
|
+
disbursements: `${detail.disbursements.length} item(s) (omitted)`,
|
|
143
|
+
inKindContributions: `${detail.inKindContributions.length} item(s) (omitted)`,
|
|
144
|
+
loans: `${detail.loans.length} item(s) (omitted)`,
|
|
145
|
+
obligations: `${detail.obligations.length} item(s) (omitted)`,
|
|
146
|
+
}
|
|
147
|
+
: detail;
|
|
148
|
+
return {
|
|
149
|
+
content: [{
|
|
150
|
+
type: 'text',
|
|
151
|
+
text: `Report ${report_id} — ${detail.candidateName}:\n\n${JSON.stringify(output, null, 2)}`,
|
|
152
|
+
}],
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
return {
|
|
157
|
+
content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
158
|
+
isError: true,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
// ============================================================
|
|
163
|
+
// search_state_contributions
|
|
164
|
+
// ============================================================
|
|
165
|
+
server.tool('search_state_contributions', 'Search campaign contributions across Tennessee state candidates and PACs. Search by donor name, candidate name, employer, occupation, or zip code. Year is REQUIRED. Fetches all pages (50/page, max 1000). IMPORTANT: candidate_name must be LAST NAME ONLY (e.g., "Powers" not "Powers, Bill"). For county-level contributions, use search_county_contributions instead.', {
|
|
166
|
+
year: z.string().describe('Report year (REQUIRED, e.g., "2025")'),
|
|
167
|
+
candidate_name: z.string().optional().describe('Candidate LAST NAME ONLY'),
|
|
168
|
+
contributor_name: z.string().optional().describe('Donor/contributor name'),
|
|
169
|
+
employer: z.string().optional().describe('Donor employer'),
|
|
170
|
+
occupation: z.string().optional().describe('Donor occupation'),
|
|
171
|
+
zip_code: z.string().optional().describe('Donor zip code'),
|
|
172
|
+
type: z.enum(['monetary', 'inkind', 'independent', 'all']).optional().describe('Contribution type (default: all)'),
|
|
173
|
+
min_amount: z.number().optional().describe('Minimum dollar amount'),
|
|
174
|
+
limit: z.number().optional().describe('Max results (default 200, 0 for all)'),
|
|
175
|
+
}, async (params) => {
|
|
176
|
+
try {
|
|
177
|
+
if (!params.candidate_name && !params.contributor_name && !params.employer && !params.zip_code) {
|
|
178
|
+
return {
|
|
179
|
+
content: [{ type: 'text', text: 'At least one search filter (candidate_name, contributor_name, employer, or zip_code) is required in addition to year.' }],
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
const { items, totalCount, truncated } = await searchContributions({
|
|
183
|
+
year: params.year,
|
|
184
|
+
candName: params.candidate_name,
|
|
185
|
+
contributorName: params.contributor_name,
|
|
186
|
+
employer: params.employer,
|
|
187
|
+
occupation: params.occupation,
|
|
188
|
+
zipCode: params.zip_code,
|
|
189
|
+
typeOf: params.type,
|
|
190
|
+
amountDollars: params.min_amount,
|
|
191
|
+
amountSelection: params.min_amount ? 'greater' : undefined,
|
|
192
|
+
});
|
|
193
|
+
if (items.length === 0) {
|
|
194
|
+
return { content: [{ type: 'text', text: `No contributions found for ${params.year} matching your search.` }] };
|
|
195
|
+
}
|
|
196
|
+
const effectiveLimit = params.limit === undefined ? 200 : params.limit;
|
|
197
|
+
const limited = effectiveLimit > 0 ? items.slice(0, effectiveLimit) : items;
|
|
198
|
+
const totalAmount = items.reduce((sum, c) => sum + c.amount, 0);
|
|
199
|
+
const shownAmount = limited.reduce((sum, c) => sum + c.amount, 0);
|
|
200
|
+
let header = effectiveLimit > 0 && items.length > effectiveLimit
|
|
201
|
+
? `Showing ${limited.length} of ${totalCount} contributions ($${shownAmount.toLocaleString()} of $${totalAmount.toLocaleString()} total). Increase limit for more.\n\n`
|
|
202
|
+
: `${totalCount} contribution(s) totaling $${totalAmount.toLocaleString()}:\n\n`;
|
|
203
|
+
if (truncated) {
|
|
204
|
+
header = `WARNING: Results were truncated at ${items.length} of ${totalCount} total (pagination limit). Narrow your search for complete results.\n\n` + header;
|
|
205
|
+
}
|
|
206
|
+
return { content: [{ type: 'text', text: header + JSON.stringify(limited, null, 2) }] };
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
return {
|
|
210
|
+
content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
211
|
+
isError: true,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
// ============================================================
|
|
216
|
+
// search_state_expenditures
|
|
217
|
+
// ============================================================
|
|
218
|
+
server.tool('search_state_expenditures', 'Search campaign expenditures across Tennessee state candidates and PACs. Search by vendor name, candidate name, purpose, or vendor zip. Year is REQUIRED. Fetches all pages (50/page, max 1000). IMPORTANT: candidate_name must be LAST NAME ONLY. Known limitation: "Candidate For" column is almost always empty — you cannot determine which candidate made a payment from search results alone. For county-level data, use EasyVote tools.', {
|
|
219
|
+
year: z.string().describe('Report year (REQUIRED, e.g., "2025")'),
|
|
220
|
+
candidate_name: z.string().optional().describe('Candidate LAST NAME ONLY'),
|
|
221
|
+
vendor_name: z.string().optional().describe('Vendor/payee name'),
|
|
222
|
+
vendor_zip_code: z.string().optional().describe('Vendor zip code'),
|
|
223
|
+
purpose: z.string().optional().describe('Purpose of expenditure'),
|
|
224
|
+
type: z.enum(['monetary', 'inkind', 'independent', 'all']).optional().describe('Type (default: all)'),
|
|
225
|
+
min_amount: z.number().optional().describe('Minimum dollar amount'),
|
|
226
|
+
limit: z.number().optional().describe('Max results (default 200, 0 for all)'),
|
|
227
|
+
}, async (params) => {
|
|
228
|
+
try {
|
|
229
|
+
if (!params.candidate_name && !params.vendor_name && !params.purpose && !params.vendor_zip_code) {
|
|
230
|
+
return {
|
|
231
|
+
content: [{ type: 'text', text: 'At least one search filter (candidate_name, vendor_name, purpose, or vendor_zip_code) is required in addition to year.' }],
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
const { items, totalCount, truncated } = await searchExpenditures({
|
|
235
|
+
year: params.year,
|
|
236
|
+
candName: params.candidate_name,
|
|
237
|
+
vendorName: params.vendor_name,
|
|
238
|
+
vendorZipCode: params.vendor_zip_code,
|
|
239
|
+
purpose: params.purpose,
|
|
240
|
+
typeOf: params.type,
|
|
241
|
+
amountDollars: params.min_amount,
|
|
242
|
+
amountSelection: params.min_amount ? 'greater' : undefined,
|
|
243
|
+
});
|
|
244
|
+
if (items.length === 0) {
|
|
245
|
+
return { content: [{ type: 'text', text: `No expenditures found for ${params.year} matching your search.` }] };
|
|
246
|
+
}
|
|
247
|
+
const effectiveLimit = params.limit === undefined ? 200 : params.limit;
|
|
248
|
+
const limited = effectiveLimit > 0 ? items.slice(0, effectiveLimit) : items;
|
|
249
|
+
const totalAmount = items.reduce((sum, e) => sum + e.amount, 0);
|
|
250
|
+
const shownAmount = limited.reduce((sum, e) => sum + e.amount, 0);
|
|
251
|
+
let header = effectiveLimit > 0 && items.length > effectiveLimit
|
|
252
|
+
? `Showing ${limited.length} of ${totalCount} expenditures ($${shownAmount.toLocaleString()} of $${totalAmount.toLocaleString()} total). Increase limit for more.\n\n`
|
|
253
|
+
: `${totalCount} expenditure(s) totaling $${totalAmount.toLocaleString()}:\n\n`;
|
|
254
|
+
if (truncated) {
|
|
255
|
+
header = `WARNING: Results were truncated at ${items.length} of ${totalCount} total (pagination limit). Narrow your search for complete results.\n\n` + header;
|
|
256
|
+
}
|
|
257
|
+
return { content: [{ type: 'text', text: header + JSON.stringify(limited, null, 2) }] };
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
return {
|
|
261
|
+
content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
262
|
+
isError: true,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
// ============================================================
|
|
267
|
+
// get_candidate_financials
|
|
268
|
+
// ============================================================
|
|
269
|
+
server.tool('get_candidate_financials', 'Convenience tool: look up a Tennessee state candidate by name, find their most recent report, and return headline financials (cash on hand, total contributions, total expenditures). Combines search + reports + report detail in one call. Does NOT include itemized line items — use get_report_detail with the report ID for those. If multiple candidates match, uses the first result (most recent election) and includes all matches for clarification.', {
|
|
270
|
+
name: z.string().describe('Candidate name (last name or full name)'),
|
|
271
|
+
search_type: z.enum(['candidate', 'pac', 'both']).optional().describe('Search type (default: candidate)'),
|
|
272
|
+
}, async ({ name, search_type }) => {
|
|
273
|
+
try {
|
|
274
|
+
let candidates = await searchCandidates({ name, searchType: search_type || 'candidate' });
|
|
275
|
+
// Multi-word name fallback (same as search_state_candidates)
|
|
276
|
+
if (candidates.length === 0 && name.includes(' ')) {
|
|
277
|
+
const words = name.trim().split(/\s+/);
|
|
278
|
+
const lastName = words[words.length - 1];
|
|
279
|
+
candidates = await searchCandidates({ name: lastName, searchType: search_type || 'candidate' });
|
|
280
|
+
if (candidates.length > 0) {
|
|
281
|
+
const firstName = words[0].toLowerCase();
|
|
282
|
+
const filtered = candidates.filter(c => c.name.toLowerCase().includes(firstName));
|
|
283
|
+
if (filtered.length > 0)
|
|
284
|
+
candidates = filtered;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
if (candidates.length === 0) {
|
|
288
|
+
return { content: [{ type: 'text', text: `No state candidates found matching "${name}".` }] };
|
|
289
|
+
}
|
|
290
|
+
const candidate = candidates[0];
|
|
291
|
+
if (!candidate.candidateId) {
|
|
292
|
+
return {
|
|
293
|
+
content: [{
|
|
294
|
+
type: 'text',
|
|
295
|
+
text: `Found "${candidate.name}" but no candidate ID available.\n\nAll matches:\n${JSON.stringify(candidates.slice(0, 10), null, 2)}`,
|
|
296
|
+
}],
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
const reports = await getCandidateReports(candidate.candidateId, candidate.name);
|
|
300
|
+
if (reports.length === 0) {
|
|
301
|
+
return {
|
|
302
|
+
content: [{
|
|
303
|
+
type: 'text',
|
|
304
|
+
text: `Found ${candidate.name} (ID: ${candidate.candidateId}, ${candidate.officeSought} ${candidate.district}) but no filed reports yet.\n\nAll matches:\n${JSON.stringify(candidates.slice(0, 5), null, 2)}`,
|
|
305
|
+
}],
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
// Get the most recent report (last in list = most recent by election year)
|
|
309
|
+
const latestReport = reports[reports.length - 1];
|
|
310
|
+
const detail = await getReportDetail(latestReport.reportId);
|
|
311
|
+
const financials = {
|
|
312
|
+
candidate,
|
|
313
|
+
allMatches: candidates.length > 1 ? candidates.slice(0, 10) : undefined,
|
|
314
|
+
reportCount: reports.length,
|
|
315
|
+
latestReport: {
|
|
316
|
+
reportId: detail.reportId,
|
|
317
|
+
reportTitle: detail.reportTitle,
|
|
318
|
+
submittedOn: latestReport.submittedOn,
|
|
319
|
+
beginningBalance: detail.beginningBalance,
|
|
320
|
+
totalContributions: detail.totalContributions,
|
|
321
|
+
totalReceipts: detail.totalReceipts,
|
|
322
|
+
totalExpenditures: detail.totalExpenditures,
|
|
323
|
+
totalDisbursements: detail.totalDisbursements,
|
|
324
|
+
endingBalance: detail.endingBalance,
|
|
325
|
+
totalOutstandingLoans: detail.totalOutstandingLoans,
|
|
326
|
+
itemCounts: {
|
|
327
|
+
receipts: detail.receipts.length,
|
|
328
|
+
disbursements: detail.disbursements.length,
|
|
329
|
+
inKindContributions: detail.inKindContributions.length,
|
|
330
|
+
loans: detail.loans.length,
|
|
331
|
+
obligations: detail.obligations.length,
|
|
332
|
+
},
|
|
333
|
+
},
|
|
334
|
+
};
|
|
335
|
+
return {
|
|
336
|
+
content: [{
|
|
337
|
+
type: 'text',
|
|
338
|
+
text: `Financials for ${candidate.name} (${candidate.officeSought} ${candidate.district}):\n\n${JSON.stringify(financials, null, 2)}`,
|
|
339
|
+
}],
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
catch (error) {
|
|
343
|
+
return {
|
|
344
|
+
content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
345
|
+
isError: true,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
// ============================================================
|
|
350
|
+
// list_tncamp_offices
|
|
351
|
+
// ============================================================
|
|
352
|
+
server.tool('list_tncamp_offices', 'List all offices available in the tncamp campaign finance system. Returns office names and IDs for use with search_state_candidates office parameter. Covers Governor, state legislature, courts (Circuit, Criminal, Chancery, Probate, Court of Appeals, Court of Criminal Appeals, Supreme Court), District Attorney, and Public Defender.', {}, async () => {
|
|
353
|
+
try {
|
|
354
|
+
const options = await getFormOptions();
|
|
355
|
+
return {
|
|
356
|
+
content: [{
|
|
357
|
+
type: 'text',
|
|
358
|
+
text: `${options.offices.length} office(s) available:\n\n${JSON.stringify(options.offices, null, 2)}`,
|
|
359
|
+
}],
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
return {
|
|
364
|
+
content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
365
|
+
isError: true,
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
// ============================================================
|
|
370
|
+
// list_tncamp_districts
|
|
371
|
+
// ============================================================
|
|
372
|
+
server.tool('list_tncamp_districts', 'List districts for a given office in the tncamp system. Returns district labels and IDs. Use with search_state_candidates to find all candidates for a specific seat (e.g., Circuit Court 18-2). Some offices like Governor have no districts.', {
|
|
373
|
+
office: z.string().describe('Office name or ID (e.g., "circuit court", "10", "district attorney")'),
|
|
374
|
+
}, async ({ office }) => {
|
|
375
|
+
try {
|
|
376
|
+
const resolved = await resolveOffice(office);
|
|
377
|
+
if (!resolved) {
|
|
378
|
+
const options = await getFormOptions();
|
|
379
|
+
const available = options.offices.map(o => o.name).join(', ');
|
|
380
|
+
return { content: [{ type: 'text', text: `Office "${office}" not found. Available: ${available}` }] };
|
|
381
|
+
}
|
|
382
|
+
const districts = await getDistricts(resolved.id);
|
|
383
|
+
if (districts.length === 0) {
|
|
384
|
+
return { content: [{ type: 'text', text: `${resolved.name} has no districts.` }] };
|
|
385
|
+
}
|
|
386
|
+
return {
|
|
387
|
+
content: [{
|
|
388
|
+
type: 'text',
|
|
389
|
+
text: `${resolved.name} — ${districts.length} district(s):\n\n${JSON.stringify(districts, null, 2)}`,
|
|
390
|
+
}],
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
catch (error) {
|
|
394
|
+
return {
|
|
395
|
+
content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
396
|
+
isError: true,
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
//# sourceMappingURL=tncamp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tncamp.js","sourceRoot":"","sources":["../../src/tools/tncamp.ts"],"names":[],"mappings":"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"}
|