ris-mcp-ts 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +490 -0
  3. package/dist/client.d.ts +109 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +371 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/constants.d.ts +67 -0
  8. package/dist/constants.d.ts.map +1 -0
  9. package/dist/constants.js +168 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/formatting.d.ts +70 -0
  12. package/dist/formatting.d.ts.map +1 -0
  13. package/dist/formatting.js +366 -0
  14. package/dist/formatting.js.map +1 -0
  15. package/dist/helpers.d.ts +46 -0
  16. package/dist/helpers.d.ts.map +1 -0
  17. package/dist/helpers.js +92 -0
  18. package/dist/helpers.js.map +1 -0
  19. package/dist/index.d.ts +9 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +21 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/parser.d.ts +48 -0
  24. package/dist/parser.d.ts.map +1 -0
  25. package/dist/parser.js +240 -0
  26. package/dist/parser.js.map +1 -0
  27. package/dist/server.d.ts +11 -0
  28. package/dist/server.d.ts.map +1 -0
  29. package/dist/server.js +16 -0
  30. package/dist/server.js.map +1 -0
  31. package/dist/tools/bezirke.d.ts +6 -0
  32. package/dist/tools/bezirke.d.ts.map +1 -0
  33. package/dist/tools/bezirke.js +68 -0
  34. package/dist/tools/bezirke.js.map +1 -0
  35. package/dist/tools/bundesgesetzblatt.d.ts +6 -0
  36. package/dist/tools/bundesgesetzblatt.d.ts.map +1 -0
  37. package/dist/tools/bundesgesetzblatt.js +55 -0
  38. package/dist/tools/bundesgesetzblatt.js.map +1 -0
  39. package/dist/tools/bundesrecht.d.ts +6 -0
  40. package/dist/tools/bundesrecht.d.ts.map +1 -0
  41. package/dist/tools/bundesrecht.js +63 -0
  42. package/dist/tools/bundesrecht.js.map +1 -0
  43. package/dist/tools/dokument.d.ts +6 -0
  44. package/dist/tools/dokument.d.ts.map +1 -0
  45. package/dist/tools/dokument.js +244 -0
  46. package/dist/tools/dokument.js.map +1 -0
  47. package/dist/tools/gemeinden.d.ts +6 -0
  48. package/dist/tools/gemeinden.d.ts.map +1 -0
  49. package/dist/tools/gemeinden.js +125 -0
  50. package/dist/tools/gemeinden.js.map +1 -0
  51. package/dist/tools/history.d.ts +6 -0
  52. package/dist/tools/history.d.ts.map +1 -0
  53. package/dist/tools/history.js +65 -0
  54. package/dist/tools/history.js.map +1 -0
  55. package/dist/tools/index.d.ts +12 -0
  56. package/dist/tools/index.d.ts.map +1 -0
  57. package/dist/tools/index.js +36 -0
  58. package/dist/tools/index.js.map +1 -0
  59. package/dist/tools/judikatur.d.ts +6 -0
  60. package/dist/tools/judikatur.d.ts.map +1 -0
  61. package/dist/tools/judikatur.js +46 -0
  62. package/dist/tools/judikatur.js.map +1 -0
  63. package/dist/tools/landesgesetzblatt.d.ts +6 -0
  64. package/dist/tools/landesgesetzblatt.d.ts.map +1 -0
  65. package/dist/tools/landesgesetzblatt.js +60 -0
  66. package/dist/tools/landesgesetzblatt.js.map +1 -0
  67. package/dist/tools/landesrecht.d.ts +6 -0
  68. package/dist/tools/landesrecht.d.ts.map +1 -0
  69. package/dist/tools/landesrecht.js +51 -0
  70. package/dist/tools/landesrecht.js.map +1 -0
  71. package/dist/tools/regierungsvorlagen.d.ts +6 -0
  72. package/dist/tools/regierungsvorlagen.d.ts.map +1 -0
  73. package/dist/tools/regierungsvorlagen.js +97 -0
  74. package/dist/tools/regierungsvorlagen.js.map +1 -0
  75. package/dist/tools/sonstige.d.ts +6 -0
  76. package/dist/tools/sonstige.d.ts.map +1 -0
  77. package/dist/tools/sonstige.js +271 -0
  78. package/dist/tools/sonstige.js.map +1 -0
  79. package/dist/tools/verordnungen.d.ts +6 -0
  80. package/dist/tools/verordnungen.d.ts.map +1 -0
  81. package/dist/tools/verordnungen.js +68 -0
  82. package/dist/tools/verordnungen.js.map +1 -0
  83. package/dist/types.d.ts +471 -0
  84. package/dist/types.d.ts.map +1 -0
  85. package/dist/types.js +151 -0
  86. package/dist/types.js.map +1 -0
  87. package/package.json +87 -0
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Formatting utilities for RIS MCP Server responses.
3
+ *
4
+ * This module provides functions to format RIS API responses for optimal
5
+ * LLM consumption, including proper Austrian legal citations, search results
6
+ * formatting, and document content preparation.
7
+ */
8
+ import type { Document, SearchResult } from './types.js';
9
+ /**
10
+ * Convert API date format to readable German format.
11
+ */
12
+ export declare function formatDate(dateStr: string | null | undefined): string;
13
+ /**
14
+ * Convert HTML to clean readable text using cheerio.
15
+ */
16
+ export declare function htmlToText(htmlContent: string): string;
17
+ /**
18
+ * Document data for citation formatting.
19
+ */
20
+ interface CitationData {
21
+ applikation?: string;
22
+ titel?: string;
23
+ kurztitel?: string | null;
24
+ dokumentnummer?: string;
25
+ citation?: {
26
+ kurztitel?: string | null;
27
+ langtitel?: string | null;
28
+ kundmachungsorgan?: string | null;
29
+ paragraph?: string | null;
30
+ inkrafttreten?: string | null;
31
+ };
32
+ }
33
+ /**
34
+ * Format a proper Austrian legal citation.
35
+ */
36
+ export declare function formatCitation(doc: Document | CitationData): string;
37
+ /**
38
+ * Format search results for display.
39
+ */
40
+ export declare function formatSearchResults(results: SearchResult | Record<string, unknown>, format?: 'markdown' | 'json'): string;
41
+ /**
42
+ * Metadata for document formatting.
43
+ */
44
+ export interface DocumentMetadata {
45
+ dokumentnummer?: string;
46
+ applikation?: string;
47
+ titel?: string;
48
+ kurztitel?: string | null;
49
+ citation?: {
50
+ kurztitel?: string | null;
51
+ langtitel?: string | null;
52
+ kundmachungsorgan?: string | null;
53
+ paragraph?: string | null;
54
+ eli?: string | null;
55
+ inkrafttreten?: string | null;
56
+ ausserkrafttreten?: string | null;
57
+ };
58
+ dokument_url?: string | null;
59
+ gesamte_rechtsvorschrift_url?: string | null;
60
+ }
61
+ /**
62
+ * Format a full document for LLM context.
63
+ */
64
+ export declare function formatDocument(content: string, metadata: DocumentMetadata, format?: 'markdown' | 'json'): string;
65
+ /**
66
+ * Truncate response if too long.
67
+ */
68
+ export declare function truncateResponse(text: string, limit?: number): string;
69
+ export {};
70
+ //# sourceMappingURL=formatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../src/formatting.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAYzD;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAiBrE;AAMD;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAuBtD;AAMD;;GAEG;AACH,UAAU,YAAY;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE;QACT,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,QAAQ,GAAG,YAAY,GAAG,MAAM,CAcnE;AA6GD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/C,MAAM,GAAE,UAAU,GAAG,MAAmB,GACvC,MAAM,CAsBR;AA6FD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE;QACT,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACnC,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,4BAA4B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,GAAE,UAAU,GAAG,MAAmB,GACvC,MAAM,CAaR;AAuFD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAkB,GAAG,MAAM,CAsC9E"}
@@ -0,0 +1,366 @@
1
+ /**
2
+ * Formatting utilities for RIS MCP Server responses.
3
+ *
4
+ * This module provides functions to format RIS API responses for optimal
5
+ * LLM consumption, including proper Austrian legal citations, search results
6
+ * formatting, and document content preparation.
7
+ */
8
+ import * as cheerio from 'cheerio';
9
+ // =============================================================================
10
+ // Constants
11
+ // =============================================================================
12
+ const CHARACTER_LIMIT = 25000;
13
+ // =============================================================================
14
+ // Date Formatting
15
+ // =============================================================================
16
+ /**
17
+ * Convert API date format to readable German format.
18
+ */
19
+ export function formatDate(dateStr) {
20
+ if (!dateStr) {
21
+ return '';
22
+ }
23
+ try {
24
+ // Handle ISO format (YYYY-MM-DD)
25
+ const datePart = dateStr.slice(0, 10);
26
+ const parts = datePart.split('-');
27
+ if (parts.length === 3) {
28
+ const [year, month, day] = parts;
29
+ return `${day}.${month}.${year}`;
30
+ }
31
+ return dateStr;
32
+ }
33
+ catch {
34
+ return dateStr;
35
+ }
36
+ }
37
+ // =============================================================================
38
+ // HTML Processing
39
+ // =============================================================================
40
+ /**
41
+ * Convert HTML to clean readable text using cheerio.
42
+ */
43
+ export function htmlToText(htmlContent) {
44
+ if (!htmlContent) {
45
+ return '';
46
+ }
47
+ const $ = cheerio.load(htmlContent);
48
+ // Remove script, style, and head elements
49
+ $('script, style, head').remove();
50
+ // Process the body or entire document
51
+ let text = $('body').length > 0 ? $('body').text() : $.text();
52
+ // Clean up whitespace
53
+ text = text
54
+ .replace(/\n{3,}/g, '\n\n') // Normalize multiple newlines
55
+ .replace(/[ \t]+/g, ' ') // Normalize multiple spaces
56
+ .split('\n')
57
+ .map((line) => line.trim())
58
+ .join('\n')
59
+ .trim();
60
+ return text;
61
+ }
62
+ /**
63
+ * Format a proper Austrian legal citation.
64
+ */
65
+ export function formatCitation(doc) {
66
+ const data = doc;
67
+ const applikation = data.applikation ?? '';
68
+ const citationData = data.citation ?? {};
69
+ const titel = data.titel ?? '';
70
+ const kurztitel = data.kurztitel ?? citationData.kurztitel ?? '';
71
+ // Handle court decisions (Judikatur)
72
+ if (['Justiz', 'Vfgh', 'Vwgh', 'Bvwg', 'Lvwg', 'Dsk'].includes(applikation)) {
73
+ return formatCourtCitation(data, applikation, titel);
74
+ }
75
+ // Handle federal law (Bundesrecht)
76
+ return formatLawCitation(data, kurztitel, citationData);
77
+ }
78
+ /**
79
+ * Format citation for court decisions.
80
+ */
81
+ function formatCourtCitation(data, applikation, titel) {
82
+ const courtPrefixes = {
83
+ Justiz: '',
84
+ Vfgh: 'VfGH',
85
+ Vwgh: 'VwGH',
86
+ Bvwg: 'BVwG',
87
+ Lvwg: 'LVwG',
88
+ Dsk: 'DSK',
89
+ };
90
+ const dokumentnummer = data.dokumentnummer ?? '';
91
+ // For ordinary courts
92
+ if (applikation === 'Justiz') {
93
+ // Title often contains "OGH 5 Ob 123/23t" or similar
94
+ const match = titel.match(/(OGH|OLG|LG|BG)\s*[,:]?\s*(\d+\s*\w+\s*\d+\/\d+\w?)/i);
95
+ if (match) {
96
+ return `${match[1]} ${match[2]}`;
97
+ }
98
+ // Try to extract from dokumentnummer
99
+ const dokMatch = dokumentnummer.match(/(OGH|OLG|LG|BG)\d+/i);
100
+ if (dokMatch) {
101
+ const court = dokMatch[1].toUpperCase();
102
+ const caseMatch = dokumentnummer.match(/_(\d+\w+)_(\d+)([A-Z])\d+_/);
103
+ if (caseMatch) {
104
+ return `${court} ${caseMatch[1]}/${caseMatch[2]}${caseMatch[3].toLowerCase()}`;
105
+ }
106
+ }
107
+ }
108
+ // For VfGH, VwGH etc.
109
+ const prefix = courtPrefixes[applikation] ?? '';
110
+ if (prefix) {
111
+ const dateMatch = titel.match(/(\d{1,2}\.\d{1,2}\.\d{4})/);
112
+ const caseMatch = titel.match(/([EGUBVW]\s*\d+\/\d+)/i);
113
+ if (dateMatch && caseMatch) {
114
+ return `${prefix} ${dateMatch[1]}, ${caseMatch[1]}`;
115
+ }
116
+ if (caseMatch) {
117
+ return `${prefix} ${caseMatch[1]}`;
118
+ }
119
+ }
120
+ // Fallback
121
+ if (titel.length <= 60) {
122
+ return titel;
123
+ }
124
+ return dokumentnummer;
125
+ }
126
+ /**
127
+ * Format citation for laws and regulations.
128
+ */
129
+ function formatLawCitation(data, kurztitel, citationData) {
130
+ const paragraph = citationData?.paragraph ?? '';
131
+ const kundmachungsorgan = citationData?.kundmachungsorgan ?? '';
132
+ const parts = [];
133
+ if (paragraph) {
134
+ parts.push(paragraph);
135
+ }
136
+ if (kurztitel) {
137
+ parts.push(kurztitel);
138
+ }
139
+ if (kundmachungsorgan && kundmachungsorgan.length < 30) {
140
+ parts.push(`(${kundmachungsorgan})`);
141
+ }
142
+ if (parts.length > 0) {
143
+ return parts.join(' ');
144
+ }
145
+ return data.titel ?? data.dokumentnummer ?? '';
146
+ }
147
+ // =============================================================================
148
+ // Search Results Formatting
149
+ // =============================================================================
150
+ /**
151
+ * Document to dictionary representation.
152
+ */
153
+ function documentToDict(doc) {
154
+ return {
155
+ dokumentnummer: doc.dokumentnummer,
156
+ applikation: doc.applikation,
157
+ titel: doc.titel,
158
+ kurztitel: doc.kurztitel,
159
+ citation: doc.citation,
160
+ content_urls: doc.content_urls,
161
+ dokument_url: doc.dokument_url,
162
+ gesamte_rechtsvorschrift_url: doc.gesamte_rechtsvorschrift_url,
163
+ };
164
+ }
165
+ /**
166
+ * Format search results for display.
167
+ */
168
+ export function formatSearchResults(results, format = 'markdown') {
169
+ let data;
170
+ if ('documents' in results && Array.isArray(results.documents)) {
171
+ // It's a SearchResult
172
+ const sr = results;
173
+ data = {
174
+ total_hits: sr.total_hits,
175
+ page: sr.page,
176
+ page_size: sr.page_size,
177
+ has_more: sr.has_more,
178
+ documents: sr.documents.map(documentToDict),
179
+ };
180
+ }
181
+ else {
182
+ data = results;
183
+ }
184
+ if (format === 'json') {
185
+ return JSON.stringify(data, null, 2);
186
+ }
187
+ return formatSearchResultsMarkdown(data);
188
+ }
189
+ /**
190
+ * Format search results as markdown.
191
+ */
192
+ function formatSearchResultsMarkdown(data) {
193
+ const totalHits = data.total_hits ?? 0;
194
+ const page = data.page ?? 1;
195
+ const pageSize = data.page_size ?? 20;
196
+ const hasMore = data.has_more ?? false;
197
+ const documents = data.documents ?? [];
198
+ const totalPages = pageSize > 0 ? Math.ceil(totalHits / pageSize) : 1;
199
+ const lines = [];
200
+ // Summary line
201
+ lines.push(`**Gefunden: ${totalHits} Treffer** (Seite ${page} von ${totalPages})`);
202
+ lines.push('');
203
+ if (documents.length === 0) {
204
+ lines.push('_Keine Dokumente gefunden._');
205
+ return lines.join('\n');
206
+ }
207
+ // Format each document
208
+ for (let i = 0; i < documents.length; i++) {
209
+ const doc = documents[i];
210
+ const citation = formatCitation(doc);
211
+ lines.push(`### ${i + 1}. ${citation}`);
212
+ // Title (if different from citation)
213
+ const titel = doc.titel ?? '';
214
+ if (titel && titel !== citation) {
215
+ lines.push(`**${titel}**`);
216
+ }
217
+ // Metadata
218
+ const citationData = doc.citation ?? {};
219
+ const metadataParts = [];
220
+ // Long title
221
+ const langtitel = citationData.langtitel;
222
+ if (langtitel) {
223
+ metadataParts.push(`_${langtitel}_`);
224
+ }
225
+ // Inkrafttreten
226
+ const inkrafttreten = citationData.inkrafttreten;
227
+ if (inkrafttreten) {
228
+ metadataParts.push(`In Kraft seit: ${formatDate(inkrafttreten)}`);
229
+ }
230
+ // Ausserkrafttreten
231
+ const ausserkrafttreten = citationData.ausserkrafttreten;
232
+ if (ausserkrafttreten && ausserkrafttreten !== '9999-12-31') {
233
+ metadataParts.push(`Außer Kraft: ${formatDate(ausserkrafttreten)}`);
234
+ }
235
+ // Kundmachungsorgan
236
+ const kundmachungsorgan = citationData.kundmachungsorgan;
237
+ if (kundmachungsorgan) {
238
+ metadataParts.push(`Fundstelle: ${kundmachungsorgan}`);
239
+ }
240
+ if (metadataParts.length > 0) {
241
+ lines.push(metadataParts.join(' \n'));
242
+ }
243
+ // Document number for retrieval
244
+ const dokumentnummer = doc.dokumentnummer ?? '';
245
+ if (dokumentnummer) {
246
+ lines.push(`\`Dokumentnummer: ${dokumentnummer}\``);
247
+ }
248
+ lines.push('');
249
+ }
250
+ // Pagination hint
251
+ if (hasMore) {
252
+ lines.push('---');
253
+ lines.push(`_Weitere Treffer verfügbar. Verwende \`seite: ${page + 1}\` für die nächste Seite._`);
254
+ }
255
+ return lines.join('\n');
256
+ }
257
+ /**
258
+ * Format a full document for LLM context.
259
+ */
260
+ export function formatDocument(content, metadata, format = 'markdown') {
261
+ if (format === 'json') {
262
+ return JSON.stringify({
263
+ metadata,
264
+ content: htmlToText(content),
265
+ }, null, 2);
266
+ }
267
+ return formatDocumentMarkdown(content, metadata);
268
+ }
269
+ /**
270
+ * Format document as markdown.
271
+ */
272
+ function formatDocumentMarkdown(content, metadata) {
273
+ const lines = [];
274
+ // Citation header
275
+ const citation = formatCitation(metadata);
276
+ lines.push(`# ${citation}`);
277
+ lines.push('');
278
+ // Metadata block
279
+ lines.push('## Dokumentinformation');
280
+ lines.push('');
281
+ const citationData = metadata.citation ?? {};
282
+ // Full title
283
+ const langtitel = citationData.langtitel ?? metadata.titel ?? '';
284
+ if (langtitel) {
285
+ lines.push(`**Titel:** ${langtitel}`);
286
+ }
287
+ // Paragraph
288
+ const paragraph = citationData.paragraph;
289
+ if (paragraph) {
290
+ lines.push(`**Paragraph:** ${paragraph}`);
291
+ }
292
+ // Kundmachungsorgan
293
+ const kundmachungsorgan = citationData.kundmachungsorgan;
294
+ if (kundmachungsorgan) {
295
+ lines.push(`**Kundmachungsorgan:** ${kundmachungsorgan}`);
296
+ }
297
+ // Dates
298
+ const inkrafttreten = citationData.inkrafttreten;
299
+ if (inkrafttreten) {
300
+ lines.push(`**In Kraft seit:** ${formatDate(inkrafttreten)}`);
301
+ }
302
+ const ausserkrafttreten = citationData.ausserkrafttreten;
303
+ if (ausserkrafttreten && ausserkrafttreten !== '9999-12-31') {
304
+ lines.push(`**Außer Kraft:** ${formatDate(ausserkrafttreten)}`);
305
+ }
306
+ // ELI
307
+ const eli = citationData.eli;
308
+ if (eli) {
309
+ lines.push(`**ELI:** ${eli}`);
310
+ }
311
+ // Document number
312
+ const dokumentnummer = metadata.dokumentnummer ?? '';
313
+ if (dokumentnummer) {
314
+ lines.push(`**Dokumentnummer:** \`${dokumentnummer}\``);
315
+ }
316
+ // URLs
317
+ const dokumentUrl = metadata.dokument_url;
318
+ if (dokumentUrl) {
319
+ lines.push(`**Quelle:** [${dokumentUrl}](${dokumentUrl})`);
320
+ }
321
+ const gesamteUrl = metadata.gesamte_rechtsvorschrift_url;
322
+ if (gesamteUrl) {
323
+ lines.push(`**Gesamte Rechtsvorschrift:** [${gesamteUrl}](${gesamteUrl})`);
324
+ }
325
+ lines.push('');
326
+ // Content
327
+ lines.push('## Inhalt');
328
+ lines.push('');
329
+ const cleanContent = htmlToText(content);
330
+ lines.push(cleanContent);
331
+ return lines.join('\n');
332
+ }
333
+ // =============================================================================
334
+ // Response Truncation
335
+ // =============================================================================
336
+ /**
337
+ * Truncate response if too long.
338
+ */
339
+ export function truncateResponse(text, limit = CHARACTER_LIMIT) {
340
+ if (text.length <= limit) {
341
+ return text;
342
+ }
343
+ const originalLen = text.length;
344
+ // Reserve space for the warning message
345
+ const truncateAt = limit - 200;
346
+ // Try to truncate at a paragraph boundary
347
+ let truncated = text.slice(0, truncateAt);
348
+ // Find last paragraph break
349
+ const lastPara = truncated.lastIndexOf('\n\n');
350
+ if (lastPara > truncateAt * 0.7) {
351
+ truncated = truncated.slice(0, lastPara);
352
+ }
353
+ else {
354
+ // Try sentence boundary
355
+ const lastSentence = Math.max(truncated.lastIndexOf('. '), truncated.lastIndexOf('.\n'), truncated.lastIndexOf('? '), truncated.lastIndexOf('! '));
356
+ if (lastSentence > truncateAt * 0.8) {
357
+ truncated = truncated.slice(0, lastSentence + 1);
358
+ }
359
+ }
360
+ const newLen = truncated.length;
361
+ const warning = `\n\n---\n` +
362
+ `Antwort gekuerzt (${originalLen} -> ${newLen} Zeichen). ` +
363
+ `Verwende spezifischere Suchparameter oder ris_dokument fuer Einzeldokumente.`;
364
+ return truncated + warning;
365
+ }
366
+ //# sourceMappingURL=formatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.js","sourceRoot":"","sources":["../src/formatting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Helper functions for MCP tool handlers.
3
+ *
4
+ * Extracted from server.ts to reduce file size and improve maintainability.
5
+ */
6
+ /**
7
+ * Format an error response in German.
8
+ */
9
+ export declare function formatErrorResponse(error: unknown): string;
10
+ /** MCP tool response type with index signature for SDK compatibility */
11
+ export type McpToolResponse = {
12
+ [x: string]: unknown;
13
+ content: [{
14
+ type: 'text';
15
+ text: string;
16
+ }];
17
+ };
18
+ /**
19
+ * Create a standard MCP text response.
20
+ */
21
+ export declare function createMcpResponse(text: string): McpToolResponse;
22
+ /**
23
+ * Create a validation error response listing required parameters.
24
+ */
25
+ export declare function createValidationErrorResponse(requiredParams: string[]): McpToolResponse;
26
+ /**
27
+ * Check if any of the specified parameters has a truthy value.
28
+ */
29
+ export declare function hasAnyParam(args: Record<string, unknown>, keys: string[]): boolean;
30
+ /**
31
+ * Build base API parameters common to all search requests.
32
+ */
33
+ export declare function buildBaseParams(applikation: string, limit: number, seite: number): Record<string, unknown>;
34
+ /**
35
+ * Add optional parameters to the params object.
36
+ * Only adds values that are truthy (not undefined, null, or empty string).
37
+ */
38
+ export declare function addOptionalParams(params: Record<string, unknown>, mappings: [value: unknown, key: string][]): void;
39
+ /** Search function type for API calls */
40
+ export type SearchFunction = (params: Record<string, unknown>) => Promise<unknown>;
41
+ /**
42
+ * Execute a search tool and return formatted results.
43
+ * Handles the common try-catch, parsing, formatting, and truncation logic.
44
+ */
45
+ export declare function executeSearchTool(searchFn: SearchFunction, params: Record<string, unknown>, responseFormat: 'markdown' | 'json'): Promise<McpToolResponse>;
46
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CA2B1D;AAMD,wEAAwE;AAExE,MAAM,MAAM,eAAe,GAAG;IAC5B,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACrB,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3C,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAE/D;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,eAAe,CAKvF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAKlF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMzB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,GACxC,IAAI,CAMN;AAED,yCAAyC;AACzC,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEnF;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,cAAc,EAAE,UAAU,GAAG,MAAM,GAClC,OAAO,CAAC,eAAe,CAAC,CAU1B"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Helper functions for MCP tool handlers.
3
+ *
4
+ * Extracted from server.ts to reduce file size and improve maintainability.
5
+ */
6
+ import { RISAPIError, RISParsingError, RISTimeoutError } from './client.js';
7
+ import { formatSearchResults, truncateResponse } from './formatting.js';
8
+ import { parseSearchResults } from './parser.js';
9
+ import { limitToDokumenteProSeite } from './types.js';
10
+ // =============================================================================
11
+ // Error Handling
12
+ // =============================================================================
13
+ /**
14
+ * Format an error response in German.
15
+ */
16
+ export function formatErrorResponse(error) {
17
+ if (error instanceof RISTimeoutError) {
18
+ return ('**Fehler:** Die Anfrage an das RIS hat zu lange gedauert.\n\n' +
19
+ 'Bitte versuche es erneut oder verwende spezifischere Suchparameter.');
20
+ }
21
+ if (error instanceof RISParsingError) {
22
+ return ('**Fehler:** Die Antwort des RIS konnte nicht verarbeitet werden.\n\n' +
23
+ `Technische Details: ${error.message}`);
24
+ }
25
+ if (error instanceof RISAPIError) {
26
+ const statusInfo = error.statusCode ? ` (Status: ${error.statusCode})` : '';
27
+ return (`**Fehler:** Das RIS hat einen Fehler zurueckgegeben${statusInfo}.\n\n` +
28
+ `Details: ${error.message}`);
29
+ }
30
+ return ('**Fehler:** Ein unerwarteter Fehler ist aufgetreten.\n\n' +
31
+ `Details: ${error instanceof Error ? error.message : String(error)}`);
32
+ }
33
+ /**
34
+ * Create a standard MCP text response.
35
+ */
36
+ export function createMcpResponse(text) {
37
+ return { content: [{ type: 'text', text }] };
38
+ }
39
+ /**
40
+ * Create a validation error response listing required parameters.
41
+ */
42
+ export function createValidationErrorResponse(requiredParams) {
43
+ const paramList = requiredParams.map((p) => `- \`${p}\``).join('\n');
44
+ return createMcpResponse('**Fehler:** Bitte gib mindestens einen Suchparameter an:\n' + paramList);
45
+ }
46
+ /**
47
+ * Check if any of the specified parameters has a truthy value.
48
+ */
49
+ export function hasAnyParam(args, keys) {
50
+ return keys.some((key) => {
51
+ const value = args[key];
52
+ return value !== undefined && value !== null && value !== '';
53
+ });
54
+ }
55
+ /**
56
+ * Build base API parameters common to all search requests.
57
+ */
58
+ export function buildBaseParams(applikation, limit, seite) {
59
+ return {
60
+ Applikation: applikation,
61
+ DokumenteProSeite: limitToDokumenteProSeite(limit),
62
+ Seitennummer: seite,
63
+ };
64
+ }
65
+ /**
66
+ * Add optional parameters to the params object.
67
+ * Only adds values that are truthy (not undefined, null, or empty string).
68
+ */
69
+ export function addOptionalParams(params, mappings) {
70
+ for (const [value, key] of mappings) {
71
+ if (value !== undefined && value !== null && value !== '') {
72
+ params[key] = value;
73
+ }
74
+ }
75
+ }
76
+ /**
77
+ * Execute a search tool and return formatted results.
78
+ * Handles the common try-catch, parsing, formatting, and truncation logic.
79
+ */
80
+ export async function executeSearchTool(searchFn, params, responseFormat) {
81
+ try {
82
+ const apiResponse = await searchFn(params);
83
+ const searchResult = parseSearchResults(apiResponse);
84
+ const formatted = formatSearchResults(searchResult, responseFormat);
85
+ const result = truncateResponse(formatted);
86
+ return createMcpResponse(result);
87
+ }
88
+ catch (e) {
89
+ return createMcpResponse(formatErrorResponse(e));
90
+ }
91
+ }
92
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Entry point for the RIS MCP Server.
4
+ *
5
+ * Starts the MCP server with stdio transport for communication
6
+ * with Claude Desktop or other MCP clients.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Entry point for the RIS MCP Server.
4
+ *
5
+ * Starts the MCP server with stdio transport for communication
6
+ * with Claude Desktop or other MCP clients.
7
+ */
8
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
9
+ import { server } from './server.js';
10
+ /**
11
+ * Main function to start the MCP server.
12
+ */
13
+ async function main() {
14
+ const transport = new StdioServerTransport();
15
+ await server.connect(transport);
16
+ }
17
+ main().catch((error) => {
18
+ console.error('Failed to start RIS MCP server:', error);
19
+ process.exit(1);
20
+ });
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}