С чего начать5 мин чтения7 языков

Рецепты MCP code mode: месячная выручка, сверка счетов и 100 запросов цен за один вызов

Три практичных программы code mode для AnythingMCP: месячная выручка по интернет-магазину (Shopify) и бухгалтерии (Lexware Office), сверка заказов со счетами и 100 запросов цен для клиента за один вызов инструмента вместо 100. С кодом, важными ограничениями и советом, когда стоит сохранить программу как инструмент.

HCАвтор: команда HelpCodeОбновлено 5 мин чтения Открытый код на GitHub

Без банковской карты · 7 дней пробного периода · Есть вариант self-host

  • 7 дней бесплатно
    Без банковской карты
  • GDPR и готовность к SOC 2
    Данные в ЕС, журналы аудита
  • Открытый код на GitHub
    Open source · AGPL-3.0
  • Работает с ChatGPT, Claude, Gemini
    Любой MCP-совместимый клиент

Кратко

Три практичных программы code mode для AnythingMCP: месячная выручка по интернет-магазину (Shopify) и бухгалтерии (Lexware Office), сверка заказов со счетами и 100 запросов цен для клиента за один вызов инструмента вместо 100. С кодом, важными ограничениями и советом, когда стоит сохранить программу как инструмент.

Кратко: Code mode окупается там, где агенту иначе пришлось бы много раз делать один и тот же вызов или читать два длинных списка, чтобы сравнить их. Эти три рецепта показывают шаблон: суммирование по двум системам, сопоставление двух списков, повтор одного запроса для множества позиций. Каждый рецепт — короткая программа на JavaScript, которая вызывает MCP-инструменты через amcp.run и возвращает только результат. Запускай их инлайн (агент пишет программу через code_execute) или сохрани как code-инструменты, которые твоя команда вызывает по имени. Code mode доступен в self-hosted AnythingMCP начиная с v0.52.0 и скоро появится в AnythingMCP Cloud.

Впервые слышишь о code mode? Начни со статей Что такое MCP code mode? и Создай свой первый code-инструмент.

Прежде чем копировать программу

  • Имена инструментов настоящие, структуры ответов могут отличаться. В рецептах используются инструменты коннекторов Shopify и Lexware Office. Имена полей зависят от ответа конкретного API; прежде чем полагаться на поле, один раз запусти инструмент на панели Test или вызови amcp.describe(name) внутри программы.
  • Десять секунд на запуск. Запуск останавливается через 10 секунд. Загружай страницы и выполняй независимые вызовы параллельно (не более 16 одновременно), а не один за другим.
  • Только чтение. Инлайн-код никогда не вызывает инструменты, изменяющие данные; сохранённые code-инструменты могут это делать, только если администратор разрешил (в Enterprise). Все три рецепта только читают данные.
  • Вымышленные цифры. Показанные результаты — выдуманные примеры.

Рецепт 1 — Месячная выручка по магазину и бухгалтерии

Вопрос: «Какой была наша выручка в октябре: интернет-магазин плюс B2B-счета?»

Без code mode агент листает сотни заказов магазина и счетов, читает каждую запись в свой контекст и складывает числа «на глаз». С code mode он получает две суммы.

// Input: args.month as "YYYY-MM", e.g. "2026-10".
const [y, m] = String(args.month).split('-').map(Number);
const from = `${y}-${String(m).padStart(2, '0')}-01`;
const to = m === 12 ? `${y + 1}-01-01` : `${y}-${String(m + 1).padStart(2, '0')}-01`;

// Shop: paid orders created in the month (Shopify search syntax), 250 per page.
let shop = 0, shopOrders = 0, after = undefined;
do {
  const res = await amcp.run('shopify_search_orders', {
    query: `created_at:>=${from} created_at:<${to} financial_status:paid test:false`,
    first: 250,
    after,
  });
  const page = res.orders ?? res.data?.orders; // depends on how the tool wraps the GraphQL result
  for (const o of page.nodes) {
    shop += Number(o.currentTotalPriceSet.shopMoney.amount);
    shopOrders++;
  }
  after = page.pageInfo.hasNextPage ? page.pageInfo.endCursor : undefined;
} while (after);

// Accounting: sales invoices dated in the month, without drafts and voided ones.
let b2b = 0, invoices = 0, p = 0, last = false;
const lastDay = new Date(Date.UTC(y, m, 0)).toISOString().slice(0, 10);
while (!last) {
  const res = await amcp.run('lexware_office_list_vouchers', {
    voucherType: 'salesinvoice',
    voucherStatus: 'open,paid,paidoff',
    voucherDateFrom: from,
    voucherDateTo: lastDay,
    size: 250,
    page: p++,
  });
  for (const v of res.content ?? []) { b2b += Number(v.totalAmount); invoices++; }
  last = res.last ?? true;
}

return {
  month: args.month,
  shop: { orders: shopOrders, gross: Math.round(shop * 100) / 100 },
  invoices: { count: invoices, gross: Math.round(b2b * 100) / 100 },
  total: Math.round((shop + b2b) * 100) / 100,
};

В ответ приходят четыре числа, а не 600 записей:

{ "month": "2026-10", "shop": { "orders": 412, "gross": 38214.9 }, "invoices": { "count": 57, "gross": 91380.12 }, "total": 129595.02 }

Проверь определение, прежде чем доверять итогу. Если заказы магазина также выставляются как счета в бухгалтерии, сложение обоих значений посчитает их дважды; в таком случае отфильтруй счета только по B2B-клиентам. Обе суммы здесь — брутто в валюте магазина и учётной системы; возвраты и кредит-ноты не вычитаются. Запиши эти решения в описание инструмента, чтобы ИИ объяснял, что означает это число.

Рецепт 2 — Заказы без счёта, счета без заказа

Вопрос: «Какие оплаченные заказы магазина за прошлый месяц не имеют счёта в бухгалтерии и у каких сумма не совпадает?»

Это задача, с которой модели справляются хуже всего при чтении: два списка по несколько сотен строк, сравниваемые на глаз. В коде это обычный поиск по словарю.

// Where your accounting keeps the shop order number. Adapt to your setup:
// many shop integrations write it into the invoice's reference or title.
const orderRefOf = (invoice) => invoice.orderReference;

const orders = args.orders;     // [{ name: "#1042", total: 89.9 }, ...] from a first step
const invoices = args.invoices; // [{ orderReference: "#1042", totalAmount: 89.9, voucherNumber: "RE0815" }, ...]

const byOrder = new Map(invoices.map((i) => [orderRefOf(i), i]));
const missing = [], mismatched = [];
for (const o of orders) {
  const inv = byOrder.get(o.name);
  if (!inv) missing.push(o.name);
  else if (Math.abs(Number(inv.totalAmount) - Number(o.total)) > 0.01)
    mismatched.push({ order: o.name, invoice: inv.voucherNumber, order_total: o.total, invoice_total: inv.totalAmount });
}
const orderNames = new Set(orders.map((o) => o.name));
const orphanInvoices = invoices.filter((i) => !orderNames.has(orderRefOf(i))).map((i) => i.voucherNumber);

return { checked: orders.length, missing, mismatched, orphanInvoices };

В этой версии оба списка передаются как входные данные, чтобы логика сопоставления оставалась читаемой. В сохранённом code-инструменте получай их прямо внутри программы с помощью циклов постраничной загрузки из рецепта 1 (заказы — из shopify_search_orders, счета — из lexware_office_list_vouchers, а также lexware_office_get_invoice, если нужно поле с номером заказа), чтобы ИИ вызывал один инструмент с указанием месяца и получал три коротких списка:

{ "checked": 412, "missing": ["#1077", "#1139"], "mismatched": [{ "order": "#1101", "invoice": "RE0902", "order_total": 129.0, "invoice_total": 119.0 }], "orphanInvoices": [] }

Рецепт 3 — 100 запросов цен за один вызов вместо 100

Вопрос: «Вот 100 артикулов из запроса клиента. Какие цены у этого клиента?»

Многие ERP рассчитывают индивидуальную цену для каждой пары «артикул — клиент», по одному запросу за раз. Допустим, в твоём собственном REST-коннекторе для ERP есть инструмент erp_get_customer_price с входными параметрами article и customer (пример названия; как превратить REST API в MCP-инструменты). Без code mode агент делает 100 вызовов и читает 100 результатов. С code mode:

// Inputs: args.customer, args.articles (array of article numbers).
const articles = [...new Set(args.articles.map(String))];
const rows = [];
const BATCH = 10; // at most 16 calls may be in flight at once

for (let i = 0; i < articles.length; i += BATCH) {
  const batch = articles.slice(i, i + BATCH);
  const results = await Promise.all(batch.map(async (article) => {
    try {
      const r = await amcp.run('erp_get_customer_price', { article, customer: args.customer });
      return { article, price: r.netPrice, unit: r.priceUnit, currency: r.currency };
    } catch (e) {
      return { article, error: String(e.message ?? e) };
    }
  }));
  rows.push(...results);
}

return {
  customer: args.customer,
  found: rows.filter((r) => !r.error).length,
  notFound: rows.filter((r) => r.error).map((r) => r.article),
  prices: rows.filter((r) => !r.error),
};

Одновременно выполняется десять вызовов, поэтому 100 запросов по несколько сотен миллисекунд каждый укладываются в лимит 10 секунд с запасом. Сбой по одному артикулу не останавливает остальные; он попадает в notFound. Модель получает одну таблицу, из которой можно сделать черновик коммерческого предложения или письма, вместо 100 отдельных результатов инструментов.

Сначала проверь, нужен ли тебе код вообще. Если API умеет фильтровать по списку артикулов одним запросом (например, weclapp фильтрует номера артикулов оператором in), проще обойтись одним обычным вызовом инструмента. Code mode нужен для API, которые так не умеют.

Инлайн или сохранённый?

Инлайн (code_execute)Сохранённый code-инструмент
Кто пишет программуАгент, под конкретный вопросАдминистратор, один раз (или агент предлагает её)
Подходит дляРазового анализа, исследования данныхВопросов, которые команда задаёт каждую неделю
Права доступаСобственные права вызывающего, только чтениеВызывающего или определяющего, только чтение, если запись не разрешена (Enterprise)
Редакция (по анонсу v0.52)Team и EnterpriseCommunity 3, Starter 5, Team 20, Enterprise без ограничений

Шаблон, который агент дважды решил инлайн, — кандидат на сохранённый инструмент. При включённом инлайн-коде агент может предложить его, а администратор одобряет одним кликом.

FAQ

Могут ли эти программы записывать данные, например создавать недостающие счета? Не инлайн. Сохранённый code-инструмент может вызывать инструменты записи, только если администратор включит Allow write tools, а для этого нужен Enterprise. Для всего, что изменяет данные, оставляй программу только на чтение и пусть действие подтверждает человек.

Что делать, если запуску нужно больше 10 секунд? Раздели его: один запуск на месяц вместо года или меньше позиций за вызов. Запуски, превысившие лимит, завершаются с ошибкой; ничего не записывается частично, потому что они только читают.

Отправляет ли программа мои данные куда-либо? Нет. Программа выполняется в изолированной среде без доступа к сети. Она обращается к твоим системам только через MCP-инструменты и с твоей ролью. См. Безопасное выполнение кода для ИИ-агентов.

Связанные материалы

Это руководство помогло?

MCP для вашего стека за 60 секунд.

Запустите AnythingMCP в управляемом облаке или разместите на своей инфраструктуре. 7 дней бесплатно, без банковской карты.

Похожие руководства

GS
Начало работы

Режим кода: сократите расход токенов ИИ-агента, запуская инструменты за один шаг

Режим кода позволяет ИИ-агенту выполнить короткую программу, которая оркеструет множество MCP-инструментов за один вызов, вместо отдельного обращения к каждому инструменту. Фильтрация и объединение данных происходят в изолированной песочнице, поэтому возвращается только итоговый ответ — это сокращает расход токенов на задачах с большими объёмами данных на 90–99%.

GS
Начало работы

Создай свой первый MCP code tool: заказы из ERP и аккаунт из CRM за один вызов

Пошаговое руководство по режиму кода AnythingMCP: запусти code runner, включи режим кода и сохрани code tool, который за один вызов инструмента читает последние заказы из ERP (weclapp), а также аккаунт и открытые сделки из CRM (HubSpot). Только чтение, с правами вызывающего, с аудитом.

GS
Начало работы

Что такое MCP Code Mode? Меньше токенов и обращений к модели для AI-агентов

Code mode позволяет AI-агенту запустить одну короткую программу, которая вызывает сразу несколько MCP-инструментов, вместо того чтобы вызывать их по одному через модель. Почему это экономит токены и обращения к модели, когда это помогает, а когда нет, и как AnythingMCP это реализует: сохранённые code-инструменты, встроенный код и предложения агента в изолированном раннере.

GS
Начало работы

Граф знаний MCP: коннектор, который учится, как связаны твои системы

AnythingMCP — это не просто MCP-прокси: он строит граф знаний твоих инструментов, чтобы ИИ-агенты знали, как связать клиента из CRM с его заказами в ERP. Вот как работает умный коннектор.

GS
Начало работы

Что такое Протокол Контекста Модели (MCP)?

Полное руководство по пониманию Протокола Контекста Модели — как он работает, почему это важно и как начать.

GS
Начало работы

Начало работы с AnythingMCP

Установи и настрой AnythingMCP за считанные минуты. Клонируйте репозиторий, запусти интерактивный скрипт настройки и начни подключать твои API к AI-агентам.