Модуль 6
MCP
Remote- и local-серверы в mcp.servers, инструмент context7 в работе, имена <server>_<tool>, права на инструменты сервера и гигиена контекста.
Содержание модуля
Чему научишься
- подключать remote- и local-серверы командой opencode mcp add и проверять их в /mcps
- читать и править конфиг mcp.servers: type, url, command, environment, disabled
- закрывать инструменты серверов правилами permissions и держать конфиг минимальным
Без стандарта каждая связка «агент + внешний сервис» — отдельная интеграция: десять агентов и десять сервисов дают сто интеграций. MCP (Model Context Protocol) решает эту проблему: открытый протокол, по которому любой агент подключается к любому серверу инструментов. Спецификация — modelcontextprotocol.io, каталог серверов — в репозитории MCP на GitHub: документация, базы данных, трекеры, браузеры.
MCP — это USB-порт для инструментов. Подключаешь сервер, и агент получает его инструменты: Context7 даёт поиск по актуальной документации библиотек, сервер БД открывает запросы к данным, сервер трекера управляет задачами. Платой за подключение служит контекст: описания инструментов каждого сервера едут в каждый запрос, поэтому в конфиге держат только серверы с текущими задачами.
Remote-сервер за одну команду
# remote-сервер (HTTP): команда пишет сервер в opencode.jsonc проекта
opencode mcp add context7 --url https://mcp.context7.com/mcp
# то же сразу для всех проектов
opencode mcp add context7 --global --url https://mcp.context7.com/mcp
# статус серверов из терминала
opencode mcp listRemote-сервер работает по HTTP и обычно авторизуется OAuth: если opencode mcp list показывает needs authentication, открой OpenCode, выполни /mcps, выбери сервер и войди через браузер. Сервер с API-ключом подключается заголовком; ключ берётся из переменной окружения через {env:ИМЯ} и в файл конфига не попадает.
{
"mcp": {
"servers": {
"context7": {
"type": "remote",
"url": "https://mcp.context7.com/mcp"
}
}
}
}@build проверь по актуальной документации: как в тестах поймать исключение из orderTotal на неизвестном menuId
Проверил через context7: assert.throws из node:assert ловит синхронное исключение, сообщение проверяется регуляркой. Для tests/pricing.test.ts набросал кейс: orderTotal с menuId «nope» бросает /Неизвестная позиция меню/, плюс регресс на quantity −2 из модуля 2. Ссылки на доки Node приложил.
Локальные серверы
Local-сервер — процесс, который OpenCode запускает сам: команда пишется в mcp add после --. Так подключают серверы, которых нет в интернете: работа с браузером через Playwright, доступ к локальной базе, корпоративные инструменты. Флаги --env передают переменные окружения, в конфиге команда превращается в массив command, переменные — в environment с подстановкой {env:ИМЯ}.
# демо-сервер MCP для проверки связки
opencode mcp add everything -- npx -y @modelcontextprotocol/server-everything
# с переменной окружения
opencode mcp add everything --env LOG_LEVEL=info -- npx -y @modelcontextprotocol/server-everything{
"mcp": {
"servers": {
"everything": {
"type": "local",
"command": ["npx", "-y", "@modelcontextprotocol/server-everything"],
"environment": { "LOG_LEVEL": "info" }
}
}
}
}Имена и права
Инструмент зовётся <server>_<tool>: имя сервера, затем имя инструмента. Символы вне букв, цифр, подчёркивания и дефиса заменяются на _, сам дефис сохраняется: у Context7 инструмент resolve-library-id остаётся context7_resolve-library-id. Промпты сервера превращаются в команды вида /server:prompt. Право на инструмент — правило permissions, где action равен имени инструмента; deny прячет инструмент без отключения сервера, правило работает и в permissions агента из модуля 4.
{
"permissions": [
{ "action": "context7_*", "resource": "*", "effect": "allow" },
{ "action": "playwright_*", "resource": "*", "effect": "deny" }
]
}Цена контекста и гигиена
Каждый подключённый сервер приносит описания своих инструментов в каждый запрос, а свои инструкции — в системный промпт сессии. Пять серверов по десятку инструментов съедают окно, которое нужно коду проекта; симптомы зоопарка и месячный аудит разбираем в модуле 9. Правило простое: подключён значит используется. Временно выключенный сервер описывается полем "disabled": true и не подключается; вернуть — убрать поле. Удалить сервер — стереть запись из mcp.servers.
Практика модуля
opencode mcp add context7 --url https://mcp.context7.com/mcpopencode mcp list@build проверь по актуальной документации: как в node:test замокать функцию из другого модуляopencode mcp add everything -- npx -y @modelcontextprotocol/server-everything
Отмечено 0 из 6
Проверь себя
Вопрос 1 из 4
Шпаргалка модуля
Команды
- opencode mcp add <имя> --url <адрес>
- remote-сервер в конфиг проекта; --global — на все проекты
- opencode mcp add <имя> -- <команда>
- local-сервер: процесс запускает OpenCode
- opencode mcp list и /mcps
- статус серверов; в /mcps же вход OAuth
Конфиг mcp.servers
- type: remote | local
- remote — url по HTTP, local — command-массив
- environment: {env:ИМЯ}
- переменные сервера; секреты в конфиг не пишут
- "disabled": true
- выключить сервер, сохранив настройку
Права и имена
- <server>_<tool>
- имя инструмента; action в permissions равен этому имени
- /<server>:<prompt>
- промпты сервера становятся командами
- deny по имени инструмента
- прячет инструмент, сервер остаётся подключён