Выполнение кода с Model Context Protocol
Как AI-агенты могут эффективно взаимодействовать с тысячами инструментов, используя меньше токенов через выполнение кода
Рекомендуем оригинал
Эта статья представляет собой подробный перевод и анализ оригинального блога Anthropic. Мы настоятельно рекомендуем ознакомиться с оригинальной публикацией.
Почему это важно?
- Революционный подход к взаимодействию AI-агентов с инструментами
- Решение критической проблемы масштабирования агентных систем
- Открытый стандарт MCP меняет индустрию AI-разработки
- Практические примеры из реального опыта команды Anthropic
Что такое Model Context Protocol?
Model Context Protocol (MCP) MCP — открытый протокол для подключения AI-агентов к внешним системам. Позволяет агентам взаимодействовать с любыми инструментами через единый интерфейс. — это открытый стандарт для подключения AI-агентов к внешним системам. Традиционно для подключения агентов к инструментам и данным требовалась индивидуальная интеграция для каждой пары, что создавало фрагментацию и дублирование усилий.
Эволюция подключения агентов
Без MCP
Каждый агент требует отдельной интеграции с каждым инструментом
С MCP
Единый протокол открывает доступ ко всей экосистеме
Стремительное принятие MCP
- Тысячи MCP-серверов созданы сообществом с момента запуска в ноябре 2024
- SDK доступны для всех основных языков программирования
- Индустрия приняла MCP как де-факто стандарт для подключения агентов
Проблемы избыточного потребления токенов
По мере масштабирования использования MCP возникают два типичных паттерна, которые увеличивают стоимость и задержку агентов:
1 Определения инструментов перегружают контекстное окно
Большинство MCP-клиентов загружают все определения инструментов заранее непосредственно в контекст, представляя их модели через прямой синтаксис вызова инструментов.
// Пример: Определение инструмента Google Drive
gdrive.getDocument
Описание: Извлекает документ из Google Drive
Параметры:
documentId (обязательный, string): ID документа для извлечения
fields (опциональный, string): Конкретные поля для возврата
Возвращает: Объект документа с заголовком, содержимым, метаданными, правами доступа и т.д.
// Пример: Определение инструмента Salesforce
salesforce.updateRecord
Описание: Обновляет запись в Salesforce
Параметры:
objectType (обязательный, string): Тип объекта Salesforce (Lead, Contact, Account и т.д.)
recordId (обязательный, string): ID записи для обновления
data (обязательный, object): Поля для обновления с новыми значениями
Возвращает: Обновленный объект записи с подтверждением
Проблема
Описания инструментов занимают больше места в контекстном окне, увеличивая время отклика и затраты. В случаях, когда агенты подключены к тысячам инструментов, им нужно обработать сотни тысяч токенов еще до чтения запроса.
2 Промежуточные результаты инструментов потребляют дополнительные токены
Большинство MCP-клиентов позволяют моделям напрямую вызывать MCP-инструменты. Например, запрос: "Загрузи транскрипт моей встречи из Google Drive и прикрепи его к лиду в Salesforce"
// Модель делает вызовы:
// Шаг 1: Получить документ
ВЫЗОВ ИНСТРУМЕНТА: gdrive.getDocument(documentId: "abc123")
возвращает "Обсуждали цели Q4...\n[полный текст транскрипта]"
(загружается в контекст модели)
// Шаг 2: Обновить запись (транскрипт проходит через контекст СНОВА)
ВЫЗОВ ИНСТРУМЕНТА: salesforce.updateRecord(
objectType: "SalesMeeting",
recordId: "00Q5f000001abcXYZ",
data: {
"Notes": "Обсуждали цели Q4...\n[полный текст транскрипта снова]"
}
)
(модель должна записать весь транскрипт в контекст еще раз)
Проблема
Каждый промежуточный результат должен проходить через модель. В этом примере полный транскрипт встречи проходит через контекст дважды.
Для 2-часовой встречи это может означать обработку дополнительных 50,000 токенов. Еще большие документы могут превысить лимиты контекстного окна, нарушая рабочий процесс.
При работе с большими документами или сложными структурами данных модели чаще допускают ошибки при копировании данных между вызовами инструментов.
Традиционный поток работы MCP-клиента
MCP Сервер
Предоставляет инструменты
MCP Клиент
Загружает все определения
LLM
Обрабатывает все через контекст
Решение: Выполнение кода с MCP
С учетом того, что среды выполнения кода становятся все более распространенными для агентов, решением является представление MCP-серверов как API-кодов, а не прямых вызовов инструментов. Агент может затем писать код для взаимодействия с MCP-серверами.
Ключевые преимущества
- Агенты загружают только нужные инструменты
- Данные обрабатываются в среде выполнения перед передачей модели
- Сокращение использования токенов на 98.7%
Подход с файловым деревом
Один из способов реализации — генерация файлового дерева всех доступных инструментов из подключенных MCP-серверов:
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 {
return callMCPTool(
'google_drive__get_document',
input
);
}
Пример: Google Drive → Salesforce
Теперь наш пример "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;
// Обновляем Salesforce (транскрипт проходит через контекст только раз)
await salesforce.updateRecord({
objectType: 'SalesMeeting',
recordId: '00Q5f000001abcXYZ',
data: { Notes: transcript }
});
Без выполнения кода
Токенов: ~150,000
Транскрипт проходит: 2 раза через контекст
Определений загружено: Все (~1000 инструментов)
С выполнением кода
Токенов: ~2,000
Транскрипт проходит: 0 раз (в среде выполнения)
Определений загружено: Только нужные (2 инструмента)
Экономия: 98.7% токенов
Агент обнаруживает инструменты, исследуя файловую систему: перечисляет директорию ./servers/,
находит доступные серверы (например, google-drive и salesforce),
затем читает конкретные файлы инструментов, которые ему нужны.
Cloudflare опубликовала аналогичные выводы, называя выполнение кода с MCP "Code Mode". Основная идея та же: LLM отлично справляются с написанием кода, и разработчики должны использовать это преимущество для создания агентов, которые взаимодействуют с MCP-серверами более эффективно.
Преимущества выполнения кода с MCP
Прогрессивное раскрытие
Модели отлично справляются с навигацией по файловым системам. Представление инструментов как кода позволяет моделям читать определения инструментов по требованию.
// Поиск инструментов
const tools = await searchTools({
query: "salesforce",
detail: "name_and_description"
});
// Загрузка только нужных
import * as salesforce from './servers/salesforce';
Контекстно-эффективные результаты
При работе с большими наборами данных агенты могут фильтровать и преобразовывать результаты в коде перед возвратом.
// Фильтрация в среде выполнения
const allRows = await gdrive.getSheet({
sheetId: 'abc123'
});
const pending = allRows.filter(
row => row["Status"] === 'pending'
);
console.log(`Найдено ${pending.length} заказов`);
Мощное управление потоком
Циклы, условия и обработка ошибок выполняются с помощью привычных паттернов кода.
// Ожидание события с циклом
let found = false;
while (!found) {
const messages = await slack.getChannelHistory({
channel: 'C123456'
});
found = messages.some(
m => m.text.includes('deployment complete')
);
if (!found) await sleep(5000);
}
Операции с сохранением приватности
Промежуточные результаты остаются в среде выполнения. Агент видит только то, что вы явно логируете.
// PII токенизируется автоматически
const sheet = await gdrive.getSheet({
sheetId: 'abc123'
});
for (const row of sheet.rows) {
await salesforce.updateRecord({
data: {
Email: row.email, // [EMAIL_1] в модели
Phone: row.phone // [PHONE_1] в модели
}
});
}
Персистентность состояния и навыки
Выполнение кода с доступом к файловой системе позволяет агентам сохранять состояние между операциями.
// Сохранение промежуточных результатов
const leads = await salesforce.query({
query: 'SELECT Id, Email FROM Lead'
});
await fs.writeFile(
'./workspace/leads.csv',
leads.map(l => `${l.Id},${l.Email}`).join('\n')
);
// Сохранение навыков для переиспользования
// В ./skills/save-sheet-as-csv.ts
export async function saveSheetAsCsv(id) { ... }
Важные компромиссы
Выполнение кода добавляет собственную сложность, которую следует учитывать.
- Требуется безопасная среда с песочницей
- Необходимы ограничения ресурсов
- Требуется мониторинг выполнения
- Дополнительные операционные затраты
Ключевой вывод
Преимущества выполнения кода — снижение затрат на токены, меньшая задержка и улучшенная композиция инструментов — следует взвешивать относительно затрат на реализацию.
Сравнение подходов: Anthropic MCP vs Cloudflare Code Mode
| Характеристика | Anthropic MCP с выполнением кода | Cloudflare Code Mode |
|---|---|---|
| Основная концепция | Универсальный протокол для подключения агентов к инструментам через открытый стандарт | Режим работы агентов, где код становится основным интерфейсом взаимодействия |
| Представление инструментов | Файловое дерево с TypeScript-модулями для каждого инструмента | API-интерфейсы, доступные через код в среде выполнения Workers |
| Загрузка определений |
Прогрессивная
Агент читает только нужные инструменты из файловой системы |
По требованию
Загружаются при обращении к API |
| Обработка данных | В песочнице выполнения кода, промежуточные результаты не проходят через модель | В среде Cloudflare Workers, данные обрабатываются на edge |
| Экономия токенов |
До 98.7%
150,000 → 2,000 токенов в примере |
Сопоставимо
Аналогичные показатели экономии |
| Среда выполнения | Требуется безопасная песочница с изоляцией процессов | Cloudflare Workers (V8 Isolates) с встроенной изоляцией |
| Персистентность |
Файловая система
Сохранение состояния и навыков в файлах |
Durable Objects / KV
Распределенное хранилище состояния |
| Приватность данных |
Токенизация PII
Автоматическая замена чувствительных данных токенами |
Edge изоляция
Данные остаются на edge, не проходят через модель |
| Поиск инструментов |
searchTools() с параметром уровня детализации
|
Навигация по доступным API через документацию |
| Управление потоком |
Полный контроль
Циклы, условия, async/await в TypeScript |
Полный контроль
JavaScript/TypeScript в Workers |
| Экосистема |
Открытая
Тысячи MCP-серверов, SDK для всех языков |
Платформенная
Интеграция с экосистемой Cloudflare |
| Развертывание | Гибкое: локально, облако, on-premise | Cloudflare Workers (edge computing) |
| Навыки (Skills) |
Встроенные
Сохранение функций с SKILL.md для переиспользования |
Ручные
Требуется самостоятельная организация |
| Масштабируемость | Зависит от инфраструктуры песочницы |
Глобальная
Автоматическое масштабирование на edge |
| Стоимость | Инфраструктура песочницы + вызовы модели (значительно снижены) | Cloudflare Workers pricing + вызовы модели |
| Сложность реализации |
Средняя-высокая
Требуется настройка песочницы, безопасности, мониторинга |
Средняя
Использует существующую платформу Workers |
| Лучше для | Максимальная гибкость, разнообразие инструментов, открытая экосистема | Edge-приложения, глобальная латентность, интеграция с Cloudflare |
Общие преимущества обоих подходов
- Радикальное снижение потребления токенов
- Уменьшение латентности и стоимости
- Обработка данных в среде выполнения
- Мощное управление потоком через код
- Улучшенная композиция инструментов
Ключевые различия
- MCP: Открытый протокол, независим от платформы
- Code Mode: Специфичен для Cloudflare Workers
- MCP: Файловая система для навыков
- Code Mode: Edge-native хранилище
- MCP: Тысячи существующих серверов
- Code Mode: Глобальное развертывание на edge
Заключение
MCP предоставляет фундаментальный протокол для подключения агентов ко множеству инструментов и систем. Однако, когда подключено слишком много серверов, определения инструментов и результаты могут потреблять чрезмерное количество токенов, снижая эффективность агентов.
Применение проверенных паттернов
Хотя многие проблемы здесь кажутся новыми — управление контекстом, композиция инструментов, персистентность состояния — у них есть известные решения из разработки программного обеспечения.
Выполнение кода применяет эти устоявшиеся паттерны к агентам, позволяя им использовать привычные конструкции программирования для более эффективного взаимодействия с MCP-серверами.
Присоединяйтесь к сообществу
Если вы реализуете этот подход, мы призываем вас делиться своими находками с сообществом MCP.
Благодарности
Оригинальная статья написана Adam Jones и Conor Kelly. Благодарности Jeremy Fox, Jerome Swannack, Stuart Ritchie, Molly Vorwerck, Matt Samuels и Maggie Vo за обратную связь по черновикам статьи.
Перевод на русский язык выполнен для образовательных целей. Все права на оригинальный материал принадлежат Anthropic.