DB时间表API MCPServer
 ](https://github.com/abeckDev/DB-TimetableAPI-MCPServer/actions/workflows/docker-publish.yml)  
用于德国铁路API时间表集成的模型上下文协议(MCP)服务器
MCP服务器,将人工智能代理与德国铁路API时间表连接起来,通过标准化协议无缝访问德国铁路时刻表数据、实时更新和车站信息。
______________________________________________________________________
🎯 概述
这 DB时间表API MCPServer 是模型上下文协议(MCP)服务器的开源实现,与 德国铁路API时间表该项目作为中间件,获取、处理德国铁路时刻表数据,并将其提供给下游人工智能代理和客户端应用程序。
项目范围
此存储库侧重 专门 关于MCP服务器的实现。它不包括:
- 时间表代理或客户端应用程序
- 面向用户的界面(移动应用程序、网站)
- MCP服务器本身之外的后端服务
MCP服务器充当标准化的桥梁,允许AI代理通过统一的协议与德国联邦铁路的时刻表数据进行交互。
______________________________________________________________________
🏗️ 建筑
下图说明了DB TimetableAPI MCPServer如何融入整体解决方案:
flowchart LR
subgraph API["DB Timetable API"]
DB[("Deutsche Bahn
Timetable API")]
end
subgraph Server["Timetable MCP Server
(This Repository)"]
MCP["MCP Server
Implementation"]
Tools["Offer Timetable
MCP Tools"]
MCP --> Tools
end
subgraph Agent["Timetable Agent
(Not in Scope)"]
TA["Timetable Agent
Orchestrator"]
end
subgraph Clients["Client Applications
(Not in Scope)"]
Mobile["📱 Mobile Apps"]
Web["🌐 Websites"]
Phone["📞 Phone"]
end
DB -->|"API Auth"| MCP
MCP -->|"Timetable Data"| Tools
Tools -->|"Expose MCP Tools"| TA
Mobile --> TA
Web --> TA
Phone --> TA
style Server fill:#e1f5ff,stroke:#0288d1,stroke-width:3px
style API fill:#f5f5f5,stroke:#666,stroke-width:2px
style Agent fill:#fff3e0,stroke:#ff9800,stroke-width:2px
style Clients fill:#fff3e0,stroke:#ff9800,stroke-width:2px组件流程
- DB时间表API
- 德国铁路API的官方时间表 - 需要API身份验证 - 提供时刻表和实时列车数据
- 时间表MCP服务器 - 此存储库
- 使用DB API进行身份验证 - 获取和处理时间表数据 - 为代理提供标准化的MCP工具 - 实现模型上下文协议规范
- 时间表代理 (不在范围内)
- 使用此服务器上的MCP工具 - 协调请求和响应 - 与客户端应用程序的接口
- 客户端应用程序 (不在范围内)
- 移动应用程序、网站、语音助手等。 - 时刻表信息的最终用户界面
此存储库仅实现MCP服务器组件。
______________________________________________________________________
🤖 什么是模型上下文协议(MCP)?
这 模型上下文协议(MCP) 是Anthropic开发的一个开放标准,简化了AI代理与外部系统、工具和数据源的连接方式。将其视为“用于AI的USB-C”-一种通用连接器,消除了定制集成的需要。
关键概念
- MCP主机:AI代理所在的环境(例如聊天机器人界面、IDE)
- MCP客户端:将用户请求转换为MCP兼容消息的网桥
- MCP服务器:执行操作和获取数据的后端服务(如本项目)
为什么选择MCP?
- 标准化:一种将AI代理与任何数据源连接的协议
- 模块化:跨不同AI应用程序工作的可重用服务器组件
- 实时上下文:使AI代理能够访问其训练集之外的实时数据
- 可扩展性:随着人工智能生态系统的发展,降低集成复杂性
有关更多信息,请访问 MCP官方文件.
______________________________________________________________________
✨ 特性
DB TimetableAPI MCPServer计划提供以下功能:
核心功能
- ✅ 计划时间表访问:检索任何DB车站的预定到达和离开时间
- ✅ 实时更新:访问实时延迟信息、取消和平台更改
- ✅ 车站搜索:查找车站并检索详细的设施信息
- ✅ 标准化MCP接口:通过MCP协议公开德国铁路数据
数据能力
- 列车时刻表(IC、ICE、RE、区域列车)
- 平台信息
- 延迟状态和取消通知
- 路线变更和服务中断
- 车站元数据和设施
- 历史和实时数据访问
______________________________________________________________________
📦 先决条件
在设置MCP服务器之前,请确保您拥有以下内容:
系统要求
- .NET 9.0 SDK 或以后
- 下载自 dotnet.microsoft.com - 验证安装: dotnet --version
- Node.js (推荐LTS版本)
- MCP Inspector调试工具所需 - 下载自 - 验证安装: node --version 和 npm --version
- Git 用于版本控制
- Visual Studio Code (建议用于devcontainer支持)
- 安装 开发容器扩展 用于devcontainer支持
数据库API访问
您必须从德国铁路公司获得API证书:
- 访问 DB API市场
- 创建开发人员帐户
- 订阅 API时间表
- 生成API密钥
- 查看API服务条款和使用限制
备注:时间表API使用知识共享归因4.0(CC BY 4.0)许可证。确保您的用例符合这些条款。
______________________________________________________________________
🚀 安装
克隆存储库
git clone https://github.com/abeckDev/DB-TimetableAPI-MCPServer.git
cd DB-TimetableAPI-MCPServer还原NuGet包
dotnet restore构建项目
dotnet build该项目应成功建成。如果你遇到任何问题,请确保你有。NET 9.0 SDK已安装。
使用Docker(推荐用于生产环境)
运行MCP服务器最简单的方法是使用Docker。预构建的映像会自动发布到GitHub容器注册表。
拉取并运行最新图像
# Pull the latest image from GitHub Container Registry
docker pull ghcr.io/abeckdev/db-timetableapi-mcpserver:latest
# Run the container with your API credentials
docker run -d \
--name db-timetable-mcp \
-p 3001:3001 \
-e DeutscheBahnApi__ClientId="your-actual-client-id" \
-e DeutscheBahnApi__ApiKey="your-actual-api-key" \
-e DeutscheBahnApi__BaseUrl="https://apis.deutschebahn.com/db-api-marketplace/apis/timetables/v1/" \
ghcr.io/abeckdev/db-timetableapi-mcpserver:latest
# Check if the container is running
docker ps
# View logs
docker logs db-timetable-mcpMCP服务器可在以下网址访问 http://localhost:3001/mcp.
构建自己的Docker镜像
如果你更喜欢在本地构建Docker镜像:
# Build the image
docker build -t db-timetableapi-mcpserver:local .
# Run the container
docker run -d \
--name db-timetable-mcp \
-p 3001:3001 \
-e DeutscheBahnApi__ClientId="your-actual-client-id" \
-e DeutscheBahnApi__ApiKey="your-actual-api-key" \
-e DeutscheBahnApi__BaseUrl="https://apis.deutschebahn.com/db-api-marketplace/apis/timetables/v1/" \
db-timetableapi-mcpserver:localDocker Compose
您还可以使用Docker Compose来简化管理。创建一个 docker-compose.yml 文件:
services:
mcp-server:
image: ghcr.io/abeckdev/db-timetableapi-mcpserver:latest
container_name: db-timetable-mcp
ports:
- "3001:3001"
environment:
- DeutscheBahnApi__ClientId=your-actual-client-id
- DeutscheBahnApi__ApiKey=your-actual-api-key
- DeutscheBahnApi__BaseUrl=https://apis.deutschebahn.com/db-api-marketplace/apis/timetables/v1/
restart: unless-stopped然后运行:
docker compose up -dDocker镜像标签
为了提高灵活性,图像标记了多个标识符:
latest-主分支的最新构建main-与最新版本相同,跟踪主分支main--来自主分支的特定提交SHA(例如。,main-abc1234)
拉取特定版本的示例:
docker pull ghcr.io/abeckdev/db-timetableapi-mcpserver:main-a1b2c3d______________________________________________________________________
⚙️ 配置
设置API凭据
MCP服务器需要德国铁路API凭证才能运行。您可以通过两种方式进行配置:
选项1:使用应用程序设置。developer.json(推荐用于本地开发)
- 导航到项目目录:
cd AbeckDev.DbTimetable.Mcp- 创建或编辑
appsettings.Development.json:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"DeutscheBahnApi": {
"BaseUrl": "https://apis.deutschebahn.com/db-api-marketplace/apis/timetables/v1/",
"ClientId": "your-actual-client-id",
"ApiKey": "your-actual-api-key"
}
}⚠️ 备注:The appsettings.Development.json 文件已在 .gitignore 以防止意外提交您的凭据。
选项2:使用环境变量
您还可以使用环境变量配置服务器:
export DeutscheBahnApi__ClientId="your-actual-client-id"
export DeutscheBahnApi__ApiKey="your-actual-api-key"
export DeutscheBahnApi__BaseUrl="https://apis.deutschebahn.com/db-api-marketplace/apis/timetables/v1/"对于Windows PowerShell:
$env:DeutscheBahnApi__ClientId="your-actual-client-id"
$env:DeutscheBahnApi__ApiKey="your-actual-api-key"
$env:DeutscheBahnApi__BaseUrl="https://apis.deutschebahn.com/db-api-marketplace/apis/timetables/v1/"配置选项
以下配置选项在 DeutscheBahnApi 章节:
| 选项 | 说明 | 必填 | 默认 |
|---|---|---|---|
BaseUrl | 德国铁路API时间表的基本URL | 是 | https://apis.deutschebahn.com/db-api-marketplace/apis/timetables/v1/ |
ClientId | 来自市场的DB API客户端ID | 是 | - |
ApiKey | 您的数据库API密钥来自市场 | 是 | - |
API费率限制
请注意德国铁路API费率限制:
- 公共端点:每秒最多60个请求
- 经过身份验证的端点:因订阅层而异
在部署中配置适当的缓存和请求限制。
______________________________________________________________________
🎮 用法
启动MCP服务器
本地运行(命令行)
- 导航到项目目录:
cd AbeckDev.DbTimetable.Mcp- 运行服务器:
dotnet run- 服务器将启动并监听
http://0.0.0.0:3001
- MCP端点位于: http://localhost:3001/mcp
- 您应该看到类似于以下内容的输出:
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://0.0.0.0:3001
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.使用VS代码任务
该项目包括预配置的VS Code任务,以便于开发:
- 在VS Code中打开项目
- 按
Ctrl+Shift+B(或Cmd+Shift+B在macOS上)运行默认构建任务 - 使用
Terminal > Run Task...访问其他任务:
- build-solution:构建整个解决方案 - run-mcp-server:运行MCP服务器 - build-and-run-server:按顺序构建和运行服务器
调试MCP服务器
MCP服务器可以使用 MCP检查员,模型上下文协议服务器的可视化调试工具。
使用VS代码进行调试(推荐)
存储库包括一个预配置的调试启动配置:
- 安装MCP检查器 (如果尚未安装):
npm install -g @modelcontextprotocol/inspector- 配置API凭据 在
appsettings.Development.json如配置部分所述
- 在VS Code中打开项目
- 启动调试:
- 按 F5 或前往 Run > Start Debugging - 选择“使用检查器(HTTP)调试MCP服务器”配置 - 这将: - 构建解决方案 - 在端口3001上启动MCP服务器 - 在端口6274上启动MCP检查器 - 在浏览器中自动打开检查器UI
- 使用MCP检查器:
- Inspector提供了一个基于web的界面,用于与您的MCP服务器进行交互 - 测试可用工具(GetStationBoard、GetStationChanges等) - 实时查看请求和响应 - 调试MCP实现的问题
手动调试设置
如果您希望单独运行组件:
- 启动MCP服务器 在一个终端中:
cd AbeckDev.DbTimetable.Mcp
dotnet run- 启动MCP检查器 在另一个终端中:
npx @modelcontextprotocol/inspector --transport http --server-url http://localhost:3001/mcp- 打开检查器 在浏览器中:
- 检查器将输出一个URL,如下所示: http://localhost:6274 - 在浏览器中打开此URL以访问调试界面
测试服务器
服务器运行后,您可以使用MCP检查器对其进行测试:
- 列出可用工具:
- 在MCP检查器中,单击“列出工具”以查看所有可用的MCP工具 - 您应该看到: get_station_board, get_recent_station_changes, get_full_station_changes, get_station_information, find_train_connections
- 测试get_station_information:
- 选择 get_station_information 工具 - 输入车站名称,如“法兰克福”或“柏林” - 点击“调用工具”执行 - 查看带有站点信息的XML响应
- 测试get_station_board:
- 选择 get_station_board 工具 - 输入EVA站编号(例如。, 8000105 法兰克福中央火车站) - 可选地以格式提供日期/时间 yyyy-MM-dd HH:mm - 点击“呼叫工具”查看到达和离开
与AI代理集成
要将此MCP服务器与AI代理或客户端应用程序集成:
- 连接到MCP端点:
http://localhost:3001/mcp - 使用HTTP传输 如本实现中配置的
- 可用工具:
- get_station_board:检索车站的出发和到达情况。 - get_recent_station_changes:获取最近的更改(延迟、取消)。 - get_full_station_changes:获取一个车站的所有时刻表更改。 - get_station_information:搜索电台信息。 - find_train_connections:查找并评估具有延误信息的两个车站之间的列车连接。
对于生产部署,请考虑:
- 使用带有正确SSL证书的HTTPS
- 实施速率限制和缓存
- 添加身份验证/授权
- 在反向代理后部署
______________________________________________________________________
🐳 使用DevContainers进行开发
该项目包括VS Code的完整DevContainer配置,提供了一个预先安装了所有必需工具的一致开发环境。
什么是DevContainer?
DevContainers(开发容器)允许您将Docker容器用作功能齐全的开发环境。这确保了:
- 所有团队成员的一致开发环境
- 无需安装。NET、Node.js或其他本地工具
- 不影响本地系统的隔离环境
- 预先配置了所有必要的扩展和工具
DevContainers的先决条件
- Docker 桌面版 已安装并正在运行
- Windows/macOS - Linux
- Visual Studio Code 随着 开发容器扩展
- 从以下位置安装: 开发容器扩展
在DevContainer中打开项目
- 克隆存储库 (如果你还没有):
git clone https://github.com/abeckDev/DB-TimetableAPI-MCPServer.git
cd DB-TimetableAPI-MCPServer- 在VS代码中打开:
code .- 在容器中重新打开:
- VS Code应检测 .devcontainer 配置 - 将出现一条通知:“文件夹包含开发容器配置文件” - 点击 “在容器中重新打开” - 或者,按 F1 并选择 “开发容器:在容器中重新打开”
- 等待容器构建:
- 第一次构建容器需要几分钟的时间 - 集装箱包括: - .NET 9.0 SDK - Node.js LTS - Azure命令行界面 - MCP检查器(自动安装) - 所有必要的VS代码扩展
- 开始开发:
- 容器准备就绪后,您可以立即开始编码 - VS Code中的所有终端都将在容器内运行 - 项目将自动恢复并准备构建
DevContainer功能
DevContainer配置了:
- 基本图像:
mcr.microsoft.com/devcontainers/dotnet:1-9.0-bookworm - 已安装的工具:
- .NET 9.0 SDK - Node.js LTS - Azure命令行界面 - MCP检查器(通过npm)
- VS代码扩展:
- C#开发工具包 - C#扩展 - Azure CLI扩展 - GitHub Copilot(如果可用) - GitHub操作扩展 - VS Code 图标
- 端口转发:
- 端口3001:MCP服务器 - 端口6274:MCP检查员 - 端口6277:MCP检查器代理
在DevContainer中配置API凭据
在DevContainer中打开项目后:
- 创建
AbeckDev.DbTimetable.Mcp/appsettings.Development.json使用您的凭据:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"DeutscheBahnApi": {
"BaseUrl": "https://apis.deutschebahn.com/db-api-marketplace/apis/timetables/v1/",
"ClientId": "your-actual-client-id",
"ApiKey": "your-actual-api-key"
}
}- 开始调试
F5如调试部分所述
使用DevContainers的好处
✅ 一致性:团队中的每个人都使用完全相同的开发环境 ✅ 快速设置:新的贡献者可以在几分钟内开始编码 ✅ 隔离:开发环境不会干扰您的本地系统 ✅ 预配置:所有工具、扩展和设置都已准备好使用 ✅ 可重复性:环境可以与代码一起进行版本控制
______________________________________________________________________
🔧 MCP工具和功能
服务器公开了以下MCP工具,供人工智能代理与德国铁路API时间表交互:
1.GetStationBoard
描述:获取特定车站的站牌(出发和到达)。
参数:
evaNo(必填):EVA站号(例如。,8000105法兰克福中央火车站)dateTime(可选):日期和时间格式yyyy-MM-dd HH:mm(UTC)。将当前时间留空。
退货:包含列车时刻表的XML数据,包括:
- 列车编号和类别(ICE、IC、RE等)
- 出发/到达时间
- 平台
- 目的地/出发地
- 列车路径
示例:
{
"evaNo": "8000105",
"dateTime": "2025-11-05 18:30"
}2.GetRecentStation更改
描述:获取特定车站的所有当前更改(延迟、取消、站台更改)。数据仅包括过去2分钟内已知的变化。
参数:
evaNo(必填):EVA站号
退货:最近更改的XML数据,包括:
- 延误
- 取消
- 平台变更
- 其他实时更新
示例:
{
"evaNo": "8000105"
}3.GetFullStation更改
描述:获取特定火车站的完整时刻表更改。这些数据包括从现在到无限期未来的所有已知变化。一旦更改过时(因为它们的行程离开车站),它们就会被删除。
参数:
eventNo(必填):列车事件的事件编号(EVA编号)
退货:具有事件全面变更历史的XML数据
示例:
{
"eventNo": "1234567890"
}4.GetStation信息
描述:获取车站信息。
参数:
pattern(必填):站名(前缀)、EVA编号、DS100/RL100代码或通配符(*).
- 注意:在电台名称中使用变音效果不佳 - 示例: "Frankfurt", "8000105", "*"
退货:带有站点信息的XML数据,包括:
- 车站名称
- EVA编号
- 位置坐标
- 可用设施
- 车站代码
示例:
{
"pattern": "Frankfurt"
}5.查找列车连接
描述:查找并评估两个车站之间的列车连接。该综合工具可验证车站名称,查找车站之间运行的所有列车,检查当前的延误和中断情况,并提供排名的连接选项和建议。
参数:
stationA(必填):起始站名称或EVA编号(例如。,"Frankfurt Hbf"或"8000105")stationB(必填):目的站名称或EVA编号(例如。,"Berlin Hbf"或"8011160")dateTime(可选):日期和时间格式yyyy-MM-dd HH:mm(UTC)。将当前时间留空。
退货:一份综合分析报告,包括:
- 使用EVA编号验证的电台名称
- 可用列车连接列表
- 出发时间(计划和实际)
- 平台信息
- 当前延迟和延迟持续时间
- 取消状态
- 服务信息和中断
- 最佳连接建议
示例:
{
"stationA": "Frankfurt Hbf",
"stationB": "Berlin Hbf",
"dateTime": "2025-11-06 14:30"
}示例输出:
=== Train Connection Analysis ===
Step 1: Resolving station 'Frankfurt Hbf'...
✓ Found: Frankfurt(Main)Hbf (EVA: 8000105)
Step 2: Resolving station 'Berlin Hbf'...
✓ Found: Berlin Hbf (EVA: 8011160)
Step 3: Fetching departures from Frankfurt(Main)Hbf...
✓ Timetable retrieved
Step 4: Checking for delays and disruptions at Frankfurt(Main)Hbf...
✓ Recent changes retrieved
Step 5: Finding trains from Frankfurt(Main)Hbf to Berlin Hbf...
✓ Found 3 connection(s)
=== Available Connections ===
Option 1: ICE 1234
Departure: 14:30 from Frankfurt(Main)Hbf
Platform: 7
✓ On time
Destination: Berlin Hbf
Option 2: ICE 5678
Departure: 15:30 from Frankfurt(Main)Hbf
Platform: 9
⚠ Originally scheduled: 15:25
⚠ Delay: +5 minutes
Destination: Berlin Hbf
=== Recommendation ===
✓ Best option: ICE 1234 at 14:30 - On time通用EVA站编号
以下是一些常用的EVA测试站编号:
| 车站 | EVA编号 |
|---|---|
| 法兰克福中央火车站 | 8000105 |
| 柏林中央火车站 | 8011160 |
| 慕尼黑中央火车站 | 8000261 |
汉堡中央火车站 8002549 | 科隆中央火车站 | 8000207 | 德累斯顿中央火车站 8010085
您可以使用 GetStationInformation 具有站名模式的工具。
______________________________________________________________________
🧪 测试
在本地运行测试
该项目包括具有代码覆盖率跟踪的全面单元测试。
运行所有测试
# Navigate to the project directory
cd DB-TimetableAPI-MCPServer
# Run all tests
dotnet test使用代码覆盖率运行测试
# Run tests and collect coverage data
dotnet test --collect:"XPlat Code Coverage" --results-directory ./TestResults
# Generate HTML coverage report (requires reportgenerator tool)
dotnet tool install --global dotnet-reportgenerator-globaltool
reportgenerator -reports:"TestResults/**/coverage.cobertura.xml" -targetdir:"TestResults/CoverageReport" -reporttypes:"Html;TextSummary"
# View coverage summary
cat TestResults/CoverageReport/Summary.txt
# Open HTML report in browser
# The report will be at: TestResults/CoverageReport/index.html测试结构
测试项目(AbeckDev.DbTimetable.Mcp.Test)包括:
- ConfigurationTests.cs:配置模型验证测试
- TimeTableServiceTests.cs:API服务层测试,使用模拟HTTP响应
- 时间表工具测试cs:MCP刀具包装器的错误处理测试
覆盖目标
- 当前覆盖范围:78.3%的线路覆盖率
- 目标:70%以上的线路覆盖率(在CI/CD中强制执行)
- 核心业务逻辑:100%覆盖(服务、工具、型号)
贡献者测试指南
在贡献代码时,请:
- 编写测试:为任何新功能添加单元测试
- 模拟外部依赖关系:使用Moq模拟HTTP客户端和外部服务
- 测试错误场景:包括成功和失败案例的测试
- 保持覆盖范围:确保您的更改不会使总体覆盖率降至70%以下
- 在本地运行测试:在提交PR之前,验证所有测试是否通过
示例测试模式:
[Fact]
public async Task MethodName_WithCondition_ExpectedBehavior()
{
// Arrange
var mockService = new Mock();
mockService.Setup(s => s.MethodAsync(...)).ReturnsAsync(...);
// Act
var result = await service.MethodAsync(...);
// Assert
Assert.Equal(expectedValue, result);
}持续集成
所有pull请求都会自动运行:
- ✅ 构建验证
- ✅ 所有单元测试
- ✅ 代码覆盖率分析
- ✅ 覆盖阈值检查(最低70%)
- ✅ Docker镜像构建验证
覆盖率报告可作为工作流工件提供。
持续部署
当更改被推送到 main 分支:
- ✅ Docker镜像是自动构建的
- ✅ 图像标记有多个标识符(最新、主要、提交SHA)
- ✅ 图片发布到GitHub容器注册表(ghcr.io)
- ✅ 图片可在以下网址公开访问
ghcr.io/abeckdev/db-timetableapi-mcpserver
Docker镜像包括:
- 多阶段构建,优化尺寸
- Debian Bookworm上的.NET 9.0运行时环境(精简版本)
- 非root用户,增强安全性
- 健康检查端点
- 适当的端口暴露(3001)
______________________________________________________________________
🤝 贡献
我们欢迎社区的贡献!
请随时打开问题或提供PR。
______________________________________________________________________
📄 许可证
该项目根据 MIT许可证 -看看 许可证 文件以获取详细信息。
第三方许可证
- 德国铁路API时间表:根据知识共享署名4.0(CC BY 4.0)许可
- 模型上下文协议:Anthropic的开放标准
使用此软件时,请确保遵守所有适用的许可证和服务条款。
______________________________________________________________________
📚 资源
官方文件
相关项目
______________________________________________________________________
🙏 致谢
- 德国铁路 用于提供API时间表
- Anthropic 用于开发模型上下文协议
