AmigaОбучение ИИ
Модуль 3 · MCP-клиенты · урок 5 из 14

Как хосты и клиенты используют MCP

10 мин чтения▶ есть видеоверсия

До сих пор мы смотрели на MCP глазами автора сервера. Теперь встанем на сторону пользователя: у вас есть готовый сервер (свой или чужой), и его нужно подключить к Claude Code или приложению Claude. В этом уроке — как это делается, что хост берёт на себя и где проходит граница между «подключить сервер» и «написать клиент».

Что хост делает за вас

Когда вы подключаете сервер к хосту, тот выполняет всю работу клиента:

  1. Запускает сервер (для stdio — как дочерний процесс с указанной командой) или открывает соединение по URL.
  2. Узнаёт возможности сервера и запрашивает списки инструментов, ресурсов и промптов.
  3. Складывает инструменты всех подключённых серверов в один список и показывает его модели вместе с вашим запросом.
  4. Когда модель просит вызвать инструмент — спрашивает у вас подтверждение, передаёт вызов нужному серверу, возвращает результат модели.
  5. Показывает ресурсы и промпты в интерфейсе, чтобы вы могли ими воспользоваться.

Вы не пишете ни строчки кода. Ваша работа — сказать хосту, как запустить сервер, и решать, каким вызовам доверять.

Claude Code: команда и файл

В Claude Code сервер добавляется командой claude mcp add. Для локального сервера на stdio команда выглядит так:

bash
claude mcp add project-docs -- uv --directory /абсолютный/путь/project-docs run docs_server.py

Двойной дефис -- обязателен: всё после него — команда запуска сервера, и Claude Code передаёт её как есть, не пытаясь разобрать флаги. Для удалённого сервера указывается транспорт и URL:

bash
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 для нашего сервера выглядит так:

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 мин на рабочем месте
  1. Выполните claude mcp list и посмотрите, какие серверы уже настроены. Для каждого определите транспорт и область видимости.
  2. Найдите в любом рабочем репозитории файл .mcp.json (или создайте его для одного из уже подключённых серверов с областью project). Посмотрите, как Claude Code спрашивает доверие при следующем запуске.
  3. Вызовите в 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. Тогда клиент — ваш код: запустить сервер, получить инструменты, передать их модели, обработать вызовы. Протокол тот же. Разница в том, кто отвечает за цикл «модель попросила инструмент — выполнили — вернули результат».

И короткое замечание про переменные окружения. Дочерний процесс сервера не получает всё окружение вашего терминала автоматически. Если серверу нужен токен или адрес базы, укажите их явно при добавлении сервера или в поле окружения в файле конфигурации. Иначе сервер запустится, но при первом же вызове упадёт с ошибкой доступа, и вы будете долго искать причину.

Со следующего урока начинаем практику: настроим проект и напишем первый сервер.

Отметка хранится только в вашем браузере