paygate-mcp 0.7.0 → 0.9.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 +189 -16
- package/dist/cli.js +40 -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 +18 -2
- package/dist/gate.d.ts.map +1 -1
- package/dist/gate.js +80 -8
- 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 +23 -2
- package/dist/http-proxy.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/proxy.d.ts +5 -0
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +23 -2
- package/dist/proxy.js.map +1 -1
- package/dist/rate-limiter.d.ts +9 -0
- package/dist/rate-limiter.d.ts.map +1 -1
- package/dist/rate-limiter.js +36 -0
- package/dist/rate-limiter.js.map +1 -1
- 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 +11 -3
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +128 -6
- package/dist/server.js.map +1 -1
- package/dist/store.d.ts +33 -4
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +88 -6
- package/dist/store.js.map +1 -1
- package/dist/types.d.ts +17 -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
|
@@ -28,9 +28,14 @@ Agent → PayGate (auth + billing) → Your MCP Server (stdio or HTTP)
|
|
|
28
28
|
|
|
29
29
|
- **API Key Auth** — Clients need a valid `X-API-Key` to call tools
|
|
30
30
|
- **Credit Billing** — Each tool call costs credits (configurable per-tool)
|
|
31
|
-
- **Rate Limiting** — Sliding window per-key rate limits
|
|
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
|
|
36
|
+
- **Per-Tool ACL** — Whitelist/blacklist tools per API key (enterprise access control)
|
|
37
|
+
- **Per-Tool Rate Limits** — Independent rate limits per tool, not just global
|
|
38
|
+
- **Key Expiry (TTL)** — Auto-expire API keys after a set time
|
|
34
39
|
- **Spending Limits** — Cap total spend per API key to prevent runaway costs
|
|
35
40
|
- **Refund on Failure** — Automatically refund credits when downstream tool calls fail
|
|
36
41
|
- **Webhook Events** — POST batched usage events to any URL for external billing/alerting
|
|
@@ -85,6 +90,75 @@ The proxy handles:
|
|
|
85
90
|
|
|
86
91
|
When started, you'll see your admin key in the console. Save it.
|
|
87
92
|
|
|
93
|
+
### Multi-Server Mode
|
|
94
|
+
|
|
95
|
+
Wrap multiple MCP servers behind a single PayGate instance. Tools are prefixed with the server name:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
npx paygate-mcp wrap --config multi-server.json
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Example `multi-server.json`:
|
|
102
|
+
```json
|
|
103
|
+
{
|
|
104
|
+
"port": 3402,
|
|
105
|
+
"defaultCreditsPerCall": 1,
|
|
106
|
+
"servers": [
|
|
107
|
+
{
|
|
108
|
+
"prefix": "fs",
|
|
109
|
+
"serverCommand": "npx",
|
|
110
|
+
"serverArgs": ["@modelcontextprotocol/server-filesystem", "/tmp"]
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"prefix": "github",
|
|
114
|
+
"remoteUrl": "https://github-mcp.example.com/mcp"
|
|
115
|
+
}
|
|
116
|
+
]
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Tools are exposed with prefixes: `fs:read_file`, `fs:write_file`, `github:search_repos`, etc. Pricing and ACLs work on the prefixed names:
|
|
121
|
+
|
|
122
|
+
```json
|
|
123
|
+
{
|
|
124
|
+
"toolPricing": {
|
|
125
|
+
"github:search_repos": { "creditsPerCall": 5 },
|
|
126
|
+
"fs:read_file": { "creditsPerCall": 1 }
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Credits are shared across all backends — one API key works for all servers.
|
|
132
|
+
|
|
133
|
+
### Client SDK
|
|
134
|
+
|
|
135
|
+
Use `PayGateClient` to call tools from TypeScript/Node.js with auto 402 retry:
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
import { PayGateClient, PayGateError } from 'paygate-mcp/client';
|
|
139
|
+
|
|
140
|
+
const client = new PayGateClient({
|
|
141
|
+
url: 'http://localhost:3402',
|
|
142
|
+
apiKey: 'pg_abc123...',
|
|
143
|
+
autoRetry: true,
|
|
144
|
+
onCreditsNeeded: async (info) => {
|
|
145
|
+
// Called when credits run out — add credits and return true to retry
|
|
146
|
+
await topUpCredits(info.creditsRequired);
|
|
147
|
+
return true;
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
const tools = await client.listTools();
|
|
152
|
+
const result = await client.callTool('search', { query: 'hello' });
|
|
153
|
+
const balance = await client.getBalance();
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Features:
|
|
157
|
+
- **Auto 402 retry**: When a tool call returns payment-required, calls `onCreditsNeeded` and retries
|
|
158
|
+
- **Balance tracking**: `client.lastKnownBalance` tracks credits from `getBalance()` calls
|
|
159
|
+
- **Typed errors**: `PayGateError` with `.isPaymentRequired`, `.isRateLimited`, `.isExpired` helpers
|
|
160
|
+
- **Zero dependencies**: Uses Node.js built-in `http`/`https`
|
|
161
|
+
|
|
88
162
|
### Create API Keys
|
|
89
163
|
|
|
90
164
|
```bash
|
|
@@ -171,15 +245,17 @@ A real-time admin UI for managing keys, viewing usage, and monitoring tool calls
|
|
|
171
245
|
| Endpoint | Method | Auth | Description |
|
|
172
246
|
|----------|--------|------|-------------|
|
|
173
247
|
| `/mcp` | POST | `X-API-Key` | JSON-RPC 2.0 proxy to wrapped MCP server |
|
|
174
|
-
| `/balance` | GET | `X-API-Key` | Client self-service — check own credits |
|
|
175
|
-
| `/keys` | POST | `X-Admin-Key` | Create
|
|
176
|
-
| `/keys` | GET | `X-Admin-Key` | List all keys (masked) |
|
|
248
|
+
| `/balance` | GET | `X-API-Key` | Client self-service — check own credits, ACL, expiry |
|
|
249
|
+
| `/keys` | POST | `X-Admin-Key` | Create API key (with ACL, expiry, credits) |
|
|
250
|
+
| `/keys` | GET | `X-Admin-Key` | List all keys (masked, with expiry status) |
|
|
177
251
|
| `/topup` | POST | `X-Admin-Key` | Add credits to an existing key |
|
|
178
252
|
| `/keys/revoke` | POST | `X-Admin-Key` | Revoke an API key |
|
|
253
|
+
| `/keys/acl` | POST | `X-Admin-Key` | Set tool ACL (whitelist/blacklist) on a key |
|
|
254
|
+
| `/keys/expiry` | POST | `X-Admin-Key` | Set or remove key expiry (TTL) |
|
|
255
|
+
| `/limits` | POST | `X-Admin-Key` | Set spending limit on a key |
|
|
179
256
|
| `/usage` | GET | `X-Admin-Key` | Export usage data (JSON or CSV) |
|
|
180
257
|
| `/status` | GET | `X-Admin-Key` | Full dashboard with usage stats |
|
|
181
258
|
| `/dashboard` | GET | None (admin key in-browser) | Real-time admin web dashboard |
|
|
182
|
-
| `/limits` | POST | `X-Admin-Key` | Set spending limit on a key |
|
|
183
259
|
| `/stripe/webhook` | POST | Stripe Signature | Auto-top-up credits on payment |
|
|
184
260
|
| `/` | GET | None | Health check |
|
|
185
261
|
|
|
@@ -208,7 +284,7 @@ These MCP methods pass through without auth or billing:
|
|
|
208
284
|
--config <path> Load settings from a JSON config file
|
|
209
285
|
```
|
|
210
286
|
|
|
211
|
-
> **Note:** Use `--server` OR `--remote-url
|
|
287
|
+
> **Note:** Use `--server` OR `--remote-url` for single-server mode. Use `servers` in a config file for multi-server mode.
|
|
212
288
|
|
|
213
289
|
### Persistent Storage
|
|
214
290
|
|
|
@@ -245,6 +321,82 @@ When a customer completes payment, credits are automatically added to their API
|
|
|
245
321
|
- Payment status verification (only `paid` triggers credits)
|
|
246
322
|
- Zero dependencies — uses Node.js built-in `crypto`
|
|
247
323
|
|
|
324
|
+
### Per-Tool ACL (Access Control)
|
|
325
|
+
|
|
326
|
+
Control which tools each API key can access:
|
|
327
|
+
|
|
328
|
+
```bash
|
|
329
|
+
# Create a key that can only access search and read tools
|
|
330
|
+
curl -X POST http://localhost:3402/keys \
|
|
331
|
+
-H "Content-Type: application/json" \
|
|
332
|
+
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
|
|
333
|
+
-d '{"name": "limited-client", "credits": 100, "allowedTools": ["search", "read_file"]}'
|
|
334
|
+
|
|
335
|
+
# Create a key with specific tools blocked
|
|
336
|
+
curl -X POST http://localhost:3402/keys \
|
|
337
|
+
-H "Content-Type: application/json" \
|
|
338
|
+
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
|
|
339
|
+
-d '{"name": "safe-client", "credits": 100, "deniedTools": ["delete_file", "admin_reset"]}'
|
|
340
|
+
|
|
341
|
+
# Update ACL on an existing key
|
|
342
|
+
curl -X POST http://localhost:3402/keys/acl \
|
|
343
|
+
-H "Content-Type: application/json" \
|
|
344
|
+
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
|
|
345
|
+
-d '{"key": "CLIENT_API_KEY", "allowedTools": ["search"], "deniedTools": ["admin"]}'
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
- **allowedTools** (whitelist): Only these tools are accessible. Empty = all tools.
|
|
349
|
+
- **deniedTools** (blacklist): These tools are always denied. Applied after allowedTools.
|
|
350
|
+
- ACL also filters `tools/list` — clients only see their permitted tools.
|
|
351
|
+
|
|
352
|
+
### Per-Tool Rate Limits
|
|
353
|
+
|
|
354
|
+
Set independent rate limits per tool (on top of the global limit):
|
|
355
|
+
|
|
356
|
+
```json
|
|
357
|
+
{
|
|
358
|
+
"toolPricing": {
|
|
359
|
+
"expensive_analyze": { "creditsPerCall": 10, "rateLimitPerMin": 5 },
|
|
360
|
+
"search": { "creditsPerCall": 1, "rateLimitPerMin": 30 },
|
|
361
|
+
"cheap_read": { "creditsPerCall": 1 }
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
Per-tool limits are enforced independently per API key. A key can be rate-limited on one tool while still accessing others. The global `--rate-limit` applies across all tools.
|
|
367
|
+
|
|
368
|
+
### Key Expiry (TTL)
|
|
369
|
+
|
|
370
|
+
Create API keys that auto-expire:
|
|
371
|
+
|
|
372
|
+
```bash
|
|
373
|
+
# Create a key that expires in 1 hour (3600 seconds)
|
|
374
|
+
curl -X POST http://localhost:3402/keys \
|
|
375
|
+
-H "Content-Type: application/json" \
|
|
376
|
+
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
|
|
377
|
+
-d '{"name": "trial-user", "credits": 50, "expiresIn": 3600}'
|
|
378
|
+
|
|
379
|
+
# Create a key with a specific expiry date
|
|
380
|
+
curl -X POST http://localhost:3402/keys \
|
|
381
|
+
-H "Content-Type: application/json" \
|
|
382
|
+
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
|
|
383
|
+
-d '{"name": "quarterly", "credits": 1000, "expiresAt": "2026-06-01T00:00:00Z"}'
|
|
384
|
+
|
|
385
|
+
# Set or extend expiry on an existing key
|
|
386
|
+
curl -X POST http://localhost:3402/keys/expiry \
|
|
387
|
+
-H "Content-Type: application/json" \
|
|
388
|
+
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
|
|
389
|
+
-d '{"key": "CLIENT_API_KEY", "expiresIn": 86400}'
|
|
390
|
+
|
|
391
|
+
# Remove expiry (key never expires)
|
|
392
|
+
curl -X POST http://localhost:3402/keys/expiry \
|
|
393
|
+
-H "Content-Type: application/json" \
|
|
394
|
+
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
|
|
395
|
+
-d '{"key": "CLIENT_API_KEY", "expiresAt": null}'
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
Expired keys return a clear `api_key_expired` error. Admins can extend or remove expiry at any time.
|
|
399
|
+
|
|
248
400
|
### Spending Limits
|
|
249
401
|
|
|
250
402
|
Cap the total credits any API key can spend:
|
|
@@ -316,7 +468,7 @@ CLI flags override config file values when both are specified.
|
|
|
316
468
|
## Programmatic API
|
|
317
469
|
|
|
318
470
|
```typescript
|
|
319
|
-
import { PayGateServer
|
|
471
|
+
import { PayGateServer } from 'paygate-mcp';
|
|
320
472
|
|
|
321
473
|
// Wrap a local server (stdio)
|
|
322
474
|
const server = new PayGateServer({
|
|
@@ -329,14 +481,28 @@ const server = new PayGateServer({
|
|
|
329
481
|
},
|
|
330
482
|
});
|
|
331
483
|
|
|
332
|
-
// Or gate a remote server (Streamable HTTP)
|
|
333
|
-
const remoteServer = new PayGateServer({
|
|
334
|
-
serverCommand: '',
|
|
335
|
-
port: 3402,
|
|
336
|
-
defaultCreditsPerCall: 5,
|
|
337
|
-
}, undefined, undefined, 'https://my-mcp-server.example.com/mcp');
|
|
338
|
-
|
|
339
484
|
const { port, adminKey } = await server.start();
|
|
485
|
+
|
|
486
|
+
// Multi-server mode
|
|
487
|
+
const multiServer = new PayGateServer(
|
|
488
|
+
{ serverCommand: '', port: 3402, defaultCreditsPerCall: 1 },
|
|
489
|
+
undefined, undefined, undefined, undefined,
|
|
490
|
+
[
|
|
491
|
+
{ prefix: 'fs', serverCommand: 'npx', serverArgs: ['@modelcontextprotocol/server-filesystem', '/tmp'] },
|
|
492
|
+
{ prefix: 'api', remoteUrl: 'https://my-mcp-server.example.com/mcp' },
|
|
493
|
+
]
|
|
494
|
+
);
|
|
495
|
+
|
|
496
|
+
// Client SDK
|
|
497
|
+
import { PayGateClient } from 'paygate-mcp/client';
|
|
498
|
+
|
|
499
|
+
const client = new PayGateClient({
|
|
500
|
+
url: `http://localhost:${port}`,
|
|
501
|
+
apiKey: 'pg_...',
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
const tools = await client.listTools();
|
|
505
|
+
const result = await client.callTool('search', { query: 'hello' });
|
|
340
506
|
```
|
|
341
507
|
|
|
342
508
|
## Security
|
|
@@ -353,7 +519,9 @@ const { port, adminKey } = await server.start();
|
|
|
353
519
|
- Dashboard uses safe DOM methods (textContent/createElement) — no innerHTML
|
|
354
520
|
- Webhook URLs masked in status output
|
|
355
521
|
- Spending limits enforced with integer arithmetic (no float bypass)
|
|
356
|
-
-
|
|
522
|
+
- Per-tool ACL enforcement (whitelist + blacklist, sanitized inputs)
|
|
523
|
+
- Key expiry with fail-closed behavior (expired = denied)
|
|
524
|
+
- Red-teamed with 101 adversarial security tests across 14 passes
|
|
357
525
|
|
|
358
526
|
## Current Limitations
|
|
359
527
|
|
|
@@ -372,7 +540,12 @@ const { port, adminKey } = await server.start();
|
|
|
372
540
|
- [x] Webhook events (`--webhook-url`)
|
|
373
541
|
- [x] Refund on failure (`--refund-on-failure`)
|
|
374
542
|
- [x] Config file mode (`--config`)
|
|
375
|
-
- [
|
|
543
|
+
- [x] Per-tool ACL — whitelist/blacklist tools per key
|
|
544
|
+
- [x] Per-tool rate limits — independent limits per tool
|
|
545
|
+
- [x] Key expiry (TTL) — auto-expire API keys
|
|
546
|
+
- [x] Multi-server mode — wrap N MCP servers behind one PayGate
|
|
547
|
+
- [x] Client SDK — `PayGateClient` with auto 402 retry
|
|
548
|
+
- [ ] OAuth 2.1 — MCP spec mandates it for production
|
|
376
549
|
|
|
377
550
|
## Requirements
|
|
378
551
|
|
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);
|
|
@@ -155,7 +170,7 @@ async function main() {
|
|
|
155
170
|
toolPricing,
|
|
156
171
|
webhookUrl,
|
|
157
172
|
refundOnFailure: !!refundOnFailure,
|
|
158
|
-
}, adminKey, stateFile, remoteUrl, stripeSecret);
|
|
173
|
+
}, adminKey, stateFile, remoteUrl, stripeSecret, multiServers);
|
|
159
174
|
// Import keys from CLI flags
|
|
160
175
|
if (flags['import-key']) {
|
|
161
176
|
const pairs = flags['import-key'].split(',');
|
|
@@ -182,6 +197,18 @@ async function main() {
|
|
|
182
197
|
process.on('SIGTERM', shutdown);
|
|
183
198
|
try {
|
|
184
199
|
const result = await server.start();
|
|
200
|
+
// Build backend display string
|
|
201
|
+
let backendDisplay;
|
|
202
|
+
if (isMultiServer) {
|
|
203
|
+
const prefixes = multiServers.map(s => s.prefix).join(', ');
|
|
204
|
+
backendDisplay = `multi (${multiServers.length}) → ${prefixes}`.slice(0, 35);
|
|
205
|
+
}
|
|
206
|
+
else if (remoteUrl) {
|
|
207
|
+
backendDisplay = ('HTTP → ' + remoteUrl.slice(0, 28));
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
backendDisplay = ('stdio → ' + (serverCmd || serverCommand).slice(0, 27));
|
|
211
|
+
}
|
|
185
212
|
console.log(`
|
|
186
213
|
╔══════════════════════════════════════════════════╗
|
|
187
214
|
║ PayGate MCP — Server Running ║
|
|
@@ -189,7 +216,7 @@ async function main() {
|
|
|
189
216
|
║ ║
|
|
190
217
|
║ Endpoint: http://localhost:${String(result.port).padEnd(5)} ║
|
|
191
218
|
║ Admin Key: ${result.adminKey.slice(0, 20)}... ║
|
|
192
|
-
║ Backend: ${
|
|
219
|
+
║ Backend: ${backendDisplay.padEnd(35)}║
|
|
193
220
|
║ ║
|
|
194
221
|
║ Pricing: ${String(price).padEnd(3)} credit(s) per tool call ║
|
|
195
222
|
║ Rate Limit: ${String(rateLimit).padEnd(3)} calls/min per key ║
|
|
@@ -208,6 +235,15 @@ async function main() {
|
|
|
208
235
|
║ POST /limits — Set spending limit (Admin) ║
|
|
209
236
|
╚══════════════════════════════════════════════════╝
|
|
210
237
|
`);
|
|
238
|
+
// Show multi-server details
|
|
239
|
+
if (isMultiServer) {
|
|
240
|
+
console.log(' Multi-server backends:');
|
|
241
|
+
for (const s of multiServers) {
|
|
242
|
+
const transport = s.remoteUrl ? `HTTP → ${s.remoteUrl}` : `stdio → ${s.serverCommand} ${(s.serverArgs || []).join(' ')}`;
|
|
243
|
+
console.log(` ${s.prefix}: ${transport}`);
|
|
244
|
+
}
|
|
245
|
+
console.log('');
|
|
246
|
+
}
|
|
211
247
|
console.log(` Admin key (save this): ${result.adminKey}\n`);
|
|
212
248
|
}
|
|
213
249
|
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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"}
|