mcpField
R
Rhein-Ruhr Fahrplan MCP

Rhein-Ruhr Fahrplan MCP

本地服务
github.com/MarcProe地图与出行01 周前更新

关于 Rhein-Ruhr Fahrplan MCP

Rhein-Ruhr Fahrplan MCP 为莱茵-鲁尔地区提供基于 VRR 数据的公共交通 MCP 服务,面向查询出行信息的客户端。默认提供实时到发、路线和故障信息;配置后还可使用 GTFS 时刻表。

主要功能

  1. 01实时查询出发与到达
  2. 02规划跨区域换乘路线
  3. 03查询故障、施工与绕行
  4. 04按配置加载 GTFS 时刻表
  5. 05搜索站点并查看站点时刻表

适用场景

  1. 01查询站点的实时出发或到达
  2. 02规划区域内 A 到 B 的行程
  3. 03了解线路中断及施工信息

MCP 相关

通过 MCP 工具向客户端提供 VRR 区域的实时出行数据;启用 GTFS 配置后,还提供计划时刻表等工具。支持 stdio 和 Streamable HTTP。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"marcproe-rhein-ruhr-fahrplan": {
"command": "uvx",
"args": [
"rhein-ruhr-fahrplan-mcp"
],
"env": {
"FAHRPLAN_AGENCY_IDS": "<FAHRPLAN_AGENCY_IDS>",
"FAHRPLAN_OPERATOR": "<FAHRPLAN_OPERATOR>",
"FAHRPLAN_DEFAULT_START": "<FAHRPLAN_DEFAULT_START>"
}
}
}
}
启动命令uvx rhein-ruhr-fahrplan-mcp
需要配置的环境变量
FAHRPLAN_AGENCY_IDSComma-separated GTFS agency IDs to enable the schedule database (e.g. 'nia-25'). Without it the server runs live-only; schedule tools return a configuration hint. An unfiltered import would create a ~500 MB database and is intentionally not the default.
FAHRPLAN_OPERATOROptional: filter live departures/arrivals by operator code (e.g. 'NIAG'). Empty = all operators.
FAHRPLAN_DEFAULT_STARTOptional: default start stop (DHID like 'de:05154:35739', EFA ID or unique name), available via the get_default_start tool.

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

安装包
pypirhein-ruhr-fahrplan-mcp1.2.2

工具

9

收录的工具列表 · 更新于 2 周前

参数类型必填说明
limitinteger否
querystring是

详细介绍

rhein-ruhr-fahrplan-mcp

PyPI Python wheel Downloads MCP GTFS + EFA uv Listed on mcpservers.org

Rhein-Ruhr Fahrplan MCP server

面向莱茵-鲁尔地区公共交通时刻表数据的 MCP 服务(数据基础:莱茵-鲁尔交通联盟的开放数据)。PyPI 页面:https://pypi.org/project/rhein-ruhr-fahrplan-mcp/

两大数据支柱,均无需密钥:

支柱来源内容
计划时刻表(可选)VRR-GTFS(公共交通开放数据,CKAN API)→ SQLite仅包含配置的交通运营商(FAHRPLAN_AGENCY_IDS);例如 NIAG:123 条线路、6.975 次行程、3.869 个站点
实时数据(始终启用)VRR-EFA efa.vrr.de全联盟区域的实时出发/到达信息,含预测、延误、站台和服务中断提示

**默认仅提供实时数据:**不做任何配置时,服务会立即启动,并通过 EFA 接口提供所有实时工具。此时 GTFS 工具(计划时刻表、站点索引)会显示清晰提示及设置指南——这是有意为之,因为不加筛选地导入会创建完整数据库(约 500 MB,约 700 万条停靠时间记录)。

工具(9 个)

工具来源用途
next_departuresEFA(实时)提供含实时预测的出发信息
next_arrivalsEFA(实时)提供含实时预测的到达信息
plan_connectionEFA(实时)查询整个网络中从 A 到 B 的路线
line_disruptionsEFA(实时)查询当前的服务中断/施工/绕行信息
find_stopGTFS → EFA 回退查找站点(解析 DHID)
stop_scheduleGTFS查询计划时刻表(也支持明天/后天)
sync_statusGTFS查看数据源状态:版本、有效期、行数
update_feedGTFS更新数据源(仅在有新资源时;具备幂等性)
get_default_startGTFS → EFA解析配置的默认起始站点(FAHRPLAN_DEFAULT_START)

快速开始

方式 A:uvx(stdio,无需 Docker)
uvx rhein-ruhr-fahrplan-mcp

或永久安装:

uv tool install rhein-ruhr-fahrplan-mcp
rhein-ruhr-fahrplan-mcp
  • 立即启动(仅实时数据)。如需 GTFS 计划时刻表,只需设置一次环境变量(见下文),然后调用 update_feed 或重启服务——导入随后会在后台自动运行(约 1–2 分钟,下载 39 MB)。
  • 固定数据库路径:~/.local/share/rhein-ruhr-fahrplan-mcp/fahrplan.db(XDG 路径,不受当前工作目录影响;可通过 FAHRPLAN_DB_PATH 覆盖)。

mcphub/客户端注册(stdio 类型):

{
  "fahrplan-mcp": {
    "type": "stdio",
    "command": "uvx",
    "args": ["rhein-ruhr-fahrplan-mcp"],
    "env": {"FAHRPLAN_AGENCY_IDS": "nia-25"}
  }
}

(env 为可选项——不配置 Agencies 时,仅运行实时模式。)

方式 B:Docker(Streamable HTTP)
docker compose up -d --build

在 Hub 中注册为 Streamable HTTP 服务(通过 compose.override.yaml 连接网络,详见部署):

http://fahrplan-mcp:8080/mcp

配置:交通运营商(FAHRPLAN_AGENCY_IDS)

GTFS 导入会筛选 VRR Feed 中的 agency_ids。设置一个或多个:

# z. B. nur NIAG (Kreise Kleve & Wesel):
export FAHRPLAN_AGENCY_IDS=nia-25

# oder mehrere Unternehmen:
export FAHRPLAN_AGENCY_IDS=nia-25,swk-02,dvg-20

在 compose.yaml 中:

    environment:
      - FAHRPLAN_AGENCY_IDS=nia-25
      # - FAHRPLAN_OPERATOR=NIAG   # optional: Live-Abfahrten auch filtern

未设置 FAHRPLAN_AGENCY_IDS 时:

  • 实时工具(next_departures、next_arrivals、plan_connection、line_disruptions)正常工作(整个区域,所有运营商)
  • GTFS 工具(带索引的 find_stop、stop_schedule、sync_status)和自动导入会返回配置提示,而不是执行导入

交通运营商(精选)

agency_ids 来自 VRR-GTFS Feed(agency.txt,截至 2026 年 8 月)。常见运营商:

agency_id运营商区域/服务
nia-25Niederrheinische Verkehrsbetriebe公交,Kleve 和 Wesel 两县
dvg-20Duisburger VerkehrsgesellschaftDuisburg 公交/有轨电车
swk-02SWK MOBILKrefeld
new-80NEW mobil und aktiv M'gladbachMönchengladbach
vvg-65NEW mobil und aktiv ViersenViersen
btm-70, rbg-70RheinbahnDüsseldorf
bgs-00, bgs-30–bgs-34BOGESTRABochum/Gelsenkirchen
btm-13, eva-10–eva-12RuhrbahnEssen/Mülheim
dsw-36–dsw-39DSW21Dortmund
sto-15, btm-15, eva-15STOAGOberhausen
wsw-16, wsw-66WSW mobilWuppertal
hst-00, hst-50Hagener StraßenbahnHagen
sws-18Stadtwerke SolingenSolingen
swr-16Stadtwerke RemscheidRemscheid
ver-45VEREnnepe-Ruhr-Kreis
ves-40VestischeRecklinghausen/Marl
bvr-88BVR Busverkehr RheinlandRheinland 公交
bsm-76Bahnen der Stadt MonheimMonheim
hcr-35Straßenbahn Herne-CastropHerne/Castrop
swn-60Stadtwerke NeussNeuss
ddb-8003DB Regio NRWNRW 区域列车
ddb-NXNational ExpressRuhrgebiet 区域列车
ddb-RRRheinRuhrBahn区域列车
ddb-R2eurobahn区域列车
ddb-W3WestfalenBahn区域列车
ddb-N2NordWestBahn区域列车
ddb-M2REGIOBAHN区域列车

Feed 中的铁路货运/包车条目(Train Charter Services、Train Rental International、Ulmer Eisenbahnfreunde 等)与客运无关。

完整列表: 当前 Feed 中的 agency.txt(通过下方的 CKAN-API 下载)——包含全部 58 个 ID 及名称。可以用 Python 查看:

python3 -c "import csv; [print(r['agency_id'], '|', r['agency_name'])
             for r in csv.DictReader(open('agency.txt'))]"

架构

┌─────────────────────── Server (stdio | http) ─────────────────────────┐
│                                                                        │
│  FastMCP                                                               │
│    ├── Live: EFA-Client (urllib, keyless)  ← immer aktiv                │
│    │     efa.vrr.de/standard/XML_DM_REQUEST (rapidJSON)               │
│    │     XML_TRIP_REQUEST2, XML_STOPFINDER_REQUEST                    │
│    └── Soll: GTFS-SQLite (nur mit FAHRPLAN_AGENCY_IDS) ← Auto-Update  │
│          CKAN-API (alle 6 h) → bei Neuheit: atomarer Import            │
└────────────────────────────────────────────────────────────────────────┘
特性
  • 默认仅实时数据: 无需配置即可完整使用(实时工具);设置 FAHRPLAN_AGENCY_IDS 后启用 GTFS 部分。
  • 自动更新(设置 Agencies 后):守护线程每隔 FAHRPLAN_FEED_CHECK_INTERVAL 秒(默认 6 小时)检查 CKAN-API;仅在发现新资源时导入——通过 .tmp + os.replace() 原子执行。初始导入和自动导入共用同一把锁(不会重复导入)。
  • 实时数据运营商筛选: FAHRPLAN_OPERATOR(例如 NIAG)用于筛选 next_departures/next_arrivals;plan_connection 会优先按匹配结果排序。留空 = 所有运营商。
  • 无需 API 密钥,无需账号。 VRR 开放数据使用条款:允许测试/业余/开发用途;如需长期公开使用,请发送邮件至 [email protected]。

部署(Docker)

HTTP 模式仅在容器网络中监听 :8080/mcp(不开放 Host 端口)。若要连接到现有 Docker 网络中的 MCP Hub,请在 compose.yaml 旁创建本地文件 compose.override.yaml:

services:
  fahrplan-mcp:
    networks:
      - mein-hub-netz   # Name des Netzes, in dem der Hub läuft

networks:
  mein-hub-netz:
    external: true

docker compose up -d 会自动合并 Override。该 Override 文件因环境而异,不应提交到仓库(已在 .gitignore 中)。

配置(Env)
变量默认值含义
FAHRPLAN_AGENCY_IDS(空)用于计划时刻表导入的逗号分隔 GTFS Agency ID。为空 = 仅实时数据;GTFS 工具会返回配置提示
FAHRPLAN_DEFAULT_START(空)默认起点站(DHID、EFA-ID 或唯一名称——可通过 find_stop 获取匹配的 ID);可通过 get_default_start 查询
FAHRPLAN_OPERATOR(空)实时运营商筛选条件(例如 NIAG);为空 = 所有公司
FAHRPLAN_DB_PATH~/.local/share/rhein-ruhr-fahrplan-mcp/fahrplan.dbSQLite 数据库路径(Dockerfile:/data/fahrplan.db)
FAHRPLAN_MCP_TRANSPORTstdiostdio 或 http(Dockerfile 设置为 http)
FAHRPLAN_MCP_HOST / FAHRPLAN_MCP_PORT0.0.0.0:8080(Dockerfile)仅限 http 模式
FAHRPLAN_FEED_CHECK_INTERVAL21600(6 h)CKAN 检查;0 禁用自动更新

已验证的 EFA 特性(注意事项)

  • outputFormat=rapidJSON:响应键名为 stopEvents/journeys(而不是 departureList/trips)。
  • 站点名称可能有歧义 → 响应会包含 locations[] 建议项,且事件列表为空。因此:始终通过 DHID/ID 解析。
  • GTFS parent_station 中的 …_Parent 后缀不被 EFA 接受 → 使用不带后缀的 DHID。
  • 对于到站信息(itdTripDateTimeDepArr=arr),时间字段仍名为 departureTimePlanned/-Estimated。
  • EFA 返回的所有时间都带有 Z 后缀(UTC)——客户端会先将其转换为 Europe/Berlin 时间,再输出(此前工具错误地显示了 UTC,看起来像是忽略了 departure_time 参数;已在 v1.2.1 中修复)。
  • 延误按 UTC 时间差计算——不受时区影响,结果正确。
  • MS_REQUEST(消息端点)返回 HTTP 400 → 从 DM 响应内嵌的 infos[] 中提取服务中断信息。
  • calcNumberRequests 在 rapidJSON 中无法可靠工作 → plan_connection 返回的换乘方案可能多于 max_results(结果正确,仅数量限制较宽松)。

GTFS Feed 详情

  • CKAN 数据集:496eea5d-d6ef-4dc2-aeb0-d15c4fbf3178(“Soll-Fahrplandaten VRR”),API:https://opendata.ruhr/api/3/action/package_show?id=…
  • 资源 UUID 每月更换 → 导入时始终通过 CKAN API 获取最新 UUID。
  • 筛选条件:agency_id IN (FAHRPLAN_AGENCY_IDS);传递引用的行也会保留。
  • 整个 Feed 的 stop_times.txt(约 700 万行)采用流式处理(首个列表版本因内存不足被终止)。
  • 未筛选的整个 Feed 会生成约 500 MB 的数据库——因此有意不设为默认导入。

开发

git clone … && cd rhein-ruhr-fahrplan-mcp
uv venv && source .venv/bin/activate
uv pip install -e .
rhein-ruhr-fahrplan-mcp                   # stdio starten (Live-Only)
FAHRPLAN_AGENCY_IDS=nia-25 rhein-ruhr-fahrplan-mcp   # mit GTFS-Sollplan
python3 tests/stdio_e2e.py $(command -v rhein-ruhr-fahrplan-mcp)      # stdio-E2E
FAHRPLAN_AGENCY_IDS=nia-25 python3 tests/stdio_fullcycle.py $(command -v rhein-ruhr-fahrplan-mcp)  # inkl. Autoimport

发布:提升 pyproject.toml 中的版本号 → 提交 → git tag vX.Y.Z && git push origin vX.Y.Z——GitHub Action 会自动发布到 PyPI(Trusted Publishing)。

评论

支持 Markdown

第一次接触 MCP?

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

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