Протокол Model Context Protocol (MCP) — это открытый стандарт, который помогает связывать ИИ-агентов с внешними системами. Обычно для подключения агентов к инструментам и данным приходится разрабатывать индивидуальные интеграции для каждой комбинации, что приводит к разрозненности и лишней работе, усложняя создание масштабируемых систем. MCP предлагает универсальный протокол: разработчики реализуют его один раз в своем агенте, и это открывает доступ ко всему набору интеграций.
С момента запуска MCP в ноябре 2024 года его использование растет быстро: сообщество создало тысячи серверов MCP, SDK доступны для всех основных языков программирования, и отрасль приняла MCP как фактический стандарт для связи агентов с инструментами и данными.
Сегодня разработчики часто создают агентов, имеющих доступ к сотням или тысячам инструментов через десятки серверов MCP. Но по мере роста числа подключенных инструментов загрузка всех описаний заранее и передача промежуточных результатов через окно контекста замедляют работу агентов и повышают затраты.
В этой статье разберем, как выполнение кода позволяет агентам взаимодействовать с серверами MCP более эффективно, справляясь с большим количеством инструментов при меньшем расходе токенов.
Избыточный расход токенов на инструменты снижает эффективность агентов
При масштабировании использования MCP возникают две типичные ситуации, которые увеличивают затраты и задержки агентов:
- Описания инструментов перегружают окно контекста;
- Промежуточные результаты от инструментов тратят лишние токены.
1. Описания инструментов перегружают окно контекста
Большинство клиентов MCP загружают все описания инструментов в контекст заранее, предоставляя их модели через прямой синтаксис вызова инструментов. Такие описания могут выглядеть так:
gdrive.getDocument Описание: Получает документ из Google Drive Параметры: documentId (обязательный, строка): ID документа для получения fields (необязательный, строка): Конкретные поля для возврата Возвращает: Объект документа с заголовком, содержимым, метаданными, разрешениями и т.д.salesforce.updateRecord Описание: Обновляет запись в Salesforce Параметры: objectType (обязательный, строка): Тип объекта Salesforce (Lead, Contact, Account и т.д.) recordId (обязательный, строка): ID записи для обновления data (обязательный, объект): Поля для обновления с новыми значениями Возвращает: Обновленный объект записи с подтверждениемОписания инструментов занимают много места в окне контекста, что замедляет ответы и увеличивает расходы. Когда агенты подключены к тысячам инструментов, им приходится обрабатывать сотни тысяч токенов еще до чтения запроса.
2. Промежуточные результаты от инструментов тратят лишние токены
Большинство клиентов MCP разрешают моделям напрямую вызывать инструменты MCP. Например, можно попросить агента: «Скачай стенограмму встречи из Google Drive и прикрепи ее к лиду в Salesforce».
Модель выполнит вызовы вроде:
ВЫЗОВ ИНСТРУМЕНТА: gdrive.getDocument(documentId: "abc123") → возвращает "Обсудили цели на Q4...\n[полный текст стенограммы]" (загружается в контекст модели) ВЫЗОВ ИНСТРУМЕНТА: salesforce.updateRecord( objectType: "SalesMeeting", recordId: "00Q5f000001abcXYZ", data: { "Notes": "Обсудили цели на Q4...\n[полный текст стенограммы указан полностью]" } ) (модели приходится снова записывать всю стенограмму в контекст)Каждый промежуточный результат проходит через модель. В этом примере полный текст стенограммы передается дважды. Для двухчасовой встречи по продажам это может добавить 50 000 токенов к обработке. Еще большие документы могут превысить лимит окна контекста, нарушая весь процесс.
При работе с крупными документами или сложными структурами данных модели чаще ошибаются при копировании информации между вызовами инструментов.

Выполнение кода с MCP повышает эффективность контекста
Поскольку среды для выполнения кода становятся обычными для агентов, одним из решений является представление серверов MCP как API для кода, а не прямых вызовов инструментов. Агент тогда пишет код для взаимодействия с серверами MCP. Такой метод решает обе проблемы: агенты загружают только нужные инструменты и обрабатывают данные в среде выполнения, прежде чем возвращать результаты модели.
Существует несколько способов реализации. Один из них — создание дерева файлов со всеми доступными инструментами из подключенных серверов MCP. Вот пример на TypeScript:
servers ├── google-drive │ ├── getDocument.ts │ ├── ... (другие инструменты) │ └── index.ts ├── salesforce │ ├── updateRecord.ts │ ├── ... (другие инструменты) │ └── index.ts └── ... (другие серверы)Каждый инструмент соответствует файлу, примерно такому:
// ./servers/google-drive/getDocument.ts import { callMCPTool } from "../../../client.js"; interface GetDocumentInput { documentId: string; } interface GetDocumentResponse { content: string; } /* Читает документ из Google Drive */ export async function getDocument(input: GetDocumentInput): Promise<GetDocumentResponse> { return callMCPTool<GetDocumentResponse>('google_drive__get_document', input); } Пример с Google Drive и Salesforce превращается в код:
// Читаем стенограмму из Google Docs и добавляем в перспективного клиента Salesforce import * as gdrive from './servers/google-drive'; import * as salesforce from './servers/salesforce'; const transcript = (await gdrive.getDocument({ documentId: 'abc123' })).content; await salesforce.updateRecord({ objectType: 'SalesMeeting', recordId: '00Q5f000001abcXYZ', data: { Notes: transcript } }); Агент обнаруживает инструменты, исследуя файловую систему: просматривает директорию ./servers/, чтобы найти доступные серверы (например, google-drive и salesforce), затем читает нужные файлы инструментов (например, getDocument.ts и updateRecord.ts), чтобы понять интерфейс каждого. Это позволяет агенту загружать только определения, необходимые для текущей задачи. Так расход токенов снижается с 150 000 до 2 000 — экономия времени и затрат на 98,7%.
Cloudflare опубликовала похожие выводы, называя выполнение кода с MCP «Code Mode». Основная идея та же: большие языковые модели хорошо пишут код, и разработчики должны использовать это умение, чтобы создавать агентов, взаимодействующих с серверами MCP более эффективно.
Преимущества выполнения кода с MCP
Выполнение кода с MCP помогает агентам тратить контекст экономнее, загружая инструменты по мере необходимости, фильтруя данные перед передачей модели и выполняя сложную логику за один шаг. Кроме того, подход дает плюсы в безопасности и управлении состоянием.
Постепенное раскрытие информации
Модели отлично ориентируются в файловых системах. Представление инструментов как кода в файловой системе позволяет моделям читать описания по требованию, а не все сразу.
Альтернативно, на сервер можно добавить инструмент search_tools для поиска релевантных описаний. Например, при работе с гипотетическим сервером Salesforce агент ищет «salesforce» и загружает только те инструменты, которые нужны для задачи. Добавление параметра уровня детализации в search_tools — например, только имя, имя с описанием или полное определение со схемами — помогает агенту экономить контекст и быстро находить инструменты.
Эффективные результаты от инструментов в контексте
При работе с большими наборами данных агенты могут фильтровать и преобразовывать результаты в коде перед возвратом. Представьте загрузку таблицы с 10 000 строк:
// Без выполнения кода — все строки проходят через контекст ВЫЗОВ ИНСТРУМЕНТА: gdrive.getSheet(sheetId: 'abc123') → возвращает 10 000 строк в контекст для ручной фильтрации // С выполнением кода — фильтрация в среде выполнения const allRows = await gdrive.getSheet({ sheetId: 'abc123' }); const pendingOrders = allRows.filter(row => row["Status"] === 'pending' ); console.log(`Найдено ${pendingOrders.length} ожидающих заказов`); console.log(pendingOrders.slice(0, 5)); // Логируем только первые 5 для проверкиАгент видит пять строк вместо 10 000. Аналогичные подходы подходят для агрегаций, объединений из нескольких источников данных или извлечения конкретных полей — все без раздувания окна контекста.
Более мощный и эффективный контроль потока
Циклы, условия и обработку ошибок можно реализовать привычными паттернами кода, а не цепочкой отдельных вызовов инструментов. Например, для уведомления о развертывании в Slack агент напишет:
let found = false; while (!found) { const messages = await slack.getChannelHistory({ channel: 'C123456' }); found = messages.some(m => m.text.includes('deployment complete')); if (!found) await new Promise(r => setTimeout(r, 5000)); } console.log('Уведомление о развертывании получено');Это эффективнее, чем чередование вызовов инструментов MCP и команд ожидания в цикле агента.
Кроме того, возможность записать дерево условий для выполнения также сокращает задержку «времени до первого токена»: вместо ожидания оценки if-условия моделью среда выполнения сделает это сама.
Операции с сохранением приватности
При использовании выполнения кода с MCP промежуточные результаты по умолчанию остаются в среде выполнения. Агент видит только то, что явно логируется или возвращается, так что данные, которые не стоит передавать модели, могут проходить через рабочий процесс, не попадая в ее контекст.
Для особенно чувствительных задач хаб агента может автоматически токенизировать конфиденциальные данные. Например, при импорте контактов клиентов из таблицы в Salesforce агент напишет:
const sheet = await gdrive.getSheet({ sheetId: 'abc123' }); for (const row of sheet.rows) { await salesforce.updateRecord({ objectType: 'Lead', recordId: row.salesforceId, data: { Email: row.email, Phone: row.phone, Name: row.name } }); } console.log(`Обновлено ${sheet.rows.length} лидов`);Клиент MCP перехватывает данные и токенизирует персональные данные перед передачей модели:
// То, что увидит агент, если залогирует sheet.rows: [ { salesforceId: '00Q...', email: '[EMAIL_1]', phone: '[PHONE_1]', name: '[NAME_1]' }, { salesforceId: '00Q...', email: '[EMAIL_2]', phone: '[PHONE_2]', name: '[NAME_2]' }, ... ]Затем, при передаче данных в другой вызов инструмента MCP, они детокенизируются через поиск в клиенте MCP. Реальные email, номера телефонов и имена текут из Google Sheets в Salesforce, но никогда не проходят через модель. Это предотвращает случайное логирование или обработку чувствительных данных агентом. Такой метод также позволяет задавать строгие правила безопасности, определяя, куда и откуда могут течь данные.
Сохранение состояния и навыки
Выполнение кода с доступом к файловой системе позволяет агентам поддерживать состояние между операциями. Агенты могут записывать промежуточные результаты в файлы, чтобы возобновлять работу и отслеживать прогресс:
const leads = await salesforce.query({ query: 'SELECT Id, Email FROM Lead LIMIT 1000' }); const csvData = leads.map(l => `${l.Id},${l.Email}`).join('\n'); await fs.writeFile('./workspace/leads.csv', csvData); // Последующее выполнение продолжит с места остановки const saved = await fs.readFile('./workspace/leads.csv', 'utf-8');Агенты также могут сохранять свой код как переиспользуемые функции. После создания рабочего кода для задачи агент сохраняет его для повторного использования:
// В ./skills/save-sheet-as-csv.ts import * as gdrive from './servers/google-drive'; export async function saveSheetAsCsv(sheetId: string) { const data = await gdrive.getSheet({ sheetId }); const csv = data.map(row => row.join(',')).join('\n'); await fs.writeFile(`./workspace/sheet-${sheetId}.csv`, csv); return `./workspace/sheet-${sheetId}.csv`; } // Позже, в любом выполнении агента: import { saveSheetAsCsv } from './skills/save-sheet-as-csv'; const csvPath = await saveSheetAsCsv('abc123');Это тесно связано с понятием навыков — папок с переиспользуемыми инструкциями, скриптами и ресурсами, которые улучшают производительность моделей на специализированных задачах. Добавление файла SKILL.md к таким сохраненным функциям создает структурированный навык, на который модели могут ссылаться и использовать. Со временем это позволяет агенту накапливать набор высокоуровневых возможностей, развивая необходимую инфраструктуру для эффективной работы.
Стоит учитывать, что выполнение кода добавляет свою сложность. Запуск кода, генерируемого агентом, требует безопасной среды выполнения с подходящей песочницей, лимитами ресурсов и мониторингом. Эти требования инфраструктуры увеличивают эксплуатационные расходы и вопросы безопасности, которых избегают прямые вызовы инструментов. Преимущества выполнения кода — снижение затрат на токены, меньшие задержки и лучшая композиция инструментов — нужно взвешивать против этих издержек реализации.
Итог
MCP обеспечивает базовый протокол для связи агентов с множеством инструментов и систем. Однако при подключении слишком многих серверов описания инструментов и результаты могут тратить избыточно много токенов, снижая эффективность агентов.
Хотя многие из этих задач кажутся новыми — управление контекстом, композиция инструментов, сохранение состояния — у них есть проверенные решения из инженерии ПО. Выполнение кода применяет эти знакомые паттерны к агентам, позволяя им использовать привычные конструкции программирования для более эффективного взаимодействия с серверами MCP.