
这是一个模型上下文协议(MCP)服务器,承诺告诉您下一班Caltrain的确切到达时间……然后仍然会晚到10分钟。使用真实的GTFS数据,所以至少失望是官方的!
安装依赖项(即“更多可以出错的东西”):
# 如果还没有安装uv(因为pip现在被认为太主流了)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 使用uv安装依赖项(希望它真的能工作)
uv sync
获取那甜美的GTFS数据:
服务器期望在src/caltrain_mcp/data/caltrain-ca-us/目录中找到Caltrain的GTFS数据。因为显然我们不能礼貌地问火车它们在哪里。
uv run python scripts/fetch_gtfs.py
这个神奇的脚本下载包含以下文件:
stops.txt - 所有火车假装停靠的地方trips.txt - 穿越时空的理论旅程stop_times.txt - 火车应该到达的时间(剧透:它们不会)calendar.txt - 工作日与周末时刻表(因为火车也需要工作生活平衡)此服务器设计用于与MCP客户端如Claude Desktop配合使用,而不是由人类直接运行(因为那样太简单了)。这是如何真正使用它的方法:
在您的Claude Desktop MCP配置文件中添加以下内容:
{
"mcpServers": {
"caltrain": {
"command": "uvx",
"args": ["caltrain-mcp"]
}
}
}
这将自动从PyPI安装并运行最新版本。
然后重启Claude Desktop,您就可以直接在对话中访问Caltrain时刻表了!
任何兼容MCP的客户端都可以通过启动以下命令来使用此服务器:
uvx caltrain-mcp
服务器通过标准输入/输出使用MCP协议进行通信。直接运行时它不会做任何令人兴奋的事情——它只是在那里等待正确的MCP消息。
您可以直接导入它来测试是否有效:
from caltrain_mcp.server import next_trains, list_stations
# 测试下一班火车的功能(准备好失望吧)
result = await next_trains('San Jose Diridon', 'San Francisco')
print(result) # 剧透:没有火车
# 测试车站列表(全部31个,因为显然这可以管理)
stations = await list_stations()
print(stations)
next_trains(origin, destination, when_iso=None)礼貌地询问下一班火车何时到来。服务器会咨询它的水晶球(GTFS数据)并给出理论上准确的时间。
参数:
origin (str): 您当前的位置(可能正在后悔人生选择)destination (str): 您想去的地方(可能是任何地方但这里)when_iso (str, 可选): 您想旅行的时间(好像在公共交通中时间有任何意义)示例:
# 当前时间的下一班火车(即“现在就好”)
next_trains('San Jose Diridon', 'San Francisco')
# 在特定时间的火车(对于认为时刻表重要的乐观主义者)
next_trains('Palo Alto', 'sf', '2025-05-23T06:00:00')
# 使用缩写(因为打字很辛苦)
next_trains('diridon', 'sf')
list_stations()获取所有31个Caltrain车站的列表,因为显然要求记住它们太多了。
返回值: 一个格式化的列表,让您意识到这趟火车据说要去多少地方。
服务器支持多种懒惰输入车站名称的方式:
服务器覆盖每一个Caltrain车站,因为我们是完美主义者:
从旧金山到圣何塞(主要事件):
从圣何塞到吉尔罗伊(“这存在有什么意义?”扩展):
🚆 下一班Caltrain从圣何塞迪里东站到旧金山Caltrain站,2025年5月22日星期四:
• 列车153: 17:58:00 → 19:16:00(前往旧金山)
• 列车527: 18:22:00 → 19:22:00(前往旧金山)
• 列车155: 18:28:00 → 19:46:00(前往旧金山)
• 列车429: 18:43:00 → 19:53:00(前往旧金山)
• 列车157: 18:58:00 → 20:16:00(前往旧金山)
实际到达时间可能会有所不同。副作用可能包括存在焦虑和对远程工作的深刻欣赏。
caltrain-mcp/
├── .github/workflows/ # GitHub Actions(CI/CD的主宰)
│ ├── ci.yml # 主CI流水线(代码检查、测试等)
│ └── update-gtfs.yml # 自动化GTFS数据更新
├── src/caltrain_mcp/ # 主包(因为现代Python需要结构)
│ ├── data/caltrain-ca-us/ # GTFS数据存储(CSV文件退休的地方)
│ ├── __init__.py # 包初始化(Python的仪式)
│ ├── __main__.py # 使用python -m caltrain_mcp的入口点
│ ├── server.py # MCP服务器实现(魔法发生的地方)
│ └── gtfs.py # GTFS数据处理(即“CSV摔跤”)
├── scripts/ # 实用脚本(辅助角色)
│ ├── __init__.py # 使脚本成为正式的Python包
│ ├── fetch_gtfs.py # 下载最新的失望数据
│ └── lint.py # 在本地运行所有CI检查(避免尴尬)
├── tests/ # 测试套件(因为信任但要验证)
│ ├── conftest.py # 共享测试夹具(共同基础)
│ ├── test_gtfs.py # GTFS功能测试(8个数据处理测试)
│ ├── test_server.py # 服务器功能测试(4个MCP协议测试)
│ └── test_fetch_gtfs.py # 数据获取测试(7个下载混乱测试)
├── .pre-commit-config.yaml # 预提交钩子配置
├── pyproject.toml # 现代Python配置(因为setup.py太2020了)
└── README.md # 这篇文学杰作
此项目使用现代Python工具保持代码整洁和可维护:
此项目使用自动化版本控制和发布:
main时,semantic-release会自动创建版本标签只需使用常规提交格式提交并推送到main:
# 对于bug修复(小版本升级:1.0.0 → 1.0.1)
git commit -m "fix: 正确车站名称查找错误"
# 对于新特性(次版本升级:1.0.0 → 1.1.0)
git commit -m "feat: 添加周末时刻表支持"
# 对于重大变更(主版本升级:1.0.0 → 2.0.0)
git commit -m "feat!: 重新设计API结构"
# 或
git commit -m "feat: 重大API更改
BREAKING CHANGE: 这改变了函数签名"
semantic-release工作流程将:
v1.2.3)在推送之前测试构建过程:
# 本地构建包
uv run python -m build --sdist --wheel
# 验证包
uv run twine check dist/*
# 测试上传到Test PyPI(可选)
uv run twine upload --repository testpypi dist/*
每个PR和推送到main都会触发自动检查:
如果任何检查失败,CI会礼貌地拒绝您的PR,因为标准很重要。
此服务器实现了模型上下文协议(MCP),这意味着它可以无缝地与AI助手和其他MCP客户端配合使用。一旦配置好:
服务器暴露了两个主要工具:
next_trains - 获取车站之间的即将发车时间list_stations - 浏览所有可用的Caltrain车站因此,您的AI助手现在可以像真人一样让您失望关于列车时刻表!未来真的来了。
此项目使用官方的Caltrain GTFS数据。如果出现问题,请责怪他们,而不是我们。我们只是信使。
在湾区用爱和令人担忧的咖啡因量制作,那里公共交通既是必需品也是永恒的痛苦来源。