@platf/bridge 0.0.16 → 0.0.18

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.
Files changed (40) hide show
  1. package/dist/gateways/statefulBridge.d.ts +10 -7
  2. package/dist/gateways/statefulBridge.js +79 -139
  3. package/dist/gateways/statefulBridge.js.map +1 -1
  4. package/dist/gateways/statelessBridge.d.ts +10 -7
  5. package/dist/gateways/statelessBridge.js +85 -166
  6. package/dist/gateways/statelessBridge.js.map +1 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/lib/childProcess.d.ts +37 -0
  9. package/dist/lib/childProcess.js +80 -0
  10. package/dist/lib/childProcess.js.map +1 -0
  11. package/dist/lib/config.d.ts +6 -0
  12. package/dist/lib/config.js +7 -0
  13. package/dist/lib/config.js.map +1 -0
  14. package/dist/lib/discoveryRoutes.d.ts +3 -1
  15. package/dist/lib/discoveryRoutes.js +7 -68
  16. package/dist/lib/discoveryRoutes.js.map +1 -1
  17. package/dist/lib/express.d.ts +33 -0
  18. package/dist/lib/express.js +65 -0
  19. package/dist/lib/express.js.map +1 -0
  20. package/dist/lib/getLogger.d.ts +2 -2
  21. package/dist/lib/getLogger.js.map +1 -1
  22. package/dist/lib/mcpMessages.d.ts +10 -0
  23. package/dist/lib/mcpMessages.js +35 -0
  24. package/dist/lib/mcpMessages.js.map +1 -0
  25. package/dist/lib/oauthProxy.d.ts +14 -0
  26. package/dist/lib/oauthProxy.js +80 -0
  27. package/dist/lib/oauthProxy.js.map +1 -0
  28. package/dist/types.d.ts +3 -0
  29. package/package.json +1 -1
  30. package/src/gateways/statefulBridge.ts +87 -167
  31. package/src/gateways/statelessBridge.ts +100 -218
  32. package/src/index.ts +2 -2
  33. package/src/lib/childProcess.ts +120 -0
  34. package/src/lib/config.ts +9 -0
  35. package/src/lib/discoveryRoutes.ts +7 -71
  36. package/src/lib/express.ts +82 -0
  37. package/src/lib/getLogger.ts +4 -3
  38. package/src/lib/mcpMessages.ts +42 -0
  39. package/src/lib/oauthProxy.ts +86 -0
  40. package/src/types.ts +4 -0
@@ -4,7 +4,9 @@
4
4
  * When auth is enabled these routes expose:
5
5
  * - GET /.well-known/oauth-protected-resource[/*] (RFC 9728)
6
6
  * - GET /.well-known/oauth-authorization-server[/*] (RFC 8414 — proxied from issuer)
7
- * - POST /oauth/register (Pseudo-DCR — RFC 7591)
7
+ * - POST /register (Pseudo-DCR — RFC 7591)
8
+ *
9
+ * OAuth proxy routes (/authorize, /token, /jwks) are in oauthProxy.ts.
8
10
  *
9
11
  * These endpoints are unauthenticated — they must be accessible to
10
12
  * any client performing OAuth discovery before obtaining a token.
@@ -83,9 +85,9 @@ export function createDiscoveryRouter(auth, logger) {
83
85
  const host = req.get('host');
84
86
  const bridgeOrigin = `${scheme}://${host}`;
85
87
  metadata.issuer = bridgeOrigin;
86
- metadata.authorization_endpoint = `${bridgeOrigin}/oauth/authorize`;
87
- metadata.token_endpoint = `${bridgeOrigin}/oauth/token`;
88
- metadata.registration_endpoint = `${bridgeOrigin}/oauth/register`;
88
+ metadata.authorization_endpoint = `${bridgeOrigin}/authorize`;
89
+ metadata.token_endpoint = `${bridgeOrigin}/token`;
90
+ metadata.registration_endpoint = `${bridgeOrigin}/register`;
89
91
  metadata.jwks_uri = `${bridgeOrigin}/jwks`;
90
92
  res.json(metadata);
91
93
  }
@@ -102,7 +104,7 @@ export function createDiscoveryRouter(auth, logger) {
102
104
  * (e.g., VS Code Copilot) discover the correct client_id through
103
105
  * the normal DCR flow without requiring out-of-band configuration.
104
106
  */
105
- router.post('/oauth/register', (req, res) => {
107
+ router.post('/register', (req, res) => {
106
108
  const body = req.body ?? {};
107
109
  res.status(201).json({
108
110
  client_id: auth.clientId,
@@ -114,69 +116,6 @@ export function createDiscoveryRouter(auth, logger) {
114
116
  redirect_uris: Array.isArray(body.redirect_uris) ? body.redirect_uris : [],
115
117
  });
116
118
  });
117
- /**
118
- * OAuth Authorization Endpoint — Redirect to upstream
119
- *
120
- * Since the bridge advertises itself as the authorization_server,
121
- * clients will attempt to call /oauth/authorize here. We redirect
122
- * to the upstream auth server, preserving all query parameters.
123
- */
124
- router.get('/oauth/authorize', (req, res) => {
125
- const upstreamUrl = new URL(`${auth.issuer}/oauth/authorize`);
126
- // Copy all query params to upstream
127
- for (const [key, value] of Object.entries(req.query)) {
128
- if (typeof value === 'string') {
129
- upstreamUrl.searchParams.set(key, value);
130
- }
131
- }
132
- logger.info(`[discovery] Redirecting /oauth/authorize to ${upstreamUrl.toString().slice(0, 100)}...`);
133
- res.redirect(upstreamUrl.toString());
134
- });
135
- /**
136
- * OAuth Token Endpoint — Proxy to upstream
137
- *
138
- * Proxies token exchange requests to the upstream auth server.
139
- */
140
- router.post('/oauth/token', async (req, res) => {
141
- try {
142
- const upstreamUrl = `${auth.issuer}/oauth/token`;
143
- logger.info('[discovery] Proxying /oauth/token to upstream');
144
- const upstreamRes = await fetch(upstreamUrl, {
145
- method: 'POST',
146
- headers: {
147
- 'Content-Type': req.get('Content-Type') || 'application/x-www-form-urlencoded',
148
- },
149
- body: req.get('Content-Type')?.includes('application/json')
150
- ? JSON.stringify(req.body)
151
- : new URLSearchParams(req.body).toString(),
152
- });
153
- const data = await upstreamRes.text();
154
- res.status(upstreamRes.status);
155
- res.set('Content-Type', upstreamRes.headers.get('Content-Type') || 'application/json');
156
- res.send(data);
157
- }
158
- catch (err) {
159
- logger.error('[discovery] Error proxying /oauth/token:', err.message ?? err);
160
- res.status(502).json({ error: 'upstream_error' });
161
- }
162
- });
163
- /**
164
- * JWKS Endpoint — Proxy to upstream
165
- *
166
- * Proxies JSON Web Key Set requests for token verification.
167
- */
168
- router.get('/jwks', async (req, res) => {
169
- try {
170
- const upstreamUrl = `${auth.issuer}/jwks`;
171
- const upstreamRes = await fetch(upstreamUrl);
172
- const data = await upstreamRes.json();
173
- res.json(data);
174
- }
175
- catch (err) {
176
- logger.error('[discovery] Error proxying /jwks:', err.message ?? err);
177
- res.status(502).json({ error: 'upstream_error' });
178
- }
179
- });
180
119
  return router;
181
120
  }
182
121
  //# sourceMappingURL=discoveryRoutes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"discoveryRoutes.js","sourceRoot":"","sources":["../../src/lib/discoveryRoutes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discoveryRoutes.js","sourceRoot":"","sources":["../../src/lib/discoveryRoutes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Shared Express application factory.
3
+ *
4
+ * Creates and configures the common Express setup used by both
5
+ * stateful and stateless bridges.
6
+ */
7
+ import { type Express, type Response } from 'express';
8
+ import { type CorsOptions } from 'cors';
9
+ import type { AuthConfig, Logger } from '../types.js';
10
+ export interface CreateAppOptions {
11
+ logger: Logger;
12
+ corsOrigin: CorsOptions['origin'];
13
+ healthEndpoints: string[];
14
+ headers: Record<string, string>;
15
+ auth: AuthConfig | null;
16
+ /** Path for the MCP endpoint (used to apply auth middleware) */
17
+ mcpPath: string;
18
+ }
19
+ /** Set custom response headers */
20
+ export declare const setResponseHeaders: (res: Response, headers: Record<string, string>) => void;
21
+ /**
22
+ * Create and configure an Express application with shared middleware.
23
+ *
24
+ * Sets up:
25
+ * - JSON body parser
26
+ * - Trust proxy (for X-Forwarded-* headers)
27
+ * - CORS (if configured)
28
+ * - Health endpoints
29
+ * - OAuth discovery routes (if auth enabled)
30
+ * - OAuth proxy routes (if auth enabled)
31
+ * - Auth middleware on mcpPath (if auth enabled)
32
+ */
33
+ export declare function createApp(options: CreateAppOptions): Express;
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Shared Express application factory.
3
+ *
4
+ * Creates and configures the common Express setup used by both
5
+ * stateful and stateless bridges.
6
+ */
7
+ import express from 'express';
8
+ import cors from 'cors';
9
+ import { serializeCorsOrigin } from './cors.js';
10
+ import { createDiscoveryRouter } from './discoveryRoutes.js';
11
+ import { createOAuthProxyRouter } from './oauthProxy.js';
12
+ import { createAuthMiddleware } from './authMiddleware.js';
13
+ /** Set custom response headers */
14
+ export const setResponseHeaders = (res, headers) => Object.entries(headers).forEach(([key, value]) => res.setHeader(key, value));
15
+ /**
16
+ * Create and configure an Express application with shared middleware.
17
+ *
18
+ * Sets up:
19
+ * - JSON body parser
20
+ * - Trust proxy (for X-Forwarded-* headers)
21
+ * - CORS (if configured)
22
+ * - Health endpoints
23
+ * - OAuth discovery routes (if auth enabled)
24
+ * - OAuth proxy routes (if auth enabled)
25
+ * - Auth middleware on mcpPath (if auth enabled)
26
+ */
27
+ export function createApp(options) {
28
+ const { logger, corsOrigin, healthEndpoints, headers, auth, mcpPath } = options;
29
+ const app = express();
30
+ app.set('trust proxy', true);
31
+ app.use(express.json());
32
+ // CORS
33
+ if (corsOrigin) {
34
+ app.use(cors({ origin: corsOrigin, exposedHeaders: ['Mcp-Session-Id'] }));
35
+ logger.info(` - CORS: enabled (${serializeCorsOrigin(corsOrigin)})`);
36
+ }
37
+ else {
38
+ logger.info(' - CORS: disabled');
39
+ }
40
+ // Health endpoints
41
+ for (const ep of healthEndpoints) {
42
+ app.get(ep, (_req, res) => {
43
+ setResponseHeaders(res, headers);
44
+ res.send('ok');
45
+ });
46
+ }
47
+ if (healthEndpoints.length) {
48
+ logger.info(` - Health endpoints: ${healthEndpoints.join(', ')}`);
49
+ }
50
+ // OAuth (when auth is enabled)
51
+ if (auth) {
52
+ // Discovery routes (PRM, AS metadata, pseudo-DCR)
53
+ app.use(createDiscoveryRouter(auth, logger));
54
+ // OAuth proxy routes (authorize redirect, token proxy, JWKS proxy)
55
+ app.use(createOAuthProxyRouter(auth, logger));
56
+ // Auth middleware on MCP path
57
+ app.use(mcpPath, createAuthMiddleware(auth, logger));
58
+ logger.info(` - Auth: enabled (issuer=${auth.issuer})`);
59
+ }
60
+ else {
61
+ logger.info(' - Auth: disabled');
62
+ }
63
+ return app;
64
+ }
65
+ //# sourceMappingURL=express.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/lib/express.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,OAAwC,MAAM,SAAS,CAAA;AAC9D,OAAO,IAA0B,MAAM,MAAM,CAAA;AAE7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAY1D,kCAAkC;AAClC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAa,EAAE,OAA+B,EAAE,EAAE,CACnF,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,SAAS,CAAC,OAAyB;IACjD,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IAE/E,MAAM,GAAG,GAAG,OAAO,EAAE,CAAA;IACrB,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;IAC5B,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IAEvB,OAAO;IACP,IAAI,UAAU,EAAE,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAA;QACzE,MAAM,CAAC,IAAI,CAAC,sBAAsB,mBAAmB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;IACvE,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;IACnC,CAAC;IAED,mBAAmB;IACnB,KAAK,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC;QACjC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YACxB,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;YAChC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChB,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,eAAe,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,yBAAyB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACpE,CAAC;IAED,+BAA+B;IAC/B,IAAI,IAAI,EAAE,CAAC;QACT,kDAAkD;QAClD,GAAG,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;QAC5C,mEAAmE;QACnE,GAAG,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;QAC7C,8BAA8B;QAC9B,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;QACpD,MAAM,CAAC,IAAI,CAAC,6BAA6B,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;IAC1D,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;IACnC,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -1,3 +1,3 @@
1
- import type { Logger } from '../types.js';
2
- export type LogLevel = 'none' | 'info' | 'debug';
1
+ import type { Logger, LogLevel } from '../types.js';
3
2
  export declare function getLogger(logLevel: LogLevel): Logger;
3
+ export type { LogLevel };
@@ -1 +1 @@
1
- {"version":3,"file":"getLogger.js","sourceRoot":"","sources":["../../src/lib/getLogger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAG5B,MAAM,iBAAiB,GAAG,CAAC,IAAe,EAAE,EAAE,CAAC,IAAI,CAAA;AAEnD,MAAM,GAAG,GACP,CAAC,EAAE,UAAU,GAAG,iBAAiB,KAAgD,EAAE,EAAE,EAAE,CACvF,CAAC,GAAG,IAAe,EAAE,EAAE,CACrB,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;AAEtD,MAAM,SAAS,GACb,CAAC,EAAE,UAAU,GAAG,iBAAiB,KAAgD,EAAE,EAAE,EAAE,CACvF,CAAC,GAAG,IAAe,EAAE,EAAE,CACrB,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;AAExD,MAAM,UAAU,GAAW;IACzB,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;CAChB,CAAA;AAED,MAAM,UAAU,GAAW;IACzB,IAAI,EAAE,GAAG,EAAE;IACX,KAAK,EAAE,SAAS,EAAE;CACnB,CAAA;AAED,MAAM,eAAe,GAAG,CAAC,IAAe,EAAE,EAAE,CAC1C,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;IACf,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YACvB,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK;YAC5B,OAAO,EAAE,KAAK;SACf,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAC,CAAA;AAEJ,MAAM,WAAW,GAAW;IAC1B,IAAI,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;IAC1C,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;CAClD,CAAA;AAID,MAAM,UAAU,SAAS,CAAC,QAAkB;IAC1C,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,UAAU,CAAA;IAC1C,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,WAAW,CAAA;IAC5C,OAAO,UAAU,CAAA;AACnB,CAAC"}
1
+ {"version":3,"file":"getLogger.js","sourceRoot":"","sources":["../../src/lib/getLogger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAG5B,MAAM,iBAAiB,GAAG,CAAC,IAAe,EAAE,EAAE,CAAC,IAAI,CAAA;AAEnD,MAAM,GAAG,GACP,CAAC,EAAE,UAAU,GAAG,iBAAiB,KAAgD,EAAE,EAAE,EAAE,CACvF,CAAC,GAAG,IAAe,EAAE,EAAE,CACrB,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;AAEtD,MAAM,SAAS,GACb,CAAC,EAAE,UAAU,GAAG,iBAAiB,KAAgD,EAAE,EAAE,EAAE,CACvF,CAAC,GAAG,IAAe,EAAE,EAAE,CACrB,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;AAExD,MAAM,UAAU,GAAW;IACzB,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;CAChB,CAAA;AAED,MAAM,UAAU,GAAW;IACzB,IAAI,EAAE,GAAG,EAAE;IACX,KAAK,EAAE,SAAS,EAAE;CACnB,CAAA;AAED,MAAM,eAAe,GAAG,CAAC,IAAe,EAAE,EAAE,CAC1C,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;IACf,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YACvB,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK;YAC5B,OAAO,EAAE,KAAK;SACf,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAC,CAAA;AAEJ,MAAM,WAAW,GAAW;IAC1B,IAAI,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;IAC1C,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;CAClD,CAAA;AAED,MAAM,UAAU,SAAS,CAAC,QAAkB;IAC1C,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,UAAU,CAAA;IAC1C,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,WAAW,CAAA;IAC5C,OAAO,UAAU,CAAA;AACnB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * MCP message helpers for auto-initialization and protocol handling.
3
+ */
4
+ import type { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
5
+ /** Create a synthetic MCP initialize request */
6
+ export declare function createInitializeRequest(id: string | number, protocolVersion: string): JSONRPCMessage;
7
+ /** Create an initialized notification */
8
+ export declare function createInitializedNotification(): JSONRPCMessage;
9
+ /** Generate a unique ID for auto-init requests */
10
+ export declare function generateAutoInitId(): string;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * MCP message helpers for auto-initialization and protocol handling.
3
+ */
4
+ import { VERSION, SERVER_NAME } from './config.js';
5
+ /** Create a synthetic MCP initialize request */
6
+ export function createInitializeRequest(id, protocolVersion) {
7
+ return {
8
+ jsonrpc: '2.0',
9
+ id,
10
+ method: 'initialize',
11
+ params: {
12
+ protocolVersion,
13
+ capabilities: {
14
+ roots: { listChanged: true },
15
+ sampling: {},
16
+ },
17
+ clientInfo: {
18
+ name: SERVER_NAME,
19
+ version: VERSION,
20
+ },
21
+ },
22
+ };
23
+ }
24
+ /** Create an initialized notification */
25
+ export function createInitializedNotification() {
26
+ return {
27
+ jsonrpc: '2.0',
28
+ method: 'notifications/initialized',
29
+ };
30
+ }
31
+ /** Generate a unique ID for auto-init requests */
32
+ export function generateAutoInitId() {
33
+ return `init_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;
34
+ }
35
+ //# sourceMappingURL=mcpMessages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpMessages.js","sourceRoot":"","sources":["../../src/lib/mcpMessages.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAElD,gDAAgD;AAChD,MAAM,UAAU,uBAAuB,CACrC,EAAmB,EACnB,eAAuB;IAEvB,OAAO;QACL,OAAO,EAAE,KAAK;QACd,EAAE;QACF,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE;YACN,eAAe;YACf,YAAY,EAAE;gBACZ,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;gBAC5B,QAAQ,EAAE,EAAE;aACb;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,OAAO;aACjB;SACF;KACF,CAAA;AACH,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,6BAA6B;IAC3C,OAAO;QACL,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,2BAA2B;KACpC,CAAA;AACH,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,kBAAkB;IAChC,OAAO,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAA;AACxE,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * OAuth 2.0 proxy routes for the bridge.
3
+ *
4
+ * These routes proxy OAuth endpoints to the upstream authorization server:
5
+ * - GET /authorize → Redirect to upstream (preserves query params)
6
+ * - POST /token → Proxy to upstream
7
+ * - GET /jwks → Proxy JWKS for token verification
8
+ *
9
+ * This separation allows the bridge to advertise itself as the authorization
10
+ * server while delegating actual auth operations to the upstream issuer.
11
+ */
12
+ import { Router } from 'express';
13
+ import type { AuthConfig, Logger } from '../types.js';
14
+ export declare function createOAuthProxyRouter(auth: AuthConfig, logger: Logger): Router;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * OAuth 2.0 proxy routes for the bridge.
3
+ *
4
+ * These routes proxy OAuth endpoints to the upstream authorization server:
5
+ * - GET /authorize → Redirect to upstream (preserves query params)
6
+ * - POST /token → Proxy to upstream
7
+ * - GET /jwks → Proxy JWKS for token verification
8
+ *
9
+ * This separation allows the bridge to advertise itself as the authorization
10
+ * server while delegating actual auth operations to the upstream issuer.
11
+ */
12
+ import { Router } from 'express';
13
+ export function createOAuthProxyRouter(auth, logger) {
14
+ const router = Router();
15
+ /**
16
+ * OAuth Authorization Endpoint — Redirect to upstream
17
+ *
18
+ * Since the bridge advertises itself as the authorization_server,
19
+ * clients will attempt to call /authorize here. We redirect
20
+ * to the upstream auth server, preserving all query parameters.
21
+ */
22
+ router.get('/authorize', (req, res) => {
23
+ const upstreamUrl = new URL(`${auth.issuer}/oauth/authorize`);
24
+ // Copy all query params to upstream
25
+ for (const [key, value] of Object.entries(req.query)) {
26
+ if (typeof value === 'string') {
27
+ upstreamUrl.searchParams.set(key, value);
28
+ }
29
+ }
30
+ logger.info(`[oauth-proxy] Redirecting /authorize to upstream`);
31
+ res.redirect(upstreamUrl.toString());
32
+ });
33
+ /**
34
+ * OAuth Token Endpoint — Proxy to upstream
35
+ *
36
+ * Proxies token exchange requests to the upstream auth server.
37
+ */
38
+ router.post('/token', async (req, res) => {
39
+ try {
40
+ const upstreamUrl = `${auth.issuer}/oauth/token`;
41
+ logger.info('[oauth-proxy] Proxying /token to upstream');
42
+ const upstreamRes = await fetch(upstreamUrl, {
43
+ method: 'POST',
44
+ headers: {
45
+ 'Content-Type': req.get('Content-Type') || 'application/x-www-form-urlencoded',
46
+ },
47
+ body: req.get('Content-Type')?.includes('application/json')
48
+ ? JSON.stringify(req.body)
49
+ : new URLSearchParams(req.body).toString(),
50
+ });
51
+ const data = await upstreamRes.text();
52
+ res.status(upstreamRes.status);
53
+ res.set('Content-Type', upstreamRes.headers.get('Content-Type') || 'application/json');
54
+ res.send(data);
55
+ }
56
+ catch (err) {
57
+ logger.error('[oauth-proxy] Error proxying /token:', err.message ?? err);
58
+ res.status(502).json({ error: 'upstream_error' });
59
+ }
60
+ });
61
+ /**
62
+ * JWKS Endpoint — Proxy to upstream
63
+ *
64
+ * Proxies JSON Web Key Set requests for token verification.
65
+ */
66
+ router.get('/jwks', async (_req, res) => {
67
+ try {
68
+ const upstreamUrl = `${auth.issuer}/jwks`;
69
+ const upstreamRes = await fetch(upstreamUrl);
70
+ const data = await upstreamRes.json();
71
+ res.json(data);
72
+ }
73
+ catch (err) {
74
+ logger.error('[oauth-proxy] Error proxying /jwks:', err.message ?? err);
75
+ res.status(502).json({ error: 'upstream_error' });
76
+ }
77
+ });
78
+ return router;
79
+ }
80
+ //# sourceMappingURL=oauthProxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauthProxy.js","sourceRoot":"","sources":["../../src/lib/oauthProxy.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,7 +1,10 @@
1
+ /** Logger interface for structured logging */
1
2
  export interface Logger {
2
3
  info: (...args: unknown[]) => void;
3
4
  error: (...args: unknown[]) => void;
4
5
  }
6
+ /** Log level for the logger */
7
+ export type LogLevel = 'none' | 'info' | 'debug';
5
8
  /** OAuth auth config passed when --authIssuer is set */
6
9
  export interface AuthConfig {
7
10
  /** OAuth issuer URL (e.g. https://auth.platf.ai) */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platf/bridge",
3
- "version": "0.0.16",
3
+ "version": "0.0.18",
4
4
  "description": "Stdio-to-Streamable HTTP bridge for MCP servers — Platf AI Hub",
5
5
  "module": "src/index.ts",
6
6
  "main": "dist/index.js",