paygate-mcp 0.1.3 → 0.6.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 walker77
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,12 +1,19 @@
1
1
  # paygate-mcp
2
2
 
3
- Monetize any MCP server with one command. Add API key auth, per-tool pricing, rate limiting, and usage metering to any Model Context Protocol server.
3
+ [![CI](https://github.com/walker77/paygate-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/walker77/paygate-mcp/actions/workflows/ci.yml)
4
+ [![npm version](https://img.shields.io/npm/v/paygate-mcp.svg)](https://www.npmjs.com/package/paygate-mcp)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+
7
+ Monetize any MCP server with one command. Add API key auth, per-tool pricing, rate limiting, and usage metering to any Model Context Protocol server. Zero dependencies. Zero config. Zero code changes.
4
8
 
5
9
  ## Quick Start
6
10
 
7
11
  ```bash
8
- # Wrap any MCP server with pay-per-call billing
12
+ # Wrap a local MCP server (stdio transport)
9
13
  npx paygate-mcp wrap --server "npx @modelcontextprotocol/server-filesystem /tmp"
14
+
15
+ # Gate a remote MCP server (Streamable HTTP transport)
16
+ npx paygate-mcp wrap --remote-url "https://my-server.example.com/mcp" --price 5
10
17
  ```
11
18
 
12
19
  That's it. Your MCP server is now gated behind API keys with credit-based billing.
@@ -16,19 +23,21 @@ That's it. Your MCP server is now gated behind API keys with credit-based billin
16
23
  PayGate sits between AI agents and your MCP server:
17
24
 
18
25
  ```
19
- Agent → PayGate (auth + billing) → Your MCP Server
26
+ Agent → PayGate (auth + billing) → Your MCP Server (stdio or HTTP)
20
27
  ```
21
28
 
22
29
  - **API Key Auth** — Clients need a valid `X-API-Key` to call tools
23
30
  - **Credit Billing** — Each tool call costs credits (configurable per-tool)
24
31
  - **Rate Limiting** — Sliding window per-key rate limits
25
32
  - **Usage Metering** — Track who called what, when, and how much they spent
33
+ - **Two Transports** — Wrap local servers via stdio or remote servers via Streamable HTTP
26
34
  - **Shadow Mode** — Log everything without enforcing payment (for testing)
27
- - **Zero Config** — Works with any MCP server that uses stdio transport
35
+ - **Persistent Storage** — Keys and credits survive restarts with `--state-file`
36
+ - **Zero Dependencies** — No external npm packages. Uses only Node.js built-ins.
28
37
 
29
38
  ## Usage
30
39
 
31
- ### Start a Gated Server
40
+ ### Wrap a Local MCP Server (stdio)
32
41
 
33
42
  ```bash
34
43
  # Default: 1 credit per call, 60 calls/min, port 3402
@@ -50,6 +59,26 @@ npx paygate-mcp wrap \
50
59
  npx paygate-mcp wrap --server "node server.js" --shadow
51
60
  ```
52
61
 
62
+ ### Gate a Remote MCP Server (Streamable HTTP)
63
+
64
+ Gate any remote MCP server that supports the [Streamable HTTP transport](https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#streamable-http) (MCP spec 2025-03-26):
65
+
66
+ ```bash
67
+ npx paygate-mcp wrap --remote-url "https://my-mcp-server.example.com/mcp"
68
+
69
+ # With custom pricing
70
+ npx paygate-mcp wrap \
71
+ --remote-url "https://api.example.com/mcp" \
72
+ --price 5 \
73
+ --tool-price "gpt4:20,search:2"
74
+ ```
75
+
76
+ The proxy handles:
77
+ - JSON-RPC forwarding via HTTP POST
78
+ - SSE (text/event-stream) response parsing
79
+ - `Mcp-Session-Id` session management
80
+ - Graceful session cleanup (HTTP DELETE on shutdown)
81
+
53
82
  When started, you'll see your admin key in the console. Save it.
54
83
 
55
84
  ### Create API Keys
@@ -87,6 +116,54 @@ curl -X POST http://localhost:3402/topup \
87
116
  -d '{"key": "CLIENT_API_KEY", "credits": 500}'
88
117
  ```
89
118
 
119
+ ### Check Balance (Client Self-Service)
120
+
121
+ ```bash
122
+ curl http://localhost:3402/balance \
123
+ -H "X-API-Key: CLIENT_API_KEY"
124
+ ```
125
+
126
+ Returns credits, total spent, call count, and last used timestamp. If spending limits are set, also returns current daily/monthly spend and limits. Clients can check their own balance without needing admin access.
127
+
128
+ ### Set Spending Limits (Admin)
129
+
130
+ ```bash
131
+ # Set daily and monthly credit caps for a key
132
+ curl -X POST http://localhost:3402/keys/limits \
133
+ -H "Content-Type: application/json" \
134
+ -H "X-Admin-Key: YOUR_ADMIN_KEY" \
135
+ -d '{"key": "CLIENT_API_KEY", "dailyLimit": 50, "monthlyLimit": 500}'
136
+ ```
137
+
138
+ Prevents runaway AI agents from draining credits. When a key's daily or monthly spend reaches its cap, further tool calls are denied until the next day/month (UTC). Set to 0 for unlimited.
139
+
140
+ You can also set limits when creating a key:
141
+
142
+ ```bash
143
+ curl -X POST http://localhost:3402/keys \
144
+ -H "Content-Type: application/json" \
145
+ -H "X-Admin-Key: YOUR_ADMIN_KEY" \
146
+ -d '{"name": "agent-key", "credits": 1000, "dailyLimit": 50, "monthlyLimit": 500}'
147
+ ```
148
+
149
+ ### Export Usage Data (Admin)
150
+
151
+ ```bash
152
+ # JSON export
153
+ curl http://localhost:3402/usage \
154
+ -H "X-Admin-Key: YOUR_ADMIN_KEY"
155
+
156
+ # CSV export (for spreadsheet/billing import)
157
+ curl "http://localhost:3402/usage?format=csv" \
158
+ -H "X-Admin-Key: YOUR_ADMIN_KEY"
159
+
160
+ # Filter by date
161
+ curl "http://localhost:3402/usage?since=2025-01-01T00:00:00Z" \
162
+ -H "X-Admin-Key: YOUR_ADMIN_KEY"
163
+ ```
164
+
165
+ Returns per-call usage events with tool name, credits charged, and timestamps. API keys are masked in output.
166
+
90
167
  ### Check Status
91
168
 
92
169
  ```bash
@@ -96,16 +173,31 @@ curl http://localhost:3402/status \
96
173
 
97
174
  Returns active keys, usage stats, per-tool breakdown, and deny reasons.
98
175
 
176
+ ### Admin Dashboard
177
+
178
+ Open the web dashboard in your browser:
179
+
180
+ ```
181
+ http://localhost:3402/dashboard
182
+ ```
183
+
184
+ A real-time admin UI for managing keys, viewing usage, and monitoring tool calls. Enter your admin key to authenticate. Features auto-refresh every 30s, top tools chart, activity feed, and key creation/management.
185
+
99
186
  ## API Reference
100
187
 
101
188
  | Endpoint | Method | Auth | Description |
102
189
  |----------|--------|------|-------------|
103
190
  | `/mcp` | POST | `X-API-Key` | JSON-RPC 2.0 proxy to wrapped MCP server |
191
+ | `/balance` | GET | `X-API-Key` | Client self-service — check own credits |
104
192
  | `/keys` | POST | `X-Admin-Key` | Create a new API key with credits |
105
193
  | `/keys` | GET | `X-Admin-Key` | List all keys (masked) |
106
194
  | `/topup` | POST | `X-Admin-Key` | Add credits to an existing key |
107
195
  | `/keys/revoke` | POST | `X-Admin-Key` | Revoke an API key |
196
+ | `/keys/limits` | POST | `X-Admin-Key` | Set daily/monthly spending limits |
197
+ | `/usage` | GET | `X-Admin-Key` | Export usage data (JSON or CSV) |
108
198
  | `/status` | GET | `X-Admin-Key` | Full dashboard with usage stats |
199
+ | `/dashboard` | GET | None (admin key in-browser) | Real-time admin web dashboard |
200
+ | `/stripe/webhook` | POST | Stripe Signature | Auto-top-up credits on payment |
109
201
  | `/` | GET | None | Health check |
110
202
 
111
203
  ### Free Methods
@@ -116,22 +208,65 @@ These MCP methods pass through without auth or billing:
116
208
  ## CLI Options
117
209
 
118
210
  ```
119
- --server <cmd> MCP server command to wrap (required)
120
- --port <n> HTTP port (default: 3402)
121
- --price <n> Default credits per tool call (default: 1)
122
- --rate-limit <n> Max calls/min per key (default: 60, 0=unlimited)
123
- --name <s> Server display name
124
- --shadow Shadow mode log without enforcing payment
125
- --admin-key <s> Set admin key (default: auto-generated)
126
- --tool-price <t:n> Per-tool price (e.g. "search:5,generate:10")
127
- --import-key <k:c> Import existing key with credits (e.g. "pg_abc:100")
211
+ --server <cmd> MCP server command to wrap via stdio
212
+ --remote-url <url> Remote MCP server URL (Streamable HTTP transport)
213
+ --port <n> HTTP port (default: 3402)
214
+ --price <n> Default credits per tool call (default: 1)
215
+ --rate-limit <n> Max calls/min per key (default: 60, 0=unlimited)
216
+ --name <s> Server display name
217
+ --shadow Shadow mode log without enforcing payment
218
+ --admin-key <s> Set admin key (default: auto-generated)
219
+ --tool-price <t:n> Per-tool price (e.g. "search:5,generate:10")
220
+ --import-key <k:c> Import existing key with credits (e.g. "pg_abc:100")
221
+ --state-file <path> Persist keys/credits to a JSON file (survives restarts)
222
+ --stripe-secret <s> Stripe webhook signing secret (enables /stripe/webhook)
223
+ --daily-limit <n> Default daily credit limit per key (0=unlimited)
224
+ --monthly-limit <n> Default monthly credit limit per key (0=unlimited)
128
225
  ```
129
226
 
227
+ > **Note:** Use `--server` OR `--remote-url`, not both.
228
+
229
+ ### Persistent Storage
230
+
231
+ Add `--state-file` to save API keys and credits to disk. Data survives server restarts.
232
+
233
+ ```bash
234
+ npx paygate-mcp wrap --server "your-mcp-server" --state-file ~/.paygate/state.json
235
+ ```
236
+
237
+ ### Stripe Integration
238
+
239
+ Connect Stripe to automatically top up credits when customers pay:
240
+
241
+ ```bash
242
+ npx paygate-mcp wrap \
243
+ --server "your-mcp-server" \
244
+ --state-file ~/.paygate/state.json \
245
+ --stripe-secret "whsec_your_stripe_webhook_secret"
246
+ ```
247
+
248
+ **Setup:**
249
+ 1. Create a Stripe Checkout Session with metadata:
250
+ - `paygate_api_key` — the customer's API key (e.g. `pg_abc123...`)
251
+ - `paygate_credits` — credits to add on payment (e.g. `500`)
252
+ 2. Point your Stripe webhook to `https://your-server/stripe/webhook`
253
+ 3. Subscribe to `checkout.session.completed` and `invoice.payment_succeeded` events
254
+
255
+ When a customer completes payment, credits are automatically added to their API key. Subscriptions auto-renew credits on each billing cycle.
256
+
257
+ **Security:**
258
+ - HMAC-SHA256 signature verification (Stripe's v1 scheme)
259
+ - Timing-safe comparison to prevent timing attacks
260
+ - 5-minute timestamp tolerance to prevent replay attacks
261
+ - Payment status verification (only `paid` triggers credits)
262
+ - Zero dependencies — uses Node.js built-in `crypto`
263
+
130
264
  ## Programmatic API
131
265
 
132
266
  ```typescript
133
- import { PayGateServer } from 'paygate-mcp';
267
+ import { PayGateServer, HttpMcpProxy } from 'paygate-mcp';
134
268
 
269
+ // Wrap a local server (stdio)
135
270
  const server = new PayGateServer({
136
271
  serverCommand: 'npx',
137
272
  serverArgs: ['@modelcontextprotocol/server-filesystem', '/tmp'],
@@ -142,6 +277,13 @@ const server = new PayGateServer({
142
277
  },
143
278
  });
144
279
 
280
+ // Or gate a remote server (Streamable HTTP)
281
+ const remoteServer = new PayGateServer({
282
+ serverCommand: '',
283
+ port: 3402,
284
+ defaultCreditsPerCall: 5,
285
+ }, undefined, undefined, 'https://my-mcp-server.example.com/mcp');
286
+
145
287
  const { port, adminKey } = await server.start();
146
288
  ```
147
289
 
@@ -153,21 +295,33 @@ const { port, adminKey } = await server.start();
153
295
  - 1MB request body limit
154
296
  - Input sanitization on all endpoints
155
297
  - Admin key never exposed in responses
298
+ - API keys never forwarded to remote servers (HTTP transport)
156
299
  - Rate limiting is per-key, concurrent-safe
300
+ - Stripe webhook signature verification (HMAC-SHA256, timing-safe)
301
+ - Per-key daily/monthly spending caps (budget protection)
302
+ - Dashboard uses safe DOM methods (textContent/createElement) — no innerHTML
303
+ - Red-teamed with 78 adversarial security tests across 9 passes
157
304
 
158
305
  ## Current Limitations
159
306
 
160
- - **In-memory storage** — All API keys, credits, and usage data live in memory. Restarting the server resets everything. This is fine for development and testing.
161
- - **Credits are not real money** — Credits are just integers. There is no payment processor integration yet.
162
307
  - **Single process** — No clustering or horizontal scaling.
163
- - **Stdio transport only** — The wrapped MCP server must use stdio (most do).
308
+ - **No response size limits for HTTP transport** — Large responses from remote servers are forwarded as-is.
309
+
310
+ ## Roadmap
164
311
 
165
- Persistent storage and Stripe integration are on the roadmap.
312
+ - [x] Persistent storage (`--state-file`)
313
+ - [x] Streamable HTTP transport (`--remote-url`)
314
+ - [x] Stripe webhook integration (`--stripe-secret`)
315
+ - [x] Client self-service balance check (`/balance`)
316
+ - [x] Usage data export — JSON and CSV (`/usage`)
317
+ - [x] Admin web dashboard (`/dashboard`)
318
+ - [x] Per-key spending limits — daily/monthly budget caps
319
+ - [ ] Multi-tenant mode
166
320
 
167
321
  ## Requirements
168
322
 
169
323
  - Node.js >= 18.0.0
170
- - Any MCP server that uses stdio transport
324
+ - Zero external dependencies
171
325
 
172
326
  ## License
173
327
 
package/dist/cli.js CHANGED
@@ -36,24 +36,34 @@ function printUsage() {
36
36
  paygate-mcp — Monetize any MCP server with one command.
37
37
 
38
38
  USAGE:
39
- paygate-mcp wrap --server <command> [options]
39
+ paygate-mcp wrap --server <command> [options] # stdio transport
40
+ paygate-mcp wrap --remote-url <url> [options] # Streamable HTTP transport
40
41
 
41
42
  OPTIONS:
42
- --server <cmd> MCP server command to wrap (required)
43
- e.g. "npx @modelcontextprotocol/server-filesystem /"
44
- --port <n> HTTP port (default: 3402)
45
- --price <n> Default credits per tool call (default: 1)
46
- --rate-limit <n> Max calls/min per key (default: 60, 0=unlimited)
47
- --name <s> Server display name (default: "PayGate MCP Server")
48
- --shadow Shadow mode log but don't enforce payment
49
- --admin-key <s> Set admin key (default: auto-generated)
50
- --tool-price <t:n> Per-tool price override (e.g. "search:5,generate:10")
51
- --import-key <k:c> Import an existing API key with credits (e.g. "pg_abc123:100")
43
+ --server <cmd> MCP server command to wrap via stdio (required unless --remote-url)
44
+ e.g. "npx @modelcontextprotocol/server-filesystem /"
45
+ --remote-url <url> Remote MCP server URL (Streamable HTTP transport)
46
+ e.g. "https://my-mcp-server.example.com/mcp"
47
+ --port <n> HTTP port (default: 3402)
48
+ --price <n> Default credits per tool call (default: 1)
49
+ --rate-limit <n> Max calls/min per key (default: 60, 0=unlimited)
50
+ --name <s> Server display name (default: "PayGate MCP Server")
51
+ --shadow Shadow mode log but don't enforce payment
52
+ --admin-key <s> Set admin key (default: auto-generated)
53
+ --tool-price <t:n> Per-tool price override (e.g. "search:5,generate:10")
54
+ --import-key <k:c> Import an existing API key with credits (e.g. "pg_abc123:100")
55
+ --state-file <path> Persist keys/credits to a JSON file (survives restarts)
56
+ --stripe-secret <s> Stripe webhook signing secret (enables /stripe/webhook endpoint)
57
+ --daily-limit <n> Default daily credit limit per key (0=unlimited)
58
+ --monthly-limit <n> Default monthly credit limit per key (0=unlimited)
52
59
 
53
60
  EXAMPLES:
54
- # Wrap a filesystem MCP server
61
+ # Wrap a local MCP server (stdio transport)
55
62
  paygate-mcp wrap --server "npx @modelcontextprotocol/server-filesystem /tmp"
56
63
 
64
+ # Gate a remote MCP server (Streamable HTTP transport)
65
+ paygate-mcp wrap --remote-url "https://my-server.example.com/mcp" --price 5
66
+
57
67
  # Custom pricing and rate limit
58
68
  paygate-mcp wrap --server "python my-server.py" --price 2 --rate-limit 30
59
69
 
@@ -81,15 +91,24 @@ async function main() {
81
91
  switch (command) {
82
92
  case 'wrap': {
83
93
  const serverCmd = flags['server'];
84
- if (!serverCmd) {
85
- console.error('Error: --server is required.\n');
94
+ const remoteUrl = flags['remote-url'];
95
+ if (!serverCmd && !remoteUrl) {
96
+ console.error('Error: --server or --remote-url is required.\n');
86
97
  printUsage();
87
98
  process.exit(1);
88
99
  }
89
- // Parse server command into command + args
90
- const parts = serverCmd.split(/\s+/);
91
- const serverCommand = parts[0];
92
- const serverArgs = parts.slice(1);
100
+ if (serverCmd && remoteUrl) {
101
+ console.error('Error: use --server OR --remote-url, not both.\n');
102
+ process.exit(1);
103
+ }
104
+ // Parse server command into command + args (stdio mode)
105
+ let serverCommand = '';
106
+ let serverArgs = [];
107
+ if (serverCmd) {
108
+ const parts = serverCmd.split(/\s+/);
109
+ serverCommand = parts[0];
110
+ serverArgs = parts.slice(1);
111
+ }
93
112
  const port = parseInt(flags['port'] || '3402', 10);
94
113
  const price = parseInt(flags['price'] || '1', 10);
95
114
  const rateLimit = parseInt(flags['rate-limit'] || '60', 10);
@@ -97,6 +116,8 @@ async function main() {
97
116
  const shadowMode = flags['shadow'] === 'true' || flags['shadow'] === undefined && 'shadow' in flags;
98
117
  const adminKey = flags['admin-key'];
99
118
  const toolPricing = flags['tool-price'] ? parseToolPricing(flags['tool-price']) : {};
119
+ const stateFile = flags['state-file'];
120
+ const stripeSecret = flags['stripe-secret'];
100
121
  const server = new server_1.PayGateServer({
101
122
  serverCommand,
102
123
  serverArgs,
@@ -106,7 +127,7 @@ async function main() {
106
127
  name,
107
128
  shadowMode: !!shadowMode,
108
129
  toolPricing,
109
- }, adminKey);
130
+ }, adminKey, stateFile, remoteUrl, stripeSecret);
110
131
  // Import keys if specified
111
132
  if (flags['import-key']) {
112
133
  const pairs = flags['import-key'].split(',');
@@ -134,17 +155,20 @@ async function main() {
134
155
  ║ ║
135
156
  ║ Endpoint: http://localhost:${String(result.port).padEnd(5)} ║
136
157
  ║ Admin Key: ${result.adminKey.slice(0, 20)}... ║
137
- Wrapping: ${serverCmd.slice(0, 35).padEnd(35)}║
158
+ Backend: ${(remoteUrl ? 'HTTP → ' + remoteUrl.slice(0, 28) : 'stdio → ' + (serverCmd || '').slice(0, 27)).padEnd(35)}║
138
159
  ║ ║
139
160
  ║ Pricing: ${String(price).padEnd(3)} credit(s) per tool call ║
140
161
  ║ Rate Limit: ${String(rateLimit).padEnd(3)} calls/min per key ║
141
162
  ║ Shadow: ${String(!!shadowMode).padEnd(5)} ║
163
+ ║ Persist: ${(stateFile ? stateFile.slice(0, 33) : 'off (in-memory)').padEnd(35)}║
164
+ ║ Stripe: ${(stripeSecret ? 'enabled (/stripe/webhook)' : 'off').padEnd(35)}║
142
165
  ║ ║
143
166
  ╠══════════════════════════════════════════════════╣
144
- ║ POST /mcp — JSON-RPC (X-API-Key header)
145
- ║ GET /status Dashboard (X-Admin-Key header)
146
- POST /keys Create key (X-Admin-Key header)
147
- ║ POST /topup Add credits (X-Admin-Key header)║
167
+ ║ POST /mcp — JSON-RPC (X-API-Key header)
168
+ ║ GET /dashboard Admin web UI (open in browser)║
169
+ GET /balance Client balance (X-API-Key)
170
+ ║ POST /keys Create key (X-Admin-Key)
171
+ ║ POST /topup — Add credits (X-Admin-Key) ║
148
172
  ╚══════════════════════════════════════════════════╝
149
173
  `);
150
174
  console.log(` Admin key (save this): ${result.adminKey}\n`);
@@ -163,7 +187,7 @@ async function main() {
163
187
  case 'version':
164
188
  case '--version':
165
189
  case '-v':
166
- console.log('paygate-mcp v0.1.3');
190
+ console.log('paygate-mcp v0.6.0');
167
191
  break;
168
192
  default:
169
193
  console.error(`Unknown command: ${command}\n`);
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,16 @@
1
+ /**
2
+ * Admin Dashboard — Embedded HTML dashboard for PayGate MCP.
3
+ *
4
+ * Served at GET /dashboard. Admin key entered via browser prompt.
5
+ * Uses only inline CSS and vanilla JS — no external dependencies.
6
+ * All dynamic content is escaped to prevent XSS.
7
+ *
8
+ * Features:
9
+ * - Overview cards: active keys, total calls, credits spent, denied
10
+ * - Top tools breakdown (bar chart)
11
+ * - Recent activity feed
12
+ * - Key management (create, revoke, top-up)
13
+ * - Auto-refresh every 30s
14
+ */
15
+ export declare function getDashboardHtml(serverName: string): string;
16
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAyZ3D"}