paygate-mcp 0.8.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +206 -16
  2. package/dist/cli.js +49 -4
  3. package/dist/cli.js.map +1 -1
  4. package/dist/client.d.ts +119 -0
  5. package/dist/client.d.ts.map +1 -0
  6. package/dist/client.js +262 -0
  7. package/dist/client.js.map +1 -0
  8. package/dist/gate.d.ts +4 -1
  9. package/dist/gate.d.ts.map +1 -1
  10. package/dist/gate.js +30 -6
  11. package/dist/gate.js.map +1 -1
  12. package/dist/http-proxy.d.ts +5 -0
  13. package/dist/http-proxy.d.ts.map +1 -1
  14. package/dist/http-proxy.js +10 -0
  15. package/dist/http-proxy.js.map +1 -1
  16. package/dist/index.d.ts +7 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +10 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/oauth.d.ts +177 -0
  21. package/dist/oauth.d.ts.map +1 -0
  22. package/dist/oauth.js +380 -0
  23. package/dist/oauth.js.map +1 -0
  24. package/dist/proxy.d.ts +5 -0
  25. package/dist/proxy.d.ts.map +1 -1
  26. package/dist/proxy.js +10 -0
  27. package/dist/proxy.js.map +1 -1
  28. package/dist/quota.d.ts +37 -0
  29. package/dist/quota.d.ts.map +1 -0
  30. package/dist/quota.js +107 -0
  31. package/dist/quota.js.map +1 -0
  32. package/dist/router.d.ts +57 -0
  33. package/dist/router.d.ts.map +1 -0
  34. package/dist/router.js +233 -0
  35. package/dist/router.js.map +1 -0
  36. package/dist/server.d.ts +25 -3
  37. package/dist/server.d.ts.map +1 -1
  38. package/dist/server.js +421 -7
  39. package/dist/server.js.map +1 -1
  40. package/dist/store.d.ts +7 -1
  41. package/dist/store.d.ts.map +1 -1
  42. package/dist/store.js +42 -0
  43. package/dist/store.js.map +1 -1
  44. package/dist/types.d.ts +50 -0
  45. package/dist/types.d.ts.map +1 -1
  46. package/dist/types.js.map +1 -1
  47. package/package.json +3 -2
package/README.md CHANGED
@@ -30,11 +30,16 @@ Agent → PayGate (auth + billing) → Your MCP Server (stdio or HTTP)
30
30
  - **Credit Billing** — Each tool call costs credits (configurable per-tool)
31
31
  - **Rate Limiting** — Sliding window per-key rate limits + per-tool rate limits
32
32
  - **Usage Metering** — Track who called what, when, and how much they spent
33
+ - **Multi-Server Mode** — Wrap N MCP servers behind one PayGate with tool prefix routing
34
+ - **Client SDK** — `PayGateClient` with auto 402 retry, balance tracking, and typed errors
33
35
  - **Two Transports** — Wrap local servers via stdio or remote servers via Streamable HTTP
34
36
  - **Per-Tool ACL** — Whitelist/blacklist tools per API key (enterprise access control)
35
37
  - **Per-Tool Rate Limits** — Independent rate limits per tool, not just global
36
38
  - **Key Expiry (TTL)** — Auto-expire API keys after a set time
37
39
  - **Spending Limits** — Cap total spend per API key to prevent runaway costs
40
+ - **Usage Quotas** — Daily/monthly call and credit limits per key (with UTC auto-reset)
41
+ - **Dynamic Pricing** — Charge extra credits based on input size (`creditsPerKbInput`)
42
+ - **OAuth 2.1** — Full authorization server with PKCE, client registration, Bearer tokens
38
43
  - **Refund on Failure** — Automatically refund credits when downstream tool calls fail
39
44
  - **Webhook Events** — POST batched usage events to any URL for external billing/alerting
40
45
  - **Config File Mode** — Load all settings from a JSON file (`--config`)
@@ -88,6 +93,75 @@ The proxy handles:
88
93
 
89
94
  When started, you'll see your admin key in the console. Save it.
90
95
 
96
+ ### Multi-Server Mode
97
+
98
+ Wrap multiple MCP servers behind a single PayGate instance. Tools are prefixed with the server name:
99
+
100
+ ```bash
101
+ npx paygate-mcp wrap --config multi-server.json
102
+ ```
103
+
104
+ Example `multi-server.json`:
105
+ ```json
106
+ {
107
+ "port": 3402,
108
+ "defaultCreditsPerCall": 1,
109
+ "servers": [
110
+ {
111
+ "prefix": "fs",
112
+ "serverCommand": "npx",
113
+ "serverArgs": ["@modelcontextprotocol/server-filesystem", "/tmp"]
114
+ },
115
+ {
116
+ "prefix": "github",
117
+ "remoteUrl": "https://github-mcp.example.com/mcp"
118
+ }
119
+ ]
120
+ }
121
+ ```
122
+
123
+ Tools are exposed with prefixes: `fs:read_file`, `fs:write_file`, `github:search_repos`, etc. Pricing and ACLs work on the prefixed names:
124
+
125
+ ```json
126
+ {
127
+ "toolPricing": {
128
+ "github:search_repos": { "creditsPerCall": 5 },
129
+ "fs:read_file": { "creditsPerCall": 1 }
130
+ }
131
+ }
132
+ ```
133
+
134
+ Credits are shared across all backends — one API key works for all servers.
135
+
136
+ ### Client SDK
137
+
138
+ Use `PayGateClient` to call tools from TypeScript/Node.js with auto 402 retry:
139
+
140
+ ```typescript
141
+ import { PayGateClient, PayGateError } from 'paygate-mcp/client';
142
+
143
+ const client = new PayGateClient({
144
+ url: 'http://localhost:3402',
145
+ apiKey: 'pg_abc123...',
146
+ autoRetry: true,
147
+ onCreditsNeeded: async (info) => {
148
+ // Called when credits run out — add credits and return true to retry
149
+ await topUpCredits(info.creditsRequired);
150
+ return true;
151
+ },
152
+ });
153
+
154
+ const tools = await client.listTools();
155
+ const result = await client.callTool('search', { query: 'hello' });
156
+ const balance = await client.getBalance();
157
+ ```
158
+
159
+ Features:
160
+ - **Auto 402 retry**: When a tool call returns payment-required, calls `onCreditsNeeded` and retries
161
+ - **Balance tracking**: `client.lastKnownBalance` tracks credits from `getBalance()` calls
162
+ - **Typed errors**: `PayGateError` with `.isPaymentRequired`, `.isRateLimited`, `.isExpired` helpers
163
+ - **Zero dependencies**: Uses Node.js built-in `http`/`https`
164
+
91
165
  ### Create API Keys
92
166
 
93
167
  ```bash
@@ -173,19 +247,26 @@ A real-time admin UI for managing keys, viewing usage, and monitoring tool calls
173
247
 
174
248
  | Endpoint | Method | Auth | Description |
175
249
  |----------|--------|------|-------------|
176
- | `/mcp` | POST | `X-API-Key` | JSON-RPC 2.0 proxy to wrapped MCP server |
177
- | `/balance` | GET | `X-API-Key` | Client self-service — check own credits, ACL, expiry |
178
- | `/keys` | POST | `X-Admin-Key` | Create API key (with ACL, expiry, credits) |
250
+ | `/mcp` | POST | `X-API-Key` or `Bearer` | JSON-RPC 2.0 proxy to wrapped MCP server |
251
+ | `/balance` | GET | `X-API-Key` | Client self-service — check credits, quota, ACL, expiry |
252
+ | `/keys` | POST | `X-Admin-Key` | Create API key (with ACL, expiry, quota, credits) |
179
253
  | `/keys` | GET | `X-Admin-Key` | List all keys (masked, with expiry status) |
180
254
  | `/topup` | POST | `X-Admin-Key` | Add credits to an existing key |
181
255
  | `/keys/revoke` | POST | `X-Admin-Key` | Revoke an API key |
182
256
  | `/keys/acl` | POST | `X-Admin-Key` | Set tool ACL (whitelist/blacklist) on a key |
183
257
  | `/keys/expiry` | POST | `X-Admin-Key` | Set or remove key expiry (TTL) |
258
+ | `/keys/quota` | POST | `X-Admin-Key` | Set usage quota (daily/monthly limits) |
184
259
  | `/limits` | POST | `X-Admin-Key` | Set spending limit on a key |
185
260
  | `/usage` | GET | `X-Admin-Key` | Export usage data (JSON or CSV) |
186
261
  | `/status` | GET | `X-Admin-Key` | Full dashboard with usage stats |
187
262
  | `/dashboard` | GET | None (admin key in-browser) | Real-time admin web dashboard |
188
263
  | `/stripe/webhook` | POST | Stripe Signature | Auto-top-up credits on payment |
264
+ | `/.well-known/oauth-authorization-server` | GET | None | OAuth 2.1 server metadata |
265
+ | `/oauth/register` | POST | None | Dynamic Client Registration (RFC 7591) |
266
+ | `/oauth/authorize` | GET | None | Authorization endpoint (PKCE required) |
267
+ | `/oauth/token` | POST | None | Token endpoint (code exchange + refresh) |
268
+ | `/oauth/revoke` | POST | None | Token revocation (RFC 7009) |
269
+ | `/oauth/clients` | GET | `X-Admin-Key` | List registered OAuth clients |
189
270
  | `/` | GET | None | Health check |
190
271
 
191
272
  ### Free Methods
@@ -213,7 +294,7 @@ These MCP methods pass through without auth or billing:
213
294
  --config <path> Load settings from a JSON config file
214
295
  ```
215
296
 
216
- > **Note:** Use `--server` OR `--remote-url`, not both.
297
+ > **Note:** Use `--server` OR `--remote-url` for single-server mode. Use `servers` in a config file for multi-server mode.
217
298
 
218
299
  ### Persistent Storage
219
300
 
@@ -364,6 +445,88 @@ npx paygate-mcp wrap --server "node server.js" --webhook-url "https://billing.ex
364
445
 
365
446
  Events are batched (up to 10 per POST) and flushed every 5 seconds. Each event includes tool name, credits charged, API key, and timestamp. Fire-and-forget with one retry on failure.
366
447
 
448
+ ### Usage Quotas
449
+
450
+ Set daily or monthly usage limits per API key:
451
+
452
+ ```bash
453
+ # Create a key with 10 calls/day, 200 calls/month
454
+ curl -X POST http://localhost:3402/keys \
455
+ -H "Content-Type: application/json" \
456
+ -H "X-Admin-Key: YOUR_ADMIN_KEY" \
457
+ -d '{"name": "metered-user", "credits": 1000, "quota": {"dailyCallLimit": 10, "monthlyCallLimit": 200}}'
458
+
459
+ # Set credit-based quotas (max 50 credits/day)
460
+ curl -X POST http://localhost:3402/keys/quota \
461
+ -H "Content-Type: application/json" \
462
+ -H "X-Admin-Key: YOUR_ADMIN_KEY" \
463
+ -d '{"key": "CLIENT_API_KEY", "dailyCreditLimit": 50}'
464
+
465
+ # Remove per-key quota (fall back to global defaults)
466
+ curl -X POST http://localhost:3402/keys/quota \
467
+ -H "Content-Type: application/json" \
468
+ -H "X-Admin-Key: YOUR_ADMIN_KEY" \
469
+ -d '{"key": "CLIENT_API_KEY", "remove": true}'
470
+ ```
471
+
472
+ Quota types: `dailyCallLimit`, `monthlyCallLimit`, `dailyCreditLimit`, `monthlyCreditLimit`. Set to 0 for unlimited. Counters reset at UTC midnight (daily) and UTC month boundary (monthly). Set global defaults in the config file with `globalQuota`.
473
+
474
+ ### Dynamic Pricing
475
+
476
+ Charge extra credits based on input argument size:
477
+
478
+ ```json
479
+ {
480
+ "toolPricing": {
481
+ "analyze_text": { "creditsPerCall": 2, "creditsPerKbInput": 5 },
482
+ "search": { "creditsPerCall": 1 }
483
+ }
484
+ }
485
+ ```
486
+
487
+ For `analyze_text`, a 3 KB input would cost `2 + ceil(3 × 5) = 17` credits. Small inputs round up to at least 1 KB. Tools without `creditsPerKbInput` use the flat base price.
488
+
489
+ ### OAuth 2.1
490
+
491
+ Full OAuth 2.1 authorization server for MCP clients. Implements PKCE, dynamic client registration, token refresh, and revocation.
492
+
493
+ Enable OAuth in config:
494
+ ```json
495
+ {
496
+ "oauth": {
497
+ "accessTokenTtl": 3600,
498
+ "refreshTokenTtl": 2592000,
499
+ "scopes": ["tools:*", "tools:read", "tools:write"]
500
+ }
501
+ }
502
+ ```
503
+
504
+ **Full flow:**
505
+ ```bash
506
+ # 1. Register an OAuth client
507
+ curl -X POST http://localhost:3402/oauth/register \
508
+ -H "Content-Type: application/json" \
509
+ -d '{"client_name": "My Agent", "redirect_uris": ["http://localhost:8080/callback"], "api_key": "pg_..."}'
510
+
511
+ # 2. Generate PKCE challenge (code_verifier → SHA256 → base64url)
512
+ # 3. Authorize: GET /oauth/authorize?response_type=code&client_id=...&redirect_uri=...&code_challenge=...&code_challenge_method=S256
513
+ # 4. Exchange code for tokens
514
+ curl -X POST http://localhost:3402/oauth/token \
515
+ -H "Content-Type: application/json" \
516
+ -d '{"grant_type": "authorization_code", "code": "...", "client_id": "...", "redirect_uri": "...", "code_verifier": "..."}'
517
+
518
+ # 5. Use Bearer token on /mcp
519
+ curl -X POST http://localhost:3402/mcp \
520
+ -H "Authorization: Bearer pg_at_..." \
521
+ -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {"name": "search", "arguments": {"query": "hello"}}}'
522
+
523
+ # 6. Refresh token
524
+ curl -X POST http://localhost:3402/oauth/token \
525
+ -d '{"grant_type": "refresh_token", "refresh_token": "pg_rt_...", "client_id": "..."}'
526
+ ```
527
+
528
+ OAuth tokens are backed by API keys — each token maps to an API key for billing. The `/mcp` endpoint accepts both `X-API-Key` and `Authorization: Bearer` headers.
529
+
367
530
  ### Config File Mode
368
531
 
369
532
  Load all settings from a JSON file instead of CLI flags:
@@ -384,7 +547,15 @@ Example `paygate.json`:
384
547
  "refundOnFailure": true,
385
548
  "stateFile": "~/.paygate/state.json",
386
549
  "toolPricing": {
387
- "premium_analyze": { "creditsPerCall": 10 }
550
+ "premium_analyze": { "creditsPerCall": 10, "creditsPerKbInput": 5 }
551
+ },
552
+ "globalQuota": {
553
+ "dailyCallLimit": 1000,
554
+ "monthlyCreditLimit": 50000
555
+ },
556
+ "oauth": {
557
+ "accessTokenTtl": 3600,
558
+ "scopes": ["tools:*"]
388
559
  },
389
560
  "importKeys": {
390
561
  "pg_abc123def456": 500
@@ -397,7 +568,7 @@ CLI flags override config file values when both are specified.
397
568
  ## Programmatic API
398
569
 
399
570
  ```typescript
400
- import { PayGateServer, HttpMcpProxy } from 'paygate-mcp';
571
+ import { PayGateServer } from 'paygate-mcp';
401
572
 
402
573
  // Wrap a local server (stdio)
403
574
  const server = new PayGateServer({
@@ -410,14 +581,28 @@ const server = new PayGateServer({
410
581
  },
411
582
  });
412
583
 
413
- // Or gate a remote server (Streamable HTTP)
414
- const remoteServer = new PayGateServer({
415
- serverCommand: '',
416
- port: 3402,
417
- defaultCreditsPerCall: 5,
418
- }, undefined, undefined, 'https://my-mcp-server.example.com/mcp');
419
-
420
584
  const { port, adminKey } = await server.start();
585
+
586
+ // Multi-server mode
587
+ const multiServer = new PayGateServer(
588
+ { serverCommand: '', port: 3402, defaultCreditsPerCall: 1 },
589
+ undefined, undefined, undefined, undefined,
590
+ [
591
+ { prefix: 'fs', serverCommand: 'npx', serverArgs: ['@modelcontextprotocol/server-filesystem', '/tmp'] },
592
+ { prefix: 'api', remoteUrl: 'https://my-mcp-server.example.com/mcp' },
593
+ ]
594
+ );
595
+
596
+ // Client SDK
597
+ import { PayGateClient } from 'paygate-mcp/client';
598
+
599
+ const client = new PayGateClient({
600
+ url: `http://localhost:${port}`,
601
+ apiKey: 'pg_...',
602
+ });
603
+
604
+ const tools = await client.listTools();
605
+ const result = await client.callTool('search', { query: 'hello' });
421
606
  ```
422
607
 
423
608
  ## Security
@@ -436,6 +621,9 @@ const { port, adminKey } = await server.start();
436
621
  - Spending limits enforced with integer arithmetic (no float bypass)
437
622
  - Per-tool ACL enforcement (whitelist + blacklist, sanitized inputs)
438
623
  - Key expiry with fail-closed behavior (expired = denied)
624
+ - OAuth 2.1 with PKCE (S256) — no implicit grant, no plain challenge
625
+ - OAuth tokens are opaque hex strings (no JWT data leakage)
626
+ - Quota counters reset atomically at UTC boundaries
439
627
  - Red-teamed with 101 adversarial security tests across 14 passes
440
628
 
441
629
  ## Current Limitations
@@ -458,9 +646,11 @@ const { port, adminKey } = await server.start();
458
646
  - [x] Per-tool ACL — whitelist/blacklist tools per key
459
647
  - [x] Per-tool rate limits — independent limits per tool
460
648
  - [x] Key expiry (TTL) — auto-expire API keys
461
- - [ ] Multi-server mode — wrap N MCP servers behind one PayGate
462
- - [ ] Client SDK — `@paygate-mcp/client` with auto 402 retry
463
- - [ ] OAuth 2.1MCP spec mandates it for production
649
+ - [x] Multi-server mode — wrap N MCP servers behind one PayGate
650
+ - [x] Client SDK — `PayGateClient` with auto 402 retry
651
+ - [x] Usage quotasdaily/monthly call and credit limits per key
652
+ - [x] Dynamic pricing — charge by input size (`creditsPerKbInput`)
653
+ - [x] OAuth 2.1 — PKCE, client registration, Bearer tokens, token refresh/revocation
464
654
 
465
655
  ## Requirements
466
656
 
package/dist/cli.js CHANGED
@@ -76,6 +76,14 @@ function printUsage() {
76
76
  # Gate a remote MCP server (Streamable HTTP transport)
77
77
  paygate-mcp wrap --remote-url "https://my-server.example.com/mcp" --price 5
78
78
 
79
+ # Multi-server mode: wrap N servers behind one PayGate
80
+ paygate-mcp wrap --config multi-server.json
81
+ # Config file: { "servers": [
82
+ # { "prefix": "fs", "serverCommand": "npx", "serverArgs": ["@mcp/server-filesystem", "/tmp"] },
83
+ # { "prefix": "gh", "remoteUrl": "https://github-mcp.example.com/mcp" }
84
+ # ]}
85
+ # Tools become: "fs:read_file", "gh:search_repos", etc.
86
+
79
87
  # Custom pricing and rate limit
80
88
  paygate-mcp wrap --server "python my-server.py" --price 2 --rate-limit 30
81
89
 
@@ -114,13 +122,20 @@ async function main() {
114
122
  process.exit(1);
115
123
  }
116
124
  }
125
+ // Multi-server mode check
126
+ const multiServers = fileConfig.servers;
127
+ const isMultiServer = multiServers && multiServers.length > 0;
117
128
  const serverCmd = flags['server'] || (fileConfig.serverCommand ? [fileConfig.serverCommand, ...(fileConfig.serverArgs || [])].join(' ') : '');
118
129
  const remoteUrl = flags['remote-url'] || fileConfig.remoteUrl;
119
- if (!serverCmd && !remoteUrl) {
120
- console.error('Error: --server, --remote-url, or --config is required.\n');
130
+ if (!serverCmd && !remoteUrl && !isMultiServer) {
131
+ console.error('Error: --server, --remote-url, or --config (with servers[]) is required.\n');
121
132
  printUsage();
122
133
  process.exit(1);
123
134
  }
135
+ if (isMultiServer && (serverCmd || remoteUrl)) {
136
+ console.error('Error: use "servers" array OR --server/--remote-url, not both.\n');
137
+ process.exit(1);
138
+ }
124
139
  if (serverCmd && remoteUrl) {
125
140
  console.error('Error: use --server OR --remote-url, not both.\n');
126
141
  process.exit(1);
@@ -144,6 +159,13 @@ async function main() {
144
159
  const stripeSecret = flags['stripe-secret'] || fileConfig.stripeWebhookSecret;
145
160
  const webhookUrl = flags['webhook-url'] || fileConfig.webhookUrl || null;
146
161
  const refundOnFailure = flags['refund-on-failure'] === 'true' || 'refund-on-failure' in flags || fileConfig.refundOnFailure || false;
162
+ // Parse global quota from config file
163
+ const globalQuota = fileConfig.globalQuota ? {
164
+ dailyCallLimit: Math.max(0, Math.floor(Number(fileConfig.globalQuota.dailyCallLimit) || 0)),
165
+ monthlyCallLimit: Math.max(0, Math.floor(Number(fileConfig.globalQuota.monthlyCallLimit) || 0)),
166
+ dailyCreditLimit: Math.max(0, Math.floor(Number(fileConfig.globalQuota.dailyCreditLimit) || 0)),
167
+ monthlyCreditLimit: Math.max(0, Math.floor(Number(fileConfig.globalQuota.monthlyCreditLimit) || 0)),
168
+ } : undefined;
147
169
  const server = new server_1.PayGateServer({
148
170
  serverCommand,
149
171
  serverArgs,
@@ -155,7 +177,9 @@ async function main() {
155
177
  toolPricing,
156
178
  webhookUrl,
157
179
  refundOnFailure: !!refundOnFailure,
158
- }, adminKey, stateFile, remoteUrl, stripeSecret);
180
+ globalQuota,
181
+ oauth: fileConfig.oauth,
182
+ }, adminKey, stateFile, remoteUrl, stripeSecret, multiServers);
159
183
  // Import keys from CLI flags
160
184
  if (flags['import-key']) {
161
185
  const pairs = flags['import-key'].split(',');
@@ -182,6 +206,18 @@ async function main() {
182
206
  process.on('SIGTERM', shutdown);
183
207
  try {
184
208
  const result = await server.start();
209
+ // Build backend display string
210
+ let backendDisplay;
211
+ if (isMultiServer) {
212
+ const prefixes = multiServers.map(s => s.prefix).join(', ');
213
+ backendDisplay = `multi (${multiServers.length}) → ${prefixes}`.slice(0, 35);
214
+ }
215
+ else if (remoteUrl) {
216
+ backendDisplay = ('HTTP → ' + remoteUrl.slice(0, 28));
217
+ }
218
+ else {
219
+ backendDisplay = ('stdio → ' + (serverCmd || serverCommand).slice(0, 27));
220
+ }
185
221
  console.log(`
186
222
  ╔══════════════════════════════════════════════════╗
187
223
  ║ PayGate MCP — Server Running ║
@@ -189,7 +225,7 @@ async function main() {
189
225
  ║ ║
190
226
  ║ Endpoint: http://localhost:${String(result.port).padEnd(5)} ║
191
227
  ║ Admin Key: ${result.adminKey.slice(0, 20)}... ║
192
- ║ Backend: ${(remoteUrl ? 'HTTP → ' + remoteUrl.slice(0, 28) : 'stdio → ' + (serverCmd || serverCommand).slice(0, 27)).padEnd(35)}║
228
+ ║ Backend: ${backendDisplay.padEnd(35)}║
193
229
  ║ ║
194
230
  ║ Pricing: ${String(price).padEnd(3)} credit(s) per tool call ║
195
231
  ║ Rate Limit: ${String(rateLimit).padEnd(3)} calls/min per key ║
@@ -208,6 +244,15 @@ async function main() {
208
244
  ║ POST /limits — Set spending limit (Admin) ║
209
245
  ╚══════════════════════════════════════════════════╝
210
246
  `);
247
+ // Show multi-server details
248
+ if (isMultiServer) {
249
+ console.log(' Multi-server backends:');
250
+ for (const s of multiServers) {
251
+ const transport = s.remoteUrl ? `HTTP → ${s.remoteUrl}` : `stdio → ${s.serverCommand} ${(s.serverArgs || []).join(' ')}`;
252
+ console.log(` ${s.prefix}: ${transport}`);
253
+ }
254
+ console.log('');
255
+ }
211
256
  console.log(` Admin key (save this): ${result.adminKey}\n`);
212
257
  }
213
258
  catch (error) {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * PayGateClient — Client SDK for consuming PayGate-protected MCP servers.
3
+ *
4
+ * Features:
5
+ * - Auto 402 retry: when a tool call returns -32402 (payment required),
6
+ * the client can automatically call a top-up function and retry.
7
+ * - Balance tracking: monitors remaining credits locally.
8
+ * - Connection management: handles MCP Streamable HTTP transport.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { PayGateClient } from 'paygate-mcp/client';
13
+ *
14
+ * const client = new PayGateClient({
15
+ * url: 'http://localhost:3402',
16
+ * apiKey: 'pg_abc123...',
17
+ * });
18
+ *
19
+ * const tools = await client.listTools();
20
+ * const result = await client.callTool('search', { query: 'hello' });
21
+ * const balance = await client.getBalance();
22
+ * ```
23
+ */
24
+ export interface PayGateClientConfig {
25
+ /** PayGate server URL (e.g., "http://localhost:3402") */
26
+ url: string;
27
+ /** API key for authentication */
28
+ apiKey: string;
29
+ /** Request timeout in ms (default: 30000) */
30
+ timeout?: number;
31
+ /** Auto-retry on 402 (payment required). Calls onCreditsNeeded before retry.
32
+ * Default: false. */
33
+ autoRetry?: boolean;
34
+ /** Called when credits are needed (402 response). Return true if credits
35
+ * were added (e.g., via external top-up), false to abort. */
36
+ onCreditsNeeded?: (info: CreditsNeededInfo) => Promise<boolean>;
37
+ /** Max auto-retries per request (default: 1) */
38
+ maxRetries?: number;
39
+ }
40
+ export interface CreditsNeededInfo {
41
+ tool: string;
42
+ creditsRequired: number;
43
+ remainingCredits: number;
44
+ }
45
+ export interface ToolInfo {
46
+ name: string;
47
+ description?: string;
48
+ inputSchema?: Record<string, unknown>;
49
+ }
50
+ export interface ToolCallResult {
51
+ content: Array<{
52
+ type: string;
53
+ text?: string;
54
+ [k: string]: unknown;
55
+ }>;
56
+ isError?: boolean;
57
+ }
58
+ export interface BalanceInfo {
59
+ name: string;
60
+ credits: number;
61
+ totalSpent: number;
62
+ totalCalls: number;
63
+ spendingLimit: number;
64
+ remainingBudget: number | null;
65
+ lastUsedAt: string | null;
66
+ allowedTools: string[];
67
+ deniedTools: string[];
68
+ expiresAt: string | null;
69
+ }
70
+ export declare class PayGateClient {
71
+ private readonly baseUrl;
72
+ private readonly apiKey;
73
+ private readonly timeout;
74
+ private readonly autoRetry;
75
+ private readonly maxRetries;
76
+ private readonly onCreditsNeeded?;
77
+ private nextId;
78
+ private _lastBalance;
79
+ constructor(config: PayGateClientConfig);
80
+ /**
81
+ * List available tools from the gated MCP server.
82
+ */
83
+ listTools(): Promise<ToolInfo[]>;
84
+ /**
85
+ * Call a tool on the gated MCP server.
86
+ * If autoRetry is enabled and the server returns -32402 (payment required),
87
+ * the client will call onCreditsNeeded and retry.
88
+ */
89
+ callTool(name: string, args?: Record<string, unknown>): Promise<ToolCallResult>;
90
+ /**
91
+ * Get balance information for the current API key.
92
+ */
93
+ getBalance(): Promise<BalanceInfo>;
94
+ /**
95
+ * Send an initialize request to the MCP server.
96
+ */
97
+ initialize(): Promise<Record<string, unknown>>;
98
+ /**
99
+ * Ping the server.
100
+ */
101
+ ping(): Promise<boolean>;
102
+ /**
103
+ * Get the last known balance (from the last getBalance() call).
104
+ * Returns null if getBalance() hasn't been called yet.
105
+ */
106
+ get lastKnownBalance(): number | null;
107
+ private rpcCall;
108
+ private httpPost;
109
+ private httpGet;
110
+ }
111
+ export declare class PayGateError extends Error {
112
+ readonly code: number;
113
+ readonly data?: unknown;
114
+ constructor(code: number, message: string, data?: unknown);
115
+ get isPaymentRequired(): boolean;
116
+ get isRateLimited(): boolean;
117
+ get isExpired(): boolean;
118
+ }
119
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}