otp-mcp
Enables querying self-hosted OpenTripPlanner for accurate transit routes via MCP, supporting both stdio and HTTP.
README
otp-mcp
セルフホストした OpenTripPlanner (OTP) を MCP(Model Context Protocol)サーバー越しに使えるようにするツール。Claude Code や claude.ai から「AからBは電車で何分?」を、自分の手元のOTPが持つ正確な経路データで聞けるようにする。
作った背景
きっかけは、ある公開の経路検索API(MCP付き)を触ったこと。MCP越しに plan_journey を叩いて経路が返ってくる体験はとても便利だった一方、そのAPIは「力技で集めた時刻表のパッチワーク」で、JRの直通・乗継系統(上野東京ライン・京浜東北快速など)を取りこぼし、関東の所要時間を実態の約2倍に誤ることがあった(飲み会場所最適化アプリ arigatai-score の経路エンジン選定の中で実測)。
一方で、自分は arigatai-score 用に 関東全域のOTP(TokyoGTFS + OSM からビルドしたグラフ)を既にセルフホストしている。これは Yahoo!乗換案内とほぼ一致する精度(平均誤差 約3分)を持つ。
だったら「便利なMCPの体験」を「自前OTPの正確なデータ」で実現すればいい——というのがこのツール。
トレードオフはこうなる:
| 公開API(パッチワーク) | otp-mcp(自前OTP) | |
|---|---|---|
| カバレッジ | 全国だが穴が多い | 関東のみ |
| 精度 | 平均誤差 約17分 | 平均誤差 約3分 |
「狭いが正確な経路MCP」を狙ったツール。
設計思想
- 薄いラッパーに徹する: 経路検索のロジックはOTPに任せ、このサーバーはOTPのGraphQL(
planConnection/stops)を叩いて結果を読みやすく整形するだけ。 - stdio / HTTP 両対応: ローカルの Claude Code は stdio、claude.ai のリモートコネクタは HTTP(Streamable HTTP + 任意のBearer認証)。1つの実装で両方をカバーする。足場は自分がフォークして使っている scrapbox-cosense-mcp の構成を下敷きにした。
- 経路の見せ方: leg(区間)ごとに「路線名・駅・所要分」を並べ、出発/到着時刻と乗換回数を添える。
提供ツール
plan_journey(from, to, numItineraries?)— 経路検索。from/toは駅名(例:新宿)か"緯度,経度"。ランク付けされたルートを返す。suggest_stations(q, limit?)— 駅名サジェスト。座標付きで返す。
出力例(plan_journey 新宿 渋谷):
新宿 → 渋谷
【ルート1】15:26 → 15:34 所要8分 乗換0回
🚶 徒歩 4分 → 新宿
🚃 JR湘南新宿ライン 新宿 → 渋谷 4分
🚶 徒歩 1分 → 渋谷
前提
経路検索の本体である OTP が動いていて、このサーバーから到達できること。本リポジトリ自体はOTPを含まない。
- 既定では arigatai-score の docker compose で動くOTP(サービス名
otp、http://otp:8080)を想定 - 別構成のOTPに繋ぐ場合は
OTP_BASE_URLを設定
使い方
Claude Code(ローカル / stdio)
ビルドして、.mcp.json に登録する:
npm install
npm run build
{
"mcpServers": {
"otp": {
"command": "node",
"args": ["/home/kouki/dev/otp-mcp/build/index.js"],
"env": { "OTP_BASE_URL": "http://localhost:8080" }
}
}
}
OTP_BASE_URL はOTPに到達できるURLにする(OTPのポートをホスト公開している場合は http://localhost:8080 など)。
claude.ai / リモート(HTTP)
Docker Compose で HTTP サーバーとして起動し、Cloudflare Tunnel 等で公開して claude.ai のカスタムコネクタに登録する:
cp .env.example .env # MCP_AUTH_TOKEN を設定推奨
docker compose up -d --build
- エンドポイント:
https://<公開ホスト>/mcp MCP_AUTH_TOKENを設定した場合はAuthorization: Bearer <token>が必要- 既定の compose は arigatai-score の Docker ネットワーク(
arigatai-score_internal)に相乗りしてhttp://otp:8080に到達する
CLI(動作確認用)
node build/index.js plan 新宿 渋谷
node build/index.js suggest 新宿
今後の展望
station_departures(発車標)の追加(OTPのstoptimesクエリ)- 出発/到着時刻の指定
- 運賃・乗換回数のメタ情報付与
- OTPのカバレッジを関東以外へ広げたら、そのまま全国対応に
関連
- arigatai-score — このOTPを使う、飲み会場所最適化アプリ
- 足場: scrapbox-cosense-mcp
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。