@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,495 @@
1
+ /**
2
+ * @fileoverview ris_search_case_law — search Austrian case law (Judikatur) in one
3
+ * court/tribunal application per call across the 17 court codes, including the
4
+ * Parteien-Transparenz-Senat (upts), which the service routes to the Sonstige controller.
5
+ * The full court-conditional filter matrix is guarded locally before any upstream call,
6
+ * and decision_kind / subject_area values are validated against the static reference
7
+ * tables — RIS silently ignores unknown params, so local strictness is the only safety.
8
+ * @module mcp-server/tools/definitions/ris-search-case-law
9
+ */
10
+ import { tool, z } from '@cyanheads/mcp-ts-core';
11
+ import { JsonRpcErrorCode, McpError } from '@cyanheads/mcp-ts-core/errors';
12
+ import { COURTS_WITHOUT_DECISION_KIND, RIS_CHANGED_SINCE_INTERVALS, RIS_COURTS, RIS_DECISION_KINDS, RIS_ISSUING_BODIES, RIS_JUSTIZ_SUBJECT_AREAS, RIS_STATES, } from '../../../services/ris/reference/index.js';
13
+ import { getRisService } from '../../../services/ris/ris-service.js';
14
+ import { isoDateString } from './_shared.js';
15
+ const COURT_CODES = RIS_COURTS.map((c) => c.code);
16
+ const STATE_CODES = RIS_STATES.map((s) => s.code);
17
+ const CHANGED_SINCE_CODES = RIS_CHANGED_SINCE_INTERVALS.map((i) => i.code);
18
+ /** Case-number-and-dates params rejected for normenliste (a norm index, not decisions). */
19
+ const NO_DECISION_KIND = new Set(COURTS_WITHOUT_DECISION_KIND);
20
+ /** First 4-digit year in a court's documented coverage window, when one is stated. */
21
+ function coverageStartYear(window) {
22
+ const match = window === null ? null : /\d{4}/.exec(window);
23
+ return match ? Number.parseInt(match[0], 10) : undefined;
24
+ }
25
+ /** Map an empty string from a form-based client to `undefined`. */
26
+ function meaningful(value) {
27
+ return value !== undefined && value !== '' ? value : undefined;
28
+ }
29
+ const ContentUrlsSchema = z
30
+ .object({
31
+ xml: z.string().optional().describe('XML rendition URL.'),
32
+ html: z.string().optional().describe('HTML rendition URL.'),
33
+ pdf: z.string().optional().describe('PDF rendition URL (the only rendition for upts).'),
34
+ rtf: z.string().optional().describe('RTF rendition URL.'),
35
+ })
36
+ .describe('Rendition URLs of the main document.');
37
+ export const CaseLawRecordSchema = z
38
+ .object({
39
+ document_number: z
40
+ .string()
41
+ .describe('Technical RIS document number (e.g. JFT_…, DSBT_20251114_…, UPTS_…) — pass together with the court value (as application) to ris_get_document.'),
42
+ court: z
43
+ .string()
44
+ .describe('RIS application code of the deciding body (e.g. Vfgh, Justiz, Upts) — use as the application argument of ris_get_document.'),
45
+ organ: z
46
+ .string()
47
+ .optional()
48
+ .describe('Issuing body name (Organ), e.g. "Verfassungsgerichtshof".'),
49
+ case_numbers: z
50
+ .array(z.string().describe('One Geschäftszahl.'))
51
+ .describe('Case numbers (Geschäftszahl) — a decision can carry several.'),
52
+ decision_date: z.string().optional().describe('Decision date (Entscheidungsdatum).'),
53
+ decision_type: z
54
+ .string()
55
+ .optional()
56
+ .describe("Document kind: 'Rechtssatz' (headnote) or 'Text' (full decision text). One decision may appear as several headnote documents plus one text document sharing a Geschäftszahl."),
57
+ decision_kind: z
58
+ .string()
59
+ .optional()
60
+ .describe('Decision kind (Entscheidungsart — Erkenntnis, Beschluss, …), where tagged.'),
61
+ party: z
62
+ .string()
63
+ .optional()
64
+ .describe('Political party the decision concerns (upts decisions only).'),
65
+ summary: z.string().optional().describe('Short summary (Kurzinformation), where present.'),
66
+ guiding_principle: z
67
+ .string()
68
+ .optional()
69
+ .describe('Guiding legal principle / headnote (Leitsatz) — the abstracted rule the decision establishes. Present chiefly on Rechtssatz (headnote) documents, mostly VfGH.'),
70
+ norms_cited: z
71
+ .array(z.string().describe('One cited norm in RIS format, e.g. "DSG §1".'))
72
+ .describe('Norms the decision cites — copy an entry verbatim into the norm filter to find sibling case law.'),
73
+ keywords: z.string().optional().describe('Keywords (Schlagworte), where present.'),
74
+ collection_number: z
75
+ .string()
76
+ .optional()
77
+ .describe('Official collection number (VfSlg/VwSlg/UVS Sammlungsnummer), where assigned.'),
78
+ ecli: z.string().optional().describe('European Case Law Identifier, where assigned.'),
79
+ decision_url: z
80
+ .string()
81
+ .optional()
82
+ .describe('RIS web view of the complete decision (GesamteEntscheidungUrl).'),
83
+ headnotes_url: z
84
+ .string()
85
+ .optional()
86
+ .describe('RIS web view of the decision’s headnotes (RechtssaetzeUrl).'),
87
+ legal_force_note: z
88
+ .string()
89
+ .optional()
90
+ .describe('Challenge / legal-force note (Anfechtung), where present.'),
91
+ content_urls: ContentUrlsSchema,
92
+ })
93
+ .describe('One decision document (headnote or full text) from the selected court.');
94
+ /** Pick the four core rendition URLs off a normalized hit. */
95
+ function pickContentUrls(hit) {
96
+ const { html, pdf, rtf, xml } = hit.contentUrls;
97
+ return {
98
+ ...(xml !== undefined && { xml }),
99
+ ...(html !== undefined && { html }),
100
+ ...(pdf !== undefined && { pdf }),
101
+ ...(rtf !== undefined && { rtf }),
102
+ };
103
+ }
104
+ /** Map a normalized RIS hit (Judikatur, or Sonstige for upts) to the tool's record shape. */
105
+ export function toRecord(hit, fallbackApplication) {
106
+ const base = {
107
+ case_numbers: [],
108
+ content_urls: pickContentUrls(hit),
109
+ court: hit.application ?? fallbackApplication,
110
+ document_number: hit.documentNumber,
111
+ norms_cited: [],
112
+ ...(hit.organ !== undefined && { organ: hit.organ }),
113
+ };
114
+ const md = hit.metadata;
115
+ if (md.controller === 'Judikatur') {
116
+ return {
117
+ ...base,
118
+ case_numbers: [...md.caseNumbers],
119
+ ...(md.collectionNumber !== undefined && { collection_number: md.collectionNumber }),
120
+ ...(md.decisionDate !== undefined && { decision_date: md.decisionDate }),
121
+ ...(md.decisionKind !== undefined && { decision_kind: md.decisionKind }),
122
+ ...(md.decisionDocumentType !== undefined && { decision_type: md.decisionDocumentType }),
123
+ ...(md.decisionUrl !== undefined && { decision_url: md.decisionUrl }),
124
+ ...(md.ecli !== undefined && { ecli: md.ecli }),
125
+ ...(md.headnotesUrl !== undefined && { headnotes_url: md.headnotesUrl }),
126
+ ...(md.keywords !== undefined && { keywords: md.keywords }),
127
+ ...(md.legalForceNote !== undefined && { legal_force_note: md.legalForceNote }),
128
+ norms_cited: [...md.normsCited],
129
+ ...(md.summary !== undefined && { summary: md.summary }),
130
+ ...(md.guidingPrinciple !== undefined && { guiding_principle: md.guidingPrinciple }),
131
+ };
132
+ }
133
+ if (md.controller === 'Sonstige') {
134
+ return {
135
+ ...base,
136
+ case_numbers: [...md.caseNumbers],
137
+ ...(md.decisionDate !== undefined && { decision_date: md.decisionDate }),
138
+ ...(md.keywords !== undefined && { keywords: md.keywords }),
139
+ norms_cited: [...md.normsCited],
140
+ ...(md.party !== undefined && { party: md.party }),
141
+ ...(md.summary !== undefined && { summary: md.summary }),
142
+ };
143
+ }
144
+ return base;
145
+ }
146
+ export const risSearchCaseLaw = tool('ris_search_case_law', {
147
+ title: 'Search Austrian Case Law',
148
+ description: 'Search Austrian case law (Judikatur) in ONE court or tribunal per call — court is required: vfgh (Constitutional Court), vwgh (Supreme Administrative Court), justiz (ordinary courts incl. OGH, selected decisions), bvwg (federal administrative), lvwg (state administrative), dsk (data protection authority), normenliste (VwGH norm index), dok, pvak, gbk, verg, upts (party transparency), and the historical uvs, asylgh, ubas, umse, bks. Cross-court research is one call per court (calls are cheap); historical bodies are closed windows with successors — codes, windows, and Geschäftszahl examples: ris_list_reference topic courts. Filter by full-text query, cited norm ("DSG §1", "DSGVO Art32" — the highest-value filter), exact case_number (Geschäftszahl), decision date range, decision_type (headnote vs full text), decision_kind, or the court-conditional filters: issuing_body (dsk/dok/pvak/verg), court_name/legal_area/subject_area (justiz), state (lvwg/uvs), party (upts), commission/senate/discrimination_ground (gbk), subject_law (bks), collection_number (vfgh/vwgh/uvs). For a known Geschäftszahl or VfSlg/VwSlg cite, ris_lookup_citation resolves it directly.',
149
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
150
+ input: z.object({
151
+ court: z
152
+ .enum(COURT_CODES)
153
+ .describe('Which court/tribunal application to search — one per call. Codes, coverage windows, and successor mapping: ris_list_reference topic courts.'),
154
+ query: z
155
+ .string()
156
+ .optional()
157
+ .describe('Full-text search over decisions (Suchworte). Boolean UND/ODER/NICHT or AND/OR/NOT, quoted phrases, trailing-only * wildcard.'),
158
+ norm: z
159
+ .string()
160
+ .optional()
161
+ .describe('Cited-provision filter (Norm) — "DSG §1", "DSGVO Art32", "GewO 1994 §129", matching the format returned in norms_cited. The highest-value case-law filter.'),
162
+ case_number: z
163
+ .string()
164
+ .optional()
165
+ .describe('Exact Geschäftszahl — returns that decision’s documents. Formats differ per court (examples: ris_list_reference topic courts). Not available for normenliste.'),
166
+ decision_type: z
167
+ .enum(['headnote', 'full_text', 'all'])
168
+ .default('all')
169
+ .describe('Search headnotes (Rechtssätze), full decision texts (Entscheidungstexte), or both (all, the default). Not available for gbk, upts, or normenliste.'),
170
+ decided_from: isoDateString
171
+ .optional()
172
+ .describe('Earliest decision date (YYYY-MM-DD). Not available for normenliste.'),
173
+ decided_to: isoDateString.optional().describe('Latest decision date (YYYY-MM-DD).'),
174
+ decision_kind: z
175
+ .string()
176
+ .optional()
177
+ .describe('Decision kind (Entscheidungsart) — per-court value sets, validated locally: ris_list_reference topic decision_kinds. No such parameter exists for normenliste, dok, pvak, umse, bks, or upts. For justiz the four documented values are not yet populated in the corpus (every value returns 0 hits, verified 2026-07-05) — filter justiz with query or norm instead.'),
178
+ collection_number: z
179
+ .string()
180
+ .optional()
181
+ .describe('Official collection number (Sammlungsnummer) — VfSlg/VwSlg cites. vfgh, vwgh, and uvs only.'),
182
+ issuing_body: z
183
+ .string()
184
+ .optional()
185
+ .describe('Deciding body (EntscheidendeBehoerde) — dsk, dok, pvak, and verg only. dsk: Datenschutzbehoerde (2014+) or Datenschutzkommission (up to 2013). Full value lists: ris_list_reference topic issuing_bodies.'),
186
+ court_name: z
187
+ .string()
188
+ .optional()
189
+ .describe('Filter within the ordinary courts (justiz only) — "OGH", "OLG Wien", "LG Linz".'),
190
+ legal_area: z
191
+ .enum(['civil', 'criminal'])
192
+ .optional()
193
+ .describe('Legal area (Rechtsgebiet, justiz only): civil (Zivilrecht) or criminal (Strafrecht).'),
194
+ subject_area: z
195
+ .string()
196
+ .optional()
197
+ .describe('Subject-area taxonomy filter (Fachgebiet, justiz only) — 39 exact German values like "Datenschutzrecht", validated locally: ris_list_reference topic justiz_subject_areas. The corpus carries no tagged documents yet (every value returns 0 hits, verified 2026-07-05) — filter with query or norm instead until RIS populates the tags.'),
198
+ state: z
199
+ .enum(STATE_CODES)
200
+ .optional()
201
+ .describe('Which of the nine state administrative courts/senates to search (lvwg and uvs only).'),
202
+ party: z
203
+ .string()
204
+ .optional()
205
+ .describe('Political party the decision concerns (upts only). Documented values: ÖVP, SPÖ, FPÖ, KPÖ, BZÖ, Team Stronach — the filter is full-text, and further party names appear in live data (e.g. "Wandel").'),
206
+ commission: z
207
+ .enum(['federal', 'general'])
208
+ .optional()
209
+ .describe('Equal-treatment commission (gbk only): federal (Bundes-Gleichbehandlungskommission) or general (Gleichbehandlungskommission).'),
210
+ senate: z.enum(['I', 'II', 'III']).optional().describe('Commission senate (gbk only).'),
211
+ discrimination_ground: z
212
+ .enum([
213
+ 'Alter',
214
+ 'EthnischeZugehoerigkeit',
215
+ 'Geschlecht',
216
+ 'Mehrfachdiskriminierung',
217
+ 'Religion',
218
+ 'SexuelleOrientierung',
219
+ 'Weltanschauung',
220
+ ])
221
+ .optional()
222
+ .describe('Discrimination ground (gbk only): Alter (age), EthnischeZugehoerigkeit (ethnic origin), Geschlecht (gender/sex), Mehrfachdiskriminierung (multiple grounds), Religion (religion), SexuelleOrientierung (sexual orientation), Weltanschauung (worldview/belief). Upstream German enum values, sent verbatim.'),
223
+ subject_law: z
224
+ .string()
225
+ .optional()
226
+ .describe('Media statute the case concerns (Bereich, bks only) — e.g. "ORF-Gesetz", "Privatradiogesetz".'),
227
+ changed_since: z
228
+ .enum(CHANGED_SINCE_CODES)
229
+ .optional()
230
+ .describe('Coarse recency filter — decisions changed in RIS within the interval. For exact windows use ris_track_changes.'),
231
+ sort_by: z
232
+ .enum(['decision_date', 'case_number'])
233
+ .optional()
234
+ .describe('Sort column. Default: upstream order.'),
235
+ sort_direction: z
236
+ .enum(['ascending', 'descending'])
237
+ .optional()
238
+ .describe('Sort direction; applies with sort_by.'),
239
+ page: z.number().int().min(1).optional().describe('1-based result page. Default 1.'),
240
+ page_size: z
241
+ .union([z.literal(10), z.literal(20), z.literal(50), z.literal(100)])
242
+ .optional()
243
+ .describe('Documents per page — RIS accepts 10, 20, 50, or 100. Default 20.'),
244
+ }),
245
+ output: z.object({
246
+ results: z
247
+ .array(CaseLawRecordSchema)
248
+ .describe('Matching decision documents for the requested page. Totals and paging in enrichment.'),
249
+ }),
250
+ enrichment: {
251
+ totalCount: z.number().describe('Total matching documents across all pages.'),
252
+ page: z.number().describe('1-based page number RIS served.'),
253
+ pageSize: z.number().describe('Page size RIS applied.'),
254
+ truncated: z
255
+ .boolean()
256
+ .optional()
257
+ .describe('Present and true when more pages exist beyond this one — raise page to continue.'),
258
+ notice: z
259
+ .string()
260
+ .optional()
261
+ .describe('Zero-hit guidance — names the likely cause and the concrete next call.'),
262
+ },
263
+ errors: [
264
+ {
265
+ reason: 'court_filter_mismatch',
266
+ code: JsonRpcErrorCode.ValidationError,
267
+ when: 'A court-conditional filter was sent with the wrong court, or case_number/dates/decision_type were sent with normenliste (a norm index, not decisions) — rejected locally before any upstream call; the message names the offending pair.',
268
+ recovery: 'Drop the filter or switch court: issuing_body → dsk/dok/pvak/verg, court_name/legal_area/subject_area → justiz, state → lvwg/uvs, party → upts, commission/senate/discrimination_ground → gbk, subject_law → bks, collection_number → vfgh/vwgh/uvs. Court codes: ris_list_reference topic courts.',
269
+ },
270
+ {
271
+ reason: 'invalid_query',
272
+ code: JsonRpcErrorCode.ValidationError,
273
+ when: 'A parameter value failed validation — decision_kind/subject_area checked locally against the reference tables, or RIS rejected the value in-band (message passed through verbatim).',
274
+ recovery: 'Correct the parameter RIS names in the message. Valid court codes, decision types/kinds, and syntax: ris_list_reference (topic: courts, decision_types, decision_kinds, or search_syntax).',
275
+ },
276
+ {
277
+ reason: 'upstream_error',
278
+ code: JsonRpcErrorCode.ServiceUnavailable,
279
+ when: 'RIS is unreachable, returned a server error, or served an HTML error page.',
280
+ retryable: true,
281
+ recovery: 'RIS is temporarily unavailable — retry after a short delay. If it persists, reduce page_size or narrow the query.',
282
+ },
283
+ ],
284
+ async handler(input, ctx) {
285
+ const { court } = input;
286
+ const query = meaningful(input.query);
287
+ const norm = meaningful(input.norm);
288
+ const caseNumber = meaningful(input.case_number);
289
+ const decidedFrom = meaningful(input.decided_from);
290
+ const decidedTo = meaningful(input.decided_to);
291
+ const decisionKind = meaningful(input.decision_kind);
292
+ const collectionNumber = meaningful(input.collection_number);
293
+ const courtName = meaningful(input.court_name);
294
+ const subjectArea = meaningful(input.subject_area);
295
+ const party = meaningful(input.party);
296
+ const subjectLaw = meaningful(input.subject_law);
297
+ let issuingBody = meaningful(input.issuing_body);
298
+ const mismatch = (message) => ctx.fail('court_filter_mismatch', message, { ...ctx.recoveryFor('court_filter_mismatch') });
299
+ if (court === 'normenliste') {
300
+ const rejected = [
301
+ ['case_number', caseNumber],
302
+ ['decided_from', decidedFrom],
303
+ ['decided_to', decidedTo],
304
+ ];
305
+ const offending = rejected.find(([, value]) => value !== undefined);
306
+ if (offending) {
307
+ throw mismatch(`${offending[0]} cannot be used with court 'normenliste' — a norm index, not decisions.`);
308
+ }
309
+ }
310
+ if (input.decision_type !== 'all' &&
311
+ (court === 'gbk' || court === 'upts' || court === 'normenliste')) {
312
+ throw mismatch(`decision_type '${input.decision_type}' cannot be used with court '${court}' — gbk, upts, and normenliste have no Rechtssatz/Entscheidungstext split.`);
313
+ }
314
+ if (decisionKind !== undefined) {
315
+ if (NO_DECISION_KIND.has(court)) {
316
+ throw mismatch(`decision_kind does not apply to court '${court}' — its RIS search schema has no Entscheidungsart parameter (none exists for ${COURTS_WITHOUT_DECISION_KIND.join(', ')}).`);
317
+ }
318
+ const kinds = RIS_DECISION_KINDS.find((entry) => entry.court === court);
319
+ if (kinds && !kinds.values.some((value) => value === decisionKind)) {
320
+ throw ctx.fail('invalid_query', `decision_kind '${decisionKind}' is not a valid Entscheidungsart for court '${court}'. Valid values: ${kinds.values.join(' | ')}.`, { ...ctx.recoveryFor('invalid_query') });
321
+ }
322
+ }
323
+ const conditionals = [
324
+ ['collection_number', collectionNumber, ['vfgh', 'vwgh', 'uvs']],
325
+ ['issuing_body', issuingBody, ['dsk', 'dok', 'pvak', 'verg']],
326
+ ['court_name', courtName, ['justiz']],
327
+ ['legal_area', input.legal_area, ['justiz']],
328
+ ['subject_area', subjectArea, ['justiz']],
329
+ ['state', input.state, ['lvwg', 'uvs']],
330
+ ['party', party, ['upts']],
331
+ ['commission', input.commission, ['gbk']],
332
+ ['senate', input.senate, ['gbk']],
333
+ ['discrimination_ground', input.discrimination_ground, ['gbk']],
334
+ ['subject_law', subjectLaw, ['bks']],
335
+ ];
336
+ for (const [name, value, allowed] of conditionals) {
337
+ if (value !== undefined && !allowed.some((code) => code === court)) {
338
+ throw mismatch(`${name} applies only to ${allowed.length > 1 ? 'courts' : 'court'} ${allowed.join('/')}, got '${court}'.`);
339
+ }
340
+ }
341
+ if (subjectArea !== undefined &&
342
+ !RIS_JUSTIZ_SUBJECT_AREAS.some((area) => area.value === subjectArea)) {
343
+ throw ctx.fail('invalid_query', `subject_area '${subjectArea}' is not in the Justiz Fachgebiet taxonomy — the 39 exact German values are listed by ris_list_reference topic justiz_subject_areas.`, { ...ctx.recoveryFor('invalid_query') });
344
+ }
345
+ if (issuingBody !== undefined && (court === 'dsk' || court === 'pvak')) {
346
+ const needle = issuingBody.toLowerCase();
347
+ const match = RIS_ISSUING_BODIES.find((body) => body.application === (court === 'dsk' ? 'Dsk' : 'Pvak') &&
348
+ body.value.toLowerCase() === needle);
349
+ if (match)
350
+ issuingBody = match.value;
351
+ }
352
+ const params = {
353
+ court,
354
+ ...(query !== undefined && { query }),
355
+ ...(norm !== undefined && { norm }),
356
+ ...(caseNumber !== undefined && { caseNumber }),
357
+ decisionType: input.decision_type,
358
+ ...(decidedFrom !== undefined && { decidedFrom }),
359
+ ...(decidedTo !== undefined && { decidedTo }),
360
+ ...(decisionKind !== undefined && { decisionKind }),
361
+ ...(collectionNumber !== undefined && { collectionNumber }),
362
+ ...(issuingBody !== undefined && { issuingBody }),
363
+ ...(courtName !== undefined && { courtName }),
364
+ ...(input.legal_area !== undefined && { legalArea: input.legal_area }),
365
+ ...(subjectArea !== undefined && { subjectArea }),
366
+ ...(input.state !== undefined && { state: input.state }),
367
+ ...(party !== undefined && { party }),
368
+ ...(input.commission !== undefined && { commission: input.commission }),
369
+ ...(input.senate !== undefined && { senate: input.senate }),
370
+ ...(input.discrimination_ground !== undefined && {
371
+ discriminationGround: input.discrimination_ground,
372
+ }),
373
+ ...(subjectLaw !== undefined && { subjectLaw }),
374
+ ...(input.changed_since !== undefined && { changedSince: input.changed_since }),
375
+ ...(input.sort_by !== undefined && { sortBy: input.sort_by }),
376
+ ...(input.sort_direction !== undefined && { sortDirection: input.sort_direction }),
377
+ ...(input.page !== undefined && { page: input.page }),
378
+ ...(input.page_size !== undefined && { pageSize: input.page_size }),
379
+ };
380
+ const courtEntry = RIS_COURTS.find((entry) => entry.code === court);
381
+ // Map in-band RIS errors onto this tool's declared contract so reason +
382
+ // recovery reach the wire (service-level throws carry neither).
383
+ const result = await getRisService()
384
+ .searchCaseLaw(params, ctx)
385
+ .catch((err) => {
386
+ if (err instanceof McpError && err.code === JsonRpcErrorCode.InvalidParams) {
387
+ throw ctx.fail('invalid_query', err.message, { ...ctx.recoveryFor('invalid_query') });
388
+ }
389
+ if (err instanceof McpError && err.code === JsonRpcErrorCode.ServiceUnavailable) {
390
+ throw ctx.fail('upstream_error', err.message, { ...ctx.recoveryFor('upstream_error') });
391
+ }
392
+ throw err;
393
+ });
394
+ ctx.log.info('Case-law search completed', {
395
+ court,
396
+ hits: result.hits.length,
397
+ total: result.total,
398
+ });
399
+ ctx.enrich.total(result.total);
400
+ ctx.enrich({ page: result.page, pageSize: result.pageSize });
401
+ if (result.total > (result.page - 1) * result.pageSize + result.hits.length) {
402
+ ctx.enrich({ truncated: true });
403
+ }
404
+ if (result.total === 0) {
405
+ const fragments = [
406
+ `0 decisions in ${court}. Other courts are separate calls — repeat per court.`,
407
+ ];
408
+ if (caseNumber !== undefined) {
409
+ fragments.push("Geschäftszahl formats differ per court ('Ra 2019/22/0184' = VwGH, 'G 287/2022' = VfGH, '6Ob56/25k' = OGH/justiz) — ris_lookup_citation auto-detects the court from the format; examples per court: ris_list_reference topic courts.");
410
+ }
411
+ if (norm !== undefined) {
412
+ fragments.push("norm must match RIS's cited-norm format ('DSG §1', 'DSGVO Art32' style as returned in norms_cited) — run a broader search first and copy the exact string from a result's norms_cited.");
413
+ }
414
+ const startYear = coverageStartYear(courtEntry?.window ?? null);
415
+ const decidedToYear = decidedTo !== undefined ? Number.parseInt(decidedTo.slice(0, 4), 10) : Number.NaN;
416
+ if (startYear !== undefined && !Number.isNaN(decidedToYear) && decidedToYear < startYear) {
417
+ fragments.push(`${court} coverage starts ${startYear} — earlier decisions are not in RIS. Windows: ris_list_reference topic courts.`);
418
+ }
419
+ if (courtEntry !== undefined && courtEntry.status === 'historical') {
420
+ fragments.push(courtEntry.successor === null
421
+ ? `${court} is historical (${courtEntry.window ?? 'closed window'}) — it ceased deciding and has no direct successor in RIS.`
422
+ : `${court} is historical (${courtEntry.window ?? 'closed window'}) — its successor is ${courtEntry.successor}. Search the successor for current decisions.`);
423
+ }
424
+ if (court === 'dsk' && issuingBody === 'Datenschutzkommission') {
425
+ fragments.push("The Datenschutzkommission arm of dsk is historical (decisions up to 2013) — its successor is the Datenschutzbehoerde. Search issuing_body 'Datenschutzbehoerde' for current decisions.");
426
+ }
427
+ if (subjectArea !== undefined || (court === 'justiz' && decisionKind !== undefined)) {
428
+ fragments.push('Justiz subject_area and decision_kind tags are not yet populated in the RIS corpus (every value returns 0 hits) — drop the filter and use query or norm instead.');
429
+ }
430
+ ctx.enrich.notice(fragments.join(' '));
431
+ }
432
+ return { results: result.hits.map((hit) => toRecord(hit, courtEntry?.application ?? court)) };
433
+ },
434
+ // format() populates content[] — the markdown twin of structuredContent. Every output
435
+ // field renders here; totals, paging, and notices ride the enrichment trailer.
436
+ format: (result) => {
437
+ if (result.results.length === 0) {
438
+ return [{ type: 'text', text: '_No decisions on this page._' }];
439
+ }
440
+ const blocks = result.results.map((r) => {
441
+ const lines = [
442
+ `## ${r.case_numbers.length > 0 ? r.case_numbers.join(', ') : r.document_number}`,
443
+ ];
444
+ lines.push(`**Document:** ${r.document_number} (${r.court})`);
445
+ const facts = [];
446
+ if (r.organ !== undefined)
447
+ facts.push(`**Organ:** ${r.organ}`);
448
+ if (r.decision_date !== undefined)
449
+ facts.push(`**Decided:** ${r.decision_date}`);
450
+ if (r.decision_type !== undefined)
451
+ facts.push(`**Type:** ${r.decision_type}`);
452
+ if (r.decision_kind !== undefined)
453
+ facts.push(`**Kind:** ${r.decision_kind}`);
454
+ if (facts.length > 0)
455
+ lines.push(facts.join(' | '));
456
+ const identifiers = [];
457
+ if (r.collection_number !== undefined) {
458
+ identifiers.push(`**Collection:** ${r.collection_number}`);
459
+ }
460
+ if (r.ecli !== undefined)
461
+ identifiers.push(`**ECLI:** ${r.ecli}`);
462
+ if (r.party !== undefined)
463
+ identifiers.push(`**Party:** ${r.party}`);
464
+ if (identifiers.length > 0)
465
+ lines.push(identifiers.join(' | '));
466
+ if (r.summary !== undefined)
467
+ lines.push(r.summary);
468
+ if (r.guiding_principle !== undefined) {
469
+ lines.push(`**Guiding principle:** ${r.guiding_principle}`);
470
+ }
471
+ if (r.norms_cited.length > 0)
472
+ lines.push(`**Norms:** ${r.norms_cited.join('; ')}`);
473
+ if (r.keywords !== undefined)
474
+ lines.push(`**Keywords:** ${r.keywords}`);
475
+ if (r.legal_force_note !== undefined) {
476
+ lines.push(`**Legal force:** ${r.legal_force_note}`);
477
+ }
478
+ const links = [];
479
+ if (r.decision_url !== undefined)
480
+ links.push(`[Full decision](${r.decision_url})`);
481
+ if (r.headnotes_url !== undefined)
482
+ links.push(`[Headnotes](${r.headnotes_url})`);
483
+ for (const key of ['html', 'pdf', 'rtf', 'xml']) {
484
+ const url = r.content_urls[key];
485
+ if (url !== undefined)
486
+ links.push(`[${key.toUpperCase()}](${url})`);
487
+ }
488
+ if (links.length > 0)
489
+ lines.push(`**Links:** ${links.join(' · ')}`);
490
+ return lines.join('\n');
491
+ });
492
+ return [{ type: 'text', text: blocks.join('\n\n') }];
493
+ },
494
+ });
495
+ //# sourceMappingURL=ris-search-case-law.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ris-search-case-law.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/ris-search-case-law.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
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 { z } from '@cyanheads/mcp-ts-core';
10
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
11
+ export declare const risSearchDrafts: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
12
+ stage: z.ZodEnum<{
13
+ review_drafts: "review_drafts";
14
+ government_bills: "government_bills";
15
+ }>;
16
+ query: z.ZodOptional<z.ZodString>;
17
+ title: z.ZodOptional<z.ZodString>;
18
+ ministry: z.ZodOptional<z.ZodString>;
19
+ in_review_on: z.ZodOptional<z.ZodString>;
20
+ decided_from: z.ZodOptional<z.ZodString>;
21
+ decided_to: z.ZodOptional<z.ZodString>;
22
+ changed_since: z.ZodOptional<z.ZodEnum<{
23
+ one_week: "one_week";
24
+ two_weeks: "two_weeks";
25
+ one_month: "one_month";
26
+ three_months: "three_months";
27
+ six_months: "six_months";
28
+ one_year: "one_year";
29
+ }>>;
30
+ sort_by: z.ZodOptional<z.ZodEnum<{
31
+ date: "date";
32
+ title: "title";
33
+ ministry: "ministry";
34
+ }>>;
35
+ sort_direction: z.ZodOptional<z.ZodEnum<{
36
+ ascending: "ascending";
37
+ descending: "descending";
38
+ }>>;
39
+ page: z.ZodOptional<z.ZodNumber>;
40
+ page_size: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<10>, z.ZodLiteral<20>, z.ZodLiteral<50>, z.ZodLiteral<100>]>>;
41
+ }, z.core.$strip>, z.ZodObject<{
42
+ results: z.ZodArray<z.ZodObject<{
43
+ document_number: z.ZodString;
44
+ stage: z.ZodString;
45
+ title: z.ZodOptional<z.ZodString>;
46
+ short_title: z.ZodOptional<z.ZodString>;
47
+ ministry: z.ZodOptional<z.ZodString>;
48
+ review_deadline: z.ZodOptional<z.ZodString>;
49
+ decided: z.ZodOptional<z.ZodString>;
50
+ content_urls: z.ZodObject<{
51
+ xml: z.ZodOptional<z.ZodString>;
52
+ html: z.ZodOptional<z.ZodString>;
53
+ pdf: z.ZodOptional<z.ZodString>;
54
+ rtf: z.ZodOptional<z.ZodString>;
55
+ }, z.core.$strip>;
56
+ }, z.core.$strip>>;
57
+ }, z.core.$strip>, readonly [{
58
+ readonly reason: "stage_filter_mismatch";
59
+ readonly code: JsonRpcErrorCode.ValidationError;
60
+ readonly 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.";
61
+ readonly 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.";
62
+ }, {
63
+ readonly reason: "invalid_query";
64
+ readonly code: JsonRpcErrorCode.ValidationError;
65
+ 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.";
66
+ readonly recovery: "Correct the parameter RIS names in the message. Ministry codes: ris_list_reference topic ministries.";
67
+ }, {
68
+ readonly reason: "upstream_error";
69
+ readonly code: JsonRpcErrorCode.ServiceUnavailable;
70
+ readonly when: "RIS is unreachable, returned a server error, or served an HTML error page.";
71
+ readonly retryable: true;
72
+ readonly recovery: "RIS is temporarily unavailable — retry after a short delay. If it persists, reduce page_size or narrow the query.";
73
+ }], {
74
+ readonly totalCount: z.ZodNumber;
75
+ readonly page: z.ZodNumber;
76
+ readonly pageSize: z.ZodNumber;
77
+ readonly truncated: z.ZodOptional<z.ZodBoolean>;
78
+ readonly notice: z.ZodOptional<z.ZodString>;
79
+ }>;
80
+ //# sourceMappingURL=ris-search-drafts.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ris-search-drafts.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/ris-search-drafts.tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAY,MAAM,+BAA+B,CAAC;AAoG3E,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmN1B,CAAC"}