@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,118 @@
1
+ /**
2
+ * @fileoverview ris_search_announcements — search the sectoral official gazettes and executive
3
+ * documents on the Sonstige controller (minus Upts, which is case law): social-insurance and
4
+ * veterinary notices, court rules of procedure, trade-exam regulations, health-structure plans,
5
+ * ministerial decrees, and council-of-ministers minutes. Seven collections behind one enum;
6
+ * each collection accepts a different parameter set, guarded locally against the reference matrix
7
+ * before any upstream call. Five of the seven are legally binding authentic publications.
8
+ * @module mcp-server/tools/definitions/ris-search-announcements
9
+ */
10
+ import { z } from '@cyanheads/mcp-ts-core';
11
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
12
+ export declare const risSearchAnnouncements: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
13
+ collection: z.ZodEnum<{
14
+ social_insurance: "social_insurance";
15
+ veterinary: "veterinary";
16
+ court_rules: "court_rules";
17
+ trade_exam_rules: "trade_exam_rules";
18
+ health_structure_plans: "health_structure_plans";
19
+ ministerial_decrees: "ministerial_decrees";
20
+ council_minutes: "council_minutes";
21
+ }>;
22
+ query: z.ZodOptional<z.ZodString>;
23
+ title: z.ZodOptional<z.ZodString>;
24
+ number: z.ZodOptional<z.ZodString>;
25
+ published_from: z.ZodOptional<z.ZodString>;
26
+ published_to: z.ZodOptional<z.ZodString>;
27
+ in_force_as_of: z.ZodOptional<z.ZodString>;
28
+ entered_force_from: z.ZodOptional<z.ZodString>;
29
+ entered_force_to: z.ZodOptional<z.ZodString>;
30
+ issuer: z.ZodOptional<z.ZodString>;
31
+ norm: z.ZodOptional<z.ZodString>;
32
+ case_number: z.ZodOptional<z.ZodString>;
33
+ type: z.ZodOptional<z.ZodString>;
34
+ department: z.ZodOptional<z.ZodString>;
35
+ plan_type: z.ZodOptional<z.ZodEnum<{
36
+ all: "all";
37
+ expert_opinion: "expert_opinion";
38
+ regulation: "regulation";
39
+ }>>;
40
+ plan_state: z.ZodOptional<z.ZodEnum<{
41
+ burgenland: "burgenland";
42
+ kaernten: "kaernten";
43
+ niederoesterreich: "niederoesterreich";
44
+ oberoesterreich: "oberoesterreich";
45
+ salzburg: "salzburg";
46
+ steiermark: "steiermark";
47
+ tirol: "tirol";
48
+ vorarlberg: "vorarlberg";
49
+ wien: "wien";
50
+ }>>;
51
+ session_number: z.ZodOptional<z.ZodString>;
52
+ legislature: z.ZodOptional<z.ZodString>;
53
+ changed_since: z.ZodOptional<z.ZodEnum<{
54
+ one_week: "one_week";
55
+ two_weeks: "two_weeks";
56
+ one_month: "one_month";
57
+ three_months: "three_months";
58
+ six_months: "six_months";
59
+ one_year: "one_year";
60
+ }>>;
61
+ sort_by: z.ZodOptional<z.ZodEnum<{
62
+ number: "number";
63
+ published: "published";
64
+ }>>;
65
+ sort_direction: z.ZodOptional<z.ZodEnum<{
66
+ ascending: "ascending";
67
+ descending: "descending";
68
+ }>>;
69
+ page: z.ZodOptional<z.ZodNumber>;
70
+ page_size: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<10>, z.ZodLiteral<20>, z.ZodLiteral<50>, z.ZodLiteral<100>]>>;
71
+ }, z.core.$strip>, z.ZodObject<{
72
+ results: z.ZodArray<z.ZodObject<{
73
+ document_number: z.ZodString;
74
+ collection: z.ZodString;
75
+ title: z.ZodOptional<z.ZodString>;
76
+ summary: z.ZodOptional<z.ZodString>;
77
+ number: z.ZodOptional<z.ZodString>;
78
+ published: z.ZodOptional<z.ZodString>;
79
+ session_date: z.ZodOptional<z.ZodString>;
80
+ issuers: z.ZodArray<z.ZodString>;
81
+ norms_cited: z.ZodArray<z.ZodString>;
82
+ binding: z.ZodEnum<{
83
+ authentic: "authentic";
84
+ preparatory: "preparatory";
85
+ administrative_directive: "administrative_directive";
86
+ }>;
87
+ authentic_pdf_url: z.ZodOptional<z.ZodString>;
88
+ content_urls: z.ZodObject<{
89
+ xml: z.ZodOptional<z.ZodString>;
90
+ html: z.ZodOptional<z.ZodString>;
91
+ pdf: z.ZodOptional<z.ZodString>;
92
+ rtf: z.ZodOptional<z.ZodString>;
93
+ }, z.core.$strip>;
94
+ }, z.core.$strip>>;
95
+ }, z.core.$strip>, readonly [{
96
+ readonly reason: "collection_filter_mismatch";
97
+ readonly code: JsonRpcErrorCode.ValidationError;
98
+ readonly when: "A parameter was combined with a collection that does not accept it — rejected locally before any upstream call; the message names the offending parameter and lists the collection’s valid parameters.";
99
+ readonly recovery: "Drop the named parameter or switch collection — each collection accepts a different parameter set. Valid parameters per collection: ris_list_reference topic collections.";
100
+ }, {
101
+ readonly reason: "invalid_query";
102
+ readonly code: JsonRpcErrorCode.ValidationError;
103
+ 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.";
104
+ readonly recovery: "Correct the parameter RIS names in the message. Collections and their issuers: ris_list_reference topic collections or issuing_bodies.";
105
+ }, {
106
+ readonly reason: "upstream_error";
107
+ readonly code: JsonRpcErrorCode.ServiceUnavailable;
108
+ readonly when: "RIS is unreachable, returned a server error, or served an HTML error page.";
109
+ readonly retryable: true;
110
+ readonly recovery: "RIS is temporarily unavailable — retry after a short delay. If it persists, reduce page_size or narrow the query.";
111
+ }], {
112
+ readonly totalCount: z.ZodNumber;
113
+ readonly page: z.ZodNumber;
114
+ readonly pageSize: z.ZodNumber;
115
+ readonly truncated: z.ZodOptional<z.ZodBoolean>;
116
+ readonly notice: z.ZodOptional<z.ZodString>;
117
+ }>;
118
+ //# sourceMappingURL=ris-search-announcements.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ris-search-announcements.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/ris-search-announcements.tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAY,MAAM,+BAA+B,CAAC;AA0J3E,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyTjC,CAAC"}
@@ -0,0 +1,389 @@
1
+ /**
2
+ * @fileoverview ris_search_announcements — search the sectoral official gazettes and executive
3
+ * documents on the Sonstige controller (minus Upts, which is case law): social-insurance and
4
+ * veterinary notices, court rules of procedure, trade-exam regulations, health-structure plans,
5
+ * ministerial decrees, and council-of-ministers minutes. Seven collections behind one enum;
6
+ * each collection accepts a different parameter set, guarded locally against the reference matrix
7
+ * before any upstream call. Five of the seven are legally binding authentic publications.
8
+ * @module mcp-server/tools/definitions/ris-search-announcements
9
+ */
10
+ import { tool, z } from '@cyanheads/mcp-ts-core';
11
+ import { JsonRpcErrorCode, McpError } from '@cyanheads/mcp-ts-core/errors';
12
+ import { RIS_CHANGED_SINCE_INTERVALS, RIS_COLLECTIONS, 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 COLLECTION_CODES = RIS_COLLECTIONS.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
+ /** Binding label per collection (canonical seven-label list, Design Decisions). */
19
+ const ANNOUNCEMENT_BINDING = {
20
+ council_minutes: 'preparatory',
21
+ court_rules: 'authentic',
22
+ health_structure_plans: 'authentic',
23
+ ministerial_decrees: 'administrative_directive',
24
+ social_insurance: 'authentic',
25
+ trade_exam_rules: 'authentic',
26
+ veterinary: 'authentic',
27
+ };
28
+ /** Map an empty string from a form-based client to `undefined`. */
29
+ function meaningful(value) {
30
+ return value !== undefined && value !== '' ? value : undefined;
31
+ }
32
+ const ContentUrlsSchema = z
33
+ .object({
34
+ xml: z.string().optional().describe('XML rendition URL (RIS Nutzdaten schema).'),
35
+ html: z.string().optional().describe('HTML rendition URL.'),
36
+ pdf: z
37
+ .string()
38
+ .optional()
39
+ .describe('PDF rendition URL (the only rendition for council minutes).'),
40
+ rtf: z.string().optional().describe('RTF rendition URL.'),
41
+ })
42
+ .describe('Rendition URLs of the main document. Court rules publish the authentic PDF only; council minutes are plain PDF only (see authentic_pdf_url).');
43
+ const AnnouncementRecordSchema = z
44
+ .object({
45
+ document_number: z
46
+ .string()
47
+ .describe('Technical RIS document number (e.g. AVSV_2026_0040, AVN_…, KMGER_…, PRUEF_…, SPG_…, ERL_BMJ_…, MRP_20260701_59) — pass together with the collection’s application to ris_get_document.'),
48
+ collection: z
49
+ .string()
50
+ .describe('The collection the record belongs to (the requested collection value).'),
51
+ title: z.string().optional().describe('Full document title, HTML markup stripped.'),
52
+ summary: z.string().optional().describe('Short summary (Kurzinformation), where present.'),
53
+ number: z
54
+ .string()
55
+ .optional()
56
+ .describe('Serial number within the collection (Avsvnummer / Avnnummer / Spgnummer), where assigned.'),
57
+ published: z
58
+ .string()
59
+ .optional()
60
+ .describe('Promulgation / publication date (Kundmachungsdatum).'),
61
+ session_date: z
62
+ .string()
63
+ .optional()
64
+ .describe('Council session date (Sitzungsdatum) — council_minutes only.'),
65
+ issuers: z
66
+ .array(z.string().describe('One issuing body.'))
67
+ .describe('Issuing bodies (Urheber / Bundesministerium / Einbringer) — a council minute can carry several. Empty when none.'),
68
+ norms_cited: z
69
+ .array(z.string().describe('One cited norm in RIS format, e.g. "DSG §1".'))
70
+ .describe('Norms the document cites (veterinary notices and decrees) — copy an entry verbatim into a norm filter to find siblings. Empty when none.'),
71
+ binding: z
72
+ .enum(['authentic', 'administrative_directive', 'preparatory'])
73
+ .describe('Legal binding status: authentic (amtssigniert, legally binding — social insurance, veterinary, court rules, trade-exam rules, health-structure plans), administrative_directive (binds the administration, not citizens — ministerial decrees), or preparatory (council minutes).'),
74
+ authentic_pdf_url: z
75
+ .string()
76
+ .optional()
77
+ .describe('The amtssigniert authentic PDF (.pdfsig, Authentisch DataType) — the legally binding artifact — where the collection publishes one.'),
78
+ content_urls: ContentUrlsSchema,
79
+ })
80
+ .describe('One sectoral announcement or executive document.');
81
+ /** Pick the four core rendition URLs off a normalized hit. */
82
+ function pickContentUrls(hit) {
83
+ const { html, pdf, rtf, xml } = hit.contentUrls;
84
+ return {
85
+ ...(xml !== undefined && { xml }),
86
+ ...(html !== undefined && { html }),
87
+ ...(pdf !== undefined && { pdf }),
88
+ ...(rtf !== undefined && { rtf }),
89
+ };
90
+ }
91
+ /** Map a normalized RIS hit (all seven collections ride the Sonstige controller) to the record shape. */
92
+ function toRecord(hit, collection) {
93
+ const base = {
94
+ binding: ANNOUNCEMENT_BINDING[collection],
95
+ collection,
96
+ content_urls: pickContentUrls(hit),
97
+ document_number: hit.documentNumber,
98
+ issuers: [],
99
+ norms_cited: [],
100
+ ...(hit.contentUrls.authentic !== undefined && {
101
+ authentic_pdf_url: hit.contentUrls.authentic,
102
+ }),
103
+ };
104
+ const md = hit.metadata;
105
+ if (md.controller === 'Sonstige') {
106
+ return {
107
+ ...base,
108
+ issuers: [...md.issuers],
109
+ norms_cited: [...md.normsCited],
110
+ ...(md.number !== undefined && { number: md.number }),
111
+ ...(md.publishedDate !== undefined && { published: md.publishedDate }),
112
+ ...(md.sessionDate !== undefined && { session_date: md.sessionDate }),
113
+ ...(md.summary !== undefined && { summary: md.summary }),
114
+ ...(md.title !== undefined && { title: md.title }),
115
+ };
116
+ }
117
+ return base;
118
+ }
119
+ export const risSearchAnnouncements = tool('ris_search_announcements', {
120
+ title: 'Search Official Announcements',
121
+ description: 'Search Austria’s sectoral official gazettes and executive documents — seven collections behind one collection enum: social_insurance (Amtliche Verlautbarungen der Sozialversicherung, authentic), veterinary (Amtliche Veterinärnachrichten, authentic), court_rules (Kundmachungen der Gerichte — rules of procedure and case-allocation plans, authentic; currently LVwG Tirol and Vorarlberg only), trade_exam_rules (Prüfungsordnungen gemäß Gewerbeordnung, authentic), health_structure_plans (Strukturpläne Gesundheit — federal ÖSG and per-state RSG, authentic), ministerial_decrees (Erlässe der Bundesministerien — decrees interpreting law; bind the administration, not citizens), and council_minutes (Ministerratsprotokolle — council-of-ministers session records). Each collection accepts a different filter set: query and title are broadly available; number, published_from/to, in_force_as_of, issuer (ministry abbreviations expanded server-side), norm ("decrees citing the DSG"), case_number, type, department, plan_type/plan_state (health plans), and session_number/legislature (council minutes) apply where the collection supports them — a filter outside its set is rejected locally. Every result carries a binding label and the authentic PDF where it exists. Per-collection parameter matrix and issuers: ris_list_reference topic collections or issuing_bodies.',
122
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
123
+ input: z.object({
124
+ collection: z
125
+ .enum(COLLECTION_CODES)
126
+ .describe('Which collection to search — one per call. social_insurance | veterinary | court_rules | trade_exam_rules | health_structure_plans | ministerial_decrees | council_minutes. Per-collection filter matrix: ris_list_reference topic collections.'),
127
+ query: z
128
+ .string()
129
+ .optional()
130
+ .describe('Full-text search (Suchworte). Boolean operators UND/ODER/NICHT or AND/OR/NOT, parentheses, quoted phrases; wildcard * is trailing-only. Valid for all collections.'),
131
+ title: z
132
+ .string()
133
+ .optional()
134
+ .describe('Title search (Titel) — phrase field. Valid for all collections except council_minutes.'),
135
+ number: z
136
+ .string()
137
+ .optional()
138
+ .describe('Serial number (Avsvnummer / Avnnummer / Spgnummer) — social_insurance, veterinary, health_structure_plans.'),
139
+ published_from: isoDateString
140
+ .optional()
141
+ .describe('Earliest publication/session date (YYYY-MM-DD). All collections except ministerial_decrees (decrees date by force — use in_force_as_of / entered_force_from/to).'),
142
+ published_to: isoDateString
143
+ .optional()
144
+ .describe('Latest publication/session date (YYYY-MM-DD).'),
145
+ in_force_as_of: isoDateString
146
+ .optional()
147
+ .describe('Version in force on this date (YYYY-MM-DD) — veterinary, court_rules, trade_exam_rules, health_structure_plans, ministerial_decrees (the consolidated-ish collections).'),
148
+ entered_force_from: isoDateString
149
+ .optional()
150
+ .describe('Provisions that entered force on/after this date (YYYY-MM-DD) — ministerial_decrees only.'),
151
+ entered_force_to: isoDateString
152
+ .optional()
153
+ .describe('Provisions that entered force on/before this date (YYYY-MM-DD) — ministerial_decrees only.'),
154
+ issuer: z
155
+ .string()
156
+ .optional()
157
+ .describe('Issuing body — social_insurance (Urheber, e.g. ÖGK/SVS/BVAEB/AUVA/PVA), ministerial_decrees (Bundesministerium — abbreviation expanded server-side), council_minutes (Einbringer ministry). Values: ris_list_reference topic issuing_bodies or ministries.'),
158
+ norm: z
159
+ .string()
160
+ .optional()
161
+ .describe('Cited-provision filter (Norm) — "DSG §1", "DSGVO Art32" style. veterinary and ministerial_decrees only ("decrees citing the DSG").'),
162
+ case_number: z
163
+ .string()
164
+ .optional()
165
+ .describe('Business reference number (Geschäftszahl) — veterinary and ministerial_decrees only.'),
166
+ type: z
167
+ .string()
168
+ .optional()
169
+ .describe('Document type (Typ) — trade_exam_rules (Befaehigungspruefungsordnung | Meisterpruefungsordnung), court_rules (Geschaeftsordnung | Geschaeftsverteilung), veterinary (Kundmachungen | VeroeffentlichungenAufGrundVEVO | SonstigeVeroeffentlichungen).'),
170
+ department: z
171
+ .string()
172
+ .optional()
173
+ .describe('Ministry department (Abteilung) — ministerial_decrees only.'),
174
+ plan_type: z
175
+ .enum(['all', 'expert_opinion', 'regulation'])
176
+ .optional()
177
+ .describe('health_structure_plans only. Plan kind — all (default), expert_opinion (Gutachten), or regulation (Verordnungen). Searches the federal ÖSG unless plan_state is set.'),
178
+ plan_state: z
179
+ .enum(STATE_CODES)
180
+ .optional()
181
+ .describe('health_structure_plans only. Restrict to one Bundesland’s regional health-structure plan (RSG) — setting it switches the search from the federal ÖSG to that state’s RSG.'),
182
+ session_number: z
183
+ .string()
184
+ .optional()
185
+ .describe('Council session number (Sitzungsnummer) — council_minutes only.'),
186
+ legislature: z
187
+ .string()
188
+ .optional()
189
+ .describe('Legislative period (Gesetzgebungsperiode, e.g. "XXVII") — council_minutes only.'),
190
+ changed_since: z
191
+ .enum(CHANGED_SINCE_CODES)
192
+ .optional()
193
+ .describe('Coarse recency filter — documents changed in RIS within the interval. For exact windows use ris_track_changes.'),
194
+ sort_by: z
195
+ .enum(['published', 'number'])
196
+ .optional()
197
+ .describe('Sort column: published or number, where the collection has the column. Default: upstream order.'),
198
+ sort_direction: z
199
+ .enum(['ascending', 'descending'])
200
+ .optional()
201
+ .describe('Sort direction; applies with sort_by.'),
202
+ page: z.number().int().min(1).optional().describe('1-based result page. Default 1.'),
203
+ page_size: z
204
+ .union([z.literal(10), z.literal(20), z.literal(50), z.literal(100)])
205
+ .optional()
206
+ .describe('Documents per page — RIS accepts 10, 20, 50, or 100. Default 20.'),
207
+ }),
208
+ output: z.object({
209
+ results: z
210
+ .array(AnnouncementRecordSchema)
211
+ .describe('Matching documents for the requested page. Totals and paging in enrichment.'),
212
+ }),
213
+ enrichment: {
214
+ totalCount: z.number().describe('Total matching documents across all pages.'),
215
+ page: z.number().describe('1-based page number RIS served.'),
216
+ pageSize: z.number().describe('Page size RIS applied.'),
217
+ truncated: z
218
+ .boolean()
219
+ .optional()
220
+ .describe('Present and true when more pages exist beyond this one — raise page to continue.'),
221
+ notice: z
222
+ .string()
223
+ .optional()
224
+ .describe('Zero-hit guidance — names the likely cause and the concrete next call.'),
225
+ },
226
+ errors: [
227
+ {
228
+ reason: 'collection_filter_mismatch',
229
+ code: JsonRpcErrorCode.ValidationError,
230
+ when: 'A parameter was combined with a collection that does not accept it — rejected locally before any upstream call; the message names the offending parameter and lists the collection’s valid parameters.',
231
+ recovery: 'Drop the named parameter or switch collection — each collection accepts a different parameter set. Valid parameters per collection: ris_list_reference topic collections.',
232
+ },
233
+ {
234
+ reason: 'invalid_query',
235
+ code: JsonRpcErrorCode.ValidationError,
236
+ 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.',
237
+ recovery: 'Correct the parameter RIS names in the message. Collections and their issuers: ris_list_reference topic collections or issuing_bodies.',
238
+ },
239
+ {
240
+ reason: 'upstream_error',
241
+ code: JsonRpcErrorCode.ServiceUnavailable,
242
+ when: 'RIS is unreachable, returned a server error, or served an HTML error page.',
243
+ retryable: true,
244
+ recovery: 'RIS is temporarily unavailable — retry after a short delay. If it persists, reduce page_size or narrow the query.',
245
+ },
246
+ ],
247
+ async handler(input, ctx) {
248
+ const { collection } = input;
249
+ const query = meaningful(input.query);
250
+ const title = meaningful(input.title);
251
+ const number = meaningful(input.number);
252
+ const publishedFrom = meaningful(input.published_from);
253
+ const publishedTo = meaningful(input.published_to);
254
+ const inForceAsOf = meaningful(input.in_force_as_of);
255
+ const enteredForceFrom = meaningful(input.entered_force_from);
256
+ const enteredForceTo = meaningful(input.entered_force_to);
257
+ const issuer = meaningful(input.issuer);
258
+ const norm = meaningful(input.norm);
259
+ const caseNumber = meaningful(input.case_number);
260
+ const type = meaningful(input.type);
261
+ const department = meaningful(input.department);
262
+ const sessionNumber = meaningful(input.session_number);
263
+ const legislature = meaningful(input.legislature);
264
+ const collectionEntry = RIS_COLLECTIONS.find((entry) => entry.code === collection);
265
+ const validParams = collectionEntry?.params ?? [];
266
+ const valid = new Set(validParams);
267
+ const conditional = [
268
+ ['title', title],
269
+ ['number', number],
270
+ ['published_from', publishedFrom],
271
+ ['published_to', publishedTo],
272
+ ['in_force_as_of', inForceAsOf],
273
+ ['entered_force_from', enteredForceFrom],
274
+ ['entered_force_to', enteredForceTo],
275
+ ['issuer', issuer],
276
+ ['norm', norm],
277
+ ['case_number', caseNumber],
278
+ ['type', type],
279
+ ['department', department],
280
+ ['plan_type', input.plan_type],
281
+ ['plan_state', input.plan_state],
282
+ ['session_number', sessionNumber],
283
+ ['legislature', legislature],
284
+ ];
285
+ const offending = conditional.find(([name, value]) => value !== undefined && !valid.has(name));
286
+ if (offending) {
287
+ throw ctx.fail('collection_filter_mismatch', `${offending[0]} is not a valid filter for collection '${collection}' — it accepts: ${validParams.join(', ')}.`, { ...ctx.recoveryFor('collection_filter_mismatch') });
288
+ }
289
+ const params = {
290
+ collection,
291
+ ...(query !== undefined && { query }),
292
+ ...(title !== undefined && { title }),
293
+ ...(number !== undefined && { number }),
294
+ ...(publishedFrom !== undefined && { publishedFrom }),
295
+ ...(publishedTo !== undefined && { publishedTo }),
296
+ ...(inForceAsOf !== undefined && { inForceAsOf }),
297
+ ...(enteredForceFrom !== undefined && { enteredForceFrom }),
298
+ ...(enteredForceTo !== undefined && { enteredForceTo }),
299
+ ...(issuer !== undefined && { issuer }),
300
+ ...(norm !== undefined && { norm }),
301
+ ...(caseNumber !== undefined && { caseNumber }),
302
+ ...(type !== undefined && { type }),
303
+ ...(department !== undefined && { department }),
304
+ ...(input.plan_type !== undefined && { planKind: input.plan_type }),
305
+ ...(input.plan_state !== undefined && { planState: input.plan_state }),
306
+ ...(sessionNumber !== undefined && { sessionNumber }),
307
+ ...(legislature !== undefined && { legislature }),
308
+ ...(input.changed_since !== undefined && { changedSince: input.changed_since }),
309
+ ...(input.sort_by !== undefined && { sortBy: input.sort_by }),
310
+ ...(input.sort_direction !== undefined && { sortDirection: input.sort_direction }),
311
+ ...(input.page !== undefined && { page: input.page }),
312
+ ...(input.page_size !== undefined && { pageSize: input.page_size }),
313
+ };
314
+ // Map in-band RIS errors onto this tool's declared contract so reason +
315
+ // recovery reach the wire (service-level throws carry neither).
316
+ const result = await getRisService()
317
+ .searchAnnouncements(params, ctx)
318
+ .catch((err) => {
319
+ if (err instanceof McpError && err.code === JsonRpcErrorCode.InvalidParams) {
320
+ throw ctx.fail('invalid_query', err.message, { ...ctx.recoveryFor('invalid_query') });
321
+ }
322
+ if (err instanceof McpError && err.code === JsonRpcErrorCode.ServiceUnavailable) {
323
+ throw ctx.fail('upstream_error', err.message, { ...ctx.recoveryFor('upstream_error') });
324
+ }
325
+ throw err;
326
+ });
327
+ ctx.log.info('Announcements search completed', {
328
+ collection,
329
+ hits: result.hits.length,
330
+ total: result.total,
331
+ });
332
+ ctx.enrich.total(result.total);
333
+ ctx.enrich({ page: result.page, pageSize: result.pageSize });
334
+ if (result.total > (result.page - 1) * result.pageSize + result.hits.length) {
335
+ ctx.enrich({ truncated: true });
336
+ }
337
+ if (result.total === 0) {
338
+ const fragments = [`0 documents in ${collection}.`];
339
+ if (norm !== undefined) {
340
+ fragments.push("norm must match RIS's cited-norm format — copy from a result's norms_cited.");
341
+ }
342
+ if (issuer !== undefined) {
343
+ fragments.push('issuer must match the RIS designation — abbreviations are expanded for ministries; social-insurance issuers: ris_list_reference topic issuing_bodies.');
344
+ }
345
+ if (collection === 'court_rules') {
346
+ fragments.push('KmGer currently carries LVwG Tirol and Vorarlberg rules only.');
347
+ }
348
+ ctx.enrich.notice(fragments.join(' '));
349
+ }
350
+ return { results: result.hits.map((hit) => toRecord(hit, collection)) };
351
+ },
352
+ // format() populates content[] — the markdown twin of structuredContent. Every output
353
+ // field renders here; totals and paging ride the enrichment trailer.
354
+ format: (result) => {
355
+ if (result.results.length === 0) {
356
+ return [{ type: 'text', text: '_No documents on this page._' }];
357
+ }
358
+ const blocks = result.results.map((r) => {
359
+ const lines = [`## ${r.title ?? r.summary ?? r.document_number}`];
360
+ lines.push(`**Document:** ${r.document_number} (${r.collection})`);
361
+ const facts = [];
362
+ if (r.number !== undefined)
363
+ facts.push(`**Number:** ${r.number}`);
364
+ if (r.published !== undefined)
365
+ facts.push(`**Published:** ${r.published}`);
366
+ if (r.session_date !== undefined)
367
+ facts.push(`**Session:** ${r.session_date}`);
368
+ if (facts.length > 0)
369
+ lines.push(facts.join(' | '));
370
+ lines.push(`**Binding:** ${r.binding}`);
371
+ if (r.issuers.length > 0)
372
+ lines.push(`**Issuer:** ${r.issuers.join(', ')}`);
373
+ if (r.summary !== undefined)
374
+ lines.push(r.summary);
375
+ if (r.norms_cited.length > 0)
376
+ lines.push(`**Norms:** ${r.norms_cited.join('; ')}`);
377
+ if (r.authentic_pdf_url !== undefined)
378
+ lines.push(`**Authentic PDF:** ${r.authentic_pdf_url}`);
379
+ const urls = ['html', 'pdf', 'rtf', 'xml']
380
+ .filter((key) => r.content_urls[key] !== undefined)
381
+ .map((key) => `[${key.toUpperCase()}](${r.content_urls[key]})`);
382
+ if (urls.length > 0)
383
+ lines.push(`**Text:** ${urls.join(' · ')}`);
384
+ return lines.join('\n');
385
+ });
386
+ return [{ type: 'text', text: blocks.join('\n\n') }];
387
+ },
388
+ });
389
+ //# sourceMappingURL=ris-search-announcements.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ris-search-announcements.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/ris-search-announcements.tool.ts"],"names":[],"mappings":"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"}