@cyanheads/federal-regulations-mcp-server 0.1.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 (105) hide show
  1. package/AGENTS.md +387 -0
  2. package/CLAUDE.md +387 -0
  3. package/Dockerfile +127 -0
  4. package/LICENSE +201 -0
  5. package/README.md +372 -0
  6. package/changelog/0.1.x/0.1.0.md +20 -0
  7. package/changelog/template.md +127 -0
  8. package/dist/config/server-config.d.ts +32 -0
  9. package/dist/config/server-config.d.ts.map +1 -0
  10. package/dist/config/server-config.js +64 -0
  11. package/dist/config/server-config.js.map +1 -0
  12. package/dist/index.d.ts +12 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +51 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/mcp-server/resources/definitions/cfr-section.resource.d.ts +14 -0
  17. package/dist/mcp-server/resources/definitions/cfr-section.resource.d.ts.map +1 -0
  18. package/dist/mcp-server/resources/definitions/cfr-section.resource.js +77 -0
  19. package/dist/mcp-server/resources/definitions/cfr-section.resource.js.map +1 -0
  20. package/dist/mcp-server/resources/definitions/document.resource.d.ts +12 -0
  21. package/dist/mcp-server/resources/definitions/document.resource.d.ts.map +1 -0
  22. package/dist/mcp-server/resources/definitions/document.resource.js +38 -0
  23. package/dist/mcp-server/resources/definitions/document.resource.js.map +1 -0
  24. package/dist/mcp-server/resources/definitions/index.d.ts +12 -0
  25. package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
  26. package/dist/mcp-server/resources/definitions/index.js +8 -0
  27. package/dist/mcp-server/resources/definitions/index.js.map +1 -0
  28. package/dist/mcp-server/tools/definitions/browse-cfr.tool.d.ts +73 -0
  29. package/dist/mcp-server/tools/definitions/browse-cfr.tool.d.ts.map +1 -0
  30. package/dist/mcp-server/tools/definitions/browse-cfr.tool.js +205 -0
  31. package/dist/mcp-server/tools/definitions/browse-cfr.tool.js.map +1 -0
  32. package/dist/mcp-server/tools/definitions/find-comments.tool.d.ts +85 -0
  33. package/dist/mcp-server/tools/definitions/find-comments.tool.d.ts.map +1 -0
  34. package/dist/mcp-server/tools/definitions/find-comments.tool.js +271 -0
  35. package/dist/mcp-server/tools/definitions/find-comments.tool.js.map +1 -0
  36. package/dist/mcp-server/tools/definitions/format-utils.d.ts +7 -0
  37. package/dist/mcp-server/tools/definitions/format-utils.d.ts.map +1 -0
  38. package/dist/mcp-server/tools/definitions/format-utils.js +9 -0
  39. package/dist/mcp-server/tools/definitions/format-utils.js.map +1 -0
  40. package/dist/mcp-server/tools/definitions/get-cfr-section.tool.d.ts +50 -0
  41. package/dist/mcp-server/tools/definitions/get-cfr-section.tool.d.ts.map +1 -0
  42. package/dist/mcp-server/tools/definitions/get-cfr-section.tool.js +152 -0
  43. package/dist/mcp-server/tools/definitions/get-cfr-section.tool.js.map +1 -0
  44. package/dist/mcp-server/tools/definitions/get-docket.tool.d.ts +67 -0
  45. package/dist/mcp-server/tools/definitions/get-docket.tool.d.ts.map +1 -0
  46. package/dist/mcp-server/tools/definitions/get-docket.tool.js +154 -0
  47. package/dist/mcp-server/tools/definitions/get-docket.tool.js.map +1 -0
  48. package/dist/mcp-server/tools/definitions/get-document.tool.d.ts +51 -0
  49. package/dist/mcp-server/tools/definitions/get-document.tool.d.ts.map +1 -0
  50. package/dist/mcp-server/tools/definitions/get-document.tool.js +138 -0
  51. package/dist/mcp-server/tools/definitions/get-document.tool.js.map +1 -0
  52. package/dist/mcp-server/tools/definitions/index.d.ts +356 -0
  53. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
  54. package/dist/mcp-server/tools/definitions/index.js +21 -0
  55. package/dist/mcp-server/tools/definitions/index.js.map +1 -0
  56. package/dist/mcp-server/tools/definitions/list-open-comments.tool.d.ts +47 -0
  57. package/dist/mcp-server/tools/definitions/list-open-comments.tool.d.ts.map +1 -0
  58. package/dist/mcp-server/tools/definitions/list-open-comments.tool.js +179 -0
  59. package/dist/mcp-server/tools/definitions/list-open-comments.tool.js.map +1 -0
  60. package/dist/mcp-server/tools/definitions/search-rules.tool.d.ts +57 -0
  61. package/dist/mcp-server/tools/definitions/search-rules.tool.d.ts.map +1 -0
  62. package/dist/mcp-server/tools/definitions/search-rules.tool.js +185 -0
  63. package/dist/mcp-server/tools/definitions/search-rules.tool.js.map +1 -0
  64. package/dist/services/ecfr/ecfr-service.d.ts +54 -0
  65. package/dist/services/ecfr/ecfr-service.d.ts.map +1 -0
  66. package/dist/services/ecfr/ecfr-service.js +303 -0
  67. package/dist/services/ecfr/ecfr-service.js.map +1 -0
  68. package/dist/services/ecfr/types.d.ts +105 -0
  69. package/dist/services/ecfr/types.d.ts.map +1 -0
  70. package/dist/services/ecfr/types.js +7 -0
  71. package/dist/services/ecfr/types.js.map +1 -0
  72. package/dist/services/ecfr/xml.d.ts +15 -0
  73. package/dist/services/ecfr/xml.d.ts.map +1 -0
  74. package/dist/services/ecfr/xml.js +103 -0
  75. package/dist/services/ecfr/xml.js.map +1 -0
  76. package/dist/services/ecfr-mirror/ecfr-mirror.d.ts +43 -0
  77. package/dist/services/ecfr-mirror/ecfr-mirror.d.ts.map +1 -0
  78. package/dist/services/ecfr-mirror/ecfr-mirror.js +267 -0
  79. package/dist/services/ecfr-mirror/ecfr-mirror.js.map +1 -0
  80. package/dist/services/federal-register/federal-register-service.d.ts +30 -0
  81. package/dist/services/federal-register/federal-register-service.d.ts.map +1 -0
  82. package/dist/services/federal-register/federal-register-service.js +241 -0
  83. package/dist/services/federal-register/federal-register-service.js.map +1 -0
  84. package/dist/services/federal-register/types.d.ts +138 -0
  85. package/dist/services/federal-register/types.d.ts.map +1 -0
  86. package/dist/services/federal-register/types.js +8 -0
  87. package/dist/services/federal-register/types.js.map +1 -0
  88. package/dist/services/regulations-gov/regulations-gov-service.d.ts +55 -0
  89. package/dist/services/regulations-gov/regulations-gov-service.d.ts.map +1 -0
  90. package/dist/services/regulations-gov/regulations-gov-service.js +283 -0
  91. package/dist/services/regulations-gov/regulations-gov-service.js.map +1 -0
  92. package/dist/services/regulations-gov/types.d.ts +148 -0
  93. package/dist/services/regulations-gov/types.d.ts.map +1 -0
  94. package/dist/services/regulations-gov/types.js +7 -0
  95. package/dist/services/regulations-gov/types.js.map +1 -0
  96. package/dist/services/request-context.d.ts +13 -0
  97. package/dist/services/request-context.d.ts.map +1 -0
  98. package/dist/services/request-context.js +23 -0
  99. package/dist/services/request-context.js.map +1 -0
  100. package/package.json +94 -0
  101. package/scripts/_mirror-context.ts +101 -0
  102. package/scripts/ecfr-mirror-init.ts +36 -0
  103. package/scripts/ecfr-mirror-refresh.ts +29 -0
  104. package/scripts/ecfr-mirror-verify.ts +33 -0
  105. package/server.json +113 -0
@@ -0,0 +1,241 @@
1
+ /**
2
+ * @fileoverview FederalRegisterService — keyless client for the Federal Register
3
+ * API v1 (federalregister.gov/api/v1). Backs the document search, single-document
4
+ * fetch (with the cross-source docket/CFR handles), and the open-comment-window
5
+ * tools. Each method wraps the full fetch + parse pipeline in `withRetry`;
6
+ * `fetchWithTimeout` throws a classified `McpError` on a non-OK response, and the
7
+ * response parser detects HTML error pages and re-throws them as transient.
8
+ * @module services/federal-register/federal-register-service
9
+ */
10
+ import { JsonRpcErrorCode, McpError, notFound, serviceUnavailable, } from '@cyanheads/mcp-ts-core/errors';
11
+ import { fetchWithTimeout, withRetry } from '@cyanheads/mcp-ts-core/utils';
12
+ import { getServerConfig } from '../../config/server-config.js';
13
+ import { toRequestContext } from '../../services/request-context.js';
14
+ const TIMEOUT_MS = 15_000;
15
+ const BASE_DELAY_MS = 300;
16
+ /** Fields requested from the list/search endpoint. */
17
+ const SEARCH_FIELDS = [
18
+ 'document_number',
19
+ 'title',
20
+ 'type',
21
+ 'abstract',
22
+ 'publication_date',
23
+ 'agency_names',
24
+ 'docket_ids',
25
+ 'regulation_id_numbers',
26
+ 'cfr_references',
27
+ 'comments_close_on',
28
+ 'effective_on',
29
+ 'html_url',
30
+ 'regulations_dot_gov_info',
31
+ ];
32
+ /** Detects an HTML error page returned with a non-error HTTP status. */
33
+ function looksLikeHtml(text) {
34
+ return /^\s*<(!DOCTYPE\s+html|html[\s>])/i.test(text);
35
+ }
36
+ /**
37
+ * The Federal Register `raw_text_url` serves the rule body wrapped in a minimal
38
+ * HTML envelope — `<html><head><title>…</title></head><body><pre>…actual text…
39
+ * </pre></body></html>` — despite a `text/plain` content type. Extract the
40
+ * `<pre>` block and decode its handful of entities so `fullText` is the genuine
41
+ * plain-text body the schema promises, not HTML noise. Falls back to the raw
42
+ * payload if the expected wrapper isn't present.
43
+ */
44
+ function unwrapRawText(body) {
45
+ const match = body.match(/<pre[^>]*>([\s\S]*?)<\/pre>/i);
46
+ const inner = match?.[1] ?? body;
47
+ return inner
48
+ .replace(/&lt;/g, '<')
49
+ .replace(/&gt;/g, '>')
50
+ .replace(/&quot;/g, '"')
51
+ .replace(/&#39;/g, "'")
52
+ .replace(/&amp;/g, '&')
53
+ .trim();
54
+ }
55
+ export class FederalRegisterService {
56
+ baseUrl;
57
+ constructor(_config, _storage) {
58
+ this.baseUrl = getServerConfig().federalRegisterBaseUrl.replace(/\/$/, '');
59
+ }
60
+ /** Search Federal Register documents by query, type, agency, and date window. */
61
+ async search(params, ctx) {
62
+ const search = new URLSearchParams();
63
+ if (params.query)
64
+ search.set('conditions[term]', params.query);
65
+ for (const type of params.types ?? [])
66
+ search.append('conditions[type][]', type);
67
+ for (const agency of params.agencies ?? []) {
68
+ search.append('conditions[agencies][]', agency);
69
+ }
70
+ if (params.publishedAfter) {
71
+ search.set('conditions[publication_date][gte]', params.publishedAfter);
72
+ }
73
+ if (params.publishedBefore) {
74
+ search.set('conditions[publication_date][lte]', params.publishedBefore);
75
+ }
76
+ search.set('per_page', String(params.perPage));
77
+ search.set('page', String(params.page));
78
+ search.set('order', 'newest');
79
+ for (const field of SEARCH_FIELDS)
80
+ search.append('fields[]', field);
81
+ const url = `${this.baseUrl}/documents.json?${search.toString()}`;
82
+ const raw = await this.fetchJson(url, ctx, 'FederalRegisterService.search');
83
+ return {
84
+ totalCount: raw.count ?? 0,
85
+ results: (raw.results ?? []).map((doc) => normalizeSearchResult(doc)),
86
+ };
87
+ }
88
+ /** Fetch one document by FR number, optionally inlining the plain-text body. */
89
+ async getDocument(documentNumber, includeFullText, ctx) {
90
+ const search = new URLSearchParams();
91
+ const detailFields = [
92
+ ...SEARCH_FIELDS,
93
+ 'action',
94
+ 'dates',
95
+ 'body_html_url',
96
+ 'full_text_xml_url',
97
+ 'raw_text_url',
98
+ ];
99
+ for (const field of detailFields)
100
+ search.append('fields[]', field);
101
+ const url = `${this.baseUrl}/documents/${encodeURIComponent(documentNumber)}.json?${search.toString()}`;
102
+ let raw;
103
+ try {
104
+ raw = await this.fetchJson(url, ctx, 'FederalRegisterService.getDocument');
105
+ }
106
+ catch (err) {
107
+ // The FR API 404s for a nonexistent document number. Translate it into an
108
+ // actionable not_found so the tool's contract recovery surfaces, rather
109
+ // than a raw "Fetch failed 404".
110
+ if (err instanceof McpError && err.code === JsonRpcErrorCode.NotFound) {
111
+ throw notFound(`No Federal Register document found with number ${documentNumber}.`, { documentNumber }, { cause: err });
112
+ }
113
+ throw err;
114
+ }
115
+ const detail = normalizeDocumentDetail(raw);
116
+ if (includeFullText && raw.raw_text_url) {
117
+ const body = await this.fetchText(raw.raw_text_url, ctx, 'FederalRegisterService.getFullText');
118
+ detail.fullText = unwrapRawText(body);
119
+ }
120
+ return detail;
121
+ }
122
+ /** List rules currently open for public comment (comment_date window ≥ today). */
123
+ async listOpenComments(params, asOf, ctx) {
124
+ const search = new URLSearchParams();
125
+ if (params.query)
126
+ search.set('conditions[term]', params.query);
127
+ for (const agency of params.agencies ?? []) {
128
+ search.append('conditions[agencies][]', agency);
129
+ }
130
+ search.set('conditions[type][]', 'PRORULE');
131
+ search.set('conditions[comment_date][gte]', asOf);
132
+ if (params.closingBefore) {
133
+ search.set('conditions[comment_date][lte]', params.closingBefore);
134
+ }
135
+ search.set('per_page', String(params.perPage));
136
+ search.set('page', String(params.page));
137
+ search.set('order', 'newest');
138
+ for (const field of SEARCH_FIELDS)
139
+ search.append('fields[]', field);
140
+ const url = `${this.baseUrl}/documents.json?${search.toString()}`;
141
+ const raw = await this.fetchJson(url, ctx, 'FederalRegisterService.listOpenComments');
142
+ const results = (raw.results ?? [])
143
+ .filter((doc) => doc.comments_close_on)
144
+ .map((doc) => normalizeOpenCommentRule(doc));
145
+ return { totalCount: raw.count ?? 0, results };
146
+ }
147
+ /** Fetch + parse JSON with retry; HTML error pages become transient errors. */
148
+ fetchJson(url, ctx, operation) {
149
+ const reqCtx = toRequestContext(ctx, operation);
150
+ return withRetry(async () => {
151
+ const response = await fetchWithTimeout(url, TIMEOUT_MS, reqCtx, { signal: ctx.signal });
152
+ const text = await response.text();
153
+ if (looksLikeHtml(text)) {
154
+ throw serviceUnavailable('Federal Register returned an HTML error page instead of JSON — likely momentarily unavailable.');
155
+ }
156
+ return JSON.parse(text);
157
+ }, { operation, context: reqCtx, baseDelayMs: BASE_DELAY_MS, signal: ctx.signal });
158
+ }
159
+ /** Fetch plain text (document body) with retry. */
160
+ fetchText(url, ctx, operation) {
161
+ const reqCtx = toRequestContext(ctx, operation);
162
+ return withRetry(async () => {
163
+ const response = await fetchWithTimeout(url, TIMEOUT_MS, reqCtx, { signal: ctx.signal });
164
+ return response.text();
165
+ }, { operation, context: reqCtx, baseDelayMs: BASE_DELAY_MS, signal: ctx.signal });
166
+ }
167
+ }
168
+ /** Map raw FR `cfr_references` (sparse) → domain `CfrReference[]`. */
169
+ function normalizeCfrReferences(raw) {
170
+ return (raw ?? [])
171
+ .filter((ref) => typeof ref?.title === 'number' && typeof ref?.part === 'string' && ref.part.length > 0)
172
+ .map((ref) => ({ title: ref.title, part: ref.part }));
173
+ }
174
+ function normalizeSearchResult(doc) {
175
+ return {
176
+ documentNumber: doc.document_number ?? '',
177
+ title: doc.title ?? '(untitled)',
178
+ type: doc.type ?? 'Unknown',
179
+ abstract: doc.abstract ?? null,
180
+ publicationDate: doc.publication_date ?? '',
181
+ agencies: doc.agency_names ?? [],
182
+ docketIds: doc.docket_ids ?? [],
183
+ regulationIdNumbers: doc.regulation_id_numbers ?? [],
184
+ cfrReferences: normalizeCfrReferences(doc.cfr_references),
185
+ commentsCloseOn: doc.comments_close_on ?? null,
186
+ effectiveOn: doc.effective_on ?? null,
187
+ htmlUrl: doc.html_url ?? '',
188
+ };
189
+ }
190
+ function normalizeDocumentDetail(doc) {
191
+ const rdg = doc.regulations_dot_gov_info ?? {};
192
+ const supportingDocuments = (rdg.supporting_documents ?? [])
193
+ .filter((d) => typeof d?.document_id === 'string' && d.document_id.length > 0)
194
+ .map((d) => ({ title: d.title ?? '(untitled)', documentId: d.document_id }));
195
+ return {
196
+ documentNumber: doc.document_number ?? '',
197
+ title: doc.title ?? '(untitled)',
198
+ type: doc.type ?? 'Unknown',
199
+ abstract: doc.abstract ?? null,
200
+ action: doc.action ?? null,
201
+ dates: doc.dates ?? null,
202
+ publicationDate: doc.publication_date ?? '',
203
+ effectiveOn: doc.effective_on ?? null,
204
+ commentsCloseOn: doc.comments_close_on ?? null,
205
+ agencies: doc.agency_names ?? [],
206
+ regulationIdNumbers: doc.regulation_id_numbers ?? [],
207
+ cfrReferences: normalizeCfrReferences(doc.cfr_references),
208
+ docketId: rdg.docket_id ?? null,
209
+ regulationsGovDocumentId: rdg.document_id ?? null,
210
+ commentCount: typeof rdg.comments_count === 'number' ? rdg.comments_count : null,
211
+ supportingDocuments,
212
+ bodyHtmlUrl: doc.body_html_url ?? '',
213
+ rawTextUrl: doc.raw_text_url ?? '',
214
+ htmlUrl: doc.html_url ?? '',
215
+ };
216
+ }
217
+ function normalizeOpenCommentRule(doc) {
218
+ const rdg = doc.regulations_dot_gov_info ?? {};
219
+ return {
220
+ documentNumber: doc.document_number ?? '',
221
+ title: doc.title ?? '(untitled)',
222
+ type: doc.type ?? 'Proposed Rule',
223
+ agencies: doc.agency_names ?? [],
224
+ publicationDate: doc.publication_date ?? '',
225
+ commentsCloseOn: doc.comments_close_on ?? '',
226
+ docketIds: doc.docket_ids ?? [],
227
+ commentCount: typeof rdg.comments_count === 'number' ? rdg.comments_count : null,
228
+ };
229
+ }
230
+ // --- Init/accessor pattern ---
231
+ let _service;
232
+ export function initFederalRegisterService(config, storage) {
233
+ _service = new FederalRegisterService(config, storage);
234
+ }
235
+ export function getFederalRegisterService() {
236
+ if (!_service) {
237
+ throw new Error('FederalRegisterService not initialized — call initFederalRegisterService() in setup()');
238
+ }
239
+ return _service;
240
+ }
241
+ //# sourceMappingURL=federal-register-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federal-register-service.js","sourceRoot":"","sources":["../../../src/services/federal-register/federal-register-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * @fileoverview Domain and raw upstream types for the Federal Register service.
3
+ * Raw types mirror the real (sparse) API payloads — fields default to optional
4
+ * unless the API guarantees presence — so normalization never invents facts.
5
+ * @module services/federal-register/types
6
+ */
7
+ /** A title + part reference into the CFR, the handle into eCFR tools. */
8
+ export interface CfrReference {
9
+ part: string;
10
+ title: number;
11
+ }
12
+ /** Raw `regulations_dot_gov_info` block embedded in a Federal Register document. */
13
+ export interface RawRegulationsDotGovInfo {
14
+ comments_count?: number | null;
15
+ comments_url?: string | null;
16
+ docket_id?: string | null;
17
+ document_id?: string | null;
18
+ supporting_documents?: Array<{
19
+ title?: string | null;
20
+ document_id?: string | null;
21
+ }> | null;
22
+ }
23
+ /** Raw Federal Register document as returned by the API (search + single-doc). */
24
+ export interface RawFrDocument {
25
+ abstract?: string | null;
26
+ action?: string | null;
27
+ agencies?: Array<{
28
+ name?: string | null;
29
+ slug?: string | null;
30
+ }> | null;
31
+ agency_names?: string[] | null;
32
+ body_html_url?: string | null;
33
+ cfr_references?: Array<{
34
+ title?: number | null;
35
+ part?: string | null;
36
+ }> | null;
37
+ comments_close_on?: string | null;
38
+ dates?: string | null;
39
+ docket_ids?: string[] | null;
40
+ document_number?: string;
41
+ effective_on?: string | null;
42
+ full_text_xml_url?: string | null;
43
+ html_url?: string | null;
44
+ publication_date?: string;
45
+ raw_text_url?: string | null;
46
+ regulation_id_numbers?: string[] | null;
47
+ regulations_dot_gov_info?: RawRegulationsDotGovInfo | null;
48
+ title?: string;
49
+ type?: string;
50
+ }
51
+ /** Raw search response envelope. */
52
+ export interface RawFrSearchResponse {
53
+ count?: number;
54
+ next_page_url?: string | null;
55
+ results?: RawFrDocument[];
56
+ total_pages?: number;
57
+ }
58
+ /** Normalized search-result row. */
59
+ export interface FrSearchResult {
60
+ abstract: string | null;
61
+ agencies: string[];
62
+ cfrReferences: CfrReference[];
63
+ commentsCloseOn: string | null;
64
+ docketIds: string[];
65
+ documentNumber: string;
66
+ effectiveOn: string | null;
67
+ htmlUrl: string;
68
+ publicationDate: string;
69
+ regulationIdNumbers: string[];
70
+ title: string;
71
+ type: string;
72
+ }
73
+ /** Normalized search response. */
74
+ export interface FrSearchResponse {
75
+ results: FrSearchResult[];
76
+ totalCount: number;
77
+ }
78
+ /** Normalized single-document detail. */
79
+ export interface FrDocumentDetail {
80
+ abstract: string | null;
81
+ action: string | null;
82
+ agencies: string[];
83
+ bodyHtmlUrl: string;
84
+ cfrReferences: CfrReference[];
85
+ commentCount: number | null;
86
+ commentsCloseOn: string | null;
87
+ dates: string | null;
88
+ docketId: string | null;
89
+ documentNumber: string;
90
+ effectiveOn: string | null;
91
+ fullText?: string;
92
+ htmlUrl: string;
93
+ publicationDate: string;
94
+ rawTextUrl: string;
95
+ regulationIdNumbers: string[];
96
+ regulationsGovDocumentId: string | null;
97
+ supportingDocuments: Array<{
98
+ title: string;
99
+ documentId: string;
100
+ }>;
101
+ title: string;
102
+ type: string;
103
+ }
104
+ /** Normalized open-comment-window row (FR-only; comment count enriched separately). */
105
+ export interface OpenCommentRule {
106
+ agencies: string[];
107
+ commentCount: number | null;
108
+ commentsCloseOn: string;
109
+ docketIds: string[];
110
+ documentNumber: string;
111
+ publicationDate: string;
112
+ title: string;
113
+ type: string;
114
+ }
115
+ /** Normalized open-comment-window response. */
116
+ export interface OpenCommentsResponse {
117
+ results: OpenCommentRule[];
118
+ totalCount: number;
119
+ }
120
+ /** Parameters for a Federal Register document search. */
121
+ export interface FrSearchParams {
122
+ agencies?: string[] | undefined;
123
+ page: number;
124
+ perPage: number;
125
+ publishedAfter?: string | undefined;
126
+ publishedBefore?: string | undefined;
127
+ query?: string | undefined;
128
+ types?: string[] | undefined;
129
+ }
130
+ /** Parameters for the open-comment-window query. */
131
+ export interface OpenCommentsParams {
132
+ agencies?: string[] | undefined;
133
+ closingBefore?: string | undefined;
134
+ page: number;
135
+ perPage: number;
136
+ query?: string | undefined;
137
+ }
138
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/federal-register/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @fileoverview Domain and raw upstream types for the Federal Register service.
3
+ * Raw types mirror the real (sparse) API payloads — fields default to optional
4
+ * unless the API guarantees presence — so normalization never invents facts.
5
+ * @module services/federal-register/types
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/federal-register/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @fileoverview RegulationsGovService — keyed client for the Regulations.gov v4
3
+ * API (api.regulations.gov/v4, `X-Api-Key`). Backs `get_docket` and
4
+ * `find_comments`, and enriches `list_open_comments`. JSON:API responses are
5
+ * unwrapped to flat domain objects. The key is optional at the service level
6
+ * (`hasKey()` lets keyless tools degrade or throw `auth_required`); 429s carry a
7
+ * distinct `rate_limited` signal via `Retry-After`. Comment bodies are
8
+ * HTML-stripped and attachment-primary submissions flagged.
9
+ * @module services/regulations-gov/regulations-gov-service
10
+ */
11
+ import type { Context } from '@cyanheads/mcp-ts-core';
12
+ import type { AppConfig } from '@cyanheads/mcp-ts-core/config';
13
+ import type { StorageService } from '@cyanheads/mcp-ts-core/storage';
14
+ import type { CommentDetailResult, CommentListResult, DocketResult } from './types.js';
15
+ /** Parameters for a docket fetch. */
16
+ export interface DocketParams {
17
+ docketId: string;
18
+ documentTypes?: string[] | undefined;
19
+ page: number;
20
+ perPage: number;
21
+ }
22
+ /** A comment list query targets either a document object ID or a docket ID. */
23
+ export interface CommentListParams {
24
+ filter: {
25
+ commentOnId: string;
26
+ } | {
27
+ docketId: string;
28
+ };
29
+ page: number;
30
+ perPage: number;
31
+ }
32
+ export declare class RegulationsGovService {
33
+ private readonly baseUrl;
34
+ private readonly apiKey;
35
+ constructor(_config: AppConfig, _storage: StorageService);
36
+ /** Whether a Regulations.gov API key is configured. */
37
+ hasKey(): boolean;
38
+ /** Fetch a docket's metadata plus the documents filed in it. */
39
+ getDocket(params: DocketParams, ctx: Context): Promise<DocketResult>;
40
+ /** List comments on a document (by object ID) or a docket (by docket ID). */
41
+ listComments(params: CommentListParams, ctx: Context): Promise<CommentListResult>;
42
+ /** Fetch one comment's full detail and attachments by comment ID. */
43
+ getComment(commentId: string, ctx: Context): Promise<CommentDetailResult>;
44
+ /**
45
+ * Resolve a Federal Register document number to its Regulations.gov primary
46
+ * document object ID, via `filter[searchTerm]` on the FR number. Returns null
47
+ * when no matching document is found.
48
+ */
49
+ resolveFrDocumentObjectId(frDocumentNumber: string, ctx: Context): Promise<string | null>;
50
+ /** Fetch + parse JSON with key header and retry; maps 429 → rate_limited. */
51
+ private fetchJson;
52
+ }
53
+ export declare function initRegulationsGovService(config: AppConfig, storage: StorageService): void;
54
+ export declare function getRegulationsGovService(): RegulationsGovService;
55
+ //# sourceMappingURL=regulations-gov-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regulations-gov-service.d.ts","sourceRoot":"","sources":["../../../src/services/regulations-gov/regulations-gov-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAIrE,OAAO,KAAK,EAEV,mBAAmB,EACnB,iBAAiB,EAEjB,YAAY,EASb,MAAM,YAAY,CAAC;AAIpB,qCAAqC;AACrC,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,+EAA+E;AAC/E,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;gBAEhC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc;IAMxD,uDAAuD;IACvD,MAAM,IAAI,OAAO;IAIjB,gEAAgE;IAC1D,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IA2C1E,6EAA6E;IACvE,YAAY,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAyBvF,qEAAqE;IAC/D,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAU/E;;;;OAIG;IACG,yBAAyB,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAsB/F,6EAA6E;IAC7E,OAAO,CAAC,SAAS;CA6ClB;AAgJD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAE1F;AAED,wBAAgB,wBAAwB,IAAI,qBAAqB,CAOhE"}