@polpo-ai/connect-server 0.15.144 → 0.16.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 (83) hide show
  1. package/README.md +352 -1
  2. package/dist/custom-tool-runner-broker.d.ts +29 -0
  3. package/dist/custom-tool-runner-broker.d.ts.map +1 -0
  4. package/dist/custom-tool-runner-broker.js +140 -0
  5. package/dist/custom-tool-runner-broker.js.map +1 -0
  6. package/dist/definition-store.d.ts +10 -0
  7. package/dist/definition-store.d.ts.map +1 -0
  8. package/dist/definition-store.js +25 -0
  9. package/dist/definition-store.js.map +1 -0
  10. package/dist/index.d.ts +8 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +8 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/mcp-capability-resolver.d.ts +22 -0
  15. package/dist/mcp-capability-resolver.d.ts.map +1 -0
  16. package/dist/mcp-capability-resolver.js +110 -0
  17. package/dist/mcp-capability-resolver.js.map +1 -0
  18. package/dist/mcp-discovery.d.ts +7 -0
  19. package/dist/mcp-discovery.d.ts.map +1 -0
  20. package/dist/mcp-discovery.js +27 -0
  21. package/dist/mcp-discovery.js.map +1 -0
  22. package/dist/mcp-execution.d.ts +13 -0
  23. package/dist/mcp-execution.d.ts.map +1 -0
  24. package/dist/mcp-execution.js +14 -0
  25. package/dist/mcp-execution.js.map +1 -0
  26. package/dist/mcp-oauth-redirect.d.ts +4 -0
  27. package/dist/mcp-oauth-redirect.d.ts.map +1 -0
  28. package/dist/mcp-oauth-redirect.js +25 -0
  29. package/dist/mcp-oauth-redirect.js.map +1 -0
  30. package/dist/mcp-oauth.d.ts +12 -9
  31. package/dist/mcp-oauth.d.ts.map +1 -1
  32. package/dist/mcp-oauth.js +18 -6
  33. package/dist/mcp-oauth.js.map +1 -1
  34. package/dist/mcp-runner-broker.d.ts +29 -0
  35. package/dist/mcp-runner-broker.d.ts.map +1 -0
  36. package/dist/mcp-runner-broker.js +181 -0
  37. package/dist/mcp-runner-broker.js.map +1 -0
  38. package/dist/mcp-setup-clients.d.ts +24 -0
  39. package/dist/mcp-setup-clients.d.ts.map +1 -0
  40. package/dist/mcp-setup-clients.js +113 -0
  41. package/dist/mcp-setup-clients.js.map +1 -0
  42. package/dist/mcp-transport.d.ts +20 -0
  43. package/dist/mcp-transport.d.ts.map +1 -0
  44. package/dist/mcp-transport.js +163 -0
  45. package/dist/mcp-transport.js.map +1 -0
  46. package/dist/memory-store.d.ts +11 -2
  47. package/dist/memory-store.d.ts.map +1 -1
  48. package/dist/memory-store.js +81 -6
  49. package/dist/memory-store.js.map +1 -1
  50. package/dist/oauth-identity.d.ts +6 -0
  51. package/dist/oauth-identity.d.ts.map +1 -0
  52. package/dist/oauth-identity.js +30 -0
  53. package/dist/oauth-identity.js.map +1 -0
  54. package/dist/oauth-token-transport.d.ts +19 -0
  55. package/dist/oauth-token-transport.d.ts.map +1 -0
  56. package/dist/oauth-token-transport.js +133 -0
  57. package/dist/oauth-token-transport.js.map +1 -0
  58. package/dist/oauth.js +1 -1
  59. package/dist/oauth.js.map +1 -1
  60. package/dist/public-network.d.ts +11 -0
  61. package/dist/public-network.d.ts.map +1 -0
  62. package/dist/public-network.js +49 -0
  63. package/dist/public-network.js.map +1 -0
  64. package/dist/refresh-lineage.d.ts +21 -0
  65. package/dist/refresh-lineage.d.ts.map +1 -0
  66. package/dist/refresh-lineage.js +83 -0
  67. package/dist/refresh-lineage.js.map +1 -0
  68. package/dist/secrets.d.ts +2 -0
  69. package/dist/secrets.d.ts.map +1 -1
  70. package/dist/secrets.js.map +1 -1
  71. package/dist/service.d.ts +78 -8
  72. package/dist/service.d.ts.map +1 -1
  73. package/dist/service.js +1090 -403
  74. package/dist/service.js.map +1 -1
  75. package/dist/setup-lifecycle.d.ts +5 -0
  76. package/dist/setup-lifecycle.d.ts.map +1 -0
  77. package/dist/setup-lifecycle.js +36 -0
  78. package/dist/setup-lifecycle.js.map +1 -0
  79. package/dist/verification.d.ts +4 -0
  80. package/dist/verification.d.ts.map +1 -0
  81. package/dist/verification.js +76 -0
  82. package/dist/verification.js.map +1 -0
  83. package/package.json +4 -3
@@ -0,0 +1,181 @@
1
+ import { ConnectionSelectionError, createToolInvocationContext, McpRunnerRequestSchema, McpRunnerInventorySchema, MAX_MCP_RUNNER_REQUEST_BYTES, MAX_MCP_RUNNER_RESPONSE_BYTES, MCP_RUNNER_REQUEST_TIMEOUT_MS, } from "@polpo-ai/core";
2
+ import { isDeepStrictEqual } from "node:util";
3
+ import { ConnectError } from "@polpo-ai/connect";
4
+ export class McpRunnerBrokerError extends Error {
5
+ status;
6
+ constructor(status) {
7
+ super("MCP broker request failed");
8
+ this.status = status;
9
+ this.name = "McpRunnerBrokerError";
10
+ }
11
+ }
12
+ /** HTTP-neutral server entry, reusable by OSS hosts and managed adapters. The
13
+ * host owns opaque token storage, tenant identity and the run lifecycle. */
14
+ export function createMcpRunnerBroker(options) {
15
+ const report = (error) => {
16
+ try {
17
+ void Promise.resolve(options.onError?.(error)).catch(() => undefined);
18
+ }
19
+ catch { /* host diagnostics */ }
20
+ };
21
+ const json = (data, status = 200) => {
22
+ const body = JSON.stringify(data);
23
+ if (new TextEncoder().encode(body).byteLength > MAX_MCP_RUNNER_RESPONSE_BYTES)
24
+ throw new McpRunnerBrokerError(413);
25
+ return new Response(body, { status, headers: { "content-type": "application/json", "cache-control": "no-store" } });
26
+ };
27
+ return async (request) => {
28
+ if (request.method !== "POST")
29
+ return json({ ok: false, error: { code: "mcp_broker_denied" } }, 405);
30
+ const controller = new AbortController();
31
+ const abort = () => controller.abort();
32
+ request.signal.addEventListener("abort", abort, { once: true });
33
+ if (request.signal.aborted)
34
+ abort();
35
+ const timer = setTimeout(abort, MCP_RUNNER_REQUEST_TIMEOUT_MS);
36
+ const bounded = (work) => new Promise((resolve, reject) => {
37
+ if (controller.signal.aborted) {
38
+ reject(new McpRunnerBrokerError(408));
39
+ return;
40
+ }
41
+ const cancelled = () => reject(new McpRunnerBrokerError(408));
42
+ controller.signal.addEventListener("abort", cancelled, { once: true });
43
+ Promise.resolve().then(() => {
44
+ if (controller.signal.aborted)
45
+ throw new McpRunnerBrokerError(408);
46
+ return work();
47
+ }).then(resolve, reject).finally(() => controller.signal.removeEventListener("abort", cancelled));
48
+ });
49
+ let acquired;
50
+ const disposed = new WeakSet();
51
+ const dispose = async (capability) => {
52
+ if (disposed.has(capability))
53
+ return;
54
+ disposed.add(capability);
55
+ let cleanupTimer;
56
+ try {
57
+ await Promise.race([
58
+ Promise.resolve().then(() => capability.dispose()),
59
+ new Promise(resolve => { cleanupTimer = setTimeout(resolve, 1_000); }),
60
+ ]);
61
+ }
62
+ catch (error) {
63
+ report(error);
64
+ }
65
+ finally {
66
+ clearTimeout(cleanupTimer);
67
+ }
68
+ };
69
+ try {
70
+ const token = /^Bearer ([A-Za-z0-9_-]+)$/.exec(request.headers.get("authorization") ?? "")?.[1];
71
+ const sandboxId = request.headers.get("x-polpo-sandbox-id");
72
+ if (!token || token.length > 512 || !sandboxId || sandboxId.length > 512)
73
+ throw new McpRunnerBrokerError(401);
74
+ const lease = await bounded(() => options.authorize(token, sandboxId));
75
+ await bounded(() => lease.assertActive());
76
+ if (Number(request.headers.get("content-length")) > MAX_MCP_RUNNER_REQUEST_BYTES)
77
+ throw new McpRunnerBrokerError(413);
78
+ if (!request.body)
79
+ throw new McpRunnerBrokerError(400);
80
+ const reader = request.body.getReader();
81
+ const chunks = [];
82
+ let size = 0;
83
+ try {
84
+ while (true) {
85
+ const chunk = await bounded(() => reader.read());
86
+ if (chunk.done)
87
+ break;
88
+ size += chunk.value.byteLength;
89
+ if (size > MAX_MCP_RUNNER_REQUEST_BYTES)
90
+ throw new McpRunnerBrokerError(413);
91
+ chunks.push(chunk.value);
92
+ }
93
+ }
94
+ finally {
95
+ void reader.cancel().catch(() => undefined);
96
+ }
97
+ const bytes = new Uint8Array(size);
98
+ let offset = 0;
99
+ for (const chunk of chunks) {
100
+ bytes.set(chunk, offset);
101
+ offset += chunk.byteLength;
102
+ }
103
+ let raw;
104
+ try {
105
+ raw = JSON.parse(new TextDecoder().decode(bytes));
106
+ }
107
+ catch {
108
+ throw new McpRunnerBrokerError(400);
109
+ }
110
+ const parsed = McpRunnerRequestSchema.safeParse(raw);
111
+ if (!parsed.success)
112
+ throw new McpRunnerBrokerError(400);
113
+ const inventory = McpRunnerInventorySchema.safeParse(lease.inventory);
114
+ if (!inventory.success)
115
+ throw new McpRunnerBrokerError(403);
116
+ const invocation = createToolInvocationContext(lease.invocation);
117
+ if (!invocation.agent || invocation.agent.name !== lease.agentName)
118
+ throw new McpRunnerBrokerError(403);
119
+ const operation = parsed.data;
120
+ if (operation.operation === "inventory")
121
+ return json({ ok: true, data: inventory.data });
122
+ let selected;
123
+ for (const entry of inventory.data)
124
+ for (const tool of entry.tools) {
125
+ if (`mcp__${entry.serverName}__${tool.name}` === operation.capability)
126
+ selected = { serverName: entry.serverName, tool };
127
+ }
128
+ if (!selected)
129
+ throw new McpRunnerBrokerError(403);
130
+ await bounded(() => lease.claimCall(operation.toolCallId));
131
+ const providers = await bounded(() => lease.resolveCapabilities({ agentName: lease.agentName, invocation, signal: controller.signal }));
132
+ const provider = Object.hasOwn(providers, selected.serverName) ? providers[selected.serverName] : undefined;
133
+ const currentTool = provider?.tools.find(tool => tool.name === selected.tool.name);
134
+ if (!provider || !currentTool || currentTool.name !== selected.tool.name
135
+ || currentTool.description !== selected.tool.description
136
+ || !isDeepStrictEqual(currentTool.inputSchema, selected.tool.inputSchema))
137
+ throw new McpRunnerBrokerError(403);
138
+ await bounded(() => lease.assertActive());
139
+ const selectedName = selected.serverName;
140
+ const selectedTool = selected.tool.name;
141
+ await bounded(async () => {
142
+ const capability = await provider.resolver.resolve({ serverName: selectedName, toolName: selectedTool,
143
+ toolCallId: operation.toolCallId, invocation, signal: controller.signal });
144
+ // Register before returning through bounded(): cancellation can win the
145
+ // outer promise between this continuation and the caller's assignment.
146
+ acquired = capability;
147
+ if (controller.signal.aborted) {
148
+ void dispose(capability);
149
+ throw new McpRunnerBrokerError(408);
150
+ }
151
+ return capability;
152
+ });
153
+ await bounded(() => lease.assertActive());
154
+ const capability = acquired;
155
+ if (!capability)
156
+ throw new McpRunnerBrokerError(503);
157
+ const result = await bounded(() => capability.call(operation.arguments));
158
+ return json({ ok: true, data: result ?? null });
159
+ }
160
+ catch (error) {
161
+ report(error);
162
+ if (error instanceof ConnectError && error.code === "rate_limited" && error.status === 429) {
163
+ const value = error.details?.retryAfterSeconds;
164
+ const retryAfterSeconds = typeof value === "number" && Number.isSafeInteger(value) && value >= 1 && value <= 86400 ? value : 60;
165
+ const response = json({ ok: false, error: { code: "rate_limited", message: "Connection request limit exceeded", retryAfterSeconds } }, 429);
166
+ response.headers.set("retry-after", String(retryAfterSeconds));
167
+ return response;
168
+ }
169
+ const status = error instanceof McpRunnerBrokerError ? error.status : error instanceof ConnectionSelectionError ? 403 : 503;
170
+ return json({ ok: false, error: { code: "mcp_broker_denied", message: "MCP broker request failed" } }, status);
171
+ }
172
+ finally {
173
+ clearTimeout(timer);
174
+ request.signal.removeEventListener("abort", abort);
175
+ controller.abort();
176
+ if (acquired)
177
+ await dispose(acquired);
178
+ }
179
+ };
180
+ }
181
+ //# sourceMappingURL=mcp-runner-broker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-runner-broker.js","sourceRoot":"","sources":["../src/mcp-runner-broker.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EAAE,2BAA2B,EACrD,sBAAsB,EAAE,wBAAwB,EAChD,4BAA4B,EAAE,6BAA6B,EAAE,6BAA6B,GAG3F,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACxB;IAArB,YAAqB,MAAqD;QACxE,KAAK,CAAC,2BAA2B,CAAC,CAAC;QADhB,WAAM,GAAN,MAAM,CAA+C;QAExE,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAiBD;4EAC4E;AAC5E,MAAM,UAAU,qBAAqB,CAAC,OAGrC;IACC,MAAM,MAAM,GAAG,CAAC,KAAc,EAAE,EAAE;QAChC,IAAI,CAAC;YAAC,KAAK,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC;IACjH,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,IAAa,EAAE,MAAM,GAAG,GAAG,EAAE,EAAE;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,6BAA6B;YAAE,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACnH,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IACtH,CAAC,CAAC;IACF,OAAO,KAAK,EAAC,OAAO,EAAC,EAAE;QACrB,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QACrG,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACvC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO;YAAE,KAAK,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,CAAI,IAA0B,EAAc,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC7F,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAAC,MAAM,CAAC,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACjF,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9D,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC1B,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;oBAAE,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC;gBACnE,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QACpG,CAAC,CAAC,CAAC;QACH,IAAI,QAA2C,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAyB,CAAC;QACtD,MAAM,OAAO,GAAG,KAAK,EAAE,UAAiC,EAAE,EAAE;YAC1D,IAAI,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;gBAAE,OAAO;YACrC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACzB,IAAI,YAAuD,CAAC;YAC5D,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,IAAI,CAAC;oBACjB,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;oBAClD,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,GAAG,YAAY,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC7E,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;oBAC1B,CAAC;gBAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YAAC,CAAC;QACzC,CAAC,CAAC;QACF,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAChG,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAC5D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG;gBAAE,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAC9G,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;YACvE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1C,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,GAAG,4BAA4B;gBAAE,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC;YACtH,IAAI,CAAC,OAAO,CAAC,IAAI;gBAAE,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACxC,MAAM,MAAM,GAAiB,EAAE,CAAC;YAChC,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,IAAI,CAAC;gBACH,OAAO,IAAI,EAAE,CAAC;oBACZ,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;oBACjD,IAAI,KAAK,CAAC,IAAI;wBAAE,MAAM;oBACtB,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;oBAC/B,IAAI,IAAI,GAAG,4BAA4B;wBAAE,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC;oBAC7E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;oBAAS,CAAC;gBAAC,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAAC,CAAC;YAC1D,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAAC,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;YAAC,CAAC;YACrF,IAAI,GAAY,CAAC;YACjB,IAAI,CAAC;gBAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;YACzG,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC;YACzD,MAAM,SAAS,GAAG,wBAAwB,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACtE,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAC5D,MAAM,UAAU,GAAG,2BAA2B,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACjE,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,SAAS;gBAAE,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC;YACxG,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;YAC9B,IAAI,SAAS,CAAC,SAAS,KAAK,WAAW;gBAAE,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YACzF,IAAI,QAAqE,CAAC;YAC1E,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,IAAI;gBAAE,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBACnE,IAAI,QAAQ,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS,CAAC,UAAU;wBAAE,QAAQ,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;gBAC3H,CAAC;YACD,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC;YACnD,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;YAC3D,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACxI,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5G,MAAM,WAAW,GAAG,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpF,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI;mBACnE,WAAW,CAAC,WAAW,KAAK,QAAQ,CAAC,IAAI,CAAC,WAAW;mBACrD,CAAC,iBAAiB,CAAC,WAAW,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;gBAAE,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC;YACjH,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1C,MAAM,YAAY,GAAG,QAAQ,CAAC,UAAU,CAAC;YACzC,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YACxC,MAAM,OAAO,CAAC,KAAK,IAAI,EAAE;gBACvB,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY;oBACnG,UAAU,EAAE,SAAS,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC7E,wEAAwE;gBACxE,uEAAuE;gBACvE,QAAQ,GAAG,UAAU,CAAC;gBACtB,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBAAC,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;oBAAC,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC;gBAAC,CAAC;gBACjG,OAAO,UAAU,CAAC;YACpB,CAAC,CAAC,CAAC;YACH,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC;YAC5B,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;YACzE,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,CAAC;YACd,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC3F,MAAM,KAAK,GAAI,KAAK,CAAC,OAAuD,EAAE,iBAAiB,CAAC;gBAChG,MAAM,iBAAiB,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChI,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,mCAAmC,EAAE,iBAAiB,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;gBAC5I,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAC/D,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,YAAY,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,YAAY,wBAAwB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5H,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,2BAA2B,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACjH,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACnD,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,QAAQ;gBAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { type McpOAuthClientResolver, type McpOAuthClientResolverInput, type ResolvedMcpOAuthClient } from "@polpo-ai/connect";
2
+ export interface McpOAuthSetupClientReference {
3
+ id: string;
4
+ fingerprint: string;
5
+ }
6
+ /** Host configuration lookup only: no provider I/O and no browser-owned identity. */
7
+ export declare function resolveMcpOAuthSetupClient(resolver: McpOAuthClientResolver, input: McpOAuthClientResolverInput): Promise<{
8
+ client: ResolvedMcpOAuthClient;
9
+ reference: {
10
+ id: string;
11
+ fingerprint: string;
12
+ };
13
+ registrationNamespace: string;
14
+ }>;
15
+ /** Re-resolve before start/callback/activation; a saved ID is not permanent authorization. */
16
+ export declare function verifyMcpOAuthSetupClient(resolver: McpOAuthClientResolver, reference: McpOAuthSetupClientReference): Promise<{
17
+ client: ResolvedMcpOAuthClient;
18
+ reference: {
19
+ id: string;
20
+ fingerprint: string;
21
+ };
22
+ registrationNamespace: string;
23
+ }>;
24
+ //# sourceMappingURL=mcp-setup-clients.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-setup-clients.d.ts","sourceRoot":"","sources":["../src/mcp-setup-clients.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,sBAAsB,EAAE,KAAK,2BAA2B,EAAE,KAAK,sBAAsB,EAC3F,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,4BAA4B;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE;AAgEjF,qFAAqF;AACrF,wBAAsB,0BAA0B,CAAC,QAAQ,EAAE,sBAAsB,EAAE,KAAK,EAAE,2BAA2B;;;;;;;GAWpH;AAED,8FAA8F;AAC9F,wBAAsB,yBAAyB,CAAC,QAAQ,EAAE,sBAAsB,EAAE,SAAS,EAAE,4BAA4B;;;;;;;GAMxH"}
@@ -0,0 +1,113 @@
1
+ import { createHash } from "node:crypto";
2
+ import { ConnectError, connectorHostnameIsUnsafe, } from "@polpo-ai/connect";
3
+ import { normalizeMcpOAuthRedirect } from "./mcp-oauth-redirect.js";
4
+ function invalid() {
5
+ throw new ConnectError("setup_invalid", "MCP OAuth client configuration is unavailable or changed; restart setup");
6
+ }
7
+ function text(value) {
8
+ if (typeof value !== "string" || !value.trim() || value.length > 2048)
9
+ invalid();
10
+ return value.trim();
11
+ }
12
+ function https(value, document = false) {
13
+ let url;
14
+ try {
15
+ url = new URL(text(value));
16
+ }
17
+ catch {
18
+ invalid();
19
+ }
20
+ if (url.protocol !== "https:" || url.username || url.password || url.hash || connectorHostnameIsUnsafe(url.hostname)
21
+ || (document && url.pathname === "/"))
22
+ invalid();
23
+ for (const key of url.searchParams.keys()) {
24
+ if (/^(access_token|refresh_token|client_secret|api[_-]?key|authorization|password|token|secret|code|state)$/i.test(key))
25
+ invalid();
26
+ }
27
+ return url.toString();
28
+ }
29
+ function canonical(value, depth = 0) {
30
+ if (depth > 32)
31
+ invalid();
32
+ if (Array.isArray(value))
33
+ return value.map(item => canonical(item, depth + 1));
34
+ if (value && typeof value === "object")
35
+ return Object.fromEntries(Object.entries(value).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([key, item]) => [key, canonical(item, depth + 1)]));
36
+ return value;
37
+ }
38
+ function normalize(client) {
39
+ if (!client || !client.owner || !["project", "org", "platform", "instance"].includes(client.owner.type)
40
+ || !["http", "sse"].includes(client.transport) || !client.registration)
41
+ invalid();
42
+ const registration = client.registration;
43
+ let normalized;
44
+ if (registration.mode === "dynamic")
45
+ normalized = { mode: "dynamic", clientName: text(registration.clientName),
46
+ ...(registration.clientUri ? { clientUri: https(registration.clientUri) } : {}) };
47
+ else if (registration.mode === "metadata_document")
48
+ normalized = { mode: "metadata_document", clientMetadataUrl: https(registration.clientMetadataUrl, true) };
49
+ else if (registration.mode === "pre_registered") {
50
+ if (!registration.client || typeof registration.client !== "object" || Array.isArray(registration.client))
51
+ invalid();
52
+ let serialized;
53
+ try {
54
+ serialized = JSON.stringify(registration.client);
55
+ }
56
+ catch {
57
+ invalid();
58
+ }
59
+ if (serialized.length > 16_384)
60
+ invalid();
61
+ normalized = { mode: "pre_registered", client: { ...JSON.parse(serialized), client_id: text(registration.client.client_id) } };
62
+ }
63
+ else
64
+ invalid();
65
+ let redirectUri;
66
+ try {
67
+ redirectUri = normalizeMcpOAuthRedirect(text(client.redirectUri));
68
+ }
69
+ catch {
70
+ invalid();
71
+ }
72
+ return { id: text(client.id), providerId: text(client.providerId),
73
+ ...(client.authenticationId ? { authenticationId: text(client.authenticationId) } : {}),
74
+ owner: { type: client.owner.type, id: text(client.owner.id) }, resourceUrl: https(client.resourceUrl),
75
+ transport: client.transport, redirectUri, registration: normalized };
76
+ }
77
+ function resolved(raw) {
78
+ const client = normalize(raw);
79
+ const registration = structuredClone(client.registration);
80
+ if (registration.mode === "pre_registered") {
81
+ // Secret rotation keeps the registered client identity. It is resolved live.
82
+ delete registration.client.client_secret;
83
+ delete registration.client.client_secret_expires_at;
84
+ }
85
+ const fingerprint = createHash("sha256").update(JSON.stringify(canonical({ ...client, registration }))).digest("hex");
86
+ return { client, reference: { id: client.id, fingerprint }, registrationNamespace: fingerprint };
87
+ }
88
+ /** Host configuration lookup only: no provider I/O and no browser-owned identity. */
89
+ export async function resolveMcpOAuthSetupClient(resolver, input) {
90
+ const result = resolved(await resolver.resolve(input));
91
+ const client = result.client;
92
+ if (client.providerId !== input.providerId || (input.authenticationId && client.authenticationId !== input.authenticationId)
93
+ || (input.configurationId && client.id !== input.configurationId))
94
+ invalid();
95
+ const mode = input.mode ?? "managed";
96
+ const ownerAllowed = mode === "customer"
97
+ ? (client.owner.type === "project" && client.owner.id === input.projectId) || (client.owner.type === "org" && client.owner.id === input.orgId)
98
+ : mode === "instance" ? client.owner.type === "instance" : mode === "managed" && client.owner.type === "platform";
99
+ if (!ownerAllowed)
100
+ invalid();
101
+ return result;
102
+ }
103
+ /** Re-resolve before start/callback/activation; a saved ID is not permanent authorization. */
104
+ export async function verifyMcpOAuthSetupClient(resolver, reference) {
105
+ const client = await resolver.resolveById(reference.id);
106
+ if (!client)
107
+ invalid();
108
+ const result = resolved(client);
109
+ if (result.reference.id !== reference.id || result.reference.fingerprint !== reference.fingerprint)
110
+ invalid();
111
+ return result;
112
+ }
113
+ //# sourceMappingURL=mcp-setup-clients.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-setup-clients.js","sourceRoot":"","sources":["../src/mcp-setup-clients.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ export interface RemoteMcpTransportInput {
3
+ url: string;
4
+ transport?: "http" | "sse";
5
+ /** Host-resolved credentials; never expose these as model tool arguments. */
6
+ headers?: Record<string, string>;
7
+ /** Host authorization and current credentials, rechecked before EVERY HTTP send. */
8
+ authorize?: () => Promise<HeadersInit | undefined>;
9
+ /** Host budget debit, after authorization and before each actual HTTP send. */
10
+ beforeDispatch?: (input: {
11
+ method: string;
12
+ }) => Promise<void>;
13
+ signal?: AbortSignal;
14
+ timeoutMs?: number;
15
+ /** An injected host transport must provide equivalent DNS/socket enforcement. */
16
+ fetch?: typeof globalThis.fetch;
17
+ }
18
+ /** Bounded native MCP lifecycle shared by verification and authorized execution. */
19
+ export declare function withRemoteMcpClient<T>(input: RemoteMcpTransportInput, run: (client: Client, signal: AbortSignal) => Promise<T>): Promise<T>;
20
+ //# sourceMappingURL=mcp-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-transport.d.ts","sourceRoot":"","sources":["../src/mcp-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAOnE,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC3B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IACnD,+EAA+E;IAC/E,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAQD,oFAAoF;AACpF,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,uBAAuB,EACzE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA0HtE"}
@@ -0,0 +1,163 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
3
+ import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
4
+ import { ConnectionSelectionError } from "@polpo-ai/core";
5
+ import { ConnectError, connectorHostnameIsUnsafe } from "@polpo-ai/connect";
6
+ import { publicNetworkFetch } from "./public-network.js";
7
+ const MAX_RESPONSE_BYTES = 2 * 1024 * 1024;
8
+ const failed = (category, providerStatus) => new ConnectError("http_error", "MCP request failed", {
9
+ details: { category, ...(providerStatus === undefined ? {} : { providerStatus }) },
10
+ });
11
+ const denied = () => new ConnectError("policy_denied", "MCP destination is not allowed");
12
+ /** Bounded native MCP lifecycle shared by verification and authorized execution. */
13
+ export async function withRemoteMcpClient(input, run) {
14
+ let endpoint;
15
+ try {
16
+ endpoint = new URL(input.url);
17
+ }
18
+ catch {
19
+ throw denied();
20
+ }
21
+ if (endpoint.protocol !== "https:" || endpoint.username || endpoint.password || endpoint.hash || connectorHostnameIsUnsafe(endpoint.hostname))
22
+ throw denied();
23
+ const controller = new AbortController();
24
+ const client = new Client({ name: "polpo-connect", version: "1" }, { capabilities: {} });
25
+ const readers = new Set();
26
+ const safeError = (error) => error instanceof ConnectError || error instanceof ConnectionSelectionError ? error : failed("transport_failed");
27
+ let failure;
28
+ let rejectDeadline = () => { };
29
+ const deadline = new Promise((_, reject) => { rejectDeadline = reject; });
30
+ const stop = (error) => {
31
+ failure ??= error;
32
+ rejectDeadline(failure);
33
+ controller.abort();
34
+ for (const reader of readers)
35
+ void reader.cancel().catch(() => undefined);
36
+ void client.close().catch(() => undefined);
37
+ };
38
+ const abort = () => stop(failed("aborted"));
39
+ const timeout = setTimeout(abort, Math.min(Math.max(input.timeoutMs ?? 30_000, 1), 30_000));
40
+ input.signal?.addEventListener("abort", abort, { once: true });
41
+ const fetchBounded = async (resource, init) => {
42
+ try {
43
+ if (controller.signal.aborted)
44
+ throw failure ?? failed("aborted");
45
+ const url = new URL(resource instanceof Request ? resource.url : String(resource));
46
+ // SSE can advertise a POST path, but it cannot redirect credentials to
47
+ // another origin. The public transport pins DNS for the actual socket.
48
+ if (url.origin !== endpoint.origin || url.username || url.password || url.hash
49
+ || (input.transport !== "sse" && (url.pathname !== endpoint.pathname || url.search !== endpoint.search)))
50
+ throw denied();
51
+ const headers = new Headers(init?.headers);
52
+ if (input.authorize) {
53
+ const authorizedHeaders = new Headers(await input.authorize());
54
+ authorizedHeaders.forEach((value, name) => headers.set(name, value));
55
+ }
56
+ if (controller.signal.aborted)
57
+ throw failure ?? failed("aborted");
58
+ await input.beforeDispatch?.({ method: init?.method ?? (resource instanceof Request ? resource.method : "GET") });
59
+ if (controller.signal.aborted)
60
+ throw failure ?? failed("aborted");
61
+ const response = await (input.fetch ?? publicNetworkFetch)(resource, {
62
+ ...init, headers, redirect: "error", signal: controller.signal,
63
+ });
64
+ if (controller.signal.aborted) {
65
+ void response.body?.cancel().catch(() => undefined);
66
+ throw failure ?? failed("aborted");
67
+ }
68
+ // Streamable HTTP may reject its optional listening GET or session DELETE.
69
+ if (!response.ok && !((init?.method === "GET" || init?.method === "DELETE") && response.status === 405)) {
70
+ void response.body?.cancel().catch(() => undefined);
71
+ throw failed("provider_rejected", response.status);
72
+ }
73
+ if (Number(response.headers.get("content-length")) > MAX_RESPONSE_BYTES) {
74
+ void response.body?.cancel().catch(() => undefined);
75
+ throw failed("response_too_large");
76
+ }
77
+ if (!response.body)
78
+ return response;
79
+ const reader = response.body.getReader();
80
+ readers.add(reader);
81
+ let size = 0;
82
+ let cancelled = false;
83
+ const body = new ReadableStream({
84
+ async pull(stream) {
85
+ try {
86
+ const { value, done } = await reader.read();
87
+ if (cancelled)
88
+ return;
89
+ if (done) {
90
+ readers.delete(reader);
91
+ stream.close();
92
+ return;
93
+ }
94
+ size += value.byteLength;
95
+ if (size > MAX_RESPONSE_BYTES)
96
+ throw failed("response_too_large");
97
+ stream.enqueue(value);
98
+ }
99
+ catch (error) {
100
+ // The SDK cancels a Streamable HTTP SSE body once its response is
101
+ // received. A pending pull must not turn that normal close into a
102
+ // failure of the following tools/list request.
103
+ if (cancelled || controller.signal.aborted)
104
+ return;
105
+ const safe = safeError(error);
106
+ stream.error(safe);
107
+ stop(safe);
108
+ }
109
+ },
110
+ cancel() { cancelled = true; readers.delete(reader); return reader.cancel().catch(() => undefined); },
111
+ });
112
+ return new Response(body, { status: response.status, statusText: response.statusText, headers: response.headers });
113
+ }
114
+ catch (error) {
115
+ const safe = safeError(error);
116
+ stop(safe);
117
+ throw safe;
118
+ }
119
+ };
120
+ const requestInit = { headers: input.authorize ? undefined : input.headers, redirect: "error" };
121
+ const transport = input.transport === "sse"
122
+ ? new SSEClientTransport(endpoint, { fetch: fetchBounded, requestInit })
123
+ : new StreamableHTTPClientTransport(endpoint, { fetch: fetchBounded, requestInit,
124
+ reconnectionOptions: { maxRetries: 0, initialReconnectionDelay: 1000, maxReconnectionDelay: 1000, reconnectionDelayGrowFactor: 1 } });
125
+ try {
126
+ if (input.signal?.aborted)
127
+ abort();
128
+ return await Promise.race([deadline, (async () => {
129
+ if (controller.signal.aborted)
130
+ throw failure ?? failed("aborted");
131
+ await client.connect(transport);
132
+ return run(client, controller.signal);
133
+ })()]);
134
+ }
135
+ catch (error) {
136
+ throw failure ?? (error instanceof ConnectError || error instanceof ConnectionSelectionError ? error : failed("invalid_response"));
137
+ }
138
+ finally {
139
+ // close() only tears down the local transport. A stateful HTTP server also
140
+ // needs DELETE. Reauthorize it like every send, and never turn a completed
141
+ // mutation into an apparent failure if remote cleanup is unavailable.
142
+ if (transport instanceof StreamableHTTPClientTransport && transport.sessionId && !controller.signal.aborted) {
143
+ let cleanupTimeout;
144
+ try {
145
+ await Promise.race([
146
+ transport.terminateSession().catch(() => undefined),
147
+ new Promise(resolve => { cleanupTimeout = setTimeout(() => { controller.abort(); resolve(); }, 1000); }),
148
+ deadline.catch(() => undefined),
149
+ ]);
150
+ }
151
+ finally {
152
+ clearTimeout(cleanupTimeout);
153
+ }
154
+ }
155
+ clearTimeout(timeout);
156
+ input.signal?.removeEventListener("abort", abort);
157
+ controller.abort();
158
+ for (const reader of readers)
159
+ void reader.cancel().catch(() => undefined);
160
+ await client.close().catch(() => undefined);
161
+ }
162
+ }
163
+ //# sourceMappingURL=mcp-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-transport.js","sourceRoot":"","sources":["../src/mcp-transport.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { type ConnectStore, type ConnectionLink, type ConnectionLinkListFilter, type ConnectionLinkStore, type ConnectionListFilter, type ConnectionRecord, type ConnectionSetupSession, type ConnectionSetupSessionStore, type OAuthStateRecord } from "@polpo-ai/connect";
1
+ import { type McpOAuthConnectionCommit, type McpOAuthSetupCommit, type McpOAuthSetupFailure, type ConnectionSetupCompletionIntent, type ConnectionSetupOutcome, type OAuthReconnectSnapshot, type OAuthCredentialReplacement, type ConnectStore, type ConnectionLink, type ConnectionLinkListFilter, type ConnectionLinkStore, type ConnectionListFilter, type ConnectionRecord, type ConnectionSetupSession, type ConnectionSetupSessionStore, type OAuthStateRecord } from "@polpo-ai/connect";
2
2
  export declare class MemoryConnectStore implements ConnectStore, ConnectionLinkStore, ConnectionSetupSessionStore {
3
3
  private readonly connections;
4
4
  private readonly oauthStates;
@@ -9,9 +9,13 @@ export declare class MemoryConnectStore implements ConnectStore, ConnectionLinkS
9
9
  upsertConnection(record: ConnectionRecord): Promise<ConnectionRecord>;
10
10
  updateConnection(id: string, patch: Partial<Omit<ConnectionRecord, "id" | "createdAt">>): Promise<ConnectionRecord>;
11
11
  deleteConnection(id: string): Promise<void>;
12
+ replaceOAuthCredential(expected: OAuthReconnectSnapshot, replacement: OAuthCredentialReplacement): Promise<ConnectionRecord | null>;
12
13
  saveOAuthState(record: OAuthStateRecord): Promise<void>;
13
14
  consumeOAuthState(state: string): Promise<OAuthStateRecord | null>;
14
15
  getOAuthState(state: string): Promise<OAuthStateRecord | null>;
16
+ commitMcpOAuthConnection(input: McpOAuthConnectionCommit): Promise<ConnectionRecord | null>;
17
+ commitMcpOAuthSetup(input: McpOAuthSetupCommit): Promise<ConnectionRecord | null>;
18
+ failMcpOAuthSetup(input: McpOAuthSetupFailure): Promise<ConnectionSetupSession | null>;
15
19
  claimOAuthState(state: string, claimToken: string, claimExpiresAt: string, now: string): Promise<OAuthStateRecord | null>;
16
20
  completeOAuthState(state: string, claimToken: string, connectionId: string): Promise<OAuthStateRecord | null>;
17
21
  releaseOAuthState(state: string, claimToken: string, errorCode: string): Promise<OAuthStateRecord | null>;
@@ -21,6 +25,11 @@ export declare class MemoryConnectStore implements ConnectStore, ConnectionLinkS
21
25
  updateConnectionLink(id: string, patch: Partial<Omit<ConnectionLink, "id" | "createdAt">>): Promise<ConnectionLink>;
22
26
  saveConnectionSetupSession(session: ConnectionSetupSession): Promise<void>;
23
27
  getConnectionSetupSession(id: string): Promise<ConnectionSetupSession | null>;
24
- consumeConnectionSetupSession(id: string, consumedAt: string): Promise<ConnectionSetupSession | null>;
28
+ getConnectionSetupSessionByReference(reference: string): Promise<ConnectionSetupSession | null>;
29
+ consumeConnectionSetupSession(id: string, consumedAt: string, authorizationExpiresAt?: string): Promise<ConnectionSetupSession | null>;
30
+ cancelConnectionSetupSession(id: string, cancelledAt: string): Promise<ConnectionSetupSession | null>;
31
+ prepareConnectionSetupCompletion(reference: string, intent: ConnectionSetupCompletionIntent): Promise<ConnectionSetupSession | null>;
32
+ reconcileConnectionSetupSession(reference: string): Promise<ConnectionSetupSession | null>;
33
+ finishConnectionSetupSession(reference: string, outcome: ConnectionSetupOutcome, _finishedAt: string): Promise<ConnectionSetupSession | null>;
25
34
  }
26
35
  //# sourceMappingURL=memory-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../src/memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EAChC,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,kBAAmB,YAAW,YAAY,EAAE,mBAAmB,EAAE,2BAA2B;IACvG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuC;IACnE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuC;IACnE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAC3D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6C;IAErE,eAAe,CAAC,MAAM,GAAE,oBAAyB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAI/E,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAK3D,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAKrE,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQnH,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAMlE,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAK9D,eAAe,CACnB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAmB7B,kBAAkB,CACtB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAe7B,iBAAiB,CACrB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAc7B,mBAAmB,CAAC,MAAM,GAAE,wBAA6B,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAQrF,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAK7D,oBAAoB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAKnE,oBAAoB,CACxB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC,GACvD,OAAO,CAAC,cAAc,CAAC;IAQpB,0BAA0B,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1E,yBAAyB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAK7E,6BAA6B,CACjC,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;CAO1C"}
1
+ {"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../src/memory-store.ts"],"names":[],"mappings":"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"}