Я уже писал о том, что описания инструментов подключённых 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 тысяч.

В итоге я заменил:

Для 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 там, где это возможно.