@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.
- package/CHANGELOG.md +416 -0
- package/dist/agent_tool.d.ts +7 -0
- package/dist/agent_tool.d.ts.map +1 -0
- package/dist/agent_tool.js +16 -0
- package/dist/agent_tool.js.map +1 -0
- package/dist/bash/bash-tool.d.ts +61 -0
- package/dist/bash/bash-tool.d.ts.map +1 -0
- package/dist/bash/bash-tool.js +191 -0
- package/dist/bash/bash-tool.js.map +1 -0
- package/dist/bash/index.d.ts +7 -0
- package/dist/bash/index.d.ts.map +1 -0
- package/dist/bash/index.js +17 -0
- package/dist/bash/index.js.map +1 -0
- package/dist/bash/operator/base-operator.d.ts +44 -0
- package/dist/bash/operator/base-operator.d.ts.map +1 -0
- package/dist/bash/operator/base-operator.js +14 -0
- package/dist/bash/operator/base-operator.js.map +1 -0
- package/dist/bash/operator/local-operator.d.ts +15 -0
- package/dist/bash/operator/local-operator.d.ts.map +1 -0
- package/dist/bash/operator/local-operator.js +145 -0
- package/dist/bash/operator/local-operator.js.map +1 -0
- package/dist/bash/operator/sandbox-operator.d.ts +22 -0
- package/dist/bash/operator/sandbox-operator.d.ts.map +1 -0
- package/dist/bash/operator/sandbox-operator.js +112 -0
- package/dist/bash/operator/sandbox-operator.js.map +1 -0
- package/dist/bash/utils.d.ts +106 -0
- package/dist/bash/utils.d.ts.map +1 -0
- package/dist/bash/utils.js +197 -0
- package/dist/bash/utils.js.map +1 -0
- package/dist/browser/browser-instance-manager.d.ts +79 -0
- package/dist/browser/browser-instance-manager.d.ts.map +1 -0
- package/dist/browser/browser-instance-manager.js +242 -0
- package/dist/browser/browser-instance-manager.js.map +1 -0
- package/dist/browser/browser-tool-executor.d.ts +57 -0
- package/dist/browser/browser-tool-executor.d.ts.map +1 -0
- package/dist/browser/browser-tool-executor.js +205 -0
- package/dist/browser/browser-tool-executor.js.map +1 -0
- package/dist/browser/browser_client_unified.d.ts +52 -0
- package/dist/browser/browser_client_unified.d.ts.map +1 -0
- package/dist/browser/browser_client_unified.js +381 -0
- package/dist/browser/browser_client_unified.js.map +1 -0
- package/dist/browser/browser_tool_unified.d.ts +93 -0
- package/dist/browser/browser_tool_unified.d.ts.map +1 -0
- package/dist/browser/browser_tool_unified.js +181 -0
- package/dist/browser/browser_tool_unified.js.map +1 -0
- package/dist/browser/index.d.ts +7 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +19 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/sandbox-connector.d.ts +93 -0
- package/dist/browser/sandbox-connector.d.ts.map +1 -0
- package/dist/browser/sandbox-connector.js +272 -0
- package/dist/browser/sandbox-connector.js.map +1 -0
- package/dist/browser/types.d.ts +53 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +3 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/code_executers/base_code_executor.d.ts +17 -0
- package/dist/code_executers/base_code_executor.d.ts.map +1 -0
- package/dist/code_executers/base_code_executor.js +20 -0
- package/dist/code_executers/base_code_executor.js.map +1 -0
- package/dist/code_executers/built_in_code_executor.d.ts +25 -0
- package/dist/code_executers/built_in_code_executor.d.ts.map +1 -0
- package/dist/code_executers/built_in_code_executor.js +106 -0
- package/dist/code_executers/built_in_code_executor.js.map +1 -0
- package/dist/code_executers/unsafe_local_code_executor.d.ts +118 -0
- package/dist/code_executers/unsafe_local_code_executor.d.ts.map +1 -0
- package/dist/code_executers/unsafe_local_code_executor.js +605 -0
- package/dist/code_executers/unsafe_local_code_executor.js.map +1 -0
- package/dist/fs/edit-tool.d.ts +26 -0
- package/dist/fs/edit-tool.d.ts.map +1 -0
- package/dist/fs/edit-tool.js +202 -0
- package/dist/fs/edit-tool.js.map +1 -0
- package/dist/fs/glob-tool.d.ts +31 -0
- package/dist/fs/glob-tool.d.ts.map +1 -0
- package/dist/fs/glob-tool.js +287 -0
- package/dist/fs/glob-tool.js.map +1 -0
- package/dist/fs/grep-tool.d.ts +32 -0
- package/dist/fs/grep-tool.d.ts.map +1 -0
- package/dist/fs/grep-tool.js +353 -0
- package/dist/fs/grep-tool.js.map +1 -0
- package/dist/fs/index.d.ts +11 -0
- package/dist/fs/index.d.ts.map +1 -0
- package/dist/fs/index.js +38 -0
- package/dist/fs/index.js.map +1 -0
- package/dist/fs/ls-tool.d.ts +26 -0
- package/dist/fs/ls-tool.d.ts.map +1 -0
- package/dist/fs/ls-tool.js +235 -0
- package/dist/fs/ls-tool.js.map +1 -0
- package/dist/fs/multiedit-tool.d.ts +34 -0
- package/dist/fs/multiedit-tool.d.ts.map +1 -0
- package/dist/fs/multiedit-tool.js +158 -0
- package/dist/fs/multiedit-tool.js.map +1 -0
- package/dist/fs/operator/base-operator.d.ts +28 -0
- package/dist/fs/operator/base-operator.d.ts.map +1 -0
- package/dist/fs/operator/base-operator.js +21 -0
- package/dist/fs/operator/base-operator.js.map +1 -0
- package/dist/fs/operator/in-memory-operator.d.ts +39 -0
- package/dist/fs/operator/in-memory-operator.d.ts.map +1 -0
- package/dist/fs/operator/in-memory-operator.js +115 -0
- package/dist/fs/operator/in-memory-operator.js.map +1 -0
- package/dist/fs/operator/index.d.ts +6 -0
- package/dist/fs/operator/index.d.ts.map +1 -0
- package/dist/fs/operator/index.js +28 -0
- package/dist/fs/operator/index.js.map +1 -0
- package/dist/fs/operator/local-operator.d.ts +25 -0
- package/dist/fs/operator/local-operator.d.ts.map +1 -0
- package/dist/fs/operator/local-operator.js +62 -0
- package/dist/fs/operator/local-operator.js.map +1 -0
- package/dist/fs/operator/sanbox-operator.d.ts +31 -0
- package/dist/fs/operator/sanbox-operator.d.ts.map +1 -0
- package/dist/fs/operator/sanbox-operator.js +172 -0
- package/dist/fs/operator/sanbox-operator.js.map +1 -0
- package/dist/fs/operator/transaction/index.d.ts +6 -0
- package/dist/fs/operator/transaction/index.d.ts.map +1 -0
- package/dist/fs/operator/transaction/index.js +28 -0
- package/dist/fs/operator/transaction/index.js.map +1 -0
- package/dist/fs/operator/transaction/snapshot-strategies.d.ts +54 -0
- package/dist/fs/operator/transaction/snapshot-strategies.d.ts.map +1 -0
- package/dist/fs/operator/transaction/snapshot-strategies.js +278 -0
- package/dist/fs/operator/transaction/snapshot-strategies.js.map +1 -0
- package/dist/fs/operator/transaction/transaction-operator.d.ts +53 -0
- package/dist/fs/operator/transaction/transaction-operator.d.ts.map +1 -0
- package/dist/fs/operator/transaction/transaction-operator.js +195 -0
- package/dist/fs/operator/transaction/transaction-operator.js.map +1 -0
- package/dist/fs/operator/transaction/transaction-utils.d.ts +80 -0
- package/dist/fs/operator/transaction/transaction-utils.d.ts.map +1 -0
- package/dist/fs/operator/transaction/transaction-utils.js +156 -0
- package/dist/fs/operator/transaction/transaction-utils.js.map +1 -0
- package/dist/fs/read-tool.d.ts +32 -0
- package/dist/fs/read-tool.d.ts.map +1 -0
- package/dist/fs/read-tool.js +271 -0
- package/dist/fs/read-tool.js.map +1 -0
- package/dist/fs/str-replace-editor.d.ts +23 -0
- package/dist/fs/str-replace-editor.d.ts.map +1 -0
- package/dist/fs/str-replace-editor.js +74 -0
- package/dist/fs/str-replace-editor.js.map +1 -0
- package/dist/fs/toolkit.d.ts +61 -0
- package/dist/fs/toolkit.d.ts.map +1 -0
- package/dist/fs/toolkit.js +113 -0
- package/dist/fs/toolkit.js.map +1 -0
- package/dist/fs/utils.d.ts +32 -0
- package/dist/fs/utils.d.ts.map +1 -0
- package/dist/fs/utils.js +133 -0
- package/dist/fs/utils.js.map +1 -0
- package/dist/fs/write-tool.d.ts +26 -0
- package/dist/fs/write-tool.d.ts.map +1 -0
- package/dist/fs/write-tool.js +110 -0
- package/dist/fs/write-tool.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/agkit-mcp-server.d.ts +291 -0
- package/dist/mcp/agkit-mcp-server.d.ts.map +1 -0
- package/dist/mcp/agkit-mcp-server.js +821 -0
- package/dist/mcp/agkit-mcp-server.js.map +1 -0
- package/dist/mcp/client-tool.d.ts +65 -0
- package/dist/mcp/client-tool.d.ts.map +1 -0
- package/dist/mcp/client-tool.js +220 -0
- package/dist/mcp/client-tool.js.map +1 -0
- package/dist/mcp/index.d.ts +14 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +26 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/mcp-client-manager.d.ts +153 -0
- package/dist/mcp/mcp-client-manager.d.ts.map +1 -0
- package/dist/mcp/mcp-client-manager.js +606 -0
- package/dist/mcp/mcp-client-manager.js.map +1 -0
- package/dist/mcp/mcp-toolkit.d.ts +112 -0
- package/dist/mcp/mcp-toolkit.d.ts.map +1 -0
- package/dist/mcp/mcp-toolkit.js +188 -0
- package/dist/mcp/mcp-toolkit.js.map +1 -0
- package/dist/mcp/types.d.ts +157 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +34 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/mcp/utils.d.ts +17 -0
- package/dist/mcp/utils.d.ts.map +1 -0
- package/dist/mcp/utils.js +48 -0
- package/dist/mcp/utils.js.map +1 -0
- package/dist/types/index.d.ts +31 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/zod.d.ts +18 -0
- package/dist/types/zod.d.ts.map +1 -0
- package/dist/types/zod.js +3 -0
- package/dist/types/zod.js.map +1 -0
- package/dist/utils.d.ts +141 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +379 -0
- package/dist/utils.js.map +1 -0
- 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
|