@winstonsayno/mcp-gateway 2.4.0 → 2.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.
@@ -0,0 +1,341 @@
1
+ /**
2
+ * Edge gateway: a dependency-free, Fetch-API implementation of the gateway's
3
+ * HTTP surface for runtimes without Node's `http` / `child_process` —
4
+ * Cloudflare Workers, Deno, Bun (and Node via `serveNode`).
5
+ *
6
+ * Scope: remote upstreams over Streamable HTTP only (no stdio / WebSocket),
7
+ * API-key auth (plain or `sha256:` keys), per-server tool filters, the `/mcp`
8
+ * endpoint (stateless JSON responses: initialize, ping, tools/list,
9
+ * tools/call) and the REST subset `GET /api/v1/health`, `GET /api/v1/tools`,
10
+ * `POST /api/v1/tools/call`. Everything else stays in the full Node gateway.
11
+ *
12
+ * This module must not import Node built-ins.
13
+ *
14
+ * @module edge
15
+ */
16
+ import { globToRegExp } from '../utils/tool-filter.js';
17
+ export const EDGE_PROTOCOL_VERSION = '2025-06-18';
18
+ const SUPPORTED_VERSIONS = ['2025-06-18', '2025-03-26', '2024-11-05'];
19
+ const isObj = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
20
+ function allowed(name, f) {
21
+ if (!f)
22
+ return true;
23
+ if (f.allow && !f.allow.some((p) => globToRegExp(p).test(name)))
24
+ return false;
25
+ if (f.deny && f.deny.some((p) => globToRegExp(p).test(name)))
26
+ return false;
27
+ return true;
28
+ }
29
+ async function sha256Hex(s) {
30
+ const d = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(s));
31
+ return [...new Uint8Array(d)].map((b) => b.toString(16).padStart(2, '0')).join('');
32
+ }
33
+ function safeEqual(a, b) {
34
+ let diff = a.length ^ b.length;
35
+ for (let i = 0; i < Math.max(a.length, b.length); i++)
36
+ diff |= (a.charCodeAt(i) || 0) ^ (b.charCodeAt(i) || 0);
37
+ return diff === 0;
38
+ }
39
+ /** Parse a JSON or SSE MCP reply and return the JSON-RPC message with `id`. */
40
+ export async function readRpcReply(res, id) {
41
+ const type = res.headers.get('content-type') ?? '';
42
+ const text = await res.text();
43
+ if (type.includes('text/event-stream')) {
44
+ for (const block of text.split(/\r?\n\r?\n/)) {
45
+ const data = block
46
+ .split(/\r?\n/)
47
+ .filter((l) => l.startsWith('data:'))
48
+ .map((l) => l.slice(5).replace(/^ /, ''))
49
+ .join('\n');
50
+ if (!data)
51
+ continue;
52
+ try {
53
+ const msg = JSON.parse(data);
54
+ const list = Array.isArray(msg) ? msg : [msg];
55
+ const hit = list.find((m) => isObj(m) && m.id === id && ('result' in m || 'error' in m));
56
+ if (hit)
57
+ return hit;
58
+ }
59
+ catch {
60
+ /* keep scanning */
61
+ }
62
+ }
63
+ throw new Error('No response in event stream');
64
+ }
65
+ const msg = JSON.parse(text);
66
+ const list = Array.isArray(msg) ? msg : [msg];
67
+ const hit = list.find((m) => isObj(m) && m.id === id);
68
+ if (!hit)
69
+ throw new Error('No matching JSON-RPC response');
70
+ return hit;
71
+ }
72
+ class RpcError extends Error {
73
+ code;
74
+ data;
75
+ constructor(code, message, data) {
76
+ super(message);
77
+ this.code = code;
78
+ this.data = data;
79
+ }
80
+ }
81
+ /** Minimal Streamable HTTP MCP client for one upstream. */
82
+ export class EdgeUpstream {
83
+ cfg;
84
+ fetchImpl;
85
+ session;
86
+ seq = 0;
87
+ toolsCache;
88
+ constructor(cfg, fetchImpl) {
89
+ this.cfg = cfg;
90
+ this.fetchImpl = fetchImpl;
91
+ }
92
+ async post(body, sessionId, version = EDGE_PROTOCOL_VERSION) {
93
+ const headers = {
94
+ 'content-type': 'application/json',
95
+ accept: 'application/json, text/event-stream',
96
+ 'mcp-protocol-version': version,
97
+ ...(this.cfg.headers ?? {}),
98
+ };
99
+ if (sessionId)
100
+ headers['mcp-session-id'] = sessionId;
101
+ return this.fetchImpl(this.cfg.url, {
102
+ method: 'POST',
103
+ headers,
104
+ body: JSON.stringify(body),
105
+ signal: AbortSignal.timeout(this.cfg.timeoutMs ?? 30_000),
106
+ });
107
+ }
108
+ async init() {
109
+ if (this.session?.ready) {
110
+ await this.session.ready;
111
+ return this.session;
112
+ }
113
+ const s = { version: EDGE_PROTOCOL_VERSION };
114
+ this.session = s;
115
+ s.ready = (async () => {
116
+ const id = ++this.seq;
117
+ const res = await this.post({ jsonrpc: '2.0', id, method: 'initialize', params: { protocolVersion: EDGE_PROTOCOL_VERSION, capabilities: {}, clientInfo: { name: 'mcp-gateway-edge', version: '1' } } });
118
+ if (!res.ok)
119
+ throw new Error(`initialize failed: HTTP ${res.status}`);
120
+ s.id = res.headers.get('mcp-session-id') ?? undefined;
121
+ const reply = await readRpcReply(res, id);
122
+ if (reply.error)
123
+ throw new Error(`initialize failed: ${JSON.stringify(reply.error)}`);
124
+ const v = isObj(reply.result) && typeof reply.result.protocolVersion === 'string' ? reply.result.protocolVersion : EDGE_PROTOCOL_VERSION;
125
+ s.version = v;
126
+ const n = await this.post({ jsonrpc: '2.0', method: 'notifications/initialized' }, s.id, v);
127
+ await n.body?.cancel().catch(() => undefined);
128
+ })();
129
+ try {
130
+ await s.ready;
131
+ }
132
+ catch (err) {
133
+ this.session = undefined;
134
+ throw err;
135
+ }
136
+ return s;
137
+ }
138
+ async request(method, params, retried = false) {
139
+ const s = await this.init();
140
+ const id = ++this.seq;
141
+ const res = await this.post({ jsonrpc: '2.0', id, method, ...(params ? { params } : {}) }, s.id, s.version);
142
+ if (res.status === 404 && s.id && !retried) {
143
+ // Session expired upstream: start a new one once.
144
+ this.session = undefined;
145
+ return this.request(method, params, true);
146
+ }
147
+ if (!res.ok)
148
+ throw new RpcError(-32000, `Upstream "${this.cfg.id}" HTTP ${res.status}`);
149
+ const reply = await readRpcReply(res, id);
150
+ if (isObj(reply.error))
151
+ throw new RpcError(Number(reply.error.code ?? -32603), String(reply.error.message ?? 'error'), reply.error.data);
152
+ return reply.result;
153
+ }
154
+ async tools(maxAgeMs = 30_000) {
155
+ if (this.toolsCache && Date.now() - this.toolsCache.at < maxAgeMs)
156
+ return this.toolsCache.tools;
157
+ const all = [];
158
+ let cursor;
159
+ for (let page = 0; page < 50; page++) {
160
+ const r = (await this.request('tools/list', cursor ? { cursor } : undefined));
161
+ all.push(...(r?.tools ?? []));
162
+ cursor = r?.nextCursor;
163
+ if (!cursor)
164
+ break;
165
+ }
166
+ const tools = all.filter((t) => allowed(t.name, this.cfg.tools));
167
+ this.toolsCache = { at: Date.now(), tools };
168
+ return tools;
169
+ }
170
+ }
171
+ /** Build the edge gateway's Fetch handler. */
172
+ export function createEdgeGateway(config) {
173
+ const fetchImpl = config.fetch ?? ((...a) => fetch(...a));
174
+ const upstreams = new Map(config.servers.map((s) => [s.id, new EdgeUpstream(s, fetchImpl)]));
175
+ const mcpPath = config.mcpPath ?? '/mcp';
176
+ const keys = (config.apiKeys ?? []).filter(Boolean);
177
+ const json = (status, body, extra = {}) => new Response(JSON.stringify(body), { status, headers: { 'content-type': 'application/json', ...extra } });
178
+ async function authorized(req) {
179
+ if (keys.length === 0)
180
+ return true;
181
+ const h = req.headers.get('authorization') ?? '';
182
+ const token = /^Bearer\s+(.+)$/i.exec(h)?.[1]?.trim() ?? req.headers.get('x-api-key') ?? '';
183
+ if (!token)
184
+ return false;
185
+ const digest = keys.some((k) => k.startsWith('sha256:')) ? await sha256Hex(token) : '';
186
+ return keys.some((k) => (k.startsWith('sha256:') ? safeEqual(`sha256:${digest}`, k.toLowerCase()) : safeEqual(token, k)));
187
+ }
188
+ async function index() {
189
+ const errors = {};
190
+ const per = await Promise.all([...upstreams.values()].map(async (u) => {
191
+ try {
192
+ return (await u.tools()).map((tool) => ({ serverId: u.cfg.id, tool }));
193
+ }
194
+ catch (err) {
195
+ errors[u.cfg.id] = err instanceof Error ? err.message : String(err);
196
+ return [];
197
+ }
198
+ }));
199
+ const flat = per.flat();
200
+ const count = new Map();
201
+ for (const t of flat)
202
+ count.set(t.tool.name, (count.get(t.tool.name) ?? 0) + 1);
203
+ const list = flat.map((t) => ({
204
+ ...t,
205
+ exposed: config.toolNaming === 'prefix' || (count.get(t.tool.name) ?? 0) > 1 ? `${t.serverId}__${t.tool.name}` : t.tool.name,
206
+ }));
207
+ return { list, errors };
208
+ }
209
+ async function callTool(name, args, server) {
210
+ const { list } = await index();
211
+ const hit = server ? list.find((t) => t.serverId === server && t.tool.name === name) : list.find((t) => t.exposed === name) ?? list.find((t) => t.tool.name === name);
212
+ if (!hit)
213
+ throw new RpcError(-32602, `Unknown tool: ${name}`);
214
+ const result = await upstreams.get(hit.serverId).request('tools/call', { name: hit.tool.name, arguments: args });
215
+ return { serverId: hit.serverId, result };
216
+ }
217
+ function cors(req, res) {
218
+ const origin = req.headers.get('origin');
219
+ const allowedOrigins = config.corsOrigins ?? [];
220
+ if (origin && (allowedOrigins.includes('*') || allowedOrigins.includes(origin))) {
221
+ res.headers.set('access-control-allow-origin', allowedOrigins.includes('*') ? '*' : origin);
222
+ res.headers.set('access-control-allow-headers', 'authorization, content-type, mcp-session-id, mcp-protocol-version, x-api-key');
223
+ res.headers.set('access-control-allow-methods', 'GET, POST, DELETE, OPTIONS');
224
+ res.headers.set('access-control-expose-headers', 'mcp-session-id');
225
+ res.headers.append('vary', 'Origin');
226
+ }
227
+ return res;
228
+ }
229
+ async function handleRpc(msg) {
230
+ const id = msg.id;
231
+ const method = typeof msg.method === 'string' ? msg.method : '';
232
+ if (id === undefined)
233
+ return undefined; // notification
234
+ const ok = (result) => ({ jsonrpc: '2.0', id, result });
235
+ try {
236
+ switch (method) {
237
+ case 'initialize': {
238
+ const asked = isObj(msg.params) && typeof msg.params.protocolVersion === 'string' ? msg.params.protocolVersion : EDGE_PROTOCOL_VERSION;
239
+ return ok({
240
+ protocolVersion: SUPPORTED_VERSIONS.includes(asked) ? asked : EDGE_PROTOCOL_VERSION,
241
+ capabilities: { tools: { listChanged: false } },
242
+ serverInfo: { name: config.name ?? 'mcp-gateway-edge', version: config.version ?? '1' },
243
+ });
244
+ }
245
+ case 'ping':
246
+ return ok({});
247
+ case 'tools/list': {
248
+ const { list } = await index();
249
+ return ok({ tools: list.map((t) => ({ ...t.tool, name: t.exposed })) });
250
+ }
251
+ case 'tools/call': {
252
+ const p = isObj(msg.params) ? msg.params : {};
253
+ if (typeof p.name !== 'string')
254
+ throw new RpcError(-32602, 'params.name is required');
255
+ const r = await callTool(p.name, isObj(p.arguments) ? p.arguments : {});
256
+ return ok(r.result);
257
+ }
258
+ default:
259
+ throw new RpcError(-32601, `Method not supported by the edge gateway: ${method}`);
260
+ }
261
+ }
262
+ catch (err) {
263
+ const e = err instanceof RpcError ? err : new RpcError(-32603, err instanceof Error ? err.message : String(err));
264
+ return { jsonrpc: '2.0', id, error: { code: e.code, message: e.message, ...(e.data !== undefined ? { data: e.data } : {}) } };
265
+ }
266
+ }
267
+ async function route(req) {
268
+ const url = new URL(req.url);
269
+ const path = url.pathname.replace(/\/+$/, '') || '/';
270
+ if (req.method === 'OPTIONS')
271
+ return new Response(null, { status: 204 });
272
+ if (path === '/' && req.method === 'GET')
273
+ return json(200, { name: 'mcp-gateway (edge)', mcp: mcpPath, servers: upstreams.size });
274
+ if (path === '/api/v1/health/live')
275
+ return json(200, { status: 'ok' });
276
+ if (!(await authorized(req)))
277
+ return json(401, { error: 'Unauthorized', message: 'missing or invalid API key' }, { 'www-authenticate': 'Bearer' });
278
+ if (path === mcpPath) {
279
+ if (req.method === 'GET')
280
+ return json(405, { error: 'Method Not Allowed', message: 'The edge gateway does not offer a server-to-client stream' }, { allow: 'POST, DELETE' });
281
+ if (req.method === 'DELETE')
282
+ return new Response(null, { status: 204 });
283
+ if (req.method !== 'POST')
284
+ return json(405, { error: 'Method Not Allowed' }, { allow: 'POST, DELETE' });
285
+ let body;
286
+ try {
287
+ body = await req.json();
288
+ }
289
+ catch {
290
+ return json(400, { jsonrpc: '2.0', id: null, error: { code: -32700, message: 'Parse error' } });
291
+ }
292
+ const batch = Array.isArray(body);
293
+ const msgs = (batch ? body : [body]);
294
+ if (msgs.length === 0 || !msgs.every(isObj))
295
+ return json(400, { jsonrpc: '2.0', id: null, error: { code: -32600, message: 'Invalid Request' } });
296
+ const out = (await Promise.all(msgs.map((m) => handleRpc(m)))).filter((m) => m !== undefined);
297
+ if (out.length === 0)
298
+ return new Response(null, { status: 202 });
299
+ return json(200, batch ? out : out[0]);
300
+ }
301
+ if (path === '/api/v1/health' && req.method === 'GET') {
302
+ const { list, errors } = await index();
303
+ const down = Object.keys(errors).length;
304
+ return json(down === 0 ? 200 : 207, { status: down === 0 ? 'healthy' : down === upstreams.size ? 'unhealthy' : 'degraded', runtime: 'edge', servers: { total: upstreams.size, online: upstreams.size - down, offline: down, totalTools: list.length }, errors });
305
+ }
306
+ if (path === '/api/v1/tools' && req.method === 'GET') {
307
+ const { list } = await index();
308
+ const server = url.searchParams.get('server');
309
+ const tools = list.filter((t) => !server || t.serverId === server).map((t) => ({ ...t.tool, serverId: t.serverId, serverName: upstreams.get(t.serverId).cfg.name ?? t.serverId, exposedName: t.exposed }));
310
+ return json(200, { tools, total: tools.length });
311
+ }
312
+ if (path === '/api/v1/tools/call' && req.method === 'POST') {
313
+ let b;
314
+ try {
315
+ b = await req.json();
316
+ }
317
+ catch {
318
+ return json(400, { error: 'Bad Request', message: 'Invalid JSON body' });
319
+ }
320
+ if (!isObj(b) || typeof b.tool !== 'string')
321
+ return json(400, { error: 'Bad Request', message: '"tool" is required' });
322
+ const started = Date.now();
323
+ try {
324
+ const r = await callTool(b.tool, isObj(b.arguments) ? b.arguments : {}, typeof b.server === 'string' ? b.server : undefined);
325
+ return json(200, { result: r.result, server: r.serverId, tool: b.tool, durationMs: Date.now() - started });
326
+ }
327
+ catch (err) {
328
+ const e = err instanceof RpcError ? err : new RpcError(-32603, err instanceof Error ? err.message : String(err));
329
+ return json(e.code === -32602 ? 404 : 502, { error: e.code === -32602 ? 'Not Found' : 'Bad Gateway', message: e.message, code: e.code });
330
+ }
331
+ }
332
+ return json(404, { error: 'Not Found' });
333
+ }
334
+ return {
335
+ upstreams,
336
+ async fetch(request) {
337
+ return cors(request, await route(request));
338
+ },
339
+ };
340
+ }
341
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/edge/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/gateway/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/gateway/api.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,7 @@ import { VERSION } from '../utils/version.js';
17
17
  import { redactArgs } from '../security/redact.js';
18
18
  import { withTenantScope, canCall, highestRole, roleIn, ROLE_RANK } from '../auth/tenants.js';
19
19
  import { globToRegExp } from '../utils/tool-filter.js';
20
+ import { ERR_QUOTA_EXCEEDED, usageCsv } from './usage.js';
20
21
  import { ToolInvoker, POLICY_ERROR_CODES, ERR_OUTPUT_BLOCKED } from './invoker.js';
21
22
  import { ApprovalError } from '../policy/approvals.js';
22
23
  /** Whether `args` serialise to more than `limit` bytes (0 / undefined = no limit). */
@@ -208,7 +209,7 @@ export function createApiRouter(config, registry, proxy, metrics, options = {})
208
209
  lockout?.close();
209
210
  lockout = lockoutFor({ ...next, auth: nextAuth }, shared);
210
211
  }
211
- cfg = { ...cfg, auth: nextAuth, rateLimit: next.rateLimit, monitor: next.monitor, mcp: next.mcp, security: next.security, policy: next.policy, tenants: next.tenants, host: cfg.host };
212
+ cfg = { ...cfg, auth: nextAuth, rateLimit: next.rateLimit, monitor: next.monitor, mcp: next.mcp, security: next.security, policy: next.policy, tenants: next.tenants, quotas: next.quotas, host: cfg.host };
212
213
  invoker.refreshPolicy();
213
214
  };
214
215
  // ─── Security posture ───────────────────────────────────────────────────────
@@ -488,6 +489,14 @@ export function createApiRouter(config, registry, proxy, metrics, options = {})
488
489
  return;
489
490
  if (result.traceparent)
490
491
  res.set('traceparent', result.traceparent);
492
+ if (!result.success && result.error?.code === ERR_QUOTA_EXCEEDED) {
493
+ const data = result.error.data;
494
+ const reset = data?.resetsAt ? Date.parse(data.resetsAt) : NaN;
495
+ if (Number.isFinite(reset))
496
+ res.set('Retry-After', String(Math.max(1, Math.ceil((reset - Date.now()) / 1000))));
497
+ res.status(429).json({ error: 'Too Many Requests', message: result.error.message, code: result.error.code, quota: result.error.data });
498
+ return;
499
+ }
491
500
  if (!result.success && result.error && POLICY_ERROR_CODES.has(result.error.code)) {
492
501
  res.status(result.error.code === ERR_OUTPUT_BLOCKED ? 502 : 403).json({
493
502
  error: result.error.code === ERR_OUTPUT_BLOCKED ? 'Tool Output Blocked' : 'Forbidden',
@@ -782,6 +791,57 @@ export function createApiRouter(config, registry, proxy, metrics, options = {})
782
791
  options.onTenantsChanged?.();
783
792
  res.json(tenantView(t, roleIn(t, req.clientId), isOperator(req)));
784
793
  });
794
+ // ─── Usage metering + quotas ───────────────────────────────────────────────
795
+ /** Tenant filter for the caller: operators any (or none); tenant admins / owners only their tenants. */
796
+ const usageTenant = (req, res) => {
797
+ const q = typeof req.query.tenant === 'string' && req.query.tenant ? req.query.tenant : undefined;
798
+ if (isOperator(req))
799
+ return { ok: true, tenant: q };
800
+ const admin = (scopeOf(req)?.tenants ?? []).filter((t) => ROLE_RANK[t.role] >= ROLE_RANK.admin).map((t) => t.id);
801
+ const tenant = q ?? admin[0];
802
+ if (!tenant || !admin.includes(tenant)) {
803
+ res.status(403).json({ error: 'Forbidden', message: 'Usage is available to operators and tenant admins / owners' });
804
+ return { ok: false };
805
+ }
806
+ return { ok: true, tenant };
807
+ };
808
+ const GROUPS = ['client', 'tenant', 'server', 'tool', 'hour', 'day'];
809
+ router.get('/usage', auth, (req, res) => {
810
+ const scope = usageTenant(req, res);
811
+ if (!scope.ok)
812
+ return;
813
+ const time = (k) => {
814
+ const v = typeof req.query[k] === 'string' ? req.query[k] : '';
815
+ if (!v)
816
+ return undefined;
817
+ const t = /^\d+$/.test(v) ? Number(v) : Date.parse(v);
818
+ return Number.isFinite(t) ? t : undefined;
819
+ };
820
+ const group = (typeof req.query.group === 'string' ? req.query.group.split(',') : ['client']).filter((g) => GROUPS.includes(g));
821
+ const rows = invoker.usage?.report({
822
+ since: time('since'),
823
+ until: time('until'),
824
+ group,
825
+ tenant: scope.tenant,
826
+ client: typeof req.query.client === 'string' && req.query.client ? req.query.client : undefined,
827
+ server: typeof req.query.server === 'string' && req.query.server ? req.query.server : undefined,
828
+ }) ?? [];
829
+ if (req.query.format === 'csv') {
830
+ res.set('Content-Type', 'text/csv; charset=utf-8').set('Content-Disposition', 'attachment; filename="mcp-gateway-usage.csv"').send(usageCsv(rows, group));
831
+ return;
832
+ }
833
+ res.json({ group: group.length ? group : ['client'], rows, generatedAt: new Date().toISOString() });
834
+ });
835
+ router.get('/quotas', auth, (req, res) => {
836
+ const scope = usageTenant(req, res);
837
+ if (!scope.ok)
838
+ return;
839
+ const all = invoker.usage?.quotaStatus() ?? [];
840
+ res.json({
841
+ rules: cfg.quotas?.rules ?? [],
842
+ usage: isOperator(req) && !scope.tenant ? all : all.filter((u) => u.subject === `tenant:${scope.tenant}`),
843
+ });
844
+ });
785
845
  // ─── Catalog (operator) ─────────────────────────────────────────────────────
786
846
  router.get('/catalog', auth, (req, res) => {
787
847
  if (!operatorOnly(req, res))