Typed Python client and MCP server for the unofficial ticket.rzd.ru API
Project description
RZD API
Типизированный Python-клиент и MCP-сервер для неофициального API
ticket.rzd.ru. Проект не связан с ОАО «РЖД»; внутренние
endpoint и схема ответов могут изменяться без предупреждения.
Поведение TLS намеренно сохранено от версии 1.x: проверка сертификата API РЖД отключена. Не передавайте клиенту собственные секреты или учётные данные.
Возможности
- поиск прямых поездов в одну сторону и туда-обратно;
- поиск станций по названию и синонимам;
- календарь доступности и минимальные цены по датам;
- информация о вагонах, местах, схемах, изображениях и станциях маршрута;
- dataclass-модели с полным исходным объектом в
raw; - MCP через
stdioи защищённыйstreamable-http; - retries, раздельные таймауты и кэш поиска станций.
Требуется Python 3.10–3.14.
Установка
pip install rzd-api
С MCP-сервером:
pip install "rzd-api[mcp]"
Python API
from datetime import date, timedelta
from rzd_api import RoundTripResult, RzdClient
departure = date.today() + timedelta(days=14)
return_date = departure + timedelta(days=3)
with RzdClient() as client:
result = client.search_tickets(
"Москва",
"Санкт-Петербург",
departure,
return_date=return_date,
adults=1,
children=0,
)
if isinstance(result, RoundTripResult):
for train in result.forward:
print(train.number, train.departure_time, train.min_price)
for train in result.back:
print(train.number, train.departure_time, train.min_price)
Все модели поддерживают to_dict() и содержат необработанный узел ответа в raw.
Методы RzdClient
| Метод | Результат |
|---|---|
search_tickets(...) |
list[TrainRoute] или RoundTripResult |
find_stations(query, ...) |
list[Station] |
resolve_station_code(station) |
код станции |
get_carriages(...) |
CarriageResult |
get_train_availability(...) |
TrainAvailabilityResult |
get_minimal_prices(...) |
MinimalPricingResult |
get_car_scheme(...) |
CarScheme |
get_car_images(...) |
CarImagesResult |
get_route_stations(...) |
RouteStationsResult |
get_carriages() использует актуальный CarPricing и сразу возвращает все вагоны
поезда. car_number этому методу больше не передаётся. Значения number,
car_sub_type, service_class, carrier и numeration из выбранного Carriage
можно передать в get_car_scheme() и get_car_images().
with RzdClient() as client:
carriages = client.get_carriages(
"2001025", "2004001", departure, "00:48", "059Г"
)
car = carriages.cars[0]
scheme = client.get_car_scheme(
departure,
"00:48",
car.train_number or "059Г",
car.number or "",
car.car_sub_type or "",
car.service_class or "",
car.carrier or "",
car_numeration=car.numeration or "FromHead",
)
only_with_seats=True фильтрует по доступности мест из CarGroups. Современный
pricing endpoint не поддерживает маршруты с пересадками и фильтр типа транспорта,
поэтому include_transfers=True и transport_type="trains"|"suburban" явно
возвращают NotImplementedError.
Конфигурация
from rzd_api import Config, RzdClient
config = Config(
language="ru",
# По умолчанию выводится из base_url.
b2b_base_url=None,
connect_timeout=5,
read_timeout=20,
retry_total=3,
retry_backoff=0.5,
station_cache_ttl=3600,
station_cache_size=256,
proxy=None,
)
client = RzdClient(config)
Ошибки наследуются от RzdError: validation, transport, HTTP, API, schema,
station-not-found и ambiguous-station.
MCP
Инструменты: search_tickets, find_stations, get_carriages,
get_train_availability, get_minimal_prices, get_car_scheme,
get_car_images, get_route_stations.
Локальный stdio:
rzd-mcp-server
Streamable HTTP на loopback без токена:
MCP_TRANSPORT=streamable-http MCP_HOST=127.0.0.1 rzd-mcp-server
При привязке к non-loopback адресу требуется Bearer-токен минимум из 32 символов:
export MCP_AUTH_TOKEN="replace-with-a-random-token-at-least-32-characters"
MCP_TRANSPORT=streamable-http MCP_HOST=0.0.0.0 rzd-mcp-server
Endpoint MCP: http://localhost:8000/mcp; healthcheck: /health. Лимит по
умолчанию — 60 запросов в минуту, настраивается через
MCP_RATE_LIMIT_PER_MINUTE. Допустимые Host headers можно перечислить через
MCP_ALLOWED_HOSTS.
Docker
export MCP_AUTH_TOKEN="replace-with-a-random-token-at-least-32-characters"
docker compose up -d
curl http://127.0.0.1:8000/health
Контейнер запускается от UID 10001, без Linux capabilities, и публикует порт только на loopback хоста.
Разработка
python -m pip install -e ".[dev]"
make check
Live smoke test является opt-in:
RZD_LIVE_TEST=1 pytest tests/integration -m integration -v
Переход с 1.x описан в MIGRATION.md, изменения релизов — в CHANGELOG.md.
Лицензия
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rzd_api-3.0.0.tar.gz.
File metadata
- Download URL: rzd_api-3.0.0.tar.gz
- Upload date:
- Size: 33.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a16174be1f2fdb8b043532cb482ed6e5af22cb8687d85773c4dda2591b1d11d8
|
|
| MD5 |
ddb7c13e695365ae19a136b41af03750
|
|
| BLAKE2b-256 |
9a6c5696e0f5de6bfade1ee3d046ab903eb95269958b4c7ea372729631e21c60
|
Provenance
The following attestation bundles were made for rzd_api-3.0.0.tar.gz:
Publisher:
publish.yml on drGOD/rzd-api
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rzd_api-3.0.0.tar.gz -
Subject digest:
a16174be1f2fdb8b043532cb482ed6e5af22cb8687d85773c4dda2591b1d11d8 - Sigstore transparency entry: 2211092428
- Sigstore integration time:
-
Permalink:
drGOD/rzd-api@0f2490fa75183a7494043e2f9ff564506b5989cb -
Branch / Tag:
refs/tags/v3.0.0 - Owner: https://github.com/drGOD
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0f2490fa75183a7494043e2f9ff564506b5989cb -
Trigger Event:
release
-
Statement type:
File details
Details for the file rzd_api-3.0.0-py3-none-any.whl.
File metadata
- Download URL: rzd_api-3.0.0-py3-none-any.whl
- Upload date:
- Size: 23.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
365ccc8ccdbd625b06f3bfd7a97a203cbf95e185e689000063df57f1d7950295
|
|
| MD5 |
b9204018e2836f99e20b22a1e016bdff
|
|
| BLAKE2b-256 |
713d8d25aea221be9b29ef7f81859bb8b08edf7d87f226f7dfcde700ca41e436
|
Provenance
The following attestation bundles were made for rzd_api-3.0.0-py3-none-any.whl:
Publisher:
publish.yml on drGOD/rzd-api
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rzd_api-3.0.0-py3-none-any.whl -
Subject digest:
365ccc8ccdbd625b06f3bfd7a97a203cbf95e185e689000063df57f1d7950295 - Sigstore transparency entry: 2211092466
- Sigstore integration time:
-
Permalink:
drGOD/rzd-api@0f2490fa75183a7494043e2f9ff564506b5989cb -
Branch / Tag:
refs/tags/v3.0.0 - Owner: https://github.com/drGOD
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0f2490fa75183a7494043e2f9ff564506b5989cb -
Trigger Event:
release
-
Statement type: