Предупреждение: всё, что вы прочитаете ниже — результат недели экспериментов с Claude 4.6 Opus и десятком MCP-серверов. Цифры честные, подход рабочий, но ваш mileage может отличаться. Если не хотите повторять мои грабли — читайте внимательно.
Вы собрали крутого агента на Claude, накрутили MCP-серверов под каждую задачу: GitHub, Jira, Slack, база знаний, Postgres, Kubernetes. 93 инструмента. Гордость распирает. А потом приходит счёт от Anthropic и вы понимаете: половина контекстного окна уходит на то, чтобы просто перечислить, что умеют ваши инструменты. Знакомо?
Почему ваш MCP-сервер пожирает контекст быстрее, чем вы успеваете моргнуть
Схема инструмента (tool schema) — это JSON, который Claude получает перед каждым вызовом. Он описывает название, описание, параметры и их типы. Чем больше инструментов — тем жирнее схема. Я замерил типовой набор из 93 MCP-инструментов. Результат: от 42 000 до 55 000 токенов. Это больше, чем весь текст «Евгения Онегина». И это только «меню» для модели.
При этом сам агент ещё не сделал ни одного полезного действия. Он просто прочитал список того, что может сделать. И заплатил. (Спойлер: 55K токенов через API Anthropic по тарифу Opus — это около $1,5 за один запрос только на описание схемы.)
len(json.dumps(schema).split()). Так считают не токены, а слова. На выходе вы получаете цифру в 2-3 раза ниже реальной. Claude считает иначе, и его токенизатор кратно дороже, чем «наивная» оценка.Родной токенизатор: единственный честный способ измерения
Anthropic опубликовала токенизатор Claude (на базе claude-tokenizer в Python). Только он учитывает внутренние правила разбиения — пробелы, подстроки, мультибайтовые символы. Если считаете через tiktoken — получите погрешность до 30%.
Установка:
pip install claude-tokenizer
Код замера (на примере MCP-схемы, полученной через list_tools):
import json
from claude_tokenizer import tokenize
from mcp import ClientSession
async def measure_schema_tokens(session: ClientSession):
tools = await session.list_tools()
schema = [tool.model_dump() for tool in tools.tools]
raw = json.dumps(schema, ensure_ascii=False, default=str)
tokens = tokenize(raw)
return len(tokens), raw
# Использование
count, _ = await measure_schema_tokens(mcp_session)
print(f"Schema consumes {count} tokens")
💡 На момент статьи (июнь 2026) последняя версия токенизатора — 0.5.1. Она корректно обрабатывает Unicode и длинные последовательности. Если у вас версия ниже — обновитесь: pip install -U claude-tokenizer.
После замера вы получаете реальную цифру. Дальше — резать.
Как я урезал схему с 55K до 12K и не сломал агента
Оптимизация — это не «удалить половину инструментов». Это умное сокращение каждого поля там, где модель способна восстановить смысл из контекста. Поэтапный план с цифрами.
1 Уберите «шумные» поля из описания параметров
Многие MCP-серверы генерируют длинные description для каждого параметра: «The unique identifier of the repository (e.g., owner/repo)». Это занимает ~15 токенов. Если параметров 10 — уже 150 токенов на один инструмент. Для 90 инструментов — 13 500 токенов.
Решение: переопределить схемы через middleware, сократив описания до ключевых слов: «repo_id (owner/repo)» → 4 токена. Или вообще убрать description, если имя параметра говорит само за себя.
# Пример middleware для сокращения
for tool in tools:
for param in tool.inputSchema.get('properties', {}).values():
if 'description' in param:
# Оставляем только первое предложение
param['description'] = param['description'].split('.')[0][:60]
2 Объедините похожие инструменты в один с параметром action
Вместо create_issue, update_issue, list_issues сделайте один issues с полем action: 'create'|'update'|'list'. Схема одного инструмента всегда меньше, чем трёх. На моём наборе это дало —45% токенов схемы.
3 Удалите rarely-used инструменты из базовой схемы, добавьте их в fallback
Если у вас есть инструменты, которые агент использует раз в 100 вызовов (например, audit_logs), не тащите их в каждый промпт. Вынесите их в отдельный «ленивый» MCP-сервер, который Claude может запросить отдельной командой load_tools. В токенах эта команда стоит 100 токенов, а не 500.
4 Сжимайте JSON — без пробелов, короткие ключи
Замените "description" на "desc", "type" остаётся, "properties" → "props". JSON без лишних пробелов. Кажется мелочью, но 93 инструмента — это ~300 ключей. Каждый ключ — от 5 до 15 символов. Сокращение вдвое — 1 500 токенов экономии.
Проверка на практике: было-стало
| Метрика | До оптимизации | После оптимизации |
|---|---|---|
| Количество инструментов | 93 | 93 (но 12 вынесены в ленивый сервер) |
| Токенов на схему | ~55 000 | ~12 000 |
| Средняя длина описания параметра | 28 токенов | 9 токенов |
| Стоимость одного запроса (Opus 4.6) | ~$1.65 | ~$0.36 |
Разница в 4,5 раза. За день агент делает 2000 запросов — экономия $2 580. Неплохо, да?
Нюансы, которые вас подставят
- Не обновляйте схемы на лету без тестов. Я однажды сократил описания настолько, что Claude перестал понимать, какой параметр обязательный. Результат — 400 Bad Request от API GitHub. Добавьте в пайплайн юнит-тесты, которые генерируют синтетический вызов и проверяют, что модель выбирает правильный action.
- Версия Claude имеет значение. Claude 4.6 Opus (вышел в апреле 2026) гораздо терпимее к кратким описаниям, чем Claude 3. Если ваши пользователи сидят на старой модели — не жмите так сильно.
- Динамическая схема — палка о двух концах. mcp-context-proxy умеет отдавать только релевантные инструменты, но его «умное» сокращение само потребляет токены. Замерьте общий эффект, прежде чем включать.
А что, если я использую локальную LLM, а не Anthropic?
Принцип тот же, но токенизатор другой. Для локальных моделей (Llama 3, Mistral) считайте через transformers.AutoTokenizer. Однако экономия в деньгах меньше — локальные модели не тарифицируются за токен. Зато в контекстном окне вы ограничены сильнее. Как я описывал в гайде по энергопотреблению локальных LLM, лишние токены — это лишнее время инференса и нагрев GPU.
Автоматизируйте замеры и оптимизацию
Ручная оптимизация — путь в никуда. Напишите скрипт, который при старте MCP-сервера:
- Запрашивает схему через
list_tools. - Применяет middleware для сокращения.
- Замеряет токены через
claude-tokenizer. - Если токенов больше порога (например, 15K) — логирует предупреждение.
Интегрируйте это в CI/CD. Поверьте, ваш будущий кошелёк скажет спасибо. Тот же подход можно использовать для Claude-spend — утилиты, которая отслеживает утечку токенов в реальном времени.
Частые вопросы и ответы
Что делать, если после сокращения схемы модель начала ошибаться?
Вернитесь на шаг назад. Добавьте больше контекста в описание тех параметров, где ошибки происходят чаще всего. Обычно достаточно 1-2 слов вместо 10. Также попробуйте увеличить количество примеров в few-shot.
Обязательно ли использовать именно claude-tokenizer?
Для точных замеров — да. Если нужно оценить быстро — можно использовать anthropic.TOKENIZER через API, но это дополнительные затраты. Локальный токенизатор — дешевле и быстрее.
Подходит ли этот метод для Hermes Agent?
Да, принцип универсален. В Hermes Agent можно переопределить схемы через YAML-конфиг, что ещё удобнее для быстрого тестирования.
* Все замеры выполнены 10–11 июня 2026 года с использованием Claude 4.6 Opus через API Anthropic. GitHub MCP сервер: github-mcp-server версии 2.4.1.