@cloudbase/agent-tools 0.0.2

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 (194) hide show
  1. package/CHANGELOG.md +416 -0
  2. package/dist/agent_tool.d.ts +7 -0
  3. package/dist/agent_tool.d.ts.map +1 -0
  4. package/dist/agent_tool.js +16 -0
  5. package/dist/agent_tool.js.map +1 -0
  6. package/dist/bash/bash-tool.d.ts +61 -0
  7. package/dist/bash/bash-tool.d.ts.map +1 -0
  8. package/dist/bash/bash-tool.js +191 -0
  9. package/dist/bash/bash-tool.js.map +1 -0
  10. package/dist/bash/index.d.ts +7 -0
  11. package/dist/bash/index.d.ts.map +1 -0
  12. package/dist/bash/index.js +17 -0
  13. package/dist/bash/index.js.map +1 -0
  14. package/dist/bash/operator/base-operator.d.ts +44 -0
  15. package/dist/bash/operator/base-operator.d.ts.map +1 -0
  16. package/dist/bash/operator/base-operator.js +14 -0
  17. package/dist/bash/operator/base-operator.js.map +1 -0
  18. package/dist/bash/operator/local-operator.d.ts +15 -0
  19. package/dist/bash/operator/local-operator.d.ts.map +1 -0
  20. package/dist/bash/operator/local-operator.js +145 -0
  21. package/dist/bash/operator/local-operator.js.map +1 -0
  22. package/dist/bash/operator/sandbox-operator.d.ts +22 -0
  23. package/dist/bash/operator/sandbox-operator.d.ts.map +1 -0
  24. package/dist/bash/operator/sandbox-operator.js +112 -0
  25. package/dist/bash/operator/sandbox-operator.js.map +1 -0
  26. package/dist/bash/utils.d.ts +106 -0
  27. package/dist/bash/utils.d.ts.map +1 -0
  28. package/dist/bash/utils.js +197 -0
  29. package/dist/bash/utils.js.map +1 -0
  30. package/dist/browser/browser-instance-manager.d.ts +79 -0
  31. package/dist/browser/browser-instance-manager.d.ts.map +1 -0
  32. package/dist/browser/browser-instance-manager.js +242 -0
  33. package/dist/browser/browser-instance-manager.js.map +1 -0
  34. package/dist/browser/browser-tool-executor.d.ts +57 -0
  35. package/dist/browser/browser-tool-executor.d.ts.map +1 -0
  36. package/dist/browser/browser-tool-executor.js +205 -0
  37. package/dist/browser/browser-tool-executor.js.map +1 -0
  38. package/dist/browser/browser_client_unified.d.ts +52 -0
  39. package/dist/browser/browser_client_unified.d.ts.map +1 -0
  40. package/dist/browser/browser_client_unified.js +381 -0
  41. package/dist/browser/browser_client_unified.js.map +1 -0
  42. package/dist/browser/browser_tool_unified.d.ts +93 -0
  43. package/dist/browser/browser_tool_unified.d.ts.map +1 -0
  44. package/dist/browser/browser_tool_unified.js +181 -0
  45. package/dist/browser/browser_tool_unified.js.map +1 -0
  46. package/dist/browser/index.d.ts +7 -0
  47. package/dist/browser/index.d.ts.map +1 -0
  48. package/dist/browser/index.js +19 -0
  49. package/dist/browser/index.js.map +1 -0
  50. package/dist/browser/sandbox-connector.d.ts +93 -0
  51. package/dist/browser/sandbox-connector.d.ts.map +1 -0
  52. package/dist/browser/sandbox-connector.js +272 -0
  53. package/dist/browser/sandbox-connector.js.map +1 -0
  54. package/dist/browser/types.d.ts +53 -0
  55. package/dist/browser/types.d.ts.map +1 -0
  56. package/dist/browser/types.js +3 -0
  57. package/dist/browser/types.js.map +1 -0
  58. package/dist/code_executers/base_code_executor.d.ts +17 -0
  59. package/dist/code_executers/base_code_executor.d.ts.map +1 -0
  60. package/dist/code_executers/base_code_executor.js +20 -0
  61. package/dist/code_executers/base_code_executor.js.map +1 -0
  62. package/dist/code_executers/built_in_code_executor.d.ts +25 -0
  63. package/dist/code_executers/built_in_code_executor.d.ts.map +1 -0
  64. package/dist/code_executers/built_in_code_executor.js +106 -0
  65. package/dist/code_executers/built_in_code_executor.js.map +1 -0
  66. package/dist/code_executers/unsafe_local_code_executor.d.ts +118 -0
  67. package/dist/code_executers/unsafe_local_code_executor.d.ts.map +1 -0
  68. package/dist/code_executers/unsafe_local_code_executor.js +605 -0
  69. package/dist/code_executers/unsafe_local_code_executor.js.map +1 -0
  70. package/dist/fs/edit-tool.d.ts +26 -0
  71. package/dist/fs/edit-tool.d.ts.map +1 -0
  72. package/dist/fs/edit-tool.js +202 -0
  73. package/dist/fs/edit-tool.js.map +1 -0
  74. package/dist/fs/glob-tool.d.ts +31 -0
  75. package/dist/fs/glob-tool.d.ts.map +1 -0
  76. package/dist/fs/glob-tool.js +287 -0
  77. package/dist/fs/glob-tool.js.map +1 -0
  78. package/dist/fs/grep-tool.d.ts +32 -0
  79. package/dist/fs/grep-tool.d.ts.map +1 -0
  80. package/dist/fs/grep-tool.js +353 -0
  81. package/dist/fs/grep-tool.js.map +1 -0
  82. package/dist/fs/index.d.ts +11 -0
  83. package/dist/fs/index.d.ts.map +1 -0
  84. package/dist/fs/index.js +38 -0
  85. package/dist/fs/index.js.map +1 -0
  86. package/dist/fs/ls-tool.d.ts +26 -0
  87. package/dist/fs/ls-tool.d.ts.map +1 -0
  88. package/dist/fs/ls-tool.js +235 -0
  89. package/dist/fs/ls-tool.js.map +1 -0
  90. package/dist/fs/multiedit-tool.d.ts +34 -0
  91. package/dist/fs/multiedit-tool.d.ts.map +1 -0
  92. package/dist/fs/multiedit-tool.js +158 -0
  93. package/dist/fs/multiedit-tool.js.map +1 -0
  94. package/dist/fs/operator/base-operator.d.ts +28 -0
  95. package/dist/fs/operator/base-operator.d.ts.map +1 -0
  96. package/dist/fs/operator/base-operator.js +21 -0
  97. package/dist/fs/operator/base-operator.js.map +1 -0
  98. package/dist/fs/operator/in-memory-operator.d.ts +39 -0
  99. package/dist/fs/operator/in-memory-operator.d.ts.map +1 -0
  100. package/dist/fs/operator/in-memory-operator.js +115 -0
  101. package/dist/fs/operator/in-memory-operator.js.map +1 -0
  102. package/dist/fs/operator/index.d.ts +6 -0
  103. package/dist/fs/operator/index.d.ts.map +1 -0
  104. package/dist/fs/operator/index.js +28 -0
  105. package/dist/fs/operator/index.js.map +1 -0
  106. package/dist/fs/operator/local-operator.d.ts +25 -0
  107. package/dist/fs/operator/local-operator.d.ts.map +1 -0
  108. package/dist/fs/operator/local-operator.js +62 -0
  109. package/dist/fs/operator/local-operator.js.map +1 -0
  110. package/dist/fs/operator/sanbox-operator.d.ts +31 -0
  111. package/dist/fs/operator/sanbox-operator.d.ts.map +1 -0
  112. package/dist/fs/operator/sanbox-operator.js +172 -0
  113. package/dist/fs/operator/sanbox-operator.js.map +1 -0
  114. package/dist/fs/operator/transaction/index.d.ts +6 -0
  115. package/dist/fs/operator/transaction/index.d.ts.map +1 -0
  116. package/dist/fs/operator/transaction/index.js +28 -0
  117. package/dist/fs/operator/transaction/index.js.map +1 -0
  118. package/dist/fs/operator/transaction/snapshot-strategies.d.ts +54 -0
  119. package/dist/fs/operator/transaction/snapshot-strategies.d.ts.map +1 -0
  120. package/dist/fs/operator/transaction/snapshot-strategies.js +278 -0
  121. package/dist/fs/operator/transaction/snapshot-strategies.js.map +1 -0
  122. package/dist/fs/operator/transaction/transaction-operator.d.ts +53 -0
  123. package/dist/fs/operator/transaction/transaction-operator.d.ts.map +1 -0
  124. package/dist/fs/operator/transaction/transaction-operator.js +195 -0
  125. package/dist/fs/operator/transaction/transaction-operator.js.map +1 -0
  126. package/dist/fs/operator/transaction/transaction-utils.d.ts +80 -0
  127. package/dist/fs/operator/transaction/transaction-utils.d.ts.map +1 -0
  128. package/dist/fs/operator/transaction/transaction-utils.js +156 -0
  129. package/dist/fs/operator/transaction/transaction-utils.js.map +1 -0
  130. package/dist/fs/read-tool.d.ts +32 -0
  131. package/dist/fs/read-tool.d.ts.map +1 -0
  132. package/dist/fs/read-tool.js +271 -0
  133. package/dist/fs/read-tool.js.map +1 -0
  134. package/dist/fs/str-replace-editor.d.ts +23 -0
  135. package/dist/fs/str-replace-editor.d.ts.map +1 -0
  136. package/dist/fs/str-replace-editor.js +74 -0
  137. package/dist/fs/str-replace-editor.js.map +1 -0
  138. package/dist/fs/toolkit.d.ts +61 -0
  139. package/dist/fs/toolkit.d.ts.map +1 -0
  140. package/dist/fs/toolkit.js +113 -0
  141. package/dist/fs/toolkit.js.map +1 -0
  142. package/dist/fs/utils.d.ts +32 -0
  143. package/dist/fs/utils.d.ts.map +1 -0
  144. package/dist/fs/utils.js +133 -0
  145. package/dist/fs/utils.js.map +1 -0
  146. package/dist/fs/write-tool.d.ts +26 -0
  147. package/dist/fs/write-tool.d.ts.map +1 -0
  148. package/dist/fs/write-tool.js +110 -0
  149. package/dist/fs/write-tool.js.map +1 -0
  150. package/dist/index.d.ts +10 -0
  151. package/dist/index.d.ts.map +1 -0
  152. package/dist/index.js +40 -0
  153. package/dist/index.js.map +1 -0
  154. package/dist/mcp/agkit-mcp-server.d.ts +291 -0
  155. package/dist/mcp/agkit-mcp-server.d.ts.map +1 -0
  156. package/dist/mcp/agkit-mcp-server.js +821 -0
  157. package/dist/mcp/agkit-mcp-server.js.map +1 -0
  158. package/dist/mcp/client-tool.d.ts +65 -0
  159. package/dist/mcp/client-tool.d.ts.map +1 -0
  160. package/dist/mcp/client-tool.js +220 -0
  161. package/dist/mcp/client-tool.js.map +1 -0
  162. package/dist/mcp/index.d.ts +14 -0
  163. package/dist/mcp/index.d.ts.map +1 -0
  164. package/dist/mcp/index.js +26 -0
  165. package/dist/mcp/index.js.map +1 -0
  166. package/dist/mcp/mcp-client-manager.d.ts +153 -0
  167. package/dist/mcp/mcp-client-manager.d.ts.map +1 -0
  168. package/dist/mcp/mcp-client-manager.js +606 -0
  169. package/dist/mcp/mcp-client-manager.js.map +1 -0
  170. package/dist/mcp/mcp-toolkit.d.ts +112 -0
  171. package/dist/mcp/mcp-toolkit.d.ts.map +1 -0
  172. package/dist/mcp/mcp-toolkit.js +188 -0
  173. package/dist/mcp/mcp-toolkit.js.map +1 -0
  174. package/dist/mcp/types.d.ts +157 -0
  175. package/dist/mcp/types.d.ts.map +1 -0
  176. package/dist/mcp/types.js +34 -0
  177. package/dist/mcp/types.js.map +1 -0
  178. package/dist/mcp/utils.d.ts +17 -0
  179. package/dist/mcp/utils.d.ts.map +1 -0
  180. package/dist/mcp/utils.js +48 -0
  181. package/dist/mcp/utils.js.map +1 -0
  182. package/dist/types/index.d.ts +31 -0
  183. package/dist/types/index.d.ts.map +1 -0
  184. package/dist/types/index.js +3 -0
  185. package/dist/types/index.js.map +1 -0
  186. package/dist/types/zod.d.ts +18 -0
  187. package/dist/types/zod.d.ts.map +1 -0
  188. package/dist/types/zod.js +3 -0
  189. package/dist/types/zod.js.map +1 -0
  190. package/dist/utils.d.ts +141 -0
  191. package/dist/utils.d.ts.map +1 -0
  192. package/dist/utils.js +379 -0
  193. package/dist/utils.js.map +1 -0
  194. package/package.json +46 -0
@@ -0,0 +1,821 @@
1
+ "use strict";
2
+ /**
3
+ * AG-Kit MCP Server
4
+ *
5
+ * A unified MCP server that directly exposes AG-Kit tools via the MCP protocol.
6
+ * For HTTP transports, provides transport instances for integration with any HTTP server.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.memoryTransportRegistry = exports.AGKitMCPServer = exports.MemoryTransportRegistry = void 0;
10
+ exports.zodSchemaToMCPSchema = zodSchemaToMCPSchema;
11
+ exports.convertAGKitToolToMCPMetadata = convertAGKitToolToMCPMetadata;
12
+ exports.createAGKitMCPServer = createAGKitMCPServer;
13
+ const node_crypto_1 = require("node:crypto");
14
+ const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
15
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
16
+ const sse_js_1 = require("@modelcontextprotocol/sdk/server/sse.js");
17
+ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
18
+ const inMemory_js_1 = require("@modelcontextprotocol/sdk/inMemory.js");
19
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
20
+ // Global registry for memory transports using official InMemoryTransport
21
+ class MemoryTransportRegistry {
22
+ constructor() {
23
+ this.transports = new Map();
24
+ this.servers = new Map();
25
+ }
26
+ static getInstance() {
27
+ if (!MemoryTransportRegistry.instance) {
28
+ MemoryTransportRegistry.instance = new MemoryTransportRegistry();
29
+ }
30
+ return MemoryTransportRegistry.instance;
31
+ }
32
+ registerServer(memoryId, server) {
33
+ this.servers.set(memoryId, server);
34
+ }
35
+ unregisterServer(memoryId) {
36
+ this.servers.delete(memoryId);
37
+ this.transports.delete(memoryId);
38
+ }
39
+ getServer(memoryId) {
40
+ return this.servers.get(memoryId);
41
+ }
42
+ /**
43
+ * Creates a pair of InMemory transports (server and client)
44
+ * Uses official InMemoryTransport.createLinkedPair()
45
+ */
46
+ createTransportPair(memoryId) {
47
+ let transportPair = this.transports.get(memoryId);
48
+ if (!transportPair) {
49
+ // Use official InMemoryTransport to create a linked pair
50
+ const [serverTransport, clientTransport] = inMemory_js_1.InMemoryTransport.createLinkedPair();
51
+ transportPair = {
52
+ server: serverTransport,
53
+ client: clientTransport,
54
+ };
55
+ this.transports.set(memoryId, transportPair);
56
+ }
57
+ return transportPair;
58
+ }
59
+ /**
60
+ * Gets the client transport for client connections
61
+ */
62
+ getClientTransport(memoryId) {
63
+ const transportPair = this.transports.get(memoryId);
64
+ if (!transportPair) {
65
+ throw new Error(`No transport pair found with memory ID: ${memoryId}`);
66
+ }
67
+ return transportPair.client;
68
+ }
69
+ /**
70
+ * Gets the server-side transport
71
+ */
72
+ getServerTransport(memoryId) {
73
+ const transportPair = this.transports.get(memoryId);
74
+ if (!transportPair) {
75
+ throw new Error(`No transport pair found with memory ID: ${memoryId}`);
76
+ }
77
+ return transportPair.server;
78
+ }
79
+ // Direct API for memory-based tool calls (backward compatibility)
80
+ async callTool(memoryId, toolName, args) {
81
+ const server = this.servers.get(memoryId);
82
+ if (!server) {
83
+ throw new Error(`No MCP server found with memory ID: ${memoryId}`);
84
+ }
85
+ return server.callTool(toolName, args);
86
+ }
87
+ async listTools(memoryId) {
88
+ const server = this.servers.get(memoryId);
89
+ if (!server) {
90
+ throw new Error(`No MCP server found with memory ID: ${memoryId}`);
91
+ }
92
+ return server.listTools();
93
+ }
94
+ }
95
+ exports.MemoryTransportRegistry = MemoryTransportRegistry;
96
+ /**
97
+ * Converts a zod schema to MCP JSON schema format
98
+ */
99
+ function zodSchemaToMCPSchema(zodSchema) {
100
+ try {
101
+ // Try to get the schema definition
102
+ const def = zodSchema._def;
103
+ if (!def) {
104
+ return { type: "object", properties: {}, additionalProperties: true };
105
+ }
106
+ switch (def.type) {
107
+ case "object":
108
+ const properties = {};
109
+ const required = [];
110
+ if (def.shape) {
111
+ const shape = typeof def.shape === "function" ? def.shape() : def.shape;
112
+ for (const [key, value] of Object.entries(shape)) {
113
+ const propSchema = zodSchemaToMCPSchema(value);
114
+ properties[key] = propSchema;
115
+ // Check if field is required (not optional)
116
+ const propDef = value?._def;
117
+ if (propDef && propDef.type !== "optional") {
118
+ required.push(key);
119
+ }
120
+ }
121
+ }
122
+ return {
123
+ type: "object",
124
+ properties,
125
+ required: required.length > 0 ? required : undefined,
126
+ additionalProperties: false,
127
+ };
128
+ case "string":
129
+ const stringSchema = { type: "string" };
130
+ if (def.description)
131
+ stringSchema.description = def.description;
132
+ return stringSchema;
133
+ case "number":
134
+ const numberSchema = { type: "number" };
135
+ if (def.description)
136
+ numberSchema.description = def.description;
137
+ return numberSchema;
138
+ case "boolean":
139
+ const booleanSchema = { type: "boolean" };
140
+ if (def.description)
141
+ booleanSchema.description = def.description;
142
+ return booleanSchema;
143
+ case "array":
144
+ const arraySchema = {
145
+ type: "array",
146
+ items: def.element
147
+ ? zodSchemaToMCPSchema(def.element)
148
+ : { type: "any" },
149
+ };
150
+ if (def.description)
151
+ arraySchema.description = def.description;
152
+ return arraySchema;
153
+ case "optional":
154
+ return zodSchemaToMCPSchema(def.innerType);
155
+ case "enum":
156
+ const enumSchema = {
157
+ type: "string",
158
+ enum: def.entries ? Object.keys(def.entries) : [],
159
+ };
160
+ if (def.description)
161
+ enumSchema.description = def.description;
162
+ return enumSchema;
163
+ case "union":
164
+ // For unions, we'll use the first type or fallback to any
165
+ if (def.options && def.options.length > 0) {
166
+ return zodSchemaToMCPSchema(def.options[0]);
167
+ }
168
+ return { type: "any", description: def.description };
169
+ case "record":
170
+ const recordSchema = {
171
+ type: "object",
172
+ additionalProperties: def.valueType
173
+ ? zodSchemaToMCPSchema(def.valueType)
174
+ : { type: "any" },
175
+ };
176
+ if (def.description)
177
+ recordSchema.description = def.description;
178
+ return recordSchema;
179
+ default:
180
+ return { type: "any", description: def.description };
181
+ }
182
+ }
183
+ catch (error) {
184
+ console.warn("Failed to convert zod schema to MCP schema:", error);
185
+ return { type: "object", properties: {}, additionalProperties: true };
186
+ }
187
+ }
188
+ /**
189
+ * Converts AG-Kit BaseTool to MCP tool metadata
190
+ */
191
+ function convertAGKitToolToMCPMetadata(tool, config = {
192
+ name: "ag-kit-mcp-server",
193
+ version: "1.0.0",
194
+ }, toolConfig) {
195
+ const toolMetadata = tool.getMetadata();
196
+ // Convert zod schema to MCP JSON schema
197
+ const inputSchema = zodSchemaToMCPSchema(tool.schema);
198
+ // Determine final name - toolConfig.name takes precedence, then namePrefix from toolConfig
199
+ let finalName = toolMetadata.name;
200
+ if (toolConfig?.name) {
201
+ finalName = toolConfig.name;
202
+ }
203
+ else if (toolConfig?.namePrefix) {
204
+ finalName = `${toolConfig.namePrefix}${toolMetadata.name}`;
205
+ }
206
+ // Determine final description - toolConfig.description takes precedence
207
+ let finalDescription = toolMetadata.description || `AG-Kit tool: ${toolMetadata.name}`;
208
+ if (toolConfig?.description) {
209
+ finalDescription = toolConfig.description;
210
+ }
211
+ return {
212
+ name: finalName,
213
+ description: finalDescription,
214
+ inputSchema,
215
+ };
216
+ }
217
+ /**
218
+ * AG-Kit MCP Server
219
+ *
220
+ * A unified server that directly handles AG-Kit tools and MCP protocol
221
+ */
222
+ class AGKitMCPServer {
223
+ constructor(config = {
224
+ name: "ag-kit-mcp-server",
225
+ version: "1.0.0",
226
+ }) {
227
+ this.tools = new Map();
228
+ this.toolConfigs = new Map();
229
+ this.eventListeners = new Set();
230
+ this.isRunning = false;
231
+ this.currentTransport = null;
232
+ this.transportType = null;
233
+ this.config = {
234
+ enableLogging: true,
235
+ includeMetadata: true,
236
+ errorHandling: "return_error",
237
+ ...config,
238
+ };
239
+ // Create MCP server
240
+ this.server = new index_js_1.Server({
241
+ name: config.name,
242
+ version: config.version,
243
+ }, {
244
+ capabilities: {
245
+ tools: {},
246
+ },
247
+ });
248
+ this.setupServerHandlers();
249
+ }
250
+ /**
251
+ * Setup MCP server request handlers
252
+ */
253
+ setupServerHandlers() {
254
+ // Handle list tools request
255
+ this.server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
256
+ try {
257
+ const tools = this.getToolsMetadata();
258
+ this.emit({
259
+ type: "tool_discovered",
260
+ tool: {
261
+ name: `${tools.length} tools listed`,
262
+ description: "",
263
+ inputSchema: { type: "object" },
264
+ },
265
+ });
266
+ if (this.config.enableLogging) {
267
+ console.log(`[AGKitMCPServer] Listed ${tools.length} tools`);
268
+ }
269
+ return {
270
+ tools: tools.map((tool) => ({
271
+ name: tool.name,
272
+ description: tool.description || "",
273
+ inputSchema: tool.inputSchema,
274
+ })),
275
+ };
276
+ }
277
+ catch (error) {
278
+ const mcpError = new types_js_1.McpError(types_js_1.ErrorCode.InternalError, `Failed to list tools: ${error instanceof Error ? error.message : String(error)}`);
279
+ this.emit({
280
+ type: "error",
281
+ error: error instanceof Error ? error : new Error(String(error)),
282
+ context: "list_tools",
283
+ });
284
+ throw mcpError;
285
+ }
286
+ });
287
+ // Handle call tool request
288
+ this.server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
289
+ const { name, arguments: args } = request.params;
290
+ try {
291
+ this.emit({
292
+ type: "tool_called",
293
+ toolName: name,
294
+ arguments: args,
295
+ });
296
+ if (this.config.enableLogging) {
297
+ console.log(`[AGKitMCPServer] Calling tool: ${name}`, args);
298
+ }
299
+ // Call the tool directly
300
+ const result = await this.callTool(name, args || {});
301
+ this.emit({
302
+ type: "tool_result",
303
+ toolName: name,
304
+ result,
305
+ });
306
+ if (this.config.enableLogging) {
307
+ console.log(`[AGKitMCPServer] Tool ${name} completed:`, result.isError ? "ERROR" : "SUCCESS");
308
+ }
309
+ return {
310
+ content: result.content,
311
+ isError: result.isError,
312
+ };
313
+ }
314
+ catch (error) {
315
+ const errorMessage = error instanceof Error ? error.message : String(error);
316
+ this.emit({
317
+ type: "error",
318
+ error: error instanceof Error ? error : new Error(String(error)),
319
+ context: `call_tool:${name}`,
320
+ });
321
+ if (this.config.enableLogging) {
322
+ console.error(`[AGKitMCPServer] Tool ${name} failed:`, errorMessage);
323
+ }
324
+ const mcpError = new types_js_1.McpError(types_js_1.ErrorCode.InternalError, `Tool execution failed: ${errorMessage}`);
325
+ throw mcpError;
326
+ }
327
+ });
328
+ }
329
+ /**
330
+ * Register an AG-Kit tool with the server
331
+ * @param tool - The AG-Kit tool instance to register
332
+ * @param toolConfig - Optional configuration for the tool (name, description, etc.)
333
+ * @returns The MCP metadata for the registered tool
334
+ */
335
+ registerTool(tool, toolConfig) {
336
+ const mcpMetadata = convertAGKitToolToMCPMetadata(tool, this.config, toolConfig);
337
+ this.tools.set(mcpMetadata.name, tool);
338
+ if (toolConfig) {
339
+ this.toolConfigs.set(mcpMetadata.name, toolConfig);
340
+ }
341
+ if (this.config.enableLogging) {
342
+ console.log(`[AGKitMCPServer] Registered tool: ${mcpMetadata.name}`);
343
+ }
344
+ this.emit({
345
+ type: "tool_discovered",
346
+ tool: mcpMetadata,
347
+ });
348
+ return mcpMetadata;
349
+ }
350
+ /**
351
+ * Register multiple AG-Kit tools
352
+ */
353
+ registerTools(tools, toolConfig) {
354
+ const metadataList = tools.map((tool) => this.registerTool(tool, toolConfig));
355
+ if (this.config.enableLogging) {
356
+ console.log(`[AGKitMCPServer] Registered ${tools.length} tools`);
357
+ }
358
+ return metadataList;
359
+ }
360
+ /**
361
+ * Unregister a tool
362
+ */
363
+ unregisterTool(name) {
364
+ this.toolConfigs.delete(name);
365
+ const success = this.tools.delete(name);
366
+ if (success && this.config.enableLogging) {
367
+ console.log(`[AGKitMCPServer] Unregistered tool: ${name}`);
368
+ }
369
+ return success;
370
+ }
371
+ /**
372
+ * Execute a tool via MCP call format
373
+ */
374
+ async callTool(name, args) {
375
+ const tool = this.tools.get(name);
376
+ if (!tool) {
377
+ return {
378
+ content: [
379
+ {
380
+ type: "text",
381
+ text: `Tool '${name}' not found. Available tools: ${Array.from(this.tools.keys()).join(", ")}`,
382
+ },
383
+ ],
384
+ isError: true,
385
+ };
386
+ }
387
+ try {
388
+ // Transform input if configured
389
+ const transformedArgs = this.config.transformInput
390
+ ? this.config.transformInput(args)
391
+ : args;
392
+ // Execute the AG-Kit tool
393
+ const result = await tool.invoke(transformedArgs);
394
+ // Handle AG-Kit tool result
395
+ if (!result.success) {
396
+ if (this.config.errorHandling === "throw") {
397
+ throw new Error(result.error || "Tool execution failed");
398
+ }
399
+ return {
400
+ content: [
401
+ {
402
+ type: "text",
403
+ text: result.error || "Tool execution failed",
404
+ },
405
+ ],
406
+ isError: true,
407
+ };
408
+ }
409
+ // Transform output if configured
410
+ let outputData = result.data;
411
+ if (this.config.transformOutput) {
412
+ outputData = this.config.transformOutput(outputData);
413
+ }
414
+ // Format successful result
415
+ let content;
416
+ if (typeof outputData === "string") {
417
+ content = [{ type: "text", text: outputData }];
418
+ }
419
+ else if (outputData && typeof outputData === "object") {
420
+ // Try to format as JSON if it's an object
421
+ content = [
422
+ {
423
+ type: "text",
424
+ text: JSON.stringify(outputData, null, 2),
425
+ },
426
+ ];
427
+ }
428
+ else {
429
+ content = [
430
+ {
431
+ type: "text",
432
+ text: String(outputData),
433
+ },
434
+ ];
435
+ }
436
+ // Add metadata if configured
437
+ if (this.config.includeMetadata && result.executionTime !== undefined) {
438
+ content.push({
439
+ type: "text",
440
+ text: `\n[Execution time: ${result.executionTime}ms]`,
441
+ });
442
+ }
443
+ return {
444
+ content,
445
+ isError: false,
446
+ };
447
+ }
448
+ catch (error) {
449
+ const errorMessage = error instanceof Error ? error.message : String(error);
450
+ if (this.config.errorHandling === "throw") {
451
+ throw error;
452
+ }
453
+ return {
454
+ content: [
455
+ {
456
+ type: "text",
457
+ text: `Error executing tool '${name}': ${errorMessage}`,
458
+ },
459
+ ],
460
+ isError: true,
461
+ };
462
+ }
463
+ }
464
+ /**
465
+ * Get all registered tool metadata
466
+ */
467
+ getToolsMetadata() {
468
+ return Array.from(this.tools.entries()).map(([name, tool]) => {
469
+ const toolConfig = this.toolConfigs.get(name);
470
+ return convertAGKitToolToMCPMetadata(tool, this.config, toolConfig);
471
+ });
472
+ }
473
+ /**
474
+ * List all registered tools in MCP format
475
+ */
476
+ listTools() {
477
+ const tools = [];
478
+ Array.from(this.tools.entries()).forEach(([toolName, tool]) => {
479
+ const toolConfig = this.toolConfigs.get(toolName);
480
+ const metadata = convertAGKitToolToMCPMetadata(tool, this.config, toolConfig);
481
+ tools.push({
482
+ name: toolName,
483
+ description: metadata.description || "",
484
+ inputSchema: metadata.inputSchema,
485
+ });
486
+ });
487
+ return tools;
488
+ }
489
+ /**
490
+ * Get specific tool metadata
491
+ */
492
+ getToolMetadata(name) {
493
+ const tool = this.tools.get(name);
494
+ if (!tool)
495
+ return null;
496
+ const toolConfig = this.toolConfigs.get(name);
497
+ return convertAGKitToolToMCPMetadata(tool, this.config, toolConfig);
498
+ }
499
+ /**
500
+ * Check if a tool is registered
501
+ */
502
+ hasTool(name) {
503
+ return this.tools.has(name);
504
+ }
505
+ /**
506
+ * Get list of available tool names
507
+ */
508
+ getAvailableTools() {
509
+ return Array.from(this.tools.keys());
510
+ }
511
+ /**
512
+ * Get tool statistics
513
+ */
514
+ getStats() {
515
+ const toolNames = Array.from(this.tools.keys());
516
+ const toolTypes = {};
517
+ Array.from(this.tools.values()).forEach((tool) => {
518
+ const metadata = tool.getMetadata();
519
+ const type = metadata.type || metadata.name || "unknown";
520
+ toolTypes[type] = (toolTypes[type] || 0) + 1;
521
+ });
522
+ return {
523
+ totalTools: this.tools.size,
524
+ toolNames,
525
+ toolTypes,
526
+ isRunning: this.isRunning,
527
+ serverInfo: {
528
+ name: this.config.name,
529
+ version: this.config.version,
530
+ description: this.config.description,
531
+ },
532
+ };
533
+ }
534
+ /**
535
+ * Start the MCP server with specified transport
536
+ */
537
+ async run(transportConfig) {
538
+ if (this.isRunning) {
539
+ throw new Error("Server is already running");
540
+ }
541
+ try {
542
+ this.transportType = transportConfig.type;
543
+ if (this.config.enableLogging) {
544
+ console.log(`[AGKitMCPServer] Starting ${this.config.name} v${this.config.version} with ${transportConfig.type} transport`);
545
+ console.log(`[AGKitMCPServer] Registered tools: ${this.getAvailableTools().join(", ")}`);
546
+ }
547
+ this.isRunning = true;
548
+ this.emit({
549
+ type: "connected",
550
+ clientName: transportConfig.type,
551
+ });
552
+ switch (transportConfig.type) {
553
+ case "stdio":
554
+ const stdioTransport = new stdio_js_1.StdioServerTransport();
555
+ this.currentTransport = stdioTransport;
556
+ await this.server.connect(stdioTransport);
557
+ break;
558
+ case "sse":
559
+ // SSE transport - provide factory function to user
560
+ if (transportConfig.sseSetup) {
561
+ // Create SSE transport factory function
562
+ const createTransport = async (endpoint, response, options) => {
563
+ const transport = new sse_js_1.SSEServerTransport(endpoint, response, {
564
+ enableDnsRebindingProtection: options?.enableDnsRebindingProtection ?? false,
565
+ allowedHosts: options?.allowedHosts,
566
+ allowedOrigins: options?.allowedOrigins,
567
+ });
568
+ // Connect to MCP server
569
+ await this.server.connect(transport);
570
+ this.currentTransport = transport;
571
+ if (this.config.enableLogging) {
572
+ console.log(`[AGKitMCPServer] SSE transport created and connected for endpoint: ${endpoint}`);
573
+ }
574
+ return transport;
575
+ };
576
+ // Call user callback with factory function
577
+ await transportConfig.sseSetup(this, createTransport);
578
+ }
579
+ if (this.config.enableLogging) {
580
+ console.log(`[AGKitMCPServer] SSE transport setup completed`);
581
+ }
582
+ this.isRunning = true;
583
+ break;
584
+ case "streamableHttp":
585
+ // StreamableHTTP transport - provide factory function to user
586
+ if (transportConfig.streamableHttpSetup) {
587
+ // Create StreamableHTTP transport factory function
588
+ const createTransport = async (options) => {
589
+ const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
590
+ sessionIdGenerator: options?.sessionIdGenerator || (() => (0, node_crypto_1.randomUUID)()),
591
+ enableJsonResponse: options?.enableJsonResponse ?? true,
592
+ enableDnsRebindingProtection: options?.enableDnsRebindingProtection ?? false,
593
+ allowedHosts: options?.allowedHosts,
594
+ allowedOrigins: options?.allowedOrigins,
595
+ });
596
+ // Connect to MCP server
597
+ await this.server.connect(transport);
598
+ this.currentTransport = transport;
599
+ if (this.config.enableLogging) {
600
+ console.log(`[AGKitMCPServer] StreamableHTTP transport created and connected`);
601
+ }
602
+ return transport;
603
+ };
604
+ // Call user callback with factory function
605
+ await transportConfig.streamableHttpSetup(this, createTransport);
606
+ }
607
+ if (this.config.enableLogging) {
608
+ console.log(`[AGKitMCPServer] StreamableHTTP transport setup completed`);
609
+ }
610
+ this.isRunning = true;
611
+ break;
612
+ case "memory":
613
+ const memoryId = transportConfig.memoryId || "default";
614
+ const registry = MemoryTransportRegistry.getInstance();
615
+ // Use official InMemoryTransport to create transport pair
616
+ const transportPair = registry.createTransportPair(memoryId);
617
+ // Server connects to server transport
618
+ this.currentTransport = transportPair.server;
619
+ this.memoryId = memoryId;
620
+ // Register server to registry
621
+ registry.registerServer(memoryId, this);
622
+ // Connect server
623
+ await this.server.connect(transportPair.server);
624
+ if (this.config.enableLogging) {
625
+ console.log(`[AGKitMCPServer] Memory transport ready with ID: ${memoryId}`);
626
+ console.log(`[AGKitMCPServer] Use MemoryTransportRegistry.getInstance().getClientTransport('${memoryId}') to get client transport`);
627
+ }
628
+ break;
629
+ default:
630
+ throw new Error(`Unsupported transport type: ${transportConfig.type}`);
631
+ }
632
+ if (this.config.enableLogging) {
633
+ console.log(`[AGKitMCPServer] Server started successfully`);
634
+ }
635
+ }
636
+ catch (error) {
637
+ this.isRunning = false;
638
+ this.currentTransport = null;
639
+ this.transportType = null;
640
+ this.emit({
641
+ type: "error",
642
+ error: error instanceof Error ? error : new Error(String(error)),
643
+ context: "server_start",
644
+ });
645
+ if (this.config.enableLogging) {
646
+ console.error(`[AGKitMCPServer] Failed to start server:`, error);
647
+ }
648
+ throw error;
649
+ }
650
+ }
651
+ /**
652
+ * Start the MCP server with stdio transport (backward compatibility)
653
+ */
654
+ async runStdio() {
655
+ return this.run({ type: "stdio" });
656
+ }
657
+ /**
658
+ * Start the MCP server with memory transport
659
+ */
660
+ async runMemory(memoryId = "default") {
661
+ return this.run({ type: "memory", memoryId });
662
+ }
663
+ /**
664
+ * Run with StreamableHTTP transport using user-provided setup callback
665
+ * @param setup - Callback function to integrate with user's HTTP server
666
+ * @param options - Optional transport configuration (deprecated - use factory function parameters)
667
+ */
668
+ async runStreamableHttp(setup, options) {
669
+ return this.run({
670
+ type: "streamableHttp",
671
+ streamableHttpSetup: setup,
672
+ });
673
+ }
674
+ /**
675
+ * Run with SSE transport using user-provided setup callback
676
+ * @param setup - Callback function to integrate with user's HTTP server
677
+ * @param options - Optional transport configuration (deprecated - use factory function parameters)
678
+ */
679
+ async runSSE(setup, options) {
680
+ return this.run({
681
+ type: "sse",
682
+ sseSetup: setup,
683
+ });
684
+ }
685
+ /**
686
+ * Stop the server
687
+ */
688
+ async stop() {
689
+ if (!this.isRunning) {
690
+ return;
691
+ }
692
+ try {
693
+ // Clean up based on transport type
694
+ if (this.transportType === "memory" && this.memoryId) {
695
+ MemoryTransportRegistry.getInstance().unregisterServer(this.memoryId);
696
+ }
697
+ if (this.currentTransport) {
698
+ await this.currentTransport.close();
699
+ }
700
+ // Only close server for stdio transports (others manage their own lifecycle)
701
+ if (this.transportType !== "memory" &&
702
+ this.transportType !== "sse" &&
703
+ this.transportType !== "streamableHttp") {
704
+ await this.server.close();
705
+ }
706
+ this.isRunning = false;
707
+ this.currentTransport = null;
708
+ this.emit({
709
+ type: "disconnected",
710
+ clientName: this.transportType || "unknown",
711
+ });
712
+ if (this.config.enableLogging) {
713
+ console.log(`[AGKitMCPServer] Server stopped (${this.transportType} transport)`);
714
+ }
715
+ this.transportType = null;
716
+ this.memoryId = undefined;
717
+ }
718
+ catch (error) {
719
+ this.emit({
720
+ type: "error",
721
+ error: error instanceof Error ? error : new Error(String(error)),
722
+ context: "server_stop",
723
+ });
724
+ if (this.config.enableLogging) {
725
+ console.error(`[AGKitMCPServer] Error stopping server:`, error);
726
+ }
727
+ throw error;
728
+ }
729
+ }
730
+ /**
731
+ * Check if server is running
732
+ */
733
+ isServerRunning() {
734
+ return this.isRunning;
735
+ }
736
+ /**
737
+ * Get current transport type
738
+ */
739
+ getTransportType() {
740
+ return this.transportType;
741
+ }
742
+ /**
743
+ * Get memory ID (for memory transport)
744
+ */
745
+ getMemoryId() {
746
+ return this.memoryId;
747
+ }
748
+ /**
749
+ * Get server connection info
750
+ */
751
+ getConnectionInfo() {
752
+ return {
753
+ isRunning: this.isRunning,
754
+ transportType: this.transportType,
755
+ memoryId: this.memoryId,
756
+ };
757
+ }
758
+ /**
759
+ * Add event listener
760
+ */
761
+ addEventListener(listener) {
762
+ this.eventListeners.add(listener);
763
+ }
764
+ /**
765
+ * Remove event listener
766
+ */
767
+ removeEventListener(listener) {
768
+ return this.eventListeners.delete(listener);
769
+ }
770
+ /**
771
+ * Emit event to all listeners
772
+ */
773
+ emit(event) {
774
+ this.eventListeners.forEach((listener) => {
775
+ try {
776
+ listener(event);
777
+ }
778
+ catch (error) {
779
+ console.error("[AGKitMCPServer] Error in event listener:", error);
780
+ }
781
+ });
782
+ }
783
+ /**
784
+ * Update server configuration
785
+ */
786
+ updateConfig(newConfig) {
787
+ this.config = { ...this.config, ...newConfig };
788
+ }
789
+ /**
790
+ * Get current configuration
791
+ */
792
+ getConfig() {
793
+ return { ...this.config };
794
+ }
795
+ /**
796
+ * Clear all registered tools
797
+ */
798
+ clearTools() {
799
+ this.tools.clear();
800
+ this.toolConfigs.clear();
801
+ if (this.config.enableLogging) {
802
+ console.log(`[AGKitMCPServer] Cleared all tools`);
803
+ }
804
+ }
805
+ }
806
+ exports.AGKitMCPServer = AGKitMCPServer;
807
+ /**
808
+ * Utility function to create and start an AG-Kit MCP server
809
+ */
810
+ async function createAGKitMCPServer(config, tools = []) {
811
+ const server = new AGKitMCPServer(config);
812
+ if (tools.length > 0) {
813
+ server.registerTools(tools);
814
+ }
815
+ return server;
816
+ }
817
+ /**
818
+ * Global memory transport registry instance
819
+ */
820
+ exports.memoryTransportRegistry = MemoryTransportRegistry.getInstance();
821
+ //# sourceMappingURL=agkit-mcp-server.js.map