chelaile-mcp
车来了 MCP
一个基于 MCP 的车来了实时公交服务器,让大语言模型可以查询国内的公交、地铁实时数据 —— 包括线路时刻表、车辆实时位置、附近站点、关键词搜索、以及公交+地铁的换乘路线规划。
回答 "我的公交还有多久到站" 这类问题。无需登录、无需任何账号配置,开箱即用。
安装
一键安装
点击上面的徽章即可在 Cursor / VS Code / VS Code Insiders 中一键安装。
在 Claude Code 中使用
claude mcp add chelaile -- npx -y chelaile-mcp-server或者手动编辑 ~/.claude/mcp_servers.json(或项目级的 .mcp.json):
{
"mcpServers": {
"chelaile": {
"command": "npx",
"args": ["-y", "chelaile-mcp-server"]
}
}
}在 Claude Desktop 中使用
编辑 ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"chelaile": {
"command": "npx",
"args": ["-y", "chelaile-mcp-server"]
}
}
}重启对应客户端后,工具会以 chelaile 为前缀出现。
Related MCP server: openbusdata
工具一览
工具 | 用途 |
| 列出支持的城市及其 ID |
| 某城市的刷新间隔限制与展示策略 |
| 基于调用方 IP 估算位置(精度到城市级) |
| WGS-84 经纬度 → 中文地址 |
| 按关键词混合搜索:线路 + 站点 + POI |
| 按某一分类分页"查看更多" |
| 某 GPS 坐标附近的站点及到站预计时间 |
| 某站点经过的所有线路 + 附近的地铁 |
| 某线路的完整站点列表 + 当前车辆 |
| 某线路的地图轨迹坐标 |
| 某线路即将到达某站点的车辆实时信息 |
| 某线路上所有车辆的位置与载客率 |
| 首末班、发车间隔或完整时刻表 |
| 一次性批量刷新多个 (线路, 站点) 对 |
| 两个 GCJ-02 坐标之间的公交+地铁换乘规划 |
每个工具都支持 response_format: "markdown" | "json"(默认 markdown),返回 JSON 时同时附带 structuredContent。
License
MIT
Available Tools
15 toolsbus_get_city_configGet city operating configARead-onlyIdempotent
Get a city's runtime config: max poll interval and "arriving" time threshold.
This is mostly relevant if you are deciding how aggressively to refresh — not for end-user questions about lines or stops.
Args:
city_id (string, required): e.g. '034' (Shanghai), '027' (Beijing)
response_format ('markdown' | 'json')
Returns (json): { "maxInterval": 30, "arrivingStationLimitSeconds": 180, "busDisplayConfig": { "lineDetail": "time#order#distance", "other": "time#order" } }
| Name | Required | Description | Default |
|---|---|---|---|
| city_id | Yes | City ID, e.g. '034' for Shanghai, '027' for Beijing | |
| response_format | No | Output format: 'markdown' for human-readable text, 'json' for full structured data | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and idempotentHint=true. The description adds that the tool returns runtime config values, but does not detail further behavioral traits like auth requirements or data freshness, which is acceptable for a simple read operation with good annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured with clear sections for args and returns. Every sentence adds necessary information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking an output schema, the description fully documents the return structure and field semantics. Combined with complete parameter documentation and usage guidance, the description is comprehensive for this simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by providing example values for city_id (e.g., '034' for Shanghai) and explaining the purpose of response_format, exceeding what the schema alone provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The name and description clearly state the tool retrieves a city's runtime config (max poll interval and arriving time threshold). The description also distinguishes it from end-user line/stop queries, differentiating it from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description specifies this tool is relevant for deciding refresh aggressiveness and explicitly says it's not for end-user questions about lines or stops, providing clear usage context. However, it does not name specific alternative tools for those cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bus_get_line_detailGet full line detail (stops + live buses)ARead-onlyIdempotent
Full info for a line: rider-facing fields (name, first/last/price, stationsNum), the full ordered station list, the reverse-direction lineId, and every bus currently on the line.
Use this — not bus_get_timetable — to answer "is line X still running" or "first/last bus time" questions. The timetable tool only has data for a small minority of lines.
Subway lines are NOT supported. If bus_search returned a line with isSubway=true (e.g. lineId=1057 for 地铁2号线), this endpoint returns an empty payload — the response will carry empty: true and a hint field pointing at bus_get_nearby_stops / bus_plan_transit. Don't retry; route to those tools instead.
Args:
city_id (string, required)
line_id (string, required): from bus_search.lines[*].lineId
lat / lng (string, optional): caller's WGS-84 coordinates
response_format ('markdown' | 'json')
Returns (json): { "line": { "lineId":"...", "name":"71", "lineNo":"r95817", "direction":0, "startSn":"...", "endSn":"...", "firstTime":"05:30", "lastTime":"23:30", "price":"2元", "stationsNum":24 }, "stations": [{ "order":1, "sId":"...", "sn":"...", "wgsLat":..., "wgsLng":..., "physicalStId":"...", "namesakeStId":"...", "metros":[{"name":"地铁14号线","lineNo":"14号线","color":"97,96,32"}] }, ...], "buses": [{ "busId":"...", "order":2, "lat":..., "lng":..., "speed":5.7, "capacity":0, "distanceToWaitStn":...}], "reverseDirection": { "lineId":"...", "startSn":"...", "endSn":"...", "firstTime":"04:30", "lastTime":"22:30", "price":"2元" } | null, "depDesc": "...", "preArrivalTime": "...", "targetOrder": 24, "empty": true, "hint": "..." // present only when upstream returned no data (subway / retired line) }
Each station carries:
'order' → feed into bus_get_line_realtime / bus_list_line_buses as target_order
'sId' → feed into bus_get_line_realtime as station_id (NOT into bus_get_stop_detail!)
'physicalStId' + 'namesakeStId' → feed into bus_get_stop_detail to see every line through that stop
| Name | Required | Description | Default |
|---|---|---|---|
| city_id | Yes | ||
| line_id | Yes | lineId from bus_search.lines / bus_get_nearby_stops.lines | |
| lat | No | ||
| lng | No | ||
| response_format | No | Output format: 'markdown' for human-readable text, 'json' for full structured data | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, etc. Description adds that subway lines return empty payload with hint field, and explains response structure including 'empty: true' case. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with front-loaded purpose and usage, clear parameter list, and organized return value explanation. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, yet description provides a complete JSON example and explains all keys, special cases (empty response), and relationships with other tools. Comprehensive for a tool with 5 parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40%, but description adds meaning for all parameters: explains city_id requirement, line_id source, lat/lng usage, response_format options, and maps station fields to other tools. Fully compensates for low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it provides 'Full info for a line: rider-facing fields, full ordered station list, reverse-direction lineId, and every bus currently on the line.' It also differentiates from sibling tool bus_get_timetable with a specific use case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this — not bus_get_timetable — to answer "is line X still running" or "first/last bus time" questions.' Also notes subway lines are not supported with clear alternative tools and instruction not to retry.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bus_get_line_realtimeGet realtime buses for a (line, stop) pairARead-onlyIdempotent
Canonical "when will my bus arrive" tool. Returns every bus currently on the line, with the nearest one carrying an ETA to the waiting stop.
Important: the upstream predicts an ETA for only the nearest bus heading to your stop. Buses farther up the route are returned (with position/speed/capacity) but their eta field is null. That's not a bug.
Args:
city_id (string, required)
line_id (string, required): from bus_search
target_order (string, required): the waiting stop's order on the line. Source: bus_get_line_detail.stations[i].order, or bus_get_nearby_stops.stops[].lines[].targetOrder.
station_id (string, required): sId of the waiting stop
lat / lng (string, required): WGS-84 — the user's location is best; if unavailable, use the waiting stop's wgsLat/wgsLng (from line_detail.stations[i]).
response_format ('markdown' | 'json')
Returns (json): { "line": { "lineId":"...", "name":"71", "direction":0, "endSn":"..." }, "targetOrder": 2, "realData": true, "buses": [ { "busId":"...", "licence":"...", "order":2, "lat":..., "lng":..., "speed":5.7, "capacity":0, "distanceToWaitStn":90, "eta":{"travelTime":25,"arrivalTime":1779070466055,"displayTime":"10:14"} }, { "busId":"...", "order":3, "lat":..., "lng":..., "speed":3, "capacity":0, "eta":null }, ... ], "note": "..." }
Field notes:
The 'line' sub-object intentionally omits startSn — upstream does not return it on this endpoint. Read it from bus_get_line_detail if needed.
eta.travelTime is seconds remaining
eta.arrivalTime is a ms timestamp
eta.displayTime is a "HH:MM" hint from upstream
capacity: 0=light, 1=moderate, 2=crowded
| Name | Required | Description | Default |
|---|---|---|---|
| city_id | Yes | ||
| line_id | Yes | ||
| target_order | Yes | Order index of the waiting stop on the line. Get it from bus_get_line_detail.stations[].order or bus_get_nearby_stops.stops[].lines[].targetOrder. | |
| station_id | Yes | sId of the waiting stop | |
| lat | Yes | WGS-84 latitude. If the user's location is unknown, fall back to the waiting stop's lat (from line_detail.stations[].wgsLat). | |
| lng | Yes | WGS-84 longitude. Fallback to the stop's wgsLng if unknown. | |
| response_format | No | Output format: 'markdown' for human-readable text, 'json' for full structured data | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the behavioral trait that only the nearest bus has ETA while others have null, explaining this is not a bug. Annotations already indicate read-only and idempotent, and the description adds extensive detail on output structure and edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear purpose, important note, argument list, output example, and field notes. Every section adds value, and there is no redundant or wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (7 parameters, realtime data, no output schema), the description is highly complete. It explains parameter construction, output fields, caveats, and references sibling tools for data sources, making it sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds significant meaning beyond the input schema for all parameters, e.g., sourcing guidance for line_id and target_order, fallback instructions for lat/lng, and explanation of response_format. This compensates for the 71% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose as the canonical 'when will my bus arrive' tool, specifying it returns realtime buses with ETA for the nearest bus. This distinguishes it from siblings like bus_get_timetable (schedule) and bus_list_line_buses.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an important caveat about ETA only for the nearest bus and gives fallback guidance for lat/lng parameters. However, it lacks explicit direction on when to use this vs alternatives; the context and sibling names imply the appropriate use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bus_get_line_routeGet line polyline coordinatesARead-onlyIdempotent
Polyline coordinates for drawing a line on a map. Points with 'stopOrder' are actual stops; others are shape points between stops.
Args:
city_id (string, required)
line_id (string, required)
include_shape (boolean, default false): false returns only stop markers (~25 points); true returns all shape points (~400-500). Skip unless you actually need to draw the line.
response_format ('markdown' | 'json')
Returns (json): { "pointCount": 480, // total shape points upstream returned "stopCount": 23, // stop markers among them "points": [{ "lat":..., "lng":..., "stopOrder":1 }, ...] } 'points' is the filtered list — stops only by default, full polyline when include_shape=true.
Known caveat: upstream sometimes omits the terminus stop from the polyline, so 'stopCount' may be one less than bus_get_line_detail's 'stationsNum' (e.g. 23 vs 24). Trust bus_get_line_detail for the authoritative station list; line_route is just for drawing.
Markdown mode only summarises counts; request JSON to read coordinates.
| Name | Required | Description | Default |
|---|---|---|---|
| city_id | Yes | ||
| line_id | Yes | ||
| include_shape | No | If true, include all polyline shape points (often 400-500 per line). Default false returns only stop-marker points. | |
| response_format | No | Output format: 'markdown' for human-readable text, 'json' for full structured data | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate safe, read-only behavior, but the description adds valuable caveats about terminus omission and point counts, enriching transparency beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with sections for args, returns, and caveats; every sentence adds value, though slightly lengthy. Could be more concise without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Comprehensively covers parameters, return format, known caveats, and references sibling tools; no gaps given the tool's complexity and lack of output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%; description adds meaningful detail for include_shape and response_format but merely restates city_id and line_id without extra semantics. Adequate but not exceptional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns polyline coordinates for drawing a line on a map, and distinguishes itself from sibling tool bus_get_line_detail, which provides authoritative station lists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use include_shape (skip unless needed) and recommends bus_get_line_detail for authoritative stop data, offering clear decision context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bus_get_my_locationGet the caller's approximate location via IPARead-onlyIdempotent
Resolve the caller's approximate location from their public IP — useful when the user asks something like "what's near me" without providing coordinates.
Precision is city-level (typically a few kilometres). Good enough to identify the city and seed bus_get_nearby_stops with a starting guess. NOT precise enough to find the user's actual bus stop — for that, ask for a landmark/address and resolve it via bus_search.
Caveats:
Resolves via ip-api.com (free tier; rate-limited but no auth).
VPN / corporate proxy → result reflects the proxy exit IP, not the user.
Cellular IPs often land on a provincial centroid.
Args:
ip (string, optional): a specific IPv4/IPv6 to look up. Omit to use the mcp server process's own outbound IP (= the caller's machine when running locally).
response_format ('markdown' | 'json')
Returns (json): { "lat": 31.2222, "lng": 121.4581, "gpsType": "wgs", "city": "上海", "region": "上海市", "country": "中国", "ip": "116.236.0.1", "isp": "China Telecom", "precision": "city-level (~10 km); not suitable for stop-level queries" }
Suggested workflow:
Call this tool to identify the user's city (match 'city' field against bus_list_cities to get a cityId).
Pass lat/lng into bus_get_nearby_stops for a rough nearby list, OR ask the user to confirm a landmark and use bus_search.pois for sharper coordinates.
| Name | Required | Description | Default |
|---|---|---|---|
| ip | No | Optional override IP to look up. Omit to use the mcp server's own outbound IP (i.e. the caller's machine). | |
| response_format | No | Output format: 'markdown' for human-readable text, 'json' for full structured data | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false. Description adds significant context: precision (city-level ~10 km), data source (ip-api.com), rate limits, no auth, caveats for VPN/cellular IPs, and return structure. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with sections: purpose, precision, caveats, args, returns, suggested workflow. Every sentence adds value without redundancy. Front-loaded with the main purpose, followed by important limitations and usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 optional params), the description fully covers inputs, outputs, behavior, limitations, and integration with sibling tools. No gaps remain despite lack of output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions. The description adds value by explaining the ip parameter's default behavior (omitting uses server's outbound IP) and response_format options. The return example with fields like lat, lng, city, and precision note compensates for missing output schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool resolves approximate location from public IP, specific verb 'Resolve' and resource 'caller's approximate location'. It distinguishes from siblings by stating it's not for precise stop-level queries, and suggests nearby stops tool for that.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage context: 'when user asks what's near me without coordinates'. Provides when-not-to-use: not for stop-level accuracy. Suggests alternative tools and a complete workflow: call this, then use bus_get_nearby_stops or bus_search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bus_get_nearby_stopsGet nearby bus stopsARead-onlyIdempotent
List bus stops near a WGS-84 GPS coordinate, each annotated with the lines that pass through and the realtime buses approaching.
If you don't have coordinates: call bus_get_my_location first (city-level precision via IP), or ask the user for a landmark and resolve it via bus_search.pois — the resulting lat/lng goes into this tool's lat/lng args.
Args:
city_id (string, required): e.g. '034'
lat / lng (string, required): WGS-84 decimal coordinates
limit (number, default 5): how many of the closest stops to return (max 20)
response_format ('markdown' | 'json')
Returns (json): { "stops": [ { "sId": "021-15232", "sn": "西藏中路", "distance": 87, "isSubway": false, "physicalStId": "...", "namesakeStId": "...", "firstLineId": "...", "lines": [ { "lineId": "...", "name": "71", "direction": 0, "endSn": "...", "status": "等待发车" | "不在运营时间" | "" (running), "preArrivalTime": "10:10" | undefined, "targetOrder": 2, "targetStationId": "021-15232", "buses": [ { "busId": "...", "order": 2, "arrivalTime": 1779070466055, "travelTime": 25, "distanceToDest": 90, "capacity": 0 } ] } ], "subwayLines": [ { "name": "地铁2号线", "shortName": "2号线", "color": "140,194,32", "directions": [{ "destName": "...", "firstTime": "05:31", "lastTime": "23:24" }] } ] } ] }
Field notes:
buses[].arrivalTime is a ms timestamp; -1 = unknown
buses[].travelTime is seconds remaining; -1 = unknown
buses[].capacity: 0=light, 1=moderate, 2=crowded
If no realtime buses but the line is starting soon, 'preArrivalTime' will hold the next predicted dispatch ("10:12")
| Name | Required | Description | Default |
|---|---|---|---|
| city_id | Yes | City ID, e.g. '034' | |
| lat | Yes | WGS-84 latitude | |
| lng | Yes | WGS-84 longitude | |
| limit | No | How many of the nearest stops to return. Default 5 — the upstream may return 15+ and most callers only care about the closest few. | |
| response_format | No | Output format: 'markdown' for human-readable text, 'json' for full structured data | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and idempotentHint=true. The description adds rich behavioral context by detailing the return structure, field notes (e.g., 'buses[].arrivalTime is a ms timestamp', 'capacity: 0=light, 1=moderate, 2=crowded'), and real-time behavior. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but well-structured: purpose first, then usage guidance, then parameter explanation, then full return example with field notes. Every section adds value; no filler. Could be slightly more concise, but overall well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description provides a complete return schema with detailed field notes covering all return fields. It explains how to obtain coordinates, parameter specifics, and response format. For a tool with 5 params and complex output, this is thorough and fully contextual.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds extra semantics beyond the schema, e.g., 'limit: how many of the closest stops to return (max 20)' and response_format explanation. It also clarifies the city_id format. This lifts the score to 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'List bus stops near a WGS-84 GPS coordinate, each annotated with the lines that pass through and the realtime buses approaching.' This clearly defines the verb (list), resource (bus stops), and scope (near coordinates with lines/realtime), distinguishing it from siblings like bus_get_stop_detail (specific stop) and bus_search (by name).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: 'If you don't have coordinates: call bus_get_my_location first... or ask the user for a landmark and resolve it via bus_search.pois.' This tells the agent when to use alternatives, clearly separating this tool from coordinate-requiring tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bus_get_stop_detailGet stop detail with all linesARead-onlyIdempotent
Full detail for a stop: precise WGS-84 coordinates, every line that passes through (with first/last/price), realtime buses, and nearby metro lines.
Args:
city_id (string, required)
physical_st_id (string, required): from bus_get_nearby_stops / bus_search
namesake_st_id (string, optional): recommended; from the same source
first_line_id (string, optional): a line to highlight
lat / lng (string, optional): caller's WGS-84 location, used to populate 'distance'
response_format ('markdown' | 'json')
Returns (json): { "stations": [ { "sId": "...", "sn": "...", "lat": ..., "lng": ..., "distance": ..., "lines": [{ "lineId": "...", "name": "71", "direction": 0, "startSn": "...", "endSn": "...", "firstTime": "05:30", "lastTime": "23:30", "price": "2元", "targetOrder": 2, "buses": [...] }], "metros": [{ "name": "地铁14号线", "lineNo": "14号线", "color": "97,96,32" }] } ] }
Multiple entries in stations[] mean the stop name maps to several physical platforms.
| Name | Required | Description | Default |
|---|---|---|---|
| city_id | Yes | ||
| physical_st_id | Yes | physicalStId of the stop (from bus_get_nearby_stops or bus_search) | |
| namesake_st_id | No | namesakeStId of the stop, optional | |
| first_line_id | No | Optional hint of a line you want highlighted | |
| lat | No | Caller's WGS-84 latitude — used to populate 'distance' | |
| lng | No | Caller's WGS-84 longitude | |
| response_format | No | Output format: 'markdown' for human-readable text, 'json' for full structured data | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description provides detailed behavioral context beyond annotations: it explains the meaning of the 'distance' field (populated by lat/lng) and that multiple stations in the output correspond to multiple physical platforms. Annotations already indicate read-only/idempotent, so the description adds useful nuance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a summary line followed by an Args list and a Returns example. It is slightly long but every sentence adds value; the structure aids readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters and a rich output, the description covers all parameters with explanations, provides a concrete output example, and explains edge cases (multiple platforms). No output schema exists, but the example fully compensates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning to parameters beyond the schema by explaining sources (e.g., physical_st_id from bus_get_nearby_stops) and usage tips (e.g., namesake_st_id recommended). Since schema coverage is 86%, the description compensates well for the remaining 14%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with "Full detail for a stop" and lists what is included (coordinates, lines, realtime buses, metro lines), clearly distinguishing it from sibling tools like bus_get_nearby_stops (which lists stops) and bus_get_line_detail (focuses on a line).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains where the input parameters come from (e.g., bus_get_nearby_stops / bus_search) and marks namesake_st_id as recommended, giving usage hints. However, it does not explicitly compare to sibling tools or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bus_get_timetableGet a line's per-trip schedule (rarely useful)ARead-onlyIdempotent
Per-trip departure schedule for a line. The upstream returns one of three modes via mode:
'scheduled' (timeTableType=1): an explicit
timetablearray of trips'interval' (timeTableType=2): the line runs at a fixed headway — NO per-trip times are returned
'special' / 'unknown' (timeTableType=3 or other)
Most lines in Shanghai are 'interval', so this tool is rarely the right one. To answer "first/last bus", "is the line still running", or "what's the next departure", call bus_get_line_detail instead — it always returns firstTime / lastTime / price / live buses.
Args:
city_id (string, required)
line_id (string, required)
line_no (string, required): rider-facing short name from bus_search.lines[].name (e.g. '71'). Do NOT pass the internal lineNo like 'r95817'.
direction ('0'|'1'): the line direction
response_format ('markdown' | 'json')
Returns (json): { "line": { "lineId":"...", "name":"71", "direction":0, "startSn":"...", "endSn":"..." }, "timeTableType": 2, "mode": "interval", "timetable": null, "note": "This line runs at a fixed interval — ..." }
| Name | Required | Description | Default |
|---|---|---|---|
| city_id | Yes | ||
| line_id | Yes | ||
| line_no | Yes | Rider-facing short name (search.lines[].name), e.g. '71'. NOT the internal lineNo like 'r95817'. | |
| direction | Yes | ||
| response_format | No | Output format: 'markdown' for human-readable text, 'json' for full structured data | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly and idempotent. Description adds three behavioral modes (scheduled, interval, special) and sample output, providing good context beyond annotations. Could mention rate limits or error responses, but overall strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise, well-structured with clear sections, and uses formatting (bold, code) to highlight key points. No unnecessary words; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with good annotations, the description provides complete context: purpose, behavior modes, parameter guidance, and a sample return. Missing output schema is compensated by inline description of return fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 40% of parameters with descriptions (line_no and response_format). Tool description reinforces those and adds critical warning about line_no (not internal line). For other params (city_id, line_id, direction), no extra detail, but the warning for line_no is valuable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Title and description clearly state this tool returns per-trip schedule, and explicitly warn that most lines in Shanghai operate on fixed intervals, making this tool rarely useful. It distinguishes itself from siblings like bus_get_line_detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description explicitly tells when not to use it (most lines are 'interval') and directs users to bus_get_line_detail for common queries like first/last bus times. This is excellent guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bus_list_citiesList supported citiesARead-onlyIdempotent
List cities supported by the realtime bus data service.
Args:
hot_only (boolean, default true): return only the upstream's curated 'hot' set (~20 cities). Set false to dump the full ~480-city list (token-heavy, use sparingly).
response_format ('markdown' | 'json'): defaults to 'markdown'
Returns (json): { "cities": [ { "cityId": "034", "cityName": "上海", "pinyin": "ShangHai", "supportSubway": true, "hot": true }, ... ] }
Use when: the user mentions a city name and you don't have its ID. The hot set covers the top-tier cities the user almost certainly means.
| Name | Required | Description | Default |
|---|---|---|---|
| hot_only | No | Default true: return only the upstream-curated 'hot' set (~20 cities). Set false to dump all 480+. | |
| response_format | No | Output format: 'markdown' for human-readable text, 'json' for full structured data | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations show readOnly/destructive/idempotent hints. Description adds full return JSON structure and explains behavior of hot_only parameter. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise yet complete: purpose, args, returns, usage guidance all in few sentences. Each sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description provides sample JSON structure. Covers all relevant behavioral aspects for a simple list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers both parameters well (100% coverage). Description adds value by warning about token-heavy full list and alternative usage. Would be 5 if it added more details on response_format behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Explicitly states 'List cities supported by the realtime bus data service.' Verb is 'list', resource is 'cities'. Clearly distinguishable from sibling tools which deal with lines/stops/etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage guidance: 'Use when: the user mentions a city name and you don't have its ID.' Also warns about token cost when using full list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bus_list_line_busesGet the nearest approaching bus on a lineARead-onlyIdempotent
Returns the nearest bus heading to the anchor stop, with ETA and the bus's next stop name.
This is narrower than the name suggests. Despite the upstream endpoint being called "busList", in practice it returns at most 1-2 buses (the imminent ones). For the FULL roster of every bus currently on the line, call bus_get_line_detail — its 'buses' array lists all live vehicles with positions.
Use this tool when you want a quick "what's about to arrive" answer for a specific stop.
Args:
city_id (string, required)
line_id (string, required)
target_order (string, required): the waiting stop's order on the line
station_name (string, required): display name of that anchor stop
response_format ('markdown' | 'json')
Returns (json): { "targetOrder": 2, "buses": [ { "busId":"...", "licence":"...", "order":2, "lat":..., "lng":..., "speed":8.2, "capacity":0, "nextStop":"西藏中路", "eta":{"travelTime":214,"arrivalTime":..., "displayTime":"10:14"} } ] }
| Name | Required | Description | Default |
|---|---|---|---|
| city_id | Yes | ||
| line_id | Yes | ||
| target_order | Yes | ||
| station_name | Yes | Display name of the target stop | |
| response_format | No | Output format: 'markdown' for human-readable text, 'json' for full structured data | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds significant context beyond annotations: discloses that despite the name 'busList', it returns at most 1-2 buses (imminent ones), and explains the narrow scope. No contradictions with annotations (readOnlyHint, destructiveHint, etc.).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured: summary, caveat, usage guidance, parameter list, return example. Every sentence adds value, no unnecessary words. Front-loaded with key info.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Includes sample return JSON and usage guidance, but lacks handling of edge cases (e.g., no bus found) or error info. Still sufficiently complete for correct invocation given the sample and sibling contrast.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 40% (low). Description adds meaning for target_order ('the waiting stop's order') and clarifies station_name, but city_id and line_id are not explained beyond schema. Acceptable compensation for low coverage, not outstanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it returns the nearest approaching bus with ETA, contrasting with bus_get_line_detail which returns full roster. The verb 'returns' and resource 'nearest bus' are specific, and the sibling differentiation is explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this tool when you want a quick "what's about to arrive" answer' and directs to bus_get_line_detail for full bus list, providing both context and alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bus_plan_transitPlan a public-transit routeARead-onlyIdempotent
Plan a public-transit (bus + metro) route between two points. Returns alternative plans sorted by recommendation, each broken into walking and ride segments.
Coordinate system: this tool expects GCJ-02. The easiest source is bus_search.pois[*].lat/lng — those are already GCJ-02 and carry a name. If you only have WGS-84 (e.g. from a phone GPS), convert it before calling.
Args:
city_id (string, required)
origin_name, origin_lat, origin_lng (string, required): origin in GCJ-02
dest_name, dest_lat, dest_lng (string, required): destination in GCJ-02
strategy ('0'|'1'|'2'|'3'): 0=recommended (default; surfaces metro), 1=fewest transfers, 2=least walking, 3=shortest time (BUS-ONLY — upstream often drops metro plans here, so for general "fastest route" questions use 0)
response_format ('markdown' | 'json')
Returns (json): { "origin": "lng,lat", "destination": "lng,lat", "distance": 17982, "plans": [ { "duration": 3056, "walkingDistance": 1466, "distance": 19086, "tag": "直达", "transitCount": 1, "segments": [ { "type": "walking", "distance": 837, "duration": 717 }, { "type": "bus", "name": "地铁2号线", "lineType": 1, "departureStop": "人民广场", "arrivalStop": "虹桥2号航站楼", "viaStops": 8, "duration": 1800, "distance": 17620, "startTime": "05:37", "endTime": "23:30" } ] } ] } lineType: 0=bus, 1=metro. Durations in seconds, distances in meters.
A top-level 'note' field is emitted when the response shape is suspicious — e.g. strategy=3 returned no metro plans despite this being a likely metro trip.
| Name | Required | Description | Default |
|---|---|---|---|
| city_id | Yes | ||
| origin_name | Yes | Origin display name | |
| origin_lat | Yes | Origin latitude in GCJ-02 | |
| origin_lng | Yes | Origin longitude in GCJ-02 | |
| dest_name | Yes | Destination display name | |
| dest_lat | Yes | Destination latitude in GCJ-02 | |
| dest_lng | Yes | Destination longitude in GCJ-02 | |
| strategy | No | Routing strategy: 0=recommended (default; surfaces metro), 1=fewest transfers, 2=least walking, 3=shortest time among BUS-ONLY candidates (upstream often excludes metro from this strategy — when in doubt, use 0). For most user questions, 0 is the right choice. | 0 |
| response_format | No | Output format: 'markdown' for human-readable text, 'json' for full structured data | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already show readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds crucial behavioral context: coordinate system GCJ-02, return format, line types (0=bus,1=metro), duration/distance units, and a note field for suspicious responses. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with sections: purpose, coordinate note, args, return example. Front-loaded with core purpose. Every sentence adds value, though length could be slightly reduced.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 9 parameters and no output schema, the description is thorough: covers all params, return shape, edge cases (strategy 3, coordinate conversion). Lacks error handling details, but acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (89%). The description adds meaningful context beyond schema: explains coordinate system origin, strategy nuances (3=bus-only), and default behavior. Includes a return example that clarifies parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it plans a public-transit route between two points and returns alternative plans. It distinguishes itself from sibling tools like bus_search (which searches stations/POIs) and bus_get_line_* (line details) by focusing on route planning with segments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context on when to use: for planning transit routes. Advises on coordinate conversion and strategy selection (recommending 0 for most cases). Does not explicitly list when not to use, but sibling list and purpose make it clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bus_refresh_linesBatch refresh realtime info for multiple (line, stop) pairsARead-onlyIdempotent
Refresh realtime bus info for several (line, stop) pairs in one round-trip. Useful for a 'favourites' dashboard.
Args:
city_id (string, required)
line_stn (string, required): semicolon-separated quadruples Format: lineId,stopId,nextId,targetOrder;lineId,stopId,nextId,targetOrder;... 'nextId' may be empty between the two commas.
response_format ('markdown' | 'json')
Example: '21283603183,021-15232,,2;21283604388,021-8685,,4'
Returns (json): { "lines": [ { "line": { "lineId":"...", "name":"71", "direction":0, "endSn":"..." }, "depDesc": "...", "buses": [ { "busId":"...", "order":2, "capacity":0, "distanceToDest":881, "eta":{"travelTime":221,"arrivalTime":...} } ] } ] }
Soft cap: up to 10 quadruples per call.
| Name | Required | Description | Default |
|---|---|---|---|
| city_id | Yes | ||
| line_stn | Yes | Quadruple list: lineId,stopId,nextId,targetOrder; separated by ';'. nextId may be empty. | |
| response_format | No | Output format: 'markdown' for human-readable text, 'json' for full structured data | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, etc. The description adds the important soft cap of 10 quadruples per call and provides an example of the return structure, going beyond annotation details. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: one-sentence summary, bulleted parameter details, a concrete example, and a note on the soft cap. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (batch operation, three parameters), the description covers all essential aspects: purpose, parameter semantics, usage scenario, output format (via example), and a usage limit. Sibling tools are numerous but the description clearly distinguishes this batch tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description provides a detailed format for the complex 'line_stn' parameter with precise quadruple syntax and an example, significantly augmenting the schema's minimal description. The 'response_format' parameter is also clarified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title and description clearly state that this tool batch-refreshes realtime info for multiple (line, stop) pairs, specifically targeting a 'favourites' dashboard. It is distinct from siblings like bus_get_line_realtime which handles a single line.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly mentions the use case ('favourites dashboard') and implies it is for batch operations in one round-trip, but does not explicitly contrast with single-pair alternatives such as bus_get_line_realtime.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bus_reverse_geocodeReverse geocode GPS to addressARead-onlyIdempotent
Convert WGS-84 lat/lng to a Chinese postal address (province, city, district, township, formatted address).
Useful when you have raw GPS coordinates and need a human-readable place name, or the citycode/adcode to pass to other tools.
Args:
lat (string, required): WGS-84 latitude, decimal, e.g. '31.230416'
lng (string, required): WGS-84 longitude, decimal, e.g. '121.473701'
response_format ('markdown' | 'json')
Returns (json): { "formatted": "上海市黄浦区...", "province": "上海市", "city": "上海市", "district": "黄浦区", "township": "南京东路街道", "citycode": "021", "adcode": "310101" }
For municipalities (Shanghai/Beijing/Tianjin/Chongqing) the upstream emits an empty 'city' value; this tool back-fills it with 'province' so the field is always a usable string.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude, WGS-84, e.g. '31.230416' | |
| lng | Yes | Longitude, WGS-84, e.g. '121.473701' | |
| response_format | No | Output format: 'markdown' for human-readable text, 'json' for full structured data | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and idempotent. The description adds a specific edge case: for municipalities, the upstream emits empty 'city' but the tool back-fills with 'province'. This is valuable beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured: main sentence, usage guide, args list, return structure, special note. No redundant content, front-loaded with key info.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (3 params, flat structure), the description fully covers purpose, parameters, return format, and edge cases. No output schema needed due to detailed return description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds examples, explains coordinate system (WGS-84), and details the response format including the back-fill behavior for city. This greatly enhances parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Convert WGS-84 lat/lng to a Chinese postal address'. The verb 'convert' and resource 'lat/lng to address' are explicit, and the tool is distinct from bus-route siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Useful when you have raw GPS coordinates and need a human-readable place name, or the citycode/adcode to pass to other tools.' Provides clear context, though no exclusion or alternative is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bus_searchSearch lines, stations, and POIsARead-onlyIdempotent
Search inside a city by keyword. Returns matching lines, stations, and POIs in one call.
Use this as the primary entry point when the user gives a line number, station name, or destination name without IDs.
Keyword tip: plain "71", "71路", "地铁2号线", "陆家嘴" all work — the upstream is reasonably forgiving. If a short numeric returns empty, try appending "路".
Coordinate systems:
'pois' coords are GCJ-02 (use directly with bus_plan_transit)
'stations' coords are WGS-84 (use with bus_get_nearby_stops / bus_get_line_realtime) Both are also marked with a 'gpsType' field.
Args:
city_id (string, required): e.g. '034'
keyword (string, required)
response_format ('markdown' | 'json')
Returns (json): { "highlightKey": "71路", "lines": [ { "name": "71", "lineNo": "r95817", "isSubway": false, "directions": [ { "direction": 0, "lineId": "21283603183", "startSn": "延安东路外滩", "endSn": "申昆路枢纽站" }, { "direction": 1, "lineId": "21283603182", "startSn": "申昆路枢纽站", "endSn": "延安东路外滩" } ], // Compat top-level fields mirror directions[0] (or first available). "lineId": "21283603183", "direction": 0, "startSn": "延安东路外滩", "endSn": "申昆路枢纽站" }, ... ], "stations": [{ "sId":"...", "sn":"西藏中路", "lat":31.231006, "lng":121.474316, "gpsType":"wgs", "physicalStId":"...", "namesakeStId":"...", "isSubway":false }, ...], "pois": [{ "name":"71路", "address":"...", "tag":"公交线路", "district":"黄浦区", "lat":31.233021, "lng":121.49073, "gpsType":"gcj" }, ...] }
Line folding: each entry in 'lines' is one logical line (e.g. "71路"). The two travel directions live in 'directions[]'. Pick the lineId matching your desired direction.
Subway hint: when 'isSubway' is true, the entry carries a 'hint' field — bus_get_line_detail will return empty for these lineIds. Use bus_get_stop_detail (metros field) or bus_plan_transit instead.
Follow-ups:
directions[i].lineId → bus_get_line_detail (full stop list, first/last/price) — non-subway only
stations[*].physicalStId + namesakeStId → bus_get_stop_detail (NOTE: a few stations lack physicalStId — typically metro-only entries with subwayV2=1. For those, use bus_get_nearby_stops to resolve the bus platform IDs nearby.)
pois[*].lat/lng (GCJ) → bus_plan_transit as origin/destination
| Name | Required | Description | Default |
|---|---|---|---|
| city_id | Yes | City ID, e.g. '034' | |
| keyword | Yes | Search keyword. Examples: '71', '71路', '地铁2号线', '陆家嘴', '人民广场'. Plain line numbers like '71' work fine. | |
| response_format | No | Output format: 'markdown' for human-readable text, 'json' for full structured data | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint. The description adds critical details: coordinate systems (GCJ-02 for pois, WGS-84 for stations), line folding, subway handling (bus_get_line_detail empty for subways), and special cases for missing station IDs. No contradictions found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections (main usage, keyword tips, coordinate systems, return example, line folding, subway hint, follow-ups). Front-loaded with essential info. Slightly long but every part adds value; minor redundancy in repeating schema's args briefly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (three entity types, coordinate differences, line directions, subway exceptions), the description is extremely thorough. It covers empty results, coordinate usage, line ID selection, subway handling, and follow-up tool usage. No output schema, so the detailed return example compensates perfectly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description significantly enriches parameter meaning: keyword tip (plain numbers, suffixes), city_id example, response_format effect. Also explains return structure in depth, which aids understanding of how parameters affect results.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches by keyword and returns lines, stations, and POIs in one call. It distinguishes itself as the primary entry point for user queries without IDs, setting it apart from siblings like bus_search_more.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises using this as the primary entry point for line numbers, station names, or destinations without IDs. Provides tips for handling empty results (appending '路') and includes a follow-ups section directing to specific tools for each part of the return data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bus_search_moreSearch more results of one categoryARead-onlyIdempotent
Paginated 'see more' for one category from bus_search.
Args:
city_id (string, required)
keyword (string, required): same keyword used in bus_search
type ('1'|'2'|'3'): 1=more lines, 2=more stations, 3=more POIs (default '1')
response_format ('markdown' | 'json')
Returns: same shape as bus_search but only the requested category is populated.
| Name | Required | Description | Default |
|---|---|---|---|
| city_id | Yes | City ID, e.g. '034' | |
| keyword | Yes | Search keyword. Examples: '71', '71路', '地铁2号线', '陆家嘴', '人民广场'. Plain line numbers like '71' work fine. | |
| response_format | No | Output format: 'markdown' for human-readable text, 'json' for full structured data | markdown |
| type | No | Category: '1' more lines, '2' more stations, '3' more POIs | 1 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, establishing safety. The description adds the behavioral detail that the return shape matches bus_search but only the requested category is populated. This goes beyond annotations by clarifying the output structure and relationship to bus_search.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise: one sentence for purpose, then a bulleted list of Args. Every sentence provides essential information. No fluff or redundancy. Front-loaded with the main intent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 4 params, no output schema, and annotations covering safety, the description provides sufficient context: purpose, relationship to bus_search, parameter explanations, and return shape. It lacks explicit pagination mechanism details (e.g., offset/limit) but the 'see more' concept is clear. Overall adequate for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (all parameters described). The description adds context: keyword must be 'same keyword used in bus_search', and explains the type parameter values as 'more lines', 'more stations', 'more POIs'. This adds meaning beyond the schema's examples and enum labels.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool is for paginated 'see more' for one category from bus_search. It identifies the specific verb 'search more' and resource 'results of one category', and distinguishes itself from the main bus_search tool. The sibling tools include bus_search, so the differentiation is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage after bus_search to paginate results for a specific category. It says 'Paginated "see more" for one category from bus_search.' which indicates context of use. However, it does not explicitly state when not to use it or provide alternatives, but the linkage to bus_search is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
15 tool updates
v1.1.0- First observed
bus_get_city_config - First observed
bus_get_line_detail - First observed
bus_get_line_realtime - First observed
bus_get_line_route - First observed
bus_get_my_location - First observed
bus_get_nearby_stops - First observed
bus_get_stop_detail - First observed
bus_get_timetable - First observed
bus_list_cities - First observed
bus_list_line_buses - First observed
bus_plan_transit - First observed
bus_refresh_lines - First observed
bus_reverse_geocode - First observed
bus_search - First observed
bus_search_more
TDQS
Scored across 15 tools
Each tool has a clearly distinct purpose. Overlapping areas like realtime arrivals are split into bus_get_line_realtime (full roster with ETA) and bus_list_line_buses (imminent arrivals), with descriptions explicitly differentiating them. No ambiguous overlap.
All tools follow a consistent 'bus_verb_noun' pattern with snake_case. Minor inconsistency: 'get' vs 'list' prefixes (e.g., bus_get_nearby_stops vs bus_list_cities) but both are clear and predictable.
15 tools is well-scoped for a bus transit data server, covering search, line info, realtime, routing, geocoding, and configuration. Each earns its place without bloat.
The tool surface covers the full lifecycle: search (bus_search), line details (bus_get_line_detail), realtime arrivals (bus_get_line_realtime), nearby stops (bus_get_nearby_stops), stop details (bus_get_stop_detail), route planning (bus_plan_transit), and geocoding (bus_reverse_geocode). No obvious gaps for the stated purpose.
Maintenance
Related MCP Connectors
MCP server for China Railway 12306 ticket availability: schedules and seats by Chinese station name.
MCP server providing attendance data queries via the CloudTime API.
The official Planning Center MCP server for interacting with your ministry's data.
MCP server for Speech-to-Text
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides access to Deutsche Bahn train timetables, station information, and schedule changes through Model Context Protocol tools and resources.44317MIT
- AlicenseCqualityCmaintenanceMCP server for the UK Bus Open Data Service, enabling timetable queries, stop search, route discovery, journey planning, and real-time bus tracking.16MIT
- FlicenseAqualityDmaintenanceMCP server for querying German public transport information, including station search, live departures/arrivals, and journey planning.51-
- FlicenseNot gradedqualityCmaintenanceAn MCP server that provides real-time Hong Kong public transport ETA information.-