mcpField
T
transitland-mcp-server

transitland-mcp-server

本地服务
github.com/cyanheads地图与出行12 周前更新

关于 transitland-mcp-server

transitland-mcp-server 为出行规划者和交通数据用户提供通过 MCP 查询全球 Transitland v2 数据的能力。它涵盖运营方、数据源、线路和站点,并标明班次是实时预测还是计划时刻。

主要功能

  1. 01按名称或地理位置查找运营方
  2. 02查看 GTFS、GTFS-RT 和 GBFS 数据源
  3. 03查找线路和站点
  4. 04获取带实时标记的发车信息
  5. 05查看数据源许可与更新时间

适用场景

  1. 01查找某地区的公共交通运营方
  2. 02核对数据源网址和许可条款
  3. 03按坐标查找附近站点与线路
  4. 04比较计划班次与实时发车信息

MCP 相关

向 MCP 客户端提供 6 个工具和 2 个资源,用于查询 Transitland v2 的运营方、数据源、线路、站点和发车信息。支持 STDIO 和 Streamable HTTP。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"cyanheads-transitland": {
"command": "npx",
"args": [
"-y",
"@cyanheads/transitland-mcp-server"
],
"env": {
"TRANSITLAND_API_KEY": "<TRANSITLAND_API_KEY>",
"TRANSITLAND_BASE_URL": "<TRANSITLAND_BASE_URL>",
"MCP_LOG_LEVEL": "<MCP_LOG_LEVEL>",
"MCP_TRANSPORT_TYPE": "<MCP_TRANSPORT_TYPE>",
"MCP_HTTP_HOST": "<MCP_HTTP_HOST>",
"MCP_HTTP_PORT": "<MCP_HTTP_PORT>",
"MCP_HTTP_ENDPOINT_PATH": "<MCP_HTTP_ENDPOINT_PATH>",
"MCP_AUTH_MODE": "<MCP_AUTH_MODE>"
}
}
}
}
启动命令npx -y @cyanheads/transitland-mcp-server
需要配置的环境变量
TRANSITLAND_API_KEY密钥Transitland v2 API key, sent as the `apikey` query parameter. Get one at the Transitland developer portal.
TRANSITLAND_BASE_URLOverride the Transitland REST API base URL (default https://transit.land/api/v2/rest).
MCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
MCP_TRANSPORT_TYPESelects the HTTP transport.
MCP_HTTP_HOSTThe hostname for the HTTP server.
MCP_HTTP_PORTThe port to run the HTTP server on.
MCP_HTTP_ENDPOINT_PATHThe endpoint path for the MCP server.
MCP_AUTH_MODE密钥Authentication mode to use: 'none', 'jwt', or 'oauth'.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@cyanheads/transitland-mcp-server0.2.0

工具

6

收录的工具列表 · 更新于 2 周前

参数类型必填说明
latnumber否搜索中心的纬度(WGS84 十进制度)。必须与 lon 一起提供。Transitland 不执行地理编码——先使用 openstreetmap_geocode 将地点名称转换为坐标。
lonnumber否搜索中心的经度(WGS84 十进制度)。必须与 lat 一起提供。
bboxstring否边界框 "minLon,minLat,maxLon,maxLat"(例如:"-122.5,37.7,-122.3,37.9")。可替代 lat/lon/radius 用于区域调查。不能与 lat/lon 同时使用。
afterinteger否上一次响应中的分页游标(enrichment.cursor)。返回此内部 ID 之后的下一页。
limitinteger否要返回的运营方数量上限(最多 100)。使用 after 游标继续翻页。
radiusnumber否lat/lon 周围的搜索半径,单位为米(最大 100,000)。服务区域与该半径相交时,运营方将匹配。
searchstring否对运营方和机构名称进行全文搜索(例如:"BART"、"Sound Transit")。按上游排名。可与地点筛选条件结合,以消除常见名称的歧义。
adm0_namestring否按国家/地区筛选,使用完整英文名称(例如 "United States of America"、"Germany")。筛选范围较广,可结合搜索或地理位置进一步缩小范围。
adm1_namestring否按州/省/地区的完整名称筛选(例如 "California")。与 adm0_name 一起使用。
onestop_idstring否运营机构的 Onestop ID(例如 "o-9q9-bart")或内部整数 ID,用于直接查询。设置此项后,将忽略其他筛选条件。若要获取完整记录,建议使用 transitland_get_operator。

详细介绍

@cyanheads/transitland-mcp-server

通过 Transitland v2 注册库获取全球公共交通数据——运营方、附带许可条款的 GTFS/GTFS-RT/GBFS 数据源、线路、站点,以及可识别实时数据的出发信息。支持 STDIO 或 Streamable HTTP。

6 个工具 • 2 个资源

版本 许可证 Docker MCP SDK npm TypeScript Bun

在 Claude Desktop 中安装 在 Cursor 中安装 在 VS Code 中安装

框架


概述

通过 Transitland 获取全球数千家运营方的公共交通数据。Transitland 是一个开放的 GTFS、GTFS-Realtime 和 GBFS 数据源聚合平台。可查找运营方及其数据源,也可查询线路、站点和实时出发信息。

工具
工具描述
transitland_find_operators按名称、坐标/半径、边界框、国家/地区或 Onestop ID 查找公共交通运营方/机构
transitland_get_operator按 Onestop ID 获取完整的运营方记录,包括机构、数据源和来源标签
transitland_find_feeds查找 GTFS、GTFS-Realtime 和 GBFS 数据源,包括获取 URL、许可条款和数据新鲜度
transitland_find_routes按坐标/半径、边界框、运营方、Onestop ID 或 GTFS 模式查找线路
transitland_find_stops按名称、坐标/半径、边界框、Onestop ID 或运营方网络查找站点/车站
transitland_get_departures获取某站点的出发信息,并为每条记录标记 realtime true/false

Transitland 不会对地名进行地理编码——在调用按地理位置筛选的工具前,请先使用地理编码 MCP 服务将地点解析为坐标(例如,使用 openstreetmap-mcp-server 的 openstreetmap_geocode)。

资源
资源描述
transitland://operator/{onestop_id}按 Onestop ID 查询运营方记录——机构、服务地点、已发布的数据源和来源标签
transitland://feed/{onestop_id}按 Onestop ID 查询数据源记录——规范、获取 URL、许可条款和新鲜度

也可以通过工具(transitland_get_operator、transitland_find_feeds)访问所有资源数据。

功能参考

页面默认限制为 20 条,最多为 100 条。超出限制的 limit 会被截断,并显示提示;页面达到限制时会返回 truncated、shown 和 cap。使用返回的 after 游标继续查询。

transitland_find_operators 工具
  • 可按 search(名称)、lat+lon+radius(最大 100,000 米,默认 1,000 米)、bbox、onestop_id 或 adm0_name/adm1_name(国家/地区)筛选——至少需要一项,否则调用会因 no_filter 失败
  • lat 和 lon 必须同时提供,否则调用会因 incomplete_point 失败
  • 返回每个运营方的 Onestop ID、名称、服务地点、已发布的数据源(GTFS_RT 条目表示可能提供实时出发信息)和 Wikidata QID

transitland_get_operator 工具
  • 接受 Onestop ID(例如 o-9q9-bart)或内部整数 ID
  • 返回机构(每个机构均附有服务地点)、已发布的数据源和来源标签:Wikidata QID、美国 NTD ID、通用 Twitter/X 用户名
  • 如果无法解析该 ID,则返回 operator_not_found

transitland_find_feeds 工具
  • 可按 operator_onestop_id(来自 transitland_find_operators)、spec(gtfs/gtfs-rt/gbfs/mds;大小写及下划线/连字符形式(如 GTFS_RT)均可接受)、search 或 fetch_error 筛选——至少需要一项
  • 每个数据源都会返回其获取 URL、实时端点、新鲜度(上次获取时间、内容哈希、涵盖的日历时间范围)和许可条款——再分发、商业用途、衍生产品和署名的状态为 yes/no/unknown,绝不会根据空白字段推断——以及已知的 SPDX 标识符和署名文本
  • authorizationRequired 标记下载时需要单独密钥或注册的数据源

transitland_find_routes 工具
  • 可按 lat+lon+radius(最大 50,000 米,默认 1,000 米)、bbox、operator_onestop_id、onestop_id、route_type(GTFS 模式整数)或 search 筛选——至少需要一项
  • lat 和 lon 必须同时提供,否则调用会因 incomplete_point 失败
  • 返回短名称/长名称、GTFS 模式(公交、地铁、铁路、渡轮、有轨电车等)、品牌颜色,以及运营机构和来源数据源的 Onestop ID。路线类型缺失时为 null,模式为 unknown
  • 返回的是计划时刻表(GTFS 静态)中的路线定义,而非实时车辆位置

transitland_find_stops 工具
  • 可按 lat+lon+radius(最大 10,000 米,默认 500 米)、bbox、onestop_id、served_by_onestop_ids(逗号分隔的运营方/路线 Onestop ID)或站点名称 search 筛选——至少需要一项。名称搜索无需地理编码
  • 返回坐标(上游缺失时为 null)、带标签的 location_type(站点、车站、入口、节点、登乘区)、轮椅无障碍信息、时区,以及子站台对应的父车站 Onestop ID
  • 出发信息关联到站台级站点(location_type 为 0)——车站可能没有出发信息,因此请使用其子站台
transitland_get_departures 工具
  • 先用 transitland_find_stops 将站点解析为其 Onestop ID;若无法解析,则返回 stop_not_found。next_seconds 用于设置前瞻时间窗口:60–86,400(默认值为 3,600)——如果站点未返回结果,请扩大窗口或设置 use_service_window: true
  • 每个出发信息都包含 realtime 标志(实时 GTFS-Realtime 预测为 true,计划时间为 false)和 scheduleRelationship(STATIC、SCHEDULED、ADDED、CANCELED、UNSCHEDULED、DUPLICATED)
  • 还会返回计划和预计时间(含秒数延误)、线路、终点标识、模式、行程、方向和无障碍信息;顶层的 realtimeAvailable 用于报告该站点的源是否发布 GTFS-RT

transitland://operator/{onestop_id} 资源
  • 与 transitland_get_operator 返回的信息一致——包括机构、服务区域、已发布的源和来源标签
  • onestop_id 接受 Onestop ID(例如 o-9q9-bart)或内部整数 ID;若无法解析,则返回 operator_not_found

transitland://feed/{onestop_id} 资源
  • 与 transitland_find_feeds 返回的单个源结果一致——包括规范、获取 URL、实时端点、许可条款和最新状态
  • onestop_id 接受源 Onestop ID(例如 f-9q9-bart)或内部整数 ID;若无法解析,则返回 feed_not_found
  • 空白许可字段将返回 unknown/null,绝不会推断为宽松许可

功能

基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输、可插拔身份验证(none / jwt / oauth)、可切换存储(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、结构化日志记录及可选的 OpenTelemetry 跟踪。

Transitland 专属功能:

  • 为 Transitland v2 REST API 提供直接 HTTP 客户端——无需 SDK 依赖,通过少量 GET 端点使用扁平的查询参数契约
  • Onestop ID(o-/f-/r-/s-)是标识符主干——每个结果都会显示该 ID;输入时除内部整数 ID 外,也可接受 Onestop ID
  • 源查询仅返回最新源版本的最新状态,不提供完整的获取历史记录
  • 不提供覆盖范围多边形和线路/站点几何信息;结果改为包含精简的国家/地区/城市位置摘要

便于 Agent 使用的输出:

  • 明确标示实时状态:每个出发信息均包含 realtime 和 scheduleRelationship,顶层还包含 realtimeAvailable
  • 空白许可字段将返回 unknown/null,绝不会推断为宽松许可,并会提示 Agent 在重新分发前通过许可 URL 确认
  • 上游分页 URL 中包含 API 密钥;输出中仅显示不透明的 after 游标,因此密钥不会出现在工具输出或日志中
  • 无结果时会返回可执行的提示(先进行地理编码、扩大时间窗口、尝试子站台),而非错误

开始使用

将以下内容添加到 MCP 客户端配置文件中。需要 Transitland API 密钥——获取方式请参阅先决条件。

{
  "mcpServers": {
    "transitland-mcp-server": {
      "type": "stdio",
      "command": "bunx",
      "args": ["@cyanheads/transitland-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info",
        "TRANSITLAND_API_KEY": "your-api-key"
      }
    }
  }
}

或使用 npx(无需 Bun):

{
  "mcpServers": {
    "transitland-mcp-server": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@cyanheads/transitland-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info",
        "TRANSITLAND_API_KEY": "your-api-key"
      }
    }
  }
}

或使用 Docker:

{
  "mcpServers": {
    "transitland-mcp-server": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "MCP_TRANSPORT_TYPE=stdio",
        "-e", "TRANSITLAND_API_KEY=your-api-key",
        "ghcr.io/cyanheads/transitland-mcp-server:latest"
      ]
    }
  }
}

对于 Streamable HTTP,请设置传输方式并启动服务:

MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 TRANSITLAND_API_KEY=your-api-key bun run start:http
# Server listens at http://localhost:3010/mcp
先决条件
  • Bun v1.4.0 或更高版本(或 Node.js v24+)。
  • Transitland v2 API 密钥——请在 Transitland 开发者门户注册。免费套餐有速率限制;Pro 套餐可提高配额。
安装
  1. 克隆仓库:
git clone https://github.com/cyanheads/transitland-mcp-server.git
  1. 进入目录:
cd transitland-mcp-server
  1. 安装依赖:
bun install
  1. 配置环境:
cp .env.example .env
# edit .env and set TRANSITLAND_API_KEY

配置

所有配置都会在启动时通过 src/config/server-config.ts 中的 Zod 架构进行验证。缺少 TRANSITLAND_API_KEY 会导致启动失败,并显示包含该变量名的提示横幅,而不是等到首次调用工具时才失败。

变量说明默认值
TRANSITLAND_API_KEY必填。 Transitland v2 API 密钥,通过 apikey 查询参数发送。—
TRANSITLAND_BASE_URLTransitland REST API 基础 URL。可覆盖此值以固定使用特定部署或可自托管的实例。https://transit.land/api/v2/rest
MCP_TRANSPORT_TYPE传输方式:stdio 或 http。stdio
MCP_HTTP_PORTHTTP 服务的端口。3010
MCP_HTTP_ENDPOINT_PATH挂载 MCP 服务的 HTTP 端点路径。/mcp
MCP_AUTH_MODE身份验证模式:none、jwt 或 oauth。none
MCP_LOG_LEVEL日志级别(debug、info、notice、warning、error)。info
LOGS_DIR日志文件目录(仅限 Node.js)。<project-root>/logs
LOG_TOOL_FAILURE_PAYLOADS记录失败调用的参数和结果,并按键名进行脱敏(自由格式值中的机密仍会保留)。大小上限由 LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES 决定(默认值为 16384)。false
STORAGE_PROVIDER_TYPE存储后端:in-memory、filesystem、supabase、cloudflare-kv/r2/d1。in-memory
OTEL_ENABLED启用 OpenTelemetry 插桩(追踪记录、指标、完成日志)。false

可选覆盖项的完整列表请参见 .env.example。

HTTP 会话默认无状态;设置 MCP_SESSION_MODE 可覆盖此行为。

运行服务

本地开发
  • 构建并运行:

    # One-time build
    bun run rebuild
    
    # Run the built server
    bun run start:stdio
    # or
    bun run start:http
    
  • 运行检查和测试:

    bun run devcheck   # Lint, format, typecheck, security, changelog sync
    bun run test       # Vitest test suite
    bun run lint:mcp   # Validate MCP definitions against spec
    
Docker
docker build -t transitland-mcp-server .
docker run --rm -e TRANSITLAND_API_KEY=your-key -p 3010:3010 transitland-mcp-server

Dockerfile 默认使用 HTTP 传输、无状态会话模式,并将日志写入 /var/log/transitland-mcp-server。默认会安装 OpenTelemetry 对等依赖项;构建时添加 --build-arg OTEL_ENABLED=false 可省略这些依赖项。

项目结构

目录用途
src/index.tscreateApp() 入口点——注册工具和资源,并初始化 Transitland 服务。
src/config使用 Zod 解析和验证服务专用环境变量。
src/mcp-server/tools工具定义(*.tool.ts)。涵盖运营商、数据源、路线、站点和发车信息,共六个工具。
src/mcp-server/resources资源定义(*.resource.ts)。运营商和数据源记录。
src/services/transitlandTransitland v2 REST 客户端——处理 HTTP、注入 apikey、游标规范化、错误分类,以及各端点的类型化方法。
tests/与 src/ 结构对应的单元测试和集成测试。

开发指南

开发指南和架构规则请参见 CLAUDE.md / AGENTS.md。简要说明如下:

  • 处理器抛出异常,框架负责捕获——工具逻辑中不要使用 try/catch
  • 使用 ctx.log 记录请求范围的日志,使用 ctx.state 存储租户范围的数据
  • 通过 src/mcp-server/*/definitions/index.ts 中的汇总入口注册新工具和资源
  • 封装 Transitland API:验证原始数据 → 规范化为领域类型 → 返回输出架构;切勿伪造缺失字段(尤其是许可条款——空白表示 unknown,而非不受限制)

数据与许可

公交数据由 Transitland 提供,这是一个开放注册平台,汇集了全球数千家运营商的 GTFS、GTFS-Realtime 和 GBFS 数据源。基于 Transitland 数据构建的产品必须显示名称“Transitland”,并附上指向 transit.land/terms 的链接,确保最终用户能够清楚看到。

Transitland 汇集了数千家运营商的数据源,每家运营商都可能有自己的许可和署名要求。请在重新分发或发布通过此服务获取的数据之前,查看 transit.land/terms 中各数据源的许可条款,并遵守每个源数据的要求。

贡献

欢迎提交问题。提交前请运行检查和测试:

bun run devcheck
bun run test

许可证

Apache-2.0 — 详情请参阅 LICENSE。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。