@cyanheads/congressgov-mcp-server 0.4.3 → 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/AGENTS.md +19 -5
- package/CLAUDE.md +19 -5
- package/README.md +3 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/prompts/definitions/legislative-research.prompt.d.ts +9 -0
- package/dist/mcp-server/prompts/definitions/legislative-research.prompt.d.ts.map +1 -1
- package/dist/mcp-server/prompts/definitions/legislative-research.prompt.js +46 -15
- package/dist/mcp-server/prompts/definitions/legislative-research.prompt.js.map +1 -1
- package/dist/mcp-server/tools/definitions/bill-lookup.tool.d.ts +38 -0
- package/dist/mcp-server/tools/definitions/bill-lookup.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/bill-lookup.tool.js +72 -4
- package/dist/mcp-server/tools/definitions/bill-lookup.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/committee-reports.tool.d.ts +37 -0
- package/dist/mcp-server/tools/definitions/committee-reports.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/committee-reports.tool.js +66 -7
- package/dist/mcp-server/tools/definitions/committee-reports.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/daily-record.tool.d.ts +41 -3
- package/dist/mcp-server/tools/definitions/daily-record.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/daily-record.tool.js +61 -8
- package/dist/mcp-server/tools/definitions/daily-record.tool.js.map +1 -1
- package/dist/mcp-server/tools/format-helpers.d.ts +9 -5
- package/dist/mcp-server/tools/format-helpers.d.ts.map +1 -1
- package/dist/mcp-server/tools/format-helpers.js +397 -89
- package/dist/mcp-server/tools/format-helpers.js.map +1 -1
- package/dist/mcp-server/tools/tool-helpers.d.ts +67 -0
- package/dist/mcp-server/tools/tool-helpers.d.ts.map +1 -1
- package/dist/mcp-server/tools/tool-helpers.js +85 -0
- package/dist/mcp-server/tools/tool-helpers.js.map +1 -1
- package/dist/services/congress-documents/congress-documents-service.d.ts +71 -0
- package/dist/services/congress-documents/congress-documents-service.d.ts.map +1 -0
- package/dist/services/congress-documents/congress-documents-service.js +271 -0
- package/dist/services/congress-documents/congress-documents-service.js.map +1 -0
- package/dist/services/congress-documents/document-formats.d.ts +29 -0
- package/dist/services/congress-documents/document-formats.d.ts.map +1 -0
- package/dist/services/congress-documents/document-formats.js +51 -0
- package/dist/services/congress-documents/document-formats.js.map +1 -0
- package/dist/services/congress-documents/extract-text.d.ts +21 -0
- package/dist/services/congress-documents/extract-text.d.ts.map +1 -0
- package/dist/services/congress-documents/extract-text.js +81 -0
- package/dist/services/congress-documents/extract-text.js.map +1 -0
- package/dist/services/congress-documents/types.d.ts +45 -0
- package/dist/services/congress-documents/types.d.ts.map +1 -0
- package/dist/services/congress-documents/types.js +6 -0
- package/dist/services/congress-documents/types.js.map +1 -0
- package/package.json +1 -1
- package/server.json +3 -3
|
@@ -5,29 +5,45 @@
|
|
|
5
5
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
import { validationError } from '@cyanheads/mcp-ts-core/errors';
|
|
7
7
|
import { formatCommitteeReports } from '../../../mcp-server/tools/format-helpers.js';
|
|
8
|
-
import { buildEffectiveQuery, congressErrorContracts, listEnrichment, listOrDetail, notifyIfNoMatches, } from '../../../mcp-server/tools/tool-helpers.js';
|
|
8
|
+
import { buildEffectiveQuery, congressErrorContracts, documentErrorContracts, documentWindowInput, listEnrichment, listOrDetail, notifyIfNoMatches, } from '../../../mcp-server/tools/tool-helpers.js';
|
|
9
9
|
import { getCongressApi } from '../../../services/congress-api/congress-api-service.js';
|
|
10
|
+
import { getCongressDocuments } from '../../../services/congress-documents/congress-documents-service.js';
|
|
11
|
+
import { describeFormat, selectDocumentUrl, } from '../../../services/congress-documents/document-formats.js';
|
|
12
|
+
/**
|
|
13
|
+
* Committee report text arrives as `[{formats:[…]}, …]` — one format per entry,
|
|
14
|
+
* unlike bill text versions, which carry every format on a single row. Flatten so
|
|
15
|
+
* the format selector sees them all.
|
|
16
|
+
*/
|
|
17
|
+
function collectReportFormats(text) {
|
|
18
|
+
if (!Array.isArray(text))
|
|
19
|
+
return [];
|
|
20
|
+
return text.flatMap((entry) => {
|
|
21
|
+
const formats = entry?.formats;
|
|
22
|
+
return Array.isArray(formats) ? formats : [];
|
|
23
|
+
});
|
|
24
|
+
}
|
|
10
25
|
export const committeeReportsTool = tool('congressgov_committee_reports', {
|
|
11
|
-
description: `Browse and retrieve committee reports from Congress.gov — reports accompany legislation reported out of committee and explain the bill's purpose, committee amendments, dissenting views, and the committee vote. Report types are 'hrpt' (House), 'srpt' (Senate), and 'erpt' (Executive).`,
|
|
26
|
+
description: `Browse and retrieve committee reports from Congress.gov — reports accompany legislation reported out of committee and explain the bill's purpose, committee amendments, dissenting views, and the committee vote. Report types are 'hrpt' (House), 'srpt' (Senate), and 'erpt' (Executive). 'text' lists the published format URLs; 'content' then reads the report's actual text, a bounded character window at a time.`,
|
|
12
27
|
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
13
|
-
errors: congressErrorContracts,
|
|
28
|
+
errors: [...congressErrorContracts, ...documentErrorContracts],
|
|
14
29
|
input: z.object({
|
|
15
|
-
operation: z.enum(['list', 'get', 'text']).describe('Which data to retrieve.'),
|
|
30
|
+
operation: z.enum(['list', 'get', 'text', 'content']).describe('Which data to retrieve.'),
|
|
16
31
|
congress: z.number().int().positive().describe('Congress number.'),
|
|
17
32
|
reportType: z
|
|
18
33
|
.enum(['hrpt', 'srpt', 'erpt'])
|
|
19
34
|
.optional()
|
|
20
|
-
.describe('Report type. Required for get and
|
|
35
|
+
.describe('Report type. Required for get, text, and content operations.'),
|
|
21
36
|
reportNumber: z
|
|
22
37
|
.number()
|
|
23
38
|
.int()
|
|
24
39
|
.positive()
|
|
25
40
|
.optional()
|
|
26
|
-
.describe('Committee report number. Required for get and
|
|
41
|
+
.describe('Committee report number. Required for get, text, and content operations.'),
|
|
27
42
|
limit: z.number().int().min(1).max(250).default(20).describe('Results per page (1-250).'),
|
|
28
43
|
offset: z.number().int().min(0).default(0).describe('Pagination offset.'),
|
|
44
|
+
...documentWindowInput,
|
|
29
45
|
}),
|
|
30
|
-
output: listOrDetail('report', "the committee report (citation, title, committees, associated bill); for `text`, an alternative key 'text' carries an array of {type, url} format links."),
|
|
46
|
+
output: listOrDetail('report', "the committee report (citation, title, committees, associated bill); for `text`, an alternative key 'text' carries an array of {type, url} format links; for `content`, an alternative key 'content' carries {text, format, sourceUrl, documentTitle, totalCharacters, offset, truncated, nextOffset} — one exact character window of the report."),
|
|
31
47
|
enrichment: listEnrichment,
|
|
32
48
|
format: formatCommitteeReports,
|
|
33
49
|
async handler(input, ctx) {
|
|
@@ -58,6 +74,49 @@ export const committeeReportsTool = tool('congressgov_committee_reports', {
|
|
|
58
74
|
reportNumber: input.reportNumber,
|
|
59
75
|
});
|
|
60
76
|
}
|
|
77
|
+
if (input.operation === 'content') {
|
|
78
|
+
const citation = `${input.reportType.toUpperCase()} ${input.congress}-${input.reportNumber}`;
|
|
79
|
+
const result = await api.getCommitteeReportText({
|
|
80
|
+
congress: input.congress,
|
|
81
|
+
reportType: input.reportType,
|
|
82
|
+
reportNumber: input.reportNumber,
|
|
83
|
+
}, ctx);
|
|
84
|
+
const formats = collectReportFormats(result.text);
|
|
85
|
+
if (formats.length === 0) {
|
|
86
|
+
throw ctx.fail('document_unavailable', `Committee report ${citation} publishes no document formats.`, {
|
|
87
|
+
...ctx.recoveryFor('document_unavailable'),
|
|
88
|
+
congress: input.congress,
|
|
89
|
+
reportType: input.reportType,
|
|
90
|
+
reportNumber: input.reportNumber,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
const url = selectDocumentUrl(formats, input.format);
|
|
94
|
+
if (!url) {
|
|
95
|
+
throw ctx.fail('format_unavailable', `Committee report ${citation} publishes no '${input.format}' document (looked for ${describeFormat(input.format)}).`, { ...ctx.recoveryFor('format_unavailable'), format: input.format });
|
|
96
|
+
}
|
|
97
|
+
const document = await getCongressDocuments().fetchDocument({
|
|
98
|
+
url,
|
|
99
|
+
characterOffset: input.characterOffset,
|
|
100
|
+
characterLimit: input.characterLimit,
|
|
101
|
+
}, ctx);
|
|
102
|
+
ctx.log.info('Committee report content retrieved', {
|
|
103
|
+
congress: input.congress,
|
|
104
|
+
reportType: input.reportType,
|
|
105
|
+
reportNumber: input.reportNumber,
|
|
106
|
+
format: input.format,
|
|
107
|
+
totalCharacters: document.totalCharacters,
|
|
108
|
+
});
|
|
109
|
+
ctx.enrich.echo(`${citation}, ${input.format} characters ${document.offset}–${document.offset + document.text.length}`);
|
|
110
|
+
ctx.enrich.total(document.totalCharacters);
|
|
111
|
+
return {
|
|
112
|
+
content: {
|
|
113
|
+
...document,
|
|
114
|
+
format: input.format,
|
|
115
|
+
sourceUrl: url,
|
|
116
|
+
documentTitle: `Committee Report ${citation}`,
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
61
120
|
if (input.operation === 'text') {
|
|
62
121
|
const result = await api.getCommitteeReportText({
|
|
63
122
|
congress: input.congress,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"committee-reports.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/committee-reports.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,EACd,YAAY,EACZ,iBAAiB,GAClB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,iDAAiD,CAAC;
|
|
1
|
+
{"version":3,"file":"committee-reports.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/committee-reports.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,15 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
export declare const dailyRecordTool: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
7
|
+
format: z.ZodDefault<z.ZodEnum<{
|
|
8
|
+
text: "text";
|
|
9
|
+
xml: "xml";
|
|
10
|
+
}>>;
|
|
11
|
+
characterOffset: z.ZodDefault<z.ZodNumber>;
|
|
12
|
+
characterLimit: z.ZodDefault<z.ZodNumber>;
|
|
7
13
|
operation: z.ZodEnum<{
|
|
8
14
|
articles: "articles";
|
|
15
|
+
content: "content";
|
|
9
16
|
issues: "issues";
|
|
10
17
|
list: "list";
|
|
11
18
|
}>;
|
|
@@ -13,12 +20,13 @@ export declare const dailyRecordTool: import("@cyanheads/mcp-ts-core").ToolDefin
|
|
|
13
20
|
issueNumber: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>;
|
|
14
21
|
limit: z.ZodDefault<z.ZodNumber>;
|
|
15
22
|
offset: z.ZodDefault<z.ZodNumber>;
|
|
23
|
+
articleIndex: z.ZodDefault<z.ZodNumber>;
|
|
16
24
|
}, z.core.$strip>, z.ZodObject<{
|
|
17
|
-
data: z.ZodArray<z.ZodObject<{}, z.core.$loose
|
|
18
|
-
pagination: z.ZodObject<{
|
|
25
|
+
data: z.ZodOptional<z.ZodArray<z.ZodObject<{}, z.core.$loose>>>;
|
|
26
|
+
pagination: z.ZodOptional<z.ZodObject<{
|
|
19
27
|
count: z.ZodNumber;
|
|
20
28
|
nextOffset: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
21
|
-
}, z.core.$strip
|
|
29
|
+
}, z.core.$strip>>;
|
|
22
30
|
}, z.core.$loose>, readonly [{
|
|
23
31
|
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
24
32
|
readonly reason: 'not_found';
|
|
@@ -43,6 +51,36 @@ export declare const dailyRecordTool: import("@cyanheads/mcp-ts-core").ToolDefin
|
|
|
43
51
|
readonly retryable: true;
|
|
44
52
|
readonly when: 'Congress.gov returned an unexpected error (5xx or another non-2xx status).';
|
|
45
53
|
readonly recovery: 'Retry after a short delay; if the failure persists the Congress.gov service may be temporarily degraded.';
|
|
54
|
+
}, {
|
|
55
|
+
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
56
|
+
readonly reason: 'document_unavailable';
|
|
57
|
+
readonly retryable: false;
|
|
58
|
+
readonly when: "The 'content' selection resolves to no retrievable document — the text version or article index is past the end of the list, the record publishes no formats at all, or Congress.gov does not hold the file its own metadata names.";
|
|
59
|
+
readonly recovery: "Run the tool's 'text' or 'articles' operation first to see which documents Congress.gov publishes for this record, then retry with a selection it lists.";
|
|
60
|
+
}, {
|
|
61
|
+
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
|
|
62
|
+
readonly reason: 'format_unavailable';
|
|
63
|
+
readonly retryable: false;
|
|
64
|
+
readonly when: "The document exists but publishes nothing in the requested 'format' — some text versions and committee reports ship PDF only, and no Congressional Record article publishes XML.";
|
|
65
|
+
readonly recovery: "Retry with format 'text', which every document checked publishes; if that fails too the document is PDF-only, so read it at the format URL the text operation returns.";
|
|
66
|
+
}, {
|
|
67
|
+
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
|
|
68
|
+
readonly reason: 'document_fetch_failed';
|
|
69
|
+
readonly retryable: true;
|
|
70
|
+
readonly when: 'www.congress.gov did not return a readable document — a non-2xx status, a network failure, an empty body, or a content type that is not text or XML.';
|
|
71
|
+
readonly recovery: 'Retry after a short delay; if the failure persists, request a different format or read the document at the sourceUrl the text operation returns.';
|
|
72
|
+
}, {
|
|
73
|
+
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.InvalidParams;
|
|
74
|
+
readonly reason: 'document_too_large';
|
|
75
|
+
readonly retryable: false;
|
|
76
|
+
readonly when: 'The document is larger than the byte ceiling this server retrieves, so no character window can be served from it.';
|
|
77
|
+
readonly recovery: "Request the other 'format' for this document, which is usually far smaller, or read it directly at the sourceUrl the text operation returns.";
|
|
78
|
+
}, {
|
|
79
|
+
readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.InvalidParams;
|
|
80
|
+
readonly reason: 'offset_past_end';
|
|
81
|
+
readonly retryable: false;
|
|
82
|
+
readonly when: 'characterOffset is at or beyond the last character of the document, so the window would be empty.';
|
|
83
|
+
readonly recovery: 'Restart the walk at characterOffset 0 and follow nextOffset, which goes null once the document has been read to the end.';
|
|
46
84
|
}], {
|
|
47
85
|
effectiveQuery: z.ZodString;
|
|
48
86
|
totalCount: z.ZodNumber;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daily-record.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/daily-record.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"daily-record.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/daily-record.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAqBjD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiK1B,CAAC"}
|
|
@@ -5,20 +5,31 @@
|
|
|
5
5
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
import { validationError } from '@cyanheads/mcp-ts-core/errors';
|
|
7
7
|
import { formatDailyRecord } from '../../../mcp-server/tools/format-helpers.js';
|
|
8
|
-
import { congressErrorContracts, listEnrichment,
|
|
8
|
+
import { congressErrorContracts, documentErrorContracts, documentWindowInput, listEnrichment, listOrDetail, notifyIfNoMatches, numericIdentifier, toIdentifierNumber, } from '../../../mcp-server/tools/tool-helpers.js';
|
|
9
9
|
import { getCongressApi } from '../../../services/congress-api/congress-api-service.js';
|
|
10
|
+
import { getCongressDocuments } from '../../../services/congress-documents/congress-documents-service.js';
|
|
11
|
+
import { describeFormat, selectDocumentUrl, } from '../../../services/congress-documents/document-formats.js';
|
|
10
12
|
export const dailyRecordTool = tool('congressgov_daily_record', {
|
|
11
|
-
description: `Browse the daily Congressional Record — floor speeches, debates, and legislative text published each day Congress is in session. Navigation is hierarchical: volumes (via 'list') → issues (via 'issues') → articles (via 'articles'). Use 'list' to find recent volumes, 'issues' to see what's in a volume, and 'articles' to access individual speeches and debate sections.`,
|
|
13
|
+
description: `Browse the daily Congressional Record — floor speeches, debates, and legislative text published each day Congress is in session. Navigation is hierarchical: volumes (via 'list') → issues (via 'issues') → articles (via 'articles'). Use 'list' to find recent volumes, 'issues' to see what's in a volume, and 'articles' to access individual speeches and debate sections. 'articles' lists each article and its format URLs; 'content' then reads one article's actual text, a bounded character window at a time.`,
|
|
12
14
|
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
13
|
-
errors: congressErrorContracts,
|
|
15
|
+
errors: [...congressErrorContracts, ...documentErrorContracts],
|
|
14
16
|
input: z.object({
|
|
15
|
-
operation: z
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
operation: z
|
|
18
|
+
.enum(['list', 'issues', 'articles', 'content'])
|
|
19
|
+
.describe('Which data to retrieve.'),
|
|
20
|
+
volumeNumber: numericIdentifier("Volume number. Required for 'issues', 'articles', and 'content'. Accepts a number or the digit-string form list rows carry.").optional(),
|
|
21
|
+
issueNumber: numericIdentifier("Issue number within a volume. Required for 'articles' and 'content'. List rows carry this as a string (e.g. \"109\") — both forms are accepted.").optional(),
|
|
18
22
|
limit: z.number().int().min(1).max(250).default(20).describe('Results per page (1-250).'),
|
|
19
23
|
offset: z.number().int().min(0).default(0).describe('Pagination offset.'),
|
|
24
|
+
articleIndex: z
|
|
25
|
+
.number()
|
|
26
|
+
.int()
|
|
27
|
+
.min(0)
|
|
28
|
+
.default(0)
|
|
29
|
+
.describe("Which article 'content' reads, 0-based against the issue's whole article sequence — the same absolute position 'articles' pages through with offset. Ignored by other operations."),
|
|
30
|
+
...documentWindowInput,
|
|
20
31
|
}),
|
|
21
|
-
output:
|
|
32
|
+
output: listOrDetail('content', '{text, format, sourceUrl, documentTitle, totalCharacters, offset, truncated, nextOffset} for `content` — one exact character window of an article; absent for `list`, `issues`, and `articles`, which carry `data` + `pagination`.'),
|
|
22
33
|
enrichment: listEnrichment,
|
|
23
34
|
format: formatDailyRecord,
|
|
24
35
|
async handler(input, ctx) {
|
|
@@ -49,9 +60,51 @@ export const dailyRecordTool = tool('congressgov_daily_record', {
|
|
|
49
60
|
return result;
|
|
50
61
|
}
|
|
51
62
|
if (!input.issueNumber) {
|
|
52
|
-
throw validationError(
|
|
63
|
+
throw validationError(`The '${input.operation}' operation requires both volumeNumber and issueNumber. Use 'issues' to see available issues within a volume.`, { field: 'issueNumber' });
|
|
53
64
|
}
|
|
54
65
|
const issueNumber = toIdentifierNumber(input.issueNumber);
|
|
66
|
+
if (input.operation === 'content') {
|
|
67
|
+
/** One upstream page of exactly the selected article — not the whole issue. */
|
|
68
|
+
const articles = await api.getDailyArticles({ volumeNumber, issueNumber, limit: 1, offset: input.articleIndex }, ctx);
|
|
69
|
+
const article = articles.data[0];
|
|
70
|
+
if (!article) {
|
|
71
|
+
throw ctx.fail('document_unavailable', `No article at index ${input.articleIndex} in volume ${volumeNumber}, issue ${issueNumber} — the issue holds ${articles.pagination.count} article(s).`, {
|
|
72
|
+
...ctx.recoveryFor('document_unavailable'),
|
|
73
|
+
articleIndex: input.articleIndex,
|
|
74
|
+
available: articles.pagination.count,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/** Articles carry their format links on `text[]`, not `formats[]`. */
|
|
78
|
+
const url = selectDocumentUrl(article.text, input.format);
|
|
79
|
+
if (!url) {
|
|
80
|
+
throw ctx.fail('format_unavailable', `This article publishes no '${input.format}' document (looked for ${describeFormat(input.format)}). The Congressional Record publishes Formatted Text and PDF only.`, {
|
|
81
|
+
...ctx.recoveryFor('format_unavailable'),
|
|
82
|
+
format: input.format,
|
|
83
|
+
articleIndex: input.articleIndex,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
const document = await getCongressDocuments().fetchDocument({ url, characterOffset: input.characterOffset, characterLimit: input.characterLimit }, ctx);
|
|
87
|
+
const articleTitle = typeof article.title === 'string' && article.title.trim() !== ''
|
|
88
|
+
? article.title
|
|
89
|
+
: `Volume ${volumeNumber}, issue ${issueNumber}, article ${input.articleIndex}`;
|
|
90
|
+
ctx.log.info('Daily record article content retrieved', {
|
|
91
|
+
volumeNumber,
|
|
92
|
+
issueNumber,
|
|
93
|
+
articleIndex: input.articleIndex,
|
|
94
|
+
format: input.format,
|
|
95
|
+
totalCharacters: document.totalCharacters,
|
|
96
|
+
});
|
|
97
|
+
ctx.enrich.echo(`article ${input.articleIndex} of volume ${volumeNumber}, issue ${issueNumber}, ${input.format} characters ${document.offset}–${document.offset + document.text.length}`);
|
|
98
|
+
ctx.enrich.total(document.totalCharacters);
|
|
99
|
+
return {
|
|
100
|
+
content: {
|
|
101
|
+
...document,
|
|
102
|
+
format: input.format,
|
|
103
|
+
sourceUrl: url,
|
|
104
|
+
documentTitle: articleTitle,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
55
108
|
const result = await api.getDailyArticles({
|
|
56
109
|
volumeNumber,
|
|
57
110
|
issueNumber,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daily-record.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/daily-record.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,
|
|
1
|
+
{"version":3,"file":"daily-record.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/daily-record.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,11 +6,15 @@
|
|
|
6
6
|
* NOT reliably forwarded. These formatters render complete, structured
|
|
7
7
|
* markdown so the LLM can reason about all returned data.
|
|
8
8
|
*
|
|
9
|
-
* **Completeness invariant.** A record reaching
|
|
10
|
-
* whole: every upstream field appears, and no value is
|
|
11
|
-
* hand-built header may curate presentation, but
|
|
12
|
-
*
|
|
13
|
-
*
|
|
9
|
+
* **Completeness invariant.** A record reaching any renderer — detail view or
|
|
10
|
+
* list row — is rendered whole: every upstream field appears, and no value is
|
|
11
|
+
* cut mid-string. A hand-built header may curate presentation, but a detail
|
|
12
|
+
* header ends in `renderDetailRest`, a list row ends in `withRowRest`, and a
|
|
13
|
+
* curated single-line row ends in `withUnnamedFields` — so a field none of them
|
|
14
|
+
* names still reaches the reader. A collection a curated line renders lossily
|
|
15
|
+
* (its latest entry only, or only some of each entry's fields) is deliberately
|
|
16
|
+
* left out of the row's named set, so the fall-through carries it whole. The
|
|
17
|
+
* single deliberate exception is a
|
|
14
18
|
* `{count, url}` sub-resource reference, rendered as "N available": the URL is
|
|
15
19
|
* the upstream REST endpoint, and the tool's own operation is the callable path
|
|
16
20
|
* to those rows. Caps belong to pagination, which has a continuation path
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-helpers.d.ts","sourceRoot":"","sources":["../../../src/mcp-server/tools/format-helpers.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"format-helpers.d.ts","sourceRoot":"","sources":["../../../src/mcp-server/tools/format-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,KAAK,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AA01DhD,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAYxE;AAwCD,2DAA2D;AAC3D,eAAO,MAAM,eAAe,WAvEhB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,SAAS,EAuEkB,CAAC;AA8CpE,qDAAqD;AACrD,eAAO,MAAM,iBAAiB,WAtHlB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,SAAS,EAsHuB,CAAC;AAEzE,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAoB1E;AAWD,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAkB7E;AAED,kDAAkD;AAClD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAWnF;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAK7E;AAED,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAc9E;AAED,8FAA8F;AAC9F,eAAO,MAAM,UAAU,WArNX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,SAAS,EAqNiC,CAAC;AAEnF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAcxE;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAa9E"}
|