python-sdk/i18n/ru/pages/deprecated.md

99 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
translation:
sections: [20541a40dbdd5980, 01262a123ad9501d, 429db5b574a2ac08, 56b2d49da412cb28, 6a1717123fe4513c]
tool: 1
---
# Устаревшие возможности {#deprecated-features}
Спецификация 2026-07-28 выводит из обращения пять возможностей. SDK по-прежнему реализует каждую из них, и каждая теперь выдаёт **предупреждение об устаревании**.
В таблице ниже перечислены все устаревшие возможности, причина, по которой каждая уходит, и замена, на которую стоит опираться.
## Что объявлено устаревшим {#what-is-deprecated}
| Устарело | Почему | Что делать вместо этого |
|---|---|---|
| **Корневые каталоги (roots)**: `ctx.session.list_roots()`, `client.send_roots_list_changed()`, параметр `list_roots_callback=`, который передаётся в `Client(...)` | [SEP-2577](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2577) выводит возможность из обращения. | Принимайте пути как обычные аргументы инструмента или URI ресурсов либо встраивайте `ListRootsRequest` в `InputRequiredResult` (см. **[Многораундовые запросы (multi-round-trip)](handlers/multi-round-trip.md)**). |
| **Сэмплирование (sampling) по инициативе сервера**: `ctx.session.create_message()`, параметр `sampling_callback=`, который передаётся в `Client(...)` | SEP-2577 выводит возможность из обращения. | Верните `InputRequiredResult` и позвольте клиенту повторить вызов (см. **[Многораундовые запросы](handlers/multi-round-trip.md)**). |
| **Протокольное логирование**: `ctx.log()`, `ctx.debug()`, `ctx.info()`, `ctx.warning()`, `ctx.error()`, `ctx.session.send_log_message()`, `client.set_logging_level()` | SEP-2577 выводит возможность из обращения. Внутри протокола её ничто не заменяет. | Обычный `import logging` с выводом в stderr (см. **[Логирование](handlers/logging.md)**). |
| **`ping`**: `client.send_ping()` | **Удалён** из протокола, а не просто объявлен устаревшим. В 2026-07-28 метода `ping` нет. | Ничего. Работает только на подключении с `mode="legacy"`. |
| **Прогресс от клиента к серверу**: `client.send_progress_notification()` | В 2026-07-28 прогресс передаётся только от сервера к клиенту. | Отправлять нечего. О ходе выполнения сообщает ваш *сервер* — через `ctx.report_progress()` (см. **[Прогресс](handlers/progress.md)**). |
Из этой таблицы следуют три вывода:
* Корневые каталоги, сэмплирование и логирование идут вместе. Одно предложение, **SEP-2577**, объявляет устаревшими все три возможности разом.
* У сэмплирования и корневых каталогов есть общая, более глубокая проблема: это места, где **сервер** отправляет **запрос** **клиенту**. Именно это направление целиком спецификация 2026-07-28 заменяет **[многораундовыми запросами](handlers/multi-round-trip.md)**. Исчезли самостоятельные RPC-методы (`sampling/createMessage`, `roots/list` и push-вариант `elicitation/create`); типы полезной нагрузки `CreateMessageRequest` / `ListRootsRequest` / `ElicitRequest` сохранились — они встраиваются в `InputRequiredResult.input_requests`, а на клиенте попадают в те же колбэки.
* `ping` стоит особняком. Протокол не объявляет его устаревшим, а удаляет. Метод SDK всё равно выдаёт предупреждение (в его тексте сказано *removed*, а не *deprecated*), а вызов на современном подключении возвращает *«Method not found»*.
## Устаревание носит рекомендательный характер {#deprecated-is-advisory}
Сегодня ничего не ломается.
Все перечисленные методы продолжают работать в любой сессии, согласованной на версии **2025-11-25 или более ранней**. Зафиксируйте на клиенте `mode="legacy"` — и получите в точности поведение до 2026 года. В передаваемых данных ничего не меняется, согласование возможностей остаётся прежним.
Меняется одно: при первом запуске каждого из них появляется заметное предупреждение:
```text
MCPDeprecationWarning: The logging capability is deprecated as of 2026-07-28 (SEP-2577).
```
`MCPDeprecationWarning` наследуется от `UserWarning`, а **не** от `DeprecationWarning`. Это сделано намеренно: фильтр Python по умолчанию показывает `DeprecationWarning` только в коде, запущенном напрямую как `__main__`, — именно так библиотеки объявляют что-то устаревшим, и два года этого никто не замечает. Это предупреждение видно везде, без всякого флага `-W`.
!!! warning
Рекомендательный характер заканчивается на уровне сети. Сэмплирование и корневые
каталоги — это *запросы* от сервера к клиенту, а в сессии 2026-07-28 нет канала, по
которому такой запрос можно передать. Вызовите `ctx.session.create_message()` внутри
инструмента на современном подключении — предупреждение всё равно сработает, а затем
отправка завершится ошибкой:
```text
Cannot send 'sampling/createMessage': this transport context has no back-channel
for server-initiated requests.
```
Два сигнала, именно в таком порядке. `MCPDeprecationWarning` срабатывает в момент
вызова метода, на любом подключении. Ошибка — это то, что возвращается, когда SDK
после этого пытается отправить запрос. От начала до конца эти две возможности работают
только на подключении с `mode="legacy"`, клиент которого зарегистрировал
соответствующий колбэк.
## Отключение предупреждения {#silencing-the-warning}
В новом коде — не отключайте.
Но сервер, который вы поддерживаете и который действительно обслуживает клиентов до 2026 года, имеет полное право на тихий лог. Отфильтруйте категорию до того, как выполнится первый устаревший вызов:
```python
import warnings
from mcp import MCPDeprecationWarning
warnings.filterwarnings("ignore", category=MCPDeprecationWarning)
```
Вот и весь API. Переключателя для отдельных методов нет, и он не нужен: смысл единой категории в том, что одна строка её заглушает и одна строка возвращает.
!!! check
Разверните фильтр в обратную сторону — и получите бесплатный регрессионный тест.
Добавьте `"error::mcp.MCPDeprecationWarning"` в параметр `filterwarnings` конфигурации
pytest, и устаревший вызов будет **выбрасывать исключение**, а не предупреждать.
Инструмент `old_log`, который всё ещё вызывает `ctx.info()`, перестаёт проходить тест
и начинает сообщать:
```text
Error executing tool old_log: The logging capability is deprecated as of 2026-07-28 (SEP-2577).
```
Одна строка в конфигурации pytest — и устаревший вызов уже не сможет незаметно
вернуться в кодовую базу, не провалив тест.
## Итоги {#recap}
* Спецификация 2026-07-28 объявляет устаревшими **корневые каталоги**, **сэмплирование** по инициативе сервера и протокольное **логирование** (всё — [SEP-2577](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2577)), ограничивает **прогресс** направлением от сервера к клиенту и удаляет **`ping`**.
* Столбец с заменами указывает, куда идти дальше: **[Многораундовые запросы](handlers/multi-round-trip.md)** — для сэмплирования и корневых каталогов, **[Логирование](handlers/logging.md)** — для логирования, **[Прогресс](handlers/progress.md)** — для прогресса. `ping` не требует вообще ничего.
* Устаревание носит рекомендательный характер: в передаваемых данных ничего не меняется, всё продолжает работать в сессиях до 2026 года, и появляется заметное предупреждение `MCPDeprecationWarning` (это `UserWarning`, поэтому оно включено по умолчанию).
* Сэмплированию и корневым каталогам дополнительно нужен обратный канал (back-channel), которого в сессии 2026-07-28 нет. На современном подключении они выдают предупреждение, а затем выбрасывают исключение.
* `warnings.filterwarnings("ignore", category=MCPDeprecationWarning)` заглушает всю категорию; `"error::mcp.MCPDeprecationWarning"` в pytest превращает её в провал теста.
* Новый код не следует строить ни на одной из этих возможностей.
Все остальные страницы этой документации описывают актуальный API.