关于 Luxembourg MCP
Luxembourg MCP 将卢森堡公共数据整理为一致的工具,供 AI Agent 和 MCP 客户端调用。它涵盖法律、统计、出行等领域,并在结果中附上来源 URL,无需 API 密钥。
主要功能
- 01覆盖公共数据源的 44 个工具
- 02搜索法律与统计数据
- 03查询出行和实时状况
- 04地址与地理空间查询
- 05每项结果附来源 URL
- 06支持 Stdio 和 Streamable HTTP
适用场景
- 01查找法律和统计数据
- 02查看实时交通、停车或天气
- 03定位地址和公共交通站点
- 04搜索卢森堡开放数据目录
MCP 相关
该 MCP 服务提供 44 个工具,覆盖 28 个公共数据系统,包括法律、统计、出行和环境数据。客户端可连接托管的 Streamable HTTP 端点,也可通过 stdio 运行服务。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://mcp.luxembourg-mcp.com/mcpclaude mcp add --transport http amirdaraee-luxembourg https://mcp.luxembourg-mcp.com/mcp{"mcpServers":{"amirdaraee-luxembourg":{"type":"http","url":"https://mcp.luxembourg-mcp.com/mcp"}}}在 Cursor 中打开{"servers":{"amirdaraee-luxembourg":{"type":"http","url":"https://mcp.luxembourg-mcp.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"amirdaraee-luxembourg":{"type":"http","url":"https://mcp.luxembourg-mcp.com/mcp"}}}{"mcpServers":{"amirdaraee-luxembourg":{"serverUrl":"https://mcp.luxembourg-mcp.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
44| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| page | integer | 否 | |
| query | string | 是 | |
| page_size | integer | 否 |
详细介绍
Luxembourg MCP
无需密钥即可通过模型上下文协议访问卢森堡公共数据。
**托管端点——无需安装:**将任意 MCP 客户端指向 https://mcp.luxembourg-mcp.com/mcp(可流式传输的 HTTP)。也可以使用 uvx luxembourg-mcp 自行运行。网站:luxembourg-mcp.com
Luxembourg MCP 将分散的公共 API 和开放数据集整合为 44 个一致的工具,供 AI Agent 直接调用。涵盖法律、官方统计、交通出行、环境测量、议会、无障碍设施、地址、地理空间要素和国家开放数据目录。
- 44 个 MCP 工具
- 28 个公共数据系统
- 无需 API 密钥或账号
- 无需抓取数据
- 每条结果都附带来源 URL
- 支持 Stdio 和 Streamable HTTP 传输
起源与致谢
本项目直接受到 Allemannsdata 的启发,该项目由 Thomas Heggelund 创建。
Heggelund 最初的构想是,让公共数据像挪威的 allemannsretten(自由漫行权)所倡导的那样开放:公共信息应当易于获取、组合和使用。Allemannsdata 通过一致且无需密钥的 MCP 工具呈现多个彼此无关的数据源,免去了 Agent 与挪威公共服务之间重复的集成工作。
Luxembourg MCP 将这一理念应用于卢森堡大公国。它是面向卢森堡的独立实现,并非分支、官方地区版本或关联项目。关于通过 MCP 提供公共数据目录这一原始构想,应归功于 Thomas Heggelund 和 Allemannsdata。
可用工具
| 工具 | 公共来源 | 用途 |
|---|---|---|
search_datasets | data.public.lu | 搜索国家开放数据目录 |
get_dataset | data.public.lu | 查看元数据和当前资源 |
geocode_address | Geoportail | 查找官方地址 |
reverse_geocode | Geoportail | 查找最近的官方地址 |
list_geo_collections | Geoportail OGC API | 查找可查询的地理空间图层 |
get_geo_features | Geoportail OGC API | 获取指定范围内的 GeoJSON 要素 |
get_weather_alerts | MeteoLux | 查看当前天气预警 |
search_legislation | Legilux | 搜索法律法规和合并文本 |
search_statistics | STATEC LUSTAT | 查找统计数据流 |
get_statistics | STATEC LUSTAT | 获取带标签的 SDMX 观测数据 |
get_city_parking | Ville de Luxembourg | 查看城市停车位实时情况 |
list_cfl_parking | CFL | 列出 Park and Ride 停车场 |
get_cfl_parking | CFL | 查看 P+R 实时占用情况和空余车位 |
get_traffic | CITA | 查看高速公路实时交通测量数据 |
get_water_levels | Water Management Administration | 查看当前水文站水位 |
get_air_quality | Environment Administration | 查看全国空气质量测量数据 |
search_chamber_bodies | Chamber of Deputies | 搜索机构、成员资格和职务 |
get_accessibility_figures | Digital Accessibility Observatory | 查看全国无障碍总量数据 |
get_accessibility_audits | Digital Accessibility Observatory | 列出近期公共部门审计 |
search_transit_stops | Public Transport Administration | 搜索全国 GTFS 站点 |
get_city_mobility | Ville de Luxembourg Maps | 以 GeoJSON 格式获取出行地点 |
get_weather_observations | MeteoLux | 获取 Findel 的实时气温、风力和气压 |
get_public_holidays | data.public.lu | 获取四种语言的法定公共假日 |
search_parliamentary_questions | Chamber of Deputies | 搜索议会质询及答复 |
get_housing_prices | Observatoire de l'Habitat | 按市镇查询挂牌住房售价 |
get_election_results | CTIE | 获取 2023 年立法选举结果 |
get_ev_charging | Chargy | 查询公共电动汽车充电设施及实时可用情况 |
get_waste_collections | Environment Administration | 按市镇查询即将进行的垃圾收集日期 |
get_weather_forecast | MeteoLux | 获取官方天气预报、紫外线指数、日出和日落时间 |
get_fuel_prices | Ministère de l'Économie | 获取每月燃油、氢能和电动汽车充电价格 |
get_public_alerts | LU-Alert | 获取国家预警,包括食品召回信息 |
get_commune_leaders | Ministère des Affaires intérieures | 查询各市镇现任市长和市 aldermen |
get_commune_population | CTIE | 按市镇、年龄组和性别查询居民人口 |
get_pharmacies_on_duty | Pharmacie.lu | 查询值班药房及其地址和电话 |
get_electricity_prices | Open Data Lëtzebuerg | 获取日前电价,精确到每 15 分钟 |
get_carsharing | CFL Mobility | 查询可用的 FLEX 共享汽车 |
get_bike_sharing | Vël'OK | 查询南部地区单车共享的实时可用情况 |
search_tenders | Portail des marchés publics | 搜索公开招标公告 |
get_plenary_votes | Chamber of Deputies | 获取全体会议投票结果,按党派和议员列出计票结果 |
get_deputies | Chamber of Deputies | 查询现任议员、党派、选区和电子邮箱 |
lookup_luxembourgish | Lëtzebuerger Online Dictionnaire | 查询翻译、发音和例句 |
get_traffic_events | CITA | 获取道路施工、封闭和事故的实时信息 |
get_electricity_grid | Open Data Lëtzebuerg | 获取每日负荷、发电结构和跨境电力流 |
get_unemployment | ADEM | 获取按月统计的求职者和职位空缺数据,可按全国或市镇查询 |
快速开始
需要 Python 3.11 或更高版本。
python -m venv .venv
. .venv/bin/activate
pip install -e .
luxembourg-mcp --transport http --port 8000
运行后:
| 接口 | URL |
|---|---|
| 工具目录 | http://127.0.0.1:8000/ |
| MCP 端点 | http://127.0.0.1:8000/mcp |
| 健康检查 | http://127.0.0.1:8000/health |
| 上游状态 | http://127.0.0.1:8000/status |
/status 会报告每个工具的官方上游是否可访问;目录会在每个工具卡片上用指示灯显示状态。无论有多少人加载页面,每个上游每 10 分钟最多进行一次轻量检查(仅读取前几 KB)。一次检查失败会将上游标记为性能下降,连续两次失败则标记为不可用。
Stdio 客户端
{
"mcpServers": {
"luxembourg": {
"command": "luxembourg-mcp"
}
}
}
Docker
docker build -t luxembourg-mcp .
docker run --rm -i luxembourg-mcp # stdio (default)
docker run --rm -p 8000:8000 luxembourg-mcp --transport http --host 0.0.0.0 # HTTP
示例问题
连接 MCP 客户端后,Agent 可以回答以下问题:
- 卢森堡目前有哪些天气预警?
- CFL Park and Ride 还有多少个空位?
- Mersch 最新的水位是多少?
- 查找有关养老金的法律。
- 哪些 STATEC 数据集包含人口数据?
- A6 上最新的交通测量数据是什么?
- A4 现在有道路施工或车道封闭吗?
- 各政党对最新的有轨电车法案投了什么票?
- 卢森堡语单词“Schiertech”是什么意思?
- 查找卢森堡市某个地址的官方坐标。
- 哪些公交车站或有轨电车站与 Hamilius 匹配?
协议行为
该服务:
- 根据每个已公布工具的输入架构验证参数;
- 拒绝 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 工具结果返回,而不会终止服务;
- 限制大型上游响应的大小,再将其放入 Agent 上下文。
内置 HTTP 服务是无状态的,不提供 SSE 流。默认情况下,它只接受来自环回地址的浏览器源;托管部署可以通过 LUXEMBOURG_MCP_ALLOWED_ORIGINS(以逗号分隔的源列表,或 *)扩展此设置,同时为获准的源启用 CORS 预检和响应标头。公开部署应在反向代理或应用网关上添加 TLS、响应缓存和可观测性。
安全与部署
内置服务包含基础安全控制,但不能替代生产环境中的 API 网关:
- HTTP 请求正文大小限制为 1 MiB。
- 上游响应大小限制为 25 MiB。
- 从元数据派生的下载仅限可信的
data.public.luHTTPS 资源主机,包括重定向;固定上游 URL 仅跟随同一主机上的 HTTPS 重定向。 - 上游 XML 若声明了 DTD 实体,会在解析前被拒绝;用户提供的标识符无法构成
./..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 客户端和 Agent 宿主必须将工具结果视为数据,而非系统指令,并应在允许强大的同级工具根据此处返回的内容采取行动之前,要求确认或进行策略检查。
测试
默认测试套件具有确定性,不使用网络。它涵盖 JSON-RPC 行为、架构验证、数据提供方解析器、目录打包,以及全部 28 个工具的 tools/call 合约。
PYTHONPATH=src python -m unittest discover -s tests -v
选择加入的实时测试套件会调用所有真实的上游服务:
LUXEMBOURG_MCP_LIVE=1 PYTHONPATH=src \
python -m unittest tests.test_live_tools -v
当数据源不可用或更改其发布的数据时,实时测试可能会失败。它们还会下载较大的 STATEC、空气质量、Chamber 和 GTFS 资源。
当前限制
- 用于实时出发信息和行程规划的官方 ATP API 需要个人访问密钥。此项目改为从官方 GTFS 数据源提供无需密钥的静态站点信息。
- 缓存有容量上限,但仅限单个进程使用。多个工作进程之间不会共享缓存数据。
- 上游服务的可用性、更新频率、架构和许可仍由各数据生产方控制。
- 工具覆盖范围尚未与 Allemannsdata 持平。候选内容包括议会投票、法院判决、历史天气、电动汽车充电、道路工程以及更多环境测量数据。
独立性与数据所有权
Luxembourg MCP 是一个社区项目,与 Thomas Heggelund、Allemannsdata、卢森堡政府或其提供数据的任何机构均无关联。
项目不拥有上游数据。各数据生产方的许可和条款仍然适用。工具结果会保留上游来源 URL,方便 Agent 和用户查看权威记录。
许可
Luxembourg MCP 源代码根据 MIT 许可发布。上游公共数据由各自的数据生产方另行许可。
mcp-name: io.github.amirdaraee/luxembourg-mcp
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。