@bastani/atomic 0.9.25-alpha.3 → 0.9.25-alpha.4

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 (178) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/builtin/intercom/package.json +1 -1
  3. package/dist/builtin/mcp/CHANGELOG.md +30 -0
  4. package/dist/builtin/mcp/OAUTH.md +59 -269
  5. package/dist/builtin/mcp/README.md +58 -345
  6. package/dist/builtin/mcp/index.bundle.mjs +4 -28073
  7. package/dist/builtin/mcp/native-client-licenses/LICENSES/modelcontextprotocol-typescript-sdk.txt +21 -0
  8. package/dist/builtin/mcp/native-client-licenses/NOTICE +30 -0
  9. package/dist/builtin/mcp/package.json +4 -25
  10. package/dist/builtin/subagents/package.json +1 -1
  11. package/dist/builtin/web-access/package.json +1 -1
  12. package/dist/builtin/workflows/package.json +1 -1
  13. package/dist/cli/args.d.ts.map +1 -1
  14. package/dist/cli/args.js +2 -1
  15. package/dist/cli/args.js.map +1 -1
  16. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  17. package/dist/core/agent-session-extension-bindings.js +87 -5
  18. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  19. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  20. package/dist/core/agent-session-tool-registry.js +6 -3
  21. package/dist/core/agent-session-tool-registry.js.map +1 -1
  22. package/dist/core/extensions/context-types.d.ts +3 -1
  23. package/dist/core/extensions/context-types.d.ts.map +1 -1
  24. package/dist/core/extensions/context-types.js.map +1 -1
  25. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  26. package/dist/core/extensions/loader-api.js +4 -0
  27. package/dist/core/extensions/loader-api.js.map +1 -1
  28. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  29. package/dist/core/extensions/loader-virtual-modules.js +3 -0
  30. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  31. package/dist/core/mcp-child-policy.d.ts +11 -0
  32. package/dist/core/mcp-child-policy.d.ts.map +1 -0
  33. package/dist/core/mcp-child-policy.js +31 -0
  34. package/dist/core/mcp-child-policy.js.map +1 -0
  35. package/dist/core/mcp-servers.d.ts +32 -26
  36. package/dist/core/mcp-servers.d.ts.map +1 -1
  37. package/dist/core/mcp-servers.js +148 -1
  38. package/dist/core/mcp-servers.js.map +1 -1
  39. package/dist/core/package-manager-manifest.js.map +1 -1
  40. package/dist/core/package-manager-mcp-servers.js +1 -1
  41. package/dist/core/package-manager-mcp-servers.js.map +1 -1
  42. package/dist/core/sdk.js +10 -1
  43. package/dist/core/sdk.js.map +1 -1
  44. package/dist/core/tools/truncate.d.ts +8 -0
  45. package/dist/core/tools/truncate.d.ts.map +1 -1
  46. package/dist/core/tools/truncate.js +24 -0
  47. package/dist/core/tools/truncate.js.map +1 -1
  48. package/dist/extensions/mcp/cli.d.ts +21 -0
  49. package/dist/extensions/mcp/cli.d.ts.map +1 -0
  50. package/dist/extensions/mcp/cli.js +500 -0
  51. package/dist/extensions/mcp/cli.js.map +1 -0
  52. package/dist/extensions/mcp/cli.lazy.d.ts +3 -0
  53. package/dist/extensions/mcp/cli.lazy.d.ts.map +1 -0
  54. package/dist/extensions/mcp/cli.lazy.js +3 -0
  55. package/dist/extensions/mcp/cli.lazy.js.map +1 -0
  56. package/dist/extensions/mcp/client/auth-provider.d.ts +15 -0
  57. package/dist/extensions/mcp/client/auth-provider.d.ts.map +1 -0
  58. package/dist/extensions/mcp/client/auth-provider.js +2 -0
  59. package/dist/extensions/mcp/client/auth-provider.js.map +1 -0
  60. package/dist/extensions/mcp/client/client.d.ts +89 -0
  61. package/dist/extensions/mcp/client/client.d.ts.map +1 -0
  62. package/dist/extensions/mcp/client/client.js +457 -0
  63. package/dist/extensions/mcp/client/client.js.map +1 -0
  64. package/dist/extensions/mcp/client/index.d.ts +9 -0
  65. package/dist/extensions/mcp/client/index.d.ts.map +1 -0
  66. package/dist/extensions/mcp/client/index.js +7 -0
  67. package/dist/extensions/mcp/client/index.js.map +1 -0
  68. package/dist/extensions/mcp/client/oauth/callback.d.ts +42 -0
  69. package/dist/extensions/mcp/client/oauth/callback.d.ts.map +1 -0
  70. package/dist/extensions/mcp/client/oauth/callback.js +106 -0
  71. package/dist/extensions/mcp/client/oauth/callback.js.map +1 -0
  72. package/dist/extensions/mcp/client/oauth/discovery.d.ts +27 -0
  73. package/dist/extensions/mcp/client/oauth/discovery.d.ts.map +1 -0
  74. package/dist/extensions/mcp/client/oauth/discovery.js +153 -0
  75. package/dist/extensions/mcp/client/oauth/discovery.js.map +1 -0
  76. package/dist/extensions/mcp/client/oauth/errors.d.ts +24 -0
  77. package/dist/extensions/mcp/client/oauth/errors.d.ts.map +1 -0
  78. package/dist/extensions/mcp/client/oauth/errors.js +46 -0
  79. package/dist/extensions/mcp/client/oauth/errors.js.map +1 -0
  80. package/dist/extensions/mcp/client/oauth/flow.d.ts +82 -0
  81. package/dist/extensions/mcp/client/oauth/flow.d.ts.map +1 -0
  82. package/dist/extensions/mcp/client/oauth/flow.js +292 -0
  83. package/dist/extensions/mcp/client/oauth/flow.js.map +1 -0
  84. package/dist/extensions/mcp/client/oauth/index.d.ts +7 -0
  85. package/dist/extensions/mcp/client/oauth/index.d.ts.map +1 -0
  86. package/dist/extensions/mcp/client/oauth/index.js +6 -0
  87. package/dist/extensions/mcp/client/oauth/index.js.map +1 -0
  88. package/dist/extensions/mcp/client/oauth/provider.d.ts +59 -0
  89. package/dist/extensions/mcp/client/oauth/provider.d.ts.map +1 -0
  90. package/dist/extensions/mcp/client/oauth/provider.js +116 -0
  91. package/dist/extensions/mcp/client/oauth/provider.js.map +1 -0
  92. package/dist/extensions/mcp/client/oauth/types.d.ts +77 -0
  93. package/dist/extensions/mcp/client/oauth/types.d.ts.map +1 -0
  94. package/dist/extensions/mcp/client/oauth/types.js +109 -0
  95. package/dist/extensions/mcp/client/oauth/types.js.map +1 -0
  96. package/dist/extensions/mcp/client/protocol/content.d.ts +82 -0
  97. package/dist/extensions/mcp/client/protocol/content.d.ts.map +1 -0
  98. package/dist/extensions/mcp/client/protocol/content.js +41 -0
  99. package/dist/extensions/mcp/client/protocol/content.js.map +1 -0
  100. package/dist/extensions/mcp/client/protocol/jsonrpc.d.ts +59 -0
  101. package/dist/extensions/mcp/client/protocol/jsonrpc.d.ts.map +1 -0
  102. package/dist/extensions/mcp/client/protocol/jsonrpc.js +67 -0
  103. package/dist/extensions/mcp/client/protocol/jsonrpc.js.map +1 -0
  104. package/dist/extensions/mcp/client/protocol/types.d.ts +123 -0
  105. package/dist/extensions/mcp/client/protocol/types.d.ts.map +1 -0
  106. package/dist/extensions/mcp/client/protocol/types.js +7 -0
  107. package/dist/extensions/mcp/client/protocol/types.js.map +1 -0
  108. package/dist/extensions/mcp/client/testing/index.d.ts +2 -0
  109. package/dist/extensions/mcp/client/testing/index.d.ts.map +1 -0
  110. package/dist/extensions/mcp/client/testing/index.js +2 -0
  111. package/dist/extensions/mcp/client/testing/index.js.map +1 -0
  112. package/dist/extensions/mcp/client/transports/in-memory.d.ts +19 -0
  113. package/dist/extensions/mcp/client/transports/in-memory.d.ts.map +1 -0
  114. package/dist/extensions/mcp/client/transports/in-memory.js +50 -0
  115. package/dist/extensions/mcp/client/transports/in-memory.js.map +1 -0
  116. package/dist/extensions/mcp/client/transports/stdio.d.ts +32 -0
  117. package/dist/extensions/mcp/client/transports/stdio.d.ts.map +1 -0
  118. package/dist/extensions/mcp/client/transports/stdio.js +201 -0
  119. package/dist/extensions/mcp/client/transports/stdio.js.map +1 -0
  120. package/dist/extensions/mcp/client/transports/streamable-http.d.ts +96 -0
  121. package/dist/extensions/mcp/client/transports/streamable-http.d.ts.map +1 -0
  122. package/dist/extensions/mcp/client/transports/streamable-http.js +456 -0
  123. package/dist/extensions/mcp/client/transports/streamable-http.js.map +1 -0
  124. package/dist/extensions/mcp/client/transports/transport.d.ts +28 -0
  125. package/dist/extensions/mcp/client/transports/transport.d.ts.map +1 -0
  126. package/dist/extensions/mcp/client/transports/transport.js +38 -0
  127. package/dist/extensions/mcp/client/transports/transport.js.map +1 -0
  128. package/dist/extensions/mcp/config.d.ts +72 -0
  129. package/dist/extensions/mcp/config.d.ts.map +1 -0
  130. package/dist/extensions/mcp/config.js +158 -0
  131. package/dist/extensions/mcp/config.js.map +1 -0
  132. package/dist/extensions/mcp/index.d.ts +76 -0
  133. package/dist/extensions/mcp/index.d.ts.map +1 -0
  134. package/dist/extensions/mcp/index.js +1119 -0
  135. package/dist/extensions/mcp/index.js.map +1 -0
  136. package/dist/extensions/mcp/log.d.ts +16 -0
  137. package/dist/extensions/mcp/log.d.ts.map +1 -0
  138. package/dist/extensions/mcp/log.js +66 -0
  139. package/dist/extensions/mcp/log.js.map +1 -0
  140. package/dist/extensions/mcp/oauth.d.ts +103 -0
  141. package/dist/extensions/mcp/oauth.d.ts.map +1 -0
  142. package/dist/extensions/mcp/oauth.js +382 -0
  143. package/dist/extensions/mcp/oauth.js.map +1 -0
  144. package/dist/extensions/mcp/resources.d.ts +43 -0
  145. package/dist/extensions/mcp/resources.d.ts.map +1 -0
  146. package/dist/extensions/mcp/resources.js +262 -0
  147. package/dist/extensions/mcp/resources.js.map +1 -0
  148. package/dist/extensions/mcp/runtime.d.ts +104 -0
  149. package/dist/extensions/mcp/runtime.d.ts.map +1 -0
  150. package/dist/extensions/mcp/runtime.js +546 -0
  151. package/dist/extensions/mcp/runtime.js.map +1 -0
  152. package/dist/extensions/mcp/runtime.lazy.d.ts +3 -0
  153. package/dist/extensions/mcp/runtime.lazy.d.ts.map +1 -0
  154. package/dist/extensions/mcp/runtime.lazy.js +3 -0
  155. package/dist/extensions/mcp/runtime.lazy.js.map +1 -0
  156. package/dist/extensions/mcp/tools.d.ts +84 -0
  157. package/dist/extensions/mcp/tools.d.ts.map +1 -0
  158. package/dist/extensions/mcp/tools.js +251 -0
  159. package/dist/extensions/mcp/tools.js.map +1 -0
  160. package/dist/extensions/mcp/ui.d.ts +60 -0
  161. package/dist/extensions/mcp/ui.d.ts.map +1 -0
  162. package/dist/extensions/mcp/ui.js +175 -0
  163. package/dist/extensions/mcp/ui.js.map +1 -0
  164. package/dist/index.d.ts +5 -1
  165. package/dist/index.d.ts.map +1 -1
  166. package/dist/index.js +5 -0
  167. package/dist/index.js.map +1 -1
  168. package/dist/main.d.ts.map +1 -1
  169. package/dist/main.js +7 -0
  170. package/dist/main.js.map +1 -1
  171. package/docs/extensions/api-reference.md +3 -3
  172. package/docs/extensions.md +8 -8
  173. package/docs/mcp-servers.md +153 -79
  174. package/docs/packages/authoring.md +2 -2
  175. package/npm-shrinkwrap.json +32 -32
  176. package/package.json +3 -3
  177. package/dist/builtin/mcp/app-bridge.bundle.js +0 -67
  178. package/dist/builtin/mcp/xdg-open +0 -1267
@@ -0,0 +1,7 @@
1
+ export const LATEST_PROTOCOL_VERSION = "2025-11-25";
2
+ /**
3
+ * Versions the client accepts from a server. Servers that do not support the requested version answer
4
+ * with their own latest one, so older versions stay accepted for servers built on older SDKs.
5
+ */
6
+ export const SUPPORTED_PROTOCOL_VERSIONS = [LATEST_PROTOCOL_VERSION, "2025-06-18", "2025-03-26", "2024-11-05"];
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/extensions/mcp/client/protocol/types.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,uBAAuB,GAAG,YAAY,CAAC;AACpD;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,uBAAuB,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,CAAU,CAAC","sourcesContent":["import type { BlobResourceContents, ContentAnnotations, TextResourceContents } from \"./content.js\";\nimport type { JsonRpcId } from \"./jsonrpc.js\";\n\nexport const LATEST_PROTOCOL_VERSION = \"2025-11-25\";\n/**\n * Versions the client accepts from a server. Servers that do not support the requested version answer\n * with their own latest one, so older versions stay accepted for servers built on older SDKs.\n */\nexport const SUPPORTED_PROTOCOL_VERSIONS = [LATEST_PROTOCOL_VERSION, \"2025-06-18\", \"2025-03-26\", \"2024-11-05\"] as const;\nexport type SupportedProtocolVersion = (typeof SUPPORTED_PROTOCOL_VERSIONS)[number];\n\nexport interface Implementation {\n\tname: string;\n\tversion: string;\n\ttitle?: string;\n}\n\nexport interface Root {\n\turi: string;\n\tname?: string;\n}\n\nexport interface ClientCapabilities {\n\texperimental?: Record<string, unknown>;\n\troots?: { listChanged?: boolean };\n\tsampling?: Record<string, unknown>;\n\telicitation?: Record<string, unknown>;\n}\n\nexport interface ServerCapabilities {\n\texperimental?: Record<string, unknown>;\n\tlogging?: Record<string, unknown>;\n\tprompts?: { listChanged?: boolean };\n\tresources?: { subscribe?: boolean; listChanged?: boolean };\n\ttools?: { listChanged?: boolean };\n\tcompletions?: Record<string, unknown>;\n}\n\nexport interface InitializeParams {\n\tprotocolVersion: string;\n\tcapabilities: ClientCapabilities;\n\tclientInfo: Implementation;\n}\n\nexport interface InitializeResult {\n\tprotocolVersion: string;\n\tcapabilities: ServerCapabilities;\n\tserverInfo: Implementation;\n\tinstructions?: string;\n}\n\nexport interface ProgressNotification {\n\tprogressToken: string | number;\n\tprogress: number;\n\ttotal?: number;\n\tmessage?: string;\n}\n\nexport interface CancelledNotification {\n\trequestId: JsonRpcId;\n\treason?: string;\n}\n\nexport interface ToolAnnotations {\n\ttitle?: string;\n\treadOnlyHint?: boolean;\n\tdestructiveHint?: boolean;\n\tidempotentHint?: boolean;\n\topenWorldHint?: boolean;\n}\n\nexport interface ToolExecution {\n\ttaskSupport?: \"forbidden\" | \"optional\" | \"required\";\n}\n\nexport interface Tool {\n\tname: string;\n\ttitle?: string;\n\tdescription?: string;\n\tinputSchema: Record<string, unknown>;\n\toutputSchema?: Record<string, unknown>;\n\tannotations?: ToolAnnotations;\n\texecution?: ToolExecution;\n\t_meta?: Record<string, unknown>;\n}\n\nexport interface ListToolsResult {\n\ttools: Tool[];\n\tnextCursor?: string;\n\t_meta?: Record<string, unknown>;\n}\n\n/** A resource a server lists in `resources/list`. */\nexport interface Resource {\n\turi: string;\n\tname: string;\n\ttitle?: string;\n\tdescription?: string;\n\tmimeType?: string;\n\tsize?: number;\n\tannotations?: ContentAnnotations;\n\t_meta?: Record<string, unknown>;\n}\n\n/** A family of resources, addressed by an RFC 6570 URI template, from `resources/templates/list`. */\nexport interface ResourceTemplate {\n\turiTemplate: string;\n\tname: string;\n\ttitle?: string;\n\tdescription?: string;\n\tmimeType?: string;\n\tannotations?: ContentAnnotations;\n\t_meta?: Record<string, unknown>;\n}\n\nexport interface ListResourcesResult {\n\tresources: Resource[];\n\tnextCursor?: string;\n\t_meta?: Record<string, unknown>;\n}\n\nexport interface ListResourceTemplatesResult {\n\tresourceTemplates: ResourceTemplate[];\n\tnextCursor?: string;\n\t_meta?: Record<string, unknown>;\n}\n\nexport interface ReadResourceResult {\n\tcontents: (TextResourceContents | BlobResourceContents)[];\n\t_meta?: Record<string, unknown>;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export { createInMemoryTransportPair, InMemoryTransport } from "../transports/in-memory.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/extensions/mcp/client/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createInMemoryTransportPair, InMemoryTransport } from "../transports/in-memory.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/extensions/mcp/client/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC","sourcesContent":["export { createInMemoryTransportPair, InMemoryTransport } from \"../transports/in-memory.js\";\n"]}
@@ -0,0 +1,19 @@
1
+ import { type JsonRpcMessage } from "../protocol/jsonrpc.js";
2
+ import { type McpTransport, TransportEvents } from "./transport.js";
3
+ export declare class InMemoryTransport extends TransportEvents implements McpTransport {
4
+ private peer;
5
+ private started;
6
+ private closed;
7
+ connectPeer(peer: InMemoryTransport): void;
8
+ start(): Promise<void>;
9
+ send(message: JsonRpcMessage): Promise<void>;
10
+ close(): Promise<void>;
11
+ /** Exposed so tests can simulate transport-level failures. */
12
+ emitError(error: unknown): void;
13
+ private deliver;
14
+ }
15
+ export declare function createInMemoryTransportPair(): {
16
+ client: InMemoryTransport;
17
+ server: InMemoryTransport;
18
+ };
19
+ //# sourceMappingURL=in-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory.d.ts","sourceRoot":"","sources":["../../../../../src/extensions/mcp/client/transports/in-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAA4B,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,KAAK,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEpE,qBAAa,iBAAkB,SAAQ,eAAgB,YAAW,YAAY;IAC7E,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IAEvB,WAAW,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAGzC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAG3B;IAEK,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAMjD;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAK3B;IAED,8DAA8D;IACrD,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEvC;IAED,OAAO,CAAC,OAAO;CAIf;AAED,wBAAgB,2BAA2B,IAAI;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAMtG"}
@@ -0,0 +1,50 @@
1
+ import { McpConnectionClosedError } from "../protocol/jsonrpc.js";
2
+ import { TransportEvents } from "./transport.js";
3
+ export class InMemoryTransport extends TransportEvents {
4
+ peer;
5
+ started = false;
6
+ closed = false;
7
+ connectPeer(peer) {
8
+ if (this.peer)
9
+ throw new Error("In-memory MCP transport already has a peer");
10
+ this.peer = peer;
11
+ }
12
+ async start() {
13
+ if (this.closed)
14
+ throw new McpConnectionClosedError();
15
+ this.started = true;
16
+ }
17
+ async send(message) {
18
+ if (!this.started || this.closed)
19
+ throw new McpConnectionClosedError();
20
+ const peer = this.peer;
21
+ if (!peer?.started || peer.closed)
22
+ throw new McpConnectionClosedError("In-memory MCP peer is not connected");
23
+ const copy = structuredClone(message);
24
+ queueMicrotask(() => peer.deliver(copy));
25
+ }
26
+ async close() {
27
+ if (this.closed)
28
+ return;
29
+ this.closed = true;
30
+ this.emitClose();
31
+ await this.peer?.close();
32
+ }
33
+ /** Exposed so tests can simulate transport-level failures. */
34
+ emitError(error) {
35
+ super.emitError(error);
36
+ }
37
+ deliver(message) {
38
+ if (this.closed)
39
+ return;
40
+ this.emitMessage(message);
41
+ }
42
+ }
43
+ export function createInMemoryTransportPair() {
44
+ const client = new InMemoryTransport();
45
+ const server = new InMemoryTransport();
46
+ client.connectPeer(server);
47
+ server.connectPeer(client);
48
+ return { client, server };
49
+ }
50
+ //# sourceMappingURL=in-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory.js","sourceRoot":"","sources":["../../../../../src/extensions/mcp/client/transports/in-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAqB,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEpE,MAAM,OAAO,iBAAkB,SAAQ,eAAe;IAC7C,IAAI,CAAgC;IACpC,OAAO,GAAG,KAAK,CAAC;IAChB,MAAM,GAAG,KAAK,CAAC;IAEvB,WAAW,CAAC,IAAuB;QAClC,IAAI,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC7E,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,KAAK;QACV,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,wBAAwB,EAAE,CAAC;QACtD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAuB;QACjC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,wBAAwB,EAAE,CAAC;QACvE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,wBAAwB,CAAC,qCAAqC,CAAC,CAAC;QAC7G,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACtC,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,KAAK;QACV,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED,8DAA8D;IACrD,SAAS,CAAC,KAAc;QAChC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAEO,OAAO,CAAC,OAAuB;QACtC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;CACD;AAED,MAAM,UAAU,2BAA2B;IAC1C,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACvC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC","sourcesContent":["import { type JsonRpcMessage, McpConnectionClosedError } from \"../protocol/jsonrpc.js\";\nimport { type McpTransport, TransportEvents } from \"./transport.js\";\n\nexport class InMemoryTransport extends TransportEvents implements McpTransport {\n\tprivate peer: InMemoryTransport | undefined;\n\tprivate started = false;\n\tprivate closed = false;\n\n\tconnectPeer(peer: InMemoryTransport): void {\n\t\tif (this.peer) throw new Error(\"In-memory MCP transport already has a peer\");\n\t\tthis.peer = peer;\n\t}\n\n\tasync start(): Promise<void> {\n\t\tif (this.closed) throw new McpConnectionClosedError();\n\t\tthis.started = true;\n\t}\n\n\tasync send(message: JsonRpcMessage): Promise<void> {\n\t\tif (!this.started || this.closed) throw new McpConnectionClosedError();\n\t\tconst peer = this.peer;\n\t\tif (!peer?.started || peer.closed) throw new McpConnectionClosedError(\"In-memory MCP peer is not connected\");\n\t\tconst copy = structuredClone(message);\n\t\tqueueMicrotask(() => peer.deliver(copy));\n\t}\n\n\tasync close(): Promise<void> {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\t\tthis.emitClose();\n\t\tawait this.peer?.close();\n\t}\n\n\t/** Exposed so tests can simulate transport-level failures. */\n\toverride emitError(error: unknown): void {\n\t\tsuper.emitError(error);\n\t}\n\n\tprivate deliver(message: JsonRpcMessage): void {\n\t\tif (this.closed) return;\n\t\tthis.emitMessage(message);\n\t}\n}\n\nexport function createInMemoryTransportPair(): { client: InMemoryTransport; server: InMemoryTransport } {\n\tconst client = new InMemoryTransport();\n\tconst server = new InMemoryTransport();\n\tclient.connectPeer(server);\n\tserver.connectPeer(client);\n\treturn { client, server };\n}\n"]}
@@ -0,0 +1,32 @@
1
+ import { type JsonRpcMessage } from "../protocol/jsonrpc.js";
2
+ import { type McpTransport, TransportEvents } from "./transport.js";
3
+ export interface StdioTransportOptions {
4
+ command: string;
5
+ args?: readonly string[];
6
+ cwd?: string;
7
+ env?: Record<string, string>;
8
+ inheritEnv?: boolean;
9
+ stderr?: "pipe" | "inherit";
10
+ onStderr?: (chunk: string) => void;
11
+ maxMessageBytes?: number;
12
+ maxStderrBytes?: number;
13
+ /** Time to wait for the server to exit after SIGTERM before sending SIGKILL. Default: 2000. */
14
+ closeTimeoutMs?: number;
15
+ }
16
+ export declare class StdioTransport extends TransportEvents implements McpTransport {
17
+ readonly options: Readonly<StdioTransportOptions>;
18
+ private child;
19
+ private stdoutBuffer;
20
+ private stderrBuffer;
21
+ private started;
22
+ private closed;
23
+ constructor(options: StdioTransportOptions);
24
+ get pid(): number | undefined;
25
+ get stderr(): string;
26
+ start(): Promise<void>;
27
+ send(message: JsonRpcMessage): Promise<void>;
28
+ close(): Promise<void>;
29
+ private handleStdout;
30
+ private handleStderr;
31
+ }
32
+ //# sourceMappingURL=stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../../../../src/extensions/mcp/client/transports/stdio.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,cAAc,EAAiD,MAAM,wBAAwB,CAAC;AAC5G,OAAO,EAA6B,KAAK,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAkD/F,MAAM,WAAW,qBAAqB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+FAA+F;IAC/F,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,cAAe,SAAQ,eAAgB,YAAW,YAAY;IAC1E,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IAClD,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IAEvB,YAAY,OAAO,EAAE,qBAAqB,EAGzC;IAED,IAAI,GAAG,IAAI,MAAM,GAAG,SAAS,CAE5B;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAmD3B;IAEK,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAOjD;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CA2B3B;IAED,OAAO,CAAC,YAAY;IA4BpB,OAAO,CAAC,YAAY;CAOpB"}
@@ -0,0 +1,201 @@
1
+ import { spawn } from "node:child_process";
2
+ import process from "node:process";
3
+ import crossSpawn from "cross-spawn";
4
+ import { McpConnectionClosedError, parseJsonRpcMessage } from "../protocol/jsonrpc.js";
5
+ import { DEFAULT_MAX_MESSAGE_BYTES, TransportEvents } from "./transport.js";
6
+ const DEFAULT_MAX_STDERR_BYTES = 64 * 1024;
7
+ const DEFAULT_CLOSE_TIMEOUT_MS = 2_000;
8
+ /** How long a server gets to exit on its own after stdin closes, before it is sent SIGTERM. */
9
+ const STDIN_CLOSE_GRACE_MS = 500;
10
+ const USE_PROCESS_GROUPS = process.platform !== "win32";
11
+ /** Process groups of running servers, killed if the host exits without closing them. */
12
+ const liveProcessGroups = new Set();
13
+ let exitHookInstalled = false;
14
+ function killProcessTree(child, signal) {
15
+ const pid = child.pid;
16
+ if (process.platform === "win32" && pid !== undefined) {
17
+ if (child.exitCode !== null)
18
+ return;
19
+ // Windows has no graceful signals, and cross-spawn runs `.cmd` shims through cmd.exe; killing only
20
+ // that would leave the server running.
21
+ spawn("taskkill", ["/pid", String(pid), "/T", "/F"], { stdio: "ignore", windowsHide: true }).on("error", () => { });
22
+ return;
23
+ }
24
+ if (USE_PROCESS_GROUPS && pid !== undefined) {
25
+ try {
26
+ // Negative pid: the whole group, so wrappers like `npx` or `uvx` do not leave the server behind.
27
+ process.kill(-pid, signal);
28
+ return;
29
+ }
30
+ catch {
31
+ // The group is gone or was never created; fall back to the direct child.
32
+ }
33
+ }
34
+ try {
35
+ child.kill(signal);
36
+ }
37
+ catch { }
38
+ }
39
+ function installExitHook() {
40
+ if (exitHookInstalled)
41
+ return;
42
+ exitHookInstalled = true;
43
+ process.once("exit", () => {
44
+ for (const pid of liveProcessGroups) {
45
+ try {
46
+ process.kill(-pid, "SIGTERM");
47
+ }
48
+ catch { }
49
+ }
50
+ });
51
+ }
52
+ export class StdioTransport extends TransportEvents {
53
+ options;
54
+ child;
55
+ stdoutBuffer = Buffer.alloc(0);
56
+ stderrBuffer = Buffer.alloc(0);
57
+ started = false;
58
+ closed = false;
59
+ constructor(options) {
60
+ super();
61
+ this.options = Object.freeze({ ...options, args: options.args ? [...options.args] : undefined });
62
+ }
63
+ get pid() {
64
+ return this.child?.pid;
65
+ }
66
+ get stderr() {
67
+ return this.stderrBuffer.toString("utf8");
68
+ }
69
+ async start() {
70
+ if (this.started)
71
+ throw new Error("MCP stdio transport already started");
72
+ if (this.closed)
73
+ throw new McpConnectionClosedError();
74
+ this.started = true;
75
+ const env = this.options.inheritEnv === false ? { ...this.options.env } : { ...process.env, ...this.options.env };
76
+ const child = crossSpawn(this.options.command, this.options.args ?? [], {
77
+ cwd: this.options.cwd,
78
+ env,
79
+ stdio: ["pipe", "pipe", this.options.stderr === "inherit" ? "inherit" : "pipe"],
80
+ windowsHide: true,
81
+ // Own process group, so closing the transport can terminate the server's children too.
82
+ detached: USE_PROCESS_GROUPS,
83
+ });
84
+ this.child = child;
85
+ const pid = child.pid;
86
+ if (USE_PROCESS_GROUPS && pid !== undefined) {
87
+ installExitHook();
88
+ liveProcessGroups.add(pid);
89
+ child.once("exit", () => liveProcessGroups.delete(pid));
90
+ }
91
+ child.stdout?.on("data", (chunk) => this.handleStdout(chunk));
92
+ child.stdout?.on("error", (error) => this.emitError(error));
93
+ child.stdin?.on("error", (error) => {
94
+ if (!this.closed)
95
+ this.emitError(error);
96
+ });
97
+ child.stderr?.on("data", (chunk) => this.handleStderr(chunk));
98
+ child.stderr?.on("error", (error) => this.emitError(error));
99
+ child.on("close", () => {
100
+ this.child = undefined;
101
+ if (this.stdoutBuffer.toString("utf8").trim()) {
102
+ this.emitError(new Error("MCP stdio server closed with an incomplete JSON-RPC message"));
103
+ }
104
+ this.stdoutBuffer = Buffer.alloc(0);
105
+ this.emitClose();
106
+ });
107
+ await new Promise((resolve, reject) => {
108
+ const onSpawn = () => {
109
+ child.off("error", onError);
110
+ resolve();
111
+ };
112
+ const onError = (error) => {
113
+ child.off("spawn", onSpawn);
114
+ reject(error);
115
+ };
116
+ child.once("spawn", onSpawn);
117
+ child.once("error", onError);
118
+ });
119
+ child.on("error", (error) => {
120
+ if (!this.closed)
121
+ this.emitError(error);
122
+ });
123
+ }
124
+ async send(message) {
125
+ const stdin = this.child?.stdin;
126
+ if (!this.started || this.closed || !stdin?.writable)
127
+ throw new McpConnectionClosedError();
128
+ const payload = `${JSON.stringify(message)}\n`;
129
+ await new Promise((resolve, reject) => {
130
+ stdin.write(payload, (error) => (error ? reject(error) : resolve()));
131
+ });
132
+ }
133
+ async close() {
134
+ if (this.closed)
135
+ return;
136
+ this.closed = true;
137
+ const child = this.child;
138
+ if (!child) {
139
+ this.emitClose();
140
+ return;
141
+ }
142
+ if (child.exitCode !== null || child.signalCode !== null) {
143
+ child.stdin?.end();
144
+ return;
145
+ }
146
+ // Shutdown per the spec: close stdin and let the server exit, then SIGTERM, then SIGKILL.
147
+ const closeTimeoutMs = this.options.closeTimeoutMs ?? DEFAULT_CLOSE_TIMEOUT_MS;
148
+ await new Promise((resolve) => {
149
+ const timers = [];
150
+ child.once("close", () => {
151
+ for (const timer of timers)
152
+ clearTimeout(timer);
153
+ // Children of the server that ignored stdin closing would otherwise outlive it.
154
+ killProcessTree(child, "SIGTERM");
155
+ resolve();
156
+ });
157
+ const grace = Math.min(STDIN_CLOSE_GRACE_MS, closeTimeoutMs);
158
+ timers.push(setTimeout(() => killProcessTree(child, "SIGTERM"), grace));
159
+ timers.push(setTimeout(() => killProcessTree(child, "SIGKILL"), grace + closeTimeoutMs));
160
+ child.stdin?.end();
161
+ });
162
+ }
163
+ handleStdout(chunk) {
164
+ this.stdoutBuffer = Buffer.concat([this.stdoutBuffer, Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)]);
165
+ const maxMessageBytes = this.options.maxMessageBytes ?? DEFAULT_MAX_MESSAGE_BYTES;
166
+ while (true) {
167
+ const newline = this.stdoutBuffer.indexOf(0x0a);
168
+ if (newline < 0) {
169
+ if (this.stdoutBuffer.length > maxMessageBytes) {
170
+ this.stdoutBuffer = Buffer.alloc(0);
171
+ this.emitError(new Error(`MCP stdio message exceeds ${maxMessageBytes} bytes`));
172
+ }
173
+ return;
174
+ }
175
+ const line = this.stdoutBuffer.subarray(0, newline);
176
+ this.stdoutBuffer = this.stdoutBuffer.subarray(newline + 1);
177
+ if (line.length > maxMessageBytes) {
178
+ this.emitError(new Error(`MCP stdio message exceeds ${maxMessageBytes} bytes`));
179
+ continue;
180
+ }
181
+ const text = line.toString("utf8").replace(/\r$/, "");
182
+ if (!text.trim())
183
+ continue;
184
+ try {
185
+ this.emitMessage(parseJsonRpcMessage(JSON.parse(text)));
186
+ }
187
+ catch (error) {
188
+ this.emitError(error);
189
+ }
190
+ }
191
+ }
192
+ handleStderr(chunk) {
193
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
194
+ const maxStderrBytes = this.options.maxStderrBytes ?? DEFAULT_MAX_STDERR_BYTES;
195
+ this.stderrBuffer = Buffer.concat([this.stderrBuffer, buffer]);
196
+ if (this.stderrBuffer.length > maxStderrBytes)
197
+ this.stderrBuffer = this.stderrBuffer.subarray(-maxStderrBytes);
198
+ this.options.onStderr?.(buffer.toString("utf8"));
199
+ }
200
+ }
201
+ //# sourceMappingURL=stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../../../../src/extensions/mcp/client/transports/stdio.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ChildProcess, spawn } from \"node:child_process\";\nimport process from \"node:process\";\nimport crossSpawn from \"cross-spawn\";\nimport { type JsonRpcMessage, McpConnectionClosedError, parseJsonRpcMessage } from \"../protocol/jsonrpc.js\";\nimport { DEFAULT_MAX_MESSAGE_BYTES, type McpTransport, TransportEvents } from \"./transport.js\";\n\nconst DEFAULT_MAX_STDERR_BYTES = 64 * 1024;\nconst DEFAULT_CLOSE_TIMEOUT_MS = 2_000;\n/** How long a server gets to exit on its own after stdin closes, before it is sent SIGTERM. */\nconst STDIN_CLOSE_GRACE_MS = 500;\nconst USE_PROCESS_GROUPS = process.platform !== \"win32\";\n\n/** Process groups of running servers, killed if the host exits without closing them. */\nconst liveProcessGroups = new Set<number>();\nlet exitHookInstalled = false;\n\nfunction killProcessTree(child: ChildProcess, signal: NodeJS.Signals): void {\n\tconst pid = child.pid;\n\tif (process.platform === \"win32\" && pid !== undefined) {\n\t\tif (child.exitCode !== null) return;\n\t\t// Windows has no graceful signals, and cross-spawn runs `.cmd` shims through cmd.exe; killing only\n\t\t// that would leave the server running.\n\t\tspawn(\"taskkill\", [\"/pid\", String(pid), \"/T\", \"/F\"], { stdio: \"ignore\", windowsHide: true }).on(\n\t\t\t\"error\",\n\t\t\t() => {},\n\t\t);\n\t\treturn;\n\t}\n\tif (USE_PROCESS_GROUPS && pid !== undefined) {\n\t\ttry {\n\t\t\t// Negative pid: the whole group, so wrappers like `npx` or `uvx` do not leave the server behind.\n\t\t\tprocess.kill(-pid, signal);\n\t\t\treturn;\n\t\t} catch {\n\t\t\t// The group is gone or was never created; fall back to the direct child.\n\t\t}\n\t}\n\ttry {\n\t\tchild.kill(signal);\n\t} catch {}\n}\n\nfunction installExitHook(): void {\n\tif (exitHookInstalled) return;\n\texitHookInstalled = true;\n\tprocess.once(\"exit\", () => {\n\t\tfor (const pid of liveProcessGroups) {\n\t\t\ttry {\n\t\t\t\tprocess.kill(-pid, \"SIGTERM\");\n\t\t\t} catch {}\n\t\t}\n\t});\n}\n\nexport interface StdioTransportOptions {\n\tcommand: string;\n\targs?: readonly string[];\n\tcwd?: string;\n\tenv?: Record<string, string>;\n\tinheritEnv?: boolean;\n\tstderr?: \"pipe\" | \"inherit\";\n\tonStderr?: (chunk: string) => void;\n\tmaxMessageBytes?: number;\n\tmaxStderrBytes?: number;\n\t/** Time to wait for the server to exit after SIGTERM before sending SIGKILL. Default: 2000. */\n\tcloseTimeoutMs?: number;\n}\n\nexport class StdioTransport extends TransportEvents implements McpTransport {\n\treadonly options: Readonly<StdioTransportOptions>;\n\tprivate child: ChildProcess | undefined;\n\tprivate stdoutBuffer = Buffer.alloc(0);\n\tprivate stderrBuffer = Buffer.alloc(0);\n\tprivate started = false;\n\tprivate closed = false;\n\n\tconstructor(options: StdioTransportOptions) {\n\t\tsuper();\n\t\tthis.options = Object.freeze({ ...options, args: options.args ? [...options.args] : undefined });\n\t}\n\n\tget pid(): number | undefined {\n\t\treturn this.child?.pid;\n\t}\n\n\tget stderr(): string {\n\t\treturn this.stderrBuffer.toString(\"utf8\");\n\t}\n\n\tasync start(): Promise<void> {\n\t\tif (this.started) throw new Error(\"MCP stdio transport already started\");\n\t\tif (this.closed) throw new McpConnectionClosedError();\n\t\tthis.started = true;\n\t\tconst env = this.options.inheritEnv === false ? { ...this.options.env } : { ...process.env, ...this.options.env };\n\t\tconst child = crossSpawn(this.options.command, this.options.args ?? [], {\n\t\t\tcwd: this.options.cwd,\n\t\t\tenv,\n\t\t\tstdio: [\"pipe\", \"pipe\", this.options.stderr === \"inherit\" ? \"inherit\" : \"pipe\"],\n\t\t\twindowsHide: true,\n\t\t\t// Own process group, so closing the transport can terminate the server's children too.\n\t\t\tdetached: USE_PROCESS_GROUPS,\n\t\t});\n\t\tthis.child = child;\n\t\tconst pid = child.pid;\n\t\tif (USE_PROCESS_GROUPS && pid !== undefined) {\n\t\t\tinstallExitHook();\n\t\t\tliveProcessGroups.add(pid);\n\t\t\tchild.once(\"exit\", () => liveProcessGroups.delete(pid));\n\t\t}\n\t\tchild.stdout?.on(\"data\", (chunk: Buffer | string) => this.handleStdout(chunk));\n\t\tchild.stdout?.on(\"error\", (error) => this.emitError(error));\n\t\tchild.stdin?.on(\"error\", (error) => {\n\t\t\tif (!this.closed) this.emitError(error);\n\t\t});\n\t\tchild.stderr?.on(\"data\", (chunk: Buffer | string) => this.handleStderr(chunk));\n\t\tchild.stderr?.on(\"error\", (error) => this.emitError(error));\n\t\tchild.on(\"close\", () => {\n\t\t\tthis.child = undefined;\n\t\t\tif (this.stdoutBuffer.toString(\"utf8\").trim()) {\n\t\t\t\tthis.emitError(new Error(\"MCP stdio server closed with an incomplete JSON-RPC message\"));\n\t\t\t}\n\t\t\tthis.stdoutBuffer = Buffer.alloc(0);\n\t\t\tthis.emitClose();\n\t\t});\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst onSpawn = () => {\n\t\t\t\tchild.off(\"error\", onError);\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tconst onError = (error: Error) => {\n\t\t\t\tchild.off(\"spawn\", onSpawn);\n\t\t\t\treject(error);\n\t\t\t};\n\t\t\tchild.once(\"spawn\", onSpawn);\n\t\t\tchild.once(\"error\", onError);\n\t\t});\n\t\tchild.on(\"error\", (error) => {\n\t\t\tif (!this.closed) this.emitError(error);\n\t\t});\n\t}\n\n\tasync send(message: JsonRpcMessage): Promise<void> {\n\t\tconst stdin = this.child?.stdin;\n\t\tif (!this.started || this.closed || !stdin?.writable) throw new McpConnectionClosedError();\n\t\tconst payload = `${JSON.stringify(message)}\\n`;\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tstdin.write(payload, (error) => (error ? reject(error) : resolve()));\n\t\t});\n\t}\n\n\tasync close(): Promise<void> {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\t\tconst child = this.child;\n\t\tif (!child) {\n\t\t\tthis.emitClose();\n\t\t\treturn;\n\t\t}\n\t\tif (child.exitCode !== null || child.signalCode !== null) {\n\t\t\tchild.stdin?.end();\n\t\t\treturn;\n\t\t}\n\t\t// Shutdown per the spec: close stdin and let the server exit, then SIGTERM, then SIGKILL.\n\t\tconst closeTimeoutMs = this.options.closeTimeoutMs ?? DEFAULT_CLOSE_TIMEOUT_MS;\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tconst timers: ReturnType<typeof setTimeout>[] = [];\n\t\t\tchild.once(\"close\", () => {\n\t\t\t\tfor (const timer of timers) clearTimeout(timer);\n\t\t\t\t// Children of the server that ignored stdin closing would otherwise outlive it.\n\t\t\t\tkillProcessTree(child, \"SIGTERM\");\n\t\t\t\tresolve();\n\t\t\t});\n\t\t\tconst grace = Math.min(STDIN_CLOSE_GRACE_MS, closeTimeoutMs);\n\t\t\ttimers.push(setTimeout(() => killProcessTree(child, \"SIGTERM\"), grace));\n\t\t\ttimers.push(setTimeout(() => killProcessTree(child, \"SIGKILL\"), grace + closeTimeoutMs));\n\t\t\tchild.stdin?.end();\n\t\t});\n\t}\n\n\tprivate handleStdout(chunk: Buffer | string): void {\n\t\tthis.stdoutBuffer = Buffer.concat([this.stdoutBuffer, Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)]);\n\t\tconst maxMessageBytes = this.options.maxMessageBytes ?? DEFAULT_MAX_MESSAGE_BYTES;\n\t\twhile (true) {\n\t\t\tconst newline = this.stdoutBuffer.indexOf(0x0a);\n\t\t\tif (newline < 0) {\n\t\t\t\tif (this.stdoutBuffer.length > maxMessageBytes) {\n\t\t\t\t\tthis.stdoutBuffer = Buffer.alloc(0);\n\t\t\t\t\tthis.emitError(new Error(`MCP stdio message exceeds ${maxMessageBytes} bytes`));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst line = this.stdoutBuffer.subarray(0, newline);\n\t\t\tthis.stdoutBuffer = this.stdoutBuffer.subarray(newline + 1);\n\t\t\tif (line.length > maxMessageBytes) {\n\t\t\t\tthis.emitError(new Error(`MCP stdio message exceeds ${maxMessageBytes} bytes`));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst text = line.toString(\"utf8\").replace(/\\r$/, \"\");\n\t\t\tif (!text.trim()) continue;\n\t\t\ttry {\n\t\t\t\tthis.emitMessage(parseJsonRpcMessage(JSON.parse(text)));\n\t\t\t} catch (error) {\n\t\t\t\tthis.emitError(error);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleStderr(chunk: Buffer | string): void {\n\t\tconst buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n\t\tconst maxStderrBytes = this.options.maxStderrBytes ?? DEFAULT_MAX_STDERR_BYTES;\n\t\tthis.stderrBuffer = Buffer.concat([this.stderrBuffer, buffer]);\n\t\tif (this.stderrBuffer.length > maxStderrBytes) this.stderrBuffer = this.stderrBuffer.subarray(-maxStderrBytes);\n\t\tthis.options.onStderr?.(buffer.toString(\"utf8\"));\n\t}\n}\n"]}
@@ -0,0 +1,96 @@
1
+ import type { AuthProvider, McpFetch } from "../auth-provider.js";
2
+ import { type JsonRpcMessage } from "../protocol/jsonrpc.js";
3
+ import { type McpTransport, TransportEvents } from "./transport.js";
4
+ export interface SseEvent {
5
+ event?: string;
6
+ data: string;
7
+ id?: string;
8
+ }
9
+ export interface ConsumeSseOptions {
10
+ maxEventBytes?: number;
11
+ onEvent(event: SseEvent): void;
12
+ /** Called for every `id` field, including events without data (for example resumption priming events). */
13
+ onId?(id: string): void;
14
+ /** Called for every valid `retry` field, in milliseconds. */
15
+ onRetry?(delayMs: number): void;
16
+ }
17
+ export declare function consumeSseStream(stream: ReadableStream<Uint8Array>, options: ConsumeSseOptions): Promise<void>;
18
+ export interface StreamableHttpReconnectOptions {
19
+ /** Delay before the first reconnection attempt, unless the server sent a `retry` field. Default: 1000. */
20
+ initialDelayMs?: number;
21
+ /** Upper bound for the exponential backoff. Default: 30000. */
22
+ maxDelayMs?: number;
23
+ /** Consecutive failed attempts before giving up on a stream. Default: 5. */
24
+ maxRetries?: number;
25
+ }
26
+ export interface StreamableHttpTransportOptions {
27
+ url: string | URL;
28
+ headers?: Record<string, string>;
29
+ fetch?: McpFetch;
30
+ /** Open the server-to-client GET stream after initialization. Default: true. */
31
+ openGetStream?: boolean;
32
+ maxMessageBytes?: number;
33
+ authProvider?: AuthProvider;
34
+ /** Reconnection of dropped SSE streams (the GET stream, and response streams that carry event IDs). */
35
+ reconnect?: StreamableHttpReconnectOptions;
36
+ }
37
+ export declare class McpHttpError extends Error {
38
+ readonly status: number;
39
+ readonly body: string;
40
+ constructor(status: number, message: string, body?: string);
41
+ }
42
+ export declare class McpAuthRequiredError extends McpHttpError {
43
+ readonly wwwAuthenticate: string | null;
44
+ constructor(response: Response, body?: string);
45
+ }
46
+ export declare class McpSessionExpiredError extends McpHttpError {
47
+ constructor(body?: string);
48
+ }
49
+ export declare class StreamableHttpTransport extends TransportEvents implements McpTransport {
50
+ readonly url: URL;
51
+ readonly options: Readonly<StreamableHttpTransportOptions>;
52
+ private fetch;
53
+ private controller;
54
+ private started;
55
+ private closed;
56
+ private sessionIdValue;
57
+ private protocolVersion;
58
+ private getStreamStarted;
59
+ constructor(options: StreamableHttpTransportOptions);
60
+ get sessionId(): string | undefined;
61
+ start(): Promise<void>;
62
+ setProtocolVersion(version: string): void;
63
+ send(message: JsonRpcMessage): Promise<void>;
64
+ close(): Promise<void>;
65
+ /**
66
+ * Fetch with auth headers. A 401 (or a 403 asking for more scope) is handed to the auth provider
67
+ * once, and the request is retried with whatever credentials it left behind.
68
+ */
69
+ private authorizedFetch;
70
+ private headers;
71
+ private captureSession;
72
+ private checkResponse;
73
+ private consumeSse;
74
+ /**
75
+ * Read the SSE stream answering one request. When the stream ends or breaks before the response
76
+ * arrives and the server assigned event IDs, resume it with GET and `Last-Event-ID`, as the
77
+ * server may close response streams at will. Otherwise only this request fails.
78
+ */
79
+ private consumeResponseStream;
80
+ private startGetStream;
81
+ /** Keep the server-to-client stream open, reconnecting with backoff when it drops. */
82
+ private runGetStream;
83
+ /** Open a GET SSE stream. Resolves to undefined when the server answers 405 (no GET stream). */
84
+ private openSseStream;
85
+ /**
86
+ * Network failures and transient statuses are retried; auth, session, and protocol errors are not.
87
+ * `fetch` reports network failures, including a connection dropped mid-body, as `TypeError`.
88
+ */
89
+ private isRetryable;
90
+ private reconnectDelay;
91
+ private maxDelay;
92
+ private maxRetries;
93
+ /** Resolves false when the transport closed while waiting. */
94
+ private sleep;
95
+ }
96
+ //# sourceMappingURL=streamable-http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamable-http.d.ts","sourceRoot":"","sources":["../../../../../src/extensions/mcp/client/transports/streamable-http.ts"],"names":[],"mappings":"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"}