内容
森堡MCP
[](https://github.com/amirdaraee/luxembourg-mcp/actions/workflows/ci.yml)
[](https://pypi.org/project/luxembourg-mcp/)
[](LICENSE)
无密钥模型上下文协议,访问卢森堡公共数据。
**托管端点 - 无需安装:** 将任何MCP客户端指向 `https://mcp.luxembourg-mcp.com/mcp`(可流式HTTP)。或者使用 `uvembourg-mcp`:[luxembourg-mcp.com](https://luxembourg-mcp.com)
卢森堡MCP将分散的公共API和开放数据集转化为27种一致的工具,可供AI代理直接调用。涵盖法律、官方统计、交通、环境测量、议会、Accessibility、地址、地理空间特征和国家开放数据目录。
- 27个MCP工具
- 18个公共数据系统
- 无需API密钥或账户
- 无需爬虫
- 每个结果返回源URL
- 标准输入输出和可流式HTTP传输
## 起源和致谢
本项目直接灵感来自 [Allemannsdata](https://allemannsdata.com/),由 [Thomas Heggelund](https.com/in/sysfrog/) 创建。
Heggelund的最初想法是给予公共数据以挪威“allemannsretten”所建议的开放性,即漫游权:公共信息应该直接、组合和使用。Allemannsdata通过一致的、无密钥的MCP工具呈现许多无关的数据源,消除了代理和挪威公共服务之间的重复集成工作。
卢森堡MCP将这一理念应用于卢森堡大公国。它是卢森堡的独立实现,而不是分支、官方区域版本或关联项目。原始公共数据MCP目录概念的版权归Thomas Heggelund和Allemannsdata所有。
## 可用工具
| 工具 | 公共来源 | 用途 |
| --- | --- |
| `` | data.public.lu |开放数据目录 `get_dataset` | data.public.lu | 检查元数据和 |
| `ge` | Geoportail |地址 |
| `reverse_geocode` | Geoportail | 查找最近的官方地址 |
| `list_geo_collections` | Geoportail OGC API | 发现可查询的地理空间层 |
| `get_geo_features`ail 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` | 水资源管理署 | 读取当前水位站级别 |
| `get_air_quality` | 环境署 | 读取国家空气质量测量 |
| `search_chamber_bodies` | 众议院 | 搜索机构、成员资格和角色 |
| `get_accessibility_figures` | 数字无障碍观测站 | 读取国家无障碍总数 |
| `get_accessibility_audits` | 数字无障碍观测站 | 列出最近的公共部门审计 |
| `search_transit_stops` | 公共交通管理局 | 搜索全国GTFS站点 |
| `get_city_mobility` | Ville de Luxembourg Maps | 检索地理位置为GeoJSON的移动位置 |
| `get_weather_observations` | MeteoLux | Findel的实时温度、风、压力 |
| `get_public_holidays` | data.public.lu | 四种语言的法定公共假期 |
| `search_parliamentary_questions` | 众议院 | 搜索议会问题和答案 |
| `get_housing_prices` | 住房观测站 | 按市镇划分的公开房屋销售价格 |
| `get_election_results` | CTIE | 2023年立法选举结果 |
| `get_ev_charging` | Chargy | 公共电动汽车充电,实时可用 |
## 快速入门
需要Python 3.11或更新版本。
```bash
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` |
### 标准输入输出客户端
```json
{
"mcpServers": {
"luxembourg": {
"command": "luxembourg-mcp"
}
}
}
```
### Docker
```bash
docker build -t luxembourg-mcp .
docker run --rm -p 8000:8000 luxembourg-mcp
```
## 示例问题
连接MCP客户端后,代理可以回答以下问题:
- 卢森堡目前有哪些天气警告?
- CFL的某个Park and Ride设施有多少个空闲车位?
- Mersch最新的水位是多少?
- 查找有关养老金立法的规定。
- 哪些STATEC数据集包含人口数据?
- A6公路最新的交通测量数据是什么?
- 查找卢森堡市某个地址的官方坐标。
- 哪些公交车或电车站点与Hamilius相匹配?
## 协议行为
服务器:
- 验证所有公开工具输入模式的参数;
- 使用`-32600 Invalid Request`拒绝JSON-RPC批次和其他非对象JSON;
- 支持MCP修订版`2025-11-25`、`2025-06-18`和`2025-03-26`;
- 验证HTTP请求的`MCP-Protocol-Version`头;
- 将工具失败作为MCP工具结果返回,而不终止服务器;
- 在将大型上游响应放入代理上下文之前进行限制。
内置HTTP服务器是无状态的,不提供SSE流。默认情况下,它仅接受来自环回地址的浏览器源;托管部署可以使用`LUXEMBOURG_MCP_ALLOWED_ORIGINS`(逗号分隔的源列表或`*`)扩展此功能,还为允许的源启用CORS预飞行和响应头。公共部署应在反向代理或应用程序网关上添加TLS、响应缓存和可观察性。
## 安全性和部署
内置服务器包含基线控制,但它不能替代生产API网关:
- HTTP请求正文限制为1 MiB。
- 上游响应限制为25 MiB。
- 基于元数据的下载仅限于受信任的`data.public.lu` HTTPS资源主机,包括重定向。
- 检查GTFS ZIP成员的解压缩大小、加密和可疑压缩比率,然后再提取。
- 默认情况下,HTTP客户端每分钟限制为60个MCP请求。
- Docker镜像以非特权`app`用户身份运行。
设置`LUXEMBOURG_MCP_RATE_LIMIT`以更改每分钟、每个客户端的限制。值为`0`时禁用内置限制器。限制器故意使用直接TCP对等地址,不信任转发头,除非`LUXEMBOURG_MCP_CLIENT_IP_HEADER`明确命名一个(例如Cloudflare后面的`CF-Connecting-IP`);仅当受信任的代理控制该头时才设置它,因为客户端可以伪造它以逃避限制。
工具输出是不可信的外部数据。数据集描述、立法标题和其他公共文本可能包含误导性或对抗性指令。MCP客户端和代理主机必须将工具结果视为数据,而不是系统指令,并且在允许功能强大的兄弟工具根据此处返回的内容执行操作之前,应要求确认或策略检查。
## 测试
默认套件是确定性的,不使用网络。它涵盖了JSON-RPC行为、模式验证、提供者解析器、目录打包和所有27种工具的`tools/call`契约。
```bash
PYTHONPATH=src python -m unittest discover -s tests -v
```
可选的实时套件调用每个真实的上游服务:
```bash
LUXEMBOURG_MCP_LIVE=1 PYTHONPATH=src \
python -m unittest tests.test_live_tools -v
```
当源不可用或其发布的数据发生变化时,实时测试可能会失败。它们还会下载更大的STATEC、空气质量、议会和GTFS资源。
## 当前限制
- 实时出发和行程规划的官方ATP API需要个人访问密钥。该项目公开了来自官方GTFS源的无密钥静态站点。
- 缓存是有限的,但于一个进程。多个工作者不共享缓存数据。
- 上游可用性、更新频率、模式和许可仍然由每个数据生产者控制。
- 工具覆盖率尚未达到与Allemannsdata的对等。候选项目包括议会投票、法院判决、历史天气、电动汽车充电、道路工程等更多环境测量。
## 独立性和数据所有权
卢森堡MCP是一个社区项目。它与Thomas Heggelund、Allemannsdata、卢森堡政府或其数据提供者无关。
该项目不拥有上游数据。每个生产者的许可和条款继续适用。工具结果保留上游源URL,以便代理和用户可以检查权威记录。
## 许可证