In breve
Tre programmi pratici in code mode per AnythingMCP: ricavi mensili tra negozio online (Shopify) e contabilità (Lexware Office), ordini riconciliati con le fatture e 100 consultazioni di prezzo per cliente in una sola chiamata a un tool invece di 100. Con il codice, i limiti che contano e quando salvare un programma come tool.
TL;DR: Il code mode rende dove un agente altrimenti farebbe molte volte la stessa chiamata o dovrebbe leggere due lunghe liste per confrontarle. Queste tre ricette mostrano il pattern: sommare dati da due sistemi, confrontare due liste, ripetere una consultazione per molti elementi. Ognuna è un breve programma JavaScript che chiama i tool MCP tramite amcp.run e restituisce solo il risultato. Eseguile inline (l'agente scrive il programma con code_execute) oppure salvale come tool di codice che il tuo team richiama per nome. Il code mode è disponibile in AnythingMCP self-hosted dalla v0.52.0 e arriverà presto su AnythingMCP Cloud.
Sei alle prime armi con il code mode? Parti da Cos'è l'MCP code mode? e Crea il tuo primo tool di codice.
Prima di copiare un programma
- I nomi dei tool sono reali, le strutture variano. Le ricette usano strumenti dei connettori Shopify e Lexware Office. I nomi dei campi seguono la risposta di ciascuna API: esegui un tool una volta nel pannello Test, oppure chiama
amcp.describe(name)dentro un programma, prima di fare affidamento su un campo. - Dieci secondi per esecuzione. Un'esecuzione si interrompe dopo 10 secondi. Recupera le pagine ed esegui le chiamate indipendenti in parallelo (al massimo 16 alla volta) invece di una dopo l'altra.
- Sola lettura. Il codice inline non chiama mai tool che modificano dati; i tool di codice salvati possono farlo solo se un amministratore lo consente, nell'edizione Enterprise. Tutte e tre le ricette si limitano a leggere.
- Cifre inventate. I risultati mostrati sono esempi inventati.
Ricetta 1 — Ricavi mensili tra negozio e contabilità
La domanda: "Quanto abbiamo fatturato a ottobre: negozio online più fatture B2B?"
Senza code mode, l'agente scorre centinaia di ordini del negozio e di fatture, caricando ogni record nel proprio contesto, e somma i numeri leggendoli. Con il code mode ottiene due totali.
// 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,
};
Quello che torna indietro sono quattro numeri, non 600 record:
{ "month": "2026-10", "shop": { "orders": 412, "gross": 38214.9 }, "invoices": { "count": 57, "gross": 91380.12 }, "total": 129595.02 }
Controlla la definizione prima di fidarti del totale. Se gli ordini del negozio vengono fatturati anche in contabilità, sommare entrambi li conta due volte; in tal caso filtra le fatture sui soli clienti B2B. Qui entrambe le cifre sono importi lordi nella valuta del negozio e della contabilità; rimborsi e note di credito non vengono sottratti. Scrivi queste scelte nella descrizione del tool, così l'AI spiega cosa significa il numero.
Ricetta 2 — Ordini senza fattura, fatture senza ordine
La domanda: "Quali ordini pagati del negozio dello scorso mese non hanno una fattura in contabilità, e quali importi non coincidono?"
È il compito in cui i modelli se la cavano peggio leggendo: due liste di qualche centinaio di righe ciascuna, confrontate a occhio. In codice diventa una ricerca in un dizionario.
// 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 };
Questa versione riceve entrambe le liste come input per mantenere leggibile la logica di confronto. In un tool di codice salvato, recuperale all'interno del programma con i cicli di paginazione della ricetta 1 (gli ordini da shopify_search_orders, le fatture da lexware_office_list_vouchers, più lexware_office_get_invoice dove ti serve il campo di riferimento), così l'AI chiama un solo tool con un mese e ottiene tre brevi liste:
{ "checked": 412, "missing": ["#1077", "#1139"], "mismatched": [{ "order": "#1101", "invoice": "RE0902", "order_total": 129.0, "invoice_total": 119.0 }], "orphanInvoices": [] }
Ricetta 3 — 100 consultazioni di prezzo in una sola chiamata invece di 100
La domanda: "Ecco 100 codici articolo dalla richiesta del cliente. Quali sono i prezzi per questo cliente?"
Molti ERP calcolano un prezzo specifico per cliente per ogni articolo e cliente, una richiesta alla volta. Supponi che il tuo connettore REST per l'ERP abbia un tool erp_get_customer_price con gli input article e customer (un nome di esempio; come trasformare un'API REST in strumenti MCP). Senza code mode l'agente fa 100 chiamate e legge 100 risultati. Con il 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),
};
Dieci chiamate vengono eseguite alla volta, quindi 100 consultazioni da poche centinaia di millisecondi ciascuna si concludono ampiamente entro il limite di 10 secondi. Un articolo che fallisce non blocca gli altri: finisce in notFound. Il modello riceve un'unica tabella che può trasformare in una bozza di preventivo o in un'e-mail, invece di 100 risultati separati.
Prima verifica se ti serve davvero il codice. Se l'API può filtrare per una lista di articoli in una sola richiesta (weclapp, per esempio, filtra i codici articolo con un operatore in), una singola chiamata normale a un tool è più semplice. Il code mode serve per le API che non possono farlo.
Inline o salvato?
Inline (code_execute) | Tool di codice salvato | |
|---|---|---|
| Chi scrive il programma | L'agente, per questa domanda | Un amministratore, una volta (o lo propone l'agente) |
| Adatto a | Analisi occasionali, esplorazione | Domande che il team pone ogni settimana |
| Permessi | Quelli del chiamante, sola lettura | Invocante o definente, sola lettura salvo autorizzazione alla scrittura (Enterprise) |
| Edizione (come annunciato con la v0.52) | Team ed Enterprise | Community 3, Starter 5, Team 20, Enterprise illimitati |
Un pattern che l'agente risolve inline due volte è un candidato per un tool salvato. Con il codice inline abilitato, l'agente può proporlo e un amministratore lo approva con un clic.
FAQ
Questi programmi possono scrivere, ad esempio creare le fatture mancanti? Non inline. Un tool di codice salvato può chiamare tool di scrittura solo quando un amministratore attiva Allow write tools, che richiede Enterprise. Per qualsiasi operazione che modifica dati, mantieni il programma in sola lettura e lascia che sia una persona a confermare l'azione.
Cosa succede se un'esecuzione richiede più di 10 secondi? Dividila: un'esecuzione per mese invece che per un anno intero, oppure meno elementi per chiamata. Le esecuzioni che superano un limite si interrompono con un errore; nulla viene scritto a metà, perché si limitano a leggere.
I miei dati vengono inviati da qualche parte dal programma? No. Il programma gira in un runner isolato senza rete. Raggiunge i tuoi sistemi solo tramite i tool MCP, con il tuo ruolo. Vedi Esecuzione sicura del codice per gli agenti AI.
Correlati
- Cos'è l'MCP code mode?
- Crea il tuo primo tool di codice, passo dopo passo
- Esecuzione sicura del codice per gli agenti AI
- L'agente propone un tool di codice, l'amministratore lo approva
- Trovare un codice articolo in listini PDF ed Excel
- Collega Shopify, Lexware Office e weclapp a Claude
Questa guida ti è stata utile?