paygate-mcp 8.23.0 → 8.25.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 +48 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +149 -0
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -130,6 +130,8 @@ Agent → PayGate (auth + billing) → Your MCP Server (stdio or HTTP)
|
|
|
130
130
|
- **Key Age Analysis** — `GET /admin/key-age` key age distribution with oldest/newest keys, age buckets (24h/7d/30d/older), and recently created list
|
|
131
131
|
- **Namespace Usage Summary** — `GET /admin/namespace-usage` per-namespace usage metrics with credit allocation, spending, call counts, and cross-namespace comparison
|
|
132
132
|
- **Audit Summary** — `GET /admin/audit-summary` audit event analytics with type breakdown, top actors, recent events, and activity summary
|
|
133
|
+
- **Group Performance** — `GET /admin/group-performance` per-group analytics with key counts, credit allocation/spending, call volume, utilization, and policy summary
|
|
134
|
+
- **Request Volume Trends** — `GET /admin/request-trends` hourly time-series of request volume, success/failure counts, credit spend, avg duration, and peak hour identification
|
|
133
135
|
- **Config Hot Reload** — `POST /config/reload` reloads pricing, rate limits, webhooks, quotas, and behavior flags from config file without server restart
|
|
134
136
|
- **Webhook Events** — POST batched usage events to any URL for external billing/alerting
|
|
135
137
|
- **Config File Mode** — Load all settings from a JSON file (`--config`)
|
|
@@ -3012,6 +3014,52 @@ curl http://localhost:3000/admin/audit-summary -H "X-Admin-Key: YOUR_ADMIN_KEY"
|
|
|
3012
3014
|
|
|
3013
3015
|
Audit event analytics: total events with hourly/daily counts, event type breakdown sorted by frequency, top 10 most active actors, and the 20 most recent events (newest first). Read-only.
|
|
3014
3016
|
|
|
3017
|
+
### Group Performance
|
|
3018
|
+
|
|
3019
|
+
```bash
|
|
3020
|
+
curl http://localhost:3000/admin/group-performance -H "X-Admin-Key: YOUR_ADMIN_KEY"
|
|
3021
|
+
```
|
|
3022
|
+
|
|
3023
|
+
```json
|
|
3024
|
+
{
|
|
3025
|
+
"summary": { "totalGroups": 2, "ungroupedKeys": 3 },
|
|
3026
|
+
"groups": [
|
|
3027
|
+
{
|
|
3028
|
+
"groupId": "grp_abc123", "groupName": "prod-team", "description": "Production",
|
|
3029
|
+
"keyCount": 5, "totalAllocated": 5000, "totalSpent": 2000, "totalRemaining": 3000,
|
|
3030
|
+
"totalCalls": 400, "utilizationPct": 40,
|
|
3031
|
+
"policy": { "allowedTools": ["tool_a"], "deniedTools": [], "rateLimitPerMin": 60 }
|
|
3032
|
+
}
|
|
3033
|
+
],
|
|
3034
|
+
"generatedAt": "2025-01-15T14:30:00Z"
|
|
3035
|
+
}
|
|
3036
|
+
```
|
|
3037
|
+
|
|
3038
|
+
Per-group analytics: key counts, credit allocation/spending/remaining, call volume, and utilization percentages. Includes group policy summary (allowed/denied tools, rate limits). Sorted by spending (highest first). Also reports ungrouped key count. Read-only.
|
|
3039
|
+
|
|
3040
|
+
### Request Volume Trends
|
|
3041
|
+
|
|
3042
|
+
```bash
|
|
3043
|
+
curl http://localhost:3000/admin/request-trends -H "X-Admin-Key: YOUR_ADMIN_KEY"
|
|
3044
|
+
```
|
|
3045
|
+
|
|
3046
|
+
```json
|
|
3047
|
+
{
|
|
3048
|
+
"summary": {
|
|
3049
|
+
"totalRequests": 150, "totalAllowed": 130, "totalDenied": 20,
|
|
3050
|
+
"totalCredits": 650, "avgDurationMs": 45,
|
|
3051
|
+
"peakHour": { "hour": "2025-01-15T14:00:00Z", "total": 42 }
|
|
3052
|
+
},
|
|
3053
|
+
"hourly": [
|
|
3054
|
+
{ "hour": "2025-01-15T12:00:00Z", "total": 35, "allowed": 30, "denied": 5, "credits": 150, "avgDurationMs": 40 },
|
|
3055
|
+
{ "hour": "2025-01-15T13:00:00Z", "total": 42, "allowed": 38, "denied": 4, "credits": 190, "avgDurationMs": 50 }
|
|
3056
|
+
],
|
|
3057
|
+
"generatedAt": "2025-01-15T14:30:00Z"
|
|
3058
|
+
}
|
|
3059
|
+
```
|
|
3060
|
+
|
|
3061
|
+
Hourly request volume time-series: total/allowed/denied counts, credit spend, and average duration per hour. Includes summary with peak hour identification. Built from request log data. Sorted chronologically. Read-only.
|
|
3062
|
+
|
|
3015
3063
|
### IP Allowlisting
|
|
3016
3064
|
|
|
3017
3065
|
Restrict API keys to specific IP addresses or CIDR ranges:
|
package/dist/server.d.ts
CHANGED
|
@@ -265,6 +265,8 @@ export declare class PayGateServer {
|
|
|
265
265
|
private handleKeyAge;
|
|
266
266
|
private handleNamespaceUsage;
|
|
267
267
|
private handleAuditSummary;
|
|
268
|
+
private handleGroupPerformance;
|
|
269
|
+
private handleRequestTrends;
|
|
268
270
|
private handleGetNotes;
|
|
269
271
|
private handleAddNote;
|
|
270
272
|
private handleDeleteNote;
|
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
|
@@ -936,6 +936,18 @@ class PayGateServer {
|
|
|
936
936
|
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
937
937
|
res.end(JSON.stringify({ error: 'Method not allowed. Use GET.' }));
|
|
938
938
|
return;
|
|
939
|
+
case '/admin/group-performance':
|
|
940
|
+
if (req.method === 'GET')
|
|
941
|
+
return this.handleGroupPerformance(req, res);
|
|
942
|
+
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
943
|
+
res.end(JSON.stringify({ error: 'Method not allowed. Use GET.' }));
|
|
944
|
+
return;
|
|
945
|
+
case '/admin/request-trends':
|
|
946
|
+
if (req.method === 'GET')
|
|
947
|
+
return this.handleRequestTrends(req, res);
|
|
948
|
+
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
949
|
+
res.end(JSON.stringify({ error: 'Method not allowed. Use GET.' }));
|
|
950
|
+
return;
|
|
939
951
|
// ─── Plugin endpoints ──────────────────────────────────────────────
|
|
940
952
|
case '/plugins':
|
|
941
953
|
return this.handleListPlugins(req, res);
|
|
@@ -1499,6 +1511,8 @@ class PayGateServer {
|
|
|
1499
1511
|
keyAge: 'GET /admin/key-age — Key age distribution with oldest/newest keys, age buckets, and recently created list (requires X-Admin-Key)',
|
|
1500
1512
|
namespaceUsage: 'GET /admin/namespace-usage — Per-namespace usage metrics with credit allocation, spending, call counts, and cross-namespace comparison (requires X-Admin-Key)',
|
|
1501
1513
|
auditSummary: 'GET /admin/audit-summary — Audit event analytics with type breakdown, top actors, recent events, and activity summary (requires X-Admin-Key)',
|
|
1514
|
+
groupPerformance: 'GET /admin/group-performance — Per-group analytics with key counts, credit allocation/spending, call volume, and utilization (requires X-Admin-Key)',
|
|
1515
|
+
requestTrends: 'GET /admin/request-trends — Hourly request volume time-series with success/failure counts, credit spend, and avg duration (requires X-Admin-Key)',
|
|
1502
1516
|
...(this.oauth ? {
|
|
1503
1517
|
oauthMetadata: 'GET /.well-known/oauth-authorization-server — OAuth 2.1 server metadata',
|
|
1504
1518
|
oauthRegister: 'POST /oauth/register — Register OAuth client',
|
|
@@ -6515,6 +6529,141 @@ class PayGateServer {
|
|
|
6515
6529
|
generatedAt: new Date().toISOString(),
|
|
6516
6530
|
}));
|
|
6517
6531
|
}
|
|
6532
|
+
// ─── /admin/group-performance — Per-group analytics ─────────────────────
|
|
6533
|
+
handleGroupPerformance(req, res) {
|
|
6534
|
+
if (!this.checkAdmin(req, res))
|
|
6535
|
+
return;
|
|
6536
|
+
const groupList = this.groups.listGroups();
|
|
6537
|
+
const records = this.gate.store.getAllRecords().filter(r => r.active);
|
|
6538
|
+
// Count ungrouped keys
|
|
6539
|
+
const groupedKeys = new Set();
|
|
6540
|
+
const groupRecords = new Map();
|
|
6541
|
+
for (const g of groupList) {
|
|
6542
|
+
const members = this.groups.getGroupMembers(g.id);
|
|
6543
|
+
const memberSet = new Set(members);
|
|
6544
|
+
const memberRecords = [];
|
|
6545
|
+
for (const r of records) {
|
|
6546
|
+
if (memberSet.has(r.key)) {
|
|
6547
|
+
groupedKeys.add(r.key);
|
|
6548
|
+
memberRecords.push(r);
|
|
6549
|
+
}
|
|
6550
|
+
}
|
|
6551
|
+
groupRecords.set(g.id, memberRecords);
|
|
6552
|
+
}
|
|
6553
|
+
const ungroupedKeys = records.filter(r => !groupedKeys.has(r.key)).length;
|
|
6554
|
+
const groups = groupList.map(g => {
|
|
6555
|
+
const members = groupRecords.get(g.id) || [];
|
|
6556
|
+
let totalAllocated = 0;
|
|
6557
|
+
let totalSpent = 0;
|
|
6558
|
+
let totalCalls = 0;
|
|
6559
|
+
for (const r of members) {
|
|
6560
|
+
totalAllocated += r.credits + r.totalSpent;
|
|
6561
|
+
totalSpent += r.totalSpent;
|
|
6562
|
+
totalCalls += r.totalCalls;
|
|
6563
|
+
}
|
|
6564
|
+
return {
|
|
6565
|
+
groupId: g.id,
|
|
6566
|
+
groupName: g.name,
|
|
6567
|
+
description: g.description,
|
|
6568
|
+
keyCount: members.length,
|
|
6569
|
+
totalAllocated,
|
|
6570
|
+
totalSpent,
|
|
6571
|
+
totalRemaining: totalAllocated - totalSpent,
|
|
6572
|
+
totalCalls,
|
|
6573
|
+
utilizationPct: totalAllocated > 0
|
|
6574
|
+
? Math.round((totalSpent / totalAllocated) * 100)
|
|
6575
|
+
: 0,
|
|
6576
|
+
policy: {
|
|
6577
|
+
allowedTools: g.allowedTools,
|
|
6578
|
+
deniedTools: g.deniedTools,
|
|
6579
|
+
rateLimitPerMin: g.rateLimitPerMin,
|
|
6580
|
+
},
|
|
6581
|
+
};
|
|
6582
|
+
}).sort((a, b) => b.totalSpent - a.totalSpent);
|
|
6583
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
6584
|
+
res.end(JSON.stringify({
|
|
6585
|
+
summary: {
|
|
6586
|
+
totalGroups: groupList.length,
|
|
6587
|
+
ungroupedKeys,
|
|
6588
|
+
},
|
|
6589
|
+
groups,
|
|
6590
|
+
generatedAt: new Date().toISOString(),
|
|
6591
|
+
}));
|
|
6592
|
+
}
|
|
6593
|
+
// ─── /admin/request-trends — Hourly request volume time-series ──────────
|
|
6594
|
+
handleRequestTrends(req, res) {
|
|
6595
|
+
if (!this.checkAdmin(req, res))
|
|
6596
|
+
return;
|
|
6597
|
+
const entries = this.requestLog;
|
|
6598
|
+
if (entries.length === 0) {
|
|
6599
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
6600
|
+
res.end(JSON.stringify({
|
|
6601
|
+
summary: {
|
|
6602
|
+
totalRequests: 0, totalAllowed: 0, totalDenied: 0,
|
|
6603
|
+
totalCredits: 0, avgDurationMs: 0, peakHour: null,
|
|
6604
|
+
},
|
|
6605
|
+
hourly: [],
|
|
6606
|
+
generatedAt: new Date().toISOString(),
|
|
6607
|
+
}));
|
|
6608
|
+
return;
|
|
6609
|
+
}
|
|
6610
|
+
// ── Aggregate into hourly buckets ──
|
|
6611
|
+
let totalAllowed = 0;
|
|
6612
|
+
let totalDenied = 0;
|
|
6613
|
+
let totalCredits = 0;
|
|
6614
|
+
let totalDuration = 0;
|
|
6615
|
+
const buckets = new Map();
|
|
6616
|
+
for (const e of entries) {
|
|
6617
|
+
const ts = new Date(e.timestamp);
|
|
6618
|
+
const hour = ts.toISOString().slice(0, 13) + ':00:00Z'; // YYYY-MM-DDTHH:00:00Z
|
|
6619
|
+
if (!buckets.has(hour)) {
|
|
6620
|
+
buckets.set(hour, { total: 0, allowed: 0, denied: 0, credits: 0, totalDurationMs: 0 });
|
|
6621
|
+
}
|
|
6622
|
+
const b = buckets.get(hour);
|
|
6623
|
+
b.total++;
|
|
6624
|
+
if (e.status === 'allowed') {
|
|
6625
|
+
b.allowed++;
|
|
6626
|
+
totalAllowed++;
|
|
6627
|
+
b.credits += e.credits || 0;
|
|
6628
|
+
totalCredits += e.credits || 0;
|
|
6629
|
+
}
|
|
6630
|
+
else {
|
|
6631
|
+
b.denied++;
|
|
6632
|
+
totalDenied++;
|
|
6633
|
+
}
|
|
6634
|
+
b.totalDurationMs += e.durationMs || 0;
|
|
6635
|
+
totalDuration += e.durationMs || 0;
|
|
6636
|
+
}
|
|
6637
|
+
const hourly = Array.from(buckets.entries())
|
|
6638
|
+
.map(([hour, b]) => ({
|
|
6639
|
+
hour,
|
|
6640
|
+
total: b.total,
|
|
6641
|
+
allowed: b.allowed,
|
|
6642
|
+
denied: b.denied,
|
|
6643
|
+
credits: b.credits,
|
|
6644
|
+
avgDurationMs: b.total > 0 ? Math.round(b.totalDurationMs / b.total) : 0,
|
|
6645
|
+
}))
|
|
6646
|
+
.sort((a, b) => a.hour.localeCompare(b.hour));
|
|
6647
|
+
// ── Peak hour ──
|
|
6648
|
+
let peakHour = hourly[0];
|
|
6649
|
+
for (const h of hourly) {
|
|
6650
|
+
if (h.total > peakHour.total)
|
|
6651
|
+
peakHour = h;
|
|
6652
|
+
}
|
|
6653
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
6654
|
+
res.end(JSON.stringify({
|
|
6655
|
+
summary: {
|
|
6656
|
+
totalRequests: entries.length,
|
|
6657
|
+
totalAllowed,
|
|
6658
|
+
totalDenied,
|
|
6659
|
+
totalCredits,
|
|
6660
|
+
avgDurationMs: entries.length > 0 ? Math.round(totalDuration / entries.length) : 0,
|
|
6661
|
+
peakHour: { hour: peakHour.hour, total: peakHour.total },
|
|
6662
|
+
},
|
|
6663
|
+
hourly,
|
|
6664
|
+
generatedAt: new Date().toISOString(),
|
|
6665
|
+
}));
|
|
6666
|
+
}
|
|
6518
6667
|
// ─── /keys/notes — Timestamped notes on API keys ─────────────────────────
|
|
6519
6668
|
handleGetNotes(req, res) {
|
|
6520
6669
|
if (!this.checkAdmin(req, res))
|