kernl 0.1.1

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 (257) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/CHANGELOG.md +53 -0
  3. package/LICENSE +201 -0
  4. package/dist/agent.d.ts +43 -0
  5. package/dist/agent.d.ts.map +1 -0
  6. package/dist/agent.js +130 -0
  7. package/dist/context.d.ts +70 -0
  8. package/dist/context.d.ts.map +1 -0
  9. package/dist/context.js +111 -0
  10. package/dist/env.d.ts +45 -0
  11. package/dist/env.d.ts.map +1 -0
  12. package/dist/env.js +31 -0
  13. package/dist/error.d.ts +1 -0
  14. package/dist/error.d.ts.map +1 -0
  15. package/dist/error.js +1 -0
  16. package/dist/guardrail.d.ts +178 -0
  17. package/dist/guardrail.d.ts.map +1 -0
  18. package/dist/guardrail.js +34 -0
  19. package/dist/index.d.ts +4 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +2 -0
  22. package/dist/kernel.d.ts +7 -0
  23. package/dist/kernel.d.ts.map +1 -0
  24. package/dist/kernel.js +7 -0
  25. package/dist/kernl.d.ts +18 -0
  26. package/dist/kernl.d.ts.map +1 -0
  27. package/dist/kernl.js +16 -0
  28. package/dist/lib/env.d.ts +43 -0
  29. package/dist/lib/env.d.ts.map +1 -0
  30. package/dist/lib/env.js +29 -0
  31. package/dist/lib/error.d.ts +88 -0
  32. package/dist/lib/error.d.ts.map +1 -0
  33. package/dist/lib/error.js +117 -0
  34. package/dist/lib/logger.d.ts +36 -0
  35. package/dist/lib/logger.d.ts.map +1 -0
  36. package/dist/lib/logger.js +43 -0
  37. package/dist/lib/serde/__tests__/codec.test.d.ts +2 -0
  38. package/dist/lib/serde/__tests__/codec.test.d.ts.map +1 -0
  39. package/dist/lib/serde/__tests__/codec.test.js +75 -0
  40. package/dist/lib/serde/codec.d.ts +12 -0
  41. package/dist/lib/serde/codec.d.ts.map +1 -0
  42. package/dist/lib/serde/codec.js +54 -0
  43. package/dist/lib/serde/json.d.ts +8 -0
  44. package/dist/lib/serde/json.d.ts.map +1 -0
  45. package/dist/lib/serde/json.js +13 -0
  46. package/dist/lib/serde/thread.d.ts +1 -0
  47. package/dist/lib/serde/thread.d.ts.map +1 -0
  48. package/dist/lib/serde/thread.js +172 -0
  49. package/dist/lib/serde/tool.d.ts +36 -0
  50. package/dist/lib/serde/tool.d.ts.map +1 -0
  51. package/dist/lib/serde/tool.js +1 -0
  52. package/dist/lib/utils.d.ts +19 -0
  53. package/dist/lib/utils.d.ts.map +1 -0
  54. package/dist/lib/utils.js +41 -0
  55. package/dist/lifecycle.d.ts +133 -0
  56. package/dist/lifecycle.d.ts.map +1 -0
  57. package/dist/lifecycle.js +29 -0
  58. package/dist/logger.d.ts +36 -0
  59. package/dist/logger.d.ts.map +1 -0
  60. package/dist/logger.js +43 -0
  61. package/dist/mcp/__tests__/base.test.d.ts +2 -0
  62. package/dist/mcp/__tests__/base.test.d.ts.map +1 -0
  63. package/dist/mcp/__tests__/base.test.js +268 -0
  64. package/dist/mcp/__tests__/fixtures/echo-server.d.ts +3 -0
  65. package/dist/mcp/__tests__/fixtures/echo-server.d.ts.map +1 -0
  66. package/dist/mcp/__tests__/fixtures/echo-server.js +92 -0
  67. package/dist/mcp/__tests__/fixtures/math-server.d.ts +3 -0
  68. package/dist/mcp/__tests__/fixtures/math-server.d.ts.map +1 -0
  69. package/dist/mcp/__tests__/fixtures/math-server.js +98 -0
  70. package/dist/mcp/__tests__/fixtures/server.d.ts +3 -0
  71. package/dist/mcp/__tests__/fixtures/server.d.ts.map +1 -0
  72. package/dist/mcp/__tests__/fixtures/server.js +162 -0
  73. package/dist/mcp/__tests__/fixtures/test-server.d.ts +3 -0
  74. package/dist/mcp/__tests__/fixtures/test-server.d.ts.map +1 -0
  75. package/dist/mcp/__tests__/fixtures/test-server.js +163 -0
  76. package/dist/mcp/__tests__/fixtures/utils.d.ts +17 -0
  77. package/dist/mcp/__tests__/fixtures/utils.d.ts.map +1 -0
  78. package/dist/mcp/__tests__/fixtures/utils.js +42 -0
  79. package/dist/mcp/__tests__/integration.test.d.ts +2 -0
  80. package/dist/mcp/__tests__/integration.test.d.ts.map +1 -0
  81. package/dist/mcp/__tests__/integration.test.js +360 -0
  82. package/dist/mcp/__tests__/stdio.test.d.ts +2 -0
  83. package/dist/mcp/__tests__/stdio.test.d.ts.map +1 -0
  84. package/dist/mcp/__tests__/stdio.test.js +180 -0
  85. package/dist/mcp/__tests__/test-utils.d.ts +17 -0
  86. package/dist/mcp/__tests__/test-utils.d.ts.map +1 -0
  87. package/dist/mcp/__tests__/test-utils.js +42 -0
  88. package/dist/mcp/__tests__/utils.test.d.ts +2 -0
  89. package/dist/mcp/__tests__/utils.test.d.ts.map +1 -0
  90. package/dist/mcp/__tests__/utils.test.js +300 -0
  91. package/dist/mcp/base.d.ts +88 -0
  92. package/dist/mcp/base.d.ts.map +1 -0
  93. package/dist/mcp/base.js +68 -0
  94. package/dist/mcp/http.d.ts +34 -0
  95. package/dist/mcp/http.d.ts.map +1 -0
  96. package/dist/mcp/http.js +100 -0
  97. package/dist/mcp/node.d.ts +60 -0
  98. package/dist/mcp/node.d.ts.map +1 -0
  99. package/dist/mcp/node.js +297 -0
  100. package/dist/mcp/sse.d.ts +34 -0
  101. package/dist/mcp/sse.d.ts.map +1 -0
  102. package/dist/mcp/sse.js +97 -0
  103. package/dist/mcp/stdio.d.ts +32 -0
  104. package/dist/mcp/stdio.d.ts.map +1 -0
  105. package/dist/mcp/stdio.js +96 -0
  106. package/dist/mcp/types.d.ts +172 -0
  107. package/dist/mcp/types.d.ts.map +1 -0
  108. package/dist/mcp/types.js +16 -0
  109. package/dist/mcp/utils.d.ts +23 -0
  110. package/dist/mcp/utils.d.ts.map +1 -0
  111. package/dist/mcp/utils.js +44 -0
  112. package/dist/model.d.ts +175 -0
  113. package/dist/model.d.ts.map +1 -0
  114. package/dist/model.js +1 -0
  115. package/dist/providers/ai.d.ts +1 -0
  116. package/dist/providers/ai.d.ts.map +1 -0
  117. package/dist/providers/ai.js +1 -0
  118. package/dist/providers/default.d.ts +16 -0
  119. package/dist/providers/default.d.ts.map +1 -0
  120. package/dist/providers/default.js +17 -0
  121. package/dist/providers/registry.d.ts +1 -0
  122. package/dist/providers/registry.d.ts.map +1 -0
  123. package/dist/providers/registry.js +1 -0
  124. package/dist/sched/scheduler.d.ts +20 -0
  125. package/dist/sched/scheduler.d.ts.map +1 -0
  126. package/dist/sched/scheduler.js +1 -0
  127. package/dist/sched/task.d.ts +92 -0
  128. package/dist/sched/task.d.ts.map +1 -0
  129. package/dist/sched/task.js +102 -0
  130. package/dist/serde/__tests__/codec.test.d.ts +2 -0
  131. package/dist/serde/__tests__/codec.test.d.ts.map +1 -0
  132. package/dist/serde/__tests__/codec.test.js +75 -0
  133. package/dist/serde/codec.d.ts +12 -0
  134. package/dist/serde/codec.d.ts.map +1 -0
  135. package/dist/serde/codec.js +54 -0
  136. package/dist/serde/json.d.ts +8 -0
  137. package/dist/serde/json.d.ts.map +1 -0
  138. package/dist/serde/json.js +13 -0
  139. package/dist/serde/thread.d.ts +687 -0
  140. package/dist/serde/thread.d.ts.map +1 -0
  141. package/dist/serde/thread.js +158 -0
  142. package/dist/serde/tool.d.ts +36 -0
  143. package/dist/serde/tool.d.ts.map +1 -0
  144. package/dist/serde/tool.js +1 -0
  145. package/dist/session.d.ts +1 -0
  146. package/dist/session.d.ts.map +1 -0
  147. package/dist/session.js +1 -0
  148. package/dist/task.d.ts +87 -0
  149. package/dist/task.d.ts.map +1 -0
  150. package/dist/task.js +97 -0
  151. package/dist/thread/__tests__/mock.d.ts +28 -0
  152. package/dist/thread/__tests__/mock.d.ts.map +1 -0
  153. package/dist/thread/__tests__/mock.js +74 -0
  154. package/dist/thread/__tests__/thread.test.d.ts +2 -0
  155. package/dist/thread/__tests__/thread.test.d.ts.map +1 -0
  156. package/dist/thread/__tests__/thread.test.js +1412 -0
  157. package/dist/thread/index.d.ts +2 -0
  158. package/dist/thread/index.d.ts.map +1 -0
  159. package/dist/thread/index.js +1 -0
  160. package/dist/thread/thread.d.ts +66 -0
  161. package/dist/thread/thread.d.ts.map +1 -0
  162. package/dist/thread/thread.js +472 -0
  163. package/dist/thread/utils.d.ts +19 -0
  164. package/dist/thread/utils.d.ts.map +1 -0
  165. package/dist/thread/utils.js +50 -0
  166. package/dist/tool/__tests__/fixtures.d.ts +45 -0
  167. package/dist/tool/__tests__/fixtures.d.ts.map +1 -0
  168. package/dist/tool/__tests__/fixtures.js +97 -0
  169. package/dist/tool/__tests__/tool.test.d.ts +2 -0
  170. package/dist/tool/__tests__/tool.test.d.ts.map +1 -0
  171. package/dist/tool/__tests__/tool.test.js +172 -0
  172. package/dist/tool/__tests__/toolkit.test.d.ts +2 -0
  173. package/dist/tool/__tests__/toolkit.test.d.ts.map +1 -0
  174. package/dist/tool/__tests__/toolkit.test.js +134 -0
  175. package/dist/tool/index.d.ts +4 -0
  176. package/dist/tool/index.d.ts.map +1 -0
  177. package/dist/tool/index.js +2 -0
  178. package/dist/tool/mcp.d.ts +75 -0
  179. package/dist/tool/mcp.d.ts.map +1 -0
  180. package/dist/tool/mcp.js +111 -0
  181. package/dist/tool/tool.d.ts +95 -0
  182. package/dist/tool/tool.d.ts.map +1 -0
  183. package/dist/tool/tool.js +176 -0
  184. package/dist/tool/toolkit.d.ts +121 -0
  185. package/dist/tool/toolkit.d.ts.map +1 -0
  186. package/dist/tool/toolkit.js +180 -0
  187. package/dist/tool/types.d.ts +187 -0
  188. package/dist/tool/types.d.ts.map +1 -0
  189. package/dist/tool/types.js +1 -0
  190. package/dist/tools.d.ts +362 -0
  191. package/dist/tools.d.ts.map +1 -0
  192. package/dist/tools.js +220 -0
  193. package/dist/trace/processor.d.ts +1 -0
  194. package/dist/trace/processor.d.ts.map +1 -0
  195. package/dist/trace/processor.js +1 -0
  196. package/dist/trace/traces.d.ts +1 -0
  197. package/dist/trace/traces.d.ts.map +1 -0
  198. package/dist/trace/traces.js +73 -0
  199. package/dist/trace/utils.d.ts +22 -0
  200. package/dist/trace/utils.d.ts.map +1 -0
  201. package/dist/trace/utils.js +30 -0
  202. package/dist/types/agent.d.ts +91 -0
  203. package/dist/types/agent.d.ts.map +1 -0
  204. package/dist/types/agent.js +1 -0
  205. package/dist/types/proto.d.ts +1551 -0
  206. package/dist/types/proto.d.ts.map +1 -0
  207. package/dist/types/proto.js +531 -0
  208. package/dist/types/thread.d.ts +71 -0
  209. package/dist/types/thread.d.ts.map +1 -0
  210. package/dist/types/thread.js +5 -0
  211. package/dist/usage.d.ts +43 -0
  212. package/dist/usage.d.ts.map +1 -0
  213. package/dist/usage.js +61 -0
  214. package/package.json +52 -0
  215. package/src/agent.ts +203 -0
  216. package/src/context.ts +265 -0
  217. package/src/guardrail.ts +277 -0
  218. package/src/index.ts +3 -0
  219. package/src/kernl.ts +22 -0
  220. package/src/lib/env.ts +36 -0
  221. package/src/lib/error.ts +158 -0
  222. package/src/lib/logger.ts +78 -0
  223. package/src/lib/serde/json.ts +18 -0
  224. package/src/lib/serde/thread.ts +188 -0
  225. package/src/lifecycle.ts +181 -0
  226. package/src/mcp/__tests__/base.test.ts +344 -0
  227. package/src/mcp/__tests__/fixtures/server.ts +179 -0
  228. package/src/mcp/__tests__/fixtures/utils.ts +58 -0
  229. package/src/mcp/__tests__/integration.test.ts +447 -0
  230. package/src/mcp/__tests__/stdio.test.ts +236 -0
  231. package/src/mcp/__tests__/utils.test.ts +360 -0
  232. package/src/mcp/base.ts +162 -0
  233. package/src/mcp/http.ts +147 -0
  234. package/src/mcp/sse.ts +137 -0
  235. package/src/mcp/stdio.ts +136 -0
  236. package/src/mcp/types.ts +202 -0
  237. package/src/mcp/utils.ts +62 -0
  238. package/src/task.ts +119 -0
  239. package/src/thread/__tests__/mock.ts +95 -0
  240. package/src/thread/__tests__/thread.test.ts +1574 -0
  241. package/src/thread/index.ts +1 -0
  242. package/src/thread/thread.ts +611 -0
  243. package/src/thread/utils.ts +67 -0
  244. package/src/tool/__tests__/fixtures.ts +106 -0
  245. package/src/tool/__tests__/tool.test.ts +235 -0
  246. package/src/tool/__tests__/toolkit.test.ts +174 -0
  247. package/src/tool/index.ts +10 -0
  248. package/src/tool/tool.ts +264 -0
  249. package/src/tool/toolkit.ts +234 -0
  250. package/src/tool/types.ts +243 -0
  251. package/src/trace/processor.ts +0 -0
  252. package/src/trace/traces.ts +86 -0
  253. package/src/trace/utils.ts +38 -0
  254. package/src/types/agent.ts +145 -0
  255. package/src/types/thread.ts +86 -0
  256. package/tsconfig.json +13 -0
  257. package/vitest.config.ts +14 -0
@@ -0,0 +1,297 @@
1
+ import { DEFAULT_REQUEST_TIMEOUT_MSEC } from "@modelcontextprotocol/sdk/shared/protocol.js";
2
+ import logger from "../logger";
3
+ import { invalidateServerToolsCache } from "./base";
4
+ function failedToImport(error) {
5
+ logger.error(`
6
+ Failed to load the MCP SDK. Please install the @modelcontextprotocol/sdk package.
7
+
8
+ npm install @modelcontextprotocol/sdk
9
+ `.trim());
10
+ throw error;
11
+ }
12
+ export class NodeMCPServerStdio extends BaseMCPServerStdio {
13
+ session = null;
14
+ _cacheDirty = true;
15
+ _toolsList = [];
16
+ serverInitializeResult = null;
17
+ clientSessionTimeoutSeconds;
18
+ timeout;
19
+ params;
20
+ _name;
21
+ transport = null;
22
+ constructor(params) {
23
+ super(params);
24
+ this.clientSessionTimeoutSeconds = params.clientSessionTimeoutSeconds ?? 5;
25
+ this.timeout = params.timeout ?? DEFAULT_REQUEST_TIMEOUT_MSEC;
26
+ if ("fullCommand" in params) {
27
+ const elements = params.fullCommand.split(" ");
28
+ const command = elements.shift();
29
+ if (!command) {
30
+ throw new Error("Invalid fullCommand: " + params.fullCommand);
31
+ }
32
+ this.params = {
33
+ ...params,
34
+ command: command,
35
+ args: elements,
36
+ encoding: params.encoding || "utf-8",
37
+ encodingErrorHandler: params.encodingErrorHandler || "strict",
38
+ };
39
+ }
40
+ else {
41
+ this.params = params;
42
+ }
43
+ this._name = params.name || `stdio: ${this.params.command}`;
44
+ }
45
+ async connect() {
46
+ try {
47
+ this.transport = new StdioClientTransport({
48
+ command: this.params.command,
49
+ args: this.params.args,
50
+ env: this.params.env,
51
+ cwd: this.params.cwd,
52
+ });
53
+ this.session = new Client({
54
+ name: this._name,
55
+ version: "1.0.0",
56
+ });
57
+ await this.session.connect(this.transport);
58
+ this.serverInitializeResult = {
59
+ serverInfo: { name: this._name, version: "1.0.0" },
60
+ };
61
+ }
62
+ catch (e) {
63
+ this.logger.error("Error initializing MCP server:", e);
64
+ await this.close();
65
+ throw e;
66
+ }
67
+ this.debugLog(() => `Connected to MCP server: ${this._name}`);
68
+ }
69
+ async invalidateToolsCache() {
70
+ await invalidateServerToolsCache(this.name);
71
+ this._cacheDirty = true;
72
+ }
73
+ async listTools() {
74
+ if (!this.session) {
75
+ throw new Error("Server not initialized. Make sure you call connect() first.");
76
+ }
77
+ if (this.cacheToolsList && !this._cacheDirty && this._toolsList) {
78
+ return this._toolsList;
79
+ }
80
+ this._cacheDirty = false;
81
+ const response = await this.session.listTools();
82
+ this.debugLog(() => `Listed tools: ${JSON.stringify(response)}`);
83
+ this._toolsList = ListToolsResultSchema.parse(response).tools;
84
+ return this._toolsList;
85
+ }
86
+ async callTool(toolName, args) {
87
+ const { CallToolResultSchema } = await import("@modelcontextprotocol/sdk/types.js").catch(failedToImport);
88
+ if (!this.session) {
89
+ throw new Error("Server not initialized. Make sure you call connect() first.");
90
+ }
91
+ const response = await this.session.callTool({
92
+ name: toolName,
93
+ arguments: args ?? {},
94
+ }, undefined, {
95
+ timeout: this.timeout,
96
+ });
97
+ const parsed = CallToolResultSchema.parse(response);
98
+ const result = parsed.content;
99
+ this.debugLog(() => `Called tool ${toolName} (args: ${JSON.stringify(args)}, result: ${JSON.stringify(result)})`);
100
+ return result;
101
+ }
102
+ get name() {
103
+ return this._name;
104
+ }
105
+ async close() {
106
+ if (this.transport) {
107
+ await this.transport.close();
108
+ this.transport = null;
109
+ }
110
+ if (this.session) {
111
+ await this.session.close();
112
+ this.session = null;
113
+ }
114
+ }
115
+ }
116
+ export class NodeMCPServerSSE extends BaseMCPServerSSE {
117
+ session = null;
118
+ _cacheDirty = true;
119
+ _toolsList = [];
120
+ serverInitializeResult = null;
121
+ clientSessionTimeoutSeconds;
122
+ timeout;
123
+ params;
124
+ _name;
125
+ transport = null;
126
+ constructor(params) {
127
+ super(params);
128
+ this.clientSessionTimeoutSeconds = params.clientSessionTimeoutSeconds ?? 5;
129
+ this.params = params;
130
+ this._name = params.name || `sse: ${this.params.url}`;
131
+ this.timeout = params.timeout ?? DEFAULT_REQUEST_TIMEOUT_MSEC;
132
+ }
133
+ async connect() {
134
+ try {
135
+ const { SSEClientTransport } = await import("@modelcontextprotocol/sdk/client/sse.js").catch(failedToImport);
136
+ const { Client } = await import("@modelcontextprotocol/sdk/client/index.js").catch(failedToImport);
137
+ this.transport = new SSEClientTransport(new URL(this.params.url), {
138
+ authProvider: this.params.authProvider,
139
+ requestInit: this.params.requestInit,
140
+ eventSourceInit: this.params.eventSourceInit,
141
+ });
142
+ this.session = new Client({
143
+ name: this._name,
144
+ version: "1.0.0", // You may want to make this configurable
145
+ });
146
+ await this.session.connect(this.transport);
147
+ this.serverInitializeResult = {
148
+ serverInfo: { name: this._name, version: "1.0.0" },
149
+ };
150
+ }
151
+ catch (e) {
152
+ this.logger.error("Error initializing MCP server:", e);
153
+ await this.close();
154
+ throw e;
155
+ }
156
+ this.debugLog(() => `Connected to MCP server: ${this._name}`);
157
+ }
158
+ async invalidateToolsCache() {
159
+ await invalidateServerToolsCache(this.name);
160
+ this._cacheDirty = true;
161
+ }
162
+ async listTools() {
163
+ const { ListToolsResultSchema } = await import("@modelcontextprotocol/sdk/types.js").catch(failedToImport);
164
+ if (!this.session) {
165
+ throw new Error("Server not initialized. Make sure you call connect() first.");
166
+ }
167
+ if (this.cacheToolsList && !this._cacheDirty && this._toolsList) {
168
+ return this._toolsList;
169
+ }
170
+ this._cacheDirty = false;
171
+ const response = await this.session.listTools();
172
+ this.debugLog(() => `Listed tools: ${JSON.stringify(response)}`);
173
+ this._toolsList = ListToolsResultSchema.parse(response).tools;
174
+ return this._toolsList;
175
+ }
176
+ async callTool(toolName, args) {
177
+ const { CallToolResultSchema } = await import("@modelcontextprotocol/sdk/types.js").catch(failedToImport);
178
+ if (!this.session) {
179
+ throw new Error("Server not initialized. Make sure you call connect() first.");
180
+ }
181
+ const response = await this.session.callTool({
182
+ name: toolName,
183
+ arguments: args ?? {},
184
+ }, undefined, {
185
+ timeout: this.timeout,
186
+ });
187
+ const parsed = CallToolResultSchema.parse(response);
188
+ const result = parsed.content;
189
+ this.debugLog(() => `Called tool ${toolName} (args: ${JSON.stringify(args)}, result: ${JSON.stringify(result)})`);
190
+ return result;
191
+ }
192
+ get name() {
193
+ return this._name;
194
+ }
195
+ async close() {
196
+ if (this.transport) {
197
+ await this.transport.close();
198
+ this.transport = null;
199
+ }
200
+ if (this.session) {
201
+ await this.session.close();
202
+ this.session = null;
203
+ }
204
+ }
205
+ }
206
+ export class NodeMCPServerStreamableHttp extends BaseMCPServerStreamableHttp {
207
+ session = null;
208
+ _cacheDirty = true;
209
+ _toolsList = [];
210
+ serverInitializeResult = null;
211
+ clientSessionTimeoutSeconds;
212
+ timeout;
213
+ params;
214
+ _name;
215
+ transport = null;
216
+ constructor(params) {
217
+ super(params);
218
+ this.clientSessionTimeoutSeconds = params.clientSessionTimeoutSeconds ?? 5;
219
+ this.params = params;
220
+ this._name = params.name || `streamable-http: ${this.params.url}`;
221
+ this.timeout = params.timeout ?? DEFAULT_REQUEST_TIMEOUT_MSEC;
222
+ }
223
+ async connect() {
224
+ try {
225
+ const { StreamableHTTPClientTransport } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js").catch(failedToImport);
226
+ const { Client } = await import("@modelcontextprotocol/sdk/client/index.js").catch(failedToImport);
227
+ this.transport = new StreamableHTTPClientTransport(new URL(this.params.url), {
228
+ authProvider: this.params.authProvider,
229
+ requestInit: this.params.requestInit,
230
+ fetch: this.params.fetch,
231
+ reconnectionOptions: this.params.reconnectionOptions,
232
+ sessionId: this.params.sessionId,
233
+ });
234
+ this.session = new Client({
235
+ name: this._name,
236
+ version: "1.0.0", // You may want to make this configurable
237
+ });
238
+ await this.session.connect(this.transport);
239
+ this.serverInitializeResult = {
240
+ serverInfo: { name: this._name, version: "1.0.0" },
241
+ };
242
+ }
243
+ catch (e) {
244
+ this.logger.error("Error initializing MCP server:", e);
245
+ await this.close();
246
+ throw e;
247
+ }
248
+ this.debugLog(() => `Connected to MCP server: ${this._name}`);
249
+ }
250
+ async invalidateToolsCache() {
251
+ await invalidateServerToolsCache(this.name);
252
+ this._cacheDirty = true;
253
+ }
254
+ async listTools() {
255
+ const { ListToolsResultSchema } = await import("@modelcontextprotocol/sdk/types.js").catch(failedToImport);
256
+ if (!this.session) {
257
+ throw new Error("Server not initialized. Make sure you call connect() first.");
258
+ }
259
+ if (this.cacheToolsList && !this._cacheDirty && this._toolsList) {
260
+ return this._toolsList;
261
+ }
262
+ this._cacheDirty = false;
263
+ const response = await this.session.listTools();
264
+ this.debugLog(() => `Listed tools: ${JSON.stringify(response)}`);
265
+ this._toolsList = ListToolsResultSchema.parse(response).tools;
266
+ return this._toolsList;
267
+ }
268
+ async callTool(toolName, args) {
269
+ const { CallToolResultSchema } = await import("@modelcontextprotocol/sdk/types.js").catch(failedToImport);
270
+ if (!this.session) {
271
+ throw new Error("Server not initialized. Make sure you call connect() first.");
272
+ }
273
+ const response = await this.session.callTool({
274
+ name: toolName,
275
+ arguments: args ?? {},
276
+ }, undefined, {
277
+ timeout: this.timeout,
278
+ });
279
+ const parsed = CallToolResultSchema.parse(response);
280
+ const result = parsed.content;
281
+ this.debugLog(() => `Called tool ${toolName} (args: ${JSON.stringify(args)}, result: ${JSON.stringify(result)})`);
282
+ return result;
283
+ }
284
+ get name() {
285
+ return this._name;
286
+ }
287
+ async close() {
288
+ if (this.transport) {
289
+ await this.transport.close();
290
+ this.transport = null;
291
+ }
292
+ if (this.session) {
293
+ await this.session.close();
294
+ this.session = null;
295
+ }
296
+ }
297
+ }
@@ -0,0 +1,34 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { BaseMCPServer } from "./base";
3
+ import type { MCPTool, CallToolResultContent, MCPServerSSEOptions, InitializeResult } from "./types";
4
+ /**
5
+ * MCP server client that communicates over Server-Sent Events (SSE).
6
+ */
7
+ export declare class MCPServerSSE extends BaseMCPServer {
8
+ readonly id: string;
9
+ protected session: Client | null;
10
+ protected timeout: number;
11
+ protected serverInitializeResult: InitializeResult | null;
12
+ params: MCPServerSSEOptions;
13
+ private transport;
14
+ constructor(options: MCPServerSSEOptions);
15
+ /**
16
+ * Establishes connection to the MCP server.
17
+ */
18
+ connect(): Promise<void>;
19
+ /**
20
+ * Internal implementation: Fetches tools from the server.
21
+ *
22
+ * Cached via the BaseMCPServer class.
23
+ */
24
+ protected _listTools(): Promise<MCPTool[]>;
25
+ /**
26
+ * Executes a tool on the server with the provided arguments.
27
+ */
28
+ callTool(toolName: string, args: Record<string, unknown> | null): Promise<CallToolResultContent>;
29
+ /**
30
+ * Closes the connection and cleans up resources.
31
+ */
32
+ close(): Promise<void>;
33
+ }
34
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/mcp/sse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAUnE,OAAO,EAAE,aAAa,EAAsC,MAAM,QAAQ,CAAC;AAC3E,OAAO,KAAK,EACV,OAAO,EACP,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,qBAAa,YAAa,SAAQ,aAAa;IAC7C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAQ;IACxC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,sBAAsB,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAEjE,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,CAAC,SAAS,CAAa;gBAElB,OAAO,EAAE,mBAAmB;IAYxC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B9B;;;;OAIG;cACa,UAAU,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAYhD;;OAEG;IACG,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GACnC,OAAO,CAAC,qBAAqB,CAAC;IA4BjC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B"}
@@ -0,0 +1,97 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
3
+ import { DEFAULT_REQUEST_TIMEOUT_MSEC } from "@modelcontextprotocol/sdk/shared/protocol.js";
4
+ import { ListToolsResultSchema, CallToolResultSchema, } from "@modelcontextprotocol/sdk/types.js";
5
+ import { getLogger } from "../lib/logger";
6
+ import { BaseMCPServer, DEFAULT_SSE_MCP_CLIENT_LOGGER_NAME } from "./base";
7
+ /**
8
+ * MCP server client that communicates over Server-Sent Events (SSE).
9
+ */
10
+ export class MCPServerSSE extends BaseMCPServer {
11
+ id;
12
+ session = null;
13
+ timeout;
14
+ serverInitializeResult = null;
15
+ params;
16
+ transport = null;
17
+ constructor(options) {
18
+ super({
19
+ cacheToolsList: options.cacheToolsList,
20
+ toolFilter: options.toolFilter,
21
+ logger: options.logger ?? getLogger(DEFAULT_SSE_MCP_CLIENT_LOGGER_NAME),
22
+ });
23
+ this.params = options;
24
+ this.id = options.id || `sse: ${this.params.url}`;
25
+ this.timeout = options.timeout ?? DEFAULT_REQUEST_TIMEOUT_MSEC;
26
+ }
27
+ /**
28
+ * Establishes connection to the MCP server.
29
+ */
30
+ async connect() {
31
+ try {
32
+ this.transport = new SSEClientTransport(new URL(this.params.url), {
33
+ authProvider: this.params.authProvider,
34
+ requestInit: this.params.requestInit,
35
+ eventSourceInit: this.params.eventSourceInit,
36
+ });
37
+ this.session = new Client({
38
+ name: this.id,
39
+ version: "1.0.0",
40
+ });
41
+ await this.session.connect(this.transport);
42
+ this.serverInitializeResult = {
43
+ serverInfo: { name: this.id, version: "1.0.0" },
44
+ };
45
+ }
46
+ catch (e) {
47
+ this.logger.error("Error initializing MCP server:", e);
48
+ await this.close();
49
+ throw e;
50
+ }
51
+ this.logger.debug(`Connected to MCP server: ${this.id}`);
52
+ }
53
+ /**
54
+ * Internal implementation: Fetches tools from the server.
55
+ *
56
+ * Cached via the BaseMCPServer class.
57
+ */
58
+ async _listTools() {
59
+ if (!this.session) {
60
+ throw new Error("Server not initialized. Make sure you call connect() first.");
61
+ }
62
+ const response = await this.session.listTools();
63
+ this.logger.debug(`Listed tools: ${JSON.stringify(response)}`);
64
+ return ListToolsResultSchema.parse(response).tools;
65
+ }
66
+ /**
67
+ * Executes a tool on the server with the provided arguments.
68
+ */
69
+ async callTool(toolName, args) {
70
+ if (!this.session) {
71
+ throw new Error("Server not initialized. Make sure you call connect() first.");
72
+ }
73
+ const response = await this.session.callTool({
74
+ name: toolName,
75
+ arguments: args ?? {},
76
+ }, undefined, {
77
+ timeout: this.timeout,
78
+ });
79
+ const parsed = CallToolResultSchema.parse(response);
80
+ const result = parsed.content;
81
+ this.logger.debug(`Called tool ${toolName} (args: ${JSON.stringify(args)}, result: ${JSON.stringify(result)})`);
82
+ return result;
83
+ }
84
+ /**
85
+ * Closes the connection and cleans up resources.
86
+ */
87
+ async close() {
88
+ if (this.transport) {
89
+ await this.transport.close();
90
+ this.transport = null;
91
+ }
92
+ if (this.session) {
93
+ await this.session.close();
94
+ this.session = null;
95
+ }
96
+ }
97
+ }
@@ -0,0 +1,32 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { BaseMCPServer } from "./base";
3
+ import type { MCPTool, CallToolResultContent, MCPServerStdioOptions, InitializeResult } from "./types";
4
+ /**
5
+ * MCP server client that communicates over stdio (standard input/output).
6
+ */
7
+ export declare class MCPServerStdio extends BaseMCPServer {
8
+ readonly id: string;
9
+ protected session: Client | null;
10
+ protected timeout: number;
11
+ protected serverInitializeResult: InitializeResult | null;
12
+ private params;
13
+ private transport;
14
+ constructor(options: MCPServerStdioOptions);
15
+ /**
16
+ * Establishes connection to the MCP server.
17
+ */
18
+ connect(): Promise<void>;
19
+ /**
20
+ * Internal implementation: Fetches tools from the server.
21
+ */
22
+ protected _listTools(): Promise<MCPTool[]>;
23
+ /**
24
+ * Executes a tool on the server with the provided arguments.
25
+ */
26
+ callTool(toolName: string, args: Record<string, unknown> | null): Promise<CallToolResultContent>;
27
+ /**
28
+ * Closes the connection and cleans up resources.
29
+ */
30
+ close(): Promise<void>;
31
+ }
32
+ //# sourceMappingURL=stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/mcp/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAUnE,OAAO,EAAE,aAAa,EAAwC,MAAM,QAAQ,CAAC;AAC7E,OAAO,KAAK,EACV,OAAO,EACP,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,qBAAa,cAAe,SAAQ,aAAa;IAC/C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAQ;IACxC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,sBAAsB,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAEjE,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,SAAS,CAAa;gBAElB,OAAO,EAAE,qBAAqB;IAY1C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B9B;;OAEG;cACa,UAAU,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAYhD;;OAEG;IACG,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GACnC,OAAO,CAAC,qBAAqB,CAAC;IA4BjC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B"}
@@ -0,0 +1,96 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
3
+ import { DEFAULT_REQUEST_TIMEOUT_MSEC } from "@modelcontextprotocol/sdk/shared/protocol.js";
4
+ import { ListToolsResultSchema, CallToolResultSchema, } from "@modelcontextprotocol/sdk/types.js";
5
+ import { getLogger } from "../lib/logger";
6
+ import { BaseMCPServer, DEFAULT_STDIO_MCP_CLIENT_LOGGER_NAME } from "./base";
7
+ /**
8
+ * MCP server client that communicates over stdio (standard input/output).
9
+ */
10
+ export class MCPServerStdio extends BaseMCPServer {
11
+ id;
12
+ session = null;
13
+ timeout;
14
+ serverInitializeResult = null;
15
+ params;
16
+ transport = null;
17
+ constructor(options) {
18
+ super({
19
+ cacheToolsList: options.cacheToolsList,
20
+ toolFilter: options.toolFilter,
21
+ logger: options.logger ?? getLogger(DEFAULT_STDIO_MCP_CLIENT_LOGGER_NAME),
22
+ });
23
+ this.timeout = options.timeout ?? DEFAULT_REQUEST_TIMEOUT_MSEC;
24
+ this.params = options;
25
+ this.id = options.id || `stdio: ${this.params.command}`;
26
+ }
27
+ /**
28
+ * Establishes connection to the MCP server.
29
+ */
30
+ async connect() {
31
+ try {
32
+ this.transport = new StdioClientTransport({
33
+ command: this.params.command,
34
+ args: this.params.args,
35
+ env: this.params.env,
36
+ cwd: this.params.cwd,
37
+ });
38
+ this.session = new Client({
39
+ name: this.id,
40
+ version: "1.0.0",
41
+ });
42
+ await this.session.connect(this.transport);
43
+ this.serverInitializeResult = {
44
+ serverInfo: { name: this.id, version: "1.0.0" },
45
+ };
46
+ this.logger.debug(`Connected to MCP server: ${this.id}`);
47
+ }
48
+ catch (e) {
49
+ this.logger.error("Error initializing MCP server:", e);
50
+ await this.close();
51
+ throw e;
52
+ }
53
+ }
54
+ /**
55
+ * Internal implementation: Fetches tools from the server.
56
+ */
57
+ async _listTools() {
58
+ if (!this.session) {
59
+ throw new Error("Server not initialized. Make sure you call connect() first.");
60
+ }
61
+ const response = await this.session.listTools();
62
+ this.logger.debug(`Listed tools: ${JSON.stringify(response)}`);
63
+ return ListToolsResultSchema.parse(response).tools;
64
+ }
65
+ /**
66
+ * Executes a tool on the server with the provided arguments.
67
+ */
68
+ async callTool(toolName, args) {
69
+ if (!this.session) {
70
+ throw new Error("Server not initialized. Make sure you call connect() first.");
71
+ }
72
+ const response = await this.session.callTool({
73
+ name: toolName,
74
+ arguments: args ?? {},
75
+ }, undefined, {
76
+ timeout: this.timeout,
77
+ });
78
+ const parsed = CallToolResultSchema.parse(response);
79
+ const result = parsed.content;
80
+ this.logger.debug(`Called tool ${toolName} (args: ${JSON.stringify(args)}, result: ${JSON.stringify(result)})`);
81
+ return result;
82
+ }
83
+ /**
84
+ * Closes the connection and cleans up resources.
85
+ */
86
+ async close() {
87
+ if (this.transport) {
88
+ await this.transport.close();
89
+ this.transport = null;
90
+ }
91
+ if (this.session) {
92
+ await this.session.close();
93
+ this.session = null;
94
+ }
95
+ }
96
+ }