mcpField
F
fedlex-mcp

fedlex-mcp

本地服务
github.com法律与政务74 周前更新

关于 fedlex-mcp

fedlex-mcp 是面向 AI 助手的 MCP 服务,可查询瑞士联邦法律、公开咨询和官方术语。它结合了法律检索、咨询期限跟踪及多语言术语查询。

主要功能

  1. 01搜索联邦法律、出版物、条约和公报
  2. 02跟踪咨询期限及详情
  3. 03查询 TERMDAT 术语和定义
  4. 04分别查询 Fedlex 与 LINDAS SPARQL 端点
  5. 05支持 stdio 和 Streamable HTTP 传输

适用场景

  1. 01按主题或 SR 编号查找法律
  2. 02查看开放咨询及其截止日期
  3. 03查询法律沿革或即将生效的变更
  4. 04查找其他语言的官方术语对应词

MCP 相关

向 MCP 客户端提供联邦法律、咨询和 TERMDAT 的 12 个工具及 2 个资源。支持 stdio 和 Streamable HTTP 传输。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"malkreide-fedlex": {
"command": "uvx",
"args": [
"fedlex-mcp"
]
}
}
}
启动命令uvx fedlex-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypifedlex-mcp2.1.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

:switzerland: 属于 瑞士公共数据 MCP 项目组合

:balance_scale: fedlex-mcp

Version License: MIT Python 3.11+ MCP No Auth Required CI

瑞士联邦法律、意见征询和官方术语的 MCP 服务——通过 Claude Desktop 或 Claude.ai 搜索 SR、监控意见征询截止日期,并跨国家语言翻译术语

:de: 德语版本


概述

fedlex-mcp 将 AI 助手(Claude)连接到三个瑞士官方 SPARQL 数据源:

  1. 联邦法律:通过 Fedlex SPARQL 端点获取——《系统汇编》(SR)、《官方汇编》(AS)、《联邦公报》(BBl)和条约。
  2. 意见征询(Vernehmlassungen):通过同一个 Fedlex 端点(jolux:Consultation)获取——这是议会审议前的阶段,任何人都可以对草案发表评论。
  3. TERMDAT:联邦总理府的术语数据库,通过 LINDAS SPARQL 端点获取——提供德语、法语、意大利语、罗曼什语和英语的官方术语对应表达。

这三者都基于 SPARQL,这正是它们共用一个服务而非分成三个的原因:无需引入新的技术栈,只需针对熟悉的模式编写新查询。

**比喻:**联邦法律的 USB-C。Fedlex 告诉你需要回应什么。TERMDAT 告诉你它在其他国家语言中叫什么。


功能

  • :balance_scale: 12 个工具、2 个资源,涵盖联邦法律、意见征询和术语
  • :mag: 由 SPARQL 提供支持——两个相互隔离的端点(Fedlex + LINDAS),不会相互影响故障
  • :globe_with_meridians: 5 种语言——德语、法语、意大利语、罗曼什语,以及用于术语的英语
  • :unlock: 无需 API 密钥——所有数据均采用开放再利用许可
  • :cloud: 双传输方式——stdio(Claude Desktop)+ Streamable HTTP(云端)

锚点演示查询

“目前有哪些与教育相关的意见征询正在进行,截止日期是什么时候,哪个部门负责——回复时需要用到的关键法语和意大利语术语有哪些?”

一次对话即可通过两个端点串联调用三个工具:

fedlex_get_open_consultations(topic="education")
   → fedlex_get_consultation(event_id="proj/2026/71/cons_1")
   → termdat_lookup_term(term="Volksschule", target_languages=["fr","it"])

每项正在进行的意见征询都包含 deadline、days_remaining(在请求时按照 Europe/Zurich 时区计算,0 表示截止日期就是今天),以及一个推导得出的 status——已过期的意见征询不会显示为正在进行。Fedlex 告诉你需要回应什么以及何时回应;TERMDAT 告诉你其他国家语言中如何称呼它。

使用 topic="education",不要使用 keyword="Volksschule"。 Fedlex 意见征询没有主题分类——筛选是对标题进行自由文本匹配,而“Volksschule”这个词在任何意见征询标题中都没有出现。topic 筛选器会扩展为一组公开说明的关键词(Bildung、Schule、Berufsbildung、Hochschule、……),并准确报告搜索了哪些词。


前提条件

  • Python 3.11+
  • uv(推荐)或 pip

安装

通过 uv 的 uvx 运行——无需克隆或手动安装。将其添加到 MCP 客户端配置中(Claude Desktop、Cursor 和 Windsurf 使用 mcpServers;VS Code 则在 .vscode/mcp.json 中使用顶层 servers 键):

{
  "mcpServers": {
    "fedlex-mcp": {
      "command": "uvx",
      "args": [
        "fedlex-mcp"
      ]
    }
  }
}

从源代码安装

# Clone the repository
git clone https://github.com/malkreide/fedlex-mcp.git
cd fedlex-mcp

# Install
pip install -e .
# or with uv:
uv pip install -e .

也可以使用 uvx(无需永久安装):

uvx fedlex-mcp

快速入门

# stdio (for Claude Desktop)
python -m fedlex_mcp.server

# Streamable HTTP (port 8000)
python -m fedlex_mcp.server --http --port 8000

立即在 Claude Desktop 中试用:

“显示所有现行的职业培训联邦法律” “《数据保护法》规定了什么?它仍然有效吗?” “目前有哪些教育相关的咨询正在开放,截止日期是什么时候?” “官方术语中,‘Volksschule’ 的法语和意大利语名称是什么?”


配置

Claude Desktop

编辑 ~/Library/Application Support/Claude/claude_desktop_config.json(macOS)或 %APPDATA%\Claude\claude_desktop_config.json(Windows):

{
  "mcpServers": {
    "fedlex": {
      "command": "python",
      "args": ["-m", "fedlex_mcp.server"]
    }
  }
}

或使用 uvx:

{
  "mcpServers": {
    "fedlex": {
      "command": "uvx",
      "args": ["fedlex-mcp"]
    }
  }
}

配置文件位置:

  • macOS:~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows:%APPDATA%\Claude\claude_desktop_config.json
云端部署(用于浏览器访问的 SSE)

通过浏览器中的 claude.ai 使用(例如,在没有本地软件的受管工作站上):

Render.com(推荐):

  1. 将仓库推送到 GitHub,或在 GitHub 上复刻该仓库
  2. 在 render.com 上:新建 Web 服务 -> 连接 GitHub 仓库
  3. 设置启动命令:python -m fedlex_mcp.server --http --port 8000
  4. 在 claude.ai 的 Settings -> MCP Servers 中,添加:https://your-app.onrender.com/sse

“开发者笔记本电脑使用 stdio,浏览器使用 SSE。”


演示

演示:Claude 使用 fedlex_search_laws


可用工具

#工具来源描述
1fedlex_search_lawsFedlex按标题关键词搜索《系统汇编》(SR)
2fedlex_get_law_by_srFedlex按 SR 编号获取法律(例如,235.1 =《数据保护法》)
3fedlex_get_recent_publicationsFedlex《官方汇编》(AS)的最新出版物
4fedlex_get_upcoming_changesFedlex即将生效的法律(法律监测)
5fedlex_search_gazetteFedlex搜索《联邦公报》(BBl)
6fedlex_get_law_historyFedlex法律的所有版本(版本历史)
7fedlex_search_treatiesFedlex国际条约(SR 编号以 0. 开头)
8fedlex_get_open_consultationsFedlex截止日期监测 — 正在开放的咨询(eventEndDate >= today,Europe/Zurich);每项包含 days_remaining 和推导出的 status,按截止日期由近到远排序;可选 topic/keyword
9fedlex_search_consultationsFedlex对咨询标题/描述进行全文搜索,并支持筛选条件(主题、状态、截止日期范围、办公室)
10fedlex_get_consultationFedlex获取单个 eventId 的详情:截止日期、days_remaining、办公室、推导出的状态、文档
11termdat_lookup_termLINDAS术语 → de/fr/it/rm/en 语种对应词,含定义
12termdat_get_conceptLINDAS根据 URI 或 ID 获取完整的 TERMDAT 条目
示例用例
查询工具
“显示所有现行的职业培训联邦法律”fedlex_search_laws
“《数据保护法》规定了什么?”fedlex_get_law_by_sr
“未来 3 个月内有哪些法律生效?”fedlex_get_upcoming_changes
“显示 DSG 的版本历史”fedlex_get_law_history
“有哪些教育相关的咨询正在开放,截止日期是什么时候?”fedlex_get_open_consultations
“查找关于语言法的已结束咨询”fedlex_search_consultations
“提供咨询 proj/2026/71/cons_1 的完整详情和文档”fedlex_get_consultation
“‘Volksschule’ 的法语和意大利语名称是什么?”termdat_lookup_term
“显示 TERMDAT 条目 40109 的完整内容”termdat_get_concept

→ 按受众查看更多用例 →


架构

一个服务后端连接两个相互隔离的 SPARQL 端点。独立的 httpx 客户端和超时设置可确保 LINDAS 故障不会导致 fedlex_* 工具中断,反之亦然。

+-------------------+     +------------------------------+     +--------------------------+
|   Claude / AI     |---->|  Fedlex MCP                  |---->|  Fedlex SPARQL Endpoint  |
|   (MCP Host)      |<----|  (MCP Server)                |<----|  fedlex.data.admin.ch    |
+-------------------+     |                              |     |  (law + consultations)   |
                          |  12 Tools . 2 Resources      |     +--------------------------+
                          |  Stdio | SSE                 |
                          |                              |     +--------------------------+
                          |  Isolated clients:           |---->|  LINDAS SPARQL Endpoint  |
                          |   - Fedlex  (law + cons.)     |<----|  lindas.admin.ch/query   |
                          |   - LINDAS  (TERMDAT)         |     |  (fch/termdat, TERMDAT)  |
                          |                              |     +--------------------------+
                          |  No authentication required  |
                          +------------------------------+
数据模型

JOLux 本体 — 联邦法律(Fedlex)

jolux:ConsolidationAbstract  <-  SR entry
  +-- jolux:isRealizedBy  ->  jolux:Expression (URI ends in /de, /fr, /it, /rm)
     +-- jolux:title               "Federal Act of 19 June 1992 on Data Protection"
     +-- jolux:titleShort          "DSG"
     +-- jolux:historicalLegalId   "235.1"

jolux:inForceStatus:  .../0 In force  ·  .../1 No longer published in SR  ·  .../3 No longer in force

JOLux 本体 — 意见征询(Fedlex,同一端点)

jolux:Consultation
  +-- jolux:eventId                     "proj/2026/71/cons_1"
  +-- jolux:eventTitle                  multilingual (de/fr/it)
  +-- jolux:eventDescription            multilingual
  +-- jolux:consultationStatus          -> vocabulary URI (0..6, /2 = "Laufend"/running)
  +-- jolux:foreseenImpactToLegalResource  -> the legal resource it will amend (link to SR)
  +-- jolux:hasSubTask  ->  ?t
        +-- jolux:eventStartDate                      <- opened_on
        +-- jolux:eventEndDate                        <- the deadline (xsd:date, calendar day)
        +-- jolux:institutionInChargeOfTheEvent       <- lead department
        +-- jolux:institutionInChargeOfTheEventLevel2 <- lead office
        +-- jolux:opinionHasDraftRelatedDocument      <- consultation documents

jolux:Consultation 没有主题分类 — 主题筛选仅对 eventTitle 进行自由文本搜索,status 则根据截止日期推导,而非来自源状态字段。

立法生命周期 — 意见征询所处阶段(都在这一个服务中):

  Vernehmlassung            Bundesblatt (BBl)          Systematische Sammlung (SR)
  (consultation)     ─────► (dispatch / act text) ───► (consolidated law in force)
  ────────────────         ─────────────────────      ───────────────────────────
  fedlex_get_open_          fedlex_search_gazette      fedlex_search_laws
    consultations           (eli/fga/…)                fedlex_get_law_by_sr
  fedlex_search_                                       fedlex_get_law_history
    consultations                                      (eli/cc/…)
  fedlex_get_consultation
        │  jolux:foreseenImpactToLegalResource
        └───────────────────────────────────────────► links a consultation forward
                                                       to the SR resource it amends

意见征询阶段是公众最早可以参与的阶段 — 上述工具可回答目前有哪些公开征询,以及截止日期是什么时候,此时草案尚未进入《联邦公报》。

schema.org — 术语(通过 LINDAS 的 TERMDAT,图 fch/termdat)

<concept>  = https://register.ld.admin.ch/termdat/40109      (a schema.ld.admin.ch/Term, ValidatedEntry)
  +-- schema:name         preferred name per language (de/fr/it/en; rm effectively absent)
  +-- schema:description  multilingual definition
  +-- schema:hasPart  ->  <term> = .../termdat/40109/3/de     (synonym/variant, language + position suffix)

SPARQL 端点: https://fedlex.data.admin.ch/sparqlendpoint · https://lindas.admin.ch/query 许可: 根据 fedlex.admin.ch 可免费复用;通过 LINDAS 提供的 TERMDAT 可开放复用。


架构决策

架构 A — 三个数据领域均仅使用实时 SPARQL,与现有 Fedlex 集成保持一致(决策日期:2026-07-18)。

两个来源都是无需身份验证的 SPARQL 端点,延迟也可接受,因此无需提供转储文件或离线回退:如果 Fedlex 端点宕机,服务无论如何都无法运行,而添加缓存只会掩盖问题。LINDAS 是一个独立端点,其故障不得影响 fedlex_* 工具。

**隔离要求:**Fedlex 和 LINDAS 使用独立的 httpx 客户端、超时设置以及错误/状态报告。LINDAS 超时不能导致 fedlex_* 调用失败,反之亦然(由隔离测试覆盖)。


语言

代码语言
de德语(默认,覆盖最完整)
fr法语
it意大利语
rm罗曼什语

项目结构

fedlex-mcp/
+-- src/fedlex_mcp/
|   +-- __init__.py              # Package
|   +-- server.py                # 12 tools, 2 resources (Fedlex + LINDAS)
+-- tests/
|   +-- test_server.py           # Unit tests (mocked)
+-- .github/workflows/ci.yml     # GitHub Actions (Python 3.11/3.12/3.13)
+-- pyproject.toml
+-- CHANGELOG.md
+-- CONTRIBUTING.md               # Contributing guide (English)
+-- CONTRIBUTING.de.md            # Contributing guide (German)
+-- SECURITY.md                   # Security policy (English)
+-- SECURITY.de.md                # Security policy (German)
+-- LICENSE
+-- README.md                    # This file (English)
+-- README.de.md                 # German version

已知限制

  • **SPARQL 复杂度:**范围很广的关键词搜索可能会超时(超时设为 45s)
  • **语言覆盖:**德语数据最完整;其他语言可能存在缺漏
  • **历史数据:**并非所有法律的历史版本都有机器可读的元数据
  • **速率限制:**端点可能会限制高频请求
咨询 — 范围与可靠性(依赖前请先阅读)
  • 仅限联邦层面。不包括州级咨询。 Fedlex 收录的是联邦(Bund)咨询。州级咨询——对学校主管部门(Schulamt)而言往往更相关——不在 Fedlex 中,也不在此处的覆盖范围内。这是严格的范围界限,不能设法绕过。
  • 这不是推送服务。 MCP 基于拉取:服务会按请求回答哪些咨询仍在开放、哪些即将到期。它无法通知、安排或发送提醒。定期查询由你或外部调度器负责,绝非由服务负责。“没有开放的咨询”意味着目前没有开放的咨询,而不是之后也不会有。
  • 主题筛选基于自由文本,并不完美。 jolux:Consultation 没有主题/分类体系(已于 2026-07-20 在线验证)——筛选仅针对标题进行子字符串搜索。topic="education" 会扩展为已披露的关键词并集,并有意扩大匹配范围(过窄的筛选会造成误导,让人误以为没有相关咨询);预计会有一些误报(例如无关标题中包含“Ausbildung”),而对于小众措辞,也可能出现漏报。响应始终会说明搜索了哪些词。
  • **覆盖范围/延迟:**约 2,553 项咨询;1960–1991 年的历史语料由联邦档案馆保存,不在范围内。新开放的咨询会按照上游 Fedlex 的发布延迟显示(不是实时)。
  • 截止日期按 Europe/Zurich 时区的日历日结束;days_remaining 在请求时计算,绝不缓存。0 = 截止日期就是今天。

实时查询结果(已于 2026-07-20 验证):

查询状态记录数备注
COUNT(?s) {?s a jolux:Consultation}正常2,553完整清单
hasSubTask(含开始/结束日期)正常2,505 / 2,55348 项没有任何截止日期
开放的咨询(eventEndDate >= today)正常42截止日期延伸至 2026 年秋季
consultation-status 词汇表正常7 个值/0../6,/2 = 进行中
标题包含“volksschule”/“lehrplan”正常0 / 0连锚点词本身都无法找到结果 → 请使用 topic
标题包含“bildung”(单个词)与 topic="education" 并集正常44 vs 66关键词并集的范围更广
REGEX(LCASE(?t), "a|b") 交替匹配有问题0此端点会静默返回空结果 → 改用以 OR 串联的 CONTAINS
  • 特例 1——截止日期优先于状态字段。 状态 /2 (“Laufend”/进行中)和 eventEndDate 是两个独立信号。服务根据日期推导 status:截止日期已过 ⇒ Abgeschlossen,无论来源状态如何声明——因此,已过期的咨询绝不会被列为进行中。当两者不一致时,记录会标记为 status_conflict: true,并在 status_source 中保留原始标签。
TERMDAT (LINDAS) — 调查结果(已于 2026-07-18 验证)
查询状态记录数备注
图中 COUNT(DISTINCT ?s) a schema.ld:Term正常77,692
schema:name 上的语言标签正常de/fr/it/en实际上没有 rm(0)
搜索 schema:name = "Volksschule"正常1返回术语 URI …/termdat/40109/3/de
概念 URI …/termdat/40109正常–4 个语言变体 + 定义
  • 特例 2 — 现实核查差异(直言不讳)。 联邦总理府称 TERMDAT 大约有 400,000 条词条。LINDAS 中有 77,692 条。差异原因尚不明确——大概只有经过验证并发布的子集会作为 Linked Data 提供。在术语库中查无结果,并不意味着 TERMDAT 中缺少该术语;这只表示该术语不在 LINDAS 子集中。 每条 TERMDAT 响应都会附带此说明,以免模型得出错误结论。
  • 特例 3 — 两级 URI。 概念 URI(…/termdat/40109)包含首选名称和定义;带有语言/位置后缀的术语 URI(…/termdat/40109/3/de)是通过 schema:hasPart 关联的同义词/变体。工具接受这两种形式,并在内部将其规范化为概念 ID。

此工具不是什么

  • 不是订阅或提醒服务。 它不会监控、通知、发送电子邮件或提醒。它只会在有人查询时作答。任何定期检查都由你或外部调度器在服务之外执行。
  • 不是州级来源。 仅提供联邦(Bund)咨询信息——请参阅已知限制。
  • 不是法律建议。 它返回公开元数据和官方文件链接。截止日期和状态根据已发布的数据以机械方式推导;对于任何影响决策的事项,请通过链接的 Fedlex 页面进行核实。

作品集中的相关流程

瑞士联邦立法有一系列流程,而此服务涵盖其中一部分——议会前的咨询。完整流程可由三个 MCP 服务表示:

Vernehmlassung  →  Botschaft  →  Parlament  →  Referendum
(consultation)     (dispatch)    (debate)      (popular vote)
   fedlex-mcp        fedlex-mcp    parlament-mcp   swiss-democracy-mcp
  • 咨询(议会前): 此服务——fedlex_*consultation* 工具。
  • 议会阶段: parlament-mcp——联邦议会中的辩论、动议和投票。
  • 全民投票 / 公民复决: swiss-democracy-mcp——联邦全民投票。咨询是一个独立且更早的阶段——两者没有重叠,但同属立法生命周期。

项目阶段

此服务处于阶段 1(只读)。所有工具均标注为 readOnlyHint: true / destructiveHint: false,且只会查询公开的 Fedlex SPARQL 端点——不具备写入、发送或文件系统操作能力。

阶段范围状态
1 — 只读查询 SR/AS/BBl/条约✅ 当前
2 — 可写入(暂无计划)—
3 — 多 Agent(暂无计划)—

若要转入后续阶段,必须重新进行审计,并在添加任何可写入工具之前,实施审计目录中所述的人工介入控制。


MCP 协议版本

此服务通过同一端点支持两个协议时代。客户端在连接上的首个请求决定适用的协议;之后若声明属于另一个时代,则会被拒绝。

时代修订版本适用对象
initialize 握手2024-11-05 … 2025-11-25当前客户端所使用的版本。服务会返回请求中指定的修订版本;如果请求的版本更新,则返回上限 2025-11-25。
每请求信封2026-07-28携带 2026-07-28 _meta 信封的请求会开启现代连接。

两个修订版本都固定在 tests/test_protocol_version.py 中,并通过已安装的 SDK 进行断言,因此 Dependabot 更新 mcp 时,无法悄然更改任一版本。握手版本上限是通过已组装的 ASGI 栈向实时 initialize 请求进行测量得出的,而不是根据常量名称读取的。 请注意,SDK 的 LATEST_PROTOCOL_VERSION 是 modern 时代的别名,而不是握手时代的别名——仅固定这一项会导致当前客户端实际协商的时代版本继续漂移。

更新策略。 门禁检查失败时,不要盲目修改常量:请阅读两个修订版本之间的规范变更日志,确认服务端仍能正常运行,然后一并更新该常量、本节、README.de.md 和 CHANGELOG.md。

modern 修订版的四项影响体现在此服务中:

  • CORS 列出了路由标头。 每个可流式 HTTP 请求都会携带 Mcp-Method、Mcp-Name 和 Mcp-Protocol-Version,而浏览器只能发送服务端列入允许列表的标头。请参阅 server.py 中的 CORS_ROUTING_HEADERS。
  • 列表方法会携带新鲜度提示。 tools/list、 resources/list、resources/templates/list 和 server/discover 的响应包含 ttlMs 300000 和 cacheScope public(CACHE_HINTS)。resources/read 则有意不包含:它会返回联邦法律,客户端不能将已废止的法规视为在五分钟内仍然有效。
  • 不发送日志通知。 自 2026-07-28 起,日志记录能力已弃用(SEP-2577)。截至 v2.0.1,每个工具都会通过 ctx.info()/ctx.error() 发送 notifications/message ——在从未声明 logging 能力的握手连接上会发送,在 modern 连接上则作为已弃用的调用发送,并被 SDK 丢弃。现在,可观测性由运营方负责(将 structlog 输出到 stderr,可选使用 OpenTelemetry);故障会通过工具结果本身告知调用方(isError: true,见下文)。
  • serverInfo 包含软件包版本。 在 2026-07-28 中,身份信息会写入每个响应的 _meta,而不是在 initialize 时仅发送一次。截至 v2.0.1,其 version 为空字符串。

工具故障会携带 isError: true。 规范规定,执行错误(Fedlex 或 LINDAS 无法访问、响应正文不是 JSON)应作为带有 isError: true 的工具结果返回,而不是 JSON-RPC 错误。自 2025-11-25 起,违反输入架构的参数也算作执行错误,因此模型可以修正输入;SDK 会在工具运行前自行处理此类错误,不会返回封装对象——在两个时代中测量结果均如此,未知工具名称也一样。截至 v2.0.1,服务端自身的故障返回时 isError: false,只有封装对象中的 match_type: "error" 才表示发生了错误。封装对象仍通过 structuredContent 传输;“未找到内容”(match_type: "none")是有效答案,不会标记为错误。tests/test_tool_errors.py 会在两个时代中检查每个已注册工具。

较长的 SPARQL 调用会报告进度。 一次调用最长可能需要 45 s,耗时几乎都来自尝试以及尝试之间的退避等待。发送了 progressToken 的客户端每次尝试都会收到一条 notifications/progress——“Anfrage an Fedlex (Versuch 1 von 3)”,重试时则为 “Fedlex: Versuch 2 von 3 nach HTTP 503”——不会包含 total,因为没有可用的总数,填写就等于凭空捏造。通过可流式 HTTP 使用 2026-07-28 时,响应会切换为 SSE;未提供令牌时则不会发送任何内容。与日志记录不同,服务端到客户端的进度通知并未弃用。请参阅 tests/test_progress.py。

tests/test_modern_era.py 会在线路上测试两个时代:通过组装好的 ASGI 堆栈调用无会话的 server/discover 和 tools/call,并在每个时代中各调用一次工具,确认不会产生日志通知或 SDK 弃用警告。


测试

# Unit tests (no API key required)
PYTHONPATH=src pytest tests/ -m "not live"

# Integration tests (live API calls)
pytest tests/ -m "live"

安全性与限制

  • 只读: 所有工具仅执行 SPARQL SELECT 查询——不会在任一端点写入、修改或删除数据。全部 12 个工具均标注为 readOnlyHint: true / destructiveHint: false / idempotentHint: true。
  • 不涉及个人数据: Fedlex 保存公开法律、公报和咨询元数据;TERMDAT 保存官方术语。本服务不会处理或存储任何个人身份信息(PII)。
  • 速率限制: Fedlex 和 LINDAS SPARQL 端点均为未注明速率限制的公共服务;请谨慎使用 limit 参数(默认值为 20,最大值为 100)。本服务对每个端点的每次请求设有 45s 超时,并且只会对暂时性故障进行重试。
  • 端点隔离: Fedlex 和 LINDAS 使用独立的客户端和超时设置——LINDAS 服务中断不会影响 fedlex_* 工具。
  • 数据时效性: 结果反映查询时端点上的数据。本服务不会进行缓存。
  • 服务条款: 数据须遵守 fedlex.admin.ch 的再利用条件——允许免费用于商业和其他用途。
  • 不作保证: 本服务是社区项目,与瑞士联邦总理府无关。服务可用性取决于上游 SPARQL 端点。

更新日志

参见 CHANGELOG.md


贡献

参见 CONTRIBUTING.md


安全

有关安全状况、加固措施以及如何报告漏洞,请参见 SECURITY.md。


许可证

MIT 许可证——参见 LICENSE


作者

Hayal Oezkan . malkreide


鸣谢与相关项目

评论

支持 Markdown

第一次接触 MCP?

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

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