Zusammenfassung
Eine Schritt-für-Schritt-Anleitung für den AnythingMCP-Code Mode: Code-Runner starten, Code Mode aktivieren und ein Code-Tool speichern, das die letzten Bestellungen aus dem ERP (weclapp) sowie den Account und die offenen Deals aus dem CRM (HubSpot) in einem Tool-Aufruf liest. Nur lesend, mit den Berechtigungen des Aufrufers, auditiert.
TL;DR: Vor einem Kundentermin bittet ein Vertriebsmitarbeiter den Assistenten um einen Überblick: die letzten Bestellungen aus dem ERP sowie den Account-Inhaber und die offenen Deals aus dem CRM. Ohne Code Mode sind das vier oder fünf Tool-Aufrufe, deren Ergebnisse das Modell jeweils vollständig lesen muss. Mit einem gespeicherten Code-Tool ist es ein einziger: customer_overview(customer) führt ein kurzes JavaScript-Programm aus, das die Aufrufe macht, nur das Wesentliche behält und eine kompakte Zusammenfassung zurückgibt. Diese Anleitung baut das Tool auf einem self-hosted AnythingMCP (v0.52.1 oder neuer) mit weclapp als ERP und HubSpot als CRM; dasselbe Muster funktioniert mit beliebigen zwei Connectors.
Was du brauchst
- Self-hosted AnythingMCP v0.52.1 oder neuer. Der Code Mode kommt bald in AnythingMCP Cloud.
- Zwei Connectors mit lesenden Tools, hier weclapp und HubSpot, installiert und funktionsfähig.
- Administratorrechte im Workspace.
Neu bei dem Thema? Was ist der MCP-Code Mode? erklärt, warum ein Programm besser ist als viele Tool-Aufrufe.
Schritt 1 — Den Code-Runner starten
Code läuft nie direkt in AnythingMCP selbst. Er läuft in einem separaten code-runner-Container, und ohne ihn wird jede Code-Ausführung abgelehnt. Ergänze in deiner .env:
COMPOSE_PROFILES=code-runner
CODE_RUNNER_URL=ws://code-runner:8777
Wenn du bereits Profile verwendest, liste sie zusammen auf, zum Beispiel COMPOSE_PROFILES=files,code-runner. Dann:
docker compose up -d
Der Runner enthält keine Secrets, veröffentlicht keine Ports und hat keine Route ins Internet; nur das Backend spricht im internen Docker-Netzwerk mit ihm. Wie er jede Ausführung isoliert: Sichere Code-Ausführung für KI-Agenten.
Schritt 2 — Code Mode für den MCP-Server aktivieren
Der Code Mode ist pro MCP-Server standardmäßig aus, und gespeicherte Code-Tools werden auf einem Server abgelehnt, dessen Code Mode off ist. Setze den Code Mode des Servers, den dein Vertriebsteam nutzt, auf tools (nur gespeicherte Code-Tools). inline bietet dem Agenten zusätzlich code_execute und code_propose_tool an; für diese Anleitung brauchst du das nicht.
Öffne im Dashboard MCP-Server und dann den Server. Setze in der Karte Server-Einstellungen oben den Code-Modus auf Nur gespeicherte Code-Tools und klicke auf Speichern. Verbinde danach den KI-Client neu.
Lieber per API? PUT /api/mcp-servers/<id> mit {"codeMode": "tools"} macht dasselbe. Die Einstellung gibt es seit v0.52.1; auf v0.52.0 aktualisiere zuerst.
Schritt 3 — Die beiden Connector-IDs notieren
Ein Code-Tool legt fest, welche Connectors sein Programm aufrufen darf. Öffne jeden Connector im Dashboard: Seine ID ist der letzte Teil der Adresse, /connectors/<id>. Kopiere die IDs des weclapp- und des HubSpot-Connectors.
Schritt 4 — Das Code-Tool erstellen
Öffne den weclapp-Connector, gehe zu MCP Tools und klicke auf Add Tool. Setze Tool Type auf Code Tool und fülle dann aus:
- Tool Name:
customer_overview - Description: „Überblick über einen Kunden vor einem Gespräch: die letzten 10 Bestellungen aus dem ERP, der CRM-Account und seine offenen Deals. Übergib den Firmennamen oder einen Teil davon." Die Beschreibung liest die KI, um zu entscheiden, wann sie das Tool aufruft – schreibe also hinein, was es zurückgibt.
- Input Parameters: ein Parameter,
customer, Typ string, erforderlich.

Schritt 5 — Das Programm schreiben
Das Program ist der Rumpf einer asynchronen JavaScript-Funktion. Die Eingaben des Tools stehen in args; amcp.run(name, args) ruft ein anderes Tool auf und liefert dessen Ergebnis als geparstes JSON zurück (und wirft einen Fehler, wenn das Tool fehlschlägt). Was du mit return zurückgibst, erhält die KI.
// Input: args.customer, a company name or part of it.
const name = String(args.customer ?? '').trim();
if (!name) return { error: 'Pass a customer name.' };
// ERP (weclapp): the customer, then its latest sales orders.
const parties = await amcp.run('weclapp_list_customers', {
filter: `company-ilike=%${name}%`,
pageSize: 5,
});
const customer = (parties.result ?? [])[0];
if (!customer) return { error: `No customer matching "${name}" in the ERP.` };
const orders = await amcp.run('weclapp_list_sales_orders', {
filter: `customerId-eq=${customer.id}`,
sort: '-orderDate',
pageSize: 10,
});
// CRM (HubSpot): the company record and its open deals.
const companies = await amcp.run('hubspot_search_objects', {
object_type: 'companies',
query: customer.company,
properties: ['name', 'domain', 'hubspot_owner_id', 'lifecyclestage'],
limit: 1,
});
const company = companies.results?.[0];
let deals = [];
if (company) {
const found = await amcp.run('hubspot_search_objects', {
object_type: 'deals',
filter_groups: [{ filters: [
{ propertyName: 'associations.company', operator: 'EQ', value: company.id },
{ propertyName: 'hs_is_closed', operator: 'EQ', value: 'false' },
] }],
properties: ['dealname', 'amount', 'dealstage', 'closedate'],
limit: 20,
});
deals = found.results ?? [];
}
// Only this goes back to the model.
return {
customer: { number: customer.customerNumber, name: customer.company },
lastOrders: (orders.result ?? []).map((o) => ({
number: o.orderNumber, date: o.orderDate, status: o.status, net: o.netAmount,
})),
crm: company
? { owner: company.properties.hubspot_owner_id, stage: company.properties.lifecyclestage }
: null,
openDeals: deals.map((d) => ({
name: d.properties.dealname, amount: d.properties.amount,
stage: d.properties.dealstage, close: d.properties.closedate,
})),
};
Die Feldnamen sind die, die die weclapp- und HubSpot-APIs zurückgeben. Bevor du dich auf ein Feld verlässt, führe das zugrunde liegende Tool einmal im zugehörigen Test-Panel aus und sieh dir das Ergebnis an; innerhalb des Programms liefert await amcp.describe('weclapp_list_sales_orders') das Eingabeschema eines Tools.
Ein Hinweis zur Verknüpfung. Dieses Programm ordnet die CRM-Firma über den Namen zu, was für ein Briefing gut genug ist. Wenn du die ERP-Kundennummer in einer HubSpot-Property speicherst, filtere stattdessen danach, dann ist die Zuordnung exakt.
Schritt 6 — Festlegen, was das Programm verwenden darf
Uses (connectors) listet die Connectors und optional die genauen Tools auf, die das Programm aufrufen darf. Füge die beiden IDs aus Schritt 3 ein:
[
{ "connectorId": "<weclapp connector id>", "tools": ["weclapp_list_customers", "weclapp_list_sales_orders"] },
{ "connectorId": "<hubspot connector id>", "tools": ["hubspot_search_objects"] }
]
Die Tools zu benennen ist optional (ohne "tools" ist der gesamte Connector erlaubt), aber eine kurze Liste macht das Tool leicht überprüfbar. Es werden nur Connectors desselben Workspaces akzeptiert. Ein Tool außerhalb dieser Liste schlägt mit einem Fehler fehl, selbst wenn der Benutzer es direkt aufrufen könnte.
Schritt 7 — Als Invoker ausführen, nur lesend
- Run as: Invoker (die eigenen Berechtigungen des Aufrufers). Jeder innere Aufruf wird gegen die Rolle der Person geprüft, die das Tool verwendet. Ein Vertriebsmitarbeiter ohne HubSpot-Zugriff erhält für den HubSpot-Teil einen Fehler, genau als hätte er HubSpot direkt aufgerufen. (Definer läuft stattdessen mit der Kuratierung des Autors, wie eine Stored Procedure; das ist für Administratoren und Enterprise gedacht.)
- Allow write tools: aus. Das Programm darf dann nur lesende Tools aufrufen;
weclapp_list_*undhubspot_search_objectssind Lesezugriffe. Code-Tools mit Schreibrechten erfordern Enterprise.
Klicke auf Create Tool.
Schritt 8 — Mit Claude oder ChatGPT ausprobieren
Prüfe das Programm zuerst mit dem Test-Button des Tools im Dashboard: Er führt den Code über den Code Runner aus, mit denselben Regeln wie ein echter Aufruf. Teste es dann mit einem KI-Client, der mit dem MCP-Server verbunden ist. Das Tool ist auf jedem Server verfügbar, der den weclapp-Connector hat und bei dem der Code Mode aktiviert ist. Verbinde den KI-Client neu oder aktualisiere seine Tools und frage:
„Ich telefoniere in zehn Minuten mit Lindenhof Bau. Was haben sie zuletzt bestellt, wer betreut den Account und gibt es offene Deals?"
Der Assistent ruft customer_overview einmal auf und verfasst das Briefing aus dem kompakten Ergebnis, statt vollständige Bestelllisten und CRM-Datensätze zu lesen. Wenn etwas nicht stimmt, sagt das Tool-Ergebnis, was: ein Aufruf außerhalb von Uses ('hubspot_search_objects' is not a tool this code tool can use), ein von der API zurückgegebener Fehler oder ein Timeout. Korrigiere das Programm, speichere und frage erneut.
Was bei jedem Aufruf passiert
- Ein Lauf, ein Eintrag. Jeder Aufruf des Tools wird als Code-Lauf aufgezeichnet, und jeder Tool-Aufruf, den das Programm macht, steht wie jeder andere Aufruf mit dem Benutzer im Audit-Log.
- Limits. Ein Lauf darf bis zu 10 Sekunden dauern, bis zu 500 Tool-Aufrufe machen (16 gleichzeitig) und bis zu 1 MB zurückgeben. Ein Programm, das ein Limit überschreitet, stoppt mit einer klaren Fehlermeldung und beeinträchtigt nichts anderes.
- Keine Verschachtelung. Ein Code-Tool kann kein anderes Code-Tool aufrufen.
- Nur auf deinen Servern. Code-Tools werden auf den eigenen MCP-Servern des Workspaces bereitgestellt, nie auf dem gemeinsamen
/mcp-Endpunkt.
Tarife
Gespeicherte Code-Tools pro Edition, wie mit v0.52 angekündigt: Community 3, Starter 5, Team 20, Enterprise unbegrenzt. Code-Tools mit Schreibrechten und „Run as Definer" sind Enterprise. Tarife vergleichen.
FAQ
Muss ich JavaScript können?
Grundlegende JavaScript-Kenntnisse genügen: await, Objekte, map und filter. Du kannst das Programm auch vom Agenten entwerfen lassen und es dir zur Prüfung als Tool vorschlagen lassen.
Kann das Programm eine externe API direkt aufrufen? Nein. Es hat keinen Netzwerkzugriff. Es kann nur die in Uses aufgeführten MCP Tools aufrufen; um eine andere API zu erreichen, füge sie zuerst als Connector hinzu.
Bei welchem Connector soll das Code-Tool liegen? Bei einem beliebigen der von ihm verwendeten Connectors; das Tool erscheint überall dort, wo dieser Connector zugewiesen ist. Wähle den, dessen Zielgruppe das Tool erhalten soll.
Verwandte Themen
- Was ist der MCP-Code Mode?
- Sichere Code-Ausführung für KI-Agenten: So funktioniert der isolierte Runner
- Code-Mode-Rezepte: Monatsumsatz, Rechnungsabgleich, 100 Preisabfragen
- Der Agent schlägt ein Code-Tool vor, der Admin genehmigt es
- Steuere dein ERP per KI: weclapp
- AnythingMCP mit Docker Compose bereitstellen
- weclapp und HubSpot mit Claude verbinden
War dieser Guide hilfreich?