{
  "markdown": "<p align=\"center\">\n  <img src=\"./assets/logo.png\" alt=\"RZD Tickets MCP logo\" width=\"140\" />\n</p>\n\n# RZD Tickets MCP\n\nRead-only MCP-сервер, который дает агентам живые “глаза” на `ticket.rzd.ru`:\nпоезда, вагоны, цены, нижние/верхние места, боковые места, спецместа, соседние\nпары `нижнее+верхнее`, фото вагонов, когда РЖД их публикует, и официальные\nссылки РЖД для ручного оформления.\n\nСервер не логинится, не бронирует, не создает холд, не оплачивает, не отменяет\nзаказы и не меняет личный кабинет РЖД.\n\n## Инструменты\n\n| Инструмент | Что делает |\n|---|---|\n| `rzd_station_suggest` | Ищет `nodeId` и `expressCode` станции по названию. |\n| `rzd_search_trains` | Показывает поезда, цены, группы вагонов и ссылку РЖД. |\n| `rzd_train_cars` | Проваливается в `CarPricing`: вагоны, места, статистика верх/низ, фото. |\n| `rzd_find_places` | Возвращает только совпадения по фильтрам, включая фото вагона. |\n| `rzd_checkout_url` | Строит официальную ссылку РЖД для ручного оформления. |\n| `rzd_parse_search_url` | Разбирает URL поиска РЖД. |\n| `rzd_service_classes` | Объясняет, как читать открытые коды классов РЖД. |\n\n## Установка\n\n```bash\ngit clone git@github.com:ex3lite/mcp_rzd_tickets.git\ncd mcp_rzd_tickets\nnpm install\nnpm run build\n```\n\nЗапуск MCP stdio-сервера:\n\n```bash\nnode dist/mcp.js\n```\n\nБыстрая CLI-проверка:\n\n```bash\nnode dist/cli.js --suggest \"Красноярск\"\nnode dist/cli.js --origin 2038000 --destination 2054275 --date 2026-07-12 --train 376Ы --require-pair --car-type coupe\n```\n\n## Конфиг MCP-клиента\n\nПакет опубликован в npm как `mcp-rzd-tickets`, поэтому установка обычно не\nтребует clone/build:\n\n```bash\nnpx -y mcp-rzd-tickets\n```\n\n### Claude Code\n\nГлобально для всех проектов:\n\n```bash\nclaude mcp add -s user rzd_tickets -- npx -y mcp-rzd-tickets\nclaude mcp list\n```\n\nТолько для текущего проекта:\n\n```bash\nclaude mcp add -s project rzd_tickets -- npx -y mcp-rzd-tickets\n```\n\n### Codex\n\n```bash\ncodex mcp add rzd_tickets --env RZD_TIMEOUT_MS=20000 -- npx -y mcp-rzd-tickets\ncodex mcp list\n```\n\nПосле изменения MCP-конфига уже открытой сессии Codex может понадобиться новый\nчат или перезапуск, чтобы сервер появился в списке инструментов.\n\n### Claude Desktop, Cursor, Windsurf, Cline, Roo Code\n\nДля клиентов с JSON MCP-конфигом используй один и тот же блок:\n\n```json\n{\n  \"mcpServers\": {\n    \"rzd_tickets\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-rzd-tickets\"],\n      \"env\": {\n        \"RZD_TIMEOUT_MS\": \"20000\"\n      }\n    }\n  }\n}\n```\n\nКуда вставлять:\n\n| Клиент | Куда ставить |\n|---|---|\n| Claude Desktop | `~/Library/Application Support/Claude/claude_desktop_config.json`, ключ `mcpServers`. |\n| Cursor | `~/.cursor/mcp.json` глобально или `.cursor/mcp.json` в проекте. |\n| Windsurf | Settings → Cascade/MCP → Add custom server, затем JSON выше. |\n| Cline | MCP Servers → Configure MCP Servers или `~/.cline/mcp.json`. |\n| Roo Code | MCP Servers → Edit Global MCP / Edit Project MCP. |\n\n### Continue\n\nContinue умеет читать JSON MCP config, но его родной формат — YAML block в\n`.continue/mcpServers/rzd-tickets.yaml`:\n\n```yaml\nname: RZD Tickets MCP\nversion: 0.1.2\nschema: v1\nmcpServers:\n  - name: rzd_tickets\n    command: npx\n    args:\n      - -y\n      - mcp-rzd-tickets\n```\n\n### Локальный checkout\n\n```json\n{\n  \"mcpServers\": {\n    \"rzd_tickets\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/mcp_rzd_tickets/dist/mcp.js\"],\n      \"env\": {\n        \"RZD_TIMEOUT_MS\": \"20000\"\n      }\n    }\n  }\n}\n```\n\n### Прокси\n\n```json\n{\n  \"mcpServers\": {\n    \"rzd_tickets\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-rzd-tickets\"],\n      \"env\": {\n        \"RZD_PROXY_URL\": \"socks5://user:pass@host:1080\",\n        \"RZD_TIMEOUT_MS\": \"20000\"\n      }\n    }\n  }\n}\n```\n\nПрокси не нужен по умолчанию. Если `RZD_PROXY_URL` не задан, сервер ходит в\nРЖД напрямую.\n\n## Примеры запросов агенту\n\n```text\nНайди поезд 376Ы Красноярск Пасс — Анзеби на 2026-07-12.\nНужна соседняя пара нижнее+верхнее в купе.\nБоковые и спецместа не учитывать.\nЕсли есть совпадение, дай ссылку РЖД для оформления.\n```\n\n```text\nЧерез rzd_station_suggest найди коды Анзеби и Красноярск.\nПотом проверь 2 пассажиров на 2026-07-03 по поезду 097Э.\nИщу пару нижнее+верхнее в одном отсеке.\n```\n\n## Фильтры\n\n- `trains`: точные номера поездов, например `[\"097Э\"]`.\n- `departureFrom` / `departureTo`: окно отправления `HH:mm`.\n- `carType`: `coupe`, `platz` или сырой тип РЖД.\n- `service`: сырой код класса РЖД, например `2Ш`; список кодов открыт.\n- `placeKind`: `lower`, `upper`, `other`.\n- `requirePair`: соседняя пара `нижнее+верхнее` в одном отсеке.\n- `includeSide`: учитывать боковые места.\n- `includeAccessible`: учитывать спецместа для инвалидов/сопровождающих.\n- `includeImages`: подтягивать галерею вагона, если РЖД вернул `HasImages=true`; по умолчанию включено в MCP.\n- `maxPrice`, `minPlaces`: цена и минимальное количество мест.\n\n## Фото вагонов\n\nВ `rzd_train_cars` и `rzd_find_places` каждый вагон содержит `imageInfo`.\n\n- `hasImages`: флаг из `CarPricing`.\n- `fetched`: удалось ли сходить в endpoint галереи.\n- `schemeId`, `schemeName`, `carSubType`, `carrier`: идентификаторы схемы/типа вагона из РЖД.\n- `images[].thumbnailUrl`: миниатюра.\n- `images[].contentUrl`: полноразмерное фото.\n- `unavailableReason` / `error`: почему фото нет или запрос не удался.\n\nВажно: у РЖД фото есть не для каждого вагона. Если в `CarPricing`\n`HasImages=false`, MCP не придумывает картинку и явно пишет причину в\n`imageInfo.unavailableReason`.\n\n## Классы вагонов РЖД\n\nКласс обслуживания РЖД не моделируется как enum. Это намеренно.\n\nРЖД может добавлять и менять коды, поэтому сервер отдает агенту:\n\n- `code`: сырой код РЖД, например `2Ш`;\n- `title`: человекочитаемый заголовок из ответа РЖД, типа вагона или общего семейства;\n- `tags`: факты из официального `ServiceClassTranscript` и осторожные подсказки;\n- `transcript`: официальный текст РЖД, если он пришел в `CarPricing`;\n- `description`: готовая строка для показа человеку.\n\nАгент должен показывать сырой код вместе с `description`, а точный смысл брать\nиз `transcript`, когда он есть. Так не нужно расширять локальный enum каждый\nраз, когда РЖД вводит новый вариант.\n\n## Переменные окружения\n\n| Переменная | Описание |\n|---|---|\n| `RZD_PROXY_URL` | Опциональный `http://`, `https://`, `socks4://` или `socks5://` прокси. |\n| `RZD_TIMEOUT_MS` | Таймаут запроса. По умолчанию `20000`. |\n\n## Публикация\n\nОсновной путь:\n\n```bash\nnpm publish --access public\nmcp-publisher login github\nmcp-publisher publish\n```\n\n`server.json` уже подготовлен для официального MCP Registry:\n`io.github.ex3lite/mcp-rzd-tickets`. Сам registry хранит metadata, а код должен\nлежать в публичном npm-пакете `mcp-rzd-tickets`.\n\nДополнительно можно опубликовать на Smithery. Для текущего stdio-сервера нужен\nMCPB bundle; для URL-публикации на Smithery потребуется отдельный Streamable\nHTTP endpoint.\n\n## Языки\n\n- [English](./docs/README.en.md)\n- [中文](./docs/README.zh.md)\n\n## Ограничения\n\nRZD может менять приватные web-endpoint без предупреждения. Этот сервер\nиспользует те же read-only pricing endpoint, что и публичный web-app, и\nбраузероподобные заголовки. Если payload РЖД изменится, ошибка должна быть\nвидна агенту, а не скрыта.\n",
  "bytes": 7138,
  "sha": "661098eee8f3c1fe5c63fe223e32f344b63dcd0a11e7ca0b4eef33ac93a7da5f",
  "repo_slug": "ex3lite/mcp_rzd_tickets",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_ex3lite_mcp_rzd_tickets_0696c9da/readme"
}