@cyanheads/ris-austria-mcp-server 0.2.5 → 0.2.7

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 (44) hide show
  1. package/AGENTS.md +1 -1
  2. package/CLAUDE.md +1 -1
  3. package/LICENSE +1 -1
  4. package/README.md +56 -50
  5. package/changelog/0.2.x/0.2.6.md +17 -0
  6. package/changelog/0.2.x/0.2.7.md +17 -0
  7. package/dist/mcp-server/tools/definitions/_shared.d.ts +23 -0
  8. package/dist/mcp-server/tools/definitions/_shared.d.ts.map +1 -1
  9. package/dist/mcp-server/tools/definitions/_shared.js +28 -1
  10. package/dist/mcp-server/tools/definitions/_shared.js.map +1 -1
  11. package/dist/mcp-server/tools/definitions/ris-lookup-citation.tool.d.ts.map +1 -1
  12. package/dist/mcp-server/tools/definitions/ris-lookup-citation.tool.js +185 -48
  13. package/dist/mcp-server/tools/definitions/ris-lookup-citation.tool.js.map +1 -1
  14. package/dist/mcp-server/tools/definitions/ris-search-announcements.tool.d.ts +2 -2
  15. package/dist/mcp-server/tools/definitions/ris-search-announcements.tool.d.ts.map +1 -1
  16. package/dist/mcp-server/tools/definitions/ris-search-announcements.tool.js +20 -6
  17. package/dist/mcp-server/tools/definitions/ris-search-announcements.tool.js.map +1 -1
  18. package/dist/mcp-server/tools/definitions/ris-search-case-law.tool.d.ts +2 -2
  19. package/dist/mcp-server/tools/definitions/ris-search-case-law.tool.d.ts.map +1 -1
  20. package/dist/mcp-server/tools/definitions/ris-search-case-law.tool.js +21 -9
  21. package/dist/mcp-server/tools/definitions/ris-search-case-law.tool.js.map +1 -1
  22. package/dist/mcp-server/tools/definitions/ris-search-drafts.tool.d.ts +2 -2
  23. package/dist/mcp-server/tools/definitions/ris-search-drafts.tool.js +2 -2
  24. package/dist/mcp-server/tools/definitions/ris-search-drafts.tool.js.map +1 -1
  25. package/dist/mcp-server/tools/definitions/ris-search-gazette.tool.d.ts +2 -2
  26. package/dist/mcp-server/tools/definitions/ris-search-gazette.tool.d.ts.map +1 -1
  27. package/dist/mcp-server/tools/definitions/ris-search-gazette.tool.js +102 -30
  28. package/dist/mcp-server/tools/definitions/ris-search-gazette.tool.js.map +1 -1
  29. package/dist/mcp-server/tools/definitions/ris-search-legislation.tool.d.ts +2 -2
  30. package/dist/mcp-server/tools/definitions/ris-search-legislation.tool.js +2 -2
  31. package/dist/mcp-server/tools/definitions/ris-search-legislation.tool.js.map +1 -1
  32. package/dist/services/ris/reference/citation-formats.d.ts +4 -4
  33. package/dist/services/ris/reference/citation-formats.d.ts.map +1 -1
  34. package/dist/services/ris/reference/citation-formats.js +4 -4
  35. package/dist/services/ris/reference/citation-formats.js.map +1 -1
  36. package/dist/services/ris/reference/courts.d.ts +2 -2
  37. package/dist/services/ris/reference/courts.d.ts.map +1 -1
  38. package/dist/services/ris/reference/courts.js +2 -2
  39. package/dist/services/ris/reference/courts.js.map +1 -1
  40. package/dist/services/ris/request-builder.d.ts.map +1 -1
  41. package/dist/services/ris/request-builder.js +29 -8
  42. package/dist/services/ris/request-builder.js.map +1 -1
  43. package/package.json +1 -1
  44. package/server.json +3 -3
package/AGENTS.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Developer Protocol
2
2
 
3
3
  **Server:** ris-austria-mcp-server
4
- **Version:** 0.2.5
4
+ **Version:** 0.2.7
5
5
  **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.11.0`
6
6
  **Engines:** Bun ≥1.3.0, Node ≥24.0.0
7
7
  **MCP SDK:** `@modelcontextprotocol/sdk` ^1.29.0
package/CLAUDE.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Developer Protocol
2
2
 
3
3
  **Server:** ris-austria-mcp-server
4
- **Version:** 0.2.5
4
+ **Version:** 0.2.7
5
5
  **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.11.0`
6
6
  **Engines:** Bun ≥1.3.0, Node ≥24.0.0
7
7
  **MCP SDK:** `@modelcontextprotocol/sdk` ^1.29.0
package/LICENSE CHANGED
@@ -186,7 +186,7 @@ Apache License
186
186
  same "printed page" as the copyright notice for easier
187
187
  identification within third-party archives.
188
188
 
189
- Copyright 2025 Casey Hand @cyanheads
189
+ Copyright 2026 Casey Hand @cyanheads
190
190
 
191
191
  Licensed under the Apache License, Version 2.0 (the "License");
192
192
  you may not use this file except in compliance with the License.
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  <div align="center">
9
9
 
10
- [![Version](https://img.shields.io/badge/Version-0.2.5-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/ris-austria-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^1.29.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/ris-austria-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/ris-austria-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^7.0.2-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.3.2-blueviolet.svg?style=flat-square)](https://bun.sh/)
10
+ [![Version](https://img.shields.io/badge/Version-0.2.7-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/ris-austria-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^1.29.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/ris-austria-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/ris-austria-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^7.0.2-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.3.2-blueviolet.svg?style=flat-square)](https://bun.sh/)
11
11
 
12
12
  </div>
13
13
 
@@ -27,89 +27,96 @@
27
27
 
28
28
  ---
29
29
 
30
- [RIS](https://www.ris.bka.gv.at/) (Rechtsinformationssystem des Bundes) is the Austrian government's official legal database: consolidated federal, state, and municipal law, case law across every Austrian court and tribunal, the authentic gazettes at every level of government (whose promulgated text is binding under Austrian law), the pre-parliamentary lawmaking pipeline, and ministerial decrees. This server wraps the keyless RIS OGD REST API (v2.6, CC BY 4.0) for MCP agents — the **entire** OGD application surface, back to the Reichsgesetzblatt of 1848. It labels every document's binding status and never presents non-authentic text as the authentic wording.
30
+ [RIS](https://www.ris.bka.gv.at/) (Rechtsinformationssystem des Bundes) is the Austrian government's official legal database: consolidated federal, state, and municipal law, case law from every Austrian court and tribunal, the authentic gazettes whose promulgated text is binding under Austrian law, the pre-parliamentary lawmaking pipeline, and ministerial decrees.
31
+
32
+ This server wraps the keyless RIS OGD REST API (v2.6, CC BY 4.0) for MCP agents, covering all 39 OGD applications and reaching back to the Reichsgesetzblatt of 1848. Every response labels the document's binding status, since only the amtssignierte gazette wording is legally binding.
31
33
 
32
34
  ## Tools
33
35
 
34
- Nine tools split by document class, plus a deterministic citation resolver, document retrieval, a change feed, and an offline vocabulary reference:
36
+ Five search tools split by document class, plus a citation resolver, document retrieval, a change feed, and an offline vocabulary reference:
35
37
 
36
38
  | Tool | Description |
37
39
  |:---|:---|
38
- | `ris_search_legislation` | Search consolidated federal, state, and municipal law — one document per §/Artikel/Anlage — filtered to the version in force on a given date (defaults to today). Also serves English translations of selected laws. |
39
- | `ris_search_case_law` | Search Austrian case law (Judikatur) in one court or tribunal per call — VfGH, VwGH, ordinary courts, BVwG, LVwG, DSB, the party-transparency senate, and ten more. |
40
- | `ris_search_gazette` | Browse the promulgation record at every level — federal (three era tiers back to 1848, auto-routed), state law & ordinance gazettes, district, and municipal — the compliance-monitoring surface. |
40
+ | `ris_search_legislation` | Search consolidated federal, state, and municipal law, one document per §/Artikel/Anlage, filtered to the version in force on a given date (defaults to today). Also serves English translations of selected laws. |
41
+ | `ris_search_case_law` | Search Austrian case law (Judikatur), one court or tribunal per call: VfGH, VwGH, ordinary courts, BVwG, LVwG, DSB, the party-transparency senate, and ten more. |
42
+ | `ris_search_gazette` | Browse the promulgation record at every level of government: federal (three era tiers back to 1848, auto-routed), state law and ordinance gazettes, district, and municipal. |
41
43
  | `ris_search_drafts` | Search the federal lawmaking pipeline: ministerial drafts in public review (Begutachtungsentwürfe) and government bills (Regierungsvorlagen). |
42
44
  | `ris_search_announcements` | Search sectoral official gazettes and executive documents: social-insurance notices, veterinary notices, court rules, trade-exam regulations, health structure plans, ministerial decrees, council-of-ministers minutes. |
43
- | `ris_lookup_citation` | Resolve one Austrian legal citation ("§ 6 DSG", "BGBl. I Nr. 165/1999", "RGBl. Nr. 189/1902", a Geschäftszahl, "VfSlg 19.632/2012") deterministically to its canonical document. |
45
+ | `ris_lookup_citation` | Resolve one Austrian legal citation ("§ 6 DSG", "BGBl. I Nr. 165/1999", "RGBl. Nr. 189/1902", a Geschäftszahl, "VfSlg 19.632/2012") to its canonical document. |
44
46
  | `ris_get_document` | Fetch one document's full text as markdown/HTML/XML, or its export URLs, with binding-status labeling and the authentic PDF wherever one exists. |
45
- | `ris_track_changes` | Exact-dated change feed per application — every document added or changed in a window, deletions included. The delta-sync primitive. |
46
- | `ris_list_reference` | Ground the domain vocabulary offline — applications and coverage windows, court codes, Bundesländer, decision kinds, ministries, district authorities, gazette eras and parts, citation formats, search syntax. |
47
+ | `ris_track_changes` | Per-application change feed: every document added or changed in a date window, deletions included. |
48
+ | `ris_list_reference` | Ground the domain vocabulary offline: applications and coverage windows, court codes, Bundesländer, decision kinds, ministries, district authorities, gazette eras and parts, citation formats, search syntax. |
47
49
 
48
50
  ### `ris_search_legislation`
49
51
 
50
- Search consolidated law (BrKons federal, LrKons state, Gr municipal) with in-force-date handling correct by default.
52
+ Search consolidated law: BrKons (federal), LrKons (state), Gr (municipal).
51
53
 
52
- - Full-text `query` with RIS boolean grammar (`UND`/`ODER`/`NICHT` or `AND`/`OR`/`NOT`, parentheses, quoted phrases) and `title` matching title, short title, or abbreviation ("DSG", "ABGB")
53
- - `scope` routes federal or one of the nine Bundesländer; `municipality` narrows a state scope to municipal law (selected norms, six Bundesländer); `language: english` serves the Erv collection of selected English translations
54
- - **`in_force_as_of` defaults to today** — omitting the date upstream silently searches all historical versions; `include_all_versions` is the explicit opt-in, and the applied date is echoed in every response
55
- - Force-window filters (`entered_force_from/to`, `left_force_from/to`) track provisions entering or leaving force in a date range — new-law and repeal monitoring
56
- - Section-range filtering (`section_from`/`section_to`/`section_type` — §, Artikel, Anlage), law-level grouping via `law_id` (Gesetzesnummer), Systematik `index`, `changed_since` windows
57
- - Output per document: section label, in-force date, ELI, parsed CELEX references (the EU-transposition hook), and export URLs (XML/HTML/PDF/RTF)
54
+ - Full-text `query` using RIS boolean grammar: `UND`/`ODER`/`NICHT` or `AND`/`OR`/`NOT`, parentheses, quoted phrases
55
+ - `title` matches the title, short title, or abbreviation ("DSG", "ABGB")
56
+ - `scope` routes to federal law or one of the nine Bundesländer; `municipality` narrows a state scope to municipal law (selected norms, six Bundesländer)
57
+ - `language: english` serves the Erv collection of selected English translations
58
+ - `in_force_as_of` defaults to today. Omitting the date upstream silently searches all historical versions, so `include_all_versions` is the explicit opt-in and the applied date is echoed in every response
59
+ - Force-window filters (`entered_force_from/to`, `left_force_from/to`) track provisions entering or leaving force in a date range
60
+ - Section-range filtering via `section_from`/`section_to`/`section_type` (§, Artikel, Anlage)
61
+ - Law-level grouping via `law_id` (Gesetzesnummer), plus Systematik `index` and `changed_since` windows
62
+ - Output per document: section label, in-force date, ELI, parsed CELEX references, and export URLs (XML/HTML/PDF/RTF)
58
63
 
59
64
  ---
60
65
 
61
66
  ### `ris_search_case_law`
62
67
 
63
- Search decisions and headnotes across Austria's courts and tribunals — 17 applications.
68
+ Search decisions and headnotes across 17 court and tribunal applications.
64
69
 
65
- - One application per call (`court`, required): `vfgh`, `vwgh`, `justiz`, `bvwg`, `lvwg`, `dsk`, `upts` (party-transparency senate), plus ten historical/specialized tribunals — cross-court research fans out one call per court
66
- - Filter by cited provision (`norm` — "DSG §1", "DSGVO Art32"), exact case number (`case_number`, Geschäftszahl), decision date range, decision kind (Erkenntnis/Beschluss/…), and full-text query
70
+ - `court` is required and takes one application per call: `vfgh`, `vwgh`, `justiz`, `bvwg`, `lvwg`, `dsk`, `upts` (party-transparency senate), plus ten historical and specialized tribunals. Cross-court research fans out one call per court
71
+ - Filter by cited provision (`norm`, e.g. "DSG §1", "DSGVO Art32"), exact case number (`case_number`, Geschäftszahl), decision date range, decision kind (Erkenntnis/Beschluss/…), and full-text query
67
72
  - `decision_type` targets headnotes (Rechtssätze), full decision texts, or both
68
- - Court-conditional filters: `issuing_body` (dsk/dok/pvak/verg), `court_name`, `legal_area`, `subject_area` (justiz — "Datenschutzrecht", "Insolvenzrecht"), `state` (lvwg/uvs), `collection_number` (VfSlg/VwSlg cites), `party` (upts), commission/senate/discrimination ground (gbk), media statute (bks)
73
+ - Court-conditional filters: `issuing_body` (dsk/dok/pvak/verg), `court_name`, `legal_area`, `subject_area` (justiz, e.g. "Datenschutzrecht"), `state` (lvwg/uvs), `collection_number` (VfSlg/VwSlg cites), `party` (upts), commission/senate/discrimination ground (gbk), media statute (bks)
69
74
  - Output per decision: case numbers, decision date, ECLI, cited norms, keywords, the guiding principle (Leitsatz) on headnote documents, and headnote/decision URLs
70
75
 
71
76
  ---
72
77
 
73
78
  ### `ris_search_gazette`
74
79
 
75
- Browse the promulgation record at every level of government — what `ris_lookup_citation` (point lookup) can't express.
80
+ Browse the promulgation record at every level of government. For a single known gazette number, `ris_lookup_citation` is the direct route.
76
81
 
77
82
  - `scope`: federal, one of the nine Bundesländer, `district` (Bezirksverwaltungsbehörden), or `municipal` (authentic municipal promulgations)
78
- - **Federal history is one logical series, auto-routed across three era tiers**: BgblAuth (2004+, authentic), BgblPdf (Staats- und Bundesgesetzblatt 1945–2003), BgblAlt (Reichs-, Staats- und Bundesgesetzblatt 1848–1940, metadata + ÖNB-hosted scans) — with a notice naming which tier served. One call serves one tier, so a date range crossing 2004-01-01 or 1945-01-01 is rejected with the boundary to split at rather than answered from one side of it; RIS carries no federal gazette for 1941–1944
83
+ - Federal history is one logical series auto-routed across three era tiers: BgblAuth (2004+, authentic), BgblPdf (Staats- und Bundesgesetzblatt 1945–2003), and BgblAlt (Reichs-, Staats- und Bundesgesetzblatt 1848–1940, metadata plus ÖNB-hosted scans). Each response names the tier that served it
84
+ - One call serves one tier, so a date range crossing 2004-01-01 or 1945-01-01 is rejected with the boundary to split at rather than answered from one side of it. RIS carries no federal gazette for 1941–1944
79
85
  - Filter by publication date range, gazette `part` (BGBl. I/II/III, or `pre_1997` for the partless era), document `type`, issuing ministry, district authority, or municipality
80
- - State scopes serve the authentic Landesgesetzblätter by default; `series: ordinance_gazette` switches to the Verordnungsblätter, `state_era: legacy` selects the state's earlier non-authentic series (Niederösterreich's systematic LgblNO, or the historical Lgbl elsewhere)
86
+ - State scopes serve the authentic Landesgesetzblätter by default. `series: ordinance_gazette` switches to the Verordnungsblätter; `state_era: legacy` selects the state's earlier non-authentic series (Niederösterreich's systematic LgblNO, or the historical Lgbl elsewhere)
81
87
  - Point lookup by gazette number ("BGBl. II Nr. 171/2026" or "171/2026")
82
- - Every record carries a binding label (`authentic`, `historical_record`, or `consolidated_informational`) and the amtssigniert PDF URL when present; the metadata-only 1848–1940 gazettes link to their ÖNB ALEX scan
88
+ - Every record carries a binding label (`authentic`, `historical_record`, or `consolidated_informational`) and the amtssigniert PDF URL when present. The metadata-only 1848–1940 gazettes link to their ÖNB ALEX scan
83
89
 
84
90
  ---
85
91
 
86
92
  ### `ris_search_drafts`
87
93
 
88
- Watch federal law before it becomes law.
94
+ Search federal law before it is enacted.
89
95
 
90
- - `stage: review_drafts` — ministerial drafts in public review (Begutachtungsentwürfe), including "what is in review **right now**" via `in_review_on`
91
- - `stage: government_bills` — bills adopted by the council of ministers (Regierungsvorlagen, 2004+), filtered by adoption date
92
- - `ministry` accepts the abbreviation ("BMF") — the server expands it to RIS's exact designation
96
+ - `stage: review_drafts` covers ministerial drafts in public review (Begutachtungsentwürfe). `in_review_on` answers what is in review on a given date
97
+ - `stage: government_bills` covers bills adopted by the council of ministers (Regierungsvorlagen, 2004+), filtered by adoption date
98
+ - `ministry` accepts the abbreviation ("BMF") and the server expands it to RIS's exact designation
93
99
  - Output includes review deadlines and council adoption dates
94
100
 
95
101
  ---
96
102
 
97
103
  ### `ris_search_announcements`
98
104
 
99
- Sectoral official gazettes and executive documents — seven collections, five of them legally binding authentic publications.
105
+ Sectoral official gazettes and executive documents: seven collections, five of them legally binding authentic publications.
100
106
 
101
- - `collection`: `social_insurance` (Avsv), `veterinary` (Avn), `court_rules` (KmGer), `trade_exam_rules` (PruefGewO), `health_structure_plans` (Spg — ÖSG/RSG), `ministerial_decrees` (Erlässe), `council_minutes` (Ministerratsprotokolle)
102
- - Collection-aware filters: issue numbers, issuers (insurance carriers, ministries), cited norm ("decrees citing the DSG"), in-force date for the consolidated collections, plan type/state for health plans, session number/legislature for council minutes
107
+ - `collection`: `social_insurance` (Avsv), `veterinary` (Avn), `court_rules` (KmGer), `trade_exam_rules` (PruefGewO), `health_structure_plans` (Spg, ÖSG/RSG), `ministerial_decrees` (Erlässe), `council_minutes` (Ministerratsprotokolle)
108
+ - Collection-aware filters: issue numbers, issuers (insurance carriers, ministries), cited norm ("decrees citing the DSG"), in-force date for the consolidated collections, plan type and state for health plans, session number and legislature for council minutes
103
109
  - Binding labels per collection: `authentic`, `administrative_directive` (decrees bind the administration, not citizens), or `preparatory` (council minutes)
104
110
 
105
111
  ---
106
112
 
107
113
  ### `ris_lookup_citation`
108
114
 
109
- Citation-first resolution — how Austrian legal work actually starts.
115
+ Resolve a citation to its canonical document.
110
116
 
111
117
  - Parses and routes four citation kinds: norm cites ("§ 6 DSG", "Art 10 B-VG"), gazette numbers across all three federal eras plus LGBl ("BGBl. I Nr. 165/1999", "BGBl. Nr. 194/1961", "RGBl. Nr. 189/1902"), case numbers ("Ro 2026/03/0016", "2025-0.934.677", "14Os49/26a"), and collection numbers ("VfSlg 19.632/2012")
112
- - Deterministic upstream filters (section + title, per-era number params, Geschäftszahl, Sammlungsnummer) — no keyword-search fuzziness
118
+ - Routes to deterministic upstream filters (section plus title, per-era number params, Geschäftszahl, Sammlungsnummer) rather than keyword search
119
+ - A state gazette number predating that Bundesland's e-Recht switch falls back to its earlier non-authentic series; a VwSlg number cited without its part letter comes back as ambiguous, naming both decisions, rather than resolved to one of them
113
120
  - Returns `found: false` with structured guidance instead of throwing when nothing resolves
114
121
  - `court` and `state` hints short-circuit ambiguous formats
115
122
 
@@ -119,12 +126,12 @@ Citation-first resolution — how Austrian legal work actually starts.
119
126
 
120
127
  Read and export a single document.
121
128
 
122
- - Addresses documents by `document_number` + `application` (from any search/lookup result) or a passed-through `ris.bka.gv.at` document URL (host and path allowlisted)
129
+ - Addresses documents by `document_number` plus `application` (from any search or lookup result), or by a passed-through `ris.bka.gv.at` document URL (host and path allowlisted)
123
130
  - `format`: `markdown` (default, boilerplate stripped), raw `html`, RIS `xml`, or `urls_only`
124
- - Binding status on every response: `authentic` (with amtssigniert PDF URL), `consolidated_informational`, `historical_record`, `decision`, `preparatory`, `administrative_directive`, or `translation` — non-authentic text is never presented as the binding text
125
- - Format availability is explicit: applications that publish only the signed PDF (district/municipal promulgations, court rules) or only scans (1848–1940 gazettes, ÖNB-hosted) return a `format_unavailable` notice with the usable URLs instead of failing
126
- - Oversized markdown returns a retrievable §/Artikel/Anlage section outline (`kind: outline`) instead of truncating — re-call with `sections:[…]` to pull just the sections you need
127
- - Returns content, not fresh metadata — the upstream API has no document-by-number search, so document numbers come from a prior search or lookup result
131
+ - Every response carries a binding status: `authentic` (with amtssigniert PDF URL), `consolidated_informational`, `historical_record`, `decision`, `preparatory`, `administrative_directive`, or `translation`
132
+ - Applications that publish only the signed PDF (district and municipal promulgations, court rules) or only scans (1848–1940 gazettes, ÖNB-hosted) return a `format_unavailable` notice with the usable URLs instead of failing
133
+ - Oversized markdown returns a §/Artikel/Anlage section outline (`kind: outline`) instead of truncating. Re-call with `sections:[…]` to pull the sections you need
134
+ - Returns content, not fresh metadata. The upstream API has no document-by-number search, so document numbers come from a prior search or lookup result
128
135
 
129
136
  ---
130
137
 
@@ -132,9 +139,9 @@ Read and export a single document.
132
139
 
133
140
  Exact-dated per-application change feed.
134
141
 
135
- - `application` + `changed_from`/`changed_to`: every document added or changed in the window — 1,400+ changes in a typical two-week federal-law window
136
- - `include_deleted` surfaces removals — the only RIS surface that can
137
- - Coarser alternative: the search tools' `changed_since` interval filters
142
+ - `application` plus `changed_from`/`changed_to` returns every document added or changed in the window. A typical two-week federal-law window carries 1,400+ changes
143
+ - `include_deleted` surfaces removals, which no other RIS surface exposes
144
+ - The search tools' `changed_since` interval filters are the coarser alternative
138
145
 
139
146
  ## Resource
140
147
 
@@ -156,19 +163,18 @@ Built on [`@cyanheads/mcp-ts-core`](https://www.npmjs.com/package/@cyanheads/mcp
156
163
 
157
164
  RIS-specific:
158
165
 
159
- - **The full RIS OGD surface** — all 39 applications across every controller: consolidated law (federal/state/municipal), authentic gazettes at four levels of government, three federal gazette era tiers back to 1848, 17 court/tribunal applications, the lawmaking pipeline, sectoral gazettes, ministerial decrees, English translations, and the per-application change feed
160
- - Strict parameter allowlist — RIS silently ignores unknown query params (a typo returns plausible but unfiltered results), so only live-confirmed spellings are ever sent upstream
166
+ - All 39 OGD applications across every controller, from consolidated law and the four levels of authentic gazette to the 17 court and tribunal collections
167
+ - Strict parameter allowlist. RIS silently ignores unknown query params, so a typo returns plausible but unfiltered results; only live-confirmed spellings are sent upstream
161
168
  - Normalizer for RIS's JSON-serialized-XML envelope: object-or-array coercion, in-band error detection, six per-controller metadata classes, `<br/>` cleanup, CELEX reference parsing, ministry-abbreviation expansion
162
- - English tool surface over RIS's German API — Austrian legal terms (Geschäftszahl, Rechtssatz, Bundesgesetzblatt) kept as domain vocabulary and glossed in descriptions
169
+ - English tool surface over RIS's German API. Austrian legal terms (Geschäftszahl, Rechtssatz, Bundesgesetzblatt) stay as domain vocabulary and are glossed in the descriptions
163
170
 
164
171
  Agent-friendly output:
165
172
 
166
- - No dead ends — error recovery hints, zero-hit notices, format-unavailable notices, and `found: false` guidance each name the concrete next call (`ris_list_reference` topic, the right search tool, `ris_lookup_citation`), never a bare "check your input"
167
- - Zero hits are success plus a composed notice, never an error; conditional-parameter misuse (a court-specific filter with the wrong court, `part` outside federal scope, a collection filter on the wrong collection, bad addressing) is caught locally before any upstream call
168
- - Applied-filter echo — the `in_force_as_of` default is never invisible to the calling agent
169
- - Structured no-resolve results (`found: false` + guidance) instead of throws on citation lookup
170
- - Upstream schema-validation messages passed through — RIS enumerates valid values, which lets agents self-correct
171
- - Oversized documents return a retrievable section outline, never a silent cut — re-call with the chosen `sections` for selective retrieval
173
+ - Error hints, zero-hit notices, format-unavailable notices, and `found: false` guidance each name the concrete next call: a `ris_list_reference` topic, the right search tool, or `ris_lookup_citation`
174
+ - Conditional-parameter misuse is caught locally before any upstream call: a court-specific filter with the wrong court, `part` outside federal scope, a collection filter on the wrong collection, bad addressing
175
+ - Zero hits return success plus a composed notice rather than an error
176
+ - Applied filters are echoed back, so the `in_force_as_of` default stays visible to the calling agent
177
+ - Upstream schema-validation messages pass through. RIS enumerates valid values, which lets agents self-correct
172
178
 
173
179
  ## Localization
174
180
 
@@ -0,0 +1,17 @@
1
+ ---
2
+ summary: "ris_lookup_citation now sends VwGH's labelled Sammlungsnummer form for collection citations, falls back to a Bundesland's legacy Lgbl gazette series on a pre-e-Recht citation, and composes gazette miss guidance per route instead of one shared string."
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.2.6 — 2026-07-31
8
+
9
+ ## Fixed
10
+
11
+ - **`ris_lookup_citation` collection_number route** — `parseCollection` now emits a court-specific `Sammlungsnummer` filter: VfGH/UVS keep the bare number (matched dotted or undotted), VwGH gets the label plus the undotted number closed with a space-anchored trailing wildcard (`VwSlg 18000 A*`), since VwGH stores the full labelled undotted cite and a bare or dotted number matches nothing there. A VwSlg citation with no part letter that matches more than one distinct collection number (the A administrative and F finance series reuse numbers) now returns `found: false` naming both cites instead of silently resolving to the first hit. `collectionGuidance` and the `collection_number` `.describe()` on `ris_search_case_law` now state the per-court accepted form. ([#25](https://github.com/cyanheads/ris-austria-mcp-server/issues/25))
12
+ - **`ris_lookup_citation` state gazette route** — a `LGBl.` citation now probes `LgblAuth` and falls back to the legacy `Lgbl` series (`LgblNO` for Niederösterreich, named in guidance rather than probed since it carries no `Lgblnummer` param) on zero hits, resolving a citation that predates that Bundesland's e-Recht switch. `resolution_note` names the serving application, scope, and `state_era: legacy` when the fallback answered; an upstream error on the first probe throws rather than falling through to the second. ([#27](https://github.com/cyanheads/ris-austria-mcp-server/issues/27))
13
+ - **`ris_lookup_citation` gazette miss guidance** — `gazetteGuidance` now composes per route from the parsed citation instead of one fixed string sent to all four miss sites: the state-hint sentence appears only when the hint is missing, the part sentence only on the two federal tiers that carry a part split (and now reports whether a part filter was actually applied), and the Bundesland's legacy-series guidance only on the state route. An unparseable gazette number gets its own guidance, since no tier was ever searched.
14
+
15
+ ## Changed
16
+
17
+ - `citation-formats.ts` and `courts.ts` reference entries corrected to state the per-court `Sammlungsnummer` form and the state-gazette legacy-series fallback.
@@ -0,0 +1,17 @@
1
+ ---
2
+ summary: "Search-tool rejections now name the caller's own parameter and value instead of internal service identifiers and RIS application codes, and an out-of-range page leads the recovery hint on all five search tools."
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.2.7 — 2026-07-31
8
+
9
+ ## Fixed
10
+
11
+ - **Local rejections name the caller's own input** — `ris_search_case_law`, `ris_search_gazette`, and `ris_search_announcements` rewrite request-builder rejections at their existing `.catch()` into the tool's own vocabulary before they reach the wire. A rejection previously read the builder's internal service param name and RIS application code (e.g. `sortBy`, `Normenliste`) instead of the field and value the caller actually sent (`sort_by`, `court: 'normenliste'`). `unsupported()` in `request-builder.ts` now carries the rejection as separate `param`, `value`, and `alternatives` data instead of one fused `sortBy: <value>` identifier; `rewriteUnsupportedParam` (new, `_shared.ts`) reads that data and swaps in each tool's own message, or leaves the builder's message untouched when the tool has nothing more precise to say. ([#29](https://github.com/cyanheads/ris-austria-mcp-server/issues/29))
12
+ - **Gazette rejections name the routing input** — `resolveFederalTier` now returns `routedBy` (the `number`, `part`, or date bound that selected a federal era tier), and `gazetteLabel` (new) names the resolved gazette by that selection so `type`/`part`/`issuer`/`number`/`sort_by` rejections state which tier or scope rejected the field, rather than an internal application code. Each corrective was checked against the live API to hold for every call it answers.
13
+ - **Out-of-range `page` recovery** — all five search tools (`ris_search_legislation`, `ris_search_case_law`, `ris_search_gazette`, `ris_search_drafts`, `ris_search_announcements`) lead their `invalid_query` recovery hint with "For a page past the end, request a lower page, starting from 1" ahead of the existing per-tool guidance, and their `when` clause now names the out-of-range page as a cause. ([#30](https://github.com/cyanheads/ris-austria-mcp-server/issues/30))
14
+
15
+ ## Changed
16
+
17
+ - `docs/design.md`'s `invalid_query` rows for all five search tools reconciled with the shipped `when`/`recovery` text.
@@ -37,5 +37,28 @@ interface SearchFailureContext {
37
37
  * Returns the error for the caller to `throw`, keeping the throw visible at the call site.
38
38
  */
39
39
  export declare function failSearchError(error: unknown, ctx: SearchFailureContext): unknown;
40
+ /** A request-builder unsupported-parameter rejection, as the builder recorded it. */
41
+ export interface UnsupportedParam {
42
+ /** Values of the same parameter that *are* mapped for the target application. */
43
+ readonly alternatives: readonly string[];
44
+ /** The builder's own parameter name, e.g. `sortBy`. */
45
+ readonly param: string;
46
+ /** The rejected value, when the rejection was value-specific. */
47
+ readonly value?: string;
48
+ }
49
+ /**
50
+ * Replace the request builder's unsupported-parameter message with one written in the
51
+ * calling tool's own vocabulary, so the caller reads back a field it actually sent.
52
+ *
53
+ * The builder holds only the resolved RIS application, never the tool input that selected
54
+ * it, so it cannot name the caller's `court`/`scope`/`collection` itself. The handler still
55
+ * has that input in scope here, and `rewrite` returns the finished message — or `undefined`
56
+ * to leave a combination the tool has nothing better to say about untouched.
57
+ *
58
+ * `param` and `application` appearing together identify that rejection; the builder's other
59
+ * `validationError`s (state coverage, ministry expansion) already name what the caller sent
60
+ * and pass through unchanged, as does every error from the service.
61
+ */
62
+ export declare function rewriteUnsupportedParam(error: unknown, rewrite: (rejected: UnsupportedParam) => string | undefined): unknown;
40
63
  export {};
41
64
  //# sourceMappingURL=_shared.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/_shared.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAsB3C;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,aAMwE,CAAC;AAEnG;;;;;GAKG;AACH,KAAK,mBAAmB,GAAG,eAAe,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;AAEnF,kEAAkE;AAClE,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;CAC7D;AAoBD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAMlF"}
1
+ {"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/_shared.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAsB3C;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,aAMwE,CAAC;AAEnG;;;;;GAKG;AACH,KAAK,mBAAmB,GAAG,eAAe,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;AAEnF,kEAAkE;AAClE,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;CAC7D;AAoBD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAMlF;AAED,qFAAqF;AACrF,MAAM,WAAW,gBAAgB;IAC/B,iFAAiF;IACjF,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,uDAAuD;IACvD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,MAAM,GAAG,SAAS,GAC1D,OAAO,CAWT"}
@@ -4,7 +4,7 @@
4
4
  * @module mcp-server/tools/definitions/_shared
5
5
  */
6
6
  import { z } from '@cyanheads/mcp-ts-core';
7
- import { JsonRpcErrorCode, McpError } from '@cyanheads/mcp-ts-core/errors';
7
+ import { JsonRpcErrorCode, McpError, validationError } from '@cyanheads/mcp-ts-core/errors';
8
8
  /** Months with 30 days — the only non-February lengths a day of 31 can overshoot. */
9
9
  const THIRTY_DAY_MONTHS = new Set([4, 6, 9, 11]);
10
10
  /**
@@ -69,4 +69,31 @@ export function failSearchError(error, ctx) {
69
69
  ? error
70
70
  : ctx.fail(reason, error.message, { ...ctx.recoveryFor(reason) });
71
71
  }
72
+ /**
73
+ * Replace the request builder's unsupported-parameter message with one written in the
74
+ * calling tool's own vocabulary, so the caller reads back a field it actually sent.
75
+ *
76
+ * The builder holds only the resolved RIS application, never the tool input that selected
77
+ * it, so it cannot name the caller's `court`/`scope`/`collection` itself. The handler still
78
+ * has that input in scope here, and `rewrite` returns the finished message — or `undefined`
79
+ * to leave a combination the tool has nothing better to say about untouched.
80
+ *
81
+ * `param` and `application` appearing together identify that rejection; the builder's other
82
+ * `validationError`s (state coverage, ministry expansion) already name what the caller sent
83
+ * and pass through unchanged, as does every error from the service.
84
+ */
85
+ export function rewriteUnsupportedParam(error, rewrite) {
86
+ if (!(error instanceof McpError))
87
+ return error;
88
+ const { data } = error;
89
+ if (typeof data?.param !== 'string' || typeof data.application !== 'string')
90
+ return error;
91
+ const { alternatives, param, value } = data;
92
+ const message = rewrite({
93
+ alternatives: Array.isArray(alternatives) ? alternatives : [],
94
+ param,
95
+ ...(typeof value === 'string' && { value }),
96
+ });
97
+ return message === undefined ? error : validationError(message, data);
98
+ }
72
99
  //# sourceMappingURL=_shared.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_shared.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/_shared.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAE3E,qFAAqF;AACrF,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAEjD;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,KAAa;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACvC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;QAC1E,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;KAC3B,MAAM,EAAE;KACR,KAAK,CACJ,oDAAoD,EACpD,mDAAmD,CACpD;KACA,MAAM,CAAC,kBAAkB,EAAE,mEAAmE,CAAC,CAAC;AAgBnG;;;;;;;;;;GAUG;AACH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAwC;IACpE,CAAC,gBAAgB,CAAC,eAAe,EAAE,eAAe,CAAC;IACnD,CAAC,gBAAgB,CAAC,aAAa,EAAE,eAAe,CAAC;IACjD,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;IACvD,CAAC,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,CAAC;CAC/C,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc,EAAE,GAAyB;IACvE,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9C,OAAO,MAAM,KAAK,SAAS;QACzB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACtE,CAAC"}
1
+ {"version":3,"file":"_shared.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/_shared.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAE5F,qFAAqF;AACrF,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAEjD;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,KAAa;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACvC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;QAC1E,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;KAC3B,MAAM,EAAE;KACR,KAAK,CACJ,oDAAoD,EACpD,mDAAmD,CACpD;KACA,MAAM,CAAC,kBAAkB,EAAE,mEAAmE,CAAC,CAAC;AAgBnG;;;;;;;;;;GAUG;AACH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAwC;IACpE,CAAC,gBAAgB,CAAC,eAAe,EAAE,eAAe,CAAC;IACnD,CAAC,gBAAgB,CAAC,aAAa,EAAE,eAAe,CAAC;IACjD,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;IACvD,CAAC,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,CAAC;CAC/C,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc,EAAE,GAAyB;IACvE,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9C,OAAO,MAAM,KAAK,SAAS;QACzB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACtE,CAAC;AAYD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAAc,EACd,OAA2D;IAE3D,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACvB,IAAI,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC1F,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC;QACtB,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAE,YAAyB,CAAC,CAAC,CAAC,EAAE;QAC3E,KAAK;QACL,GAAG,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,EAAE,KAAK,EAAE,CAAC;KAC5C,CAAC,CAAC;IACH,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACxE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ris-lookup-citation.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/ris-lookup-citation.tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAY,MAAM,+BAA+B,CAAC;AAiX3E,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAgR5B,CAAC"}
1
+ {"version":3,"file":"ris-lookup-citation.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/ris-lookup-citation.tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAY,MAAM,+BAA+B,CAAC;AAwf3E,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA+S5B,CAAC"}