paygate-mcp 8.50.0 → 8.52.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 +41 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +156 -0
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -157,6 +157,8 @@ Agent → PayGate (auth + billing) → Your MCP Server (stdio or HTTP)
|
|
|
157
157
|
- **Credit Allocation Summary** — `GET /admin/credit-allocation` credit allocation across active keys with tier breakdown (1-100, 101-500, 501+), totals, and average allocation
|
|
158
158
|
- **Daily Summary** — `GET /admin/daily-summary` daily rollup of requests, credits spent, new keys, errors, unique consumers and tools for trend analysis
|
|
159
159
|
- **Key Ranking** — `GET /admin/key-ranking` leaderboard of active keys ranked by spend, calls, or credits remaining with configurable sorting
|
|
160
|
+
- **Hourly Traffic** — `GET /admin/hourly-traffic` granular per-hour request counts with allowed/denied breakdown, credits, consumers, tools, and busiest hour
|
|
161
|
+
- **Tool Error Rate** — `GET /admin/tool-error-rate` per-tool error rates with denied/allowed counts, error percentage, and overall reliability metrics
|
|
160
162
|
- **Config Hot Reload** — `POST /config/reload` reloads pricing, rate limits, webhooks, quotas, and behavior flags from config file without server restart
|
|
161
163
|
- **Webhook Events** — POST batched usage events to any URL for external billing/alerting
|
|
162
164
|
- **Config File Mode** — Load all settings from a JSON file (`--config`)
|
|
@@ -3638,6 +3640,45 @@ curl http://localhost:3000/admin/key-ranking -H "X-Admin-Key: YOUR_ADMIN_KEY"
|
|
|
3638
3640
|
|
|
3639
3641
|
Key leaderboard ranked by configurable metric. Default sorts by `totalSpent` descending. Use `?sortBy=totalCalls` or `?sortBy=creditsRemaining` for alternative rankings. Each entry includes rank number, name, spend, calls, and credits remaining. Excludes revoked/suspended keys. Read-only.
|
|
3640
3642
|
|
|
3643
|
+
### Hourly Traffic
|
|
3644
|
+
|
|
3645
|
+
```bash
|
|
3646
|
+
curl http://localhost:3000/admin/hourly-traffic -H "X-Admin-Key: YOUR_ADMIN_KEY"
|
|
3647
|
+
```
|
|
3648
|
+
|
|
3649
|
+
```json
|
|
3650
|
+
{
|
|
3651
|
+
"hours": [
|
|
3652
|
+
{ "timestamp": "2025-01-15T14:00:00Z", "requests": 45, "allowed": 42, "denied": 3, "credits": 210, "uniqueConsumers": 12, "uniqueTools": 5 },
|
|
3653
|
+
{ "timestamp": "2025-01-15T13:00:00Z", "requests": 30, "allowed": 28, "denied": 2, "credits": 140, "uniqueConsumers": 8, "uniqueTools": 4 }
|
|
3654
|
+
],
|
|
3655
|
+
"summary": { "totalRequests": 75, "totalCredits": 350, "busiestHour": "2025-01-15T14:00:00Z", "busiestHourRequests": 45 },
|
|
3656
|
+
"generatedAt": "2025-01-15T14:30:00Z"
|
|
3657
|
+
}
|
|
3658
|
+
```
|
|
3659
|
+
|
|
3660
|
+
Granular per-hour request metrics. Per-hour: total requests, allowed/denied breakdown, credits spent, unique consumers, and unique tools. Summary includes totals and identifies the busiest hour. Sorted by timestamp descending (most recent first). Read-only.
|
|
3661
|
+
|
|
3662
|
+
### Tool Error Rate
|
|
3663
|
+
|
|
3664
|
+
```bash
|
|
3665
|
+
curl http://localhost:3000/admin/tool-error-rate -H "X-Admin-Key: YOUR_ADMIN_KEY"
|
|
3666
|
+
```
|
|
3667
|
+
|
|
3668
|
+
```json
|
|
3669
|
+
{
|
|
3670
|
+
"tools": [
|
|
3671
|
+
{ "tool": "translate", "totalRequests": 100, "allowed": 85, "denied": 15, "errorRate": 15 },
|
|
3672
|
+
{ "tool": "search", "totalRequests": 200, "allowed": 190, "denied": 10, "errorRate": 5 },
|
|
3673
|
+
{ "tool": "generate", "totalRequests": 150, "allowed": 150, "denied": 0, "errorRate": 0 }
|
|
3674
|
+
],
|
|
3675
|
+
"summary": { "totalTools": 3, "overallErrorRate": 5.56, "highestErrorTool": "translate" },
|
|
3676
|
+
"generatedAt": "2025-01-15T14:30:00Z"
|
|
3677
|
+
}
|
|
3678
|
+
```
|
|
3679
|
+
|
|
3680
|
+
Per-tool error/denial rate analysis. Per-tool: total requests, allowed/denied counts, and error rate percentage. Summary includes total tools, overall error rate, and identifies the tool with highest error rate. Sorted by error rate descending. Read-only.
|
|
3681
|
+
|
|
3641
3682
|
### IP Allowlisting
|
|
3642
3683
|
|
|
3643
3684
|
Restrict API keys to specific IP addresses or CIDR ranges:
|
package/dist/server.d.ts
CHANGED
|
@@ -289,6 +289,8 @@ export declare class PayGateServer {
|
|
|
289
289
|
private handlePeakUsage;
|
|
290
290
|
private handleConsumerActivity;
|
|
291
291
|
private handleToolPopularity;
|
|
292
|
+
private handleToolErrorRate;
|
|
293
|
+
private handleHourlyTraffic;
|
|
292
294
|
private handleKeyRanking;
|
|
293
295
|
private handleDailySummary;
|
|
294
296
|
private handleCreditAllocation;
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -1098,6 +1098,18 @@ class PayGateServer {
|
|
|
1098
1098
|
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
1099
1099
|
res.end(JSON.stringify({ error: 'Method not allowed. Use GET.' }));
|
|
1100
1100
|
return;
|
|
1101
|
+
case '/admin/hourly-traffic':
|
|
1102
|
+
if (req.method === 'GET')
|
|
1103
|
+
return this.handleHourlyTraffic(req, res);
|
|
1104
|
+
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
1105
|
+
res.end(JSON.stringify({ error: 'Method not allowed. Use GET.' }));
|
|
1106
|
+
return;
|
|
1107
|
+
case '/admin/tool-error-rate':
|
|
1108
|
+
if (req.method === 'GET')
|
|
1109
|
+
return this.handleToolErrorRate(req, res);
|
|
1110
|
+
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
1111
|
+
res.end(JSON.stringify({ error: 'Method not allowed. Use GET.' }));
|
|
1112
|
+
return;
|
|
1101
1113
|
// ─── Plugin endpoints ──────────────────────────────────────────────
|
|
1102
1114
|
case '/plugins':
|
|
1103
1115
|
return this.handleListPlugins(req, res);
|
|
@@ -1688,6 +1700,8 @@ class PayGateServer {
|
|
|
1688
1700
|
creditAllocation: 'GET /admin/credit-allocation — Credit allocation summary with tier breakdown, totals, and average allocation across active keys (requires X-Admin-Key)',
|
|
1689
1701
|
dailySummary: 'GET /admin/daily-summary — Daily rollup of requests, credits spent, new keys, errors, and unique consumers for trend analysis (requires X-Admin-Key)',
|
|
1690
1702
|
keyRanking: 'GET /admin/key-ranking — Key leaderboard ranked by spend, calls, or credits remaining with configurable sorting (requires X-Admin-Key)',
|
|
1703
|
+
hourlyTraffic: 'GET /admin/hourly-traffic — Granular per-hour request counts with allowed/denied breakdown, credits, consumers, and tools (requires X-Admin-Key)',
|
|
1704
|
+
toolErrorRate: 'GET /admin/tool-error-rate — Per-tool error rates with denied/allowed counts, error percentage, and overall reliability metrics (requires X-Admin-Key)',
|
|
1691
1705
|
...(this.oauth ? {
|
|
1692
1706
|
oauthMetadata: 'GET /.well-known/oauth-authorization-server — OAuth 2.1 server metadata',
|
|
1693
1707
|
oauthRegister: 'POST /oauth/register — Register OAuth client',
|
|
@@ -8099,6 +8113,148 @@ class PayGateServer {
|
|
|
8099
8113
|
generatedAt: new Date().toISOString(),
|
|
8100
8114
|
}));
|
|
8101
8115
|
}
|
|
8116
|
+
// ─── /admin/tool-error-rate — Per-tool error rates ───────────────────────
|
|
8117
|
+
handleToolErrorRate(_req, res) {
|
|
8118
|
+
if (!this.checkAdmin(_req, res))
|
|
8119
|
+
return;
|
|
8120
|
+
if (this.requestLog.length === 0) {
|
|
8121
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
8122
|
+
res.end(JSON.stringify({
|
|
8123
|
+
tools: [],
|
|
8124
|
+
summary: {
|
|
8125
|
+
totalTools: 0,
|
|
8126
|
+
overallErrorRate: 0,
|
|
8127
|
+
highestErrorTool: null,
|
|
8128
|
+
},
|
|
8129
|
+
generatedAt: new Date().toISOString(),
|
|
8130
|
+
}));
|
|
8131
|
+
return;
|
|
8132
|
+
}
|
|
8133
|
+
// Aggregate per tool
|
|
8134
|
+
const toolMap = new Map();
|
|
8135
|
+
let totalAllowed = 0;
|
|
8136
|
+
let totalDenied = 0;
|
|
8137
|
+
for (const entry of this.requestLog) {
|
|
8138
|
+
const tool = entry.tool || 'unknown';
|
|
8139
|
+
let t = toolMap.get(tool);
|
|
8140
|
+
if (!t) {
|
|
8141
|
+
t = { allowed: 0, denied: 0 };
|
|
8142
|
+
toolMap.set(tool, t);
|
|
8143
|
+
}
|
|
8144
|
+
if (entry.status === 'allowed') {
|
|
8145
|
+
t.allowed++;
|
|
8146
|
+
totalAllowed++;
|
|
8147
|
+
}
|
|
8148
|
+
else {
|
|
8149
|
+
t.denied++;
|
|
8150
|
+
totalDenied++;
|
|
8151
|
+
}
|
|
8152
|
+
}
|
|
8153
|
+
const totalRequests = totalAllowed + totalDenied;
|
|
8154
|
+
const overallErrorRate = totalRequests > 0
|
|
8155
|
+
? Math.round((totalDenied / totalRequests) * 10000) / 100
|
|
8156
|
+
: 0;
|
|
8157
|
+
// Build tools array sorted by error rate descending
|
|
8158
|
+
const tools = Array.from(toolMap.entries())
|
|
8159
|
+
.map(([tool, t]) => {
|
|
8160
|
+
const total = t.allowed + t.denied;
|
|
8161
|
+
return {
|
|
8162
|
+
tool,
|
|
8163
|
+
totalRequests: total,
|
|
8164
|
+
allowed: t.allowed,
|
|
8165
|
+
denied: t.denied,
|
|
8166
|
+
errorRate: total > 0 ? Math.round((t.denied / total) * 10000) / 100 : 0,
|
|
8167
|
+
};
|
|
8168
|
+
})
|
|
8169
|
+
.sort((a, b) => b.errorRate - a.errorRate || b.totalRequests - a.totalRequests);
|
|
8170
|
+
// Find highest error tool (with at least 1 error)
|
|
8171
|
+
const highestError = tools.find(t => t.errorRate > 0);
|
|
8172
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
8173
|
+
res.end(JSON.stringify({
|
|
8174
|
+
tools,
|
|
8175
|
+
summary: {
|
|
8176
|
+
totalTools: tools.length,
|
|
8177
|
+
overallErrorRate,
|
|
8178
|
+
highestErrorTool: highestError?.tool || null,
|
|
8179
|
+
},
|
|
8180
|
+
generatedAt: new Date().toISOString(),
|
|
8181
|
+
}));
|
|
8182
|
+
}
|
|
8183
|
+
// ─── /admin/hourly-traffic — Granular per-hour metrics ───────────────────
|
|
8184
|
+
handleHourlyTraffic(_req, res) {
|
|
8185
|
+
if (!this.checkAdmin(_req, res))
|
|
8186
|
+
return;
|
|
8187
|
+
if (this.requestLog.length === 0) {
|
|
8188
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
8189
|
+
res.end(JSON.stringify({
|
|
8190
|
+
hours: [],
|
|
8191
|
+
summary: {
|
|
8192
|
+
totalRequests: 0,
|
|
8193
|
+
totalCredits: 0,
|
|
8194
|
+
busiestHour: null,
|
|
8195
|
+
busiestHourRequests: 0,
|
|
8196
|
+
},
|
|
8197
|
+
generatedAt: new Date().toISOString(),
|
|
8198
|
+
}));
|
|
8199
|
+
return;
|
|
8200
|
+
}
|
|
8201
|
+
// Group by hour bucket (YYYY-MM-DDTHH:00:00Z)
|
|
8202
|
+
const hourMap = new Map();
|
|
8203
|
+
for (const entry of this.requestLog) {
|
|
8204
|
+
const ts = new Date(entry.timestamp);
|
|
8205
|
+
const hourKey = ts.toISOString().slice(0, 13) + ':00:00Z';
|
|
8206
|
+
let h = hourMap.get(hourKey);
|
|
8207
|
+
if (!h) {
|
|
8208
|
+
h = { requests: 0, allowed: 0, denied: 0, credits: 0, consumers: new Set(), tools: new Set() };
|
|
8209
|
+
hourMap.set(hourKey, h);
|
|
8210
|
+
}
|
|
8211
|
+
h.requests++;
|
|
8212
|
+
if (entry.status === 'allowed') {
|
|
8213
|
+
h.allowed++;
|
|
8214
|
+
h.credits += entry.credits || 0;
|
|
8215
|
+
}
|
|
8216
|
+
else {
|
|
8217
|
+
h.denied++;
|
|
8218
|
+
}
|
|
8219
|
+
h.consumers.add(entry.key);
|
|
8220
|
+
if (entry.tool)
|
|
8221
|
+
h.tools.add(entry.tool);
|
|
8222
|
+
}
|
|
8223
|
+
// Build hours array sorted by timestamp descending
|
|
8224
|
+
const hours = Array.from(hourMap.entries())
|
|
8225
|
+
.sort((a, b) => b[0].localeCompare(a[0]))
|
|
8226
|
+
.map(([timestamp, h]) => ({
|
|
8227
|
+
timestamp,
|
|
8228
|
+
requests: h.requests,
|
|
8229
|
+
allowed: h.allowed,
|
|
8230
|
+
denied: h.denied,
|
|
8231
|
+
credits: h.credits,
|
|
8232
|
+
uniqueConsumers: h.consumers.size,
|
|
8233
|
+
uniqueTools: h.tools.size,
|
|
8234
|
+
}));
|
|
8235
|
+
const totalRequests = hours.reduce((s, h) => s + h.requests, 0);
|
|
8236
|
+
const totalCredits = hours.reduce((s, h) => s + h.credits, 0);
|
|
8237
|
+
// Find busiest hour
|
|
8238
|
+
let busiestHour = hours[0]?.timestamp || null;
|
|
8239
|
+
let busiestHourRequests = 0;
|
|
8240
|
+
for (const h of hours) {
|
|
8241
|
+
if (h.requests > busiestHourRequests) {
|
|
8242
|
+
busiestHour = h.timestamp;
|
|
8243
|
+
busiestHourRequests = h.requests;
|
|
8244
|
+
}
|
|
8245
|
+
}
|
|
8246
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
8247
|
+
res.end(JSON.stringify({
|
|
8248
|
+
hours,
|
|
8249
|
+
summary: {
|
|
8250
|
+
totalRequests,
|
|
8251
|
+
totalCredits,
|
|
8252
|
+
busiestHour,
|
|
8253
|
+
busiestHourRequests,
|
|
8254
|
+
},
|
|
8255
|
+
generatedAt: new Date().toISOString(),
|
|
8256
|
+
}));
|
|
8257
|
+
}
|
|
8102
8258
|
// ─── /admin/key-ranking — Key leaderboard ────────────────────────────────
|
|
8103
8259
|
handleKeyRanking(_req, res) {
|
|
8104
8260
|
if (!this.checkAdmin(_req, res))
|