关于 ris-austria-mcp-server
面向法律从业者和研究人员的 MCP 服务,可查询奥地利官方 RIS 中的法规、法院判决、公报和立法草案。它还可解析法律引文,并标明文档的约束状态。
主要功能
- 01查询联邦、州和市级法规
- 02搜索 17 类法院判决
- 03浏览可追溯至 1848 年的公报
- 04解析引文并获取文档
- 05跟踪文档变更与删除
适用场景
- 01核对某日期生效的法律
- 02按法院或案号查找判决
- 03获取官方公报条目
- 04监控 RIS 数据集变更
MCP 相关
向 MCP 客户端提供九种搜索、查询和变更跟踪工具,以及一个文档资源。支持 STDIO 和 Streamable HTTP,并提供公共托管端点。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://ris-austria.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-ris-austria https://ris-austria.caseyjhand.com/mcp{"mcpServers":{"cyanheads-ris-austria":{"type":"http","url":"https://ris-austria.caseyjhand.com/mcp"}}}在 Cursor 中打开{"servers":{"cyanheads-ris-austria":{"type":"http","url":"https://ris-austria.caseyjhand.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"cyanheads-ris-austria":{"type":"http","url":"https://ris-austria.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-ris-austria":{"serverUrl":"https://ris-austria.caseyjhand.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
9| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| page | integer | 否 | 结果页码,从 1 开始。默认值为 1。 |
| index | string | 否 | Systematik 分类筛选器(例如 "10/10 Datenschutz")。仅适用于联邦/州合并法律。省略则不筛选;空值将被拒绝。 |
| query | string | 否 | 全文搜索(Suchworte)。支持布尔运算符 UND/ODER/NICHT 或 AND/OR/NOT、括号和带引号的短语;通配符 * 仅允许位于末尾("Datenschutz*",不能是 "*schutz")。语法:ris_list_reference topic search_syntax。省略则不筛选;空值将被拒绝。 |
| scope | enum | 否 | 管辖范围:federal(默认)搜索联邦合并法律;指定州则搜索该州的合并法律(或设置 municipality 时搜索该州的市级法律)。federal | burgenland | kaernten | niederoesterreich | oberoesterreich | salzburg | steiermark | tirol | vorarlberg | wien |
| title | string | 否 | 标题搜索(Titel)——匹配标题、简称和官方缩写("ABGB"、"DSG")。短语字段:* 可置于开头或末尾,且其旁至少须有 2 个字符。省略则不筛选;空值将被拒绝。 |
| law_id | string | 否 | 法律级分组键(Gesetzesnummer,例如 10001597 = DSG)——精确匹配;返回该法律的所有条文。仅适用于联邦/州合并法律。省略则不筛选;空值将被拒绝。 |
| sort_by | enum | 否 | 排序列:条文(§/Artikel/Anlage 标签)或 in_force_date。默认:上游顺序。仅适用于联邦/州合并法律。section | in_force_date |
| language | enum | 否 | german(默认)搜索权威德语语料;english 搜索约 138 份部分联邦法律的非官方英文译本(需要 scope: federal;仅可与 query 和 title 组合)。german | english |
| page_size | enum | 否 | 每页文档数:10 或 20(默认 20)。如需查看更多结果,保持此值不变并增加 page。10 | 20 |
| section_to | string | 否 | 条文范围的结束值。单个条文时与 section_from 相同。省略则不筛选;空值将被拒绝。 |
| municipality | string | 否 | 市级法律的市镇名称(例如 "Graz"——使用 RIS 的拼写,而非 "Stadt Graz")。需要指定州范围;仅可与 query、title 和 in_force_as_of 组合。覆盖 6 个州的部分规范(不包括 Burgenland/Tirol/Vorarlberg)。省略则搜索合并法律;空值将被拒绝。 |
| section_from | string | 否 | § / Artikel / Anlage 编号范围的起始值,使用数字,可带可选字母("6"、"1a")。仅适用于联邦/州合并法律。省略则不筛选;空值将被拒绝。 |
| section_type | enum | 否 | 范围所针对的条文类型。设置条文范围时,默认使用 Paragraph。可选值:ris_list_reference topic section_types。Alle | Artikel | Paragraph | Anlage |
| changed_since | enum | 否 | 粗略的时效筛选器——筛选在该时间段内于 RIS 中发生变更的文档。要查询精确时间范围和删除记录,请使用 ris_track_changes。one_week | two_weeks | one_month | three_months | six_months | one_year |
| left_force_to | string | 否 | 在此日期(YYYY-MM-DD)当天或之前失效的条文。 |
| in_force_as_of | string | 否 | 仅返回在此日期生效的版本(YYYY-MM-DD)。默认采用奥地利的今日日期——省略此参数并不会搜索所有历史版本;如需搜索所有历史版本,请启用 include_all_versions。 |
| sort_direction | enum | 否 | 排序方向;与 sort_by 配合使用。ascending | descending |
| left_force_from | string | 否 | 在此日期(YYYY-MM-DD)当天或之后失效的条文——用于追踪废止。与 entered_force_from 的互斥规则相同。 |
| entered_force_to | string | 否 | 在此日期(YYYY-MM-DD)当天或之前生效的条文。 |
| entered_force_from | string | 否 | 在此日期(YYYY-MM-DD)或之后生效的条款 — 用于追踪新法律。仅适用于联邦/州整合版法律;与 in_force_as_of 和 include_all_versions 互斥。 |
| include_all_versions | boolean | 否 | true 会搜索所有历史版本(不按生效日期筛选)— 用于版本历史研究。优先于 in_force_as_of;与生效时间范围筛选条件互斥。 |
详细介绍
@cyanheads/ris-austria-mcp-server
通过 MCP 搜索奥地利联邦及州法律汇编、法院判决,以及官方 RIS 发布的真实《联邦法律公报》(Bundesgesetzblatt)。无需密钥。支持 STDIO 或 Streamable HTTP。
概述
奥地利法律来自 RIS,即政府官方法律信息系统:涵盖联邦、州和市政法律、法院判决、可追溯至 1848 年的官方公报、立法草案以及部长令。每份文件都会标注其约束效力状态。无需 API 密钥。
工具
| 工具 | 描述 |
|---|---|
ris_search_legislation | 搜索截至指定日期(默认当天)生效的联邦、州和市政法律汇编,以及部分法律的英文译本 |
ris_search_case_law | 每次调用搜索一个法院或法庭的判例,涵盖 17 种法院代码 |
ris_search_gazette | 浏览联邦、州、区和市政公报;联邦公报历史记录会自动回溯至 1848 年 |
ris_search_drafts | 搜索部长审查草案(Begutachtungsentwürfe)和政府法案(Regierungsvorlagen) |
ris_search_announcements | 搜索七类行业文集,内容涵盖社会保险公告、部长令和部长会议纪要 |
ris_lookup_citation | 将一条奥地利法律引文(“§ 6 DSG”、“BGBl. I Nr. 165/1999”、Geschäftszahl 或 ECLI)解析为对应文件 |
ris_get_document | 获取一份文件的 markdown、HTML 或 XML 格式,或仅获取其呈现版本 URL,并查看其约束效力状态 |
ris_track_changes | 列出某个应用在指定日期范围内新增、变更或删除的所有文件 |
ris_list_reference | 离线查询 RIS 词汇表:应用、法院、州、部委、公报分册、引文格式和搜索语法 |
资源
| 资源 | 描述 |
|---|---|
ris://document/{application}/{documentNumber} | 一份 RIS 文档的 Markdown 文本 |
该资源与 ris_get_document 内容一致,因此仅使用工具的客户端不会有任何内容缺失。
功能参考
ris_search_legislation 工具
- 按
query(全文)或title(标题、短标题或缩写,例如“DSG”)搜索。scope为federal(默认值)或某个联邦州;municipality可将州范围切换为市镇法律;language: english可搜索约 138 份英文译文 in_force_as_of默认为奥地利的当前日期,并以appliedInForceAsOf回传;include_all_versions与entered_force_*/left_force_*时间范围是互斥的替代选项- 记录包含
law_id(筛选法律的每个章节时使用)、section_label、abbreviation、keywords、生效日期、eli、celex_references和content_urls
ris_search_case_law 工具
- 必须指定
court,每次调用只能使用一个代码。可按query、引用的norm(“DSG §1”)、case_number、decided_from/decided_to和decision_type(headnote、full_text或默认值all)筛选。法院专属筛选项包括court_name(justiz)、state(lvwg/uvs)和collection_number(vfgh/vwgh/uvs);将筛选项用于错误的法院会导致court_filter_mismatch错误 - 记录包含
case_numbers(判例摘要会列出其涵盖的所有裁决)、decision_date、ecli、norms_cited,以及判例摘要中的guiding_principle court: normenliste会通过norm_index返回已索引的法律,而非裁决
ris_search_gazette 工具
scope为federal(默认值)、某个联邦州、district或municipal。可按number、part、type、published_from/published_to、issuer、district_authority或municipality筛选;州范围还支持series和state_era- 联邦查询仅从一个时期的数据中提供(BgblAuth:2004 年及之后,BgblPdf:1945–2003 年,BgblAlt:1848–1940 年);该时期通过
servedApplication回传。跨越两个时期的日期范围会导致cross_tier_range错误,并提供需要拆分的日期 - 记录包含
binding(authentic、historical_record、consolidated_informational)、存在时的authentic_pdf_url、1848–1940 年的alex_url(ÖNB 扫描件)、适用时的celex_references,以及 1848–2003 年联邦条目的promulgation
ris_search_drafts 工具
- 必须指定
stage:review_drafts(搭配in_review_on)或government_bills(2004 年及之后,搭配decided_from/decided_to);ministry可接受“BMF”之类的缩写或完整名称 - 记录包含
review_start和review_deadline,或decided;RIS 提供时还包含abbreviation和keywords,以及按type分类的materials[](Erläuterungen、Textgegenüberstellung、Vorblatt/WFA、附件)。将materials[].url传给ris_get_document即可阅读其中一份材料
ris_search_announcements 工具
- 必须指定
collection:social_insurance、veterinary、court_rules、trade_exam_rules、health_structure_plans、ministerial_decrees或council_minutes。使用该集合不接受的筛选项会导致collection_filter_mismatch错误;例如,social_insurance和veterinary不接受changed_since。issuer会展开部委(“BMF”)和社会保险机构(“ÖGK”)的缩写 - 记录包含
binding(authentic、administrative_directive或preparatory)、authentic_pdf_url和document_url;后者是浏览理事会会议纪要和法令的唯一视图 - RIS 提供时,每个集合还会附带各自的元数据,例如
case_numbers、in_force_from/in_force_until、keywords、court_name、plan_state和session_number
ris_lookup_citation 工具
- 每次调用查询一个
citation,类型可以是规范(“§ 6 DSG”)、公报编号(“BGBl. I Nr. 165/1999”)、案件编号(“VfGH G 13/2025”)或 ECLI,也可以是汇编编号(“VfSlg 19.632/2012”)。kind用于指定查询路径,court和state用于缩小范围,in_force_as_of用于指定规范版本(默认为今天) - 返回
found、kind,以及符合对应搜索工具结构的record;如果匹配到多份文件,还会返回alternatives_count。未找到时会返回found: false和guidance,而非报错 - 规范解析会定位到所引法律(“§ 2 EStG” → EStG 1988 § 2;“AlVG 1977” → AlVG,RIS 存储时不带年份;“VwGVG 2014 §28” → VwGVG § 28,并会在其标题不含年份时再次进行不带年份的搜索),并将其子条款和末尾的“;”排除在外(“Art. 6 (1) B-VG” → B-VG Art 6);以序数开头的缩写按普通缩写处理(“1. COVID-19-JuBG §1”);引用中标明的法律版本也会被排除(“ABGB idF BGBl I 2010/28 §988” → 请求日期当日有效的 ABGB § 988,而非修正法的公报条目;并附注所引版本未被适用);长标题会按其简称识别(“StaatsanwaltschaftsG - StAG §35” → StAG § 35);以逗号连接的条目(“DSG §1, §24”)或以“. ”连接的完整规范(“ZPO §179. ZPO §275 Abs2”)会定位到首个条款,并列出其余部分;RIS 不汇编的欧盟法案(“DSGVO Art32”)或通过编号引用的欧盟法案(“RL 2006/123/EG”、“VO (EG) 178/2002 Art3”)会返回
found: false,并附上 EUR-Lex 链接,不会发起 RIS 请求;未标明部分的“BGBl. Nr. 50/2025”会返回歧义结果,并列出 I、II 和 III 部分
ris_get_document 工具
- 可通过
document_number+application定位,也可通过content_urls中的document_url或草稿materials[].url定位;format可设为markdown(默认)、html、xml或urls_only - 每条结果都会包含
binding_status,并在存在时包含authentic_pdf_url。没有文本呈现形式的应用(地区和市镇颁布的法规、法院规则、议会会议记录、1848–1940 年的公报)会返回包含可用 URL 的提示,而不会失败 - 超过 40,000 字节的 Markdown 会返回
kind: outline;再次调用并传入sections可获取相应条目。超过 40,000 字节的html和xml会返回kind: link,并附带byte_size和content_urls,请改用markdown读取
ris_track_changes 工具
- 接受
application(39 种代码中的任意一种)以及changed_from/changed_to;设置include_deleted可纳入删除记录,其他工具都不会报告这些记录 - 记录包含
changed、published和binding_status;删除记录会设置deleted: true,并包含deleted_at - 法律记录包含
section_label、law_id和in_force_from/in_force_until(没有结束日期不代表当前仍有效);判决记录包含case_numbers和decision_date
ris_list_reference 工具
topic可选择 17 个静态表之一:应用、法院、州、判决类型和类别、发布机构、各部、汇编、阶段、变更时间区间、条款类型、公报部分、法律类型、地区主管机关、司法主题领域、搜索语法和引文格式- 返回
summary和entries(包含value、label、details),不会调用上游服务
ris://document/{application}/{documentNumber} 资源
- 提供一份文件的
text/markdown内容;通过搜索或查找结果中的application+documentNumber定位;内容与ris_get_document的format: markdown相同 - 没有文本呈现形式的应用会返回指向 PDF 或扫描件的说明;文本过长时会返回大纲,请使用工具获取具体条目
功能
基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输、可插拔身份验证(none / jwt / oauth)、可切换存储(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1),并提供结构化日志记录和可选的 OpenTelemetry 跟踪。
RIS 专属功能:
- 全部 39 个 OGD 应用:整合后的法律、公报、州、区和市级公报,17 个法院和审裁机构集合、立法流程以及各行业公告
- 引文通过精确筛选条件(条款加标题、公报编号、Geschäftszahl、Sammlungsnummer)解析,而非通过关键字搜索
- 日期格式为
YYYY-MM-DD;搜索工具使用page和page_size分页(1–100,每页返回 10 或 20 条;默认 20 条);如无文本筛选条件,请省略文本筛选参数,而不要将其设为空 - 法院、应用、州和部委代码由
ris_list_reference提供 - 工具描述为英文;标题、字段值和 RIS 错误消息保留德文
便于 Agent 使用的输出:
- 每条记录都包含类型化的绑定状态(
authentic、consolidated_informational、historical_record、decision、preparatory、administrative_directive、translation) - 分页结果会报告
totalCount和truncated,并回显服务端实际应用的设置,例如appliedInForceAsOf和servedApplication - 类型化错误原因(
court_filter_mismatch、cross_tier_range、invalid_query、document_not_found等)和零命中提示会指出下一步调用
快速开始
公共托管实例
可通过 https://ris-austria.caseyjhand.com/mcp 使用公共实例,无需安装。通过 Streamable HTTP 将任意 MCP 客户端指向该实例:
{
"mcpServers": {
"ris-austria-mcp-server": {
"type": "streamable-http",
"url": "https://ris-austria.caseyjhand.com/mcp"
}
}
}
自托管 / 本地运行
使用 Bun 将服务添加到 MCP 客户端配置中:
{
"mcpServers": {
"ris-austria-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/ris-austria-mcp-server@latest"]
}
}
}
或使用 npx(无需 Bun):
{
"mcpServers": {
"ris-austria-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/ris-austria-mcp-server@latest"]
}
}
}
或使用 Docker:
{
"mcpServers": {
"ris-austria-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/ris-austria-mcp-server:latest"
]
}
}
}
对于 bunx/npx,将任意配置变量添加到 "env" 键下;对于 Docker,将其作为额外的 -e NAME=value 参数添加。
对于 Streamable HTTP,请设置传输方式并启动服务:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
先决条件
- Bun v1.4.0 或更高版本(或 Node.js v24+)。
- 无需 API 密钥:RIS OGD API 不需要密钥。
安装
- 克隆代码仓库:
git clone https://github.com/cyanheads/ris-austria-mcp-server.git
- 进入目录:
cd ris-austria-mcp-server
- 安装依赖并构建:
bun install
bun run rebuild
- 添加到 MCP 客户端配置文件:
{
"mcpServers": {
"ris-austria-mcp-server": {
"type": "stdio",
"command": "node",
"args": ["/absolute/path/to/ris-austria-mcp-server/dist/index.js"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
配置
| 变量 | 描述 | 默认值 |
|---|---|---|
RIS_API_BASE_URL | RIS OGD REST API 基础 URL。 | https://data.bka.gv.at/ris/api/v2.6 |
RIS_CONTENT_BASE_URL | 用于构建呈现 URL 并获取文档的文档内容主机。https://www.ris.bka.gv.at 会向自动化客户端返回机器人检测页面。 | https://ogd.ris.bka.gv.at |
RIS_CONTACT | 附加到 User-Agent 的联系信息字符串。 | none |
MCP_TRANSPORT_TYPE | 传输方式:stdio 或 http。 | stdio |
MCP_HTTP_PORT | HTTP 服务端口。 | 3010 |
MCP_SESSION_MODE | HTTP 会话模式:stateless、stateful 或 auto。 | stateless |
MCP_AUTH_MODE | 身份验证方式:none、jwt 或 oauth。 | none |
MCP_LOG_LEVEL | 日志级别(debug、info、warning、error 等)。 | info |
OTEL_ENABLED | 启用 OpenTelemetry。 | false |
完整的可选覆盖项列表请参阅 .env.example。
运行服务
本地开发
-
构建并运行:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http -
运行检查和测试:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t ris-austria-mcp-server .
docker run --rm -p 3010:3010 ris-austria-mcp-server
Dockerfile 默认使用 HTTP 传输、无状态会话模式,并将日志写入 /var/log/ris-austria-mcp-server。默认会安装 OpenTelemetry 对等依赖;构建时添加 --build-arg OTEL_ENABLED=false 可省略这些依赖。
项目结构
| 目录 | 用途 |
|---|---|
src/index.ts | createApp() 入口点 — 注册工具和资源。 |
src/config | 可选的 RIS 端点和联系信息配置,使用 Zod 解析。 |
src/mcp-server/tools | 工具定义(*.tool.ts)。 |
src/mcp-server/resources | 资源定义(*.resource.ts)。 |
src/services/ris | RIS 请求构建、HTTP 访问、标准化和静态参考数据。 |
docs/design.md | 设计说明:工具范围、服务规范、经实时确认的 RIS API 参考。 |
tests/ | 与 src/ 结构对应的单元测试和集成测试。 |
framework-skills/ | 从 @cyanheads/mcp-ts-core 同步的开发技能。 |
开发指南
开发指南和架构规则请参阅 CLAUDE.md / AGENTS.md。简而言之:
- 处理器抛出错误,框架负责捕获 — 工具逻辑中不要使用
try/catch - 使用
ctx.log进行请求级日志记录,使用ctx.state进行租户级存储 - 通过
src/index.ts中的createApp()注册新工具和资源 - 封装 RIS API:先验证原始数据 → 再标准化为领域类型 → 最后返回输出模式;绝不捏造缺失字段
贡献
欢迎提交问题。提交前请运行检查和测试:
bun run devcheck
bun run test
许可证
Apache-2.0 — 详见 LICENSE。
RIS OGD 数据采用 CC BY 4.0 许可(署名:RIS、奥地利联邦总理府)。底层法律文本属于无版权的官方作品。只有正式的、带有签名的公报原文具有法律约束力 — RIS 汇编文本仅供参考。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。