Как хосты и клиенты используют MCP
До сих пор мы смотрели на MCP глазами автора сервера. Теперь встанем на сторону пользователя: у вас есть готовый сервер (свой или чужой), и его нужно подключить к Claude Code или приложению Claude. В этом уроке — как это делается, что хост берёт на себя и где проходит граница между «подключить сервер» и «написать клиент».
Что хост делает за вас
Когда вы подключаете сервер к хосту, тот выполняет всю работу клиента:
- Запускает сервер (для stdio — как дочерний процесс с указанной командой) или открывает соединение по URL.
- Узнаёт возможности сервера и запрашивает списки инструментов, ресурсов и промптов.
- Складывает инструменты всех подключённых серверов в один список и показывает его модели вместе с вашим запросом.
- Когда модель просит вызвать инструмент — спрашивает у вас подтверждение, передаёт вызов нужному серверу, возвращает результат модели.
- Показывает ресурсы и промпты в интерфейсе, чтобы вы могли ими воспользоваться.
Вы не пишете ни строчки кода. Ваша работа — сказать хосту, как запустить сервер, и решать, каким вызовам доверять.
Claude Code: команда и файл
В Claude Code сервер добавляется командой claude mcp add. Для локального сервера на stdio команда выглядит так:
claude mcp add project-docs -- uv --directory /абсолютный/путь/project-docs run docs_server.pyДвойной дефис -- обязателен: всё после него — команда запуска сервера, и Claude Code передаёт её как есть, не пытаясь разобрать флаги. Для удалённого сервера указывается транспорт и URL:
claude mcp add --transport http wiki https://mcp.example.com/mcpПосмотреть, что подключено, — claude mcp list; удалить — claude mcp remove project-docs. Внутри сессии команда /mcp показывает состояние соединений, инструменты каждого сервера и позволяет включать и выключать серверы.
У каждого сервера есть область видимости (--scope):
local(по умолчанию) — только для вас и только в этом проекте;user— для вас во всех проектах;project— для всей команды: конфигурация записывается в файл.mcp.jsonв корне репозитория, и его можно закоммитить.
Файл .mcp.json для нашего сервера выглядит так:
{
"mcpServers": {
"project-docs": {
"command": "uv",
"args": ["--directory", "/абсолютный/путь/project-docs", "run", "docs_server.py"]
}
}
}Для удалённого сервера вместо command и args будут "type": "http" и "url". Секреты в файл не кладут: в значениях работает подстановка ${ИМЯ_ПЕРЕМЕННОЙ} из окружения, а переменные для процесса сервера передаются через поле env или флаг --env при добавлении.
Сервер из .mcp.json не включается молча: при первом запуске в проекте Claude Code спросит, доверяете ли вы серверам из этого файла. Это защита от репозитория, который подсовывает вам неизвестный процесс.
Приложение Claude
В приложении Claude локальные серверы описываются в файле claude_desktop_config.json с той же структурой mcpServers. На macOS он лежит в ~/Library/Application Support/Claude/, на Windows — в %APPDATA%\Claude\. После правки приложение нужно полностью перезапустить. Python SDK умеет добавить сервер туда сам: uv run mcp install docs_server.py.
Помимо локальных серверов, в приложении Claude есть коннекторы — удалённые серверы с авторизацией через OAuth, которые подключаются из настроек в пару кликов. С точки зрения протокола это те же MCP-серверы на Streamable HTTP, только запущенные не у вас.
Точное положение пунктов меню меняется от версии к версии, поэтому запоминайте принцип: локальный сервер — через файл конфигурации, удалённый — через раздел коннекторов в настройках.
Подтверждения и разрешения
Инструменты вызывает модель, поэтому хост ставит между её решением и выполнением человека. В Claude Code перед вызовом инструмента MCP-сервера появляется запрос: разрешить один раз, разрешить всегда для этого инструмента или отклонить. Разрешённые инструменты запоминаются в настройках проекта, и их можно пересмотреть.
Есть режимы, в которых Claude Code выполняет действия без вопросов, но и в них сервер может пометить инструмент как требующий явного подтверждения на каждый вызов — например, «выдать доступ» или «удалить». Организация со своей стороны может запретить отдельные инструменты полностью: тогда модель их просто не увидит.
Практический вывод для автора сервера: не рассчитывайте, что хост «сам разберётся». Опасные операции делайте отдельными инструментами с честным описанием, а не флагом внутри безобидного.
Ресурсы и промпты в интерфейсе
Ресурсы серверов в Claude Code подключаются к запросу через упоминание: @project-docs:docs://brief.md приложит содержимое документа к сообщению. Хост сам вызовет resources/read и вставит текст. Так работает «приложение контролирует ресурсы» из прошлого урока.
Промпты становятся командами вида /mcp__project-docs__summarize. Наберите её с аргументами — хост вызовет prompts/get, получит сообщения и отправит их модели как начало разговора.
Пользовательская сторона и программная
Всё, что мы делали в этом уроке, — пользовательская сторона: настроить хост и подтверждать вызовы. Клиент уже написан авторами Claude Code, и он умеет больше, чем нам понадобится: переподключение, OAuth, уведомления, несколько серверов сразу.
Программная сторона — это когда хост пишете вы сами: бот в Telegram, который должен ходить в трекер, скрипт для еженедельного отчёта, внутренний ассистент в CRM. Тогда клиент — ваш код: запустить сервер, получить инструменты, передать их модели через API, обработать вызовы. Именно это мы сделаем в уроке «Реализуем клиент»: в сотню строк на Python.
Разница не в протоколе — он один и тот же. Разница в том, кто отвечает за цикл «модель попросила инструмент — выполнили — вернули результат». В Claude Code за него отвечает Claude Code. В своём приложении — вы.
Попробуйте сами
10–15 мин на рабочем месте- Выполните
claude mcp listи посмотрите, какие серверы уже настроены. Для каждого определите транспорт и область видимости. - Найдите в любом рабочем репозитории файл
.mcp.json(или создайте его для одного из уже подключённых серверов с областьюproject). Посмотрите, как Claude Code спрашивает доверие при следующем запуске. - Вызовите в Claude Code инструмент любого подключённого сервера и обратите внимание на диалог подтверждения. Разрешите его «всегда» и найдите, где это разрешение записалось.
Коротко
- Хост берёт на себя всю работу клиента: запуск сервера, обнаружение, передачу инструментов модели, подтверждения.
- Claude Code:
claude mcp add имя -- команда, областиlocal/user/project, файл.mcp.jsonдля команды,/mcpвнутри сессии. - Приложение Claude:
claude_desktop_config.jsonдля локальных серверов, коннекторы для удалённых. - Перед вызовом инструмента хост спрашивает подтверждение; секреты передаются через окружение, не через файл.
- Ресурсы подключаются через
@сервер:uri, промпты — командами/mcp__сервер__промпт. - Программная сторона — когда цикл вызова инструментов пишете вы сами. Это следующий модуль.
Видеоверсия
Сценарий озвучки · 487 слов, ≈ 4 мин
До сих пор мы смотрели на MCP глазами автора сервера. Сегодня встанем на сторону пользователя: сервер уже есть, и его нужно подключить к Claude Code или приложению Claude.
Что хост делает за вас. Он запускает сервер как дочерний процесс или открывает соединение по адресу. Узнаёт его возможности, запрашивает списки инструментов, ресурсов и промптов. Складывает инструменты всех серверов в один список и показывает модели вместе с вашим запросом. Когда модель просит вызвать инструмент — спрашивает у вас подтверждение, передаёт вызов серверу и возвращает результат. Вы не пишете ни строчки. Ваша работа — сказать хосту, как запустить сервер, и решать, каким вызовам доверять.
В Claude Code сервер добавляется командой «клод эм-си-пи адд». После имени сервера ставится двойной дефис, а за ним — команда запуска. Двойной дефис обязателен: всё после него передаётся как есть. У сервера есть область видимости: только для вас в этом проекте, для вас во всех проектах или для всей команды. В последнем случае конфигурация записывается в файл точка-эм-си-пи-джейсон в корне репозитория, и его можно закоммитить. Но такой сервер не включится молча: при первом запуске Claude Code спросит, доверяете ли вы серверам из этого файла. Это защита от репозитория, который подсовывает неизвестный процесс. Секреты в файл не кладут — их передают через переменные окружения.
В приложении Claude локальные серверы описываются в похожем файле конфигурации, а удалённые подключаются как коннекторы через настройки, в пару кликов. С точки зрения протокола это одно и то же — просто сервер запущен не у вас. Точное положение кнопок меняется от версии к версии, запоминайте принцип.
Теперь о подтверждениях. Инструменты вызывает модель, поэтому хост ставит между её решением и выполнением человека. Перед вызовом появляется запрос: разрешить один раз, разрешить всегда или отклонить. Есть режимы, где вопросов нет, но и там сервер может пометить инструмент как требующий подтверждения на каждый вызов. А организация может запретить отдельные инструменты полностью. Вывод для автора сервера: не рассчитывайте, что хост сам разберётся. Опасные операции делайте отдельными инструментами с честным описанием.
Ресурсы в Claude Code подключаются через упоминание с собачкой: имя сервера, двоеточие, адрес ресурса. Хост сам прочитает ресурс и вставит текст в сообщение. Промпты становятся командами через слеш с именем сервера и именем промпта.
И последнее — граница между пользовательской и программной стороной. Всё, что мы сделали сегодня, — пользовательская сторона: настроить хост и подтверждать вызовы. Клиент уже написан авторами Claude Code. Программная сторона — когда хост пишете вы: бот в Telegram, который ходит в трекер, скрипт для отчёта, ассистент в CRM. Тогда клиент — ваш код: запустить сервер, получить инструменты, передать их модели, обработать вызовы. Протокол тот же. Разница в том, кто отвечает за цикл «модель попросила инструмент — выполнили — вернули результат».
И короткое замечание про переменные окружения. Дочерний процесс сервера не получает всё окружение вашего терминала автоматически. Если серверу нужен токен или адрес базы, укажите их явно при добавлении сервера или в поле окружения в файле конфигурации. Иначе сервер запустится, но при первом же вызове упадёт с ошибкой доступа, и вы будете долго искать причину.
Со следующего урока начинаем практику: настроим проект и напишем первый сервер.
