Skip to main content
Glama

车来了 MCP

一个基于 MCP 的车来了实时公交服务器,让大语言模型可以查询国内的公交、地铁实时数据 —— 包括线路时刻表、车辆实时位置、附近站点、关键词搜索、以及公交+地铁的换乘路线规划。

回答 "我的公交还有多久到站" 这类问题。无需登录、无需任何账号配置,开箱即用。

npm version Install in Cursor Install in VS Code Install in VS Code Insiders

安装

一键安装

点击上面的徽章即可在 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

工具一览

工具

用途

bus_list_cities

列出支持的城市及其 ID

bus_get_city_config

某城市的刷新间隔限制与展示策略

bus_get_my_location

基于调用方 IP 估算位置(精度到城市级)

bus_reverse_geocode

WGS-84 经纬度 → 中文地址

bus_search

按关键词混合搜索:线路 + 站点 + POI

bus_search_more

按某一分类分页"查看更多"

bus_get_nearby_stops

某 GPS 坐标附近的站点及到站预计时间

bus_get_stop_detail

某站点经过的所有线路 + 附近的地铁

bus_get_line_detail

某线路的完整站点列表 + 当前车辆

bus_get_line_route

某线路的地图轨迹坐标

bus_get_line_realtime

某线路即将到达某站点的车辆实时信息

bus_list_line_buses

某线路上所有车辆的位置与载客率

bus_get_timetable

首末班、发车间隔或完整时刻表

bus_refresh_lines

一次性批量刷新多个 (线路, 站点) 对

bus_plan_transit

两个 GCJ-02 坐标之间的公交+地铁换乘规划

每个工具都支持 response_format: "markdown" | "json"(默认 markdown),返回 JSON 时同时附带 structuredContent

License

MIT

Available Tools

15 tools
bus_get_city_configGet city operating configA
Read-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" } }

ParametersJSON Schema
NameRequiredDescriptionDefault
city_idYesCity ID, e.g. '034' for Shanghai, '027' for Beijing
response_formatNoOutput format: 'markdown' for human-readable text, 'json' for full structured datamarkdown

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)A
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
city_idYes
line_idYeslineId from bus_search.lines / bus_get_nearby_stops.lines
latNo
lngNo
response_formatNoOutput format: 'markdown' for human-readable text, 'json' for full structured datamarkdown

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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) pairA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
city_idYes
line_idYes
target_orderYesOrder 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_idYessId of the waiting stop
latYesWGS-84 latitude. If the user's location is unknown, fall back to the waiting stop's lat (from line_detail.stations[].wgsLat).
lngYesWGS-84 longitude. Fallback to the stop's wgsLng if unknown.
response_formatNoOutput format: 'markdown' for human-readable text, 'json' for full structured datamarkdown

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 coordinatesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
city_idYes
line_idYes
include_shapeNoIf true, include all polyline shape points (often 400-500 per line). Default false returns only stop-marker points.
response_formatNoOutput format: 'markdown' for human-readable text, 'json' for full structured datamarkdown

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 IPA
Read-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:

  1. Call this tool to identify the user's city (match 'city' field against bus_list_cities to get a cityId).

  2. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipNoOptional override IP to look up. Omit to use the mcp server's own outbound IP (i.e. the caller's machine).
response_formatNoOutput format: 'markdown' for human-readable text, 'json' for full structured datamarkdown

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 stopsA
Read-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")

ParametersJSON Schema
NameRequiredDescriptionDefault
city_idYesCity ID, e.g. '034'
latYesWGS-84 latitude
lngYesWGS-84 longitude
limitNoHow many of the nearest stops to return. Default 5 — the upstream may return 15+ and most callers only care about the closest few.
response_formatNoOutput format: 'markdown' for human-readable text, 'json' for full structured datamarkdown

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 linesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
city_idYes
physical_st_idYesphysicalStId of the stop (from bus_get_nearby_stops or bus_search)
namesake_st_idNonamesakeStId of the stop, optional
first_line_idNoOptional hint of a line you want highlighted
latNoCaller's WGS-84 latitude — used to populate 'distance'
lngNoCaller's WGS-84 longitude
response_formatNoOutput format: 'markdown' for human-readable text, 'json' for full structured datamarkdown

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)A
Read-onlyIdempotent

Per-trip departure schedule for a line. The upstream returns one of three modes via mode:

  • 'scheduled' (timeTableType=1): an explicit timetable array 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 — ..." }

ParametersJSON Schema
NameRequiredDescriptionDefault
city_idYes
line_idYes
line_noYesRider-facing short name (search.lines[].name), e.g. '71'. NOT the internal lineNo like 'r95817'.
directionYes
response_formatNoOutput format: 'markdown' for human-readable text, 'json' for full structured datamarkdown

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 citiesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
hot_onlyNoDefault true: return only the upstream-curated 'hot' set (~20 cities). Set false to dump all 480+.
response_formatNoOutput format: 'markdown' for human-readable text, 'json' for full structured datamarkdown

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 lineA
Read-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"} } ] }

ParametersJSON Schema
NameRequiredDescriptionDefault
city_idYes
line_idYes
target_orderYes
station_nameYesDisplay name of the target stop
response_formatNoOutput format: 'markdown' for human-readable text, 'json' for full structured datamarkdown

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 routeA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
city_idYes
origin_nameYesOrigin display name
origin_latYesOrigin latitude in GCJ-02
origin_lngYesOrigin longitude in GCJ-02
dest_nameYesDestination display name
dest_latYesDestination latitude in GCJ-02
dest_lngYesDestination longitude in GCJ-02
strategyNoRouting 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_formatNoOutput format: 'markdown' for human-readable text, 'json' for full structured datamarkdown

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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) pairsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
city_idYes
line_stnYesQuadruple list: lineId,stopId,nextId,targetOrder; separated by ';'. nextId may be empty.
response_formatNoOutput format: 'markdown' for human-readable text, 'json' for full structured datamarkdown

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 addressA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude, WGS-84, e.g. '31.230416'
lngYesLongitude, WGS-84, e.g. '121.473701'
response_formatNoOutput format: 'markdown' for human-readable text, 'json' for full structured datamarkdown

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_search_moreSearch more results of one categoryA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
city_idYesCity ID, e.g. '034'
keywordYesSearch keyword. Examples: '71', '71路', '地铁2号线', '陆家嘴', '人民广场'. Plain line numbers like '71' work fine.
response_formatNoOutput format: 'markdown' for human-readable text, 'json' for full structured datamarkdown
typeNoCategory: '1' more lines, '2' more stations, '3' more POIs1

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 15 tool updatesv1.1.0
    • First observedbus_get_city_config
    • First observedbus_get_line_detail
    • First observedbus_get_line_realtime
    • First observedbus_get_line_route
    • First observedbus_get_my_location
    • First observedbus_get_nearby_stops
    • First observedbus_get_stop_detail
    • First observedbus_get_timetable
    • First observedbus_list_cities
    • First observedbus_list_line_buses
    • First observedbus_plan_transit
    • First observedbus_refresh_lines
    • First observedbus_reverse_geocode
    • First observedbus_search
    • First observedbus_search_more

TDQS

A4.6/5.0

Scored across 15 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers