@kernel.chat/kbot 3.13.1 → 3.14.5
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/README.md +29 -12
- package/dist/consultation.d.ts +117 -0
- package/dist/consultation.d.ts.map +1 -0
- package/dist/consultation.js +388 -0
- package/dist/consultation.js.map +1 -0
- package/dist/packages/kbot/src/tools/mcp-client.d.ts +2 -0
- package/dist/packages/kbot/src/tools/mcp-client.d.ts.map +1 -0
- package/dist/packages/kbot/src/tools/mcp-client.js +132 -0
- package/dist/packages/kbot/src/tools/mcp-client.js.map +1 -0
- package/dist/packages/kbot/src/tools/mcp-discovery.d.ts +2 -0
- package/dist/packages/kbot/src/tools/mcp-discovery.d.ts.map +1 -0
- package/dist/packages/kbot/src/tools/mcp-discovery.js +433 -0
- package/dist/packages/kbot/src/tools/mcp-discovery.js.map +1 -0
- package/dist/packages/kbot/src/tools/memory-harness.d.ts +2 -0
- package/dist/packages/kbot/src/tools/memory-harness.d.ts.map +1 -0
- package/dist/packages/kbot/src/tools/memory-harness.js +542 -0
- package/dist/packages/kbot/src/tools/memory-harness.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
`` `typescript
|
|
2
|
+
export class MCPClient {
|
|
3
|
+
private connectedServers: Map<string, string> = new Map();
|
|
4
|
+
|
|
5
|
+
async discoverServers(): Promise<string[]> {
|
|
6
|
+
// Discover available MCP servers from known registries
|
|
7
|
+
const servers = [
|
|
8
|
+
"cablate/mcp-google-map",
|
|
9
|
+
"jackwener/opencli",
|
|
10
|
+
"vm0-ai/vm0",
|
|
11
|
+
];
|
|
12
|
+
|
|
13
|
+
return servers;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async connect(serverId: string): Promise<boolean> {
|
|
17
|
+
// Connect to an MCP server via stdin/stdout protocol
|
|
18
|
+
if (!this.connectedServers.has(serverId)) {
|
|
19
|
+
this.connectedServers.set(serverId, serverId);
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async invokeTool(serverId: string, toolName: string, args: Record<string, unknown>): Promise<unknown> {
|
|
26
|
+
// MCP protocol: send tool call, receive response
|
|
27
|
+
const protocol: Record<string, unknown> = {
|
|
28
|
+
jsonrpc: "2.0",
|
|
29
|
+
id: Date.now(),
|
|
30
|
+
method: "tools/call",
|
|
31
|
+
params: {
|
|
32
|
+
name: toolName,
|
|
33
|
+
arguments: args,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
// Serialize and send over MCP channel
|
|
38
|
+
const message = JSON.stringify(protocol);
|
|
39
|
+
|
|
40
|
+
// Receive response (simplified - real MCP uses bidirectional streams)
|
|
41
|
+
return this.handleMCPResponse(serverId, message, protocol.id);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async handleMCPResponse(serverId: string, message: string, requestId: number): Promise<unknown> {
|
|
45
|
+
// In real implementation, this would parse MCP server responses
|
|
46
|
+
// For now, we simulate tool execution
|
|
47
|
+
const response: Record<string, unknown> = {
|
|
48
|
+
jsonrpc: "2.0",
|
|
49
|
+
id: requestId,
|
|
50
|
+
result: this.simulateToolExecution(message, serverId),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
return response;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
simulateToolExecution(message: string, serverId: string): unknown {
|
|
57
|
+
// Simulate tool execution based on server capabilities
|
|
58
|
+
// This would be replaced with actual MCP protocol implementation
|
|
59
|
+
|
|
60
|
+
if (serverId.includes("google-map")) {
|
|
61
|
+
// Simulate Maps tool
|
|
62
|
+
return {
|
|
63
|
+
success: true,
|
|
64
|
+
data: {
|
|
65
|
+
location: "Unknown",
|
|
66
|
+
distance: "N/A",
|
|
67
|
+
duration: "N/A",
|
|
68
|
+
note: "Actual Google Maps API integration requires proper MCP server"
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
} else if (serverId.includes("opencli")) {
|
|
72
|
+
// Simulate CLI tool
|
|
73
|
+
return {
|
|
74
|
+
success: true,
|
|
75
|
+
data: {
|
|
76
|
+
output: "Tool executed successfully",
|
|
77
|
+
note: "Full CLI transformation requires proper MCP integration"
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
} else if (serverId.includes("vm0")) {
|
|
81
|
+
// Simulate workflow tool
|
|
82
|
+
return {
|
|
83
|
+
success: true,
|
|
84
|
+
data: {
|
|
85
|
+
workflow: "executed",
|
|
86
|
+
result: {
|
|
87
|
+
status: "pending",
|
|
88
|
+
note: "Natural language workflow execution requires MCP workflow support"
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return {
|
|
95
|
+
success: false,
|
|
96
|
+
error: "Unknown MCP server or tool",
|
|
97
|
+
note: "Please implement proper MCP protocol handling",
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async listTools(serverId: string): Promise<string[]> {
|
|
102
|
+
// List available tools from an MCP server
|
|
103
|
+
const tools = this.getKnownTools(serverId);
|
|
104
|
+
return tools;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private getKnownTools(serverId: string): string[] {
|
|
108
|
+
// Define available tools per server
|
|
109
|
+
const toolDefinitions: Record<string, string[]> = {
|
|
110
|
+
"cablate/mcp-google-map": ["maps.search", "maps.directions", "maps.route", "maps.distance"],
|
|
111
|
+
"jackwener/opencli": ["cli.execute", "cli.transform", "cli.interpret"],
|
|
112
|
+
"vm0-ai/vm0": ["workflow.run", "workflow.describe", "workflow.parse"],
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
return toolDefinitions[serverId] || [];
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// MCP Tool for agent discovery
|
|
120
|
+
export interface MCPTool {
|
|
121
|
+
name: string;
|
|
122
|
+
description: string;
|
|
123
|
+
inputSchema: Record<string, unknown>;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// MCP Client provider for dependency injection
|
|
127
|
+
export function createMCPClient(): MCPClient {
|
|
128
|
+
return new MCPClient();
|
|
129
|
+
}
|
|
130
|
+
` ``;
|
|
131
|
+
export {};
|
|
132
|
+
//# sourceMappingURL=mcp-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../../../../../src/packages/kbot/src/tools/mcp-client.ts"],"names":[],"mappings":"AAAA,EAAE,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiID,CAAA,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-discovery.d.ts","sourceRoot":"","sources":["../../../../../src/packages/kbot/src/tools/mcp-discovery.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
`` `typescript
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import type { Tool, ToolDefinition } from "@kernel.chat/types";
|
|
4
|
+
import { Logger } from "../logger";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* MCP Server Discovery Tool
|
|
8
|
+
*
|
|
9
|
+
* Scans available MCP servers and builds a unified tool registry
|
|
10
|
+
* that agents can route tool calls through dynamically
|
|
11
|
+
*/
|
|
12
|
+
export class McpDiscoveryTool implements ToolDefinition {
|
|
13
|
+
name = "mcp_discovery";
|
|
14
|
+
description = "Discover available MCP servers and their tools dynamically. Returns a catalog of all registered MCP servers with their capabilities, tools, and connection status.";
|
|
15
|
+
inputSchema = z.object({
|
|
16
|
+
scope: z
|
|
17
|
+
.enum(["all", "installed", "remote", "system"])
|
|
18
|
+
.default("all")
|
|
19
|
+
.describe(`;
|
|
20
|
+
Filter;
|
|
21
|
+
scope;
|
|
22
|
+
for (discovery; ; )
|
|
23
|
+
: ;
|
|
24
|
+
n - all;
|
|
25
|
+
discover;
|
|
26
|
+
all;
|
|
27
|
+
registered;
|
|
28
|
+
servers;
|
|
29
|
+
n - installed;
|
|
30
|
+
only;
|
|
31
|
+
locally;
|
|
32
|
+
installed;
|
|
33
|
+
servers;
|
|
34
|
+
n - remote;
|
|
35
|
+
servers;
|
|
36
|
+
discovered;
|
|
37
|
+
via;
|
|
38
|
+
network;
|
|
39
|
+
propagation;
|
|
40
|
+
n - system;
|
|
41
|
+
only;
|
|
42
|
+
system - integrated;
|
|
43
|
+
servers `),
|
|
44
|
+
domain: z
|
|
45
|
+
.enum(["maps", "api", "web", "all"])
|
|
46
|
+
.default("all")
|
|
47
|
+
.describe(`;
|
|
48
|
+
Filter;
|
|
49
|
+
by;
|
|
50
|
+
domain: ;
|
|
51
|
+
n - maps;
|
|
52
|
+
Google;
|
|
53
|
+
Maps, routing, geolocation;
|
|
54
|
+
servers;
|
|
55
|
+
n - api;
|
|
56
|
+
web - to - API;
|
|
57
|
+
servers;
|
|
58
|
+
like;
|
|
59
|
+
apitap;
|
|
60
|
+
n - web;
|
|
61
|
+
general;
|
|
62
|
+
web;
|
|
63
|
+
interaction;
|
|
64
|
+
servers;
|
|
65
|
+
n - all;
|
|
66
|
+
no;
|
|
67
|
+
domain;
|
|
68
|
+
filtering `),
|
|
69
|
+
includeMetadata: z
|
|
70
|
+
.boolean()
|
|
71
|
+
.default(true)
|
|
72
|
+
.describe("Include detailed metadata about each server (capabilities, versions, trust scores)"),
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
private logger = new Logger(this.name);
|
|
76
|
+
|
|
77
|
+
async execute(args: z.infer<typeof this.inputSchema>) {
|
|
78
|
+
this.logger.debug(`;
|
|
79
|
+
Starting;
|
|
80
|
+
MCP;
|
|
81
|
+
discovery;
|
|
82
|
+
with (scope = $) {
|
|
83
|
+
args.scope;
|
|
84
|
+
}
|
|
85
|
+
domain = $;
|
|
86
|
+
{
|
|
87
|
+
args.domain;
|
|
88
|
+
}
|
|
89
|
+
`);
|
|
90
|
+
|
|
91
|
+
// Gather all MCP servers from registered managers
|
|
92
|
+
const allServers = await this.discoverServers(args.scope, args.domain, args.includeMetadata);
|
|
93
|
+
|
|
94
|
+
// Build a unified tool registry with routing information
|
|
95
|
+
const toolRegistry = await this.buildRegistry(allServers);
|
|
96
|
+
|
|
97
|
+
// Format response based on scope
|
|
98
|
+
const response = this.formatResponse(toolRegistry, args.scope);
|
|
99
|
+
|
|
100
|
+
this.logger.info(`;
|
|
101
|
+
Discovery;
|
|
102
|
+
complete: $;
|
|
103
|
+
{
|
|
104
|
+
response.totalServers;
|
|
105
|
+
}
|
|
106
|
+
servers, $;
|
|
107
|
+
{
|
|
108
|
+
response.totalTools;
|
|
109
|
+
}
|
|
110
|
+
tools;
|
|
111
|
+
available `);
|
|
112
|
+
|
|
113
|
+
return {
|
|
114
|
+
status: "success",
|
|
115
|
+
timestamp: new ISODateString(),
|
|
116
|
+
data: response,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private async discoverServers(
|
|
121
|
+
scope: string,
|
|
122
|
+
domain: string,
|
|
123
|
+
includeMetadata: boolean
|
|
124
|
+
): Promise<McpServer[]> {
|
|
125
|
+
const discovered: McpServer[] = [];
|
|
126
|
+
|
|
127
|
+
// Registry of MCP server managers
|
|
128
|
+
const mcpManagers = this.getMcpManagers();
|
|
129
|
+
|
|
130
|
+
for (const manager of mcpManagers) {
|
|
131
|
+
if (scope !== "all" && !manager.matchesScope(scope)) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Register the manager's servers
|
|
136
|
+
const registered = await manager.discover();
|
|
137
|
+
for (const server of registered) {
|
|
138
|
+
// Filter by domain if requested
|
|
139
|
+
if (domain !== "all" && !server.matchesDomain(domain)) {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const serverData = includeMetadata
|
|
144
|
+
? { ...server, metadata: await this.enrichMetadata(server) }
|
|
145
|
+
: server;
|
|
146
|
+
|
|
147
|
+
discovered.push(serverData);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Propagate discovery if remote scope
|
|
151
|
+
if (scope === "remote" && manager.propagates) {
|
|
152
|
+
await this.propagateDiscovery(manager, discovered);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return discovered;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
private getMcpManagers(): McpManager[] {
|
|
160
|
+
return [
|
|
161
|
+
new ApitapManager(),
|
|
162
|
+
new MapManager(),
|
|
163
|
+
new FileSystemMcpManager(),
|
|
164
|
+
new DatabaseMcpManager(),
|
|
165
|
+
];
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
private async enrichMetadata(server: McpServer): Promise<ServerMetadata> {
|
|
169
|
+
const trustScore = await this.assessTrust(server);
|
|
170
|
+
return {
|
|
171
|
+
trustScore,
|
|
172
|
+
discoveryTimestamp: new ISODateString(),
|
|
173
|
+
knownTools: server.tools.length,
|
|
174
|
+
capabilities: server.capabilities,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private async assessTrust(server: McpServer): Promise<number> {
|
|
179
|
+
// Simple trust scoring based on available signals
|
|
180
|
+
let score = 50; // Base score
|
|
181
|
+
|
|
182
|
+
// Server-specific signals
|
|
183
|
+
if (server.source === "official") score += 20;
|
|
184
|
+
if (server.version && semver.valid(server.version)) score += 10;
|
|
185
|
+
if (server.testedIn) score += 15;
|
|
186
|
+
|
|
187
|
+
// Community signals (would query github, npm, etc. in production)
|
|
188
|
+
if (server.repository && server.repository.stars) {
|
|
189
|
+
score = Math.min(100, score + server.repository.stars / 100);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Cap trust score
|
|
193
|
+
return Math.max(0, Math.min(100, score));
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
private async propagateDiscovery(manager: McpManager, discovered: McpServer[]): Promise<void> {
|
|
197
|
+
if (!manager.propagates) return;
|
|
198
|
+
|
|
199
|
+
// In production, this would propagate via MCP discovery protocol
|
|
200
|
+
// For now, simulate by checking for cross-server dependencies
|
|
201
|
+
for (const server of discovered) {
|
|
202
|
+
if (server.requiresServer && !discovered.find(s => s.name === server.requiresServer)) {
|
|
203
|
+
await this.discoverServers("all", "all", false); // Recursive discovery
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
private async buildRegistry(servers: McpServer[]): Promise<ToolRegistry> {
|
|
209
|
+
const registry: ToolRegistry = {
|
|
210
|
+
servers: new Map(),
|
|
211
|
+
tools: new Map(),
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
for (const server of servers) {
|
|
215
|
+
registry.servers.set(server.name, {
|
|
216
|
+
...server,
|
|
217
|
+
toolHandlers: new Map<string, McpToolHandler>(),
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
for (const tool of server.tools) {
|
|
221
|
+
const handler = new McpToolHandler(server, tool);
|
|
222
|
+
registry.tools.set(`;
|
|
223
|
+
$;
|
|
224
|
+
{
|
|
225
|
+
server.name;
|
|
226
|
+
}
|
|
227
|
+
$;
|
|
228
|
+
{
|
|
229
|
+
tool.name;
|
|
230
|
+
}
|
|
231
|
+
`, handler);
|
|
232
|
+
registry.servers.get(server.name)?.tools.push(tool);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return registry;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
private formatResponse(registry: ToolRegistry, scope: string): DiscoveryResult {
|
|
240
|
+
const filteredServers = [...registry.servers.values()].filter(
|
|
241
|
+
server => {
|
|
242
|
+
if (scope === "installed") return server.local;
|
|
243
|
+
if (scope === "remote") return !server.local;
|
|
244
|
+
if (scope === "system") return server.systemIntegrated;
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
return {
|
|
250
|
+
totalServers: filteredServers.length,
|
|
251
|
+
totalTools: filteredServers.reduce((sum, s) => sum + s.tools.length, 0),
|
|
252
|
+
servers: filteredServers.map(s => ({
|
|
253
|
+
name: s.name,
|
|
254
|
+
description: s.description.substring(0, 200),
|
|
255
|
+
version: s.version,
|
|
256
|
+
tools: s.tools.map(t => ({
|
|
257
|
+
name: t.name,
|
|
258
|
+
description: t.description.substring(0, 300),
|
|
259
|
+
parameters: this.describeParameters(t.inputSchema),
|
|
260
|
+
trustScore: s.metadata?.trustScore ?? "unknown",
|
|
261
|
+
})),
|
|
262
|
+
capabilities: s.metadata?.capabilities ?? { tools: true, resources: false, prompts: false },
|
|
263
|
+
})),
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
private describeParameters(schema: z.ZodSchema): string {
|
|
268
|
+
const required = schema.shape
|
|
269
|
+
.filter(prop => prop.description?.includes("required") || prop.required)
|
|
270
|
+
.map(prop => prop.key)
|
|
271
|
+
.join(", ");
|
|
272
|
+
|
|
273
|
+
const optional = [];
|
|
274
|
+
|
|
275
|
+
return `;
|
|
276
|
+
Required: $;
|
|
277
|
+
{
|
|
278
|
+
required || "none";
|
|
279
|
+
}
|
|
280
|
+
;
|
|
281
|
+
Optional: $;
|
|
282
|
+
{
|
|
283
|
+
optional.length > 0 ? optional.join(", ") : "none";
|
|
284
|
+
}
|
|
285
|
+
`;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* MCP Tool Handler - Routes tool calls to specific MCP servers
|
|
291
|
+
*/
|
|
292
|
+
export class McpToolHandler {
|
|
293
|
+
serverName: string;
|
|
294
|
+
toolName: string;
|
|
295
|
+
inputSchema: z.ZodSchema;
|
|
296
|
+
private logger = new Logger(`;
|
|
297
|
+
mcp: $;
|
|
298
|
+
{
|
|
299
|
+
this.serverName;
|
|
300
|
+
}
|
|
301
|
+
$;
|
|
302
|
+
{
|
|
303
|
+
this.toolName;
|
|
304
|
+
}
|
|
305
|
+
`);
|
|
306
|
+
|
|
307
|
+
constructor(server: McpServer, tool: McpServer["tools"][number]) {
|
|
308
|
+
this.serverName = server.name;
|
|
309
|
+
this.toolName = tool.name;
|
|
310
|
+
this.inputSchema = tool.inputSchema;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
async execute(args: z.infer<typeof this.inputSchema>): Promise<ToolResult> {
|
|
314
|
+
this.logger.debug(`;
|
|
315
|
+
Executing;
|
|
316
|
+
tool: $;
|
|
317
|
+
{
|
|
318
|
+
this.toolName;
|
|
319
|
+
}
|
|
320
|
+
from;
|
|
321
|
+
server;
|
|
322
|
+
$;
|
|
323
|
+
{
|
|
324
|
+
this.serverName;
|
|
325
|
+
}
|
|
326
|
+
`);
|
|
327
|
+
|
|
328
|
+
// Validate arguments
|
|
329
|
+
const validated = this.inputSchema.safeParse(args);
|
|
330
|
+
if (!validated.success) {
|
|
331
|
+
return {
|
|
332
|
+
status: "error",
|
|
333
|
+
error: "Invalid arguments",
|
|
334
|
+
details: validated.error.errors.map(err => ({
|
|
335
|
+
field: err.path.join("."),
|
|
336
|
+
message: err.message,
|
|
337
|
+
})),
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// Route to the appropriate MCP server implementation
|
|
342
|
+
// In production, this would use the MCP protocol to send calls to the server process
|
|
343
|
+
const result = await this.delegateToServer(validated.data);
|
|
344
|
+
|
|
345
|
+
return {
|
|
346
|
+
status: "success",
|
|
347
|
+
server: this.serverName,
|
|
348
|
+
tool: this.toolName,
|
|
349
|
+
result: result,
|
|
350
|
+
timestamp: new ISODateString(),
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
private async delegateToServer(args: z.infer<typeof this.inputSchema>): Promise<unknown> {
|
|
355
|
+
// Server-specific delegation logic
|
|
356
|
+
if (this.serverName === "apitap") {
|
|
357
|
+
return await this.apitapDelegate(args);
|
|
358
|
+
} else if (this.serverName === "google-maps") {
|
|
359
|
+
return await this.googleMapsDelegate(args);
|
|
360
|
+
} else {
|
|
361
|
+
// Default handler - would use MCP protocol
|
|
362
|
+
return await this.defaultDelegate(args);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
private async apitapDelegate(args: any): Promise<any> {
|
|
367
|
+
// Integration with apitap MCP server
|
|
368
|
+
// Transform web queries into API calls
|
|
369
|
+
const url = this.extractUrl(args);
|
|
370
|
+
return { apiCall: url, response: "Simulated API response" };
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
private async googleMapsDelegate(args: any): Promise<any> {
|
|
374
|
+
// Integration with Google Maps MCP server
|
|
375
|
+
const { query, location } = args;
|
|
376
|
+
return { geocode: { query, location } };
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
private async defaultDelegate(args: any): Promise<any> {
|
|
380
|
+
// Generic MCP protocol handler
|
|
381
|
+
return {
|
|
382
|
+
protocol: "MCP",
|
|
383
|
+
server: this.serverName,
|
|
384
|
+
tool: this.toolName,
|
|
385
|
+
args,
|
|
386
|
+
result: "Processed by generic MCP handler",
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
private extractUrl(args: any): string {
|
|
391
|
+
// Extract URL from various possible argument formats
|
|
392
|
+
const urlFields = ["url", "web_url", "target", "destination"];
|
|
393
|
+
for (const field of urlFields) {
|
|
394
|
+
if (args[field]) {
|
|
395
|
+
return String(args[field]);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
return "";
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* MCP Server Manager - Base class for discovering MCP servers
|
|
404
|
+
*/
|
|
405
|
+
class McpManager {
|
|
406
|
+
name: string;
|
|
407
|
+
local: boolean = true;
|
|
408
|
+
systemIntegrated: boolean = false;
|
|
409
|
+
propagates: boolean = false;
|
|
410
|
+
|
|
411
|
+
abstract discover(): Promise<McpServer[]>;
|
|
412
|
+
abstract matchesScope(scope: string): boolean;
|
|
413
|
+
abstract matchesDomain(domain: string): boolean;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* Apitap Manager - MCP server that turns websites into APIs
|
|
418
|
+
*/
|
|
419
|
+
class ApitapManager extends McpManager {
|
|
420
|
+
name = "apitap";
|
|
421
|
+
matchesScope(scope: string): boolean {
|
|
422
|
+
if (scope === "api") return true;
|
|
423
|
+
if (scope === "all") return true;
|
|
424
|
+
return false;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
matchesDomain(domain: string): boolean {
|
|
428
|
+
return domain === "api" || domain === "web" || domain === "all";
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
async discover(): Promise<McpServer[]> {;
|
|
432
|
+
export {};
|
|
433
|
+
//# sourceMappingURL=mcp-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-discovery.js","sourceRoot":"","sources":["../../../../../src/packages/kbot/src/tools/mcp-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-harness.d.ts","sourceRoot":"","sources":["../../../../../src/packages/kbot/src/tools/memory-harness.ts"],"names":[],"mappings":""}
|