easyeda-mcp-pro 0.18.0 → 0.19.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,484 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { WebSocketServer } from 'ws';
3
+ import { z } from 'zod';
4
+ import { ApprovalStore, requiresApproval } from './approval-policy.js';
5
+ import { RemoteAuditLog } from './observability.js';
6
+ import { REMOTE_RELAY_PROTOCOL_VERSION, RemoteRiskLevelSchema, ToolResponseMessageSchema, RelayMessageSchema, } from './protocol.js';
7
+ import { checkRemoteScope } from './scope.js';
8
+ import { RemoteSessionRouter } from './session-router.js';
9
+ const RouteToolRequestSchema = z.object({
10
+ sessionId: z.string().min(1).optional(),
11
+ toolName: z.string().min(1),
12
+ riskLevel: RemoteRiskLevelSchema,
13
+ input: z.unknown().optional(),
14
+ approvalId: z.string().min(1).optional(),
15
+ deadlineMs: z.number().int().positive().optional(),
16
+ });
17
+ const CreatePairingCodeSchema = z.object({
18
+ sessionId: z.string().min(1).optional(),
19
+ ttlMs: z.number().int().positive().optional(),
20
+ });
21
+ const CompletePairingSchema = z.object({
22
+ code: z.string().min(1),
23
+ sessionId: z.string().min(1),
24
+ });
25
+ function stableStringify(value) {
26
+ if (Array.isArray(value))
27
+ return `[${value.map((item) => stableStringify(item)).join(',')}]`;
28
+ if (value && typeof value === 'object') {
29
+ const entries = Object.entries(value).sort(([a], [b]) => a.localeCompare(b));
30
+ return `{${entries.map(([key, child]) => `${JSON.stringify(key)}:${stableStringify(child)}`).join(',')}}`;
31
+ }
32
+ return JSON.stringify(value);
33
+ }
34
+ function defaultHashInput(value) {
35
+ return createHash('sha256')
36
+ .update(stableStringify(value ?? null))
37
+ .digest('hex');
38
+ }
39
+ function gatewayError(status, code, message) {
40
+ return { ok: false, status, code, message };
41
+ }
42
+ function scopeStringToList(value) {
43
+ if (typeof value === 'string')
44
+ return value.split(/[\s,]+/).filter(Boolean);
45
+ if (Array.isArray(value))
46
+ return value.flatMap((item) => scopeStringToList(item));
47
+ return [];
48
+ }
49
+ function normalizeScope(scope) {
50
+ return scope
51
+ .trim()
52
+ .replace(/^easyeda:/, 'easyeda.')
53
+ .replace('project-admin', 'project_admin');
54
+ }
55
+ export function identityFromRequest(req, res, config) {
56
+ const claims = res.locals.claims;
57
+ if (claims) {
58
+ const userId = typeof claims.sub === 'string'
59
+ ? claims.sub
60
+ : typeof claims.userId === 'string'
61
+ ? claims.userId
62
+ : undefined;
63
+ if (!userId)
64
+ return undefined;
65
+ const scopes = new Set();
66
+ for (const claim of ['scope', 'scp', 'permissions', 'roles']) {
67
+ for (const scope of scopeStringToList(claims[claim]))
68
+ scopes.add(normalizeScope(scope));
69
+ }
70
+ const exp = typeof claims.exp === 'number' ? new Date(claims.exp * 1000) : undefined;
71
+ return { userId, scopes: [...scopes], expiresAt: exp };
72
+ }
73
+ if (config.OAUTH_ENABLED || config.NODE_ENV === 'production')
74
+ return undefined;
75
+ const userId = req.header('x-remote-user-id');
76
+ if (!userId)
77
+ return undefined;
78
+ const scopes = (req.header('x-remote-scopes') ?? 'easyeda.read')
79
+ .split(/[\s,]+/)
80
+ .map(normalizeScope)
81
+ .filter(Boolean);
82
+ const expiresAtHeader = req.header('x-remote-expires-at');
83
+ const expiresAt = expiresAtHeader ? new Date(expiresAtHeader) : undefined;
84
+ return { userId, scopes: scopes, expiresAt };
85
+ }
86
+ export class RemoteGateway {
87
+ router;
88
+ approvals;
89
+ audit;
90
+ connections = new Map();
91
+ now;
92
+ makeId;
93
+ hashInput;
94
+ wsAttached = false;
95
+ constructor(options = {}) {
96
+ this.now = options.now ?? (() => new Date());
97
+ this.makeId = options.makeId ?? (() => randomUUID());
98
+ this.hashInput = options.hashInput ?? defaultHashInput;
99
+ this.router = options.router ?? new RemoteSessionRouter(this.now, this.makeId);
100
+ this.approvals = options.approvals ?? new ApprovalStore();
101
+ this.audit = options.audit ?? new RemoteAuditLog();
102
+ }
103
+ registerExtension(input) {
104
+ const session = this.router.registerSession(input);
105
+ this.connections.set(session.sessionId, {
106
+ sessionId: session.sessionId,
107
+ dispatch: input.dispatch,
108
+ });
109
+ if (input.pairingCode)
110
+ this.router.completePairingByCode(input.pairingCode, session.sessionId);
111
+ this.audit.record({
112
+ event: 'remote.session.registered',
113
+ mode: session.mode,
114
+ sessionId: session.sessionId,
115
+ connectionId: session.connectionId,
116
+ });
117
+ if (session.userId) {
118
+ this.audit.record({
119
+ event: 'remote.session.paired',
120
+ mode: session.mode,
121
+ userId: session.userId,
122
+ sessionId: session.sessionId,
123
+ });
124
+ }
125
+ return session;
126
+ }
127
+ createPairingCode(input) {
128
+ return this.router.createPairingCode({
129
+ userId: input.identity.userId,
130
+ sessionId: input.sessionId,
131
+ ttlMs: input.ttlMs,
132
+ });
133
+ }
134
+ completePairing(input) {
135
+ const paired = this.router.completePairing({
136
+ code: input.code,
137
+ userId: input.identity.userId,
138
+ sessionId: input.sessionId,
139
+ });
140
+ const session = this.router.getSession(input.sessionId);
141
+ if (paired && session) {
142
+ this.audit.record({
143
+ event: 'remote.session.paired',
144
+ mode: session.mode,
145
+ userId: input.identity.userId,
146
+ sessionId: input.sessionId,
147
+ });
148
+ }
149
+ return paired;
150
+ }
151
+ disconnect(sessionId) {
152
+ const session = this.router.getSession(sessionId);
153
+ this.router.disconnect(sessionId);
154
+ this.connections.delete(sessionId);
155
+ if (session) {
156
+ this.audit.record({
157
+ event: 'remote.session.disconnected',
158
+ mode: session.mode,
159
+ userId: session.userId,
160
+ sessionId,
161
+ });
162
+ }
163
+ }
164
+ async routeToolRequest(input) {
165
+ const scope = checkRemoteScope(input.identity, input.riskLevel, this.now());
166
+ if (!scope.ok) {
167
+ this.audit.record({
168
+ event: 'remote.identity.rejected',
169
+ mode: 'hosted',
170
+ userId: input.identity?.userId,
171
+ sessionId: input.sessionId,
172
+ toolName: input.toolName,
173
+ riskLevel: input.riskLevel,
174
+ status: 'rejected',
175
+ errorCode: scope.code,
176
+ });
177
+ return gatewayError(scope.code === 'SCOPE_MISSING' ? 403 : 401, scope.code, scope.message);
178
+ }
179
+ const identity = input.identity;
180
+ if (!identity) {
181
+ return gatewayError(401, 'IDENTITY_MISSING', 'Remote identity is required.');
182
+ }
183
+ const route = this.router.resolve({
184
+ userId: identity.userId,
185
+ riskLevel: input.riskLevel,
186
+ sessionId: input.sessionId,
187
+ });
188
+ if (!route.ok) {
189
+ const status = route.code === 'SESSION_AMBIGUOUS' ? 409 : route.code === 'SESSION_EXPIRED' ? 410 : 404;
190
+ return gatewayError(status, route.code, route.message);
191
+ }
192
+ const inputHash = this.hashInput(input.input);
193
+ if (requiresApproval(input.riskLevel)) {
194
+ if (!input.approvalId) {
195
+ return gatewayError(403, 'APPROVAL_REQUIRED', 'Remote tool request requires approval.');
196
+ }
197
+ const approved = this.approvals.consumeApproved({
198
+ approvalId: input.approvalId,
199
+ userId: identity.userId,
200
+ sessionId: route.session.sessionId,
201
+ toolName: input.toolName,
202
+ inputHash,
203
+ now: this.now(),
204
+ });
205
+ if (!approved) {
206
+ return gatewayError(403, 'APPROVAL_NOT_APPROVED', 'Remote approval is missing or invalid.');
207
+ }
208
+ }
209
+ const connection = this.connections.get(route.session.sessionId);
210
+ if (!connection) {
211
+ this.router.disconnect(route.session.sessionId);
212
+ return gatewayError(424, 'SESSION_DISCONNECTED', 'Paired EasyEDA extension is disconnected.');
213
+ }
214
+ const request = {
215
+ protocolVersion: REMOTE_RELAY_PROTOCOL_VERSION,
216
+ type: 'tool_request',
217
+ messageId: `msg_${this.makeId()}`,
218
+ sessionId: route.session.sessionId,
219
+ timestamp: this.now().toISOString(),
220
+ toolName: input.toolName,
221
+ riskLevel: input.riskLevel,
222
+ requiresApproval: requiresApproval(input.riskLevel),
223
+ input: input.input,
224
+ inputHash,
225
+ activeProjectHint: route.session.activeProject,
226
+ deadlineMs: input.deadlineMs,
227
+ };
228
+ this.audit.record({
229
+ event: 'remote.tool.requested',
230
+ mode: route.session.mode,
231
+ userId: identity.userId,
232
+ sessionId: route.session.sessionId,
233
+ toolName: input.toolName,
234
+ riskLevel: input.riskLevel,
235
+ inputHash,
236
+ });
237
+ const startedAt = Date.now();
238
+ try {
239
+ this.audit.record({
240
+ event: 'remote.tool.dispatched',
241
+ mode: route.session.mode,
242
+ userId: identity.userId,
243
+ sessionId: route.session.sessionId,
244
+ toolName: input.toolName,
245
+ riskLevel: input.riskLevel,
246
+ inputHash,
247
+ });
248
+ const response = ToolResponseMessageSchema.parse(await connection.dispatch(request));
249
+ if (!response.ok) {
250
+ this.audit.record({
251
+ event: 'remote.tool.failed',
252
+ mode: route.session.mode,
253
+ userId: identity.userId,
254
+ sessionId: route.session.sessionId,
255
+ toolName: input.toolName,
256
+ riskLevel: input.riskLevel,
257
+ inputHash,
258
+ status: 'error',
259
+ errorCode: response.error?.code ?? 'REMOTE_EXTENSION_ERROR',
260
+ durationMs: Date.now() - startedAt,
261
+ });
262
+ return gatewayError(502, 'REMOTE_EXTENSION_ERROR', response.error?.message ?? 'Remote extension returned an error.');
263
+ }
264
+ this.audit.record({
265
+ event: 'remote.tool.completed',
266
+ mode: route.session.mode,
267
+ userId: identity.userId,
268
+ sessionId: route.session.sessionId,
269
+ toolName: input.toolName,
270
+ riskLevel: input.riskLevel,
271
+ inputHash,
272
+ status: 'ok',
273
+ durationMs: Date.now() - startedAt,
274
+ });
275
+ return {
276
+ ok: true,
277
+ sessionId: route.session.sessionId,
278
+ toolName: input.toolName,
279
+ result: response.result,
280
+ durationMs: response.durationMs,
281
+ };
282
+ }
283
+ catch (error) {
284
+ this.audit.record({
285
+ event: 'remote.tool.failed',
286
+ mode: route.session.mode,
287
+ userId: identity.userId,
288
+ sessionId: route.session.sessionId,
289
+ toolName: input.toolName,
290
+ riskLevel: input.riskLevel,
291
+ inputHash,
292
+ status: 'error',
293
+ errorCode: 'REMOTE_EXTENSION_TIMEOUT',
294
+ durationMs: Date.now() - startedAt,
295
+ });
296
+ return gatewayError(504, 'REMOTE_EXTENSION_TIMEOUT', error instanceof Error ? error.message : String(error));
297
+ }
298
+ }
299
+ registerHttpRoutes(app, config) {
300
+ app.post('/remote/pairing-codes', (req, res) => {
301
+ const identity = identityFromRequest(req, res, config);
302
+ if (!identity) {
303
+ res
304
+ .status(401)
305
+ .json({ ok: false, code: 'IDENTITY_MISSING', message: 'Remote identity is required.' });
306
+ return;
307
+ }
308
+ const body = CreatePairingCodeSchema.safeParse(req.body ?? {});
309
+ if (!body.success) {
310
+ res.status(400).json({ ok: false, code: 'BAD_REQUEST', issues: body.error.issues });
311
+ return;
312
+ }
313
+ const pairingCode = this.createPairingCode({ identity, ...body.data });
314
+ res.json({ ok: true, pairingCode });
315
+ });
316
+ app.post('/remote/pairings', (req, res) => {
317
+ const identity = identityFromRequest(req, res, config);
318
+ if (!identity) {
319
+ res
320
+ .status(401)
321
+ .json({ ok: false, code: 'IDENTITY_MISSING', message: 'Remote identity is required.' });
322
+ return;
323
+ }
324
+ const body = CompletePairingSchema.safeParse(req.body ?? {});
325
+ if (!body.success) {
326
+ res.status(400).json({ ok: false, code: 'BAD_REQUEST', issues: body.error.issues });
327
+ return;
328
+ }
329
+ const paired = this.completePairing({ identity, ...body.data });
330
+ res.status(paired ? 200 : 409).json({ ok: paired, paired });
331
+ });
332
+ app.post('/remote/tool-requests', async (req, res) => {
333
+ const body = RouteToolRequestSchema.safeParse(req.body ?? {});
334
+ if (!body.success) {
335
+ res.status(400).json({ ok: false, code: 'BAD_REQUEST', issues: body.error.issues });
336
+ return;
337
+ }
338
+ const result = await this.routeToolRequest({
339
+ identity: identityFromRequest(req, res, config),
340
+ ...body.data,
341
+ });
342
+ res.status(result.ok ? 200 : result.status).json(result);
343
+ });
344
+ app.get('/remote/audit', (req, res) => {
345
+ const identity = identityFromRequest(req, res, config);
346
+ const scope = checkRemoteScope(identity, 'destructive');
347
+ if (!scope.ok) {
348
+ res.status(scope.code === 'SCOPE_MISSING' ? 403 : 401).json(scope);
349
+ return;
350
+ }
351
+ res.json({ ok: true, events: this.audit.recent(100) });
352
+ });
353
+ }
354
+ attachWebSocketServer(server) {
355
+ if (this.wsAttached)
356
+ return;
357
+ this.wsAttached = true;
358
+ const wss = new WebSocketServer({ noServer: true });
359
+ server.on('upgrade', (request, socket, head) => {
360
+ const path = parseUpgradePath(request);
361
+ if (path !== '/remote/relay' && path !== '/session')
362
+ return;
363
+ wss.handleUpgrade(request, socket, head, (ws) => {
364
+ wss.emit('connection', ws, request);
365
+ });
366
+ });
367
+ wss.on('connection', (ws) => this.handleRelaySocket(ws));
368
+ }
369
+ handleRelaySocket(ws) {
370
+ const connectionId = `conn_${this.makeId()}`;
371
+ let sessionId;
372
+ const pending = new Map();
373
+ const send = (payload) => {
374
+ if (ws.readyState !== ws.OPEN)
375
+ return;
376
+ ws.send(JSON.stringify({
377
+ protocolVersion: REMOTE_RELAY_PROTOCOL_VERSION,
378
+ messageId: `msg_${this.makeId()}`,
379
+ sessionId,
380
+ timestamp: this.now().toISOString(),
381
+ ...payload,
382
+ }));
383
+ };
384
+ const dispatch = async (request) => {
385
+ if (ws.readyState !== ws.OPEN)
386
+ throw new Error('Remote relay socket is closed.');
387
+ ws.send(JSON.stringify(request));
388
+ return await new Promise((resolve, reject) => {
389
+ const timeout = setTimeout(() => {
390
+ pending.delete(request.messageId);
391
+ reject(new Error('Remote extension did not respond before the deadline.'));
392
+ }, request.deadlineMs ?? 30_000);
393
+ pending.set(request.messageId, {
394
+ resolve: (response) => {
395
+ clearTimeout(timeout);
396
+ resolve(response);
397
+ },
398
+ reject: (error) => {
399
+ clearTimeout(timeout);
400
+ reject(error);
401
+ },
402
+ });
403
+ });
404
+ };
405
+ ws.on('message', (raw) => {
406
+ let parsed;
407
+ try {
408
+ parsed = JSON.parse(raw.toString());
409
+ }
410
+ catch {
411
+ send({ type: 'error', code: 'BAD_JSON', message: 'Relay message must be JSON.' });
412
+ return;
413
+ }
414
+ const record = parsed && typeof parsed === 'object' ? parsed : {};
415
+ const message = RelayMessageSchema.safeParse(parsed);
416
+ if (!message.success) {
417
+ send({
418
+ type: 'error',
419
+ code: 'BAD_MESSAGE',
420
+ message: 'Relay message schema validation failed.',
421
+ });
422
+ return;
423
+ }
424
+ if (message.data.type === 'register_session') {
425
+ const session = this.registerExtension({
426
+ connectionId,
427
+ mode: message.data.mode,
428
+ extensionVersion: message.data.extensionVersion,
429
+ activeProject: message.data.activeProject,
430
+ dispatch,
431
+ pairingCode: typeof record.pairingCode === 'string' ? record.pairingCode : undefined,
432
+ });
433
+ sessionId = session.sessionId;
434
+ send({
435
+ type: 'session_registered',
436
+ paired: Boolean(session.userId),
437
+ expiresAt: session.expiresAt.toISOString(),
438
+ });
439
+ return;
440
+ }
441
+ if (!sessionId) {
442
+ send({
443
+ type: 'error',
444
+ code: 'SESSION_NOT_REGISTERED',
445
+ message: 'Register the session first.',
446
+ });
447
+ return;
448
+ }
449
+ if (message.data.type === 'heartbeat') {
450
+ this.router.heartbeat(sessionId);
451
+ send({ type: 'heartbeat' });
452
+ return;
453
+ }
454
+ if (message.data.type === 'tool_response') {
455
+ const handler = pending.get(message.data.requestMessageId);
456
+ if (handler) {
457
+ pending.delete(message.data.requestMessageId);
458
+ handler.resolve(message.data);
459
+ }
460
+ return;
461
+ }
462
+ if (message.data.type === 'session_closed') {
463
+ this.disconnect(sessionId);
464
+ sessionId = undefined;
465
+ }
466
+ });
467
+ ws.on('close', () => {
468
+ if (sessionId)
469
+ this.disconnect(sessionId);
470
+ for (const handler of pending.values())
471
+ handler.reject(new Error('Remote relay socket closed.'));
472
+ pending.clear();
473
+ });
474
+ }
475
+ }
476
+ function parseUpgradePath(request) {
477
+ try {
478
+ return new URL(request.url ?? '/', 'http://localhost').pathname;
479
+ }
480
+ catch {
481
+ return '/';
482
+ }
483
+ }
484
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/remote/gateway.ts"],"names":[],"mappings":"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"}
@@ -3,3 +3,4 @@ export * from './observability.js';
3
3
  export * from './protocol.js';
4
4
  export * from './scope.js';
5
5
  export * from './session-router.js';
6
+ export * from './gateway.js';
@@ -3,4 +3,5 @@ export * from './observability.js';
3
3
  export * from './protocol.js';
4
4
  export * from './scope.js';
5
5
  export * from './session-router.js';
6
+ export * from './gateway.js';
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/remote/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/remote/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC"}
@@ -318,4 +318,5 @@ export declare const RelayMessageSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
318
318
  export type RelayMessage = z.infer<typeof RelayMessageSchema>;
319
319
  export type RegisterSessionMessage = z.infer<typeof RegisterSessionMessageSchema>;
320
320
  export type ToolRequestMessage = z.infer<typeof ToolRequestMessageSchema>;
321
+ export type ToolResponseMessage = z.infer<typeof ToolResponseMessageSchema>;
321
322
  export type ApprovalRequestMessage = z.infer<typeof ApprovalRequestMessageSchema>;
@@ -42,6 +42,8 @@ export declare class RemoteSessionRouter {
42
42
  userId: string;
43
43
  sessionId: string;
44
44
  }): boolean;
45
+ completePairingByCode(code: string, sessionId: string): boolean;
46
+ private completePairingInternal;
45
47
  heartbeat(sessionId: string): boolean;
46
48
  updateActiveProject(sessionId: string, activeProject?: ActiveProject): boolean;
47
49
  disconnect(sessionId: string): boolean;
@@ -37,23 +37,32 @@ export class RemoteSessionRouter {
37
37
  return code;
38
38
  }
39
39
  completePairing(input) {
40
- const pairing = this.pairings.get(input.code);
41
- const session = this.sessions.get(input.sessionId);
40
+ return this.completePairingInternal(input.code, input.userId, input.sessionId);
41
+ }
42
+ completePairingByCode(code, sessionId) {
43
+ const item = this.pairings.get(code);
44
+ if (!item)
45
+ return false;
46
+ return this.completePairingInternal(code, item.userId, sessionId);
47
+ }
48
+ completePairingInternal(code, userId, sessionId) {
49
+ const item = this.pairings.get(code);
50
+ const session = this.sessions.get(sessionId);
42
51
  const now = this.now();
43
- if (!pairing || !session)
52
+ if (!item || !session)
44
53
  return false;
45
- if (pairing.usedAt)
54
+ if (item.usedAt)
46
55
  return false;
47
- if (pairing.userId !== input.userId)
56
+ if (item.userId !== userId)
48
57
  return false;
49
- if (pairing.sessionId && pairing.sessionId !== input.sessionId)
58
+ if (item.sessionId && item.sessionId !== sessionId)
50
59
  return false;
51
- if (pairing.expiresAt.getTime() <= now.getTime())
60
+ if (item.expiresAt.getTime() <= now.getTime())
52
61
  return false;
53
62
  if (!session.connected || session.expiresAt.getTime() <= now.getTime())
54
63
  return false;
55
- pairing.usedAt = now;
56
- session.userId = input.userId;
64
+ item.usedAt = now;
65
+ session.userId = userId;
57
66
  session.lastSeenAt = now;
58
67
  return true;
59
68
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-router.js","sourceRoot":"","sources":["../../src/remote/session-router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-router.js","sourceRoot":"","sources":["../../src/remote/session-router.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,18 @@
1
1
  import { type Express, type Request, type Response, type NextFunction } from 'express';
2
2
  import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
3
3
  import { type EnvConfig } from '../../config/env.js';
4
+ import { RemoteGateway } from '../../remote/gateway.js';
4
5
  export interface HttpTransportInstance {
5
6
  app: Express;
6
7
  transport: StreamableHTTPServerTransport;
7
8
  start: () => Promise<void>;
8
9
  close: () => Promise<void>;
10
+ gateway: RemoteGateway;
9
11
  }
12
+ export interface HttpTransportOptions {
13
+ gateway?: RemoteGateway;
14
+ }
15
+ export declare function normalizeOAuthScope(scope: string): string;
10
16
  /** Check whether the given host is a loopback address. */
11
17
  export declare function isLoopback(host: string): boolean;
12
18
  /**
@@ -27,4 +33,4 @@ export declare function createOriginValidator(config: EnvConfig): (req: Request,
27
33
  export declare function validateMcpProtocolVersion(config: EnvConfig): (req: Request, res: Response, next: NextFunction) => void;
28
34
  /** CORS preflight handler for OPTIONS requests. */
29
35
  export declare function handleCorsPreflight(req: Request, res: Response, next: NextFunction): void;
30
- export declare function createHttpTransport(config: EnvConfig): HttpTransportInstance;
36
+ export declare function createHttpTransport(config: EnvConfig, options?: HttpTransportOptions): HttpTransportInstance;