@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 @@
1
+ {"version":3,"file":"get-document.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-document.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,356 @@
1
+ /**
2
+ * @fileoverview Barrel of all tool definitions for federal-regulations-mcp-server.
3
+ * @module mcp-server/tools/definitions/index
4
+ */
5
+ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
6
+ mode: import("zod").ZodEnum<{
7
+ search: "search";
8
+ structure: "structure";
9
+ }>;
10
+ title: import("zod").ZodOptional<import("zod").ZodNumber>;
11
+ part: import("zod").ZodOptional<import("zod").ZodString>;
12
+ query: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodLiteral<"">, import("zod").ZodString]>>;
13
+ date: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodLiteral<"">, import("zod").ZodString]>>;
14
+ per_page: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
15
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
16
+ mode: import("zod").ZodEnum<{
17
+ search: "search";
18
+ structure: "structure";
19
+ }>;
20
+ date: import("zod").ZodOptional<import("zod").ZodString>;
21
+ nodes: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
22
+ type: import("zod").ZodString;
23
+ identifier: import("zod").ZodString;
24
+ label: import("zod").ZodString;
25
+ description: import("zod").ZodNullable<import("zod").ZodString>;
26
+ reserved: import("zod").ZodBoolean;
27
+ cfrCite: import("zod").ZodNullable<import("zod").ZodString>;
28
+ }, import("zod/v4/core").$strip>>>;
29
+ source: import("zod").ZodOptional<import("zod").ZodEnum<{
30
+ mirror: "mirror";
31
+ live: "live";
32
+ }>>;
33
+ results: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
34
+ title: import("zod").ZodNumber;
35
+ part: import("zod").ZodString;
36
+ section: import("zod").ZodNullable<import("zod").ZodString>;
37
+ heading: import("zod").ZodString;
38
+ hierarchyPath: import("zod").ZodString;
39
+ excerpt: import("zod").ZodString;
40
+ cfrCite: import("zod").ZodString;
41
+ }, import("zod/v4/core").$strip>>>;
42
+ }, import("zod/v4/core").$strip>, readonly [{
43
+ readonly reason: "query_required";
44
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.InvalidParams;
45
+ readonly when: "mode=\"search\" with no query phrase.";
46
+ readonly recovery: "Provide a query phrase for search mode, or switch to mode=\"structure\" to browse.";
47
+ }, {
48
+ readonly reason: "title_not_found";
49
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
50
+ readonly when: "Structure mode with a title outside 1–50, or a part not found in the title.";
51
+ readonly recovery: "Omit title to list all titles, or pick a number in 1–50 and a part that exists.";
52
+ }, {
53
+ readonly reason: "no_results";
54
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
55
+ readonly when: "Search mode returned zero matches.";
56
+ readonly recovery: "Broaden the phrase or drop the title filter and retry.";
57
+ }, {
58
+ readonly reason: "upstream_unavailable";
59
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
60
+ readonly when: "eCFR returned a 5xx, timed out, or served an HTML error page (live path).";
61
+ readonly recovery: "Retry after a brief wait; the eCFR API may be momentarily down.";
62
+ }], {
63
+ readonly totalCount: import("zod").ZodOptional<import("zod").ZodNumber>;
64
+ readonly truncated: import("zod").ZodOptional<import("zod").ZodBoolean>;
65
+ readonly shown: import("zod").ZodOptional<import("zod").ZodNumber>;
66
+ readonly notice: import("zod").ZodOptional<import("zod").ZodString>;
67
+ }> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
68
+ docket_id: import("zod").ZodOptional<import("zod").ZodString>;
69
+ document_object_id: import("zod").ZodOptional<import("zod").ZodString>;
70
+ fr_document_number: import("zod").ZodOptional<import("zod").ZodString>;
71
+ comment_id: import("zod").ZodOptional<import("zod").ZodString>;
72
+ per_page: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
73
+ page: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
74
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
75
+ mode: import("zod").ZodEnum<{
76
+ list: "list";
77
+ detail: "detail";
78
+ }>;
79
+ target: import("zod").ZodOptional<import("zod").ZodString>;
80
+ comments: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
81
+ commentId: import("zod").ZodString;
82
+ title: import("zod").ZodString;
83
+ documentType: import("zod").ZodString;
84
+ postedDate: import("zod").ZodString;
85
+ agencyId: import("zod").ZodNullable<import("zod").ZodString>;
86
+ objectId: import("zod").ZodString;
87
+ withdrawn: import("zod").ZodBoolean;
88
+ }, import("zod/v4/core").$strip>>>;
89
+ commentId: import("zod").ZodOptional<import("zod").ZodString>;
90
+ title: import("zod").ZodOptional<import("zod").ZodString>;
91
+ docketId: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
92
+ commentOnDocumentId: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
93
+ postedDate: import("zod").ZodOptional<import("zod").ZodString>;
94
+ receivedDate: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
95
+ submitterName: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
96
+ organization: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
97
+ bodyText: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
98
+ attachmentOnly: import("zod").ZodOptional<import("zod").ZodBoolean>;
99
+ attachments: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
100
+ title: import("zod").ZodString;
101
+ formats: import("zod").ZodArray<import("zod").ZodObject<{
102
+ format: import("zod").ZodString;
103
+ fileUrl: import("zod").ZodString;
104
+ size: import("zod").ZodNullable<import("zod").ZodNumber>;
105
+ }, import("zod/v4/core").$strip>>;
106
+ }, import("zod/v4/core").$strip>>>;
107
+ withdrawn: import("zod").ZodOptional<import("zod").ZodBoolean>;
108
+ restrictReason: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
109
+ }, import("zod/v4/core").$strip>, readonly [{
110
+ readonly reason: "auth_required";
111
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Unauthorized;
112
+ readonly when: "REGULATIONS_GOV_API_KEY is not configured.";
113
+ readonly recovery: "Set the REGULATIONS_GOV_API_KEY env var (free key at https://api.data.gov/signup/). The Federal Register and eCFR tools work without it.";
114
+ }, {
115
+ readonly reason: "target_required";
116
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.InvalidParams;
117
+ readonly when: "None of docket_id / document_object_id / fr_document_number / comment_id was given.";
118
+ readonly recovery: "Provide one targeting parameter — a docket ID, a document object ID, an FR document number, or a comment ID.";
119
+ }, {
120
+ readonly reason: "not_found";
121
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
122
+ readonly when: "The target docket/document/comment has no comments or does not exist.";
123
+ readonly recovery: "Verify the ID; comments often attach to the docket's primary document — try docket_id to widen, or check the docket reached its comment period.";
124
+ }, {
125
+ readonly reason: "rate_limited";
126
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.RateLimited;
127
+ readonly when: "Regulations.gov returned 429.";
128
+ readonly retryable: true;
129
+ readonly recovery: "Wait and retry — the per-key hourly limit (1,000/hr) was hit.";
130
+ }, {
131
+ readonly reason: "upstream_unavailable";
132
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
133
+ readonly when: "Regulations.gov returned a 5xx or timed out.";
134
+ readonly recovery: "Retry after a brief wait.";
135
+ }], {
136
+ readonly totalCount: import("zod").ZodOptional<import("zod").ZodNumber>;
137
+ readonly truncated: import("zod").ZodOptional<import("zod").ZodBoolean>;
138
+ readonly shown: import("zod").ZodOptional<import("zod").ZodNumber>;
139
+ readonly notice: import("zod").ZodOptional<import("zod").ZodString>;
140
+ }> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
141
+ title: import("zod").ZodNumber;
142
+ part: import("zod").ZodString;
143
+ section: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodLiteral<"">, import("zod").ZodString]>>;
144
+ date: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodLiteral<"">, import("zod").ZodString]>>;
145
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
146
+ cfrCite: import("zod").ZodString;
147
+ title: import("zod").ZodNumber;
148
+ part: import("zod").ZodString;
149
+ section: import("zod").ZodNullable<import("zod").ZodString>;
150
+ heading: import("zod").ZodString;
151
+ hierarchyPath: import("zod").ZodString;
152
+ date: import("zod").ZodString;
153
+ source: import("zod").ZodEnum<{
154
+ mirror: "mirror";
155
+ live: "live";
156
+ }>;
157
+ bodyText: import("zod").ZodString;
158
+ sections: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
159
+ section: import("zod").ZodString;
160
+ heading: import("zod").ZodString;
161
+ bodyText: import("zod").ZodString;
162
+ }, import("zod/v4/core").$strip>>>;
163
+ }, import("zod/v4/core").$strip>, readonly [{
164
+ readonly reason: "not_found";
165
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
166
+ readonly when: "No such title/part/section at that date.";
167
+ readonly recovery: "Verify the cite with regulations_browse_cfr (structure mode); the part or section may not exist or may be reserved.";
168
+ }, {
169
+ readonly reason: "date_out_of_range";
170
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.InvalidParams;
171
+ readonly when: "The requested date precedes eCFR historical coverage.";
172
+ readonly recovery: "Use a date from ~2017 onward, or omit date for the current text.";
173
+ }, {
174
+ readonly reason: "upstream_unavailable";
175
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
176
+ readonly when: "eCFR returned a 5xx, timed out, or served an HTML error page (live path).";
177
+ readonly recovery: "Retry after a brief wait; the eCFR API may be momentarily unavailable.";
178
+ }], undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
179
+ docket_id: import("zod").ZodString;
180
+ document_types: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodEnum<{
181
+ "Proposed Rule": "Proposed Rule";
182
+ Rule: "Rule";
183
+ Notice: "Notice";
184
+ "Supporting & Related Material": "Supporting & Related Material";
185
+ Other: "Other";
186
+ }>>>;
187
+ per_page: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
188
+ page: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
189
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
190
+ docketId: import("zod").ZodString;
191
+ title: import("zod").ZodString;
192
+ docketType: import("zod").ZodNullable<import("zod").ZodString>;
193
+ agencyId: import("zod").ZodNullable<import("zod").ZodString>;
194
+ rin: import("zod").ZodNullable<import("zod").ZodString>;
195
+ abstract: import("zod").ZodNullable<import("zod").ZodString>;
196
+ modifyDate: import("zod").ZodNullable<import("zod").ZodString>;
197
+ objectId: import("zod").ZodNullable<import("zod").ZodString>;
198
+ documentCount: import("zod").ZodNumber;
199
+ documents: import("zod").ZodArray<import("zod").ZodObject<{
200
+ documentId: import("zod").ZodString;
201
+ objectId: import("zod").ZodString;
202
+ title: import("zod").ZodString;
203
+ documentType: import("zod").ZodString;
204
+ postedDate: import("zod").ZodString;
205
+ frDocNum: import("zod").ZodNullable<import("zod").ZodString>;
206
+ commentEndDate: import("zod").ZodNullable<import("zod").ZodString>;
207
+ withdrawn: import("zod").ZodBoolean;
208
+ }, import("zod/v4/core").$strip>>;
209
+ }, import("zod/v4/core").$strip>, readonly [{
210
+ readonly reason: "auth_required";
211
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.Unauthorized;
212
+ readonly when: "REGULATIONS_GOV_API_KEY is not configured.";
213
+ readonly recovery: "Set the REGULATIONS_GOV_API_KEY env var (free key at https://api.data.gov/signup/). The Federal Register and eCFR tools work without it.";
214
+ }, {
215
+ readonly reason: "not_found";
216
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
217
+ readonly when: "No docket exists with that ID.";
218
+ readonly recovery: "Verify the docket ID from a Federal Register document's docketId; format is like \"EPA-HQ-OAR-2025-0194\".";
219
+ }, {
220
+ readonly reason: "rate_limited";
221
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.RateLimited;
222
+ readonly when: "Regulations.gov returned 429 (1,000 requests/hour per key).";
223
+ readonly retryable: true;
224
+ readonly recovery: "Wait and retry — the per-key hourly limit was hit.";
225
+ }, {
226
+ readonly reason: "upstream_unavailable";
227
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
228
+ readonly when: "Regulations.gov returned a 5xx or timed out.";
229
+ readonly recovery: "Retry after a brief wait.";
230
+ }], {
231
+ readonly truncated: import("zod").ZodOptional<import("zod").ZodBoolean>;
232
+ readonly shown: import("zod").ZodOptional<import("zod").ZodNumber>;
233
+ readonly notice: import("zod").ZodOptional<import("zod").ZodString>;
234
+ }> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
235
+ document_number: import("zod").ZodString;
236
+ include_full_text: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodBoolean>>;
237
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
238
+ documentNumber: import("zod").ZodString;
239
+ title: import("zod").ZodString;
240
+ type: import("zod").ZodString;
241
+ abstract: import("zod").ZodNullable<import("zod").ZodString>;
242
+ action: import("zod").ZodNullable<import("zod").ZodString>;
243
+ dates: import("zod").ZodNullable<import("zod").ZodString>;
244
+ publicationDate: import("zod").ZodString;
245
+ effectiveOn: import("zod").ZodNullable<import("zod").ZodString>;
246
+ commentsCloseOn: import("zod").ZodNullable<import("zod").ZodString>;
247
+ agencies: import("zod").ZodArray<import("zod").ZodString>;
248
+ regulationIdNumbers: import("zod").ZodArray<import("zod").ZodString>;
249
+ cfrReferences: import("zod").ZodArray<import("zod").ZodObject<{
250
+ title: import("zod").ZodNumber;
251
+ part: import("zod").ZodString;
252
+ }, import("zod/v4/core").$strip>>;
253
+ docketId: import("zod").ZodNullable<import("zod").ZodString>;
254
+ regulationsGovDocumentId: import("zod").ZodNullable<import("zod").ZodString>;
255
+ commentCount: import("zod").ZodNullable<import("zod").ZodNumber>;
256
+ supportingDocuments: import("zod").ZodArray<import("zod").ZodObject<{
257
+ title: import("zod").ZodString;
258
+ documentId: import("zod").ZodString;
259
+ }, import("zod/v4/core").$strip>>;
260
+ bodyHtmlUrl: import("zod").ZodString;
261
+ rawTextUrl: import("zod").ZodString;
262
+ htmlUrl: import("zod").ZodString;
263
+ fullText: import("zod").ZodOptional<import("zod").ZodString>;
264
+ }, import("zod/v4/core").$strip>, readonly [{
265
+ readonly reason: "not_found";
266
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
267
+ readonly when: "No Federal Register document exists with that number.";
268
+ readonly recovery: "Verify the number via regulations_search_rules; FR numbers look like \"2025-14555\".";
269
+ }, {
270
+ readonly reason: "upstream_unavailable";
271
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
272
+ readonly when: "Federal Register returned a 5xx, timed out, or served an HTML error page.";
273
+ readonly recovery: "Retry after a brief wait; the Federal Register API may be momentarily down.";
274
+ }], undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
275
+ query: import("zod").ZodOptional<import("zod").ZodString>;
276
+ agencies: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
277
+ closing_before: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodLiteral<"">, import("zod").ZodString]>>;
278
+ per_page: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
279
+ page: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
280
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
281
+ asOf: import("zod").ZodString;
282
+ keyed: import("zod").ZodBoolean;
283
+ results: import("zod").ZodArray<import("zod").ZodObject<{
284
+ documentNumber: import("zod").ZodString;
285
+ title: import("zod").ZodString;
286
+ type: import("zod").ZodString;
287
+ agencies: import("zod").ZodArray<import("zod").ZodString>;
288
+ publicationDate: import("zod").ZodString;
289
+ commentsCloseOn: import("zod").ZodString;
290
+ daysRemaining: import("zod").ZodNumber;
291
+ docketIds: import("zod").ZodArray<import("zod").ZodString>;
292
+ commentCount: import("zod").ZodNullable<import("zod").ZodNumber>;
293
+ }, import("zod/v4/core").$strip>>;
294
+ }, import("zod/v4/core").$strip>, readonly [{
295
+ readonly reason: "no_results";
296
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
297
+ readonly when: "No rules open for comment match the filters.";
298
+ readonly recovery: "Drop the agency or closing_before filter — fewer rules are open than you might expect at any moment.";
299
+ }, {
300
+ readonly reason: "upstream_unavailable";
301
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
302
+ readonly when: "Federal Register returned a 5xx, timed out, or served an HTML error page.";
303
+ readonly recovery: "Retry after a brief wait; the Federal Register API may be momentarily down.";
304
+ }], {
305
+ readonly totalCount: import("zod").ZodNumber;
306
+ readonly truncated: import("zod").ZodOptional<import("zod").ZodBoolean>;
307
+ readonly shown: import("zod").ZodOptional<import("zod").ZodNumber>;
308
+ readonly notice: import("zod").ZodOptional<import("zod").ZodString>;
309
+ }> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
310
+ query: import("zod").ZodOptional<import("zod").ZodString>;
311
+ type: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodEnum<{
312
+ PRORULE: "PRORULE";
313
+ RULE: "RULE";
314
+ NOTICE: "NOTICE";
315
+ PRESDOCU: "PRESDOCU";
316
+ }>>>;
317
+ agencies: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
318
+ published_after: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodLiteral<"">, import("zod").ZodString]>>;
319
+ published_before: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodLiteral<"">, import("zod").ZodString]>>;
320
+ per_page: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
321
+ page: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodNumber>>;
322
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
323
+ results: import("zod").ZodArray<import("zod").ZodObject<{
324
+ documentNumber: import("zod").ZodString;
325
+ title: import("zod").ZodString;
326
+ type: import("zod").ZodString;
327
+ abstract: import("zod").ZodNullable<import("zod").ZodString>;
328
+ publicationDate: import("zod").ZodString;
329
+ agencies: import("zod").ZodArray<import("zod").ZodString>;
330
+ docketIds: import("zod").ZodArray<import("zod").ZodString>;
331
+ regulationIdNumbers: import("zod").ZodArray<import("zod").ZodString>;
332
+ cfrReferences: import("zod").ZodArray<import("zod").ZodObject<{
333
+ title: import("zod").ZodNumber;
334
+ part: import("zod").ZodString;
335
+ }, import("zod/v4/core").$strip>>;
336
+ commentsCloseOn: import("zod").ZodNullable<import("zod").ZodString>;
337
+ effectiveOn: import("zod").ZodNullable<import("zod").ZodString>;
338
+ htmlUrl: import("zod").ZodString;
339
+ }, import("zod/v4/core").$strip>>;
340
+ }, import("zod/v4/core").$strip>, readonly [{
341
+ readonly reason: "no_results";
342
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
343
+ readonly when: "Zero matches for the query and filters.";
344
+ readonly recovery: "Broaden the query, widen the date range, or drop an agency filter and retry.";
345
+ }, {
346
+ readonly reason: "upstream_unavailable";
347
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.ServiceUnavailable;
348
+ readonly when: "Federal Register returned a 5xx, timed out, or served an HTML error page.";
349
+ readonly recovery: "Retry after a brief wait; the Federal Register API may be momentarily down.";
350
+ }], {
351
+ readonly totalCount: import("zod").ZodNumber;
352
+ readonly truncated: import("zod").ZodOptional<import("zod").ZodBoolean>;
353
+ readonly shown: import("zod").ZodOptional<import("zod").ZodNumber>;
354
+ readonly notice: import("zod").ZodOptional<import("zod").ZodString>;
355
+ }>)[];
356
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAQ9B,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @fileoverview Barrel of all tool definitions for federal-regulations-mcp-server.
3
+ * @module mcp-server/tools/definitions/index
4
+ */
5
+ import { browseCfrTool } from './browse-cfr.tool.js';
6
+ import { findCommentsTool } from './find-comments.tool.js';
7
+ import { getCfrSectionTool } from './get-cfr-section.tool.js';
8
+ import { getDocketTool } from './get-docket.tool.js';
9
+ import { getDocumentTool } from './get-document.tool.js';
10
+ import { listOpenCommentsTool } from './list-open-comments.tool.js';
11
+ import { searchRulesTool } from './search-rules.tool.js';
12
+ export const allToolDefinitions = [
13
+ searchRulesTool,
14
+ getDocumentTool,
15
+ browseCfrTool,
16
+ getCfrSectionTool,
17
+ getDocketTool,
18
+ findCommentsTool,
19
+ listOpenCommentsTool,
20
+ ];
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,eAAe;IACf,eAAe;IACf,aAAa;IACb,iBAAiB;IACjB,aAAa;IACb,gBAAgB;IAChB,oBAAoB;CACrB,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @fileoverview regulations_list_open_comments — rules currently open for public
3
+ * comment, filterable by agency and topic. "What can I still weigh in on?" Runs on
4
+ * the Federal Register's open-comment window (keyless); the comment count is read
5
+ * from each FR document's own embedded Regulations.gov info when a key is present.
6
+ * Degrades gracefully — fully functional without the key.
7
+ * @module mcp-server/tools/definitions/list-open-comments.tool
8
+ */
9
+ import { z } from '@cyanheads/mcp-ts-core';
10
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
11
+ export declare const listOpenCommentsTool: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
12
+ query: z.ZodOptional<z.ZodString>;
13
+ agencies: z.ZodOptional<z.ZodArray<z.ZodString>>;
14
+ closing_before: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"">, z.ZodString]>>;
15
+ per_page: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
16
+ page: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
17
+ }, z.core.$strip>, z.ZodObject<{
18
+ asOf: z.ZodString;
19
+ keyed: z.ZodBoolean;
20
+ results: z.ZodArray<z.ZodObject<{
21
+ documentNumber: z.ZodString;
22
+ title: z.ZodString;
23
+ type: z.ZodString;
24
+ agencies: z.ZodArray<z.ZodString>;
25
+ publicationDate: z.ZodString;
26
+ commentsCloseOn: z.ZodString;
27
+ daysRemaining: z.ZodNumber;
28
+ docketIds: z.ZodArray<z.ZodString>;
29
+ commentCount: z.ZodNullable<z.ZodNumber>;
30
+ }, z.core.$strip>>;
31
+ }, z.core.$strip>, readonly [{
32
+ readonly reason: "no_results";
33
+ readonly code: JsonRpcErrorCode.NotFound;
34
+ readonly when: "No rules open for comment match the filters.";
35
+ readonly recovery: "Drop the agency or closing_before filter — fewer rules are open than you might expect at any moment.";
36
+ }, {
37
+ readonly reason: "upstream_unavailable";
38
+ readonly code: JsonRpcErrorCode.ServiceUnavailable;
39
+ readonly when: "Federal Register returned a 5xx, timed out, or served an HTML error page.";
40
+ readonly recovery: "Retry after a brief wait; the Federal Register API may be momentarily down.";
41
+ }], {
42
+ readonly totalCount: z.ZodNumber;
43
+ readonly truncated: z.ZodOptional<z.ZodBoolean>;
44
+ readonly shown: z.ZodOptional<z.ZodNumber>;
45
+ readonly notice: z.ZodOptional<z.ZodString>;
46
+ }>;
47
+ //# sourceMappingURL=list-open-comments.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-open-comments.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/list-open-comments.tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAgBjE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2L/B,CAAC"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * @fileoverview regulations_list_open_comments — rules currently open for public
3
+ * comment, filterable by agency and topic. "What can I still weigh in on?" Runs on
4
+ * the Federal Register's open-comment window (keyless); the comment count is read
5
+ * from each FR document's own embedded Regulations.gov info when a key is present.
6
+ * Degrades gracefully — fully functional without the key.
7
+ * @module mcp-server/tools/definitions/list-open-comments.tool
8
+ */
9
+ import { tool, z } from '@cyanheads/mcp-ts-core';
10
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
11
+ import { today } from '../../../services/ecfr/ecfr-service.js';
12
+ import { getFederalRegisterService } from '../../../services/federal-register/federal-register-service.js';
13
+ import { getRegulationsGovService } from '../../../services/regulations-gov/regulations-gov-service.js';
14
+ import { escapePipes } from './format-utils.js';
15
+ const FR_NAV_CEILING = 5000;
16
+ /** Whole days from `asOf` (YYYY-MM-DD) to `close` (YYYY-MM-DD); negative clamped to 0. */
17
+ function daysBetween(asOf, close) {
18
+ const a = Date.parse(`${asOf}T00:00:00Z`);
19
+ const c = Date.parse(`${close}T00:00:00Z`);
20
+ if (Number.isNaN(a) || Number.isNaN(c))
21
+ return 0;
22
+ return Math.max(0, Math.round((c - a) / 86_400_000));
23
+ }
24
+ export const listOpenCommentsTool = tool('regulations_list_open_comments', {
25
+ title: 'regulations_list_open_comments',
26
+ description: 'List rules currently open for public comment, filterable by agency slug and topic, sorted by closing date (soonest first). "What can I still weigh in on?" Runs on the Federal Register\'s open-comment window and is fully functional without a key. When REGULATIONS_GOV_API_KEY is configured, each row is enriched with the comment count from the Federal Register document\'s embedded Regulations.gov info (no extra rate-limited call). Open one row with regulations_get_document for the full proposal, or pull the comments with regulations_find_comments.',
27
+ annotations: { readOnlyHint: true, openWorldHint: true },
28
+ input: z.object({
29
+ query: z
30
+ .string()
31
+ .optional()
32
+ .describe('Full-text filter across open rules. Omit to list all rules currently open for comment.'),
33
+ agencies: z
34
+ .array(z.string())
35
+ .optional()
36
+ .describe('Filter to one or more agencies by Federal Register agency slug (e.g. "environmental-protection-agency").'),
37
+ closing_before: z
38
+ .union([
39
+ z.literal(''),
40
+ z
41
+ .string()
42
+ .regex(/^\d{4}-\d{2}-\d{2}$/)
43
+ .describe('ISO 8601 date (YYYY-MM-DD).'),
44
+ ])
45
+ .optional()
46
+ .describe('Only rules whose comment period closes on or before this date, ISO 8601 (YYYY-MM-DD). Use to find deadlines you need to act on soon.'),
47
+ per_page: z
48
+ .number()
49
+ .int()
50
+ .min(1)
51
+ .max(100)
52
+ .optional()
53
+ .default(20)
54
+ .describe('Results per page (1–100, default 20).'),
55
+ page: z
56
+ .number()
57
+ .int()
58
+ .min(1)
59
+ .max(50)
60
+ .optional()
61
+ .default(1)
62
+ .describe('Page number (1–50). The FR caps total_pages at 50; with per_page=100 this covers up to 5,000 open rules.'),
63
+ }),
64
+ output: z.object({
65
+ asOf: z.string().describe('The "today" the open-window filter used (ISO 8601).'),
66
+ keyed: z
67
+ .boolean()
68
+ .describe('Whether comment counts were enriched (REGULATIONS_GOV_API_KEY present).'),
69
+ results: z
70
+ .array(z
71
+ .object({
72
+ documentNumber: z
73
+ .string()
74
+ .describe('Federal Register document number — chains into regulations_get_document.'),
75
+ title: z.string().describe('Rule title.'),
76
+ type: z.string().describe('Document type.'),
77
+ agencies: z.array(z.string()).describe('Issuing agency names.'),
78
+ publicationDate: z.string().describe('Publication date (ISO 8601).'),
79
+ commentsCloseOn: z.string().describe('Comment-period close date (ISO 8601).'),
80
+ daysRemaining: z
81
+ .number()
82
+ .describe('Whole days from asOf until the comment period closes.'),
83
+ docketIds: z
84
+ .array(z.string())
85
+ .describe('Docket IDs — chain into regulations_get_docket / find_comments.'),
86
+ commentCount: z
87
+ .number()
88
+ .nullable()
89
+ .describe("Comment count from the FR document's Regulations.gov info; null when unkeyed or not on Regulations.gov."),
90
+ })
91
+ .describe('One open-for-comment rule.'))
92
+ .describe('Rules open for comment (this page), closing soonest first.'),
93
+ }),
94
+ enrichment: {
95
+ totalCount: z.number().describe('Total rules open for comment matching the filters.'),
96
+ truncated: z
97
+ .boolean()
98
+ .optional()
99
+ .describe('True when matches exceed the FR 5,000-record navigation ceiling.'),
100
+ shown: z.number().optional().describe('Results returned on this page.'),
101
+ notice: z
102
+ .string()
103
+ .optional()
104
+ .describe('Guidance when nothing matched, or that comment counts are unavailable without a key.'),
105
+ },
106
+ errors: [
107
+ {
108
+ reason: 'no_results',
109
+ code: JsonRpcErrorCode.NotFound,
110
+ when: 'No rules open for comment match the filters.',
111
+ recovery: 'Drop the agency or closing_before filter — fewer rules are open than you might expect at any moment.',
112
+ },
113
+ {
114
+ reason: 'upstream_unavailable',
115
+ code: JsonRpcErrorCode.ServiceUnavailable,
116
+ when: 'Federal Register returned a 5xx, timed out, or served an HTML error page.',
117
+ recovery: 'Retry after a brief wait; the Federal Register API may be momentarily down.',
118
+ },
119
+ ],
120
+ async handler(input, ctx) {
121
+ const fr = getFederalRegisterService();
122
+ const keyed = getRegulationsGovService().hasKey();
123
+ const asOf = today();
124
+ const response = await fr.listOpenComments({
125
+ query: input.query || undefined,
126
+ agencies: input.agencies?.length ? input.agencies : undefined,
127
+ closingBefore: input.closing_before || undefined,
128
+ perPage: input.per_page,
129
+ page: input.page,
130
+ }, asOf, ctx);
131
+ ctx.enrich.total(response.totalCount);
132
+ if (response.results.length === 0) {
133
+ ctx.enrich.notice('No rules are open for comment matching the filters. Drop the agency or closing_before filter.');
134
+ return { asOf, keyed, results: [] };
135
+ }
136
+ const results = response.results
137
+ .map((r) => ({
138
+ documentNumber: r.documentNumber,
139
+ title: r.title,
140
+ type: r.type,
141
+ agencies: r.agencies,
142
+ publicationDate: r.publicationDate,
143
+ commentsCloseOn: r.commentsCloseOn,
144
+ daysRemaining: daysBetween(asOf, r.commentsCloseOn),
145
+ docketIds: r.docketIds,
146
+ // Counts come from the FR document's own regulations_dot_gov_info block;
147
+ // only surfaced when a key is configured (the degrade contract).
148
+ commentCount: keyed ? r.commentCount : null,
149
+ }))
150
+ .sort((a, b) => a.daysRemaining - b.daysRemaining);
151
+ if (!keyed) {
152
+ ctx.enrich.notice('Comment counts are unavailable without REGULATIONS_GOV_API_KEY (free at https://api.data.gov/signup/). The open-rule list itself is complete.');
153
+ }
154
+ else if (response.totalCount > FR_NAV_CEILING) {
155
+ ctx.enrich.truncated({
156
+ shown: results.length,
157
+ cap: FR_NAV_CEILING,
158
+ guidance: `${response.totalCount} open rules exceed the 5,000-record navigation ceiling. Narrow by agency or closing_before.`,
159
+ });
160
+ }
161
+ return { asOf, keyed, results };
162
+ },
163
+ format: (result) => {
164
+ const lines = [
165
+ `**Rules open for comment** (as of ${result.asOf} · keyed: ${result.keyed ? 'yes' : 'no — comment counts unavailable'})`,
166
+ '',
167
+ ];
168
+ lines.push('| Title | Type | Agency | Published | Closes | Days Left | Comments | Docket |');
169
+ lines.push('|---|---|---|---|---|---|---|---|');
170
+ for (const r of result.results) {
171
+ const agency = r.agencies[0] ?? '—';
172
+ const docket = r.docketIds[0] ?? '—';
173
+ const count = r.commentCount != null ? String(r.commentCount) : '—';
174
+ lines.push(`| ${escapePipes(r.title)} [FR ${r.documentNumber}] | ${r.type} | ${escapePipes(agency)} | ${r.publicationDate} | ${r.commentsCloseOn} | ${r.daysRemaining} | ${count} | ${docket} |`);
175
+ }
176
+ return [{ type: 'text', text: lines.join('\n') }];
177
+ },
178
+ });
179
+ //# sourceMappingURL=list-open-comments.tool.js.map