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.
- package/README.md +206 -16
- package/dist/cli.js +49 -4
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +119 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +262 -0
- package/dist/client.js.map +1 -0
- package/dist/gate.d.ts +4 -1
- package/dist/gate.d.ts.map +1 -1
- package/dist/gate.js +30 -6
- package/dist/gate.js.map +1 -1
- package/dist/http-proxy.d.ts +5 -0
- package/dist/http-proxy.d.ts.map +1 -1
- package/dist/http-proxy.js +10 -0
- package/dist/http-proxy.js.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/oauth.d.ts +177 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +380 -0
- package/dist/oauth.js.map +1 -0
- package/dist/proxy.d.ts +5 -0
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +10 -0
- package/dist/proxy.js.map +1 -1
- package/dist/quota.d.ts +37 -0
- package/dist/quota.d.ts.map +1 -0
- package/dist/quota.js +107 -0
- package/dist/quota.js.map +1 -0
- package/dist/router.d.ts +57 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +233 -0
- package/dist/router.js.map +1 -0
- package/dist/server.d.ts +25 -3
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +421 -7
- package/dist/server.js.map +1 -1
- package/dist/store.d.ts +7 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +42 -0
- package/dist/store.js.map +1 -1
- package/dist/types.d.ts +50 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- 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
|
|
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
|
|
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
|
|
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
|
-
- [
|
|
462
|
-
- [
|
|
463
|
-
- [
|
|
649
|
+
- [x] Multi-server mode — wrap N MCP servers behind one PayGate
|
|
650
|
+
- [x] Client SDK — `PayGateClient` with auto 402 retry
|
|
651
|
+
- [x] Usage quotas — daily/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
|
-
|
|
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: ${
|
|
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":";;AACA;;;;;;;GAOG;;AAEH,qCAAyC;AAEzC,2BAAkC;AAClC,+BAA4B;AAE5B,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACrF,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,OAAO,CAAC;IAAC,CAAC;AAC7B,CAAC,CAAC,EAAE,CAAC;AAEL,gFAAgF;AAEhF,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAClC,MAAM,KAAK,GAA2B,EAAE,CAAC;IAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBAClB,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,CAAC,GAAG,CAAC
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -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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"}
|