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.
Files changed (77) hide show
  1. package/README.md +87 -0
  2. package/dist/api/easyvote-client.d.ts +51 -0
  3. package/dist/api/easyvote-client.js +254 -0
  4. package/dist/api/easyvote-client.js.map +1 -0
  5. package/dist/api/easyvote-client.test.d.ts +1 -0
  6. package/dist/api/easyvote-client.test.js +47 -0
  7. package/dist/api/easyvote-client.test.js.map +1 -0
  8. package/dist/api/gemini-pdf.d.ts +23 -0
  9. package/dist/api/gemini-pdf.js +261 -0
  10. package/dist/api/gemini-pdf.js.map +1 -0
  11. package/dist/api/sos-client.d.ts +15 -0
  12. package/dist/api/sos-client.js +74 -0
  13. package/dist/api/sos-client.js.map +1 -0
  14. package/dist/api/sumner-client.d.ts +12 -0
  15. package/dist/api/sumner-client.js +57 -0
  16. package/dist/api/sumner-client.js.map +1 -0
  17. package/dist/api/tncamp-client.d.ts +61 -0
  18. package/dist/api/tncamp-client.js +310 -0
  19. package/dist/api/tncamp-client.js.map +1 -0
  20. package/dist/data/sumner-cycles.d.ts +3 -0
  21. package/dist/data/sumner-cycles.js +19 -0
  22. package/dist/data/sumner-cycles.js.map +1 -0
  23. package/dist/data/sumner-cycles.test.d.ts +1 -0
  24. package/dist/data/sumner-cycles.test.js +29 -0
  25. package/dist/data/sumner-cycles.test.js.map +1 -0
  26. package/dist/data/tn-counties.d.ts +23 -0
  27. package/dist/data/tn-counties.js +162 -0
  28. package/dist/data/tn-counties.js.map +1 -0
  29. package/dist/data/tn-counties.test.d.ts +1 -0
  30. package/dist/data/tn-counties.test.js +71 -0
  31. package/dist/data/tn-counties.test.js.map +1 -0
  32. package/dist/index.d.ts +2 -0
  33. package/dist/index.js +31 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/parsers/sos-xlsx.d.ts +24 -0
  36. package/dist/parsers/sos-xlsx.js +149 -0
  37. package/dist/parsers/sos-xlsx.js.map +1 -0
  38. package/dist/parsers/sos-xlsx.test.d.ts +1 -0
  39. package/dist/parsers/sos-xlsx.test.js +111 -0
  40. package/dist/parsers/sos-xlsx.test.js.map +1 -0
  41. package/dist/parsers/sumner-html.d.ts +8 -0
  42. package/dist/parsers/sumner-html.js +200 -0
  43. package/dist/parsers/sumner-html.js.map +1 -0
  44. package/dist/parsers/sumner-html.test.d.ts +1 -0
  45. package/dist/parsers/sumner-html.test.js +79 -0
  46. package/dist/parsers/sumner-html.test.js.map +1 -0
  47. package/dist/parsers/tncamp-form.d.ts +15 -0
  48. package/dist/parsers/tncamp-form.js +54 -0
  49. package/dist/parsers/tncamp-form.js.map +1 -0
  50. package/dist/parsers/tncamp-form.test.d.ts +1 -0
  51. package/dist/parsers/tncamp-form.test.js +114 -0
  52. package/dist/parsers/tncamp-form.test.js.map +1 -0
  53. package/dist/parsers/tncamp-report.d.ts +6 -0
  54. package/dist/parsers/tncamp-report.js +189 -0
  55. package/dist/parsers/tncamp-report.js.map +1 -0
  56. package/dist/parsers/tncamp-results.d.ts +10 -0
  57. package/dist/parsers/tncamp-results.js +113 -0
  58. package/dist/parsers/tncamp-results.js.map +1 -0
  59. package/dist/parsers/tncamp-results.test.d.ts +1 -0
  60. package/dist/parsers/tncamp-results.test.js +86 -0
  61. package/dist/parsers/tncamp-results.test.js.map +1 -0
  62. package/dist/tools/easyvote.d.ts +2 -0
  63. package/dist/tools/easyvote.js +382 -0
  64. package/dist/tools/easyvote.js.map +1 -0
  65. package/dist/tools/sos.d.ts +2 -0
  66. package/dist/tools/sos.js +130 -0
  67. package/dist/tools/sos.js.map +1 -0
  68. package/dist/tools/sumner.d.ts +2 -0
  69. package/dist/tools/sumner.js +134 -0
  70. package/dist/tools/sumner.js.map +1 -0
  71. package/dist/tools/tncamp.d.ts +2 -0
  72. package/dist/tools/tncamp.js +401 -0
  73. package/dist/tools/tncamp.js.map +1 -0
  74. package/dist/types.d.ts +270 -0
  75. package/dist/types.js +5 -0
  76. package/dist/types.js.map +1 -0
  77. package/package.json +47 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tncamp-results.js","sourceRoot":"","sources":["../../src/parsers/tncamp-results.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,86 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { parseResultsTable, parsePaginationInfo } from './tncamp-results.js';
3
+ const CANDIDATE_HTML = `
4
+ <table id="results">
5
+ <thead><tr><th>Name</th><th>Party</th><th>Office</th><th>District</th><th>Year</th><th>Reports</th></tr></thead>
6
+ <tbody>
7
+ <tr><td>POWERS, BILL</td><td>Republican</td><td>Senate</td><td>22</td><td>2024</td><td><a href="/tncamp/public/replist.htm?id=7459&amp;owner=POWERS, BILL">Report List</a></td></tr>
8
+ <tr><td>TODD, CHRISTOPHER</td><td>Republican</td><td>House of Representatives</td><td>73</td><td>2026</td><td><a href="/tncamp/public/replist.htm?id=7015&amp;owner=TODD, CHRISTOPHER">Report List</a></td></tr>
9
+ </tbody>
10
+ </table>
11
+ `;
12
+ const CONTRIBUTION_HTML = `
13
+ <span class="pagebanner">845 results found, displaying 1 to 50.</span>
14
+ <table id="results">
15
+ <thead><tr><th>Type</th><th>Amount</th><th>Date</th><th>Election Year</th><th>Recipient</th><th>Contributor</th><th>Address</th><th>Occupation</th><th>Employer</th></tr></thead>
16
+ <tbody>
17
+ <tr><td>Monetary</td><td>$1,500.00</td><td>07/10/2025</td><td>2026</td><td>HEMMER, CALEB</td><td>AT&amp;T TENNESSEE PAC</td><td>333 COMMERCE ST NASHVILLE TN</td><td></td><td></td></tr>
18
+ <tr><td>Monetary</td><td>$250.00</td><td>03/26/2025</td><td>2024</td><td>ROSE, JOHN</td><td>CLEM, CHRIS</td><td>4931 CHESTNUT AVE</td><td>ATTORNEY</td><td>SAMPLES PLLC</td></tr>
19
+ </tbody>
20
+ </table>
21
+ <a href="/tncamp/public/ceresults.htm?d-1341904-p=2">2</a>
22
+ <a href="/tncamp/public/ceresults.htm?d-1341904-p=17">17</a>
23
+ `;
24
+ const EXPENDITURE_HTML = `
25
+ <table id="results">
26
+ <thead><tr><th>Type</th><th>Amount</th><th>Date</th><th>Vendor</th><th>Address</th><th>Purpose</th><th>Candidate For</th></tr></thead>
27
+ <tbody>
28
+ <tr><td></td><td>$5,000.00</td><td>08/06/2024</td><td>RJD GROUP</td><td>PO BOX 210753 NASHVILLE TN</td><td>CONSULTING FEE</td><td></td></tr>
29
+ </tbody>
30
+ </table>
31
+ `;
32
+ describe('parseResultsTable — candidates', () => {
33
+ it('parses candidate rows', () => {
34
+ const results = parseResultsTable(CANDIDATE_HTML, 'candidate');
35
+ expect(results).toHaveLength(2);
36
+ expect(results[0].name).toBe('POWERS, BILL');
37
+ expect(results[0].party).toBe('Republican');
38
+ expect(results[0].officeSought).toBe('Senate');
39
+ expect(results[0].district).toBe('22');
40
+ expect(results[0].candidateId).toBe(7459);
41
+ });
42
+ it('extracts candidate ID from report link', () => {
43
+ const results = parseResultsTable(CANDIDATE_HTML, 'candidate');
44
+ expect(results[1].candidateId).toBe(7015);
45
+ });
46
+ it('returns empty for no table', () => {
47
+ expect(parseResultsTable('<html></html>', 'candidate')).toHaveLength(0);
48
+ });
49
+ });
50
+ describe('parseResultsTable — contributions', () => {
51
+ it('parses contribution rows with amounts', () => {
52
+ const results = parseResultsTable(CONTRIBUTION_HTML, 'contribution');
53
+ expect(results).toHaveLength(2);
54
+ expect(results[0].amount).toBe(1500);
55
+ expect(results[0].contributorName).toBe('AT&T TENNESSEE PAC');
56
+ expect(results[0].recipientName).toBe('HEMMER, CALEB');
57
+ });
58
+ it('parses employer and occupation', () => {
59
+ const results = parseResultsTable(CONTRIBUTION_HTML, 'contribution');
60
+ expect(results[1].contributorOccupation).toBe('ATTORNEY');
61
+ expect(results[1].contributorEmployer).toBe('SAMPLES PLLC');
62
+ });
63
+ });
64
+ describe('parseResultsTable — expenditures', () => {
65
+ it('parses expenditure rows', () => {
66
+ const results = parseResultsTable(EXPENDITURE_HTML, 'expenditure');
67
+ expect(results).toHaveLength(1);
68
+ expect(results[0].amount).toBe(5000);
69
+ expect(results[0].vendorName).toBe('RJD GROUP');
70
+ expect(results[0].purpose).toBe('CONSULTING FEE');
71
+ });
72
+ });
73
+ describe('parsePaginationInfo', () => {
74
+ it('extracts total count and page info', () => {
75
+ const info = parsePaginationInfo(CONTRIBUTION_HTML);
76
+ expect(info).not.toBeNull();
77
+ expect(info.totalItems).toBe(845);
78
+ expect(info.itemsPerPage).toBe(50);
79
+ expect(info.totalPages).toBe(17);
80
+ expect(info.paginationParam).toBe('d-1341904-p');
81
+ });
82
+ it('returns null for no pagination', () => {
83
+ expect(parsePaginationInfo(EXPENDITURE_HTML)).toBeNull();
84
+ });
85
+ });
86
+ //# sourceMappingURL=tncamp-results.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tncamp-results.test.js","sourceRoot":"","sources":["../../src/parsers/tncamp-results.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerEasyVoteTools(server: McpServer): void;
@@ -0,0 +1,382 @@
1
+ import { z } from 'zod';
2
+ import { EASYVOTE_COUNTIES, resolveCounty } from '../data/tn-counties.js';
3
+ import { getFilers, getOffices, searchContributions, searchDistributions, getElectionDocuments } from '../api/easyvote-client.js';
4
+ function resolveOrError(countyInput) {
5
+ const county = resolveCounty(countyInput);
6
+ if (!county) {
7
+ const available = EASYVOTE_COUNTIES.map(c => c.name).join(', ');
8
+ return { error: `County "${countyInput}" not found in EasyVote system. Available counties: ${available}` };
9
+ }
10
+ return county;
11
+ }
12
+ export function registerEasyVoteTools(server) {
13
+ // ============================================================
14
+ // list_easyvote_counties
15
+ // ============================================================
16
+ server.tool('list_easyvote_counties', 'List the 14 Tennessee counties with EasyVote Campaign Finance portals. Returns county name, slug, filer count, and county seat. Only these counties have searchable campaign finance data via this MCP. Counties with 0 filers (Anderson, Madison, Marion) are registered but have no candidate data yet. For state-level candidates (Governor, legislature), use the state campaign finance tools instead.', {}, async () => {
17
+ const counties = EASYVOTE_COUNTIES.map(c => ({
18
+ name: c.name,
19
+ slug: c.slug,
20
+ countySeat: c.countySeat,
21
+ filerCount: c.filerCount,
22
+ hasData: c.filerCount > 0,
23
+ portalUrl: `https://${c.slug}.easyvotecampaignfinance.com`,
24
+ }));
25
+ return {
26
+ content: [{
27
+ type: 'text',
28
+ text: `${counties.length} Tennessee counties with EasyVote Campaign Finance portals:\n\n${JSON.stringify(counties, null, 2)}`,
29
+ }],
30
+ };
31
+ });
32
+ // ============================================================
33
+ // search_county_filers
34
+ // ============================================================
35
+ server.tool('search_county_filers', 'Search candidates and PACs filed in a Tennessee county via EasyVote. Returns filer name, office, type, status, and filed documents. Use list_easyvote_counties to see which counties are available. The county parameter accepts a name ("Knox"), slug ("knoxcountytn"), county seat ("Knoxville"), or partial match ("david" for Davidson). Name and office filters are applied client-side after fetching all filers.', {
36
+ county: z.string().describe('County name, slug, county seat, or partial match'),
37
+ name: z.string().optional().describe('Filter by filer name (case-insensitive partial match)'),
38
+ office: z.string().optional().describe('Filter by office name (case-insensitive partial match)'),
39
+ limit: z.number().optional().describe('Max results to return (default 50, 0 for all)'),
40
+ }, async ({ county: countyInput, name, office, limit }) => {
41
+ try {
42
+ const resolved = resolveOrError(countyInput);
43
+ if ('error' in resolved) {
44
+ return { content: [{ type: 'text', text: resolved.error }] };
45
+ }
46
+ const allFilers = await getFilers(resolved);
47
+ let filtered = allFilers;
48
+ if (name) {
49
+ const lower = name.toLowerCase();
50
+ filtered = filtered.filter(f => f.displayname?.toLowerCase().includes(lower) ||
51
+ f.firstname?.toLowerCase().includes(lower) ||
52
+ f.lastname?.toLowerCase().includes(lower) ||
53
+ f.committeename?.toLowerCase().includes(lower));
54
+ }
55
+ if (office) {
56
+ const lower = office.toLowerCase();
57
+ filtered = filtered.filter(f => f.officename?.toLowerCase().includes(lower));
58
+ }
59
+ if (filtered.length === 0) {
60
+ const hint = name || office
61
+ ? `No filers matched your filters in ${resolved.name} County. Try broader terms or omit filters.`
62
+ : `No filers found in ${resolved.name} County. This county may not have data yet.`;
63
+ return { content: [{ type: 'text', text: hint }] };
64
+ }
65
+ const effectiveLimit = limit === undefined ? 50 : limit;
66
+ const totalCount = filtered.length;
67
+ const limited = effectiveLimit > 0 ? filtered.slice(0, effectiveLimit) : filtered;
68
+ const limitNote = effectiveLimit > 0 && totalCount > effectiveLimit
69
+ ? `Showing ${limited.length} of ${totalCount} filers. Use limit=0 for all.\n\n`
70
+ : '';
71
+ return {
72
+ content: [{
73
+ type: 'text',
74
+ text: `${limitNote}${resolved.name} County — ${totalCount} filer(s):\n\n${JSON.stringify(limited, null, 2)}`,
75
+ }],
76
+ };
77
+ }
78
+ catch (error) {
79
+ return {
80
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
81
+ isError: true,
82
+ };
83
+ }
84
+ });
85
+ // ============================================================
86
+ // list_county_offices
87
+ // ============================================================
88
+ server.tool('list_county_offices', 'List elected offices available in a Tennessee county via EasyVote. Returns office names and IDs. Useful for understanding what positions are contested in a county before searching for filers or contributions.', {
89
+ county: z.string().describe('County name, slug, county seat, or partial match'),
90
+ }, async ({ county: countyInput }) => {
91
+ try {
92
+ const resolved = resolveOrError(countyInput);
93
+ if ('error' in resolved) {
94
+ return { content: [{ type: 'text', text: resolved.error }] };
95
+ }
96
+ const offices = await getOffices(resolved);
97
+ if (offices.length === 0) {
98
+ return {
99
+ content: [{ type: 'text', text: `No offices found for ${resolved.name} County.` }],
100
+ };
101
+ }
102
+ return {
103
+ content: [{
104
+ type: 'text',
105
+ text: `${resolved.name} County — ${offices.length} office(s):\n\n${JSON.stringify(offices, null, 2)}`,
106
+ }],
107
+ };
108
+ }
109
+ catch (error) {
110
+ return {
111
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
112
+ isError: true,
113
+ };
114
+ }
115
+ });
116
+ // ============================================================
117
+ // search_county_contributions
118
+ // ============================================================
119
+ server.tool('search_county_contributions', 'Search campaign contributions filed in a Tennessee county via EasyVote. Filters by donor and/or recipient name (client-side — the API returns all contributions, so the first call for a county may take a few seconds while the full dataset downloads, then is cached for 10 min). Returns itemized records including amount, date, donor address, and recipient office. For expenditures/vendor payments, use search_county_expenditures. Only 14 TN counties have EasyVote portals; use list_easyvote_counties to check.', {
120
+ county: z.string().describe('County name, slug, county seat, or partial match'),
121
+ donor_last_name: z.string().optional().describe('Donor last name to search'),
122
+ donor_first_name: z.string().optional().describe('Donor first name to narrow results'),
123
+ recipient_last_name: z.string().optional().describe('Recipient/candidate last name'),
124
+ recipient_first_name: z.string().optional().describe('Recipient/candidate first name'),
125
+ limit: z.number().optional().describe('Max results to return (default 200, 0 for all). Common names can return 4000+ results.'),
126
+ }, async ({ county: countyInput, donor_last_name, donor_first_name, recipient_last_name, recipient_first_name, limit }) => {
127
+ try {
128
+ const resolved = resolveOrError(countyInput);
129
+ if ('error' in resolved) {
130
+ return { content: [{ type: 'text', text: resolved.error }] };
131
+ }
132
+ if (!donor_last_name && !donor_first_name && !recipient_last_name && !recipient_first_name) {
133
+ return {
134
+ content: [{ type: 'text', text: 'At least one search parameter (donor or recipient name) is required.' }],
135
+ };
136
+ }
137
+ const results = await searchContributions(resolved, {
138
+ donorLastName: donor_last_name,
139
+ donorFirstName: donor_first_name,
140
+ recipientLastName: recipient_last_name,
141
+ recipientFirstName: recipient_first_name,
142
+ });
143
+ if (results.length === 0) {
144
+ return {
145
+ content: [{ type: 'text', text: `No contributions found in ${resolved.name} County matching your search.` }],
146
+ };
147
+ }
148
+ const effectiveLimit = limit === undefined ? 200 : limit;
149
+ const totalCount = results.length;
150
+ const limited = effectiveLimit > 0 ? results.slice(0, effectiveLimit) : results;
151
+ // Calculate summary stats
152
+ const totalAmount = results.reduce((sum, c) => sum + (c.ContributionAmount || 0), 0);
153
+ const shownAmount = limited.reduce((sum, c) => sum + (c.ContributionAmount || 0), 0);
154
+ const limitNote = effectiveLimit > 0 && totalCount > effectiveLimit
155
+ ? `Showing ${limited.length} of ${totalCount} contributions ($${shownAmount.toLocaleString()} of $${totalAmount.toLocaleString()} total). Increase limit for more.\n\n`
156
+ : `${totalCount} contribution(s) totaling $${totalAmount.toLocaleString()}:\n\n`;
157
+ return {
158
+ content: [{
159
+ type: 'text',
160
+ text: `${resolved.name} County — ${limitNote}${JSON.stringify(limited, null, 2)}`,
161
+ }],
162
+ };
163
+ }
164
+ catch (error) {
165
+ return {
166
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
167
+ isError: true,
168
+ };
169
+ }
170
+ });
171
+ // ============================================================
172
+ // search_county_expenditures
173
+ // ============================================================
174
+ server.tool('search_county_expenditures', 'Search campaign expenditures/distributions filed in a Tennessee county via EasyVote. Filters by vendor/payee name and/or candidate name. Returns itemized records including amount, vendor address, and office. The API endpoint is "distributions" (not expenditures). First call for a county downloads the full dataset (cached 10 min). Only 14 TN counties have EasyVote portals; use list_easyvote_counties to check.', {
175
+ county: z.string().describe('County name, slug, county seat, or partial match'),
176
+ payee_last_name: z.string().optional().describe('Vendor/payee name to search'),
177
+ payee_first_name: z.string().optional().describe('Vendor/payee first name'),
178
+ candidate_last_name: z.string().optional().describe('Candidate last name or committee name'),
179
+ candidate_first_name: z.string().optional().describe('Candidate first name'),
180
+ limit: z.number().optional().describe('Max results (default 200, 0 for all)'),
181
+ }, async ({ county: countyInput, payee_last_name, payee_first_name, candidate_last_name, candidate_first_name, limit }) => {
182
+ try {
183
+ const resolved = resolveOrError(countyInput);
184
+ if ('error' in resolved) {
185
+ return { content: [{ type: 'text', text: resolved.error }] };
186
+ }
187
+ if (!payee_last_name && !payee_first_name && !candidate_last_name && !candidate_first_name) {
188
+ return {
189
+ content: [{ type: 'text', text: 'At least one search parameter (payee or candidate name) is required.' }],
190
+ };
191
+ }
192
+ const results = await searchDistributions(resolved, {
193
+ payeeLastName: payee_last_name,
194
+ payeeFirstName: payee_first_name,
195
+ candidateLastName: candidate_last_name,
196
+ candidateFirstName: candidate_first_name,
197
+ });
198
+ if (results.length === 0) {
199
+ return {
200
+ content: [{ type: 'text', text: `No expenditures found in ${resolved.name} County matching your search.` }],
201
+ };
202
+ }
203
+ const effectiveLimit = limit === undefined ? 200 : limit;
204
+ const totalCount = results.length;
205
+ const limited = effectiveLimit > 0 ? results.slice(0, effectiveLimit) : results;
206
+ const totalAmount = results.reduce((sum, d) => sum + (d.DistributionAmount || 0), 0);
207
+ const shownAmount = limited.reduce((sum, d) => sum + (d.DistributionAmount || 0), 0);
208
+ const limitNote = effectiveLimit > 0 && totalCount > effectiveLimit
209
+ ? `Showing ${limited.length} of ${totalCount} expenditures ($${shownAmount.toLocaleString()} of $${totalAmount.toLocaleString()} total). Increase limit for more.\n\n`
210
+ : `${totalCount} expenditure(s) totaling $${totalAmount.toLocaleString()}:\n\n`;
211
+ return {
212
+ content: [{
213
+ type: 'text',
214
+ text: `${resolved.name} County — ${limitNote}${JSON.stringify(limited, null, 2)}`,
215
+ }],
216
+ };
217
+ }
218
+ catch (error) {
219
+ return {
220
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
221
+ isError: true,
222
+ };
223
+ }
224
+ });
225
+ // ============================================================
226
+ // get_county_election_documents
227
+ // ============================================================
228
+ server.tool('get_county_election_documents', 'Get election-related documents for a Tennessee county via EasyVote. Returns document listings if the county has published any. Many counties have no election documents in EasyVote yet.', {
229
+ county: z.string().describe('County name, slug, county seat, or partial match'),
230
+ }, async ({ county: countyInput }) => {
231
+ try {
232
+ const resolved = resolveOrError(countyInput);
233
+ if ('error' in resolved) {
234
+ return { content: [{ type: 'text', text: resolved.error }] };
235
+ }
236
+ const docs = await getElectionDocuments(resolved);
237
+ if (docs.length === 0) {
238
+ return {
239
+ content: [{ type: 'text', text: `No election documents found for ${resolved.name} County.` }],
240
+ };
241
+ }
242
+ return {
243
+ content: [{
244
+ type: 'text',
245
+ text: `${resolved.name} County — ${docs.length} election document(s):\n\n${JSON.stringify(docs, null, 2)}`,
246
+ }],
247
+ };
248
+ }
249
+ catch (error) {
250
+ return {
251
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
252
+ isError: true,
253
+ };
254
+ }
255
+ });
256
+ // ============================================================
257
+ // search_all_counties_contributions
258
+ // ============================================================
259
+ server.tool('search_all_counties_contributions', 'Search for a donor across ALL 14 Tennessee EasyVote counties at once. Downloads and caches the full contribution dataset for each county (first call may be slow for large counties), then filters client-side. Batches 4 concurrent requests. Skips counties with 0 known filers. Returns results grouped by county. Useful for "who is this person giving to at the local level across Tennessee?"', {
260
+ donor_last_name: z.string().describe('Donor last name (required)'),
261
+ donor_first_name: z.string().optional().describe('Donor first name (strongly recommended for common names)'),
262
+ limit: z.number().optional().describe('Max results per county (default 50). Use 0 for all.'),
263
+ }, async ({ donor_last_name, donor_first_name, limit }) => {
264
+ try {
265
+ const effectiveLimit = limit === undefined ? 50 : limit;
266
+ const BATCH_SIZE = 4;
267
+ const activeCounties = EASYVOTE_COUNTIES.filter(c => c.filerCount > 0);
268
+ const countyResults = [];
269
+ // Process in batches
270
+ for (let i = 0; i < activeCounties.length; i += BATCH_SIZE) {
271
+ const batch = activeCounties.slice(i, i + BATCH_SIZE);
272
+ const results = await Promise.allSettled(batch.map(async (county) => {
273
+ const contributions = await searchContributions(county, {
274
+ donorLastName: donor_last_name,
275
+ donorFirstName: donor_first_name,
276
+ });
277
+ return { county, contributions };
278
+ }));
279
+ for (const result of results) {
280
+ if (result.status === 'fulfilled' && result.value.contributions.length > 0) {
281
+ const { county, contributions } = result.value;
282
+ const totalAmount = contributions.reduce((sum, c) => sum + (c.ContributionAmount || 0), 0);
283
+ const shown = effectiveLimit > 0 ? contributions.slice(0, effectiveLimit) : contributions;
284
+ countyResults.push({
285
+ county: county.name,
286
+ totalFound: contributions.length,
287
+ shown: shown.length,
288
+ totalAmount,
289
+ contributions: shown,
290
+ });
291
+ }
292
+ }
293
+ }
294
+ if (countyResults.length === 0) {
295
+ return {
296
+ content: [{
297
+ type: 'text',
298
+ text: `No contributions found for donor "${donor_first_name ? donor_first_name + ' ' : ''}${donor_last_name}" across ${activeCounties.length} Tennessee counties.`,
299
+ }],
300
+ };
301
+ }
302
+ const grandTotal = countyResults.reduce((sum, r) => sum + r.totalAmount, 0);
303
+ const grandCount = countyResults.reduce((sum, r) => sum + r.totalFound, 0);
304
+ const header = `Found ${grandCount} contribution(s) totaling $${grandTotal.toLocaleString()} across ${countyResults.length} counties:\n\n`;
305
+ return {
306
+ content: [{
307
+ type: 'text',
308
+ text: header + JSON.stringify(countyResults, null, 2),
309
+ }],
310
+ };
311
+ }
312
+ catch (error) {
313
+ return {
314
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
315
+ isError: true,
316
+ };
317
+ }
318
+ });
319
+ // ============================================================
320
+ // search_all_counties_expenditures
321
+ // ============================================================
322
+ server.tool('search_all_counties_expenditures', 'Search for a vendor/payee across ALL 14 Tennessee EasyVote counties at once. Downloads and caches the full expenditure dataset for each county, then filters client-side. Batches 4 concurrent requests. Skips counties with 0 known filers. Returns results grouped by county. Useful for finding which candidates across Tennessee paid a specific vendor.', {
323
+ payee_last_name: z.string().describe('Vendor/payee name (required)'),
324
+ payee_first_name: z.string().optional().describe('Vendor first name'),
325
+ limit: z.number().optional().describe('Max results per county (default 50). Use 0 for all.'),
326
+ }, async ({ payee_last_name, payee_first_name, limit }) => {
327
+ try {
328
+ const effectiveLimit = limit === undefined ? 50 : limit;
329
+ const BATCH_SIZE = 4;
330
+ const activeCounties = EASYVOTE_COUNTIES.filter(c => c.filerCount > 0);
331
+ const countyResults = [];
332
+ for (let i = 0; i < activeCounties.length; i += BATCH_SIZE) {
333
+ const batch = activeCounties.slice(i, i + BATCH_SIZE);
334
+ const results = await Promise.allSettled(batch.map(async (county) => {
335
+ const expenditures = await searchDistributions(county, {
336
+ payeeLastName: payee_last_name,
337
+ payeeFirstName: payee_first_name,
338
+ });
339
+ return { county, expenditures };
340
+ }));
341
+ for (const result of results) {
342
+ if (result.status === 'fulfilled' && result.value.expenditures.length > 0) {
343
+ const { county, expenditures } = result.value;
344
+ const totalAmount = expenditures.reduce((sum, d) => sum + (d.DistributionAmount || 0), 0);
345
+ const shown = effectiveLimit > 0 ? expenditures.slice(0, effectiveLimit) : expenditures;
346
+ countyResults.push({
347
+ county: county.name,
348
+ totalFound: expenditures.length,
349
+ shown: shown.length,
350
+ totalAmount,
351
+ expenditures: shown,
352
+ });
353
+ }
354
+ }
355
+ }
356
+ if (countyResults.length === 0) {
357
+ return {
358
+ content: [{
359
+ type: 'text',
360
+ text: `No expenditures found for payee "${payee_first_name ? payee_first_name + ' ' : ''}${payee_last_name}" across ${activeCounties.length} Tennessee counties.`,
361
+ }],
362
+ };
363
+ }
364
+ const grandTotal = countyResults.reduce((sum, r) => sum + r.totalAmount, 0);
365
+ const grandCount = countyResults.reduce((sum, r) => sum + r.totalFound, 0);
366
+ const header = `Found ${grandCount} expenditure(s) totaling $${grandTotal.toLocaleString()} across ${countyResults.length} counties:\n\n`;
367
+ return {
368
+ content: [{
369
+ type: 'text',
370
+ text: header + JSON.stringify(countyResults, null, 2),
371
+ }],
372
+ };
373
+ }
374
+ catch (error) {
375
+ return {
376
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
377
+ isError: true,
378
+ };
379
+ }
380
+ });
381
+ }
382
+ //# sourceMappingURL=easyvote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"easyvote.js","sourceRoot":"","sources":["../../src/tools/easyvote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerSosTools(server: McpServer): void;