mcpField
R
ris-austria-mcp-server

ris-austria-mcp-server

远程服务
github.com/cyanheads法律与政务2今天更新
代码仓库

关于 ris-austria-mcp-server

面向法律从业者和研究人员的 MCP 服务,可查询奥地利官方 RIS 中的法规、法院判决、公报和立法草案。它还可解析法律引文,并标明文档的约束状态。

主要功能

  1. 01查询联邦、州和市级法规
  2. 02搜索 17 类法院判决
  3. 03浏览可追溯至 1848 年的公报
  4. 04解析引文并获取文档
  5. 05跟踪文档变更与删除

适用场景

  1. 01核对某日期生效的法律
  2. 02按法院或案号查找判决
  3. 03获取官方公报条目
  4. 04监控 RIS 数据集变更

MCP 相关

向 MCP 客户端提供九种搜索、查询和变更跟踪工具,以及一个文档资源。支持 STDIO 和 Streamable HTTP,并提供公共托管端点。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://ris-austria.caseyjhand.com/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

安装包
npm@cyanheads/ris-austria-mcp-server0.6.0

工具

9
参数类型必填说明
pageinteger否结果页码,从 1 开始。默认值为 1。
indexstring否Systematik 分类筛选器(例如 "10/10 Datenschutz")。仅适用于联邦/州合并法律。省略则不筛选;空值将被拒绝。
querystring否全文搜索(Suchworte)。支持布尔运算符 UND/ODER/NICHT 或 AND/OR/NOT、括号和带引号的短语;通配符 * 仅允许位于末尾("Datenschutz*",不能是 "*schutz")。语法:ris_list_reference topic search_syntax。省略则不筛选;空值将被拒绝。
scopeenum否管辖范围:federal(默认)搜索联邦合并法律;指定州则搜索该州的合并法律(或设置 municipality 时搜索该州的市级法律)。federal | burgenland | kaernten | niederoesterreich | oberoesterreich | salzburg | steiermark | tirol | vorarlberg | wien
titlestring否标题搜索(Titel)——匹配标题、简称和官方缩写("ABGB"、"DSG")。短语字段:* 可置于开头或末尾,且其旁至少须有 2 个字符。省略则不筛选;空值将被拒绝。
law_idstring否法律级分组键(Gesetzesnummer,例如 10001597 = DSG)——精确匹配;返回该法律的所有条文。仅适用于联邦/州合并法律。省略则不筛选;空值将被拒绝。
sort_byenum否排序列:条文(§/Artikel/Anlage 标签)或 in_force_date。默认:上游顺序。仅适用于联邦/州合并法律。section | in_force_date
languageenum否german(默认)搜索权威德语语料;english 搜索约 138 份部分联邦法律的非官方英文译本(需要 scope: federal;仅可与 query 和 title 组合)。german | english
page_sizeenum否每页文档数:10 或 20(默认 20)。如需查看更多结果,保持此值不变并增加 page。10 | 20
section_tostring否条文范围的结束值。单个条文时与 section_from 相同。省略则不筛选;空值将被拒绝。
municipalitystring否市级法律的市镇名称(例如 "Graz"——使用 RIS 的拼写,而非 "Stadt Graz")。需要指定州范围;仅可与 query、title 和 in_force_as_of 组合。覆盖 6 个州的部分规范(不包括 Burgenland/Tirol/Vorarlberg)。省略则搜索合并法律;空值将被拒绝。
section_fromstring否§ / Artikel / Anlage 编号范围的起始值,使用数字,可带可选字母("6"、"1a")。仅适用于联邦/州合并法律。省略则不筛选;空值将被拒绝。
section_typeenum否范围所针对的条文类型。设置条文范围时,默认使用 Paragraph。可选值:ris_list_reference topic section_types。Alle | Artikel | Paragraph | Anlage
changed_sinceenum否粗略的时效筛选器——筛选在该时间段内于 RIS 中发生变更的文档。要查询精确时间范围和删除记录,请使用 ris_track_changes。one_week | two_weeks | one_month | three_months | six_months | one_year
left_force_tostring否在此日期(YYYY-MM-DD)当天或之前失效的条文。
in_force_as_ofstring否仅返回在此日期生效的版本(YYYY-MM-DD)。默认采用奥地利的今日日期——省略此参数并不会搜索所有历史版本;如需搜索所有历史版本,请启用 include_all_versions。
sort_directionenum否排序方向;与 sort_by 配合使用。ascending | descending
left_force_fromstring否在此日期(YYYY-MM-DD)当天或之后失效的条文——用于追踪废止。与 entered_force_from 的互斥规则相同。
entered_force_tostring否在此日期(YYYY-MM-DD)当天或之前生效的条文。
entered_force_fromstring否在此日期(YYYY-MM-DD)或之后生效的条款 — 用于追踪新法律。仅适用于联邦/州整合版法律;与 in_force_as_of 和 include_all_versions 互斥。
include_all_versionsboolean否true 会搜索所有历史版本(不按生效日期筛选)— 用于版本历史研究。优先于 in_force_as_of;与生效时间范围筛选条件互斥。

详细介绍

@cyanheads/ris-austria-mcp-server

通过 MCP 搜索奥地利联邦及州法律汇编、法院判决,以及官方 RIS 发布的真实《联邦法律公报》(Bundesgesetzblatt)。无需密钥。支持 STDIO 或 Streamable HTTP。

9 个工具 • 1 个资源

Version License Docker MCP SDK npm TypeScript Bun

Install in Claude Desktop Install in Cursor Install in VS Code

Framework


概述

奥地利法律来自 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 不需要密钥。
安装
  1. 克隆代码仓库:
git clone https://github.com/cyanheads/ris-austria-mcp-server.git
  1. 进入目录:
cd ris-austria-mcp-server
  1. 安装依赖并构建:
bun install
bun run rebuild
  1. 添加到 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_URLRIS 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_PORTHTTP 服务端口。3010
MCP_SESSION_MODEHTTP 会话模式: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.tscreateApp() 入口点 — 注册工具和资源。
src/config可选的 RIS 端点和联系信息配置,使用 Zod 解析。
src/mcp-server/tools工具定义(*.tool.ts)。
src/mcp-server/resources资源定义(*.resource.ts)。
src/services/risRIS 请求构建、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 汇编文本仅供参考。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。