paygate-mcp 1.8.0 → 2.0.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/dist/teams.js ADDED
@@ -0,0 +1,328 @@
1
+ "use strict";
2
+ /**
3
+ * Teams — Organize API keys into teams with shared budgets and quotas.
4
+ *
5
+ * Teams provide:
6
+ * - Shared credit budget (team-level spending cap)
7
+ * - Team-level usage quotas (daily/monthly call + credit limits)
8
+ * - Aggregate usage tracking across all keys in the team
9
+ * - Key membership management (assign/remove keys)
10
+ * - Team metadata for external system integration
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.TeamManager = void 0;
14
+ const crypto_1 = require("crypto");
15
+ // ─── TeamManager ────────────────────────────────────────────────────────────
16
+ class TeamManager {
17
+ teams = new Map();
18
+ /** Reverse index: key → teamId for fast lookup */
19
+ keyToTeam = new Map();
20
+ /**
21
+ * Generate a team ID.
22
+ */
23
+ generateId() {
24
+ return `team_${(0, crypto_1.randomBytes)(8).toString('hex')}`;
25
+ }
26
+ /**
27
+ * Create a new team.
28
+ */
29
+ createTeam(params) {
30
+ const id = this.generateId();
31
+ const now = new Date();
32
+ const team = {
33
+ id,
34
+ name: String(params.name).trim().slice(0, 200),
35
+ description: String(params.description || '').trim().slice(0, 1000),
36
+ memberKeys: [],
37
+ budget: Math.max(0, Math.floor(params.budget || 0)),
38
+ totalSpent: 0,
39
+ quota: params.quota,
40
+ quotaDailyCalls: 0,
41
+ quotaMonthlyCalls: 0,
42
+ quotaDailyCredits: 0,
43
+ quotaMonthlyCredits: 0,
44
+ quotaLastResetDay: now.toISOString().slice(0, 10),
45
+ quotaLastResetMonth: now.toISOString().slice(0, 7),
46
+ tags: this.sanitizeTags(params.tags || {}),
47
+ createdAt: now.toISOString(),
48
+ active: true,
49
+ };
50
+ this.teams.set(id, team);
51
+ return team;
52
+ }
53
+ /**
54
+ * Get a team by ID.
55
+ */
56
+ getTeam(teamId) {
57
+ return this.teams.get(teamId) || null;
58
+ }
59
+ /**
60
+ * List all active teams.
61
+ */
62
+ listTeams() {
63
+ return Array.from(this.teams.values()).filter(t => t.active);
64
+ }
65
+ /**
66
+ * Update team properties.
67
+ */
68
+ updateTeam(teamId, updates) {
69
+ const team = this.teams.get(teamId);
70
+ if (!team || !team.active)
71
+ return false;
72
+ if (updates.name !== undefined) {
73
+ team.name = String(updates.name).trim().slice(0, 200);
74
+ }
75
+ if (updates.description !== undefined) {
76
+ team.description = String(updates.description).trim().slice(0, 1000);
77
+ }
78
+ if (updates.budget !== undefined) {
79
+ team.budget = Math.max(0, Math.floor(updates.budget));
80
+ }
81
+ if (updates.quota !== undefined) {
82
+ team.quota = updates.quota === null ? undefined : updates.quota;
83
+ }
84
+ if (updates.tags) {
85
+ // Merge semantics: null values remove tags
86
+ for (const [k, v] of Object.entries(updates.tags)) {
87
+ if (v === null) {
88
+ delete team.tags[k];
89
+ }
90
+ else {
91
+ team.tags[String(k).slice(0, 100)] = String(v).slice(0, 100);
92
+ }
93
+ }
94
+ // Enforce max 50 tags
95
+ const entries = Object.entries(team.tags);
96
+ if (entries.length > 50) {
97
+ team.tags = Object.fromEntries(entries.slice(0, 50));
98
+ }
99
+ }
100
+ return true;
101
+ }
102
+ /**
103
+ * Delete (deactivate) a team. Keys are unassigned.
104
+ */
105
+ deleteTeam(teamId) {
106
+ const team = this.teams.get(teamId);
107
+ if (!team || !team.active)
108
+ return false;
109
+ // Unassign all keys
110
+ for (const key of team.memberKeys) {
111
+ this.keyToTeam.delete(key);
112
+ }
113
+ team.memberKeys = [];
114
+ team.active = false;
115
+ return true;
116
+ }
117
+ /**
118
+ * Assign an API key to a team. A key can only belong to one team.
119
+ */
120
+ assignKey(teamId, apiKey) {
121
+ const team = this.teams.get(teamId);
122
+ if (!team || !team.active) {
123
+ return { success: false, error: 'team_not_found' };
124
+ }
125
+ // Check if key already in another team
126
+ const existingTeam = this.keyToTeam.get(apiKey);
127
+ if (existingTeam && existingTeam !== teamId) {
128
+ return { success: false, error: 'key_already_in_team' };
129
+ }
130
+ // Already in this team
131
+ if (team.memberKeys.includes(apiKey)) {
132
+ return { success: true };
133
+ }
134
+ // Max 100 keys per team
135
+ if (team.memberKeys.length >= 100) {
136
+ return { success: false, error: 'team_full' };
137
+ }
138
+ team.memberKeys.push(apiKey);
139
+ this.keyToTeam.set(apiKey, teamId);
140
+ return { success: true };
141
+ }
142
+ /**
143
+ * Remove an API key from its team.
144
+ */
145
+ removeKey(teamId, apiKey) {
146
+ const team = this.teams.get(teamId);
147
+ if (!team)
148
+ return false;
149
+ const idx = team.memberKeys.indexOf(apiKey);
150
+ if (idx === -1)
151
+ return false;
152
+ team.memberKeys.splice(idx, 1);
153
+ this.keyToTeam.delete(apiKey);
154
+ return true;
155
+ }
156
+ /**
157
+ * Get the team ID for a given API key (if assigned).
158
+ */
159
+ getTeamForKey(apiKey) {
160
+ return this.keyToTeam.get(apiKey) || null;
161
+ }
162
+ /**
163
+ * Check team-level budget. Returns true if team has budget remaining.
164
+ * Returns true if key is not in a team (no team budget constraint).
165
+ */
166
+ checkBudget(apiKey, creditsNeeded) {
167
+ const teamId = this.keyToTeam.get(apiKey);
168
+ if (!teamId)
169
+ return { allowed: true };
170
+ const team = this.teams.get(teamId);
171
+ if (!team || !team.active)
172
+ return { allowed: true };
173
+ // Budget of 0 = unlimited
174
+ if (team.budget === 0)
175
+ return { allowed: true };
176
+ if (team.totalSpent + creditsNeeded > team.budget) {
177
+ return { allowed: false, reason: 'team_budget_exceeded' };
178
+ }
179
+ return { allowed: true };
180
+ }
181
+ /**
182
+ * Check team-level quotas. Returns true if within quota.
183
+ * Returns true if key is not in a team (no team quota constraint).
184
+ */
185
+ checkQuota(apiKey, credits) {
186
+ const teamId = this.keyToTeam.get(apiKey);
187
+ if (!teamId)
188
+ return { allowed: true };
189
+ const team = this.teams.get(teamId);
190
+ if (!team || !team.active || !team.quota)
191
+ return { allowed: true };
192
+ // Reset counters if needed
193
+ this.resetQuotaCounters(team);
194
+ const q = team.quota;
195
+ if (q.dailyCallLimit > 0 && team.quotaDailyCalls >= q.dailyCallLimit) {
196
+ return { allowed: false, reason: 'team_daily_call_limit' };
197
+ }
198
+ if (q.monthlyCallLimit > 0 && team.quotaMonthlyCalls >= q.monthlyCallLimit) {
199
+ return { allowed: false, reason: 'team_monthly_call_limit' };
200
+ }
201
+ if (q.dailyCreditLimit > 0 && team.quotaDailyCredits + credits > q.dailyCreditLimit) {
202
+ return { allowed: false, reason: 'team_daily_credit_limit' };
203
+ }
204
+ if (q.monthlyCreditLimit > 0 && team.quotaMonthlyCredits + credits > q.monthlyCreditLimit) {
205
+ return { allowed: false, reason: 'team_monthly_credit_limit' };
206
+ }
207
+ return { allowed: true };
208
+ }
209
+ /**
210
+ * Record a tool call against team counters.
211
+ */
212
+ recordUsage(apiKey, credits) {
213
+ const teamId = this.keyToTeam.get(apiKey);
214
+ if (!teamId)
215
+ return;
216
+ const team = this.teams.get(teamId);
217
+ if (!team || !team.active)
218
+ return;
219
+ this.resetQuotaCounters(team);
220
+ team.totalSpent += credits;
221
+ team.quotaDailyCalls += 1;
222
+ team.quotaMonthlyCalls += 1;
223
+ team.quotaDailyCredits += credits;
224
+ team.quotaMonthlyCredits += credits;
225
+ }
226
+ /**
227
+ * Get team usage summary including per-member breakdown.
228
+ */
229
+ getUsageSummary(teamId, getKey) {
230
+ const team = this.teams.get(teamId);
231
+ if (!team)
232
+ return null;
233
+ const members = team.memberKeys
234
+ .map(key => {
235
+ const record = getKey(key);
236
+ if (!record)
237
+ return null;
238
+ return {
239
+ keyMasked: key.slice(0, 7) + '...' + key.slice(-4),
240
+ name: record.name,
241
+ credits: record.credits,
242
+ totalSpent: record.totalSpent,
243
+ totalCalls: record.totalCalls,
244
+ };
245
+ })
246
+ .filter((m) => m !== null);
247
+ return {
248
+ teamId: team.id,
249
+ teamName: team.name,
250
+ memberCount: team.memberKeys.length,
251
+ totalBudget: team.budget,
252
+ totalSpent: team.totalSpent,
253
+ remainingBudget: team.budget > 0 ? Math.max(0, team.budget - team.totalSpent) : 0,
254
+ members,
255
+ };
256
+ }
257
+ /**
258
+ * Reset quota counters if day/month has changed.
259
+ */
260
+ resetQuotaCounters(team) {
261
+ const now = new Date();
262
+ const today = now.toISOString().slice(0, 10);
263
+ const month = now.toISOString().slice(0, 7);
264
+ if (team.quotaLastResetDay !== today) {
265
+ team.quotaDailyCalls = 0;
266
+ team.quotaDailyCredits = 0;
267
+ team.quotaLastResetDay = today;
268
+ }
269
+ if (team.quotaLastResetMonth !== month) {
270
+ team.quotaMonthlyCalls = 0;
271
+ team.quotaMonthlyCredits = 0;
272
+ team.quotaLastResetMonth = month;
273
+ }
274
+ }
275
+ /**
276
+ * Sanitize tags: max 50 entries, max 100 chars per key/value.
277
+ */
278
+ sanitizeTags(tags) {
279
+ const result = {};
280
+ const entries = Object.entries(tags).slice(0, 50);
281
+ for (const [k, v] of entries) {
282
+ result[String(k).slice(0, 100)] = String(v).slice(0, 100);
283
+ }
284
+ return result;
285
+ }
286
+ // ─── Serialization (for state persistence) ───────────────────────────────
287
+ /**
288
+ * Export teams state for persistence.
289
+ */
290
+ toJSON() {
291
+ return Array.from(this.teams.entries());
292
+ }
293
+ /**
294
+ * Import teams state from persistence.
295
+ */
296
+ fromJSON(data) {
297
+ for (const [id, team] of data) {
298
+ if (id && team && typeof team.id === 'string') {
299
+ // Backfill defaults
300
+ if (!team.tags || typeof team.tags !== 'object')
301
+ team.tags = {};
302
+ if (team.quotaDailyCalls === undefined)
303
+ team.quotaDailyCalls = 0;
304
+ if (team.quotaMonthlyCalls === undefined)
305
+ team.quotaMonthlyCalls = 0;
306
+ if (team.quotaDailyCredits === undefined)
307
+ team.quotaDailyCredits = 0;
308
+ if (team.quotaMonthlyCredits === undefined)
309
+ team.quotaMonthlyCredits = 0;
310
+ if (!team.quotaLastResetDay)
311
+ team.quotaLastResetDay = new Date().toISOString().slice(0, 10);
312
+ if (!team.quotaLastResetMonth)
313
+ team.quotaLastResetMonth = new Date().toISOString().slice(0, 7);
314
+ if (team.active === undefined)
315
+ team.active = true;
316
+ this.teams.set(id, team);
317
+ // Rebuild reverse index
318
+ if (Array.isArray(team.memberKeys)) {
319
+ for (const key of team.memberKeys) {
320
+ this.keyToTeam.set(key, id);
321
+ }
322
+ }
323
+ }
324
+ }
325
+ }
326
+ }
327
+ exports.TeamManager = TeamManager;
328
+ //# sourceMappingURL=teams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teams.js","sourceRoot":"","sources":["../src/teams.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "paygate-mcp",
3
- "version": "1.8.0",
3
+ "version": "2.0.0",
4
4
  "description": "Pay-per-tool-call gating proxy for MCP servers. Wrap any MCP server with API key auth, per-tool pricing, rate limiting, and usage metering.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -13,7 +13,7 @@
13
13
  },
14
14
  "scripts": {
15
15
  "build": "tsc -p tsconfig.build.json",
16
- "test": "jest --verbose",
16
+ "test": "jest --verbose --forceExit",
17
17
  "prepublishOnly": "npm run build"
18
18
  },
19
19
  "dependencies": {},