Оптимизация MCP-контекста
Содержание
Я уже писал о том, что описания инструментов подключённых MCP-серверов подгружаются в текущий контекст и увеличивают потребление токенов. На тарифах Pay as you go за это приходится больше платить, а на фиксированных тарифах быстрее съедаются лимиты.
Недавно на собственном опыте я осознал масштаб проблемы. Я веду базу знаний в Obsidian и работаю с ней преимущественно через OpenCode. У меня был подключён набор MCP-серверов: Notion, Google Docs, Google Contacts, NotebookLM, Telegram, Google Stitch, Figma и Todoist.
Я начал замечать, что лимиты съедаются слишком быстро, особенно когда я запускаю много субагентов.
80 тысяч токенов на инструменты⌗
Оказалось, что весь этот набор MCP-инструментов потреблял около 80 тысяч токенов контекста.
В одной сессии это не так критично: входные токены считаются для каждого нового сообщения, а предыдущие сообщения кэшируются и тарифицируются как cached input. В API цена cached input примерно в десять раз ниже. Для фиксированных планов точных данных нет.
Но каждый субагент запускает новую сессию. В ней эти 80 тысяч токенов уже считаются полноценным input.
Есть и другая проблема. Каждая сессия OpenCode запускает отдельный процесс для каждого MCP-сервера, если только это не удалённый HTTP endpoint, как у Stitch и Notion. Пять сессий OpenCode в разных вкладках терминала — это дополнительно пять наборов процессов. В моём случае, за вычетом Stitch и Notion, получилось ещё 30 процессов.
MCP-серверы могут быть некачественно собраны и иметь утечки памяти. При активном использовании они начинают разбухать и потреблять оперативную память.
Skills вместо MCP⌗
Решение простое: заменить MCP на skills.
Агент загружает в контекст только краткое описание скилла — рекомендуемый размер составляет до 1 024 символов — с ключевыми фразами, которые должны запускать полную загрузку. 1 024 символа — это примерно 256 токенов максимум на один скилл.
Для моего набора MCP-серверов это дало бы около 2 048 токенов вместо исходных 80 тысяч.
В итоге я заменил:
- Google Docs и Google Contacts — на gogcli;
- NotebookLM — на notebooklm-mcp-cli;
- Todoist — на todoist-cli.
Для Telegram, Notion, Stitch и Figma аналогов я не нашёл. Здесь есть два варианта.
Первый — отключить их в конфиге OpenCode через "enabled": false и включать из сессии командой /mcps, нажимая пробел на нужном MCP. Это подходит, если MCP-серверы используются нечасто и ручное включение не мешает.
Второй — убрать MCP-серверы за фасад, например mcpjungle.
Фасад для MCP-серверов⌗
Вынос MCP-серверов за фасад решает проблему с большим количеством процессов: количество процессов растёт как число OpenCode-сессий, умноженное на число MCP-серверов.
mcpjungle делает lazy load серверов и завершает их после таймаута неактивности. Но описания инструментов всё равно остаются в контексте. Чтобы этого избежать, инструменты можно убрать из контекста основной сессии и сделать доступными только субагентам.
Например, в OpenCode это можно настроить так:
{
"tools": {
"mcpjungle_telegram*": false,
"mcpjungle*": false
},
"agent": {
"telegram": {
"description": "Telegram messaging agent with access to Telegram tools via mcpjungle",
"mode": "subagent",
"tools": {
"mcpjungle_telegram*": true
}
}
}
}
После этого агента можно вызвать сообщением вроде @telegram выведи мне 10 последних чатов.
Главный вывод простой: берегите контекст смолоду — используйте skills вместо MCP там, где это возможно.