Подключение внешних систем по протоколу инструментов расширяет агента за пределы репозитория: он получает типизированные инструменты, ресурсы, готовые запросы и возможность запросить у вас структурированный ввод. Транспортов три - локальный процесс через стандартные потоки, потоковый HTTP и вариант на серверных событиях. Конфигурация живёт в проектном и пользовательском файлах, и это тот же принцип слоёв, что и везде: проектный файл описывает то, что нужно всей команде, пользовательский - то, что нужно лично вам.
Наивное отношение - подключить сервер, потому что он удобен, и на этом успокоиться. Но сервер получает ровно те полномочия, которые даёт протокол, и действует во внешней системе от вашего имени. Красивое название и популярность в списке - не проверка безопасности. Подключение внешнего инструмента ближе к установке зависимости, чем к добавлению закладки: оно расширяет поверхность и требует того же внимания.
Полезно один раз увидеть конфигурацию с обоими транспортами. Ниже - локальный сервер, запускаемый как процесс с файлом переменных окружения, и удалённый по HTTP с заголовком авторизации, значение которого берётся из окружения. Ключевая деталь во втором случае: токен не написан в файле буквально, а подставляется. Литеральный секрет в конфигурации, лежащей в репозитории, - это утёкший секрет, даже если репозиторий приватный.
Подстановка поддерживает не только переменные окружения, но и домашний каталог, папку рабочей области, её имя и разделитель путей. Это полезнее, чем кажется: конфигурация становится переносимой между машинами и операционными системами без правки, а разделитель путей снимает вечную разницу между Windows и остальными. Для удалённых серверов с авторизацией через внешний провайдер есть поля клиента и области доступа - и именно области доступа стоит просматривать внимательнее всего, потому что они определяют, что сервер сможет сделать от вашего имени.
Важно, что инструменты внешних серверов подчиняются общему режиму работы и обычно требуют подтверждения. Это не дублирование, а правильная композиция: режим определяет, спрашивают ли вас, а политика сервера - какие инструменты вообще доступны. Администраторы команды раздают общие серверы, а ограничивать набор серверов, конкретные инструменты и сетевые адреса может администратор организации. А в протоколе взаимодействия с редакторами серверы командного уровня не поддерживаются - там работает только проектная и пользовательская конфигурация.
Выбор транспорта - это не вкус, а решение о том, где исполняется код и куда уходят данные. Локальный процесс запускается на вашей машине с вашими правами: он видит файловую систему и окружение, но содержимое запросов не покидает машину. Удалённый сервер по HTTP не исполняется у вас, зато каждый вызов уходит наружу вместе с аргументами, а значит, туда попадают фрагменты кода и данных, которые вы передаёте в инструмент. Отсюда практическое правило: локальный транспорт удобнее для того, что работает с репозиторием, удалённый - для того, что и так живёт снаружи.
Отдельно стоит помнить про запрос структурированного ввода. Сервер может попросить у вас данные во время вызова - это удобный механизм для параметров, которых не было в исходной задаче. Но именно он становится каналом социальной инженерии: запрос выглядит как часть рабочего процесса, а просят в нём то, чего просить не должны. Секреты через такой канал не передают, а сам запрос читают как приходящий извне.
Есть признак, по которому понимают, что подключено лишнее. Агент начинает выбирать не тот инструмент, подтверждения сыплются на каждом шаге, а простая задача идёт заметно дольше обычного. Причина обычно одна: каждый включённый инструмент занимает место в контексте своим описанием и участвует в выборе. Десяток серверов с полным набором возможностей - это сотня описаний, среди которых модель ищет нужное. Поэтому список включённых инструментов держат узким и пересматривают его так же, как список зависимостей.
Инженерный вывод простой: внешний сервер - это исполняемая интеграция. Проверяют издателя, адрес или команду запуска, области доступа, аргументы вызовов, сетевую политику и то, что сервер возвращает. Возвращаемое содержимое проверяют отдельно: оно попадает в контекст агента как обычный текст и может содержать инструкции, которых вы не писали.
Типичные провалы предсказуемы. Записать токен в конфигурацию буквально и закоммитить. Оставить включёнными все инструменты сервера, включая изменяющие данные. Считать подключённый сервер доверенным по факту подключения. И передать секрет через запрос структурированного ввода, приняв его за часть интерфейса.
// .cursor/mcp.json
{
"mcpServers": {
"docs": {
"type": "stdio",
"command": "node",
"args": ["./tools/docs-mcp.mjs"],
"envFile": ".env.mcp"
},
"issues": {
"url": "https://mcp.example.com/mcp",
"headers": {
"Authorization": "Bearer ${env:ISSUES_MCP_TOKEN}"
}
}
}
}
// подстановка: ${env:NAME}, ${userHome}, ${workspaceFolder}, ${pathSeparator}