# Tarif: ücretli MCP sunucusu

> MCP sunucunun araçları için çağrı başına krediyle ücret al. Kişi bir kez paket alır; her çağrı önce düşer, sonra çalışır.

Ajanların kendileri ödemesi gerekmez. Kişi tarayıcıda bir kredi paketi alır; sonra her araç çağrısı bakiyeyi kontrol eder, idempotency anahtarıyla kredi düşer ve çalışır. Kredi bitince araç, ajanın kişiye gösterdiği bir yükleme bağlantısıyla yanıt verir. x402 yok, ajanda cüzdan yok, otomatik tahsilat yok.

> **Not:** Asistanla: bu tarifi projende Perly Pay eklentisinin `paid-mcp-tools` skill'i uygular. Çalıştırılabilir örnek, eklenti deposundaki `examples/paid-mcp-server` (MIT).

## Nasıl çalışır

1. **Kredi paketi** — [API kredileri](https://pay.perly.io/docs/recipe-api-credits.md)'ndeki gibi. Her araca bir fiyat ver ve açıklamasına yaz.
2. **Kim çağırıyor** — Barındırılan sunucu, her abonenin API anahtarını bir müşterinin `external_id`'siyle eşler. `PERLY_PAY_SECRET_KEY` yalnızca senin sunucunda.
3. **Önce düş, sonra çalış** — `action` olarak araç adıyla ve sunucunun her çağrı için ürettiği yeni bir anahtarla `credits.consume`, sonra iş.
4. **Yetmiyor mu?** — Protokol hatası değil, `isError: true` ve yükleme bağlantısıyla bir araç sonucu döndür: istemciler onu gösterir.
5. **Ücretsiz yardımcılar** — `balance` ve `top_up` araçları; ajan neler olduğunu açıklayabilsin diye.

**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) }] };
});
```

## Örneği çalıştır

1. **Kur** — `examples/paid-mcp-server` içinde `npm install` (Node 20.12+).
2. **Anahtar** — `.env.example` dosyasını `.env` olarak kopyala ve test anahtarını (`sk_test_…`) `PERLY_PAY_SECRET_KEY` içine yaz.
3. **Hazırla** — `npm run setup` senin anahtarınla bir ürün ve fiyat oluşturur ve `.env` için kimliklerini yazdırır.
4. **Çalıştır** — README'sinde dediği gibi `npm start` (ya da `npm run dev`).
5. **Cüzdansız öde** — Onu Claude Code'a ekle (`claude mcp add paid-tools -- npx tsx "$PWD/src/server.ts"`), `word_stats` çalıştır: yanıt bir yükleme sayfası. Bir paket seç, **Simulate payment**'a bas ve tekrar çalıştır.

## Tuzaklar

- Başkalarının kopyaladığı MCP yapılandırmasında `PERLY_PAY_SECRET_KEY`. Sunucuyu kendinde barındır ya da kendi backend'ine bağlansın.
- İşten sonra düşmek: başarısız bir düşüm o zaman bedava iş demektir.
- Düşüm anahtarını JSON-RPC kimliğinden almak: onu istemci seçer ve aynı kimlik ilk düşümü döndürür, böylece araç yine bedava çalışır.
