Skip to main content
Model Context Protocol (MCP) — это открытый стандарт для подключения AI агентов к внешним инструментам и источникам данных. С помощью MCP ваш агент может запрашивать базы данных, интегрироваться с API, такими как Slack и GitHub, и подключаться к другим сервисам без написания пользовательских реализаций инструментов. MCP серверы могут работать как локальные процессы, подключаться через HTTP или выполняться непосредственно в вашем приложении SDK.
На этой странице рассматривается конфигурация MCP для Agent SDK. Чтобы добавить MCP серверы в Claude Code CLI так, чтобы они загружались в каждом проекте, см. Области установки MCP.

Быстрый старт

Этот пример подключается к MCP серверу документации Claude Code с использованием HTTP транспорта и использует allowedTools с подстановочным знаком для разрешения всех инструментов с сервера.
Агент подключается к серверу документации, ищет информацию о hooks и возвращает результаты.

Добавить MCP сервер

Вы можете настроить MCP серверы в коде при вызове query(), или в файле .mcp.json, загруженном через settingSources.

Добавление сервера в коде

Передайте MCP серверы непосредственно в опции mcpServers. Этот пример запускает локальный файловый MCP сервер для /Users/me/projects. Замените этот путь на директорию на вашей машине:

Добавление сервера из файла конфигурации

Создайте файл .mcp.json в корне вашего проекта. Файл загружается, когда включен источник настроек project, что происходит по умолчанию для опций query(). Если вы явно установите settingSources, включите "project" для загрузки этого файла. Замените /Users/me/projects на директорию на вашей машине:

Время подключения

Claude Code регистрирует серверы, которые вы передаёте в options.mcpServers при запуске и отправляет сообщение инициализации после разрешения первого ожидания, если оно есть. Подключение каждого сервера из options.mcpServers и задерживает ли он первый ход, зависит от его типа: Серверы, загруженные из файлов конфигурации, таких как .mcp.json, или из плагинов обычно показывают pending в сообщении инициализации. Когда options.mcpServers содержит сервер stdio, HTTP или SSE, первый ход ждёт эти ожидающие серверы тоже, до MCP_TIMEOUT. Когда options.mcpServers пуст или содержит только SDK серверы, первый ход ждёт до 2 секунд вместо этого:
  • С поиском инструментов, по умолчанию: ожидание охватывает всё ещё ожидающие серверы, настроенные с alwaysLoad: true, и не остальные. Остальные продолжают подключаться в фоновом режиме. Доступность инструментов описывает, как Claude достигает их инструментов после подключения.
  • Без поиска инструментов: ожидание охватывает каждый ожидающий сервер. Настройка поиска инструментов охватывает то, что отключает поиск инструментов. Если вы исключите инструмент ToolSearch из сеанса, например через disallowedTools, сеанс также работает без поиска инструментов.
Если вы установите permissionPromptToolName, первый ход также ждёт сервер этого инструмента в каждом случае, до MCP_TIMEOUT. Чтобы установить ожидание первого хода самостоятельно, добавьте CLAUDE_CODE_MCP_STARTUP_WAIT_MS в опцию env, например CLAUDE_CODE_MCP_STARTUP_WAIT_MS: "5000". Первый ход затем ждёт до этого количества миллисекунд для каждого ожидающего сервера, независимо от того, доступен ли поиск инструментов. Этот срок также заменяет ожидание первого хода MCP_TIMEOUT для серверов stdio, HTTP и SSE в options.mcpServers. CLAUDE_CODE_MCP_STARTUP_WAIT_MS требует Claude Code версии 2.1.274 или позже. Серверы, которые всё ещё ожидают, когда ожидание заканчивается, продолжают подключаться в фоновом режиме. Установите переменную в 0, чтобы пропустить ожидание. Сервер permissionPromptToolName сохраняет собственное ожидание MCP_TIMEOUT независимо от значения. Чтобы заблокировать сам запуск на отдельной, более ранней фазе, чем ожидание первого хода, перед отправкой сообщения инициализации:
  • Установите MCP_CONNECTION_NONBLOCKING в значение 0, чтобы заблокировать всю партию подключений. Claude Code ограничивает это ожидание 5 секундами по умолчанию. Отрегулируйте ограничение с помощью переменной окружения MCP_CONNECT_TIMEOUT_MS в миллисекундах. Серверы, которые всё ещё ожидают в этот момент, продолжают подключаться в фоновом режиме.
  • Установите alwaysLoad: true в конфигурации сервера, чтобы его инструменты были доступны с полными схемами на первом ходе, исключены из отложенного поиска инструментов. Claude Code ждёт при запуске инструментов этого сервера, ограничено тем же сроком, в то время как другие серверы продолжают подключаться в фоновом режиме; удалённый сервер с кэшированным списком инструментов предоставляет их без подключения, согласно таблице выше.
Сообщение system с подтипом init сообщает статус каждого сервера в момент его отправки; см. Обработка ошибок для чтения этих статусов.

Разрешить инструменты MCP

Инструменты MCP требуют явного разрешения перед тем, как Claude сможет их использовать. Без разрешения Claude увидит, что инструменты доступны, но не сможет их вызывать.

Соглашение об именовании инструментов

Инструменты MCP именуются как mcp__<server-name>__<tool-name>, где <server-name> — это имя, под которым вы регистрируете сервер, например его ключ в mcpServers. Символы в имени сервера, такие как . и пробелы, заменяются на _. В этой таблице показано полное имя инструмента list_issues для двух ключей сервера: Используйте полные имена инструментов в allowedTools и в правилах разрешений MCP. Для сервера, который предоставляет плагин, <server-name> принимает форму с областью плагина и начинается с plugin_.

Автоматическое одобрение с allowedTools

Используйте allowedTools для автоматического одобрения определённых инструментов MCP, чтобы Claude мог их использовать без запроса разрешения:
Подстановочные знаки (*) позволяют вам разрешить все инструменты с сервера без перечисления каждого отдельно.
Предпочитайте allowedTools режимам разрешений для доступа MCP. permissionMode: "acceptEdits" не одобряет автоматически инструменты MCP (только редактирование файлов и команды Bash файловой системы). permissionMode: "bypassPermissions" одобряет автоматически инструменты MCP, но также отключает большинство других запросов безопасности, что шире, чем необходимо; см. Как оцениваются разрешения для запросов, которые остаются. Подстановочный знак в allowedTools предоставляет ровно тот сервер MCP, который вам нужен, и ничего больше. См. Режимы разрешений для полного сравнения.

Обнаружение доступных инструментов

Чтобы увидеть, какие инструменты предоставляет сервер MCP, проверьте документацию сервера или проверьте массив tools в инициализирующем сообщении system. Имена инструментов MCP начинаются с mcp__. Claude Code выдаёт инициализирующее сообщение после ожидания подключения на первом ходу для серверов, переданных в options.mcpServers, поэтому массив tools содержит инструменты mcp__ каждого сервера, который подключился к этому моменту, плюс те, у которых есть кэшированный список инструментов, которые подключаются при первом использовании. Инструменты любого другого сервера, который ещё не подключился, отсутствуют; см. Обработка ошибок для чтения статуса каждого сервера. Этот фильтр выводит имена инструментов MCP:
Вы также можете попросить Claude перечислить инструменты, доступные с сервера.

Типы транспорта

MCP серверы взаимодействуют с вашим агентом, используя различные протоколы транспорта. Проверьте документацию сервера, чтобы узнать, какой транспорт он поддерживает:
  • Если в документации указана команда для запуска (например, npx @modelcontextprotocol/server-filesystem), используйте stdio
  • Если в документации указан URL, используйте HTTP или SSE
  • Если вы создаёте свои собственные инструменты в коде, используйте SDK MCP сервер

stdio серверы

Локальные процессы, которые взаимодействуют через stdin/stdout. Используйте это для MCP-серверов, которые вы запускаете на одной машине. Для формата .mcp.json используйте те же поля, показанные в разделе Добавление сервера из файла конфигурации. В коде передайте команду и её аргументы. Замените /Users/me/projects на директорию на вашей машине:

HTTP/SSE серверы

Используйте HTTP или SSE для облачных MCP серверов и удалённых API. Для формата .mcp.json используйте те же поля, что и в примере в HTTP headers for remote servers, с "type": "sse" для SSE сервера. В коде передайте URL сервера:
Для потокового HTTP транспорта используйте "type": "http" вместо этого. В .mcp.json и других JSON файлах конфигурации "streamable-http" принимается как псевдоним для "http". Тип McpHttpServerConfig в SDK объявляет только "http", поэтому используйте "http" для серверов, которые вы передаёте в коде.

SDK MCP серверы

Определите пользовательские инструменты непосредственно в коде вашего приложения вместо запуска отдельного процесса сервера. Подробности реализации см. в custom tools guide. SDK MCP сервер, зарегистрированный запросом управления initialize, начинает подключаться сразу же после обработки запроса Claude Code. Когда у вас настроено много инструментов MCP, определения инструментов могут занимать значительную часть вашего контекстного окна. Поиск инструментов решает эту проблему, скрывая определения инструментов из контекста и загружая только те, которые Claude нужны для каждого хода. Поиск инструментов включен по умолчанию. Дополнительную информацию о параметрах конфигурации, лучших практиках и использовании поиска инструментов с пользовательскими инструментами SDK см. в разделе Поиск инструментов.

Аутентификация

Большинство серверов MCP требуют аутентификации для доступа к внешним сервисам. Передавайте учетные данные через переменные окружения в конфигурации сервера.

Передача учетных данных через переменные окружения

Используйте поле env для передачи ключей API, токенов и других учетных данных на сервер MCP:

HTTP-заголовки для удаленных серверов

Для HTTP и SSE серверов передавайте заголовки аутентификации непосредственно в конфигурации сервера:
Полный рабочий пример удаленного сервера с аутентификацией через заголовки см. в разделе Список проблем из репозитория.

Аутентификация OAuth2

Спецификация MCP поддерживает OAuth 2.1 для авторизации. SDK не открывает браузер и не запускает интерактивный поток OAuth. Когда настроенный сервер возвращает запрос авторизации и нет сохраненного токена, запуск агента продолжается без инструментов этого сервера, и сервер сообщает статус needs-auth. Массив mcp_servers системного инициализирующего сообщения может по-прежнему показывать pending для этого сервера при его отправке. Чтобы подтвердить, требуются ли серверу учетные данные, опросите mcpServerStatus() в TypeScript SDK или get_mcp_status() в Python. Для предоставления учетных данных завершите поток OAuth в своем приложении и передайте полученный токен доступа в headers сервера:

Примеры

Список проблем из репозитория

Этот пример подключается к удалённому серверу GitHub MCP для получения списка последних проблем. Пример включает отладочное логирование для проверки подключения MCP и вызовов инструментов. Перед запуском создайте личный токен доступа GitHub с правами на чтение репозиториев, которые вы хотите запросить, и установите его как переменную окружения:
В строке MCP servers: статус connected для github подтверждает, что токен работает. Если Claude Code имеет кэшированный список инструментов для сервера, статус может отображаться как pending, и сервер подключится при первом вызове инструмента. Если статус failed или needs-auth, см. Обработка ошибок перед тем, как доверять результату, так как Claude может вернуться к встроенным инструментам, когда сервер недоступен.

Запрос к базе данных

Этот пример использует DBHub для запроса к базе данных Postgres. Агент автоматически обнаруживает схему базы данных, пишет SQL-запрос и возвращает результаты. Инструмент execute_sql DBHub выполняет любой SQL, который выдаёт агент, включая операции записи, если вы это не ограничите. Установка readonly = true в файле конфигурации DBHub заставляет DBHub отклонять операторы INSERT, UPDATE, DELETE и DDL, поэтому пример не может изменять ваши данные, даже если агент выдаст операцию записи. DBHub разрешает ${DATABASE_URL} из переменных окружения процесса при загрузке конфига, поэтому строка подключения остаётся вне файла. Создайте этот файл dbhub.toml рядом с вашим скриптом:
dbhub.toml
Затем скрипт указывает DBHub на файл конфигурации вместо прямой передачи строки подключения. Перед запуском установите переменную окружения DATABASE_URL на вашу строку подключения. Замените значения-заполнители на детали вашей базы данных:

Обработка ошибок

MCP серверы могут не подключиться по различным причинам: процесс сервера может быть не установлен, учетные данные могут быть неверными или удаленный сервер может быть недоступен. Claude Code отправляет сообщение system с подтипом init в начале каждого запроса. Это сообщение включает статус подключения для каждого MCP сервера. Поле status может быть "pending", "connected", "failed", "needs-auth" или "disabled". Claude Code отправляет сообщение init после первого ожидания подключения для серверов, переданных в options.mcpServers, поэтому такой сервер, который подключился в течение ожидания, показывает "connected". В сообщении init не рассматривайте "pending" как ошибку само по себе. Это может означать любое из следующего: Проверьте "failed" или "needs-auth" для обнаружения серверов, которые не будут пригодны для использования:
Статус удаленного сервера также может измениться после того, как он сообщит "connected". Когда соединение с ним разрывается во время сеанса, Claude Code переводит сервер обратно в "pending" во время переподключения. Последующий вызов mcpServerStatus() в TypeScript или ClaudeSDKClient.get_mcp_status() в Python может затем сообщить "pending" для сервера, который вы видели подключенным ранее, без каких-либо изменений конфигурации с вашей стороны. После пяти неудачных попыток переподключения сервер сообщает "failed" или "needs-auth", когда ему требуется повторная авторизация. HTTP- или SSE-сервер в состоянии "failed" может вернуться в "connected" без какого-либо вызова с вашей стороны, поскольку после временной ошибки Claude Code продолжает повторять попытки в фоновом режиме. Для повторной попытки вручную вызовите reconnectMcpServer() в TypeScript или ClaudeSDKClient.reconnect_mcp_server() в Python.

Troubleshooting

Server shows “failed” status

Check the init message to see which servers failed to connect:
A "pending" status doesn’t mean the server failed. See Обработка ошибок for the cases it covers at init. To get updated statuses later in the session, call the query’s mcpServerStatus() method in the TypeScript SDK, or ClaudeSDKClient.get_mcp_status() in Python. Common causes:
  • Missing environment variables: Ensure required tokens and credentials are set. For stdio servers, check the env field matches what the server expects.
  • Server not installed: For npx commands, verify the package exists and Node.js is in your PATH.
  • Invalid connection string: For database servers, verify the connection string format and that the database is accessible.
  • Network issues: For remote HTTP/SSE servers, check the URL is reachable and any firewalls allow the connection.

Tools not being called

If Claude sees tools but doesn’t use them, check that you’ve granted permission with allowedTools:

Инструмент отсутствует в SDK MCP-сервере

В TypeScript SDK, если входную схему инструмента невозможно преобразовать в JSON Schema, сервер, созданный с помощью createSdkMcpServer(), не включает этот инструмент в список своих инструментов. В этот момент SDK выдаёт предупреждение. В Node.js это предупреждение процесса с кодом CLAUDE_SDK_MCP_TOOL_SCHEMA_UNCONVERTIBLE, и оно начинается с такого текста:
Далее в предупреждении приводится сообщение об ошибке преобразования, если оно есть, а затем указывается, что следует проверить и изменить. До версии TypeScript Agent SDK v0.3.286 одна непреобразуемая схема приводила к сбою всего списка инструментов сервера без этого предупреждения, поэтому ни один из инструментов этого сервера не попадал к Claude.

Connection timeouts

MCP server connections time out after 30 seconds by default. To change how long a running tool call may take, set MCP_TOOL_TIMEOUT. If your server takes longer to start, the connection fails. Raise the connection limit with the MCP_TIMEOUT environment variable, in milliseconds. For servers that need more startup time, also consider:
  • Using a lighter-weight server if available
  • Pre-warming the server before starting your agent
  • Checking server logs for slow initialization causes
In TypeScript, you can set the tool-call limit for a single SDK MCP server by passing timeout to createSdkMcpServer().

Tool output exceeds maximum allowed tokens

SDK применяет те же ограничения на вывод MCP, что и Claude Code. Когда успешный результат инструмента без изображений превышает 25 000 токенов, Claude Code сохраняет вывод в файл и заменяет результат инструмента сообщением об ошибке с путём к этому файлу, чтобы агент мог прочитать вывод по частям. Чтобы изменить лимит токенов, задайте переменную окружения MAX_MCP_OUTPUT_TOKENS. Если инструмент не объявляет anthropic/maxResultSizeChars, успешный текстовый результат длиннее 50 000 символов сохраняется в файл независимо от лимита токенов. Полное описание поведения, включая то, как сервер объявляет эту аннотацию, см. в разделе Ограничения и предупреждения вывода MCP.