Resumen
Tres programas prácticos del modo código para AnythingMCP: ingresos mensuales de la tienda online (Shopify) y la contabilidad (Lexware Office), pedidos conciliados con facturas y 100 consultas de precios de clientes en una sola llamada a una herramienta en lugar de 100. Con el código, los límites que importan y cuándo guardar un programa como herramienta.
TL;DR: El modo código compensa allí donde un agente tendría que hacer muchas veces la misma llamada o leer dos listas largas para compararlas. Estas tres recetas muestran el patrón: sumar entre dos sistemas, cruzar dos listas, repetir una consulta para muchos elementos. Cada una es un programa corto en JavaScript que llama a herramientas MCP mediante amcp.run y devuelve solo el resultado. Ejecútalas en línea (el agente escribe el programa con code_execute) o guárdalas como herramientas de código que tu equipo llama por su nombre. El modo código está disponible en AnythingMCP autoalojado desde la v0.52.0 y llegará próximamente a AnythingMCP Cloud.
¿Nuevo en el modo código? Empieza por ¿Qué es el modo código de MCP? y Crea tu primera herramienta de código.
Antes de copiar un programa
- Los nombres de herramientas son reales, las estructuras varían. Las recetas usan herramientas de los conectores de Shopify y Lexware Office. Los nombres de los campos siguen la respuesta de cada API; ejecuta una herramienta una vez en su panel Test, o llama a
amcp.describe(name)dentro de un programa, antes de fiarte de un campo. - Diez segundos por ejecución. Una ejecución se detiene a los 10 segundos. Obtén las páginas y ejecuta las llamadas independientes en paralelo (como máximo 16 a la vez) en lugar de una tras otra.
- Solo lectura. El código en línea nunca llama a herramientas que modifiquen datos; las herramientas de código guardadas solo pueden hacerlo si un administrador lo permite, en Enterprise. Las tres recetas solo leen.
- Cifras inventadas. Los resultados mostrados son ejemplos inventados.
Receta 1 — Ingresos mensuales entre tienda y contabilidad
La pregunta: «¿Cuáles fueron nuestros ingresos en octubre: tienda online más facturas B2B?»
Sin el modo código, el agente recorre cientos de pedidos de la tienda y de facturas, lee cada registro en su contexto y suma los números leyendo. Con el modo código recibe dos totales.
// 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,
};
Lo que vuelve son cuatro números, no 600 registros:
{ "month": "2026-10", "shop": { "orders": 412, "gross": 38214.9 }, "invoices": { "count": 57, "gross": 91380.12 }, "total": 129595.02 }
Comprueba la definición antes de fiarte del total. Si los pedidos de la tienda también se facturan en la contabilidad, sumar ambos los cuenta dos veces; en ese caso filtra las facturas para dejar solo clientes B2B. Ambas cifras son importes brutos en la moneda de la tienda y de la contabilidad; no se restan reembolsos ni notas de crédito. Escribe estas decisiones en la descripción de la herramienta, para que la IA explique qué significa el número.
Receta 2 — Pedidos sin factura, facturas sin pedido
La pregunta: «¿Qué pedidos pagados de la tienda del mes pasado no tienen factura en la contabilidad y qué importes no coinciden?»
Es la tarea en la que peor rinden los modelos al leer: dos listas de unos cientos de líneas cada una, comparadas a ojo. En código es una búsqueda en un diccionario.
// 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 };
Esta versión recibe ambas listas como entradas para que la lógica de cruce sea legible. En una herramienta de código guardada, obtenlas dentro del programa con los bucles de paginación de la receta 1 (pedidos desde shopify_search_orders, facturas desde lexware_office_list_vouchers, más lexware_office_get_invoice donde necesites el campo de referencia), de modo que la IA llame a una sola herramienta con un mes y reciba tres listas cortas:
{ "checked": 412, "missing": ["#1077", "#1139"], "mismatched": [{ "order": "#1101", "invoice": "RE0902", "order_total": 129.0, "invoice_total": 119.0 }], "orphanInvoices": [] }
Receta 3 — 100 consultas de precios en una llamada en lugar de 100
La pregunta: «Aquí tienes 100 números de artículo de la consulta del cliente. ¿Cuáles son los precios de este cliente?»
Muchos ERP calculan un precio específico por artículo y cliente, una petición cada vez. Supongamos que tu propio conector REST para el ERP tiene una herramienta erp_get_customer_price con las entradas article y customer (un nombre de ejemplo; cómo convertir una API REST en herramientas MCP). Sin el modo código, el agente hace 100 llamadas y lee 100 resultados. Con el modo código:
// 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),
};
Se ejecutan diez llamadas a la vez, así que 100 consultas de unos cientos de milisegundos cada una terminan holgadamente dentro del límite de 10 segundos. Un artículo que falle no detiene el resto; acaba en notFound. El modelo recibe una única tabla que puede convertir en un borrador de presupuesto o en un correo electrónico, en lugar de 100 resultados de herramienta separados.
Antes de nada, comprueba si necesitas código. Si la API puede filtrar por una lista de artículos en una sola petición (weclapp, por ejemplo, filtra números de artículo con un operador in), una única llamada ordinaria a una herramienta es más sencilla. El modo código es para las APIs que no pueden.
¿En línea o guardado?
En línea (code_execute) | Herramienta de código guardada | |
|---|---|---|
| Quién escribe el programa | El agente, para esta pregunta | Un administrador, una sola vez (o el agente lo propone) |
| Ideal para | Análisis puntuales, exploración | Preguntas que el equipo hace cada semana |
| Permisos | Los propios del solicitante, solo lectura | Invocador o definidor, solo lectura salvo que se permita escribir (Enterprise) |
| Edición (según lo anunciado con la v0.52) | Team y Enterprise | Community 3, Starter 5, Team 20, Enterprise ilimitadas |
Un patrón que el agente resuelve en línea dos veces es candidato a herramienta guardada. Con el código en línea activado, el agente puede proponerla y un administrador la aprueba con un clic.
FAQ
¿Pueden estos programas escribir, por ejemplo crear las facturas que faltan? No en línea. Una herramienta de código guardada solo puede llamar a herramientas de escritura cuando un administrador activa Allow write tools, lo que requiere Enterprise. Para cualquier cosa que modifique datos, mantén el programa en solo lectura y deja que una persona confirme la acción.
¿Y si una ejecución necesita más de 10 segundos? Divídela: una ejecución por mes en lugar de por año, o menos elementos por llamada. Las ejecuciones que superan un límite se detienen con un error; no queda nada escrito a medias, porque solo leen.
¿El programa envía mis datos a algún sitio? No. El programa se ejecuta en un runner aislado sin red. Solo accede a tus sistemas a través de las herramientas MCP, con tu rol. Consulta Ejecución segura de código para agentes de IA.
Relacionado
- ¿Qué es el modo código de MCP?
- Crea tu primera herramienta de código, paso a paso
- Ejecución segura de código para agentes de IA
- El agente propone una herramienta de código, el administrador la aprueba
- Encuentra un número de artículo en listas de precios en PDF y Excel
- Conecta Shopify, Lexware Office y weclapp a Claude
¿Te ha sido útil esta guía?