transit-mcp
Provides Japanese public transit journey planning and station information tools that can be used inside ChatGPT through the Model Context Protocol Apps SDK.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@transit-mcpPlan a route from Shinjuku to Tokyo Station"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
transit-mcp
MCP server for Japanese public transit transfer / journey planning, with a map-based iframe UI rendered inside Claude and ChatGPT through the Model Context Protocol Apps SDK.
Built on Cloudflare Workers (Hono) + @modelcontextprotocol/sdk (Streamable
HTTP transport) + @modelcontextprotocol/ext-apps + React + MapLibre GL. It
wraps the public Transit API (api.transit.ls8h.com) behind the Cloudflare
Cache and exposes four tools to MCP clients.
Features
Four tools are exposed over MCP:
search_places— fuzzy place / station search by free-text query.plan_journey— point-to-point journey planning from free-textfrom/to. Returns a map-based iframe HTML resource with the route drawn over a MapLibre map.station_departures— upcoming departures for a station at a given time.station_detail— full detail of a single station (lines served, exits, etc.).
Only plan_journey returns an MCP UI resource (_meta.ui.resourceUri); the
other three return JSON only.
Related MCP server: ns-bridge
Quick start (clients)
The server speaks the Streamable HTTP MCP transport. Once deployed it is
reachable at https://transit-mcp.<your-cf-account>.workers.dev/mcp.
Claude Desktop
Edit your claude_desktop_config.json:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
Add a transit-mcp entry under mcpServers:
{
"mcpServers": {
"transit-mcp": {
"type": "http",
"url": "https://transit-mcp.<your-cf-account>.workers.dev/mcp"
}
}
}Restart Claude Desktop. The four tools appear in the tool picker. Try:
「渋谷から東京駅までの経路を教えて」 →
plan_journeyruns and an interactive map iframe is embedded directly in the chat.「新宿駅の次の発車は?」 →
station_departuresreturns the next trains."Plan a route from Shibuya to Tokyo Station" → English summary, same map.
"What's the next train from Shinjuku?" →
station_departures.
If you self-host you can point at http://localhost:8787/mcp for local
development.
ChatGPT (Apps SDK)
The MCP Apps SDK in ChatGPT discovers servers by URL exactly like Claude Desktop:
Open ChatGPT settings → Apps & Connectors → Add MCP Server.
Enter the server URL:
https://transit-mcp.<your-cf-account>.workers.dev/mcp.Choose transport: Streamable HTTP.
Approve the four tools when prompted.
The iframe HTML resource is served from /ui/plan on the same Worker and is
rendered inline in ChatGPT just like in Claude Desktop.
Custom GPT (Actions) fallback
If you need to register transit-mcp inside a Custom GPT before Apps SDK is available in your tier, wrap the tools as OpenAI Actions:
Create a Custom GPT in the ChatGPT builder.
Under Actions → Create new action, import an OpenAPI 3.1 schema that POSTs to
/mcpwith the standard MCP envelope. (A minimal example schema lives inexamples/openai-actions/— TODO for v0.2.)Note: Custom GPT Actions cannot render the
_meta.ui.resourceUriiframe; only the textual summary will be displayed.
For the richest experience, prefer the Apps SDK path.
Local development
pnpm install
pnpm dev # Wrangler dev server on http://localhost:8787
pnpm inspect # MCP Inspector against the local serverUseful scripts:
pnpm test/pnpm test:watch— Vitest (65 tests at time of writing)pnpm typecheck—tsc --noEmitpnpm lint/pnpm format— Biomepnpm build:ui— bundle the iframe UI with esbuildpnpm generate:types— regenerate Transit API types from its OpenAPI
To exercise tools locally with the MCP Inspector:
pnpm dev # terminal 1
pnpm inspect # terminal 2 → http://localhost:6274
# In the Inspector, click `connect`, then `tools/call`:
# { "name": "plan_journey", "arguments": { "from": "渋谷", "to": "東京" } }
# Copy the returned _meta.ui.resourceUri into a browser tab — the iframe HTML
# will render the route on a MapLibre map.Deployment
pnpm build:ui
pnpm dlx wrangler@latest deployPre-flight: the KV namespace UI_CACHE must exist before deploy.
pnpm dlx wrangler@latest kv namespace create UI_CACHE
# Copy the returned id into wrangler.toml under [[kv_namespaces]].A dry-run is also wired into CI for every PR:
pnpm dlx wrangler@latest deploy --dry-runConfiguration
Var | Where | Default |
|
|
|
|
| OpenFreeMap public style URL |
|
|
|
| KV binding | created per env ( |
| GitHub Actions secret | required by |
| GitHub Actions secret | required by |
Attribution
Required attribution is surfaced in the iframe footer:
Transit data: per-feed credits returned by
/api/v1/feedsand/api/v1/operators(cached in KV for 1 hour).Map tiles: © OpenStreetMap contributors, served via © OpenFreeMap.
Override MAP_STYLE_URL if you self-host MapTiler / Protomaps and want their
attribution shown instead — the iframe reads it from the worker env at render
time.
License
MIT.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/tori-create-7991/transit-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server