# Rezept: bezahlter MCP-Server

> Berechnen Sie die Tools eines MCP-Servers pro Aufruf – mit Credits. Ein Mensch kauft einmal ein Paket; jeder Aufruf bucht erst ab und arbeitet dann.

Agenten sollen nicht selbst bezahlen. Ein Mensch kauft im Browser ein Credit-Paket, danach prüft jeder Tool-Aufruf das Guthaben, bucht Credits mit einem Idempotenzschlüssel ab und arbeitet. Sind keine Credits mehr da, antwortet das Tool mit einem Aufladelink, den der Agent dem Menschen zeigt. Kein x402, keine Wallet im Agenten, keine automatischen Abbuchungen.

> **Hinweis:** Mit einem Assistenten: Dieses Rezept setzt der Skill `paid-mcp-tools` des Perly-Pay-Plugins in Ihrem Projekt um. Ein lauffähiges Beispiel ist `examples/paid-mcp-server` (MIT) im Repository des Plugins.

## So funktioniert es

1. **Ein Credit-Paket** — Wie bei den [API-Credits](https://pay.perly.io/docs/recipe-api-credits.md). Geben Sie jedem Tool einen Preis und schreiben Sie ihn in seine Beschreibung.
2. **Wer aufruft** — Ein gehosteter Server ordnet den API-Schlüssel jedes Abonnenten der `external_id` eines Kunden zu. `PERLY_PAY_SECRET_KEY` gibt es nur auf Ihrem Server.
3. **Erst abbuchen, dann arbeiten** — `credits.consume` mit dem Tool-Namen als `action` und einem frischen Schlüssel, den Ihr Server pro Aufruf erzeugt, dann die Arbeit.
4. **Zu wenig?** — Geben Sie ein Tool-Ergebnis mit `isError: true` und dem Aufladelink zurück, keinen Protokollfehler: Clients zeigen es an.
5. **Kostenlose Helfer** — Die Tools `balance` und `top_up`, damit der Agent erklären kann, was los ist.

**A paid tool**

```js
server.registerTool("summarize", { description: "Costs 3 credits.", inputSchema: { text: z.string() } }, async ({ text }, extra) => {
  const refused = await charge(userId, 3, "summarize", extra.requestId); // credits.consume, or a top-up message
  if (refused) return { isError: true, content: [{ type: "text", text: refused }] };
  return { content: [{ type: "text", text: summarize(text) }] };
});
```

## Beispiel starten

1. **Installieren** — `npm install` in `examples/paid-mcp-server` (Node 20.12+).
2. **Schlüssel** — Kopieren Sie `.env.example` nach `.env` und tragen Sie einen Testschlüssel (`sk_test_…`) in `PERLY_PAY_SECRET_KEY` ein.
3. **Vorbereiten** — `npm run setup` legt mit Ihrem Schlüssel Produkt und Preis an und gibt ihre IDs für `.env` aus.
4. **Starten** — `npm start` (oder `npm run dev`), wie seine README sagt.
5. **Ohne Wallet bezahlen** — Fügen Sie ihn in Claude Code hinzu (`claude mcp add paid-tools -- npx tsx "$PWD/src/server.ts"`) und führen Sie `word_stats` aus: Die Antwort ist eine Aufladeseite. Wählen Sie ein Paket, klicken Sie auf **Simulate payment** und führen Sie es erneut aus.

## Fallstricke

- `PERLY_PAY_SECRET_KEY` in einer MCP-Konfiguration, die andere kopieren. Hosten Sie den Server selbst oder lassen Sie ihn Ihr Backend aufrufen.
- Nach der Arbeit abbuchen: Eine fehlgeschlagene Abbuchung bedeutet dann Gratisarbeit.
- Der Abbuchungsschlüssel aus der JSON-RPC-ID: Die wählt der Client, und dieselbe ID liefert die erste Abbuchung zurück, also arbeitet das Tool wieder gratis.
