@zackbart/connecta 0.7.8 → 0.8.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.
Files changed (187) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/README.md +67 -144
  3. package/dist/activity.d.ts +1 -1
  4. package/dist/activity.d.ts.map +1 -1
  5. package/dist/activity.js.map +1 -1
  6. package/dist/auth/bearer.d.ts +1 -1
  7. package/dist/auth/bearer.js +4 -4
  8. package/dist/auth/bearer.js.map +1 -1
  9. package/dist/auth/clerk.d.ts +1 -1
  10. package/dist/auth/clerk.js +1 -1
  11. package/dist/call-admission.d.ts +81 -0
  12. package/dist/call-admission.d.ts.map +1 -0
  13. package/dist/call-admission.js +345 -0
  14. package/dist/call-admission.js.map +1 -0
  15. package/dist/catalog-fingerprint.d.ts +20 -0
  16. package/dist/catalog-fingerprint.d.ts.map +1 -0
  17. package/dist/catalog-fingerprint.js +34 -0
  18. package/dist/catalog-fingerprint.js.map +1 -0
  19. package/dist/catalog-limits.d.ts +10 -0
  20. package/dist/catalog-limits.d.ts.map +1 -0
  21. package/dist/catalog-limits.js +10 -0
  22. package/dist/catalog-limits.js.map +1 -0
  23. package/dist/catalog-service.d.ts +138 -0
  24. package/dist/catalog-service.d.ts.map +1 -0
  25. package/dist/catalog-service.js +407 -0
  26. package/dist/catalog-service.js.map +1 -0
  27. package/dist/catalog.js +2 -2
  28. package/dist/catalog.js.map +1 -1
  29. package/dist/concurrency.d.ts +4 -0
  30. package/dist/concurrency.d.ts.map +1 -0
  31. package/dist/concurrency.js +31 -0
  32. package/dist/concurrency.js.map +1 -0
  33. package/dist/connectors/api.d.ts +3 -1
  34. package/dist/connectors/api.d.ts.map +1 -1
  35. package/dist/connectors/api.js +22 -11
  36. package/dist/connectors/api.js.map +1 -1
  37. package/dist/connectors/remote-mcp.d.ts +3 -1
  38. package/dist/connectors/remote-mcp.d.ts.map +1 -1
  39. package/dist/connectors/remote-mcp.js +44 -18
  40. package/dist/connectors/remote-mcp.js.map +1 -1
  41. package/dist/credential-health.d.ts +0 -22
  42. package/dist/credential-health.d.ts.map +1 -1
  43. package/dist/credential-health.js +14 -10
  44. package/dist/credential-health.js.map +1 -1
  45. package/dist/credentials.d.ts +3 -2
  46. package/dist/credentials.d.ts.map +1 -1
  47. package/dist/errors.d.ts +1 -1
  48. package/dist/errors.d.ts.map +1 -1
  49. package/dist/errors.js.map +1 -1
  50. package/dist/execute.d.ts +9 -8
  51. package/dist/execute.d.ts.map +1 -1
  52. package/dist/execute.js +144 -291
  53. package/dist/execute.js.map +1 -1
  54. package/dist/executor-result.d.ts +0 -3
  55. package/dist/executor-result.d.ts.map +1 -1
  56. package/dist/executor-result.js +2 -2
  57. package/dist/executor-result.js.map +1 -1
  58. package/dist/executors/quickjs-child.js +3 -3
  59. package/dist/executors/quickjs-child.js.map +1 -1
  60. package/dist/executors/quickjs-protocol.d.ts +4 -1
  61. package/dist/executors/quickjs-protocol.d.ts.map +1 -1
  62. package/dist/executors/quickjs-runtime.d.ts.map +1 -1
  63. package/dist/executors/quickjs-runtime.js +7 -2
  64. package/dist/executors/quickjs-runtime.js.map +1 -1
  65. package/dist/executors/quickjs.d.ts.map +1 -1
  66. package/dist/executors/quickjs.js +4 -1
  67. package/dist/executors/quickjs.js.map +1 -1
  68. package/dist/favicon.js +2 -2
  69. package/dist/favicon.js.map +1 -1
  70. package/dist/index.d.ts +6 -1
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +45 -17
  73. package/dist/index.js.map +1 -1
  74. package/dist/invocation.d.ts +96 -0
  75. package/dist/invocation.d.ts.map +1 -0
  76. package/dist/invocation.js +369 -0
  77. package/dist/invocation.js.map +1 -0
  78. package/dist/meta-tools.d.ts +11 -86
  79. package/dist/meta-tools.d.ts.map +1 -1
  80. package/dist/meta-tools.js +145 -485
  81. package/dist/meta-tools.js.map +1 -1
  82. package/dist/operator-ui/generated.d.ts +3 -0
  83. package/dist/operator-ui/generated.d.ts.map +1 -0
  84. package/dist/operator-ui/generated.js +5 -0
  85. package/dist/operator-ui/generated.js.map +1 -0
  86. package/dist/operator-ui/model.d.ts +94 -0
  87. package/dist/operator-ui/model.d.ts.map +1 -0
  88. package/dist/operator-ui/model.js +28 -0
  89. package/dist/operator-ui/model.js.map +1 -0
  90. package/dist/registry.d.ts +47 -6
  91. package/dist/registry.d.ts.map +1 -1
  92. package/dist/registry.js +356 -35
  93. package/dist/registry.js.map +1 -1
  94. package/dist/routes/activity.d.ts +3 -0
  95. package/dist/routes/activity.d.ts.map +1 -0
  96. package/dist/routes/activity.js +173 -0
  97. package/dist/routes/activity.js.map +1 -0
  98. package/dist/routes/credentials.d.ts +3 -0
  99. package/dist/routes/credentials.d.ts.map +1 -0
  100. package/dist/routes/credentials.js +181 -0
  101. package/dist/routes/credentials.js.map +1 -0
  102. package/dist/routes/mcp.d.ts +8 -0
  103. package/dist/routes/mcp.d.ts.map +1 -0
  104. package/dist/routes/mcp.js +383 -0
  105. package/dist/routes/mcp.js.map +1 -0
  106. package/dist/routes/oauth.d.ts +4 -0
  107. package/dist/routes/oauth.d.ts.map +1 -0
  108. package/dist/routes/oauth.js +268 -0
  109. package/dist/routes/oauth.js.map +1 -0
  110. package/dist/routes/shared.d.ts +97 -0
  111. package/dist/routes/shared.d.ts.map +1 -0
  112. package/dist/routes/shared.js +199 -0
  113. package/dist/routes/shared.js.map +1 -0
  114. package/dist/routes/ui.d.ts +3 -0
  115. package/dist/routes/ui.d.ts.map +1 -0
  116. package/dist/routes/ui.js +122 -0
  117. package/dist/routes/ui.js.map +1 -0
  118. package/dist/server.d.ts +9 -40
  119. package/dist/server.d.ts.map +1 -1
  120. package/dist/server.js +67 -1292
  121. package/dist/server.js.map +1 -1
  122. package/dist/skills.d.ts +0 -15
  123. package/dist/skills.d.ts.map +1 -1
  124. package/dist/skills.js +6 -5
  125. package/dist/skills.js.map +1 -1
  126. package/dist/storage/file.d.ts.map +1 -1
  127. package/dist/storage/file.js +3 -1
  128. package/dist/storage/file.js.map +1 -1
  129. package/dist/storage/memory.d.ts.map +1 -1
  130. package/dist/storage/memory.js +3 -1
  131. package/dist/storage/memory.js.map +1 -1
  132. package/dist/toolkits.d.ts +0 -22
  133. package/dist/toolkits.d.ts.map +1 -1
  134. package/dist/toolkits.js +2 -2
  135. package/dist/toolkits.js.map +1 -1
  136. package/dist/types.d.ts +64 -2
  137. package/dist/types.d.ts.map +1 -1
  138. package/dist/ui.d.ts +3 -93
  139. package/dist/ui.d.ts.map +1 -1
  140. package/dist/ui.js +26 -1389
  141. package/dist/ui.js.map +1 -1
  142. package/dist/version.d.ts +1 -1
  143. package/dist/version.js +1 -1
  144. package/package.json +15 -8
  145. package/src/activity.ts +5 -1
  146. package/src/auth/bearer.ts +4 -4
  147. package/src/auth/clerk.ts +1 -1
  148. package/src/call-admission.ts +522 -0
  149. package/src/catalog-fingerprint.ts +52 -0
  150. package/src/catalog-limits.ts +11 -0
  151. package/src/catalog-service.ts +601 -0
  152. package/src/catalog.ts +2 -2
  153. package/src/concurrency.ts +39 -0
  154. package/src/connectors/api.ts +25 -11
  155. package/src/connectors/remote-mcp.ts +55 -21
  156. package/src/credential-health.ts +13 -10
  157. package/src/credentials.ts +2 -2
  158. package/src/errors.ts +1 -1
  159. package/src/execute.ts +194 -377
  160. package/src/executor-result.ts +2 -2
  161. package/src/executors/quickjs-child.ts +8 -4
  162. package/src/executors/quickjs-protocol.ts +1 -1
  163. package/src/executors/quickjs-runtime.ts +5 -1
  164. package/src/executors/quickjs.ts +11 -8
  165. package/src/favicon.ts +2 -2
  166. package/src/index.ts +54 -17
  167. package/src/invocation.ts +527 -0
  168. package/src/meta-tools.ts +369 -797
  169. package/src/operator-ui/browser.css +413 -0
  170. package/src/operator-ui/browser.ts +1121 -0
  171. package/src/operator-ui/generated.ts +4 -0
  172. package/src/operator-ui/model.ts +127 -0
  173. package/src/registry.ts +489 -44
  174. package/src/routes/activity.ts +220 -0
  175. package/src/routes/credentials.ts +266 -0
  176. package/src/routes/mcp.ts +485 -0
  177. package/src/routes/oauth.ts +328 -0
  178. package/src/routes/shared.ts +330 -0
  179. package/src/routes/ui.ts +153 -0
  180. package/src/server.ts +70 -1702
  181. package/src/skills.ts +6 -5
  182. package/src/storage/file.ts +3 -1
  183. package/src/storage/memory.ts +3 -1
  184. package/src/toolkits.ts +2 -2
  185. package/src/types.ts +70 -2
  186. package/src/ui.ts +52 -1489
  187. package/src/version.ts +1 -1
@@ -0,0 +1,383 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
3
+ import { registerExecuteTool } from "../execute.js";
4
+ import { ExecutorAdmissionError, } from "../executor-admission.js";
5
+ import { registerMetaTools } from "../meta-tools.js";
6
+ import { ScopedRegistry } from "../registry.js";
7
+ import { CONNECTA_INSTRUCTIONS } from "../skills.js";
8
+ import { TOOLKIT_NAME_RE } from "../toolkits.js";
9
+ import { MAX_ECHOED_TOOLKIT_NAME, authorize, loggableValue, } from "./shared.js";
10
+ export const MCP_CORS_HEADERS = {
11
+ "Access-Control-Allow-Origin": "*",
12
+ "Access-Control-Allow-Methods": "GET, POST, DELETE, OPTIONS",
13
+ "Access-Control-Allow-Headers": "Content-Type, Authorization, mcp-protocol-version, mcp-session-id",
14
+ };
15
+ // Browser-based MCP clients call /mcp cross-origin. Without CORS on every
16
+ // response — errors included — the browser hides the 401, the client cannot
17
+ // read WWW-Authenticate, and OAuth discovery silently never starts.
18
+ function withMcpCors(response) {
19
+ const headers = new Headers(response.headers);
20
+ for (const [name, value] of Object.entries(MCP_CORS_HEADERS)) {
21
+ headers.set(name, value);
22
+ }
23
+ headers.set("Access-Control-Expose-Headers", "WWW-Authenticate, Retry-After, mcp-session-id, mcp-protocol-version");
24
+ return new Response(response.body, {
25
+ status: response.status,
26
+ statusText: response.statusText,
27
+ headers,
28
+ });
29
+ }
30
+ function requestAdmissionFailure(error) {
31
+ const overloaded = error.code === "executor_overloaded";
32
+ const data = {
33
+ code: overloaded ? "server_overloaded" : "server_shutting_down",
34
+ retryable: overloaded,
35
+ ...(overloaded && error.retryAfterMs !== undefined
36
+ ? { retryAfterMs: error.retryAfterMs }
37
+ : {}),
38
+ };
39
+ const headers = new Headers({
40
+ "Content-Type": "application/json",
41
+ "Cache-Control": "no-store",
42
+ });
43
+ if (overloaded && error.retryAfterMs !== undefined) {
44
+ headers.set("Retry-After", String(Math.max(1, Math.ceil(error.retryAfterMs / 1_000))));
45
+ }
46
+ return new Response(JSON.stringify({
47
+ jsonrpc: "2.0",
48
+ id: null,
49
+ error: {
50
+ code: overloaded ? -32001 : -32002,
51
+ message: overloaded
52
+ ? "Server capacity is exhausted. Retry later."
53
+ : "Server is shutting down.",
54
+ data,
55
+ },
56
+ }), { status: 503, headers });
57
+ }
58
+ /**
59
+ * A request owns its permit through the response body, not merely until the
60
+ * handler returns. This is what makes slow clients and response-stream failure
61
+ * part of the same bounded lifecycle as success, error, and cancellation.
62
+ */
63
+ function releaseAdmissionWithResponse(response, lease, signal) {
64
+ let released = false;
65
+ let onAbort = () => { };
66
+ const release = () => {
67
+ if (released)
68
+ return;
69
+ released = true;
70
+ signal.removeEventListener("abort", onAbort);
71
+ lease.release();
72
+ };
73
+ if (!response.body) {
74
+ release();
75
+ return response;
76
+ }
77
+ const reader = response.body.getReader();
78
+ onAbort = () => {
79
+ // `cancel()` belongs to an operator/auth/SDK-provided stream and may
80
+ // reject. Consume both outcomes: `.finally(release)` would release the
81
+ // permit but preserve the rejection as an unhandled promise.
82
+ void reader.cancel(signal.reason).then(release, release);
83
+ };
84
+ signal.addEventListener("abort", onAbort, { once: true });
85
+ if (signal.aborted)
86
+ onAbort();
87
+ const body = new ReadableStream({
88
+ async pull(controller) {
89
+ try {
90
+ const next = await reader.read();
91
+ if (next.done) {
92
+ release();
93
+ controller.close();
94
+ }
95
+ else {
96
+ controller.enqueue(next.value);
97
+ }
98
+ }
99
+ catch (error) {
100
+ release();
101
+ controller.error(error);
102
+ }
103
+ },
104
+ async cancel(reason) {
105
+ try {
106
+ await reader.cancel(reason);
107
+ }
108
+ finally {
109
+ release();
110
+ }
111
+ },
112
+ });
113
+ return new Response(body, {
114
+ status: response.status,
115
+ statusText: response.statusText,
116
+ headers: response.headers,
117
+ });
118
+ }
119
+ /** The one refusal a bound identity ever sees. Constant on purpose — see below. */
120
+ const TOOLKIT_FORBIDDEN_BODY = JSON.stringify({
121
+ jsonrpc: "2.0",
122
+ id: null,
123
+ error: {
124
+ code: -32600,
125
+ message: "Not permitted to use the requested toolkit. This credential is bound " +
126
+ "to a specific toolkit — check the ?toolkit= value in this deployment's " +
127
+ "MCP endpoint URL with the operator.",
128
+ },
129
+ });
130
+ /**
131
+ * 403 for every binding refusal, with a body that does not depend on WHY.
132
+ *
133
+ * A bound identity asking for a toolkit it may not open, for a toolkit that does
134
+ * not exist, or for no toolkit at all gets byte-identical responses, so a team
135
+ * credential cannot be used to enumerate the org's other teams — the boundary
136
+ * would leak the very structure it exists to hide. The operator log below is
137
+ * where the three cases are told apart.
138
+ */
139
+ function toolkitForbidden() {
140
+ return new Response(TOOLKIT_FORBIDDEN_BODY, {
141
+ status: 403,
142
+ headers: {
143
+ "Content-Type": "application/json",
144
+ "Cache-Control": "no-store",
145
+ },
146
+ });
147
+ }
148
+ /** How a rejected connection is named in the operator log. */
149
+ function identityLabel(actor) {
150
+ return actor.id ? `${actor.kind} ${loggableValue(actor.id)}` : actor.kind;
151
+ }
152
+ /**
153
+ * Resolve `?toolkit=<name>` into the registry view this connection may see,
154
+ * enforcing the caller's toolkit binding (documentation/toolkits.md) on the way.
155
+ *
156
+ * For an UNBOUND identity (no binding configured — the pre-#37 shape):
157
+ *
158
+ * - absent → the full registry, byte-identical to a deployment with no toolkits
159
+ * - known → a `ScopedRegistry` over that toolkit (the one visibility boundary)
160
+ * - anything else, including `?toolkit=` with an empty value → an explicit
161
+ * 404. Never a silent fallback to the full registry.
162
+ *
163
+ * For a BOUND identity, membership is checked FIRST and refusal is a flat 403:
164
+ * a toolkit outside the binding, an unknown name, and (without `unscoped`) an
165
+ * omitted `?toolkit=` are all refused before any `ScopedRegistry` is built, and
166
+ * all three produce the same response.
167
+ *
168
+ * Neither error enumerates the configured toolkits: the name selects a scope, so
169
+ * a wrong guess gets a flat refusal, not a directory.
170
+ *
171
+ * Because of that — and because SDK clients treat a 404/403 on the transport
172
+ * endpoint as a transport failure and discard the body — every rejection is also
173
+ * logged operator-side (issue #47), which is the channel that actually reaches a
174
+ * human. The log line may name the configured or bound toolkits; the response
175
+ * still may not.
176
+ */
177
+ function resolveToolkitScope(url, registry, toolkits, logger, identity) {
178
+ const requested = url.searchParams.get("toolkit");
179
+ const binding = identity.binding;
180
+ const scopeFor = (toolkit) => ({
181
+ ok: true,
182
+ scope: {
183
+ registry: new ScopedRegistry(registry, toolkit),
184
+ toolkitId: toolkit.name,
185
+ },
186
+ });
187
+ if (binding) {
188
+ const who = identityLabel(identity.actor);
189
+ const bound = `Bound toolkits: ${binding.toolkits.join(", ") || "(none)"}${binding.unscoped ? ", plus unscoped access" : ""}.`;
190
+ if (requested === null) {
191
+ if (binding.unscoped)
192
+ return { ok: true, scope: { registry } };
193
+ logger.warn(`[connecta] refused an unscoped /mcp connection from ${who} with 403: ` +
194
+ "its toolkit binding does not allow the full registry. " +
195
+ bound +
196
+ " The client sees a transport-level failure and never the reason, so " +
197
+ "give it an MCP endpoint URL with a ?toolkit= value it is bound to.");
198
+ return { ok: false, response: toolkitForbidden() };
199
+ }
200
+ const permitted = binding.toolkits.includes(requested);
201
+ const toolkit = permitted ? toolkits?.get(requested) : undefined;
202
+ if (toolkit)
203
+ return scopeFor(toolkit);
204
+ logger.warn(`[connecta] refused an /mcp connection from ${who} with 403: it asked ` +
205
+ `for toolkit ${loggableValue(requested)}, which ` +
206
+ (permitted
207
+ ? "its binding allows but this deployment does not configure"
208
+ : "its toolkit binding does not include") +
209
+ ". " +
210
+ bound +
211
+ " The client sees a transport-level failure and never the reason, so " +
212
+ "check the ?toolkit= value in its MCP endpoint URL.");
213
+ return { ok: false, response: toolkitForbidden() };
214
+ }
215
+ if (requested === null)
216
+ return { ok: true, scope: { registry } };
217
+ const toolkit = toolkits?.get(requested);
218
+ if (toolkit)
219
+ return scopeFor(toolkit);
220
+ const configured = toolkits && toolkits.size > 0 ? [...toolkits.keys()] : [];
221
+ logger.warn("[connecta] rejected an /mcp connection asking for unknown toolkit " +
222
+ `${loggableValue(requested)} with 404. ` +
223
+ (configured.length > 0
224
+ ? `Configured toolkits: ${configured.join(", ")}.`
225
+ : "This deployment configures no toolkits, so no ?toolkit= value is accepted.") +
226
+ " The client sees a transport-level failure and never the reason, so " +
227
+ "check the ?toolkit= value in its MCP endpoint URL.");
228
+ const label = requested.length <= MAX_ECHOED_TOOLKIT_NAME &&
229
+ TOOLKIT_NAME_RE.test(requested)
230
+ ? `"${requested}"`
231
+ : "requested";
232
+ return {
233
+ ok: false,
234
+ response: new Response(JSON.stringify({
235
+ jsonrpc: "2.0",
236
+ id: null,
237
+ error: {
238
+ code: -32600,
239
+ message: `Unknown toolkit ${label}. Check the ?toolkit= value in this ` +
240
+ "deployment's MCP endpoint URL with the operator.",
241
+ },
242
+ }), {
243
+ status: 404,
244
+ headers: {
245
+ "Content-Type": "application/json",
246
+ "Cache-Control": "no-store",
247
+ },
248
+ }),
249
+ };
250
+ }
251
+ async function serveMcp(request, opts, baseUrl, actor, scope, runtimeContext) {
252
+ // Fresh McpServer + transport per request (SDK ≥1.26 requirement), stateless.
253
+ const server = new McpServer(opts.serverInfo, {
254
+ instructions: CONNECTA_INSTRUCTIONS,
255
+ });
256
+ const activity = opts.activity
257
+ ? {
258
+ sink: opts.activity,
259
+ actor,
260
+ requestId: crypto.randomUUID(),
261
+ serverInfo: opts.serverInfo,
262
+ ...(opts.activityDeploymentId
263
+ ? { deploymentId: opts.activityDeploymentId }
264
+ : {}),
265
+ ...(scope.toolkitId ? { toolkitId: scope.toolkitId } : {}),
266
+ ...(runtimeContext?.waitUntil
267
+ ? { defer: runtimeContext.waitUntil.bind(runtimeContext) }
268
+ : {}),
269
+ logger: opts.logger,
270
+ }
271
+ : undefined;
272
+ // `scope.registry` is the connection's VIEW — the full registry, or one
273
+ // toolkit's ScopedRegistry. Nothing below may reach for `opts.registry`.
274
+ const registry = scope.registry;
275
+ registerMetaTools(server, registry, {
276
+ baseUrl,
277
+ ...(activity ? { activity } : {}),
278
+ ...(opts.defaultToolTimeoutMs !== undefined
279
+ ? { defaultToolTimeoutMs: opts.defaultToolTimeoutMs }
280
+ : {}),
281
+ ...(opts.probeTimeoutMs !== undefined
282
+ ? { probeTimeoutMs: opts.probeTimeoutMs }
283
+ : {}),
284
+ ...(opts.discoveryConcurrency !== undefined
285
+ ? { discoveryConcurrency: opts.discoveryConcurrency }
286
+ : {}),
287
+ requestSignal: request.signal,
288
+ ...(runtimeContext
289
+ ? { defer: runtimeContext.waitUntil.bind(runtimeContext) }
290
+ : {}),
291
+ });
292
+ if (opts.executor) {
293
+ registerExecuteTool(server, registry, {
294
+ baseUrl,
295
+ executor: opts.executor,
296
+ logger: opts.logger,
297
+ ...(activity ? { activity } : {}),
298
+ requestSignal: request.signal,
299
+ ...(opts.discoveryConcurrency !== undefined
300
+ ? { discoveryConcurrency: opts.discoveryConcurrency }
301
+ : {}),
302
+ });
303
+ }
304
+ const transport = new WebStandardStreamableHTTPServerTransport({
305
+ enableJsonResponse: true,
306
+ });
307
+ await server.connect(transport);
308
+ return transport.handleRequest(request);
309
+ }
310
+ export function createMcpRoute(opts) {
311
+ let lastAdmissionWarningAt = 0;
312
+ let suppressedAdmissionWarnings = 0;
313
+ const warnAdmissionRejected = (error) => {
314
+ const now = Date.now();
315
+ if (now - lastAdmissionWarningAt < 1_000) {
316
+ suppressedAdmissionWarnings++;
317
+ return;
318
+ }
319
+ opts.logger.warn("[connecta] MCP request admission rejected", {
320
+ retryAfterMs: error.retryAfterMs,
321
+ active: opts.requestAdmission.activeCount,
322
+ queued: opts.requestAdmission.queuedCount,
323
+ suppressedSinceLastWarning: suppressedAdmissionWarnings,
324
+ });
325
+ lastAdmissionWarningAt = now;
326
+ suppressedAdmissionWarnings = 0;
327
+ };
328
+ return async function routeMcp(context) {
329
+ const { path, request, url, baseUrl, runtimeContext, sweepCredentials, } = context;
330
+ if (path !== "/mcp")
331
+ return null;
332
+ let admission;
333
+ try {
334
+ admission = await opts.requestAdmission.acquire({
335
+ signal: request.signal,
336
+ });
337
+ if (admission.waitMs > 0) {
338
+ opts.logger.debug("[connecta] MCP request admitted after queue wait", {
339
+ waitMs: admission.waitMs,
340
+ active: opts.requestAdmission.activeCount,
341
+ queued: opts.requestAdmission.queuedCount,
342
+ });
343
+ }
344
+ }
345
+ catch (error) {
346
+ if (error instanceof ExecutorAdmissionError &&
347
+ error.code === "executor_cancelled") {
348
+ throw request.signal.reason ?? error;
349
+ }
350
+ if (error instanceof ExecutorAdmissionError) {
351
+ if (error.code === "executor_overloaded") {
352
+ warnAdmissionRejected(error);
353
+ }
354
+ return withMcpCors(requestAdmissionFailure(error));
355
+ }
356
+ throw error;
357
+ }
358
+ try {
359
+ // Authenticate BEFORE resolving ?toolkit=: an unauthenticated caller
360
+ // must not be able to probe which toolkit names exist.
361
+ const authz = await authorize(request, baseUrl, opts.auth, opts.logger);
362
+ if (!authz.ok) {
363
+ return releaseAdmissionWithResponse(withMcpCors(authz.response), admission, request.signal);
364
+ }
365
+ const selected = resolveToolkitScope(url, opts.registry, opts.toolkits, opts.logger, {
366
+ actor: authz.actor,
367
+ ...(authz.toolkitBinding
368
+ ? { binding: authz.toolkitBinding }
369
+ : {}),
370
+ });
371
+ if (!selected.ok) {
372
+ return releaseAdmissionWithResponse(withMcpCors(selected.response), admission, request.signal);
373
+ }
374
+ sweepCredentials();
375
+ return releaseAdmissionWithResponse(withMcpCors(await serveMcp(request, opts, baseUrl, authz.actor, selected.scope, runtimeContext)), admission, request.signal);
376
+ }
377
+ catch (error) {
378
+ admission.release();
379
+ throw error;
380
+ }
381
+ };
382
+ }
383
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/routes/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type RouteContext } from "./shared.js";
2
+ export declare function routeOAuthManagement(context: RouteContext): Promise<Response | null>;
3
+ export declare function routeOAuthCallback(context: RouteContext): Promise<Response | null>;
4
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/routes/oauth.ts"],"names":[],"mappings":"AAQA,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAkGrB,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAS1B;AAyHD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAgF1B"}