铁路数据服务

一个提供德国铁路和移动API统一访问的模型上下文协议(MCP)服务器,支持车站信息、时刻表、实时中断和停车数据。

  • by PaulvonBerg
  • Python
  • 本地部署
  • 22 星标
  • 更新于
在 GitHub 查看 PaulvonBerg/db-mcp-server

使用说明

德国铁路MCP服务器

一个全面的模型上下文协议(MCP)服务器,提供对德国联邦铁路(DB)和德国移动API的统一访问。使用Python、FastAPI和FastMCP构建,可与Claude Desktop和其他MCP客户端无缝集成。

服务器已准备好进行本地和云部署。通过将URL添加到MCP客户端,可以连接正在运行的MCP服务器: [SERVER DECOMISSIONED - HOST YOUR OWN DEPLOYMENT AS DESCRIBED].

🚀 特性

  • 🚄 完整的铁路数据:车站、时刻表、实时中断和停车
  • 🤖 MCP协议:完全支持工具、提示和资源
  • 🛡️ 生产就绪:安全标头、速率限制、输入验证
  • 🏗️ 模块化架构:干净、可维护的代码库结构
  • ☁️ 云原生:专为Google Cloud Run部署而设计
  • 📚 丰富的文档:综合指南和参考资料

📋 快速入门(面向开发人员-用户说明如下)

先决条件

本地开发

  1. 克隆和设置:

    git clone <repository-url>
    cd deutsche-bahn-mcp-server
    python3 -m venv .venv
    source .venv/bin/activate  # On Windows: .venv\Scripts\activate
    pip install -r requirements.txt
    
  2. 配置环境:

    cp .env.example .env
    

    接下来,编辑新 .env 使用您的DB API凭据文件。有关每个变量的详细信息,请参阅“配置”部分。

  3. 运行服务器:

    python main.py
    # Server available at http://localhost:8080
    

🎯 实时服务器使用指南

[服务器已解除任务-按所述托管您自己的部署]

🖥️ Claude桌面设置

步骤1:找到您的配置文件

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • 视窗: %APPDATA%\\Claude\\claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json

步骤2:编辑配置 打开文件并添加Deutsche Bahn服务器:

{
  "mcpServers": {
    "deutschebahn": {
      "command": "npx",
      "args": [
        "-y", "mcp-remote",
        "https://[SERVER DECOMISSIONED - Use your URL]/mcp",
        "--transport", "http-only"
      ]
    }
  }
}

步骤3:重新启动克劳德桌面

  • 完全关闭克劳德桌面
  • 重新打开应用程序
  • 您应该在MCP部分看到“德国联邦铁路MCP服务器”

步骤4:测试连接 问克劳德: “柏林有哪些火车站?”

🌐 Claude.ai网络使用

第一步:开始对话 首选 claude.ai 并开始新的对话。

步骤2:添加MCP服务器 点击 “搜索和工具>添加连接器>管理连接器” 选择 “添加自定义连接器” 输入名称,例如: 德国铁路MCP服务器 输入此远程MCP服务器URL:[服务器已解码-按所述托管您自己的部署]

第三步:立即测试 试着问: “查找法兰克福附近的火车站,并检查法兰克福中央火车站目前是否有任何延误。”

📱 快速示例尝试

连接后,尝试以下实际示例:

🔍 车站搜索

  • “查找慕尼黑的所有火车站”
  • “坐标52.5200、13.4050 5公里范围内有哪些站?”

🚄 实时信息

  • “柏林中央火车站现在有延误吗?”
  • “给我看看今天下午3点汉堡Hbf的出发时间表”

♿ 易达规划

  • “从慕尼黑到汉堡可以无障碍旅行吗?”
  • “科隆中央火车站提供哪些无障碍服务?”

🅿️ 停车信息

  • “明天上午10点法兰克福中央火车站有什么停车位?”
  • “查找杜塞尔多夫总站附近的停车设施”

🗺️ 旅行计划

  • “帮助我规划从柏林到德累斯顿的无障碍旅行”
  • “巴伐利亚州的主要铁路枢纽是什么?”

🔧 连接故障排除

Claude桌面问题:

问题:服务器未显示在MCP部分

  • 验证配置文件中的JSON语法(使用JSON验证器)
  • 确保Claude Desktop已完全重新启动
  • 检查文件是否保存在正确的位置

问题:连接超时

  • 验证互联网连接
  • 尝试: curl https://[SERVER DECOMISSIONED - HOST YOUR OWN DEPLOYMENT AS DESCRIBED]/mcp/ping 在终端
  • 如果curl失败,则可能存在网络限制

问题:“找不到命令”错误

  • 确保已安装Node.js和npm
  • 尝试跑步: npm install -g mcp-remote

Claude.ai网络问题:

问题:“无法连接到MCP服务器”

  • web版本可能需要明确的MCP服务器支持
  • 试着让克劳德一步一步地帮助你建立联系
  • 替代方案:使用特定的工具调用,如询问电台信息

一般问题:

服务器状态检查:

# Test if server is responding
curl https://[SERVER DECOMISSIONED - HOST YOUR OWN DEPLOYMENT AS DESCRIBED]/health

# Test MCP endpoint
curl https://[SERVER DECOMISSIONED - HOST YOUR OWN DEPLOYMENT AS DESCRIBED]/mcp/ping

速率限制:

  • 服务器允许60个请求/分钟,1000个/小时
  • 如果超过,请等待并重试
  • 考虑使用特定查询而不是广泛搜索

🛠️ 可用特征

🔧 工具(13个可用)

站数据

  • get_station_by_name(name, limit=10) -使用回退过滤按名称搜索电台
  • get_stations_by_position(lat, lon, radius=2.0) -使用智能区域过滤查找附近的电台

时间表和中断

  • get_planned_timetable(eva_number, date, hour) -预定出发/到达
  • get_recent_timetable_changes(eva_number) -实时更新(最后2分钟)
  • get_full_timetable_changes(eva_number) -所有已知的未来中断

停车信息

  • get_parking_by_station(stop_place_id) -车站附近的停车设施
  • search_parking_facilities(station_name) -使用真实的API按站名搜索停车
  • get_parking_prognoses(facility_id, datetime) -可用性预测

辅助性服务

  • find_facilities(station_number, type, state) -电梯、自动扶梯状态
  • get_facilities_by_station(station_number) -完整的设施概述
  • get_szentralen_by_location(lat, lon) -使用区域过滤的移动服务中心
  • search_szentralen(limit, offset) -带分页的服务中心搜索

💬 互动提示(7个可用)

  • accessibility_check -车站间无障碍通行验证
  • parking_prognosis -车站停车可用性预测
  • recent_timetable_changes -实时延迟和服务中断
  • planned_timetable_window -特定时间段的列车时刻表
  • station_services -完整的车站信息和设施
  • nearby_stations -查找地理坐标附近的火车站
  • current_disruptions -全面的服务中断概述

📚 参考资源(5个可用)

  • file://reference/station-categories -德国火车站分类指南
  • file://reference/train-types -德国列车类型(ICE、IC、RE等)的完整指南
  • file://stations/major-hubs -德国最重要的火车站列表
  • file://services/accessibility-guide -全面的无障碍功能指南
  • file://status/current-disruptions -全系统中断概述

🏗️ 建筑

├── main.py                    # FastAPI application entry point
├── server_instance.py         # Shared MCP server instance
├── mcp_server.py             # Server setup and module registration
├── utils.py                  # Shared utilities and validation
├── config.py                 # Configuration and secret management
├── models.py                 # Pydantic data models
├── rate_limiter.py           # Security: rate limiting
├── tools/                    # MCP Tools
│   ├── station_tools.py      # Station search and lookup
│   ├── timetable_tools.py    # Timetables and disruptions
│   ├── parking_tools.py      # Parking facilities
│   └── facility_tools.py     # Accessibility services
├── resources/                # MCP Resources
│   └── travel_resources.py   # Travel guides and references
└── prompts/                  # MCP Prompts
    └── travel_prompts.py      # Interactive travel assistance

🎯 智能地理过滤

服务器实现智能区域过滤,最大限度地提高API效率和结果相关性:

坐标到区域映射

  • 联邦州检测:德国联邦各州(拜仁、黑森等)的地图坐标
  • 边境地区处理:包括边境附近的邻国
  • 基于城市的过滤:使用相关州内的主要城市进行有针对性的搜索

增强车站搜索

  • 区域预过滤: get_stations_by_position() 从相关联邦州获取电台,而不是随机获取1000个
  • 回退机制: get_station_by_name() 将API搜索字符串与客户端回退一起使用
  • 距离计算:使用实际坐标精确计算哈维线距离

S-Zentralen区域滤波

  • 城市匹配:按坐标确定区域内的城市过滤S-Zentralen
  • 州到城市地图:联邦州到主要城市的综合地图
  • 相关结果:退回区域服务中心,而不是所有德国中心

🔒 安全功能

  • 速率限制:每分钟60个请求,每个客户端每小时1000个请求
  • 输入验证:全面的消毒和验证
  • 安全标头:XSS、CSRF、内容类型保护
  • 错误清理:不披露敏感信息
  • 仅限HTTPS:安全传输层
  • CORS保护:受控的跨来源访问

🚀 部署

Google Cloud Run(推荐)

按照以下步骤部署您自己的Deutsche Bahn MCP服务器实例:

先决条件

基本部署(默认云运行URL)

  1. 设置机密:

    # Create secrets for your DB API credentials
    echo "your_db_api_key" | gcloud secrets create DB_API_KEY --data-file=-
    echo "your_db_api_secret" | gcloud secrets create DB_API_SECRET --data-file=-
    
  2. 部署服务:

    # Clone the repository
    git clone https://github.com/your-repo/deutsche-bahn-mcp-server
    cd deutsche-bahn-mcp-server
    
    # Deploy to Cloud Run
    gcloud run deploy deutschebahn-mcp-server \\
      --source . \\
      --region europe-west3 \\
      --allow-unauthenticated \\
      --port 8080
    
  3. 授予秘密访问权限:

    # Get your service account email from the deployment output
    gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \\
      --member="serviceAccount:your-service-account@your-project.iam.gserviceaccount.com" \\
      --role="roles/secretmanager.secretAccessor"
    
  4. 使用您的MCP服务器: 您的服务器将在提供的Cloud Run URL上可用,例如: https://deutschebahn-mcp-server-123456789.region.run.app/mcp

自定义域部署(生产)

对于具有自定义域和增强安全性的生产使用:

  1. 按照上述基本部署步骤1-3进行操作

  2. 设置自定义域和负载平衡器 (参见 谷歌云负载均衡器文档)

  3. 使用自定义域重新部署:

    gcloud run deploy deutschebahn-mcp-server \\
      --source . \\
      --region europe-west3 \\
      --allow-unauthenticated \\
      --port 8080 \\
      --set-env-vars CUSTOM_DOMAIN=your-domain.com
    

Docker(本地开发)

# Build the image
docker build -t deutschebahn-mcp-server .

# Run locally with your API credentials
docker run -p 8080:8080 \\
  -e DB_API_KEY=your_db_api_key \\
  -e DB_API_SECRET=your_db_api_secret \\
  deutschebahn-mcp-server

# Server available at http://localhost:8080/mcp

安全考虑

  • 默认部署:使用Cloud Run的内置HTTPS,并允许从生成的URL进行访问
  • 自定义域名:仅限制对特定域的访问,阻止直接访问Cloud Run URL
  • API证书:始终存储在Google Secret Manager中,从不存储在环境变量或代码中
  • 速率限制:内置保护(60个需求/分钟,每个客户1000个需求/小时)

部署故障排除

密钥管理器访问问题:

# Verify secrets exist
gcloud secrets list

# Check service account permissions
gcloud projects get-iam-policy YOUR_PROJECT_ID \\
  --flatten="bindings[].members" \\
  --filter="bindings.members:*gserviceaccount.com"

连接问题:

# Test your deployed service
curl https://your-service-url/health

# Check logs
gcloud run logs read --service=deutschebahn-mcp-server --region=your-region

📖 使用示例

智能地理站点搜索

# Ask Claude: "Find train stations near Munich city center"
# Uses: get_stations_by_position(48.1351, 11.5820) 
# → Smart regional filtering returns relevant Bavarian stations

增强车站搜索

# Ask Claude: "Find train stations in Frankfurt"
# Uses: get_station_by_name("Frankfurt")
# → API searchstring parameter with intelligent fallback

区域服务中心

# Ask Claude: "Find mobility service centers near Berlin"
# Uses: get_szentralen_by_location(52.5200, 13.4050)
# → Returns Berlin/Brandenburg S-Zentralen using city filtering

实时中断

# Ask Claude: "Are there any delays at Berlin Hauptbahnhof?"
# Uses: recent_timetable_changes prompt

精确的停车搜索

# Ask Claude: "Find parking at Frankfurt Hauptbahnhof"
# Uses: search_parking_facilities("Frankfurt Hauptbahnhof")
# → Uses real API stationName parameter for accurate results

🧪 发展

运行测试

# Install development dependencies
pip install -r requirements-dev.txt

# Run tests
pytest tests/

# Run with coverage
pytest --cov=. tests/

代码质量

# Format code
black .

# Lint code
flake8 .

# Type checking
mypy .

MCP检查员进行本地测试

# Install MCP Inspector
npm install -g @modelcontextprotocol/inspector

# Inspect local server
mcp-inspector http://localhost:8080/mcp

🤝 贡献

我们欢迎社区的贡献!请查看我们的 贡献.md 详细信息指南。

贡献者快速入门

  1. 克隆该仓库
  2. 创建要素分支: git checkout -b feature-name
  3. 通过测试进行更改
  4. 遵循我们的开发指南
  5. 提交拉取请求

归因请求

如果您在自己的项目中使用此作品、代码或概念,请提供适当的归因:

Based on Deutsche Bahn MCP Server by Paul von Berg
https://github.com/PaulvonBerg/db-mcp-server

非常感谢。

⚙️ 配置

服务器是通过环境变量配置的。为了地方发展,创建一个 .env 通过复制根目录中的文件 .env.example 模板。对于云部署,这些值是通过Google Secret Manager或直接在服务上设置的。

看 .env.example 为避免混淆,请在文件中注明哪个凭证的去向。

环境变量

变量 描述 来源/注释
DB_API_KEY 您的德国铁路API 客户端ID 必需.设置 .env (本地)或 DB_API_KEY 秘密(云)。
DB_API_SECRET 您的德国铁路API 密钥(秘密) 必需.设置 .env (本地)或 DB_API_SECRET 秘密(云)。
GCP_PROJECT_ID 您的Google Cloud项目ID 云部署所需。如果未设置,则自动检测。
CUSTOM_DOMAIN 已部署服务的自定义域 可选。增强云部署的安全性。
CLOUD_RUN_URL Cloud Run服务的后端URL 可选。在Cloud Run中自动检测到,仅在需要时覆盖。
LOG_LEVEL 日志记录级别(调试、信息、警告、错误) 可选。默认为 INFO.
PORT 服务器监听的端口 可选。默认为 8080.

📚 api参考

使用的德国联邦铁路API

  • StaDa API v2:站点主数据
  • 时间表API v1:时间表和中断数据
  • 停车信息API v2:DB Bahnpark设施
  • FaSta API v2:设施状态(电梯、自动扶梯)

🐛 故障排除

常见问题

API身份验证错误

  • 验证您的DB API凭据是否正确
  • 检查API密钥权限和配额

连接问题

  • 确保服务器在正确的端口上运行
  • 验证防火墙设置是否允许连接
  • 检查Cloud Run服务权限

MCP客户端连接

  • 验证MCP客户端配置语法
  • 检查服务器URL可访问性
  • 确保正确的传输模式(仅限http)

调试

启用调试日志记录:

export LOG_LEVEL=DEBUG
python main.py

📄 许可证

该项目根据 知识共享署名4.0国际许可(CC BY 4.0) -看看 许可证 文件以获取详细信息。

归因要求

使用此软件或数据时,您必须向以下人员提供适当的信用:

  • 德国 铁路 公司 用于底层API和铁路数据(CC BY 4.0)
  • 贡献者 此MCP服务器实现

德国铁路API合规性

该软件根据不同的许可条款访问德国联邦铁路公司的公共API:

  • 大多数API:CC BY 4.0(车站数据、时刻表、无障碍服务)
  • 停车API“德国数据许可证 – 命名 – 版本 2.0” (dl-de/by-2-0)

重要:停车信息数据有其他限制:

  • 内容修改是 不允许
  • 允许技术格式更改
  • 需要具体归因:“停车信息 DB BahnPark API 数据通过 DB API Marketplace”

用户必须遵守德国铁路API的服务条款 developers.deutschebahn.com.

备注:此软件与德国联邦铁路公司没有正式关联。

⚠️ 服务免责声明

对于位于`[server DECOMISIONED-按所述托管您自己的部署]的实时服务器的用户:

这是一个 社区提供的服务 独立主持。请注意:

  • 无正常运行时间保证 -服务可能不可用,恕不另行通知
  • 适用费率限制 -60个请求/分钟,每个客户端1000个/小时
  • 数据准确性 -信息按原样从德国联邦铁路API提供
  • 无责任 -仅供参考,风险自负
  • 服务监控 -出于操作目的,可能会记录使用情况
  • 遵守条款 -用户必须遵守德国铁路API条款

用于生产用途,考虑使用上面的部署说明托管自己的实例。

托管服务提供商:此服务由独立开发商提供,与德国联邦铁路公司无关

🙏 致谢

  • 德国联邦铁路公司提供公共API
  • 模型上下文协议的拟人化
  • Python MCP实现的FastMCP库

实时服务器:[服务器已解除任务-按所述托管您自己的部署]