# MCP Python SDK: установка, редакции протокола и ветка 1.x

> Официальный Python SDK для MCP - выпуск 2.3.0, установка, редакции протокола, поведение клиента и сервера по умолчанию, расширения и отличие от ветки 1.x.

Страница: https://mcpdoc.ru/sdk/python/
Указатель сайта: https://mcpdoc.ru/llms.txt

Python SDK - официальный пакет `mcp` для серверов и клиентов MCP. Выпуск 2.3.0 понимает обе эпохи протокола. Клиент по умолчанию сначала отправляет `server/discover`, а со старым сервером сам переходит на рукопожатие `initialize`. Сервер обслуживает обе эпохи всегда, отключить одну из них нельзя. Ветка 1.x (выпуск 1.30.0) работает только в эпохе Legacy.

сверено с выпуском 2.3.0 4 октября 2026

Совместимость Dual-era работает с обеими эпохами и выбирает по собеседнику

- **Проверенная версия:** 2.3.0, выпуск от 2026-10-02

- **Новейшая поддерживаемая редакция:** 2026-07-28

- **С сервером только Modern:** работает

- **С сервером только Legacy:** работает

- **Переход на старую редакцию:** автоматически

- **Использует устаревшее:** Roots, Sampling, Logging, динамическая регистрация клиента (DCR), транспорт HTTP+SSE

- **Сохраняет удалённое в редакции 2026-07-28:** сессии, рукопожатие initialize

- **Расширение Tasks:** нет

- **Расширение MCP Apps:** частично

- **Проверено:** 2026-10-04

- **Источник:** [github.com](https://github.com/modelcontextprotocol/python-sdk/releases/tag/v2.3.0)

## Что это

Это SDK из репозитория [modelcontextprotocol/python-sdk](https://github.com/modelcontextprotocol/python-sdk/tree/v2.3.0). В [списке официальных SDK](https://modelcontextprotocol.io/docs/sdk) он отнесён к первому уровню (Tier 1).

Обе ветки публикуются в одном проекте `mcp` на [PyPI](https://pypi.org/project/mcp/):

| Ветка | Проверенный выпуск | Эпоха |
|---|---|---|
| 2.x | 2.3.0, 2026-10-02 | Dual-era |
| 1.x | 1.30.0, 2026-09-07 | только Legacy |

Главный класс сервера в 2.x называется `MCPServer`, главный класс клиента - `Client`.

В ветке 1.x серверный класс назывался `FastMCP` и лежал в `mcp.server.fastmcp`. По [руководству по переходу](https://github.com/modelcontextprotocol/python-sdk/blob/v2.3.0/docs/migration.md), в 2.x он переименован в `MCPServer`, а импорт `mcp.server.fastmcp` завершается ошибкой `ModuleNotFoundError`. Сторонние проекты с похожим названием - это не официальный SDK, и на этой странице они не описаны.

## Установка и среда

```bash title="Установка 2.x"
uv add "mcp[cli]"      # or: pip install "mcp[cli]"
```

Нужен Python 3.10 или новее. По [README выпуска](https://github.com/modelcontextprotocol/python-sdk/blob/v2.3.0/README.md), дополнение `cli` добавляет команду `mcp` с подкомандами `mcp dev`, `mcp run` и `mcp install`. Если она не нужна, достаточно пакета `mcp` без дополнения.

## Какие редакции понимает выпуск

Списки версий лежат в [`mcp_types/version.py`](https://github.com/modelcontextprotocol/python-sdk/blob/v2.3.0/src/mcp-types/mcp_types/version.py):

- через рукопожатие `initialize`: 2024-11-05, 2025-03-26, 2025-06-18, 2025-11-25;
- новая эпоха: 2026-07-28.

Константа `LATEST_PROTOCOL_VERSION` в этом выпуске указывает на 2026-07-28, а самая новая версия для рукопожатия вынесена в `LATEST_HANDSHAKE_VERSION`.

Для вас это значит: один и тот же код клиента и сервера работает с собеседником любой эпохи. Чем эпохи различаются, описано на странице [о версиях протокола](https://mcpdoc.ru/protocol/versions/).

## Что отправляет клиент по умолчанию

Поведением управляет аргумент `mode` конструктора `Client`. По [документу о версиях](https://github.com/modelcontextprotocol/python-sdk/blob/v2.3.0/docs/protocol-versions.md):

| Как написано | Что уходит в сеть | Что получается |
|---|---|---|
| `Client(target)` | один пробный `server/discover`; при ошибке - рукопожатие `initialize` | самая новая общая версия любой эпохи |
| `Client(target, mode="legacy")` | рукопожатие `initialize` | версия старой эпохи; работают запросы от сервера к клиенту |
| `Client(target, mode="2026-07-28")` | ничего | версия закреплена, `server_info` равно `None` |

Значение по умолчанию - `"auto"`. Какая версия выбрана, показывает `client.protocol_version`.

Закреплённая версия - это ваше обещание, что сервер её понимает: клиент ничего не проверяет. Закрепить можно только версию новой эпохи. Строка старой эпохи отклоняется ещё в конструкторе с ошибкой `ValueError`.

Режим `mode="legacy"` нужен, когда клиенту требуются запросы от сервера: Sampling, Elicitation в виде запроса, обработчик сообщений. В редакции 2026-07-28 такого канала нет: сервер возвращает вопросы в ответе, а клиент повторяет вызов. Подробнее - на странице [о MRTR](https://mcpdoc.ru/protocol/mrtr/).

```python title="client.py"
import asyncio

from mcp import Client

async def main() -> None:
    async with Client("http://localhost:8000/mcp") as client:
        result = await client.call_tool("add", {"a": 1, "b": 2})
        print(result.structured_content)  # {'result': 3}

asyncio.run(main())
```

Пример взят из документации выпуска 2.3.0 и здесь не запускался.

## Что принимает сервер

По [документу о версиях](https://github.com/modelcontextprotocol/python-sdk/blob/v2.3.0/docs/protocol-versions.md), `MCPServer` отвечает на `server/discover` на каждом транспорте: Streamable HTTP, stdio и на соединении внутри процесса, которое используют тесты.

Для HTTP [документ о старых клиентах](https://github.com/modelcontextprotocol/python-sdk/blob/v2.3.0/docs/run/legacy-clients.md) описывает правило так: приложение `streamable_http_app()` обслуживает обе эпохи. Запрос с заголовком `MCP-Protocol-Version: 2026-07-28` идёт в новый обработчик. Запрос с версией старой эпохи или без заголовка идёт в старый транспорт с рукопожатием и сеансами.

В выпуске 2.3.0 нет настройки, которая отклоняет одну из эпох: ни в `streamable_http_app()`, ни в `run()`, ни в диспетчере сеансов. Обе эпохи включены всегда. Единственная настройка рядом - `stateless_http`, и она влияет только на обслуживание старых клиентов.

Старый клиент получает `Mcp-Session-Id`, а запись о сеансе хранится в обычном словаре внутри процесса. Подключить внешнее хранилище сеансов нельзя. Если рабочих процессов больше одного, старым клиентам нужна привязка к процессу, иначе запрос с чужим идентификатором получит `404`. С `stateless_http=True` сеанс для старого клиента создаётся на один запрос, и привязка не нужна, но сервер уже не может обратиться к клиенту во время вызова.

```python title="server.py"
from mcp.server import MCPServer

mcp = MCPServer("Demo")

@mcp.tool()
def add(a: int, b: int) -> int:
    """Add two numbers."""
    return a + b

@mcp.resource("greeting://{name}")
def greeting(name: str) -> str:
    """Greet someone by name."""
    return f"Hello, {name}!"
```

Пример взят из документации выпуска 2.3.0 и здесь не запускался.

README запускает этот файл двумя способами: `uv run mcp dev server.py` открывает его в MCP Inspector, а `uv run mcp run server.py --transport streamable-http` поднимает сервер по HTTP для клиента из примера выше. Про Inspector есть [отдельная страница](https://mcpdoc.ru/tools/inspector/).

## Ветка 1.x

По [README ветки](https://github.com/modelcontextprotocol/python-sdk/blob/v1.30.0/README.md), 1.x - ветка сопровождения: она получает исправления критичных ошибок и обновления безопасности. Команда `pip install mcp` без ограничения ставит уже 2.x, поэтому для 1.x нужна верхняя граница:

```bash title="Установка 1.x"
pip install "mcp[cli]<2"
```

Список версий выпуска 1.30.0 в [`shared/version.py`](https://github.com/modelcontextprotocol/python-sdk/blob/v1.30.0/src/mcp/shared/version.py) заканчивается на 2025-11-25. Редакции 2026-07-28 в нём нет, поэтому 1.x - только Legacy.

## Расширения

**Tasks.** В выпуске 2.3.0 расширение не реализовано. Руководство по переходу говорит прямо: опытная поддержка задач из 1.x удалена вместе с модулями `mcp.*.experimental`, а новое расширение `io.modelcontextprotocol/tasks` SDK пока не реализует. Готовой замены нет. В 1.30.0 остаются опытные задачи в форме редакции 2025-11-25; с расширением новой редакции они несовместимы.

**MCP Apps.** Серверная часть есть: по [документу об Apps](https://github.com/modelcontextprotocol/python-sdk/blob/v2.3.0/docs/advanced/apps.md), SDK поставляет встроенное расширение `Apps` (`io.modelcontextprotocol/ui`). Оно связывает инструмент с ресурсом `ui://`, в котором лежит страница HTML. Сообщения `ui/*` сервер не отправляет и не получает: они идут между программой-хостом и встроенной страницей. Есть ли в SDK средства для стороны хоста, неизвестно.

Что такое расширения и как о них договариваются стороны - на странице [о расширениях](https://mcpdoc.ru/protocol/extensions/).

## Устаревшее, что выпуск ещё содержит

По [документу об устаревшем](https://github.com/modelcontextprotocol/python-sdk/blob/v2.3.0/docs/deprecated.md), SDK по-прежнему реализует всё перечисленное ниже и при первом вызове показывает предупреждение `MCPDeprecationWarning`:

- **Roots, Sampling по запросу сервера, Logging протокола.** Работают на соединении, которое согласовало 2025-11-25 или более раннюю версию.
- **`ping`.** В редакции 2026-07-28 метод удалён. `client.send_ping()` работает только на соединении `mode="legacy"`.
- **Уведомления о ходе работы от клиента к серверу.** В новой редакции ход работы сообщает только сервер.

Отдельно от этого списка:

- **HTTP+SSE.** По [документу о запуске](https://github.com/modelcontextprotocol/python-sdk/blob/v2.3.0/docs/run/index.md), `mcp.run(transport="sse")` ещё работает, но оставлен для клиентов, которые не перешли на Streamable HTTP. Строить на нём новое документ не советует.
- **Динамическая регистрация клиента.** OAuth-клиент SDK умеет и её, и Client ID Metadata Documents. Помечена ли динамическая регистрация как устаревшая в самом коде выпуска, неизвестно.
- **Сеансы и `initialize`.** Сохранены для старых клиентов, как описано выше.

Общий список - на странице [об устаревших возможностях](https://mcpdoc.ru/protocol/deprecations/).

## Выпуск и ветка main

На 4 октября 2026 ветка `main` указывает на то же изменение, что и метка `v2.3.0`: расхождений нет. Пробных выпусков новее 2.3.0 на PyPI нет.

## Что неизвестно

- Есть ли в выпуске 2.3.0 программный интерфейс для стороны хоста MCP Apps: документ об Apps описывает только сервер.
- Несёт ли динамическая регистрация клиента пометку об устаревании в коде выпуска: в документации выпуска такой пометки не найдено.
- Есть ли MCP Apps в ветке 1.x: не проверялось.
- Содержимое опубликованных архивов PyPI отдельно не распаковывалось: сверялись исходники по метке выпуска и данные реестра.

## Что читать дальше

- [Все официальные SDK](https://mcpdoc.ru/sdk/)
- [Версии протокола и эпохи](https://mcpdoc.ru/protocol/versions/)
- [Запрос server/discover](https://mcpdoc.ru/protocol/discovery/)
- [Сервер двух эпох](https://mcpdoc.ru/deployment/dual-era/)
