Zusammenfassung
Drei praxisnahe Code-Mode-Programme für AnythingMCP: Monatsumsatz über Onlineshop (Shopify) und Buchhaltung (Lexware Office), Bestellungen mit Rechnungen abgeglichen und 100 Kundenpreisabfragen in einem Tool-Aufruf statt in 100. Mit Code, den wichtigen Limits und der Frage, wann sich ein Programm als Tool speichern lässt.
TL;DR: Code Mode lohnt sich überall dort, wo ein Agent sonst denselben Aufruf viele Male ausführen oder zwei lange Listen lesen müsste, um sie zu vergleichen. Diese drei Rezepte zeigen das Muster: Summe über zwei Systeme bilden, zwei Listen abgleichen, eine Abfrage für viele Einträge wiederholen. Jedes ist ein kurzes JavaScript-Programm, das MCP-Tools über amcp.run aufruft und nur das Ergebnis zurückgibt. Führe sie inline aus (der Agent schreibt das Programm mit code_execute) oder speichere sie als Code-Tools, die dein Team beim Namen aufruft. Code Mode ist in self-hosted AnythingMCP ab v0.52.0 verfügbar und kommt bald in AnythingMCP Cloud.
Neu bei Code Mode? Starte mit Was ist MCP Code Mode? und Baue dein erstes Code-Tool.
Bevor du ein Programm kopierst
- Tool-Namen sind echt, Strukturen variieren. Die Rezepte verwenden Tools der Connectors für Shopify und Lexware Office. Die Feldnamen folgen der jeweiligen API-Antwort; führe ein Tool einmal im Test-Bereich aus oder rufe
amcp.describe(name)in einem Programm auf, bevor du dich auf ein Feld verlässt. - Zehn Sekunden pro Lauf. Ein Lauf stoppt nach 10 Sekunden. Hole Seiten und unabhängige Aufrufe parallel (höchstens 16 gleichzeitig), statt sie nacheinander auszuführen.
- Nur lesend. Inline-Code ruft nie Tools auf, die Daten verändern; gespeicherte Code-Tools dürfen das nur, wenn ein Administrator es erlaubt, und zwar in Enterprise. Alle drei Rezepte lesen nur.
- Erfundene Zahlen. Die gezeigten Ergebnisse sind erfundene Beispiele.
Rezept 1 — Monatsumsatz über Shop und Buchhaltung
Die Frage: „Wie hoch war unser Umsatz im Oktober: Onlineshop plus B2B-Rechnungen?"
Ohne Code Mode blättert der Agent durch Hunderte von Shop-Bestellungen und Rechnungen, liest jeden Datensatz in seinen Kontext ein und addiert Zahlen durch Lesen. Mit Code Mode bekommt er zwei Summen.
// 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,
};
Zurück kommen vier Zahlen, nicht 600 Datensätze:
{ "month": "2026-10", "shop": { "orders": 412, "gross": 38214.9 }, "invoices": { "count": 57, "gross": 91380.12 }, "total": 129595.02 }
Prüfe die Definition, bevor du der Summe vertraust. Wenn Shop-Bestellungen zusätzlich in der Buchhaltung fakturiert werden, zählt die Addition beider Werte doppelt; filtere die Rechnungen dann auf B2B-Kunden. Beide Beträge sind hier Bruttobeträge in der Währung des Shops und der Buchhaltung; Erstattungen und Gutschriften werden nicht abgezogen. Halte diese Entscheidungen in der Beschreibung des Tools fest, damit die KI sagt, was die Zahl bedeutet.
Rezept 2 — Bestellungen ohne Rechnung, Rechnungen ohne Bestellung
Die Frage: „Welche bezahlten Shop-Bestellungen aus dem letzten Monat haben keine Rechnung in der Buchhaltung, und bei welchen stimmen die Beträge nicht überein?"
Das ist die Aufgabe, bei der Modelle durch bloßes Lesen am schlechtesten abschneiden: zwei Listen mit je einigen hundert Zeilen, per Augenmaß verglichen. Im Code ist es ein Dictionary-Lookup.
// 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 };
Diese Version nimmt beide Listen als Eingaben entgegen, damit die Abgleichslogik lesbar bleibt. Hole sie in einem gespeicherten Code-Tool innerhalb des Programms mit den Paging-Schleifen aus Rezept 1 (Bestellungen von shopify_search_orders, Rechnungen von lexware_office_list_vouchers, dazu lexware_office_get_invoice, wo du das Referenzfeld brauchst). So ruft die KI ein Tool mit einem Monat auf und bekommt drei kurze Listen zurück:
{ "checked": 412, "missing": ["#1077", "#1139"], "mismatched": [{ "order": "#1101", "invoice": "RE0902", "order_total": 129.0, "invoice_total": 119.0 }], "orphanInvoices": [] }
Rezept 3 — 100 Preisabfragen in einem Aufruf statt in 100
Die Frage: „Hier sind 100 Artikelnummern aus der Kundenanfrage. Wie lauten die Preise für diesen Kunden?"
Viele ERPs berechnen einen kundenspezifischen Preis pro Artikel und Kunde, jeweils in einer eigenen Anfrage. Angenommen, dein eigener REST-Connector für das ERP hat ein Tool erp_get_customer_price mit den Eingaben article und customer (ein Beispielname; so machst du aus einer REST-API MCP-Tools). Ohne Code Mode macht der Agent 100 Aufrufe und liest 100 Ergebnisse. Mit 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),
};
Zehn Aufrufe laufen gleichzeitig, sodass 100 Abfragen mit je einigen hundert Millisekunden problemlos innerhalb des 10-Sekunden-Limits fertig werden. Ein fehlschlagender Artikel stoppt die übrigen nicht; er landet in notFound. Das Modell erhält eine Tabelle, die es in einen Angebotsentwurf oder eine E-Mail umwandeln kann, statt 100 einzelner Tool-Ergebnisse.
Prüfe zuerst, ob du überhaupt Code brauchst. Wenn die API in einer Anfrage nach einer Liste von Artikeln filtern kann (weclapp filtert Artikelnummern zum Beispiel mit einem in-Operator), ist ein einzelner gewöhnlicher Tool-Aufruf einfacher. Code Mode ist für die APIs gedacht, die das nicht können.
Inline oder gespeichert?
Inline (code_execute) | Gespeichertes Code-Tool | |
|---|---|---|
| Wer das Programm schreibt | Der Agent, für diese Frage | Ein Administrator, einmalig (oder der Agent schlägt es vor) |
| Geeignet für | Einmalige Analysen, Erkundung | Fragen, die das Team jede Woche stellt |
| Berechtigungen | Die eigenen des Aufrufers, nur lesend | Aufrufer oder Definierer, nur lesend, sofern Schreiben nicht erlaubt ist (Enterprise) |
| Edition (wie mit v0.52 angekündigt) | Team und Enterprise | Community 3, Starter 5, Team 20, Enterprise unbegrenzt |
Ein Muster, das der Agent zweimal inline löst, ist ein Kandidat für ein gespeichertes Tool. Ist Inline-Code aktiviert, kann der Agent es vorschlagen, und ein Administrator genehmigt es mit einem Klick.
FAQ
Können diese Programme schreiben, also zum Beispiel die fehlenden Rechnungen erstellen? Nicht inline. Ein gespeichertes Code-Tool kann Schreib-Tools nur aufrufen, wenn ein Administrator Allow write tools aktiviert, was Enterprise erfordert. Halte Programme, die Daten verändern, schreibgeschützt und lass eine Person die Aktion bestätigen.
Was, wenn ein Lauf mehr als 10 Sekunden braucht? Teile ihn auf: ein Lauf pro Monat statt für ein ganzes Jahr oder weniger Einträge pro Aufruf. Läufe, die ein Limit überschreiten, brechen mit einem Fehler ab; nichts wird halb geschrieben, weil sie nur lesen.
Sendet das Programm meine Daten irgendwohin? Nein. Das Programm läuft in einem isolierten Runner ohne Netzwerk. Es erreicht deine Systeme nur über die MCP-Tools, unter deiner Rolle. Siehe Sichere Code-Ausführung für KI-Agenten.
Weiterführend
- Was ist MCP Code Mode?
- Baue dein erstes Code-Tool, Schritt für Schritt
- Sichere Code-Ausführung für KI-Agenten
- Der Agent schlägt ein Code-Tool vor, der Admin genehmigt es
- Artikelnummer in PDF- und Excel-Preislisten finden
- Verbinde Shopify, Lexware Office und weclapp mit Claude
War dieser Guide hilfreich?