MCP сервер для доступа к реальным данным общественного транспорта Китая: автобусы и метро. Запросы маршрутов, остановок, расписаний, отслеживание транспорта, планирование поездок. Не требует регист...
bus_get_city_configтолько чтениеидемпотентныйвнешний мир
Получает runtime-конфигурацию города: максимальный интервал опроса и порог времени «прибытия».
Это в основном важно, если вы решаете, как агрессивно обновлять данные, а не для конечных пользователей, задающих вопросы о маршрутах или остановках.
Параметры:
- city_id (строка, обязательный): например, '034' (Шанхай), '027' (Пекин)
- response_format ('markdown' | 'json')
Возвращает (JSON):
{
"maxInterval": 30,
"arrivingStationLimitSeconds": 180,
"busDisplayConfig": { "lineDetail": "time#order#distance", "other": "time#order" }
}
Get city operating config
Получает runtime-конфигурацию города: максимальный интервал опроса и порог времени «прибытия».
Это в основном важно, если вы решаете, как агрессивно обновлять данные, а не для конечных пользователей, задающих вопросы о маршрутах или остановках.
Параметры:
- city_id (строка, обязательный): например, '034' (Шанхай), '027' (Пекин)
- response_format ('markdown' | 'json')
Возвращает (JSON):
{
"maxInterval": 30,
"arrivingStationLimitSeconds": 180,
"busDisplayConfig": { "lineDetail": "time#order#distance", "other": "time#order" }
}
Параметры
city_idstringобязательный
City ID, e.g. '034' for Shanghai, '027' for Beijing
response_formatenum
Output format: 'markdown' for human-readable text, 'json' for full structured data
markdownjson
bus_get_line_detailтолько чтениеидемпотентныйвнешний мир
Полная информация о маршруте: поля, видимые пассажиру (название, цена, время первого и последнего рейса, stationsNum), полный упорядоченный список остановок, lineId обратного направления и все автобусы, которые сейчас на маршруте.
Используйте этот инструмент, а не bus_get_timetable, чтобы ответить на вопросы «работает ли маршрут X?» или «время первого/последнего рейса». Инструмент расписания содержит данные лишь для малой части маршрутов.
Метро НЕ ПОДДЕРЖИВАЕТСЯ. Если bus_search вернул маршрут с isSubway=true (например, lineId=1057 для 地铁2号线), этот эндпоинт возвращает пустой ответ: в ответе будет `empty: true` и поле `hint`, указывающее на bus_get_nearby_stops / bus_plan_transit. Не повторяйте запрос; направляйте запросы к этим инструментам.
Аргументы:
- city_id (string, обязательный)
- line_id (string, обязательный): из bus_search.lines[*].lineId
- lat / lng (string, необязательный): координаты вызывающей стороны в WGS-84
- response_format ('markdown' | 'json')
Возвращает (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": "..." // присутствует только если вышестоящий источник не вернул данных (метро / отменённый маршрут)
}
Каждая остановка содержит:
- 'order' → передаётся в bus_get_line_realtime / bus_list_line_buses как target_order
- 'sId' → передаётся в bus_get_line_realtime как station_id (НЕ в bus_get_stop_detail!)
- 'physicalStId' + 'namesakeStId' → передаётся в bus_get_stop_detail, чтобы увидеть все маршруты через эту остановку.
Get full line detail (stops + live buses)
Полная информация о маршруте: поля, видимые пассажиру (название, цена, время первого и последнего рейса, stationsNum), полный упорядоченный список остановок, lineId обратного направления и все автобусы, которые сейчас на маршруте.
Используйте этот инструмент, а не bus_get_timetable, чтобы ответить на вопросы «работает ли маршрут X?» или «время первого/последнего рейса». Инструмент расписания содержит данные лишь для малой части маршрутов.
Метро НЕ ПОДДЕРЖИВАЕТСЯ. Если bus_search вернул маршрут с isSubway=true (например, lineId=1057 для 地铁2号线), этот эндпоинт возвращает пустой ответ: в ответе будет `empty: true` и поле `hint`, указывающее на bus_get_nearby_stops / bus_plan_transit. Не повторяйте запрос; направляйте запросы к этим инструментам.
Аргументы:
- city_id (string, обязательный)
- line_id (string, обязательный): из bus_search.lines[*].lineId
- lat / lng (string, необязательный): координаты вызывающей стороны в WGS-84
- response_format ('markdown' | 'json')
Возвращает (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": "..." // присутствует только если вышестоящий источник не вернул данных (метро / отменённый маршрут)
}
Каждая остановка содержит:
- 'order' → передаётся в bus_get_line_realtime / bus_list_line_buses как target_order
- 'sId' → передаётся в bus_get_line_realtime как station_id (НЕ в bus_get_stop_detail!)
- 'physicalStId' + 'namesakeStId' → передаётся в bus_get_stop_detail, чтобы увидеть все маршруты через эту остановку.
Параметры
city_idstringобязательный
line_idstringобязательный
lineId from bus_search.lines / bus_get_nearby_stops.lines
latstring
lngstring
response_formatenum
Output format: 'markdown' for human-readable text, 'json' for full structured data
markdownjson
bus_get_line_realtimeтолько чтениеидемпотентныйвнешний мир
_format ('markdown' | 'json') - не переводим 'markdown' и 'json', это названия форматов.
Весь текст переводим, сохраняя структуру, абзацы, форматирование (жирный шрифт, списки).Пример перевода:
Канонический инструмент «когда приедет мой автобус». Возвращает все автобусы, находящиеся в данный момент на линии, при этом ближайший к остановке ожидания содержит ETA.
**Важно**: вышестоящий сервис прогнозирует ETA только для ближайшего автобуса, следующего к вашей остановке. Автобусы дальше по маршруту возвращаются (с позицией/скоростью/заполненностью), но их поле `eta` равно null. Это не ошибка.
**Аргументы**:
- city_id (строка, обязательный)
- line_id (строка, обязательный): из bus_search
- target_order (строка, обязательный): порядковый номер остановки ожидания на линии. Источник: bus_get_line_detail.stations[i].order или bus_get_nearby_stops.stops[].lines[].targetOrder.
- station_id (строка, обязательный): sId остановки ожидания
- lat / lng (строка, обязательный): WGS-84 - лучше всего использовать местоположение пользователя; если недоступно, используйте wgsLat/wgsLng остановки ожидания (из line_detail.stations[i]).
- response_format ('markdown' | 'json')
Возвращает (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": "..."
}
Примечания к полям:
- Вложенный объект 'line' намеренно не включает startSn - вышестоящий сервис не возвращает его на этой конечной точке. При необходимости получите его из bus_get_line_detail.
- eta.travelTime — оставшиеся секунды
- eta.arrivalTime — метка времени в миллисекундах
- eta.displayTime — подсказка от вышестоящего сервиса в формате «ЧЧ:ММ»
- capacity: 0=свободно, 1=умеренно, 2=многолюдно
Здесь я использовал длинное тире в последних пунктах, но в правиле запрещено. Исправим: заменим на дефис или двоеточие. Лучше использовать дефис: "eta.travelTime - оставшиеся секунды" и т.д. В первом пункте уже заменил. Также в "displayTime — подсказка" заменим на дефис.
Итоговый вариант с дефисами:
Канонический инструмент «когда приедет мой автобус». Возвращает все автобусы, находящиеся в данный момент на линии, при этом ближайший к остановке ожидания содержит ETA.
**Важно**: вышестоящий сервис прогнозирует ETA только для ближайшего автобуса, следующего к вашей остановке. Автобусы дальше по маршруту возвращаются (с позицией/скоростью/заполненностью), но их поле `eta` равно null. Это не ошибка.
**Аргументы**:
- city_id (строка, обязательный)
- line_id (строка, обязательный): из bus_search
- target_order (строка, обязательный): порядковый номер остановки ожидания на линии. Источник: bus_get_line_detail.stations[i].order или bus_get_nearby_stops.stops[].lines[].targetOrder.
- station_id (строка, обязательный): sId остановки ожидания
- lat / lng (строка, обязательный): WGS-84 - лучше всего использовать местоположение пользователя; если недоступно, используйте wgsLat/wgsLng остановки ожидания (из line_detail.stations[i]).
- response_format ('markdown' | 'json')
Возвращает (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": "..."
}
Примечания к полям:
- Вложенный объект 'line' намеренно не включает startSn - вышестоящий сервис не возвращает его на этой конечной точке. При необходимости получите его из bus_get_line_detail.
- eta.travelTime - оставшиеся секунды
- eta.arrivalTime - метка времени в миллисекундах
- eta.displayTime - подсказка от вышестоящего сервиса в формате «ЧЧ:ММ»
- capacity: 0=свободно, 1=умеренно, 2=многолюдно
Все хорошо. Только в последнем пункте capacity: 0=... - не переводим capacity (это имя поля), а значения переводим. Оригинал: "capacity: 0=light, 1=moderate, 2=crowded". Перевел как "0=свободно, 1=умеренно, 2=многолюдно". Можно "свободно/умеренно/заполнено", но "crowded" скорее "многолюдно". Оставим.
Проверяем на соответствие правилам: нет длинных тире (использовал дефис), нет оборотов-калек, нет "является", "данный" и т.д. Глаголы: "Возвращает", "прогнозирует", "используйте" (повелительное, но в инструкции норм). В описании инструмента в начале "Возвращает" - 3 лицо ед.ч. наст.вр. - верно.
Итоговый перевод готов.Канонический инструмент «когда приедет мой автобус». Возвращает все автобусы, находящиеся в данный момент на линии, при этом ближайший к остановке ожидания содержит ETA.
**Важно**: вышестоящий сервис прогнозирует ETA только для ближайшего автобуса, следующего к вашей остановке. Автобусы дальше по маршруту возвращаются (с позицией/скоростью/заполненностью), но их поле `eta` равно null. Это не ошибка.
**Аргументы**:
- city_id (строка, обязательный)
- line_id (строка, обязательный): из bus_search
- target_order (строка, обязательный): порядковый номер остановки ожидания на линии. Источник: bus_get_line_detail.stations[i].order или bus_get_nearby_stops.stops[].lines[].targetOrder.
- station_id (строка, обязательный): sId остановки ожидания
- lat / lng (строка, обязательный): WGS-84 - лучше всего использовать местоположение пользователя; если недоступно, используйте wgsLat/wgsLng остановки ожидания (из line_detail.stations[i]).
- response_format ('markdown' | 'json')
Возвращает (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": "..."
}
Примечания к полям:
- Вложенный объект 'line' намеренно не включает startSn - вышестоящий сервис не возвращает его на этой конечной точке. При необходимости получите его из bus_get_line_detail.
- eta.travelTime - оставшиеся секунды
- eta.arrivalTime - метка времени в миллисекундах
- eta.displayTime - подсказка от вышестоящего сервиса в формате «ЧЧ:ММ»
- capacity: 0=свободно, 1=умеренно, 2=многолюдно
Get realtime buses for a (line, stop) pair
_format ('markdown' | 'json') - не переводим 'markdown' и 'json', это названия форматов.
Весь текст переводим, сохраняя структуру, абзацы, форматирование (жирный шрифт, списки).Пример перевода:
Канонический инструмент «когда приедет мой автобус». Возвращает все автобусы, находящиеся в данный момент на линии, при этом ближайший к остановке ожидания содержит ETA.
**Важно**: вышестоящий сервис прогнозирует ETA только для ближайшего автобуса, следующего к вашей остановке. Автобусы дальше по маршруту возвращаются (с позицией/скоростью/заполненностью), но их поле `eta` равно null. Это не ошибка.
**Аргументы**:
- city_id (строка, обязательный)
- line_id (строка, обязательный): из bus_search
- target_order (строка, обязательный): порядковый номер остановки ожидания на линии. Источник: bus_get_line_detail.stations[i].order или bus_get_nearby_stops.stops[].lines[].targetOrder.
- station_id (строка, обязательный): sId остановки ожидания
- lat / lng (строка, обязательный): WGS-84 - лучше всего использовать местоположение пользователя; если недоступно, используйте wgsLat/wgsLng остановки ожидания (из line_detail.stations[i]).
- response_format ('markdown' | 'json')
Возвращает (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": "..."
}
Примечания к полям:
- Вложенный объект 'line' намеренно не включает startSn - вышестоящий сервис не возвращает его на этой конечной точке. При необходимости получите его из bus_get_line_detail.
- eta.travelTime — оставшиеся секунды
- eta.arrivalTime — метка времени в миллисекундах
- eta.displayTime — подсказка от вышестоящего сервиса в формате «ЧЧ:ММ»
- capacity: 0=свободно, 1=умеренно, 2=многолюдно
Здесь я использовал длинное тире в последних пунктах, но в правиле запрещено. Исправим: заменим на дефис или двоеточие. Лучше использовать дефис: "eta.travelTime - оставшиеся секунды" и т.д. В первом пункте уже заменил. Также в "displayTime — подсказка" заменим на дефис.
Итоговый вариант с дефисами:
Канонический инструмент «когда приедет мой автобус». Возвращает все автобусы, находящиеся в данный момент на линии, при этом ближайший к остановке ожидания содержит ETA.
**Важно**: вышестоящий сервис прогнозирует ETA только для ближайшего автобуса, следующего к вашей остановке. Автобусы дальше по маршруту возвращаются (с позицией/скоростью/заполненностью), но их поле `eta` равно null. Это не ошибка.
**Аргументы**:
- city_id (строка, обязательный)
- line_id (строка, обязательный): из bus_search
- target_order (строка, обязательный): порядковый номер остановки ожидания на линии. Источник: bus_get_line_detail.stations[i].order или bus_get_nearby_stops.stops[].lines[].targetOrder.
- station_id (строка, обязательный): sId остановки ожидания
- lat / lng (строка, обязательный): WGS-84 - лучше всего использовать местоположение пользователя; если недоступно, используйте wgsLat/wgsLng остановки ожидания (из line_detail.stations[i]).
- response_format ('markdown' | 'json')
Возвращает (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": "..."
}
Примечания к полям:
- Вложенный объект 'line' намеренно не включает startSn - вышестоящий сервис не возвращает его на этой конечной точке. При необходимости получите его из bus_get_line_detail.
- eta.travelTime - оставшиеся секунды
- eta.arrivalTime - метка времени в миллисекундах
- eta.displayTime - подсказка от вышестоящего сервиса в формате «ЧЧ:ММ»
- capacity: 0=свободно, 1=умеренно, 2=многолюдно
Все хорошо. Только в последнем пункте capacity: 0=... - не переводим capacity (это имя поля), а значения переводим. Оригинал: "capacity: 0=light, 1=moderate, 2=crowded". Перевел как "0=свободно, 1=умеренно, 2=многолюдно". Можно "свободно/умеренно/заполнено", но "crowded" скорее "многолюдно". Оставим.
Проверяем на соответствие правилам: нет длинных тире (использовал дефис), нет оборотов-калек, нет "является", "данный" и т.д. Глаголы: "Возвращает", "прогнозирует", "используйте" (повелительное, но в инструкции норм). В описании инструмента в начале "Возвращает" - 3 лицо ед.ч. наст.вр. - верно.
Итоговый перевод готов.Канонический инструмент «когда приедет мой автобус». Возвращает все автобусы, находящиеся в данный момент на линии, при этом ближайший к остановке ожидания содержит ETA.
**Важно**: вышестоящий сервис прогнозирует ETA только для ближайшего автобуса, следующего к вашей остановке. Автобусы дальше по маршруту возвращаются (с позицией/скоростью/заполненностью), но их поле `eta` равно null. Это не ошибка.
**Аргументы**:
- city_id (строка, обязательный)
- line_id (строка, обязательный): из bus_search
- target_order (строка, обязательный): порядковый номер остановки ожидания на линии. Источник: bus_get_line_detail.stations[i].order или bus_get_nearby_stops.stops[].lines[].targetOrder.
- station_id (строка, обязательный): sId остановки ожидания
- lat / lng (строка, обязательный): WGS-84 - лучше всего использовать местоположение пользователя; если недоступно, используйте wgsLat/wgsLng остановки ожидания (из line_detail.stations[i]).
- response_format ('markdown' | 'json')
Возвращает (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": "..."
}
Примечания к полям:
- Вложенный объект 'line' намеренно не включает startSn - вышестоящий сервис не возвращает его на этой конечной точке. При необходимости получите его из bus_get_line_detail.
- eta.travelTime - оставшиеся секунды
- eta.arrivalTime - метка времени в миллисекундах
- eta.displayTime - подсказка от вышестоящего сервиса в формате «ЧЧ:ММ»
- capacity: 0=свободно, 1=умеренно, 2=многолюдно
Параметры
city_idstringобязательный
line_idstringобязательный
target_orderstringобязательный
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_idstringобязательный
sId of the waiting stop
latstringобязательный
WGS-84 latitude. If the user's location is unknown, fall back to the waiting stop's lat (from line_detail.stations[].wgsLat).
lngstringобязательный
WGS-84 longitude. Fallback to the stop's wgsLng if unknown.
response_formatenum
Output format: 'markdown' for human-readable text, 'json' for full structured data
markdownjson
bus_get_line_routeтолько чтениеидемпотентныйвнешний мир
Координаты ломаной линии для отрисовки маршрута на карте. Точки с 'stopOrder' — это реальные остановки; остальные — промежуточные точки между остановками.
Аргументы:
- city_id (строка, обязательно)
- line_id (строка, обязательно)
- include_shape (логический, по умолчанию false): false возвращает только маркеры остановок (~25 точек); true возвращает все точки ломаной (~400–500). Пропускайте, если вам не нужно отрисовывать линию.
- response_format ('markdown' | 'json')
Возвращает (json):
{
"pointCount": 480, // общее количество точек ломаной, полученных от сервера
"stopCount": 23, // количество маркеров остановок среди них
"points": [{ "lat":..., "lng":..., "stopOrder":1 }, ...]
}
'points' — это отфильтрованный список: по умолчанию только остановки, полная ломаная при include_shape=true.
**Известное ограничение**: сервер иногда пропускает конечную остановку из ломаной, поэтому 'stopCount' может быть на единицу меньше, чем 'stationsNum' в bus_get_line_detail (например, 23 вместо 24). Доверяйте bus_get_line_detail для получения авторитетного списка остановок; line_route предназначен только для отрисовки.
Режим markdown только суммирует количество; запрашивайте JSON для чтения координат.
Get line polyline coordinates
Координаты ломаной линии для отрисовки маршрута на карте. Точки с 'stopOrder' — это реальные остановки; остальные — промежуточные точки между остановками.
Аргументы:
- city_id (строка, обязательно)
- line_id (строка, обязательно)
- include_shape (логический, по умолчанию false): false возвращает только маркеры остановок (~25 точек); true возвращает все точки ломаной (~400–500). Пропускайте, если вам не нужно отрисовывать линию.
- response_format ('markdown' | 'json')
Возвращает (json):
{
"pointCount": 480, // общее количество точек ломаной, полученных от сервера
"stopCount": 23, // количество маркеров остановок среди них
"points": [{ "lat":..., "lng":..., "stopOrder":1 }, ...]
}
'points' — это отфильтрованный список: по умолчанию только остановки, полная ломаная при include_shape=true.
**Известное ограничение**: сервер иногда пропускает конечную остановку из ломаной, поэтому 'stopCount' может быть на единицу меньше, чем 'stationsNum' в bus_get_line_detail (например, 23 вместо 24). Доверяйте bus_get_line_detail для получения авторитетного списка остановок; line_route предназначен только для отрисовки.
Режим markdown только суммирует количество; запрашивайте JSON для чтения координат.
Параметры
city_idstringобязательный
line_idstringобязательный
include_shapeboolean
If true, include all polyline shape points (often 400-500 per line). Default false returns only stop-marker points.
response_formatenum
Output format: 'markdown' for human-readable text, 'json' for full structured data
markdownjson
bus_get_my_locationтолько чтениеидемпотентныйвнешний мир
_format и ip — не переводим. JSON в возврате можно оставить как есть с переводом строки precision. Но в примере показан ответ на английском: "city-level (~10 km); not suitable for stop-level queries". Я переведу саму строку в описании, но можно сохранить оригинал. Решу перевести, чтобы было последовательно.
Теперь запишем._format ('markdown' | 'json') — это аргумент, его оставляем без перевода. "Args:" переводим как "Аргументы:". "Returns (json):" как "Возвращает (json):". JSON-структуру переведём, но ключи оставим английскими, значения переведём (кроме имен собственных). В примере city "上海" — это китайский, не трогаем. region "上海市" — тоже. country "中国" — тоже. ip "116.236.0.1" — оставляем. isp "China Telecom" — оставляем (название провайдера). precision переведём.
Пункты в "Caveats" — каждый с дефисом, сохраним формат.
Рекомендуемый workflow — с цифрами 1 и 2, сохраняем.
Также не забываем про выделение **жирным** — сохраняем.
При переводе используем дефис вместо длинного тире, как предписано.
Теперь напишем полный перевод._format в оригинале в кавычках — оставим._format ('markdown' | 'json') — в оригинале так и есть, переведём только слово "response_format"? Нет, это имя параметра, не переводим. Оставляем как есть.
Итоговый текст:
Определяет примерное местоположение вызывающего по его публичному IP — полезно, когда пользователь спрашивает «что рядом со мной», не указывая координаты.
**Точность на уровне города (обычно несколько километров).** Достаточно, чтобы определить город и дать bus_get_nearby_stops начальное приближение. НЕ достаточно точная, чтобы найти фактическую остановку пользователя — для этого запросите ориентир/адрес и уточните его через bus_search.
Ограничения:
- Определяет через ip-api.com (бесплатный тариф; ограничение по частоте запросов, но без авторизации).
- VPN / корпоративный прокси -> результат отражает IP точки выхода прокси, а не пользователя.
- Мобильные IP часто попадают на региональный центр.
Аргументы:
- ip (string, optional): конкретный IPv4/IPv6 для поиска. Опустите, чтобы использовать внешний IP процесса mcp-сервера (= машина вызывающего при локальном запуске).
- response_format ('markdown' | 'json')
Возвращает (json):
{
"lat": 31.2222,
"lng": 121.4581,
"gpsType": "wgs",
"city": "上海",
"region": "上海市",
"country": "中国",
"ip": "116.236.0.1",
"isp": "China Telecom",
"precision": "городской уровень (~10 км); не подходит для запросов на уровне остановок"
}
**Рекомендуемый порядок действий**:
1. Вызовите этот инструмент, чтобы определить город пользователя (сопоставьте поле 'city' с bus_list_cities, чтобы получить cityId).
2. Передайте lat/lng в bus_get_nearby_stops для примерного списка ближайших объектов, ИЛИ попросите пользователя подтвердить ориентир и используйте bus_search.pois для более точных координат.
Проверим на соответствие правилам: нет канцелярита, нет "является", "представляет собой", активные конструкции. Используем дефис вместо длинного тире (в тексте есть тире в первом предложении и в "НЕ достаточно точная — для этого", заменим на дефис). В оригинале использовано длинное тире? В английском там дефис или тире? В первом предложении: "useful when... without providing coordinates" — нет тире, а просто запятая. В переводе я поставил длинное тире. По правилам нужно заменить на дефис. Исправим: "полезно, когда пользователь спрашивает «что рядом со мной», не указывая координаты" — запятая. Во втором абзаце: "Good enough to... NOT precise enough — for that, ask..." — в английском там тире. В переводе: "Достаточно, чтобы определить город и дать... НЕ достаточно точная — для этого запросите..." — заменим тире на дефис или запятую. Лучше дефис: "НЕ достаточно точная - для этого запросите". В пунктах с VPN: -> заменим на дефис. У нас уже написано "VPN / корпоративный прокси -> результат..." — это стрелка, её можно оставить, но можно заменить на дефис. Оставим стрелку, она не тире. А в «Caveats:» двоеточие оставим.
Также в конце "Rough nearby list" переведено как "примерного списка ближайших объектов". В оригинале "rough nearby list" — это список ближайших (остановок?), но bus_get_nearby_stops возвращает остановки, так что "списка ближайших остановок" точнее, но в описании не указано, что именно возвращает bus_get_nearby_stops. В оригинале просто "for a rough nearby list". Можно перевести "для примерного списка ближайших объектов", но лучше "для примерного списка ближайших остановок" — так как bus_get_nearby_stops по названию для остановок. Оставим нейтрально "ближайших объектов" или можно "ближайших мест". Я выберу "ближайших остановок", так как контекст про транспорт. Но осторожно: в оригинале не сказано stops, но упоминается bus_get_nearby_stops, что подразумевает остановки. Решу так.
Исправляем длинное тире на дефис. Итоговый вариант._format оставляем без перевода, аргумент ip (string, optional) — скобки и текст переведён.
Также в первом предложении "caller's approximate location" — "примерное местоположение вызывающего". Можно также "вызывающего пользователя", но достаточно "вызывающего".
Проверим ещё раз все правила._format — техническое название, не переводим. ip-api.com — не переводим. mcp server — не переводим. bus_list_cities, bus_get_nearby_stops, bus_search.pois — не переводим. Все ЗАГЛАВНЫЕ выделения (PRECISION) — у нас в оригинале было **NOT precise enough** — переведено как "НЕ достаточно точная" с заглавными? В оригинале NOT написано заглавными. В переводе я написал "НЕ" заглавными — это правильно.
Ещё: в "response_format ('markdown' | 'json')" в оригинале кавычки одинарные, оставляем. В тексте аргумента ip в оригинале "(string, optional)" — скобки и запятые сохраняем.
Глаголы: "Определяет", "Достаточно", "Определяет", "попадают" — всё в 3-м лице.
В инструкциях пользователю: "вызовите", "передайте", "попросите" — повелительное наклонение, что уместно.
Всё._format переводить не нужно, это имя параметра.
Теперь напишем конечный ответ, без лишних комментариев._formatОпределяет примерное местоположение вызывающего по его публичному IP - полезно, когда пользователь спрашивает «что рядом со мной», не указывая координаты.
**Точность на уровне города (обычно несколько километров).** Достаточно, чтобы определить город и дать bus_get_nearby_stops начальное приближение. НЕ достаточно точная - для этого запросите ориентир/адрес и уточните его через bus_search.
Ограничения:
- Определяет через ip-api.com (бесплатный тариф; ограничение по частоте запросов, но без авторизации).
- VPN / корпоративный прокси -> результат отражает IP точки выхода прокси, а не пользователя.
- Мобильные IP часто попадают на региональный центр.
Аргументы:
- ip (string, optional): конкретный IPv4/IPv6 для поиска. Опустите, чтобы использовать внешний IP процесса mcp-сервера (= машина вызывающего при локальном запуске).
- response_format ('markdown' | 'json')
Возвращает (json):
{
"lat": 31.2222,
"lng": 121.4581,
"gpsType": "wgs",
"city": "上海",
"region": "上海市",
"country": "中国",
"ip": "116.236.0.1",
"isp": "China Telecom",
"precision": "городской уровень (~10 км); не подходит для запросов на уровне остановок"
}
**Рекомендуемый порядок действий**:
1. Вызовите этот инструмент, чтобы определить город пользователя (сопоставьте поле 'city' с bus_list_cities, чтобы получить cityId).
2. Передайте lat/lng в bus_get_nearby_stops для примерного списка ближайших остановок, ИЛИ попросите пользователя подтвердить ориентир и используйте bus_search.pois для более точных координат.
Get the caller's approximate location via IP
_format и ip — не переводим. JSON в возврате можно оставить как есть с переводом строки precision. Но в примере показан ответ на английском: "city-level (~10 km); not suitable for stop-level queries". Я переведу саму строку в описании, но можно сохранить оригинал. Решу перевести, чтобы было последовательно.
Теперь запишем._format ('markdown' | 'json') — это аргумент, его оставляем без перевода. "Args:" переводим как "Аргументы:". "Returns (json):" как "Возвращает (json):". JSON-структуру переведём, но ключи оставим английскими, значения переведём (кроме имен собственных). В примере city "上海" — это китайский, не трогаем. region "上海市" — тоже. country "中国" — тоже. ip "116.236.0.1" — оставляем. isp "China Telecom" — оставляем (название провайдера). precision переведём.
Пункты в "Caveats" — каждый с дефисом, сохраним формат.
Рекомендуемый workflow — с цифрами 1 и 2, сохраняем.
Также не забываем про выделение **жирным** — сохраняем.
При переводе используем дефис вместо длинного тире, как предписано.
Теперь напишем полный перевод._format в оригинале в кавычках — оставим._format ('markdown' | 'json') — в оригинале так и есть, переведём только слово "response_format"? Нет, это имя параметра, не переводим. Оставляем как есть.
Итоговый текст:
Определяет примерное местоположение вызывающего по его публичному IP — полезно, когда пользователь спрашивает «что рядом со мной», не указывая координаты.
**Точность на уровне города (обычно несколько километров).** Достаточно, чтобы определить город и дать bus_get_nearby_stops начальное приближение. НЕ достаточно точная, чтобы найти фактическую остановку пользователя — для этого запросите ориентир/адрес и уточните его через bus_search.
Ограничения:
- Определяет через ip-api.com (бесплатный тариф; ограничение по частоте запросов, но без авторизации).
- VPN / корпоративный прокси -> результат отражает IP точки выхода прокси, а не пользователя.
- Мобильные IP часто попадают на региональный центр.
Аргументы:
- ip (string, optional): конкретный IPv4/IPv6 для поиска. Опустите, чтобы использовать внешний IP процесса mcp-сервера (= машина вызывающего при локальном запуске).
- response_format ('markdown' | 'json')
Возвращает (json):
{
"lat": 31.2222,
"lng": 121.4581,
"gpsType": "wgs",
"city": "上海",
"region": "上海市",
"country": "中国",
"ip": "116.236.0.1",
"isp": "China Telecom",
"precision": "городской уровень (~10 км); не подходит для запросов на уровне остановок"
}
**Рекомендуемый порядок действий**:
1. Вызовите этот инструмент, чтобы определить город пользователя (сопоставьте поле 'city' с bus_list_cities, чтобы получить cityId).
2. Передайте lat/lng в bus_get_nearby_stops для примерного списка ближайших объектов, ИЛИ попросите пользователя подтвердить ориентир и используйте bus_search.pois для более точных координат.
Проверим на соответствие правилам: нет канцелярита, нет "является", "представляет собой", активные конструкции. Используем дефис вместо длинного тире (в тексте есть тире в первом предложении и в "НЕ достаточно точная — для этого", заменим на дефис). В оригинале использовано длинное тире? В английском там дефис или тире? В первом предложении: "useful when... without providing coordinates" — нет тире, а просто запятая. В переводе я поставил длинное тире. По правилам нужно заменить на дефис. Исправим: "полезно, когда пользователь спрашивает «что рядом со мной», не указывая координаты" — запятая. Во втором абзаце: "Good enough to... NOT precise enough — for that, ask..." — в английском там тире. В переводе: "Достаточно, чтобы определить город и дать... НЕ достаточно точная — для этого запросите..." — заменим тире на дефис или запятую. Лучше дефис: "НЕ достаточно точная - для этого запросите". В пунктах с VPN: -> заменим на дефис. У нас уже написано "VPN / корпоративный прокси -> результат..." — это стрелка, её можно оставить, но можно заменить на дефис. Оставим стрелку, она не тире. А в «Caveats:» двоеточие оставим.
Также в конце "Rough nearby list" переведено как "примерного списка ближайших объектов". В оригинале "rough nearby list" — это список ближайших (остановок?), но bus_get_nearby_stops возвращает остановки, так что "списка ближайших остановок" точнее, но в описании не указано, что именно возвращает bus_get_nearby_stops. В оригинале просто "for a rough nearby list". Можно перевести "для примерного списка ближайших объектов", но лучше "для примерного списка ближайших остановок" — так как bus_get_nearby_stops по названию для остановок. Оставим нейтрально "ближайших объектов" или можно "ближайших мест". Я выберу "ближайших остановок", так как контекст про транспорт. Но осторожно: в оригинале не сказано stops, но упоминается bus_get_nearby_stops, что подразумевает остановки. Решу так.
Исправляем длинное тире на дефис. Итоговый вариант._format оставляем без перевода, аргумент ip (string, optional) — скобки и текст переведён.
Также в первом предложении "caller's approximate location" — "примерное местоположение вызывающего". Можно также "вызывающего пользователя", но достаточно "вызывающего".
Проверим ещё раз все правила._format — техническое название, не переводим. ip-api.com — не переводим. mcp server — не переводим. bus_list_cities, bus_get_nearby_stops, bus_search.pois — не переводим. Все ЗАГЛАВНЫЕ выделения (PRECISION) — у нас в оригинале было **NOT precise enough** — переведено как "НЕ достаточно точная" с заглавными? В оригинале NOT написано заглавными. В переводе я написал "НЕ" заглавными — это правильно.
Ещё: в "response_format ('markdown' | 'json')" в оригинале кавычки одинарные, оставляем. В тексте аргумента ip в оригинале "(string, optional)" — скобки и запятые сохраняем.
Глаголы: "Определяет", "Достаточно", "Определяет", "попадают" — всё в 3-м лице.
В инструкциях пользователю: "вызовите", "передайте", "попросите" — повелительное наклонение, что уместно.
Всё._format переводить не нужно, это имя параметра.
Теперь напишем конечный ответ, без лишних комментариев._formatОпределяет примерное местоположение вызывающего по его публичному IP - полезно, когда пользователь спрашивает «что рядом со мной», не указывая координаты.
**Точность на уровне города (обычно несколько километров).** Достаточно, чтобы определить город и дать bus_get_nearby_stops начальное приближение. НЕ достаточно точная - для этого запросите ориентир/адрес и уточните его через bus_search.
Ограничения:
- Определяет через ip-api.com (бесплатный тариф; ограничение по частоте запросов, но без авторизации).
- VPN / корпоративный прокси -> результат отражает IP точки выхода прокси, а не пользователя.
- Мобильные IP часто попадают на региональный центр.
Аргументы:
- ip (string, optional): конкретный IPv4/IPv6 для поиска. Опустите, чтобы использовать внешний IP процесса mcp-сервера (= машина вызывающего при локальном запуске).
- response_format ('markdown' | 'json')
Возвращает (json):
{
"lat": 31.2222,
"lng": 121.4581,
"gpsType": "wgs",
"city": "上海",
"region": "上海市",
"country": "中国",
"ip": "116.236.0.1",
"isp": "China Telecom",
"precision": "городской уровень (~10 км); не подходит для запросов на уровне остановок"
}
**Рекомендуемый порядок действий**:
1. Вызовите этот инструмент, чтобы определить город пользователя (сопоставьте поле 'city' с bus_list_cities, чтобы получить cityId).
2. Передайте lat/lng в bus_get_nearby_stops для примерного списка ближайших остановок, ИЛИ попросите пользователя подтвердить ориентир и используйте bus_search.pois для более точных координат.
Параметры
ipstring
Optional override IP to look up. Omit to use the mcp server's own outbound IP (i.e. the caller's machine).
response_formatenum
Output format: 'markdown' for human-readable text, 'json' for full structured data
markdownjson
bus_get_nearby_stopsтолько чтениеидемпотентныйвнешний мир
Перечисляет остановки автобусов рядом с координатой WGS-84 GPS, каждая с указанием проходящих маршрутов и приближающихся автобусов в реальном времени.
**Если у вас нет координат**: сначала вызовите bus_get_my_location (точность до города по IP) или спросите у пользователя ориентир и определите его через bus_search.pois — полученные lat/lng передавайте в аргументы lat/lng этого инструмента.
Аргументы:
- city_id (строка, обязательный): например '034'
- lat / lng (строка, обязательный): десятичные координаты WGS-84
- limit (число, по умолчанию 5): сколько ближайших остановок вернуть (максимум 20)
- response_format ('markdown' | 'json')
Возвращает (json):
{
"stops": [
{
"sId": "021-15232", "sn": "西藏中路", "distance": 87, "isSubway": false,
"physicalStId": "...", "namesakeStId": "...", "firstLineId": "...",
"lines": [
{
"lineId": "...", "name": "71", "direction": 0, "endSn": "...",
"status": "等待发车" | "不在运营时间" | "" (активен),
"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" }] } ]
}
]
}
Примечания по полям:
- buses[].arrivalTime — метка времени в мс; -1 = неизвестно
- buses[].travelTime — оставшееся время в секундах; -1 = неизвестно
- buses[].capacity: 0 = свободно, 1 = умеренно, 2 = тесно
- Если автобусов в реальном времени нет, но маршрут скоро отправляется, 'preArrivalTime' содержит следующее прогнозируемое время отправки ("10:12")
Get nearby bus stops
Перечисляет остановки автобусов рядом с координатой WGS-84 GPS, каждая с указанием проходящих маршрутов и приближающихся автобусов в реальном времени.
**Если у вас нет координат**: сначала вызовите bus_get_my_location (точность до города по IP) или спросите у пользователя ориентир и определите его через bus_search.pois — полученные lat/lng передавайте в аргументы lat/lng этого инструмента.
Аргументы:
- city_id (строка, обязательный): например '034'
- lat / lng (строка, обязательный): десятичные координаты WGS-84
- limit (число, по умолчанию 5): сколько ближайших остановок вернуть (максимум 20)
- response_format ('markdown' | 'json')
Возвращает (json):
{
"stops": [
{
"sId": "021-15232", "sn": "西藏中路", "distance": 87, "isSubway": false,
"physicalStId": "...", "namesakeStId": "...", "firstLineId": "...",
"lines": [
{
"lineId": "...", "name": "71", "direction": 0, "endSn": "...",
"status": "等待发车" | "不在运营时间" | "" (активен),
"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" }] } ]
}
]
}
Примечания по полям:
- buses[].arrivalTime — метка времени в мс; -1 = неизвестно
- buses[].travelTime — оставшееся время в секундах; -1 = неизвестно
- buses[].capacity: 0 = свободно, 1 = умеренно, 2 = тесно
- Если автобусов в реальном времени нет, но маршрут скоро отправляется, 'preArrivalTime' содержит следующее прогнозируемое время отправки ("10:12")
Параметры
city_idstringобязательный
City ID, e.g. '034'
latstringобязательный
WGS-84 latitude
lngstringобязательный
WGS-84 longitude
limitinteger
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_formatenum
Output format: 'markdown' for human-readable text, 'json' for full structured data
markdownjson
bus_get_stop_detailтолько чтениеидемпотентныйвнешний мир
Полная информация об остановке: точные координаты WGS-84, все проходящие маршруты (с указанием первого/последнего рейса и цены), автобусы в реальном времени и ближайшие станции метро.
Аргументы:
- city_id (string, required)
- physical_st_id (string, required): из bus_get_nearby_stops / bus_search
- namesake_st_id (string, optional): рекомендуется; из того же источника
- first_line_id (string, optional): линия, которую нужно выделить
- lat / lng (string, optional): местоположение вызывающей стороны в WGS-84, используется для заполнения 'distance'
- response_format ('markdown' | 'json')
Возвращает (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" }] }
]
}
Несколько записей в stations[] означают, что название остановки соответствует нескольким физическим платформам.
Get stop detail with all lines
Полная информация об остановке: точные координаты WGS-84, все проходящие маршруты (с указанием первого/последнего рейса и цены), автобусы в реальном времени и ближайшие станции метро.
Аргументы:
- city_id (string, required)
- physical_st_id (string, required): из bus_get_nearby_stops / bus_search
- namesake_st_id (string, optional): рекомендуется; из того же источника
- first_line_id (string, optional): линия, которую нужно выделить
- lat / lng (string, optional): местоположение вызывающей стороны в WGS-84, используется для заполнения 'distance'
- response_format ('markdown' | 'json')
Возвращает (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" }] }
]
}
Несколько записей в stations[] означают, что название остановки соответствует нескольким физическим платформам.
Параметры
city_idstringобязательный
physical_st_idstringобязательный
physicalStId of the stop (from bus_get_nearby_stops or bus_search)
namesake_st_idstring
namesakeStId of the stop, optional
first_line_idstring
Optional hint of a line you want highlighted
latstring
Caller's WGS-84 latitude — used to populate 'distance'
lngstring
Caller's WGS-84 longitude
response_formatenum
Output format: 'markdown' for human-readable text, 'json' for full structured data
markdownjson
bus_get_timetableтолько чтениеидемпотентныйвнешний мир
Расписание отправлений по рейсам для маршрута. Внешний источник возвращает один из трёх режимов через `mode`:
- `scheduled` (timeTableType=1): явный массив `timetable` с рейсами
- `interval` (timeTableType=2): маршрут ходит с фиксированным интервалом — не возвращается НИКАКИХ времен по рейсам
- `special` / `unknown` (timeTableType=3 или другой)
**Большинство маршрутов в Шанхае имеют режим `interval`**, поэтому этот инструмент редко подходит. Чтобы ответить на вопросы «первый/последний автобус», «ходит ли маршрут ещё» или «когда ближайшее отправление», вызывайте **bus_get_line_detail** — он всегда возвращает firstTime / lastTime / price / live buses.
Аргументы:
- city_id (строка, обязательно)
- line_id (строка, обязательно)
- line_no (строка, обязательно): короткое название, которое видят пассажиры, из bus_search.lines[].name (например, '71'). НЕ передавайте внутренний lineNo вроде 'r95817'.
- direction ('0'|'1'): направление маршрута
- response_format ('markdown' | 'json')
Возвращает (json):
{
"line": { "lineId":"...", "name":"71", "direction":0, "startSn":"...", "endSn":"..." },
"timeTableType": 2,
"mode": "interval",
"timetable": null,
"note": "Этот маршрут ходит с фиксированным интервалом — ..."
}
Get a line's per-trip schedule (rarely useful)
Расписание отправлений по рейсам для маршрута. Внешний источник возвращает один из трёх режимов через `mode`:
- `scheduled` (timeTableType=1): явный массив `timetable` с рейсами
- `interval` (timeTableType=2): маршрут ходит с фиксированным интервалом — не возвращается НИКАКИХ времен по рейсам
- `special` / `unknown` (timeTableType=3 или другой)
**Большинство маршрутов в Шанхае имеют режим `interval`**, поэтому этот инструмент редко подходит. Чтобы ответить на вопросы «первый/последний автобус», «ходит ли маршрут ещё» или «когда ближайшее отправление», вызывайте **bus_get_line_detail** — он всегда возвращает firstTime / lastTime / price / live buses.
Аргументы:
- city_id (строка, обязательно)
- line_id (строка, обязательно)
- line_no (строка, обязательно): короткое название, которое видят пассажиры, из bus_search.lines[].name (например, '71'). НЕ передавайте внутренний lineNo вроде 'r95817'.
- direction ('0'|'1'): направление маршрута
- response_format ('markdown' | 'json')
Возвращает (json):
{
"line": { "lineId":"...", "name":"71", "direction":0, "startSn":"...", "endSn":"..." },
"timeTableType": 2,
"mode": "interval",
"timetable": null,
"note": "Этот маршрут ходит с фиксированным интервалом — ..."
}
Параметры
city_idstringобязательный
line_idstringобязательный
line_nostringобязательный
Rider-facing short name (search.lines[].name), e.g. '71'. NOT the internal lineNo like 'r95817'.
directionenumобязательный
01
response_formatenum
Output format: 'markdown' for human-readable text, 'json' for full structured data
markdownjson
bus_list_citiesтолько чтениеидемпотентныйвнешний мир
_format - не переводим? "response_format" - это имя параметра, его не переводим. Но в описании можно сказать "формат ответа". В правиле: "не переводи и не изменяй ... названия параметров" - так что оставляем response_format как есть? В примере перевода "response_format ('markdown' | 'json'): defaults to 'markdown'" - я думаю, можно перевести описание: "response_format ('markdown' | 'json'): по умолчанию 'markdown'". Но само название параметра не переводим. Аналогично для hot_only.
Также аргументы и возврат даны в формате Markdown. Нужно сохранить структуру.
Итоговый перевод:Перечисляет города, поддерживаемые сервисом данных об автобусах в реальном времени.
Аргументы:
- hot_only (boolean, по умолчанию true): возвращает только кураторский набор «горячих» городов от вышестоящего сервиса (~20 городов). Укажите false, чтобы выгрузить полный список из ~480 городов (затратно по токенам, используйте экономно).
- response_format ('markdown' | 'json'): по умолчанию 'markdown'
Возвращает (json):
{
"cities": [
{ "cityId": "034", "cityName": "上海", "pinyin": "ShangHai", "supportSubway": true, "hot": true },
...
]
}
Используйте, когда: пользователь упоминает название города, а у вас нет его идентификатора. Набор «горячих» городов охватывает крупнейшие города, которые пользователь почти наверняка имеет в виду.
List supported cities
_format - не переводим? "response_format" - это имя параметра, его не переводим. Но в описании можно сказать "формат ответа". В правиле: "не переводи и не изменяй ... названия параметров" - так что оставляем response_format как есть? В примере перевода "response_format ('markdown' | 'json'): defaults to 'markdown'" - я думаю, можно перевести описание: "response_format ('markdown' | 'json'): по умолчанию 'markdown'". Но само название параметра не переводим. Аналогично для hot_only.
Также аргументы и возврат даны в формате Markdown. Нужно сохранить структуру.
Итоговый перевод:Перечисляет города, поддерживаемые сервисом данных об автобусах в реальном времени.
Аргументы:
- hot_only (boolean, по умолчанию true): возвращает только кураторский набор «горячих» городов от вышестоящего сервиса (~20 городов). Укажите false, чтобы выгрузить полный список из ~480 городов (затратно по токенам, используйте экономно).
- response_format ('markdown' | 'json'): по умолчанию 'markdown'
Возвращает (json):
{
"cities": [
{ "cityId": "034", "cityName": "上海", "pinyin": "ShangHai", "supportSubway": true, "hot": true },
...
]
}
Используйте, когда: пользователь упоминает название города, а у вас нет его идентификатора. Набор «горячих» городов охватывает крупнейшие города, которые пользователь почти наверняка имеет в виду.
Параметры
hot_onlyboolean
Default true: return only the upstream-curated 'hot' set (~20 cities). Set false to dump all 480+.
response_formatenum
Output format: 'markdown' for human-readable text, 'json' for full structured data
markdownjson
bus_list_line_busesтолько чтениеидемпотентныйвнешний мир
Возвращает ближайший автобус, следующий к опорной остановке, с временем прибытия и названием следующей остановки автобуса.
**Это уже, чем предполагает название.** Несмотря на то, что вышестоящая конечная точка называется "busList", на практике она возвращает не более 1-2 автобусов (ближайшие). Для ПОЛНОГО списка всех автобусов, находящихся в данный момент на линии, вызывайте **bus_get_line_detail** — его массив 'buses' содержит все активные транспортные средства с координатами.
Используйте этот инструмент, когда нужно быстро получить ответ на вопрос «что скоро прибудет» для конкретной остановки.
Аргументы:
- city_id (string, required)
- line_id (string, required)
- target_order (string, required): порядковый номер остановки ожидания на линии
- station_name (string, required): отображаемое название опорной остановки
- response_format ('markdown' | 'json')
Возвращает (json):
{
"targetOrder": 2,
"buses": [
{ "busId":"...", "licence":"...", "order":2, "lat":..., "lng":..., "speed":8.2, "capacity":0, "nextStop":"西藏中路", "eta":{"travelTime":214,"arrivalTime":..., "displayTime":"10:14"} }
]
}
Get the nearest approaching bus on a line
Возвращает ближайший автобус, следующий к опорной остановке, с временем прибытия и названием следующей остановки автобуса.
**Это уже, чем предполагает название.** Несмотря на то, что вышестоящая конечная точка называется "busList", на практике она возвращает не более 1-2 автобусов (ближайшие). Для ПОЛНОГО списка всех автобусов, находящихся в данный момент на линии, вызывайте **bus_get_line_detail** — его массив 'buses' содержит все активные транспортные средства с координатами.
Используйте этот инструмент, когда нужно быстро получить ответ на вопрос «что скоро прибудет» для конкретной остановки.
Аргументы:
- city_id (string, required)
- line_id (string, required)
- target_order (string, required): порядковый номер остановки ожидания на линии
- station_name (string, required): отображаемое название опорной остановки
- response_format ('markdown' | 'json')
Возвращает (json):
{
"targetOrder": 2,
"buses": [
{ "busId":"...", "licence":"...", "order":2, "lat":..., "lng":..., "speed":8.2, "capacity":0, "nextStop":"西藏中路", "eta":{"travelTime":214,"arrivalTime":..., "displayTime":"10:14"} }
]
}
Параметры
city_idstringобязательный
line_idstringобязательный
target_orderstringобязательный
station_namestringобязательный
Display name of the target stop
response_formatenum
Output format: 'markdown' for human-readable text, 'json' for full structured data
markdownjson
bus_plan_transitтолько чтениеидемпотентныйвнешний мир
Планирует маршрут общественного транспорта (автобус + метро) между двумя точками. Возвращает альтернативные варианты, отсортированные по рекомендации, каждый разбит на пешие и транспортные сегменты.
**Система координат**: этот инструмент ожидает GCJ-02. Проще всего получить координаты из bus_search.pois[*].lat/lng — они уже в GCJ-02 и содержат название. Если у вас только WGS-84 (например, с GPS телефона), сконвертируйте их перед вызовом.
Аргументы:
- city_id (строка, обязательный)
- origin_name, origin_lat, origin_lng (строка, обязательный): начальная точка в GCJ-02
- dest_name, dest_lat, dest_lng (строка, обязательный): конечная точка в GCJ-02
- strategy ('0'|'1'|'2'|'3'): 0=рекомендованный (по умолчанию; выводит метро), 1=минимальное количество пересадок, 2=минимальная пешая часть, 3=кратчайшее время (ТОЛЬКО АВТОБУСЫ — вышестоящая система часто отбрасывает маршруты с метро, поэтому для вопросов о «самом быстром маршруте» используйте 0)
- response_format ('markdown' | 'json')
Возвращает (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=автобус, 1=метро. Длительность в секундах, расстояния в метрах.
Поле note верхнего уровня добавляется, когда структура ответа вызывает подозрения — например, strategy=3 не вернула планов с метро, хотя поездка скорее всего включает метро.
Plan a public-transit route
Планирует маршрут общественного транспорта (автобус + метро) между двумя точками. Возвращает альтернативные варианты, отсортированные по рекомендации, каждый разбит на пешие и транспортные сегменты.
**Система координат**: этот инструмент ожидает GCJ-02. Проще всего получить координаты из bus_search.pois[*].lat/lng — они уже в GCJ-02 и содержат название. Если у вас только WGS-84 (например, с GPS телефона), сконвертируйте их перед вызовом.
Аргументы:
- city_id (строка, обязательный)
- origin_name, origin_lat, origin_lng (строка, обязательный): начальная точка в GCJ-02
- dest_name, dest_lat, dest_lng (строка, обязательный): конечная точка в GCJ-02
- strategy ('0'|'1'|'2'|'3'): 0=рекомендованный (по умолчанию; выводит метро), 1=минимальное количество пересадок, 2=минимальная пешая часть, 3=кратчайшее время (ТОЛЬКО АВТОБУСЫ — вышестоящая система часто отбрасывает маршруты с метро, поэтому для вопросов о «самом быстром маршруте» используйте 0)
- response_format ('markdown' | 'json')
Возвращает (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=автобус, 1=метро. Длительность в секундах, расстояния в метрах.
Поле note верхнего уровня добавляется, когда структура ответа вызывает подозрения — например, strategy=3 не вернула планов с метро, хотя поездка скорее всего включает метро.
Параметры
city_idstringобязательный
origin_namestringобязательный
Origin display name
origin_latstringобязательный
Origin latitude in GCJ-02
origin_lngstringобязательный
Origin longitude in GCJ-02
dest_namestringобязательный
Destination display name
dest_latstringобязательный
Destination latitude in GCJ-02
dest_lngstringобязательный
Destination longitude in GCJ-02
strategyenum
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.
0123
response_formatenum
Output format: 'markdown' for human-readable text, 'json' for full structured data
markdownjson
bus_refresh_linesтолько чтениеидемпотентныйвнешний мир
Обновляет информацию об автобусах в реальном времени для нескольких пар (маршрут, остановка) за один запрос. Полезно для панели «избранное».
Аргументы:
- city_id (string, required)
- line_stn (string, required): четверки, разделенные точкой с запятой
Формат: lineId,stopId,nextId,targetOrder;lineId,stopId,nextId,targetOrder;...
'nextId' может быть пустым между двумя запятыми.
- response_format ('markdown' | 'json')
Пример: '21283603183,021-15232,,2;21283604388,021-8685,,4'
Возвращает (json):
{
"lines": [
{
"line": { "lineId":"...", "name":"71", "direction":0, "endSn":"..." },
"depDesc": "...",
"buses": [
{ "busId":"...", "order":2, "capacity":0, "distanceToDest":881, "eta":{"travelTime":221,"arrivalTime":...} }
]
}
]
}
Мягкое ограничение: не более 10 четверок за вызов.
Batch refresh realtime info for multiple (line, stop) pairs
Обновляет информацию об автобусах в реальном времени для нескольких пар (маршрут, остановка) за один запрос. Полезно для панели «избранное».
Аргументы:
- city_id (string, required)
- line_stn (string, required): четверки, разделенные точкой с запятой
Формат: lineId,stopId,nextId,targetOrder;lineId,stopId,nextId,targetOrder;...
'nextId' может быть пустым между двумя запятыми.
- response_format ('markdown' | 'json')
Пример: '21283603183,021-15232,,2;21283604388,021-8685,,4'
Возвращает (json):
{
"lines": [
{
"line": { "lineId":"...", "name":"71", "direction":0, "endSn":"..." },
"depDesc": "...",
"buses": [
{ "busId":"...", "order":2, "capacity":0, "distanceToDest":881, "eta":{"travelTime":221,"arrivalTime":...} }
]
}
]
}
Мягкое ограничение: не более 10 четверок за вызов.
Параметры
city_idstringобязательный
line_stnstringобязательный
Quadruple list: lineId,stopId,nextId,targetOrder; separated by ';'. nextId may be empty.
response_formatenum
Output format: 'markdown' for human-readable text, 'json' for full structured data
markdownjson
bus_reverse_geocodeтолько чтениеидемпотентныйвнешний мир
_format оставляем как есть, только переводим часть текста._format ('markdown' | 'json') - можно оставить без перевода скобок, но можно перевести как "response_format ('markdown' | 'json')" - здесь скобки часть формата, не переводим.
Также в аргументах латиница: lat, lng, response_format - не переводим.
Итоговый перевод._format('markdown' | 'json') можно оставить как есть, только убрать пробел перед скобкой? В оригинале: "response_format ('markdown' | 'json')" - с пробелом. Оставим так.
Думаю, всё.Конвертирует WGS-84 широту/долготу в китайский почтовый адрес (провинция, город, район, поселок, форматированный адрес).
Полезен, когда есть сырые GPS-координаты и нужно получить читаемое название места, или citycode/adcode для передачи другим инструментам.
Аргументы:
- lat (строка, обязательный): WGS-84 широта, десятичная, например '31.230416'
- lng (строка, обязательный): WGS-84 долгота, десятичная, например '121.473701'
- response_format ('markdown' | 'json')
Возвращает (json):
{
"formatted": "上海市黄浦区...",
"province": "上海市",
"city": "上海市",
"district": "黄浦区",
"township": "南京东路街道",
"citycode": "021",
"adcode": "310101"
}
Для городов центрального подчинения (Шанхай/Пекин/Тяньцзинь/Чунцин) вышестоящий сервис возвращает пустое значение 'city'; этот инструмент подставляет вместо него 'province', так что поле всегда содержит полезную строку.
Reverse geocode GPS to address
_format оставляем как есть, только переводим часть текста._format ('markdown' | 'json') - можно оставить без перевода скобок, но можно перевести как "response_format ('markdown' | 'json')" - здесь скобки часть формата, не переводим.
Также в аргументах латиница: lat, lng, response_format - не переводим.
Итоговый перевод._format('markdown' | 'json') можно оставить как есть, только убрать пробел перед скобкой? В оригинале: "response_format ('markdown' | 'json')" - с пробелом. Оставим так.
Думаю, всё.Конвертирует WGS-84 широту/долготу в китайский почтовый адрес (провинция, город, район, поселок, форматированный адрес).
Полезен, когда есть сырые GPS-координаты и нужно получить читаемое название места, или citycode/adcode для передачи другим инструментам.
Аргументы:
- lat (строка, обязательный): WGS-84 широта, десятичная, например '31.230416'
- lng (строка, обязательный): WGS-84 долгота, десятичная, например '121.473701'
- response_format ('markdown' | 'json')
Возвращает (json):
{
"formatted": "上海市黄浦区...",
"province": "上海市",
"city": "上海市",
"district": "黄浦区",
"township": "南京东路街道",
"citycode": "021",
"adcode": "310101"
}
Для городов центрального подчинения (Шанхай/Пекин/Тяньцзинь/Чунцин) вышестоящий сервис возвращает пустое значение 'city'; этот инструмент подставляет вместо него 'province', так что поле всегда содержит полезную строку.
Параметры
latstringобязательный
Latitude, WGS-84, e.g. '31.230416'
lngstringобязательный
Longitude, WGS-84, e.g. '121.473701'
response_formatenum
Output format: 'markdown' for human-readable text, 'json' for full structured data
markdownjson
bus_searchтолько чтениеидемпотентныйвнешний мир
Ищет в городе по ключевому слову. Возвращает маршруты, станции и точки интереса (POI) за один вызов.
Используйте этот инструмент как основную точку входа, когда пользователь указывает номер маршрута, название станции или название пункта назначения без идентификаторов.
**Совет по ключевым словам**: простые запросы вроде "71", "71路", "地铁2号线", "陆家嘴" — работают, источник достаточно гибкий. Если короткий числовой запрос ничего не даёт, попробуйте добавить "路".
**Системы координат**:
- Координаты 'pois' — GCJ-02 (используйте напрямую с bus_plan_transit)
- Координаты 'stations' — WGS-84 (используйте с bus_get_nearby_stops / bus_get_line_realtime)
У обоих также есть поле 'gpsType'.
Аргументы:
- city_id (строка, обязательный): например '034'
- keyword (строка, обязательный)
- response_format ('markdown' | 'json')
Возвращает (json):
{
"highlightKey": "71路",
"lines": [
{
"name": "71", "lineNo": "r95817", "isSubway": false,
"directions": [
{ "direction": 0, "lineId": "21283603183", "startSn": "延安东路外滩", "endSn": "申昆路枢纽站" },
{ "direction": 1, "lineId": "21283603182", "startSn": "申昆路枢纽站", "endSn": "延安东路外滩" }
],
// Поля верхнего уровня для совместимости копируют directions[0] (или первую доступную запись).
"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" }, ...]
}
**Разбивка маршрутов**: каждая запись в 'lines' — это один логический маршрут (например, "71路"). Два направления движения находятся в 'directions[]'. Выбирайте lineId, соответствующий нужному направлению.
**Подсказка по метро**: когда 'isSubway' равно true, запись содержит поле 'hint' — bus_get_line_detail для таких lineId вернёт пустой результат. Используйте bus_get_stop_detail (поле metros) или bus_plan_transit.
**Последующие шаги**:
- directions[i].lineId → ...
Search lines, stations, and POIs
Ищет в городе по ключевому слову. Возвращает маршруты, станции и точки интереса (POI) за один вызов.
Используйте этот инструмент как основную точку входа, когда пользователь указывает номер маршрута, название станции или название пункта назначения без идентификаторов.
**Совет по ключевым словам**: простые запросы вроде "71", "71路", "地铁2号线", "陆家嘴" — работают, источник достаточно гибкий. Если короткий числовой запрос ничего не даёт, попробуйте добавить "路".
**Системы координат**:
- Координаты 'pois' — GCJ-02 (используйте напрямую с bus_plan_transit)
- Координаты 'stations' — WGS-84 (используйте с bus_get_nearby_stops / bus_get_line_realtime)
У обоих также есть поле 'gpsType'.
Аргументы:
- city_id (строка, обязательный): например '034'
- keyword (строка, обязательный)
- response_format ('markdown' | 'json')
Возвращает (json):
{
"highlightKey": "71路",
"lines": [
{
"name": "71", "lineNo": "r95817", "isSubway": false,
"directions": [
{ "direction": 0, "lineId": "21283603183", "startSn": "延安东路外滩", "endSn": "申昆路枢纽站" },
{ "direction": 1, "lineId": "21283603182", "startSn": "申昆路枢纽站", "endSn": "延安东路外滩" }
],
// Поля верхнего уровня для совместимости копируют directions[0] (или первую доступную запись).
"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" }, ...]
}
**Разбивка маршрутов**: каждая запись в 'lines' — это один логический маршрут (например, "71路"). Два направления движения находятся в 'directions[]'. Выбирайте lineId, соответствующий нужному направлению.
**Подсказка по метро**: когда 'isSubway' равно true, запись содержит поле 'hint' — bus_get_line_detail для таких lineId вернёт пустой результат. Используйте bus_get_stop_detail (поле metros) или bus_plan_transit.
**Последующие шаги**:
- directions[i].lineId → ...
Параметры
city_idstringобязательный
City ID, e.g. '034'
keywordstringобязательный
Search keyword. Examples: '71', '71路', '地铁2号线', '陆家嘴', '人民广场'. Plain line numbers like '71' work fine.
response_formatenum
Output format: 'markdown' for human-readable text, 'json' for full structured data
markdownjson
bus_search_moreтолько чтениеидемпотентныйвнешний мир
Пагинированное 'показать больше' для одной категории из bus_search.
Аргументы:
- city_id (string, обязательный)
- keyword (string, обязательный): тот же ключевой запрос, что и в bus_search
- type ('1'|'2'|'3'): 1=больше маршрутов, 2=больше станций, 3=больше POI (по умолчанию '1')
- response_format ('markdown' | 'json')
Возвращает ту же структуру, что и bus_search, но заполненной оказывается только запрошенная категория.
Search more results of one category
Пагинированное 'показать больше' для одной категории из bus_search.
Аргументы:
- city_id (string, обязательный)
- keyword (string, обязательный): тот же ключевой запрос, что и в bus_search
- type ('1'|'2'|'3'): 1=больше маршрутов, 2=больше станций, 3=больше POI (по умолчанию '1')
- response_format ('markdown' | 'json')
Возвращает ту же структуру, что и bus_search, но заполненной оказывается только запрошенная категория.
Параметры
city_idstringобязательный
City ID, e.g. '034'
keywordstringобязательный
Search keyword. Examples: '71', '71路', '地铁2号线', '陆家嘴', '人民广场'. Plain line numbers like '71' work fine.
response_formatenum
Output format: 'markdown' for human-readable text, 'json' for full structured data
markdownjson
typeenum
Category: '1' more lines, '2' more stations, '3' more POIs