Code Mode: Вся мощь API в 1000 токенов для ваших AI-агентов

Model Context Protocol (MCP) стал стандартным способом для ИИ-агентов использовать внешние инструменты. Но в его основе лежит противоречие: агентам нужно много инструментов для полезной работы, однако каждый добавленный инструмент заполняет контекстное окно модели, оставляя меньше места для самой задачи.

Режим Кода (Code Mode) — это техника, которую мы впервые представили для снижения использования контекстного окна при работе агента с инструментами. Вместо описания каждой операции как отдельного инструмента, позволим модели писать код на основе типизированного SDK и безопасно исполнять его в динамическом загрузчике воркеров (Dynamic Worker Loader). Код выступает в роли компактного плана. Модель может исследовать операции инструментов, комбинировать несколько вызовов и возвращать только нужные ей данные. Anthropic независимо исследовали тот же подход в своей публикации Code Execution with MCP.

Сегодня мы представляем новый MCP-сервер для всего Cloudflare API — от DNS и Zero Trust до Workers и R2 — который использует Режим Кода. Всего с двумя инструментами, search() и execute(), сервер способен предоставить доступ ко всему Cloudflare API через MCP, потребляя при этом всего около 1000 токенов. Этот объем остается фиксированным, независимо от количества существующих конечных точек API.

Для такого большого API, как Cloudflare API, Режим Кода сокращает количество используемых входных токенов на 99,9%. Эквивалентный MCP-сервер без Режима Кода потреблял бы 1,17 миллиона токенов — больше, чем всё контекстное окно самых продвинутых фундаментальных моделей.

Code Mode: Вся мощь API в 1000 токенов для ваших AI-агентов

Экономия с Режимом Кода в сравнении с нативным MCP, измерено с помощью tiktoken

Вы можете начать использовать этот новый Cloudflare MCP-сервер уже сегодня. А также мы открываем исходный код нового SDK для Режима Кода в рамках Cloudflare Agents SDK, чтобы вы могли использовать тот же подход в своих собственных MCP-серверах и ИИ-агентах.

Режим Кода на стороне сервера (Server‑side Code Mode)

Code Mode: Вся мощь API в 1000 токенов для ваших AI-агентов

Этот новый MCP-сервер применяет Режим Кода на стороне сервера. Вместо тысяч инструментов сервер экспортирует всего два: search() и execute(). Оба работают на основе Режима Кода. Вот полная поверхность инструментов, которая загружается в контекст модели:

[
  {
    "name": "search",
    "description": "Поиск по OpenAPI-спецификации Cloudflare. Все $refs предварительно разрешены (inline).",
    "inputSchema": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "description": "JavaScript async arrow function для поиска по OpenAPI-спецификации"
        }
      },
      "required": ["code"]
    }
  },
  {
    "name": "execute",
    "description": "Исполнение JavaScript-кода для работы с Cloudflare API.",
    "inputSchema": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "description": "JavaScript async arrow function для исполнения"
        }
      },
      "required": ["code"]
    }
  }
]

Чтобы узнать, что можно сделать, агент вызывает search(). Он пишет JavaScript, используя типизированное представление OpenAPI-спецификации. Агент может фильтровать конечные точки по продукту, пути, тегам или другим метаданным и сузить тысячи конечных точек до нескольких необходимых. Полная OpenAPI-спецификация никогда не попадает в контекст модели. Агент взаимодействует с ней только через код.

Когда агент готов действовать, он вызывает execute(). Агент пишет код, который может выполнять запросы к Cloudflare API, обрабатывать пагинацию, проверять ответы и объединять операции в рамках одного исполнения. 

Оба инструмента запускают сгенерированный код внутри изолята динамического воркера (Dynamic Worker) — это легковесная песочница V8 без файловой системы, без переменных окружения, которые могут быть скомпрометированы через инъекцию в промпт, и с отключенными по умолчанию внешними fetch-запросами. Исходящие запросы при необходимости можно явно контролировать с помощью обработчиков исходящих fetch-запросов (outbound fetch handlers).

Пример: Защита источника от DDoS-атак

Предположим, пользователь говорит своему агенту: "защити мой источник от DDoS-атак". Первым шагом агента будет обращение к документации. Он может вызвать Cloudflare Docs MCP Server, использовать Cloudflare Skill или напрямую искать в интернете. Из документации он узнает: нужно разместить Cloudflare WAF и правила защиты от DDoS перед источником.

Шаг 1: Поиск нужных конечных точек Инструмент search предоставляет модели объект spec: полную OpenAPI-спецификацию Cloudflare со всеми предварительно разрешенными $refs. Модель пишет JavaScript-код для работы с ней. Здесь агент ищет конечные точки WAF и набора правил (ruleset) для зоны:

async () => {
  const results = [];
  for (const [path, methods] of Object.entries(spec.paths)) {
    if (path.includes('/zones/') &&
        (path.includes('firewall/waf') || path.includes('rulesets'))) {
      for (const [method, op] of Object.entries(methods)) {
        results.push({ method: method.toUpperCase(), path, summary: op.summary });
      }
    }
  }
  return results;
}

Сервер запускает этот код в изоляте Workers и возвращает:

[
  { "method": "GET",    "path": "/zones/{zone_id}/firewall/waf/packages",              "summary": "List WAF packages" },
  { "method": "PATCH",  "path": "/zones/{zone_id}/firewall/waf/packages/{package_id}", "summary": "Update a WAF package" },
  { "method": "GET",    "path": "/zones/{zone_id}/firewall/waf/packages/{package_id}/rules", "summary": "List WAF rules" },
  { "method": "PATCH",  "path": "/zones/{zone_id}/firewall/waf/packages/{package_id}/rules/{rule_id}", "summary": "Update a WAF rule" },
  { "method": "GET",    "path": "/zones/{zone_id}/rulesets",                           "summary": "List zone rulesets" },
  { "method": "POST",   "path": "/zones/{zone_id}/rulesets",                           "summary": "Create a zone ruleset" },
  { "method": "GET",    "path": "/zones/{zone_id}/rulesets/phases/{ruleset_phase}/entrypoint", "summary": "Get a zone entry point ruleset" },
  { "method": "PUT",    "path": "/zones/{zone_id}/rulesets/phases/{ruleset_phase}/entrypoint", "summary": "Update a zone entry point ruleset" },
  { "method": "POST",   "path": "/zones/{zone_id}/rulesets/{ruleset_id}/rules",        "summary": "Create a zone ruleset rule" },
  { "method": "PATCH",  "path": "/zones/{zone_id}/rulesets/{ruleset_id}/rules/{rule_id}", "summary": "Update a zone ruleset rule" }
]

Полная спецификация Cloudflare API содержит более 2500 конечных точек. Модель сузила их до конечных точек WAF и наборов правил, которые ей нужны, и ни одна часть спецификации не попала в контекстное окно. 

Модель также может детально изучить схему конкретной конечной точки перед её вызовом. Здесь она проверяет, какие фазы доступны для наборов правил зоны:

async () => {
  const op = spec.paths['/zones/{zone_id}/rulesets']?.get;
  const items = op?.responses?.['200']?.content?.['application/json']?.schema;
  // Проходим по схеме, чтобы найти enum фазы
  const props = items?.allOf?.[1]?.properties?.result?.items?.allOf?.[1]?.properties;
  return { phases: props?.phase?.enum };
}

{
  "phases": [
    "ddos_l4", "ddos_l7",
    "http_request_firewall_custom", "http_request_firewall_managed",
    "http_response_firewall_managed", "http_ratelimit",
    "http_request_redirect", "http_request_transform",
    "magic_transit", "magic_transit_managed"
  ]
}

Теперь агент знает точные фазы, которые ему нужны: ddos_l7 для защиты от DDoS и http_request_firewall_managed для WAF.

Шаг 2: Действия с API Агент переходит к использованию execute. Песочница получает клиент cloudflare.request(), который может выполнять аутентифицированные вызовы к Cloudflare API. Сначала агент проверяет, какие наборы правил уже существуют в зоне:

async () => {
  const response = await cloudflare.request({
    method: "GET",
    path: `/zones/${zoneId}/rulesets`
  });
  return response.result.map(rs => ({
    name: rs.name, phase: rs.phase, kind: rs.kind
  }));
}

[
  { "name": "DDoS L7",          "phase": "ddos_l7",                        "kind": "managed" },
  { "name": "Управляемый Cloudflare", "phase": "http_request_firewall_managed", "kind": "managed" },
  { "name": "Пользовательские правила",     "phase": "http_request_firewall_custom",   "kind": "zone" }
]

Агент видит, что управляемые наборы правил DDoS и WAF уже существуют. Теперь он может объединять вызовы, чтобы проверить их правила и обновить уровни чувствительности за одно выполнение:

async () => {
  // Получить текущий набор правил точки входа DDoS L7
  const ddos = await cloudflare.request({
    method: "GET",
    path: `/zones/${zoneId}/rulesets/phases/ddos_l7/entrypoint`
  });

  // Получить управляемый набор правил WAF
  const waf = await cloudflare.request({
    method: "GET",
    path: `/zones/${zoneId}/rulesets/phases/http_request_firewall_managed/entrypoint`
  });
}

Вся эта операция — от поиска в спецификации и проверки схемы до перечисления наборов правил и получения конфигураций DDoS и WAF — заняла четыре вызова инструментов.

MCP-сервер Cloudflare

Мы начали с MCP-серверов для отдельных продуктов. Нужен агент для управления DNS? Добавьте MCP-сервер DNS. Нужны логи Workers? Добавьте MCP-сервер наблюдаемости Workers. Каждый сервер предоставлял фиксированный набор инструментов, соответствующих операциям API. Это работало, пока набор инструментов был небольшим, но у Cloudflare API более 2500 конечных точек. Никакая коллекция вручную поддерживаемых серверов не могла за этим угнаться.

MCP-сервер Cloudflare упрощает это. Два инструмента, примерно 1000 токенов и покрытие каждой конечной точки в API. Когда мы добавляем новые продукты, те же пути кода search() и execute() обнаруживают и вызывают их — никаких новых определений инструментов, никаких новых MCP-серверов. Он даже поддерживает GraphQL Analytics API.

Наш MCP-сервер построен на последних спецификациях MCP. Он соответствует OAuth 2.1, используя Workers OAuth Provider для ограничения области действия токена выбранными разрешениями, утвержденными пользователем при подключении. Агент получает только те возможности, которые пользователь явно предоставил.

Для разработчиков это означает, что вы можете использовать простой цикл агента и при этом предоставить ему доступ ко всему Cloudflare API со встроенным прогрессивным обнаружением возможностей.

Code Mode: Вся мощь API в 1000 токенов для ваших AI-агентов

Сравнение подходов к сокращению контекста

Появилось несколько подходов к сокращению количества токенов, потребляемых инструментами MCP:

Клиентский режим кода (Client-side Code Mode) был нашим первым экспериментом. Модель пишет TypeScript с использованием типизированных SDK и выполняет его в динамическом загрузчике Workers на стороне клиента. Компромисс в том, что это требует, чтобы агент поставлялся с безопасным доступом к песочнице. Режим кода реализован в Goose и SDK Claude от Anthropic как программный вызов инструментов (Programmatic Tool Calling).

Интерфейсы командной строки — это другой путь. CLI самодокументируемы и раскрывают возможности по мере изучения их агентом. Инструменты, такие как OpenClaw и Moltworker, преобразуют MCP-серверы в CLI с помощью MCPorter, чтобы обеспечить агентам прогрессивное раскрытие информации. Ограничение очевидно: агенту нужна оболочка, которую предоставляет не каждая среда, и это создает гораздо более широкую поверхность атаки, чем изолированная песочница.

Динамический поиск инструментов, используемый Anthropic в Claude Code, отображает меньший набор инструментов, которые, надеемся, соответствуют текущей задаче. Это сокращает использование контекста, но теперь требует функции поиска, которую необходимо поддерживать и оценивать, и каждый подобранный инструмент все равно использует токены.

Code Mode: Вся мощь API в 1000 токенов для ваших AI-агентов

Каждый подход решает реальную проблему. Но именно для MCP-серверов серверный режим кода сочетает в себе их сильные стороны: фиксированная стоимость в токенах независимо от размера API, отсутствие необходимости изменять что-либо на стороне агента, встроенное прогрессивное обнаружение и безопасное выполнение внутри изолированной песочницы. Агент просто вызывает два инструмента с кодом. Все остальное происходит на сервере.

Начните использовать уже сегодня

MCP-сервер Cloudflare доступен уже сейчас. Направьте ваш MCP-клиент на URL сервера, и вы будете перенаправлены в Cloudflare для авторизации и выбора разрешений, которые хотите предоставить вашему агенту. Добавьте эту конфигурацию в ваш MCP-клиент:

{
  "mcpServers": {
    "cloudflare-api": {
      "url": "https://mcp.cloudflare.com/mcp"
    }
  }
}

Для CI/CD, автоматизации или если вы предпочитаете управлять токенами самостоятельно, создайте токен Cloudflare API с необходимыми вам разрешениями. Поддерживаются как пользовательские токены, так и токены учетной записи, и они могут передаваться как токены-носители в заголовке Authorization.

Больше информации о различных конфигурациях настройки MCP можно найти в репозитории Cloudflare MCP.

Взгляд в будущее

Режим кода решает проблему стоимости контекста для одного API. Но агенты редко общаются с одной службой. Агент разработчика может нуждаться в Cloudflare API вместе с GitHub, базой данных и внутренним сервером документации. Каждый дополнительный MCP-сервер создает то же давление на окно контекста, с которого мы начали.