paygate-mcp 8.16.0 → 8.18.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 +50 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +154 -0
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -123,6 +123,8 @@ Agent → PayGate (auth + billing) → Your MCP Server (stdio or HTTP)
|
|
|
123
123
|
- **Compliance Report** — `GET /admin/compliance` generates compliance-ready report with key governance (expiry coverage), access control (ACL/IP/spending limit coverage), audit trail completeness, weighted overall score, and actionable recommendations
|
|
124
124
|
- **SLA Monitoring** — `GET /admin/sla` tracks service level metrics: success rates, denial breakdowns by reason, per-tool availability and error rates, uptime tracking, sorted by call volume
|
|
125
125
|
- **Capacity Planning** — `GET /admin/capacity` system capacity analysis with credit burn rates, utilization percentages, top consumers, per-namespace breakdown, and scaling recommendations
|
|
126
|
+
- **Key Dependency Map** — `GET /admin/dependencies` tool-to-key relationship map with tool usage popularity, unique key counts per tool, per-key tool lists, and used/unused tool identification
|
|
127
|
+
- **Tool Latency Analysis** — `GET /admin/latency` per-tool response time metrics with avg/p95/min/max durations, slowest tools ranking, and per-key latency breakdown
|
|
126
128
|
- **Config Hot Reload** — `POST /config/reload` reloads pricing, rate limits, webhooks, quotas, and behavior flags from config file without server restart
|
|
127
129
|
- **Webhook Events** — POST batched usage events to any URL for external billing/alerting
|
|
128
130
|
- **Config File Mode** — Load all settings from a JSON file (`--config`)
|
|
@@ -2843,6 +2845,54 @@ curl http://localhost:3000/admin/capacity -H "X-Admin-Key: YOUR_ADMIN_KEY"
|
|
|
2843
2845
|
|
|
2844
2846
|
System capacity analysis: overall credit utilization, burn rate (credits/call), top 10 consumers ranked by spend, per-namespace breakdown, and scaling recommendations for high utilization (>=75%) or depleted keys. Read-only.
|
|
2845
2847
|
|
|
2848
|
+
### Key Dependency Map
|
|
2849
|
+
|
|
2850
|
+
```bash
|
|
2851
|
+
curl http://localhost:3000/admin/dependencies -H "X-Admin-Key: YOUR_ADMIN_KEY"
|
|
2852
|
+
```
|
|
2853
|
+
|
|
2854
|
+
```json
|
|
2855
|
+
{
|
|
2856
|
+
"summary": { "totalTools": 5, "usedTools": 3, "unusedTools": 2 },
|
|
2857
|
+
"toolUsage": [
|
|
2858
|
+
{ "tool": "search", "totalCalls": 150, "uniqueKeys": 8 },
|
|
2859
|
+
{ "tool": "translate", "totalCalls": 45, "uniqueKeys": 3 }
|
|
2860
|
+
],
|
|
2861
|
+
"keyToolMap": [
|
|
2862
|
+
{ "keyName": "power-user", "tools": ["search", "translate", "summarize"], "toolCount": 3 },
|
|
2863
|
+
{ "keyName": "basic-user", "tools": ["search"], "toolCount": 1 }
|
|
2864
|
+
],
|
|
2865
|
+
"generatedAt": "2025-01-15T14:30:00Z"
|
|
2866
|
+
}
|
|
2867
|
+
```
|
|
2868
|
+
|
|
2869
|
+
Tool-to-key relationship map: shows which tools each key uses, tool popularity ranked by total calls, unique key counts per tool, and identifies orphaned tools (available but unused). Useful for understanding tool adoption and pruning unused capabilities. Read-only.
|
|
2870
|
+
|
|
2871
|
+
### Tool Latency Analysis
|
|
2872
|
+
|
|
2873
|
+
```bash
|
|
2874
|
+
curl http://localhost:3000/admin/latency -H "X-Admin-Key: YOUR_ADMIN_KEY"
|
|
2875
|
+
```
|
|
2876
|
+
|
|
2877
|
+
```json
|
|
2878
|
+
{
|
|
2879
|
+
"summary": { "totalCalls": 200, "avgDurationMs": 45, "minDurationMs": 8, "maxDurationMs": 312, "p95DurationMs": 120 },
|
|
2880
|
+
"byTool": [
|
|
2881
|
+
{ "tool": "translate", "totalCalls": 80, "avgDurationMs": 65, "minDurationMs": 20, "maxDurationMs": 312, "p95DurationMs": 150 },
|
|
2882
|
+
{ "tool": "search", "totalCalls": 120, "avgDurationMs": 32, "minDurationMs": 8, "maxDurationMs": 95, "p95DurationMs": 78 }
|
|
2883
|
+
],
|
|
2884
|
+
"slowestTools": [
|
|
2885
|
+
{ "tool": "translate", "avgDurationMs": 65, "totalCalls": 80 }
|
|
2886
|
+
],
|
|
2887
|
+
"byKey": [
|
|
2888
|
+
{ "keyName": "heavy-user", "totalCalls": 150, "avgDurationMs": 48, "minDurationMs": 8, "maxDurationMs": 312 }
|
|
2889
|
+
],
|
|
2890
|
+
"generatedAt": "2025-01-15T14:30:00Z"
|
|
2891
|
+
}
|
|
2892
|
+
```
|
|
2893
|
+
|
|
2894
|
+
Per-tool response time metrics: average, p95, min, and max durations for each tool sorted by slowest average first, top 10 slowest tools ranking, per-key latency breakdown, and global summary. Only counts successful (allowed) calls. Read-only.
|
|
2895
|
+
|
|
2846
2896
|
### IP Allowlisting
|
|
2847
2897
|
|
|
2848
2898
|
Restrict API keys to specific IP addresses or CIDR ranges:
|
package/dist/server.d.ts
CHANGED
|
@@ -258,6 +258,8 @@ export declare class PayGateServer {
|
|
|
258
258
|
private handleComplianceReport;
|
|
259
259
|
private handleSlaMonitoring;
|
|
260
260
|
private handleCapacityPlanning;
|
|
261
|
+
private handleDependencyMap;
|
|
262
|
+
private handleLatencyAnalysis;
|
|
261
263
|
private handleGetNotes;
|
|
262
264
|
private handleAddNote;
|
|
263
265
|
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
|
@@ -894,6 +894,18 @@ class PayGateServer {
|
|
|
894
894
|
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
895
895
|
res.end(JSON.stringify({ error: 'Method not allowed. Use GET.' }));
|
|
896
896
|
return;
|
|
897
|
+
case '/admin/dependencies':
|
|
898
|
+
if (req.method === 'GET')
|
|
899
|
+
return this.handleDependencyMap(req, res);
|
|
900
|
+
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
901
|
+
res.end(JSON.stringify({ error: 'Method not allowed. Use GET.' }));
|
|
902
|
+
return;
|
|
903
|
+
case '/admin/latency':
|
|
904
|
+
if (req.method === 'GET')
|
|
905
|
+
return this.handleLatencyAnalysis(req, res);
|
|
906
|
+
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
907
|
+
res.end(JSON.stringify({ error: 'Method not allowed. Use GET.' }));
|
|
908
|
+
return;
|
|
897
909
|
// ─── Plugin endpoints ──────────────────────────────────────────────
|
|
898
910
|
case '/plugins':
|
|
899
911
|
return this.handleListPlugins(req, res);
|
|
@@ -1450,6 +1462,8 @@ class PayGateServer {
|
|
|
1450
1462
|
complianceReport: 'GET /admin/compliance — Compliance report with key governance, access control coverage, audit trail completeness, recommendations, and overall compliance score (requires X-Admin-Key)',
|
|
1451
1463
|
slaMonitoring: 'GET /admin/sla — SLA monitoring with success rates, denial breakdowns, per-tool availability, uptime tracking, and denial reason aggregation (requires X-Admin-Key)',
|
|
1452
1464
|
capacityPlanning: 'GET /admin/capacity — Capacity planning with credit burn rates, utilization percentages, top consumers, per-namespace breakdown, and scaling recommendations (requires X-Admin-Key)',
|
|
1465
|
+
dependencyMap: 'GET /admin/dependencies — Tool-to-key dependency map with tool usage popularity, unique key counts, per-key tool lists, and used/unused tool identification (requires X-Admin-Key)',
|
|
1466
|
+
latencyAnalysis: 'GET /admin/latency — Per-tool response time metrics with avg/p95/min/max, slowest tools ranking, and per-key latency breakdown (requires X-Admin-Key)',
|
|
1453
1467
|
...(this.oauth ? {
|
|
1454
1468
|
oauthMetadata: 'GET /.well-known/oauth-authorization-server — OAuth 2.1 server metadata',
|
|
1455
1469
|
oauthRegister: 'POST /oauth/register — Register OAuth client',
|
|
@@ -6040,6 +6054,146 @@ class PayGateServer {
|
|
|
6040
6054
|
generatedAt: new Date().toISOString(),
|
|
6041
6055
|
}));
|
|
6042
6056
|
}
|
|
6057
|
+
// ─── /admin/dependencies — Key Dependency Map ───────────────────────────
|
|
6058
|
+
handleDependencyMap(req, res) {
|
|
6059
|
+
if (!this.checkAdmin(req, res))
|
|
6060
|
+
return;
|
|
6061
|
+
const events = this.gate.meter.getEvents();
|
|
6062
|
+
// ── Tool usage from events ──
|
|
6063
|
+
const toolStats = new Map();
|
|
6064
|
+
const keyTools = new Map();
|
|
6065
|
+
for (const e of events) {
|
|
6066
|
+
if (!e.allowed || !e.tool)
|
|
6067
|
+
continue;
|
|
6068
|
+
const tool = e.tool;
|
|
6069
|
+
const keyName = e.keyName || e.apiKey;
|
|
6070
|
+
if (!toolStats.has(tool))
|
|
6071
|
+
toolStats.set(tool, { totalCalls: 0, keys: new Set() });
|
|
6072
|
+
const ts = toolStats.get(tool);
|
|
6073
|
+
ts.totalCalls++;
|
|
6074
|
+
ts.keys.add(keyName);
|
|
6075
|
+
if (!keyTools.has(keyName))
|
|
6076
|
+
keyTools.set(keyName, new Set());
|
|
6077
|
+
keyTools.get(keyName).add(tool);
|
|
6078
|
+
}
|
|
6079
|
+
// ── Collect all known tool names (from config pricing + events) ──
|
|
6080
|
+
const allToolNames = new Set();
|
|
6081
|
+
const toolPricing = this.config?.toolPricing;
|
|
6082
|
+
if (toolPricing) {
|
|
6083
|
+
for (const name of Object.keys(toolPricing))
|
|
6084
|
+
allToolNames.add(name);
|
|
6085
|
+
}
|
|
6086
|
+
for (const tool of toolStats.keys())
|
|
6087
|
+
allToolNames.add(tool);
|
|
6088
|
+
const usedTools = toolStats.size;
|
|
6089
|
+
const totalTools = Math.max(allToolNames.size, usedTools);
|
|
6090
|
+
const unusedTools = totalTools - usedTools;
|
|
6091
|
+
// ── Tool usage sorted by popularity ──
|
|
6092
|
+
const toolUsage = Array.from(toolStats.entries())
|
|
6093
|
+
.map(([tool, stats]) => ({
|
|
6094
|
+
tool,
|
|
6095
|
+
totalCalls: stats.totalCalls,
|
|
6096
|
+
uniqueKeys: stats.keys.size,
|
|
6097
|
+
}))
|
|
6098
|
+
.sort((a, b) => b.totalCalls - a.totalCalls);
|
|
6099
|
+
// ── Per-key tool map ──
|
|
6100
|
+
const keyToolMap = Array.from(keyTools.entries())
|
|
6101
|
+
.map(([keyName, tools]) => ({
|
|
6102
|
+
keyName,
|
|
6103
|
+
tools: Array.from(tools).sort(),
|
|
6104
|
+
toolCount: tools.size,
|
|
6105
|
+
}))
|
|
6106
|
+
.sort((a, b) => b.toolCount - a.toolCount);
|
|
6107
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
6108
|
+
res.end(JSON.stringify({
|
|
6109
|
+
summary: {
|
|
6110
|
+
totalTools,
|
|
6111
|
+
usedTools,
|
|
6112
|
+
unusedTools,
|
|
6113
|
+
},
|
|
6114
|
+
toolUsage,
|
|
6115
|
+
keyToolMap,
|
|
6116
|
+
generatedAt: new Date().toISOString(),
|
|
6117
|
+
}));
|
|
6118
|
+
}
|
|
6119
|
+
// ─── /admin/latency — Tool Latency Analysis ─────────────────────────────
|
|
6120
|
+
handleLatencyAnalysis(req, res) {
|
|
6121
|
+
if (!this.checkAdmin(req, res))
|
|
6122
|
+
return;
|
|
6123
|
+
// Only count allowed calls from request log
|
|
6124
|
+
const allowed = this.requestLog.filter(e => e.status === 'allowed');
|
|
6125
|
+
if (allowed.length === 0) {
|
|
6126
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
6127
|
+
res.end(JSON.stringify({
|
|
6128
|
+
summary: { totalCalls: 0, avgDurationMs: 0, minDurationMs: 0, maxDurationMs: 0, p95DurationMs: 0 },
|
|
6129
|
+
byTool: [],
|
|
6130
|
+
slowestTools: [],
|
|
6131
|
+
byKey: [],
|
|
6132
|
+
generatedAt: new Date().toISOString(),
|
|
6133
|
+
}));
|
|
6134
|
+
return;
|
|
6135
|
+
}
|
|
6136
|
+
// ── Summary across all tools ──
|
|
6137
|
+
const allDurations = allowed.map(e => e.durationMs);
|
|
6138
|
+
const totalCalls = allowed.length;
|
|
6139
|
+
const avgDurationMs = Math.round(allDurations.reduce((a, b) => a + b, 0) / totalCalls);
|
|
6140
|
+
const minDurationMs = Math.min(...allDurations);
|
|
6141
|
+
const maxDurationMs = Math.max(...allDurations);
|
|
6142
|
+
const p95DurationMs = this.percentile(allDurations, 95);
|
|
6143
|
+
// ── Per-tool breakdown ──
|
|
6144
|
+
const toolMap = new Map();
|
|
6145
|
+
for (const e of allowed) {
|
|
6146
|
+
if (!toolMap.has(e.tool))
|
|
6147
|
+
toolMap.set(e.tool, []);
|
|
6148
|
+
toolMap.get(e.tool).push(e.durationMs);
|
|
6149
|
+
}
|
|
6150
|
+
const byTool = Array.from(toolMap.entries())
|
|
6151
|
+
.map(([tool, durations]) => ({
|
|
6152
|
+
tool,
|
|
6153
|
+
totalCalls: durations.length,
|
|
6154
|
+
avgDurationMs: Math.round(durations.reduce((a, b) => a + b, 0) / durations.length),
|
|
6155
|
+
minDurationMs: Math.min(...durations),
|
|
6156
|
+
maxDurationMs: Math.max(...durations),
|
|
6157
|
+
p95DurationMs: this.percentile(durations, 95),
|
|
6158
|
+
}))
|
|
6159
|
+
.sort((a, b) => b.avgDurationMs - a.avgDurationMs);
|
|
6160
|
+
// ── Slowest tools (top 10) ──
|
|
6161
|
+
const slowestTools = byTool.slice(0, 10).map(t => ({
|
|
6162
|
+
tool: t.tool,
|
|
6163
|
+
avgDurationMs: t.avgDurationMs,
|
|
6164
|
+
totalCalls: t.totalCalls,
|
|
6165
|
+
}));
|
|
6166
|
+
// ── Per-key breakdown ──
|
|
6167
|
+
// Build masked-key → name lookup from store
|
|
6168
|
+
const maskedToName = new Map();
|
|
6169
|
+
for (const rec of this.gate.store.getAllRecords()) {
|
|
6170
|
+
maskedToName.set((0, audit_1.maskKeyForAudit)(rec.key), rec.name);
|
|
6171
|
+
}
|
|
6172
|
+
const keyMap = new Map();
|
|
6173
|
+
for (const e of allowed) {
|
|
6174
|
+
const keyName = maskedToName.get(e.key) || e.key;
|
|
6175
|
+
if (!keyMap.has(keyName))
|
|
6176
|
+
keyMap.set(keyName, { keyName, durations: [] });
|
|
6177
|
+
keyMap.get(keyName).durations.push(e.durationMs);
|
|
6178
|
+
}
|
|
6179
|
+
const byKey = Array.from(keyMap.values())
|
|
6180
|
+
.map(k => ({
|
|
6181
|
+
keyName: k.keyName,
|
|
6182
|
+
totalCalls: k.durations.length,
|
|
6183
|
+
avgDurationMs: Math.round(k.durations.reduce((a, b) => a + b, 0) / k.durations.length),
|
|
6184
|
+
minDurationMs: Math.min(...k.durations),
|
|
6185
|
+
maxDurationMs: Math.max(...k.durations),
|
|
6186
|
+
}))
|
|
6187
|
+
.sort((a, b) => b.avgDurationMs - a.avgDurationMs);
|
|
6188
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
6189
|
+
res.end(JSON.stringify({
|
|
6190
|
+
summary: { totalCalls, avgDurationMs, minDurationMs, maxDurationMs, p95DurationMs },
|
|
6191
|
+
byTool,
|
|
6192
|
+
slowestTools,
|
|
6193
|
+
byKey,
|
|
6194
|
+
generatedAt: new Date().toISOString(),
|
|
6195
|
+
}));
|
|
6196
|
+
}
|
|
6043
6197
|
// ─── /keys/notes — Timestamped notes on API keys ─────────────────────────
|
|
6044
6198
|
handleGetNotes(req, res) {
|
|
6045
6199
|
if (!this.checkAdmin(req, res))
|