MCP-Tools tragen jetzt ein Preisschild: pro Aufruf Kosten angeben, pro Chat ein Budget deckeln


Du erfährst es am Monatsende: Irgendein MCP-Tool lief vierzig Mal oder öfter, und jeder Aufruf hat echte Credits abgebucht. Im Transcript sieht es aus wie ein kostenloser Datei-Reader — dasselbe JSON rein, dasselbe einzeilige „done“ raus. Nichts im Gespräch hat dir verraten, welche Aufrufe Geld verbrannt haben.

Das ist die unangenehme Lage, in der das MCP-Ökosystem gerade steckt. Bild-, Video- und 3D-Generierung sowie bezahlte APIs kommen alle als MCP-Server daher, und ein Agent sieht sie genauso wie read_file. PR #142470, gemergt am 21. Oktober 2026, ergänzt die beiden fehlenden Teile: deklarierte Kosten pro Tool und ein Budget pro Chat.

Drei neue Keys

Innerhalb eines mcp_servers-Eintrags in config.yaml:

mcp_servers:
  renders:
    command: "render-mcp"
    trust: untrusted
    tool_costs:
      create_image: 20                                    # etwa 20 Credits pro Aufruf
      animate: {credits: [5, 20], note: "per animation"}   # eine Spanne, mit kurzer Notiz
      get_status: 0                                        # kostenlos; wie weglassen
    spend_limit: 100     # pro Chat; 0 oder fehlend = kein Limit
    cost_unit: credits   # Beschriftung in Prompts (Standard: credits)

tool_costs akzeptiert drei Formen:

  • eine nicht-negative Zahl für feste Kosten;
  • eine Spanne [min, max], passend für Tools, die nach Auflösung oder Dauer abgerechnet werden;
  • ein Objekt mit credits, das eine Zahl oder eine Spanne enthält, plus note für eine Zeile in Klartext.

spend_limit ist eine pro Chat geltende Obergrenze; 0 oder weggelassen bedeutet kein Limit. cost_unit ändert nur die Formulierung in Prompts und Summen (Standard credits), damit ein Dienst, der in „runs“ oder „points“ abrechnet, das auch sagen kann.

Aus dem Approval-Prompt wird eine Rechnung

Vor den Deklarationen fragte ein Server mit trust: untrusted vor einem schreibfähigen Aufruf „allow create_image?“. Mit deklarierten Kosten liest derselbe Prompt so:

Costs about 20 credits.

Eine Spanne erscheint als Costs 5-20 credits (per animation). Sobald der Chat auf diesem Server etwas ausgegeben hat, kommt eine zweite Zeile dazu:

This chat has used about 40 credits on 'renders' (limit 100).

Der Wert liegt darin, dass Approval nicht mehr nur eine Sicherheitsfrage ist, sondern eine Budgetfrage. Du genehmigst nicht mehr eine Aktion, du genehmigst weitere 20 Credits.

Wo die laufende Summe liegt

Diese Regeln zählen mehr als die Config, weil sie entscheiden, ob du der Zahl traust:

  • Summen werden pro Chat und pro Server geführt; zwischen Chats wird nichts übertragen.
  • Nur Aufrufe, die tatsächlich abgeschickt wurden, zählen. Abgelehnte oder blockierte Aufrufe schlagen nicht zu Buche.
  • Abgerechnet wird die deklarierte Schätzung und bei einer Spanne der obere Wert — das Design irrt lieber in Richtung früheres Nachfragen.
  • Ein Aufruf, dessen Server stirbt, bevor er ihn erhält, zählt trotzdem, aus demselben Grund.
  • Die Summe lebt im Speicher: Sie ist ein Budget für ein Gespräch, nicht die Rechnung des Anbieters. Ein Neustart von Hermes setzt jede Summe zurück.
  • Die Summe folgt dem Gespräch durch Kontextkompression und /branch. In der CLI eröffnet /new eine neue Summe (gleiches gilt für einen neuen Desktop-Chat); auf Messaging-Plattformen gehört die Summe zum Chat, sie überlebt also /new. Jeder Cron-Lauf bekommt seine eigene Summe.

Was passiert, wenn das Budget überschritten wird

Das ist der Teil, den man sich merken sollte:

  1. Es fragt auch auf einem trust: full-Server nach. So ein Server führt kostenpflichtige Tools normalerweise ohne Prompt aus; sobald ein Aufruf spend_limit überschreiten würde, hält er an und fragt.
  2. Es fragt jedes Mal. Die Wahl „für diese Session erlauben“ schaltet spätere kostenpflichtige Aufrufe in diesem Chat nicht stumm.
  3. Wo niemand antworten kann, wird verweigert, ohne abzuschicken. Cron-Jobs, hermes chat -q und ein Gateway ohne Approver landen alle hier. Das Modell bekommt einen Tool-Fehler, der Ausgabe und Limit nennt und sagt, dass es nicht wiederholen soll — kein stiller Fehlschlag.
  4. Unterhalb des Limits ändert sich nichts. trust: full bleibt ohne Prompt, und Tools mit readOnlyHint: true werden nicht aufgeweckt, es sei denn, das Budget verlangt es.

Anders gesagt: spend_limit ist kein Drosselventil. Es ist eine Schranke, die sagt: „Ab hier muss ein Mensch nicken.“

Portable Pakete können es ebenfalls deklarieren

Ein portables Plugin-Paket trägt dieselbe Tabelle für seinen Server in plugin.json:

"extensions": {
  "com.nousresearch.hermes": {
    "servers": {
      "meshy": {
        "trust": "untrusted",
        "costs": { "meshy_remesh": 5, "meshy_animate": { "credits": [5, 20], "note": "per animation" } },
        "spend_limit": 100,
        "cost_unit": "credits"
      }
    }
  }
}

Damit ist eine echte Asymmetrie gelöst: Der Plugin-Autor weiß genau, was ein Tool kostet, der Nutzer meist nicht. Die costs / spend_limit / cost_unit des Pakets werden in die nativen Keys übersetzt.

Fünf Stolperfallen

  1. Eine fehlerhafte Kostentabelle überspringt den ganzen Server, statt ignoriert zu werden. Jeder der drei Keys in falscher Form verhindert, dass dieser Server lädt, und der Fehler nennt den Key. Absicht: Ein Tippfehler darf dein Budget nicht still fallen lassen.
  2. tool_costs-Keys müssen die Tool-Namen des Servers selbst sein, nicht der Anzeige-Präfix von Hermes mcp_<server>_. Ein falscher Key schlägt nicht fehl — er gibt beim Verbinden eine Warnung aus, die man leicht übersieht.
  3. Vererbung bei gleichnamigem Override: Wenn du einen eigenen mcp_servers-Eintrag für denselben Server anlegst (etwa um ihn auf trust: full zu heben), gelten die Kosten-Keys des Pakets weiter, solange dein Eintrag sie nicht setzt. spend_limit: 0 schaltet das Limit des Pakets ab; tool_costs: {} wirft seine Kosten weg.
  4. Es ist ein Budget, keine Rechnung. Die Abrechnung des Anbieters kann von der Deklaration abweichen, und Summen werden beim Neustart zurückgesetzt. Behandle es nicht als Buchhaltung.
  5. hermes plugins validate listet server costs: <name>. Prüfe diese Zeile vor der Installation, statt die Ausgaben hinterher aus einem Transcript zu rekonstruieren.

Kannst du es heute schon nutzen?

Das Feature liegt auf main und ist nicht im ausgelieferten v0.22.4 — der Compare-Bereich v0.22.3 bis v0.22.4 umfasst 14 Commits, und dieses Feature ist keiner davon. Produktionsinstallationen warten auf das nächste Release; Source-Checkouts, die main folgen, können es jetzt ausprobieren.

Der Design-Kredit geht an ein Community-Projekt, Adolanium/hermes-tripo, das „jedes Credit einzeln abgefragt“ und „ein Limit pro Chat“ mit einem nativen pre_tool_call-Hook umgesetzt hat. Portable Pakete können keine Hooks ausliefern, deshalb ist es als Core-Feature gelandet, getrieben von deklarierten Daten — was auch heißt, dass offizielle Plugins wie das Meshy-Plugin es nutzen können.

Wenn du noch überlegst, welche Server trust: full verdienen, deckt unser Sicherheitsleitfaden zum MCP-Katalog die Trust-Stufen ab. Kosten-Deklarationen und Trust-Stufen beantworten verschiedene Fragen; zusammen funktionieren sie am besten.