用途
luxembourg-mcp 用于把卢森堡分散的公共 API 与开放数据集整合为 AI 智能体可以直接调用的 MCP 工具,减少智能体与公共服务之间重复的集成工作。项目自我描述为“Keyless Model Context Protocol access to Luxembourg public data”,即无需密钥即可访问卢森堡公共数据,覆盖法律、官方统计、出行、环境测量、议会、无障碍、地址、地理空间要素以及国家开放数据目录等。
主要能力
- 将碎片化的公共 API 与开放数据集转换为一致的工具集合,便于 AI 智能体调用。
- 项目说明称提供 44 个一致工具,覆盖 28 个公共数据系统;另一处描述为 21 个工具、15 个公共系统(信息之间存在差异)。
- 无需 API 密钥或账户。
- 每个结果都会返回来源 URL。
- 支持 Stdio 与 Streamable HTTP 两种传输方式。
- 提供 /status,用于报告各工具对应的官方上游是否可达;每个上游最多每 10 分钟做一次轻量检查(仅读取前几 KB)。一次检查失败标记为 degraded,连续两次失败标记为 down。
- 官方说明中给出的示例问题包括:卢森堡当前有哪些天气预警、CFL Park and Ride 有多少空位、Mersch 最新水位、查找与养老金有关的立法、哪些 STATEC 数据集包含人口数据、A6 最新交通测量、A4 当前是否有道路施工或车道封闭、各党派在最新有轨电车法案上如何投票、卢森堡语单词“Schiertech”的含义、查找卢森堡市某地址的官方坐标、哪些公交或有轨电车站点匹配 Hamilius。
使用方式
- 托管端点,无需安装:将任意 MCP 客户端指向 https://mcp.luxembourg-mcp.com/mcp (streamable HTTP)。
- 自行运行:使用 uvx luxembourg-mcp。
- 要求 Python 3.11 或更高版本。
- 网站:luxembourg-mcp.com。
- 协议行为:会按每个已公布工具的输入 schema 校验参数;对 JSON-RPC 批量请求及其他非对象 JSON 返回 -32600 Invalid Request;在同一端点和 stdio 上支持 MCP 2026-07-28(无状态:每请求 _meta、server/discover、缓存提示)以及 initialize 握手修订版 2025-11-25、2025-06-18、2025-03-26;对 HTTP 请求会校验 MCP-Protocol-Version、Mcp-Method、Mcp-Name 头与请求体是否一致;工具失败会作为 MCP 工具结果返回而不终止服务器;对较大的上游响应会在放入智能体上下文前进行限制。
- 内置 HTTP 服务器为无状态,不提供 SSE 流。默认只接受来自回环地址的浏览器来源;托管部署可通过 LUXEMBOURG_MCP_ALLOWED_ORIGINS(逗号分隔的来源列表,或 *)扩展,同时会为允许来源启用 CORS 预检和响应头。公开部署应在反向代理或应用网关上增加 TLS、响应缓存与可观测性。
安全与部署
- HTTP 请求体限制为 1 MiB。
- 上游响应限制为 25 MiB。
- 由元数据派生的下载被限制在受信任的 data.public.lu HTTPS 资源主机(包括重定向);固定上游 URL 只跟随同主机上的 HTTPS 重定向。
- 声明 DTD 实体的上游 XML 在解析前会被拒绝;用户提供的标识符不能形成 . 或 .. URL 路径片段。
- GTFS ZIP 成员在解压前会检查解压后大小、加密情况以及可疑压缩比。
- HTTP 客户端默认限制为每分钟 60 个 MCP 请求;IPv6 客户端按 /64 前缀分组。
- HTTP 服务器默认最多 32 个并发连接,并关闭空闲 30 秒的连接。
- Docker 镜像以非特权 app 用户运行,基础镜像经过摘要固定。
- 可通过 LUXEMBOURG_MCP_RATE_LIMIT 修改每分钟每客户端限制,值为 0 表示禁用内置限流器。限流器有意使用直接 TCP 对端地址,除非 LUXEMBOURG_MCP_CLIENT_IP_HEADER 明确指定某个头(例如 Cloudflare 后的 CF-Connecting-IP),否则不信任转发头;只有在受信任代理控制该头时才应设置,否则客户端可能伪造该头来绕过限制。可通过 LUXEMBOURG_MCP_MAX_CONNECTIONS 修改并发连接上限,超出上限的连接会被立即关闭。
- 工具输出属于不可信外部数据。数据集描述、立法标题等公共文本可能包含误导性或对抗性指令。MCP 客户端与智能体宿主必须把工具结果当作数据而非系统指令,并在允许强大的同级工具依据此处返回内容行事之前要求确认或进行策略检查。
- 默认测试套件是确定性的且不使用网络,覆盖 JSON-RPC 行为、schema 校验、提供方解析器、目录打包以及全部 28 个工具的 tools/call 契约。可选的实时测试套件会调用每个真实上游服务;当来源不可用或更改其发布数据时,实时测试可能失败,并且会下载较大的 STATEC、空气质量、Chamber 和 GTFS 资源。
适用场景
- 需要让 AI 智能体查询卢森堡法律、统计、议会投票、地址、地理空间、公交站点、交通与环境等公共数据。
- 希望以统一、免密钥的方式接入多个卢森堡公共数据源,避免逐个集成。
- 需要在本地或托管环境中以 Stdio 或 Streamable HTTP 方式运行 MCP 服务器。
限制
- 官方 ATP API(实时到站与行程规划)需要个人访问密钥,本项目改为暴露官方 GTFS 数据源中的免密钥静态站点。
- 缓存有界,但局限于单个进程;多个 worker 不共享缓存数据。
- 上游的可用性、更新频率、schema 与许可仍由各数据生产者控制。
- 工具覆盖尚未与 Allemannsdata 完全对齐。候选方向包括议会投票、法院判决、历史天气、电动车充电、道路施工以及更多环境测量。
- 项目为社区项目,与 Thomas Heggelund、Allemannsdata、卢森堡政府或其暴露数据的任何机构均无隶属关系。项目不拥有上游数据,各生产者的许可与条款继续适用;源码采用 MIT 许可证,上游公共数据由各自生产者单独授权。
- 官方文本中未提供收费、价格、付费计划等商业信息;相关事实暂未提供。