@cyanheads/ris-austria-mcp-server 0.1.5

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 (154) hide show
  1. package/AGENTS.md +401 -0
  2. package/CLAUDE.md +401 -0
  3. package/Dockerfile +125 -0
  4. package/LICENSE +201 -0
  5. package/README.md +309 -0
  6. package/changelog/0.1.x/0.1.0.md +25 -0
  7. package/changelog/0.1.x/0.1.1.md +24 -0
  8. package/changelog/0.1.x/0.1.2.md +16 -0
  9. package/changelog/0.1.x/0.1.3.md +11 -0
  10. package/changelog/0.1.x/0.1.4.md +11 -0
  11. package/changelog/0.1.x/0.1.5.md +18 -0
  12. package/changelog/template.md +129 -0
  13. package/dist/config/server-config.d.ts +19 -0
  14. package/dist/config/server-config.d.ts.map +1 -0
  15. package/dist/config/server-config.js +35 -0
  16. package/dist/config/server-config.js.map +1 -0
  17. package/dist/index.d.ts +7 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +37 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/mcp-server/resources/definitions/ris-document.resource.d.ts +30 -0
  22. package/dist/mcp-server/resources/definitions/ris-document.resource.d.ts.map +1 -0
  23. package/dist/mcp-server/resources/definitions/ris-document.resource.js +75 -0
  24. package/dist/mcp-server/resources/definitions/ris-document.resource.js.map +1 -0
  25. package/dist/mcp-server/tools/definitions/_shared.d.ts +8 -0
  26. package/dist/mcp-server/tools/definitions/_shared.d.ts.map +1 -0
  27. package/dist/mcp-server/tools/definitions/_shared.js +10 -0
  28. package/dist/mcp-server/tools/definitions/_shared.js.map +1 -0
  29. package/dist/mcp-server/tools/definitions/ris-get-document.tool.d.ts +189 -0
  30. package/dist/mcp-server/tools/definitions/ris-get-document.tool.d.ts.map +1 -0
  31. package/dist/mcp-server/tools/definitions/ris-get-document.tool.js +504 -0
  32. package/dist/mcp-server/tools/definitions/ris-get-document.tool.js.map +1 -0
  33. package/dist/mcp-server/tools/definitions/ris-list-reference.tool.d.ts +42 -0
  34. package/dist/mcp-server/tools/definitions/ris-list-reference.tool.d.ts.map +1 -0
  35. package/dist/mcp-server/tools/definitions/ris-list-reference.tool.js +316 -0
  36. package/dist/mcp-server/tools/definitions/ris-list-reference.tool.js.map +1 -0
  37. package/dist/mcp-server/tools/definitions/ris-lookup-citation.tool.d.ts +80 -0
  38. package/dist/mcp-server/tools/definitions/ris-lookup-citation.tool.d.ts.map +1 -0
  39. package/dist/mcp-server/tools/definitions/ris-lookup-citation.tool.js +529 -0
  40. package/dist/mcp-server/tools/definitions/ris-lookup-citation.tool.js.map +1 -0
  41. package/dist/mcp-server/tools/definitions/ris-search-announcements.tool.d.ts +118 -0
  42. package/dist/mcp-server/tools/definitions/ris-search-announcements.tool.d.ts.map +1 -0
  43. package/dist/mcp-server/tools/definitions/ris-search-announcements.tool.js +389 -0
  44. package/dist/mcp-server/tools/definitions/ris-search-announcements.tool.js.map +1 -0
  45. package/dist/mcp-server/tools/definitions/ris-search-case-law.tool.d.ts +178 -0
  46. package/dist/mcp-server/tools/definitions/ris-search-case-law.tool.d.ts.map +1 -0
  47. package/dist/mcp-server/tools/definitions/ris-search-case-law.tool.js +495 -0
  48. package/dist/mcp-server/tools/definitions/ris-search-case-law.tool.js.map +1 -0
  49. package/dist/mcp-server/tools/definitions/ris-search-drafts.tool.d.ts +80 -0
  50. package/dist/mcp-server/tools/definitions/ris-search-drafts.tool.d.ts.map +1 -0
  51. package/dist/mcp-server/tools/definitions/ris-search-drafts.tool.js +264 -0
  52. package/dist/mcp-server/tools/definitions/ris-search-drafts.tool.js.map +1 -0
  53. package/dist/mcp-server/tools/definitions/ris-search-gazette.tool.d.ts +147 -0
  54. package/dist/mcp-server/tools/definitions/ris-search-gazette.tool.d.ts.map +1 -0
  55. package/dist/mcp-server/tools/definitions/ris-search-gazette.tool.js +509 -0
  56. package/dist/mcp-server/tools/definitions/ris-search-gazette.tool.js.map +1 -0
  57. package/dist/mcp-server/tools/definitions/ris-search-legislation.tool.d.ts +145 -0
  58. package/dist/mcp-server/tools/definitions/ris-search-legislation.tool.d.ts.map +1 -0
  59. package/dist/mcp-server/tools/definitions/ris-search-legislation.tool.js +466 -0
  60. package/dist/mcp-server/tools/definitions/ris-search-legislation.tool.js.map +1 -0
  61. package/dist/mcp-server/tools/definitions/ris-track-changes.tool.d.ts +73 -0
  62. package/dist/mcp-server/tools/definitions/ris-track-changes.tool.d.ts.map +1 -0
  63. package/dist/mcp-server/tools/definitions/ris-track-changes.tool.js +265 -0
  64. package/dist/mcp-server/tools/definitions/ris-track-changes.tool.js.map +1 -0
  65. package/dist/services/ris/normalizer.d.ts +40 -0
  66. package/dist/services/ris/normalizer.d.ts.map +1 -0
  67. package/dist/services/ris/normalizer.js +480 -0
  68. package/dist/services/ris/normalizer.js.map +1 -0
  69. package/dist/services/ris/reference/applications.d.ts +529 -0
  70. package/dist/services/ris/reference/applications.d.ts.map +1 -0
  71. package/dist/services/ris/reference/applications.js +520 -0
  72. package/dist/services/ris/reference/applications.js.map +1 -0
  73. package/dist/services/ris/reference/changed-since-intervals.d.ts +42 -0
  74. package/dist/services/ris/reference/changed-since-intervals.d.ts.map +1 -0
  75. package/dist/services/ris/reference/changed-since-intervals.js +16 -0
  76. package/dist/services/ris/reference/changed-since-intervals.js.map +1 -0
  77. package/dist/services/ris/reference/citation-formats.d.ts +39 -0
  78. package/dist/services/ris/reference/citation-formats.d.ts.map +1 -0
  79. package/dist/services/ris/reference/citation-formats.js +39 -0
  80. package/dist/services/ris/reference/citation-formats.js.map +1 -0
  81. package/dist/services/ris/reference/collections.d.ts +82 -0
  82. package/dist/services/ris/reference/collections.d.ts.map +1 -0
  83. package/dist/services/ris/reference/collections.js +102 -0
  84. package/dist/services/ris/reference/collections.js.map +1 -0
  85. package/dist/services/ris/reference/courts.d.ts +201 -0
  86. package/dist/services/ris/reference/courts.d.ts.map +1 -0
  87. package/dist/services/ris/reference/courts.js +198 -0
  88. package/dist/services/ris/reference/courts.js.map +1 -0
  89. package/dist/services/ris/reference/decision-kinds.d.ts +78 -0
  90. package/dist/services/ris/reference/decision-kinds.d.ts.map +1 -0
  91. package/dist/services/ris/reference/decision-kinds.js +117 -0
  92. package/dist/services/ris/reference/decision-kinds.js.map +1 -0
  93. package/dist/services/ris/reference/decision-types.d.ts +36 -0
  94. package/dist/services/ris/reference/decision-types.d.ts.map +1 -0
  95. package/dist/services/ris/reference/decision-types.js +29 -0
  96. package/dist/services/ris/reference/decision-types.js.map +1 -0
  97. package/dist/services/ris/reference/district-authorities.d.ts +314 -0
  98. package/dist/services/ris/reference/district-authorities.d.ts.map +1 -0
  99. package/dist/services/ris/reference/district-authorities.js +212 -0
  100. package/dist/services/ris/reference/district-authorities.js.map +1 -0
  101. package/dist/services/ris/reference/gazette-parts.d.ts +73 -0
  102. package/dist/services/ris/reference/gazette-parts.d.ts.map +1 -0
  103. package/dist/services/ris/reference/gazette-parts.js +58 -0
  104. package/dist/services/ris/reference/gazette-parts.js.map +1 -0
  105. package/dist/services/ris/reference/index.d.ts +23 -0
  106. package/dist/services/ris/reference/index.d.ts.map +1 -0
  107. package/dist/services/ris/reference/index.js +23 -0
  108. package/dist/services/ris/reference/index.js.map +1 -0
  109. package/dist/services/ris/reference/issuing-bodies.d.ts +642 -0
  110. package/dist/services/ris/reference/issuing-bodies.d.ts.map +1 -0
  111. package/dist/services/ris/reference/issuing-bodies.js +616 -0
  112. package/dist/services/ris/reference/issuing-bodies.js.map +1 -0
  113. package/dist/services/ris/reference/justiz-subject-areas.d.ts +133 -0
  114. package/dist/services/ris/reference/justiz-subject-areas.d.ts.map +1 -0
  115. package/dist/services/ris/reference/justiz-subject-areas.js +67 -0
  116. package/dist/services/ris/reference/justiz-subject-areas.js.map +1 -0
  117. package/dist/services/ris/reference/law-types.d.ts +46 -0
  118. package/dist/services/ris/reference/law-types.d.ts.map +1 -0
  119. package/dist/services/ris/reference/law-types.js +41 -0
  120. package/dist/services/ris/reference/law-types.js.map +1 -0
  121. package/dist/services/ris/reference/ministries.d.ts +360 -0
  122. package/dist/services/ris/reference/ministries.d.ts.map +1 -0
  123. package/dist/services/ris/reference/ministries.js +408 -0
  124. package/dist/services/ris/reference/ministries.js.map +1 -0
  125. package/dist/services/ris/reference/search-syntax.d.ts +66 -0
  126. package/dist/services/ris/reference/search-syntax.d.ts.map +1 -0
  127. package/dist/services/ris/reference/search-syntax.js +65 -0
  128. package/dist/services/ris/reference/search-syntax.js.map +1 -0
  129. package/dist/services/ris/reference/section-types.d.ts +33 -0
  130. package/dist/services/ris/reference/section-types.d.ts.map +1 -0
  131. package/dist/services/ris/reference/section-types.js +29 -0
  132. package/dist/services/ris/reference/section-types.js.map +1 -0
  133. package/dist/services/ris/reference/stages.d.ts +41 -0
  134. package/dist/services/ris/reference/stages.d.ts.map +1 -0
  135. package/dist/services/ris/reference/stages.js +27 -0
  136. package/dist/services/ris/reference/stages.js.map +1 -0
  137. package/dist/services/ris/reference/states.d.ts +90 -0
  138. package/dist/services/ris/reference/states.d.ts.map +1 -0
  139. package/dist/services/ris/reference/states.js +85 -0
  140. package/dist/services/ris/reference/states.js.map +1 -0
  141. package/dist/services/ris/request-builder.d.ts +195 -0
  142. package/dist/services/ris/request-builder.d.ts.map +1 -0
  143. package/dist/services/ris/request-builder.js +673 -0
  144. package/dist/services/ris/request-builder.js.map +1 -0
  145. package/dist/services/ris/ris-service.d.ts +65 -0
  146. package/dist/services/ris/ris-service.d.ts.map +1 -0
  147. package/dist/services/ris/ris-service.js +200 -0
  148. package/dist/services/ris/ris-service.js.map +1 -0
  149. package/dist/services/ris/types.d.ts +651 -0
  150. package/dist/services/ris/types.d.ts.map +1 -0
  151. package/dist/services/ris/types.js +11 -0
  152. package/dist/services/ris/types.js.map +1 -0
  153. package/package.json +108 -0
  154. package/server.json +111 -0
@@ -0,0 +1,264 @@
1
+ /**
2
+ * @fileoverview ris_search_drafts — search the federal lawmaking pipeline before promulgation:
3
+ * ministerial review drafts (Begut) and government bills adopted by the council of ministers
4
+ * (RegV, 2004+). `stage` routes to the owning application; the two stage-specific date filters
5
+ * (in_review_on, decided_from/to) are guarded locally before any upstream call. Ministry inputs
6
+ * accept an abbreviation ("BMF") — the service expands it to RIS's exact-match designation.
7
+ * @module mcp-server/tools/definitions/ris-search-drafts
8
+ */
9
+ import { tool, z } from '@cyanheads/mcp-ts-core';
10
+ import { JsonRpcErrorCode, McpError } from '@cyanheads/mcp-ts-core/errors';
11
+ import { RIS_CHANGED_SINCE_INTERVALS, RIS_STAGES } from '../../../services/ris/reference/index.js';
12
+ import { getRisService } from '../../../services/ris/ris-service.js';
13
+ import { isoDateString } from './_shared.js';
14
+ const STAGE_CODES = RIS_STAGES.map((s) => s.code);
15
+ const CHANGED_SINCE_CODES = RIS_CHANGED_SINCE_INTERVALS.map((i) => i.code);
16
+ /** Map an empty string from a form-based client to `undefined`. */
17
+ function meaningful(value) {
18
+ return value !== undefined && value !== '' ? value : undefined;
19
+ }
20
+ const ContentUrlsSchema = z
21
+ .object({
22
+ xml: z.string().optional().describe('XML rendition URL (RIS Nutzdaten schema).'),
23
+ html: z.string().optional().describe('HTML rendition URL.'),
24
+ pdf: z.string().optional().describe('PDF rendition URL.'),
25
+ rtf: z.string().optional().describe('RTF rendition URL.'),
26
+ })
27
+ .describe('Rendition URLs of the main document (attachments are excluded).');
28
+ const DraftRecordSchema = z
29
+ .object({
30
+ document_number: z
31
+ .string()
32
+ .describe('Technical RIS document number (BEGUT_… or REGV_-prefixed) — pass together with the stage’s application to ris_get_document.'),
33
+ stage: z
34
+ .string()
35
+ .describe('Pipeline stage the record belongs to: review_drafts (Begut) or government_bills (RegV).'),
36
+ title: z.string().optional().describe('Full document title, HTML markup stripped.'),
37
+ short_title: z.string().optional().describe('Short title (Kurztitel), where assigned.'),
38
+ ministry: z
39
+ .string()
40
+ .optional()
41
+ .describe('Submitting ministry (EinbringendeStelle / Organ), where the record carries one.'),
42
+ review_deadline: z
43
+ .string()
44
+ .optional()
45
+ .describe('End of the public review window (Ende der Begutachtungsfrist) — review_drafts only.'),
46
+ decided: z
47
+ .string()
48
+ .optional()
49
+ .describe('Council-of-ministers adoption date (Beschlussdatum) — government_bills only.'),
50
+ content_urls: ContentUrlsSchema,
51
+ })
52
+ .describe('One pipeline document — a review draft or a government bill.');
53
+ /** Pick the four core rendition URLs off a normalized hit. */
54
+ function pickContentUrls(hit) {
55
+ const { html, pdf, rtf, xml } = hit.contentUrls;
56
+ return {
57
+ ...(xml !== undefined && { xml }),
58
+ ...(html !== undefined && { html }),
59
+ ...(pdf !== undefined && { pdf }),
60
+ ...(rtf !== undefined && { rtf }),
61
+ };
62
+ }
63
+ /** Map a normalized RIS hit (Begut/RegV ride the Bundesrecht controller) to the record shape. */
64
+ function toRecord(hit, stage) {
65
+ const base = {
66
+ content_urls: pickContentUrls(hit),
67
+ document_number: hit.documentNumber,
68
+ stage,
69
+ };
70
+ const md = hit.metadata;
71
+ if (md.controller === 'Bundesrecht') {
72
+ const ministry = md.ministry ?? hit.submitter ?? hit.organ;
73
+ return {
74
+ ...base,
75
+ ...(md.decided !== undefined && { decided: md.decided }),
76
+ ...(ministry !== undefined && { ministry }),
77
+ ...(md.reviewDeadline !== undefined && { review_deadline: md.reviewDeadline }),
78
+ ...(md.shortTitle !== undefined && { short_title: md.shortTitle }),
79
+ ...(md.title !== undefined && { title: md.title }),
80
+ };
81
+ }
82
+ return base;
83
+ }
84
+ export const risSearchDrafts = tool('ris_search_drafts', {
85
+ title: 'Search Draft Legislation',
86
+ description: 'Search Austria’s federal lawmaking pipeline BEFORE promulgation — the monitoring counterpart to ris_search_gazette (what will become law). stage selects the phase: review_drafts (Begutachtungsentwürfe — draft laws a ministry has put into public review, before any government bill exists) or government_bills (Regierungsvorlagen — bills the council of ministers adopted and submitted to parliament, 2004+). Filter by query (full text), title, ministry (accepts an abbreviation like "BMF" — expanded server-side to RIS’s exact designation; the historical name at submission time counts), in_review_on (review_drafts only — drafts whose review window covers the date; today = "what is in Begutachtung right now"), or decided_from/to (government_bills only — council adoption date). changed_since gives coarse recency. Documents are preparatory, not binding law. Ministry codes: ris_list_reference topic ministries.',
87
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
88
+ input: z.object({
89
+ stage: z
90
+ .enum(STAGE_CODES)
91
+ .describe('Which pipeline stage to search — one per call. review_drafts (Begut, ministerial review) or government_bills (RegV, council-adopted bills). Details: ris_list_reference topic stages.'),
92
+ query: z
93
+ .string()
94
+ .optional()
95
+ .describe('Full-text search (Suchworte). Boolean operators UND/ODER/NICHT or AND/OR/NOT, parentheses, quoted phrases; wildcard * is trailing-only.'),
96
+ title: z
97
+ .string()
98
+ .optional()
99
+ .describe('Title search (Titel) — phrase field: * allowed leading or trailing with ≥2 characters beside it.'),
100
+ ministry: z
101
+ .string()
102
+ .optional()
103
+ .describe('Submitting ministry (EinbringendeStelle). Accepts an abbreviation ("BMF") — expanded server-side to RIS’s exact-match designation; use the ministry’s name at the time of submission. Table: ris_list_reference topic ministries.'),
104
+ in_review_on: isoDateString
105
+ .optional()
106
+ .describe('review_drafts only. Drafts whose public-review window covers this date (YYYY-MM-DD). Today = drafts currently in Begutachtung.'),
107
+ decided_from: isoDateString
108
+ .optional()
109
+ .describe('government_bills only. Earliest council-of-ministers adoption date (YYYY-MM-DD).'),
110
+ decided_to: isoDateString
111
+ .optional()
112
+ .describe('government_bills only. Latest adoption date (YYYY-MM-DD).'),
113
+ changed_since: z
114
+ .enum(CHANGED_SINCE_CODES)
115
+ .optional()
116
+ .describe('Coarse recency filter — documents changed in RIS within the interval. For exact windows use ris_track_changes.'),
117
+ sort_by: z
118
+ .enum(['date', 'ministry', 'title'])
119
+ .optional()
120
+ .describe('Sort column: date (review deadline or adoption date per stage), ministry, or title. Default: upstream order.'),
121
+ sort_direction: z
122
+ .enum(['ascending', 'descending'])
123
+ .optional()
124
+ .describe('Sort direction; applies with sort_by.'),
125
+ page: z.number().int().min(1).optional().describe('1-based result page. Default 1.'),
126
+ page_size: z
127
+ .union([z.literal(10), z.literal(20), z.literal(50), z.literal(100)])
128
+ .optional()
129
+ .describe('Documents per page — RIS accepts 10, 20, 50, or 100. Default 20.'),
130
+ }),
131
+ output: z.object({
132
+ results: z
133
+ .array(DraftRecordSchema)
134
+ .describe('Matching pipeline documents for the requested page. Totals and paging in enrichment.'),
135
+ }),
136
+ enrichment: {
137
+ totalCount: z.number().describe('Total matching documents across all pages.'),
138
+ page: z.number().describe('1-based page number RIS served.'),
139
+ pageSize: z.number().describe('Page size RIS applied.'),
140
+ truncated: z
141
+ .boolean()
142
+ .optional()
143
+ .describe('Present and true when more pages exist beyond this one — raise page to continue.'),
144
+ notice: z
145
+ .string()
146
+ .optional()
147
+ .describe('Zero-hit guidance — names the likely cause and the concrete next call.'),
148
+ },
149
+ errors: [
150
+ {
151
+ reason: 'stage_filter_mismatch',
152
+ code: JsonRpcErrorCode.ValidationError,
153
+ when: 'in_review_on was combined with stage: government_bills, or decided_from/to with stage: review_drafts — rejected locally before any upstream call; the message names the offending pair.',
154
+ recovery: 'Drop the named filter or switch stage: in_review_on applies only to stage: review_drafts; decided_from/to only to stage: government_bills.',
155
+ },
156
+ {
157
+ reason: 'invalid_query',
158
+ code: JsonRpcErrorCode.ValidationError,
159
+ when: 'RIS rejected a parameter value — the in-band Client error message is passed through verbatim; it names the invalid element and its valid values.',
160
+ recovery: 'Correct the parameter RIS names in the message. Ministry codes: ris_list_reference topic ministries.',
161
+ },
162
+ {
163
+ reason: 'upstream_error',
164
+ code: JsonRpcErrorCode.ServiceUnavailable,
165
+ when: 'RIS is unreachable, returned a server error, or served an HTML error page.',
166
+ retryable: true,
167
+ recovery: 'RIS is temporarily unavailable — retry after a short delay. If it persists, reduce page_size or narrow the query.',
168
+ },
169
+ ],
170
+ async handler(input, ctx) {
171
+ const { stage } = input;
172
+ const query = meaningful(input.query);
173
+ const title = meaningful(input.title);
174
+ const ministry = meaningful(input.ministry);
175
+ const inReviewOn = meaningful(input.in_review_on);
176
+ const decidedFrom = meaningful(input.decided_from);
177
+ const decidedTo = meaningful(input.decided_to);
178
+ const mismatch = (message) => ctx.fail('stage_filter_mismatch', message, { ...ctx.recoveryFor('stage_filter_mismatch') });
179
+ if (inReviewOn !== undefined && stage === 'government_bills') {
180
+ throw mismatch("in_review_on applies only to stage: review_drafts — got stage: 'government_bills'.");
181
+ }
182
+ if ((decidedFrom !== undefined || decidedTo !== undefined) && stage === 'review_drafts') {
183
+ throw mismatch(`${decidedFrom !== undefined ? 'decided_from' : 'decided_to'} applies only to stage: government_bills — got stage: 'review_drafts'.`);
184
+ }
185
+ const params = {
186
+ stage,
187
+ ...(query !== undefined && { query }),
188
+ ...(title !== undefined && { title }),
189
+ ...(ministry !== undefined && { ministry }),
190
+ ...(inReviewOn !== undefined && { inReviewOn }),
191
+ ...(decidedFrom !== undefined && { decidedFrom }),
192
+ ...(decidedTo !== undefined && { decidedTo }),
193
+ ...(input.changed_since !== undefined && { changedSince: input.changed_since }),
194
+ ...(input.sort_by !== undefined && { sortBy: input.sort_by }),
195
+ ...(input.sort_direction !== undefined && { sortDirection: input.sort_direction }),
196
+ ...(input.page !== undefined && { page: input.page }),
197
+ ...(input.page_size !== undefined && { pageSize: input.page_size }),
198
+ };
199
+ // Map in-band RIS errors onto this tool's declared contract so reason +
200
+ // recovery reach the wire (service-level throws carry neither).
201
+ const result = await getRisService()
202
+ .searchDrafts(params, ctx)
203
+ .catch((err) => {
204
+ if (err instanceof McpError && err.code === JsonRpcErrorCode.InvalidParams) {
205
+ throw ctx.fail('invalid_query', err.message, { ...ctx.recoveryFor('invalid_query') });
206
+ }
207
+ if (err instanceof McpError && err.code === JsonRpcErrorCode.ServiceUnavailable) {
208
+ throw ctx.fail('upstream_error', err.message, { ...ctx.recoveryFor('upstream_error') });
209
+ }
210
+ throw err;
211
+ });
212
+ ctx.log.info('Drafts search completed', {
213
+ hits: result.hits.length,
214
+ stage,
215
+ total: result.total,
216
+ });
217
+ ctx.enrich.total(result.total);
218
+ ctx.enrich({ page: result.page, pageSize: result.pageSize });
219
+ if (result.total > (result.page - 1) * result.pageSize + result.hits.length) {
220
+ ctx.enrich({ truncated: true });
221
+ }
222
+ if (result.total === 0) {
223
+ const fragments = [`0 ${stage} matched.`];
224
+ if (ministry !== undefined) {
225
+ fragments.push("ministry must match a RIS ministry designation — abbreviations are expanded server-side; the historical name at submission time counts ('BMDW', not today's successor). Table: ris_list_reference topic ministries.");
226
+ }
227
+ if (inReviewOn !== undefined) {
228
+ fragments.push(`No drafts in review on ${inReviewOn} matching the filters — drop in_review_on to search all drafts including closed reviews.`);
229
+ }
230
+ ctx.enrich.notice(fragments.join(' '));
231
+ }
232
+ return { results: result.hits.map((hit) => toRecord(hit, stage)) };
233
+ },
234
+ // format() populates content[] — the markdown twin of structuredContent. Every output
235
+ // field renders here; totals and paging ride the enrichment trailer.
236
+ format: (result) => {
237
+ if (result.results.length === 0) {
238
+ return [{ type: 'text', text: '_No pipeline documents on this page._' }];
239
+ }
240
+ const blocks = result.results.map((r) => {
241
+ const lines = [`## ${r.title ?? r.short_title ?? r.document_number}`];
242
+ lines.push(`**Document:** ${r.document_number} (${r.stage})`);
243
+ if (r.short_title !== undefined)
244
+ lines.push(`**Short title:** ${r.short_title}`);
245
+ if (r.ministry !== undefined)
246
+ lines.push(`**Ministry:** ${r.ministry}`);
247
+ const dates = [];
248
+ if (r.review_deadline !== undefined)
249
+ dates.push(`**Review deadline:** ${r.review_deadline}`);
250
+ if (r.decided !== undefined)
251
+ dates.push(`**Decided:** ${r.decided}`);
252
+ if (dates.length > 0)
253
+ lines.push(dates.join(' | '));
254
+ const urls = ['html', 'pdf', 'rtf', 'xml']
255
+ .filter((key) => r.content_urls[key] !== undefined)
256
+ .map((key) => `[${key.toUpperCase()}](${r.content_urls[key]})`);
257
+ if (urls.length > 0)
258
+ lines.push(`**Text:** ${urls.join(' · ')}`);
259
+ return lines.join('\n');
260
+ });
261
+ return [{ type: 'text', text: blocks.join('\n\n') }];
262
+ },
263
+ });
264
+ //# sourceMappingURL=ris-search-drafts.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ris-search-drafts.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/ris-search-drafts.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * @fileoverview ris_search_gazette — browse Austria's promulgation record at every level of
3
+ * government. `scope` selects the jurisdiction; the three federal era tiers (BgblAuth 2004+,
4
+ * BgblPdf 1945–2003, BgblAlt 1848–1940) are auto-routed by the year in the number or date
5
+ * range, and the resolved application is echoed in enrichment. State scopes pick a `series`
6
+ * (law vs ordinance gazette) and an `include_non_authentic` toggle; conditional filters are
7
+ * guarded locally before any upstream call. Ordinance gazettes (Vbl) currently cover Tirol
8
+ * only — a non-Tirol request short-circuits to a zero-hit notice rather than a server error.
9
+ * @module mcp-server/tools/definitions/ris-search-gazette
10
+ */
11
+ import { z } from '@cyanheads/mcp-ts-core';
12
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
13
+ import type { GazetteApplication } from '../../../services/ris/request-builder.js';
14
+ import type { RisHit } from '../../../services/ris/types.js';
15
+ export declare const GazetteRecordSchema: z.ZodObject<{
16
+ document_number: z.ZodString;
17
+ gazette_number: z.ZodOptional<z.ZodString>;
18
+ part: z.ZodOptional<z.ZodString>;
19
+ type: z.ZodOptional<z.ZodString>;
20
+ published: z.ZodOptional<z.ZodString>;
21
+ issuer: z.ZodOptional<z.ZodString>;
22
+ district_authority: z.ZodOptional<z.ZodString>;
23
+ municipality: z.ZodOptional<z.ZodString>;
24
+ title: z.ZodOptional<z.ZodString>;
25
+ short_title: z.ZodOptional<z.ZodString>;
26
+ eli: z.ZodOptional<z.ZodString>;
27
+ binding: z.ZodEnum<{
28
+ authentic: "authentic";
29
+ consolidated_informational: "consolidated_informational";
30
+ historical_record: "historical_record";
31
+ }>;
32
+ authentic_pdf_url: z.ZodOptional<z.ZodString>;
33
+ alex_url: z.ZodOptional<z.ZodString>;
34
+ document_url: z.ZodOptional<z.ZodString>;
35
+ content_urls: z.ZodObject<{
36
+ xml: z.ZodOptional<z.ZodString>;
37
+ html: z.ZodOptional<z.ZodString>;
38
+ pdf: z.ZodOptional<z.ZodString>;
39
+ rtf: z.ZodOptional<z.ZodString>;
40
+ }, z.core.$strip>;
41
+ }, z.core.$strip>;
42
+ export type GazetteRecord = z.infer<typeof GazetteRecordSchema>;
43
+ /** Map a normalized RIS hit to the tool's record shape (application drives the binding label). */
44
+ export declare function toRecord(hit: RisHit, application: GazetteApplication): GazetteRecord;
45
+ export declare const risSearchGazette: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
46
+ scope: z.ZodDefault<z.ZodEnum<{
47
+ burgenland: "burgenland";
48
+ kaernten: "kaernten";
49
+ niederoesterreich: "niederoesterreich";
50
+ oberoesterreich: "oberoesterreich";
51
+ salzburg: "salzburg";
52
+ steiermark: "steiermark";
53
+ tirol: "tirol";
54
+ vorarlberg: "vorarlberg";
55
+ wien: "wien";
56
+ district: "district";
57
+ federal: "federal";
58
+ municipal: "municipal";
59
+ }>>;
60
+ series: z.ZodOptional<z.ZodEnum<{
61
+ law_gazette: "law_gazette";
62
+ ordinance_gazette: "ordinance_gazette";
63
+ }>>;
64
+ include_non_authentic: z.ZodOptional<z.ZodBoolean>;
65
+ query: z.ZodOptional<z.ZodString>;
66
+ title: z.ZodOptional<z.ZodString>;
67
+ number: z.ZodOptional<z.ZodString>;
68
+ part: z.ZodOptional<z.ZodEnum<{
69
+ part1: "part1";
70
+ part2: "part2";
71
+ part3: "part3";
72
+ pre_1997: "pre_1997";
73
+ }>>;
74
+ type: z.ZodOptional<z.ZodEnum<{
75
+ other: "other";
76
+ announcements: "announcements";
77
+ laws: "laws";
78
+ regulations: "regulations";
79
+ }>>;
80
+ published_from: z.ZodOptional<z.ZodString>;
81
+ published_to: z.ZodOptional<z.ZodString>;
82
+ issuer: z.ZodOptional<z.ZodString>;
83
+ district_authority: z.ZodOptional<z.ZodString>;
84
+ municipality: z.ZodOptional<z.ZodString>;
85
+ sort_by: z.ZodOptional<z.ZodEnum<{
86
+ number: "number";
87
+ published: "published";
88
+ }>>;
89
+ sort_direction: z.ZodOptional<z.ZodEnum<{
90
+ ascending: "ascending";
91
+ descending: "descending";
92
+ }>>;
93
+ page: z.ZodOptional<z.ZodNumber>;
94
+ page_size: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<10>, z.ZodLiteral<20>, z.ZodLiteral<50>, z.ZodLiteral<100>]>>;
95
+ }, z.core.$strip>, z.ZodObject<{
96
+ results: z.ZodArray<z.ZodObject<{
97
+ document_number: z.ZodString;
98
+ gazette_number: z.ZodOptional<z.ZodString>;
99
+ part: z.ZodOptional<z.ZodString>;
100
+ type: z.ZodOptional<z.ZodString>;
101
+ published: z.ZodOptional<z.ZodString>;
102
+ issuer: z.ZodOptional<z.ZodString>;
103
+ district_authority: z.ZodOptional<z.ZodString>;
104
+ municipality: z.ZodOptional<z.ZodString>;
105
+ title: z.ZodOptional<z.ZodString>;
106
+ short_title: z.ZodOptional<z.ZodString>;
107
+ eli: z.ZodOptional<z.ZodString>;
108
+ binding: z.ZodEnum<{
109
+ authentic: "authentic";
110
+ consolidated_informational: "consolidated_informational";
111
+ historical_record: "historical_record";
112
+ }>;
113
+ authentic_pdf_url: z.ZodOptional<z.ZodString>;
114
+ alex_url: z.ZodOptional<z.ZodString>;
115
+ document_url: z.ZodOptional<z.ZodString>;
116
+ content_urls: z.ZodObject<{
117
+ xml: z.ZodOptional<z.ZodString>;
118
+ html: z.ZodOptional<z.ZodString>;
119
+ pdf: z.ZodOptional<z.ZodString>;
120
+ rtf: z.ZodOptional<z.ZodString>;
121
+ }, z.core.$strip>;
122
+ }, z.core.$strip>>;
123
+ }, z.core.$strip>, readonly [{
124
+ readonly reason: "scope_filter_mismatch";
125
+ readonly code: JsonRpcErrorCode.ValidationError;
126
+ readonly when: "A filter was combined with a scope that does not support it (part off federal; series/include_non_authentic off a state scope; district_authority off district; municipality off municipal; issuer outside federal/ordinance gazettes) — rejected locally before any upstream call; the message names the offending pair.";
127
+ readonly recovery: "Drop the named filter or adjust scope: part applies only to scope: federal; series and include_non_authentic only to a state scope; district_authority only to scope: district; municipality only to scope: municipal; issuer only to federal or ordinance gazettes. Semantics: ris_list_reference topic gazette_parts or applications.";
128
+ }, {
129
+ readonly reason: "invalid_query";
130
+ readonly code: JsonRpcErrorCode.ValidationError;
131
+ readonly when: "RIS rejected a parameter value — the in-band Client error message is passed through verbatim; it names the invalid element and its valid values.";
132
+ readonly recovery: "Correct the parameter RIS names in the message. Part and type semantics: ris_list_reference topic gazette_parts or law_types.";
133
+ }, {
134
+ readonly reason: "upstream_error";
135
+ readonly code: JsonRpcErrorCode.ServiceUnavailable;
136
+ readonly when: "RIS is unreachable, returned a server error, or served an HTML error page.";
137
+ readonly retryable: true;
138
+ readonly recovery: "RIS is temporarily unavailable — retry after a short delay. If it persists, reduce page_size or narrow the query.";
139
+ }], {
140
+ readonly totalCount: z.ZodNumber;
141
+ readonly page: z.ZodNumber;
142
+ readonly pageSize: z.ZodNumber;
143
+ readonly truncated: z.ZodOptional<z.ZodBoolean>;
144
+ readonly servedApplication: z.ZodString;
145
+ readonly notice: z.ZodOptional<z.ZodString>;
146
+ }>;
147
+ //# sourceMappingURL=ris-search-gazette.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ris-search-gazette.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/ris-search-gazette.tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAY,MAAM,+BAA+B,CAAC;AAG3E,OAAO,KAAK,EACV,kBAAkB,EAGnB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AA2FtD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsE+B,CAAC;AAEhE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAahE,kGAAkG;AAClG,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,GAAG,aAAa,CA+DpF;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyV3B,CAAC"}