@agentkey/mcp 0.0.4 → 0.0.6
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/dist/dynamic.d.ts +57 -0
- package/dist/dynamic.js +231 -0
- package/dist/dynamic.js.map +1 -0
- package/dist/index.js +725 -286
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic tool loader with hot-reload for AgentKey MCP Server.
|
|
3
|
+
*
|
|
4
|
+
* - Fetches tool definitions from /v1/tools at startup
|
|
5
|
+
* - Polls periodically for changes and hot-reloads (add/remove/update tools)
|
|
6
|
+
* - Uses MCP SDK's RegisteredTool.remove()/update() + sendToolListChanged()
|
|
7
|
+
*/
|
|
8
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
9
|
+
export interface ToolParam {
|
|
10
|
+
name: string;
|
|
11
|
+
type: "string" | "number" | "boolean" | "array";
|
|
12
|
+
description: string;
|
|
13
|
+
required?: boolean;
|
|
14
|
+
enum?: string[];
|
|
15
|
+
default?: unknown;
|
|
16
|
+
min?: number;
|
|
17
|
+
max?: number;
|
|
18
|
+
item_type?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ToolDefinition {
|
|
21
|
+
name: string;
|
|
22
|
+
description: string;
|
|
23
|
+
endpoint: string;
|
|
24
|
+
params: ToolParam[];
|
|
25
|
+
}
|
|
26
|
+
export interface ToolRegistry {
|
|
27
|
+
version: string;
|
|
28
|
+
server_info: string;
|
|
29
|
+
tools: ToolDefinition[];
|
|
30
|
+
}
|
|
31
|
+
type CallAPIFn = (path: string, body: Record<string, unknown>) => Promise<{
|
|
32
|
+
ok: boolean;
|
|
33
|
+
status: number;
|
|
34
|
+
data: Record<string, unknown>;
|
|
35
|
+
}>;
|
|
36
|
+
export declare function fetchToolRegistry(baseUrl: string): Promise<ToolRegistry | null>;
|
|
37
|
+
export declare class DynamicToolManager {
|
|
38
|
+
private server;
|
|
39
|
+
private callAPI;
|
|
40
|
+
private baseUrl;
|
|
41
|
+
private pollInterval;
|
|
42
|
+
private pollTimer;
|
|
43
|
+
private registered;
|
|
44
|
+
constructor(server: McpServer, callAPI: CallAPIFn, baseUrl: string, pollIntervalMs?: number);
|
|
45
|
+
/** Initial load — register all tools from registry. */
|
|
46
|
+
registerAll(registry: ToolRegistry): number;
|
|
47
|
+
/** Start polling for changes. */
|
|
48
|
+
startPolling(): void;
|
|
49
|
+
/** Stop polling. */
|
|
50
|
+
stopPolling(): void;
|
|
51
|
+
/** Poll /v1/tools and apply changes. */
|
|
52
|
+
private poll;
|
|
53
|
+
/** Register a single tool and track it. */
|
|
54
|
+
private registerTool;
|
|
55
|
+
}
|
|
56
|
+
export declare function registerDynamicTools(server: McpServer, registry: ToolRegistry, callAPI: CallAPIFn): number;
|
|
57
|
+
export {};
|
package/dist/dynamic.js
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Dynamic tool loader with hot-reload for AgentKey MCP Server.
|
|
4
|
+
*
|
|
5
|
+
* - Fetches tool definitions from /v1/tools at startup
|
|
6
|
+
* - Polls periodically for changes and hot-reloads (add/remove/update tools)
|
|
7
|
+
* - Uses MCP SDK's RegisteredTool.remove()/update() + sendToolListChanged()
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.DynamicToolManager = void 0;
|
|
11
|
+
exports.fetchToolRegistry = fetchToolRegistry;
|
|
12
|
+
exports.registerDynamicTools = registerDynamicTools;
|
|
13
|
+
const zod_1 = require("zod");
|
|
14
|
+
// --- Zod schema builder ---
|
|
15
|
+
function buildParamSchema(param) {
|
|
16
|
+
let schema;
|
|
17
|
+
switch (param.type) {
|
|
18
|
+
case "number": {
|
|
19
|
+
let num = zod_1.z.coerce.number();
|
|
20
|
+
if (param.min !== undefined)
|
|
21
|
+
num = num.min(param.min);
|
|
22
|
+
if (param.max !== undefined)
|
|
23
|
+
num = num.max(param.max);
|
|
24
|
+
schema = num;
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
case "boolean":
|
|
28
|
+
schema = zod_1.z.boolean();
|
|
29
|
+
break;
|
|
30
|
+
case "array":
|
|
31
|
+
schema = zod_1.z.array(zod_1.z.string());
|
|
32
|
+
break;
|
|
33
|
+
case "string":
|
|
34
|
+
default:
|
|
35
|
+
if (param.enum && param.enum.length > 0) {
|
|
36
|
+
schema = zod_1.z.enum(param.enum);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
schema = zod_1.z.string();
|
|
40
|
+
}
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
if (!param.required) {
|
|
44
|
+
schema = schema.optional();
|
|
45
|
+
}
|
|
46
|
+
return schema.describe(param.description);
|
|
47
|
+
}
|
|
48
|
+
function buildToolSchema(params) {
|
|
49
|
+
const shape = {};
|
|
50
|
+
for (const param of params) {
|
|
51
|
+
shape[param.name] = buildParamSchema(param);
|
|
52
|
+
}
|
|
53
|
+
return shape;
|
|
54
|
+
}
|
|
55
|
+
/** Create the tool handler callback for a given endpoint. */
|
|
56
|
+
function makeToolHandler(endpoint, schema, callAPI) {
|
|
57
|
+
return async (args) => {
|
|
58
|
+
const body = {};
|
|
59
|
+
for (const [key, value] of Object.entries(args)) {
|
|
60
|
+
if (value !== undefined && value !== null) {
|
|
61
|
+
body[key] = value;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if ("provider" in schema && !body.provider) {
|
|
65
|
+
body.provider = "auto";
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
const { ok, data } = await callAPI(endpoint, body);
|
|
69
|
+
if (!ok) {
|
|
70
|
+
return {
|
|
71
|
+
content: [{ type: "text", text: `Failed: ${data.error || JSON.stringify(data)}` }],
|
|
72
|
+
isError: true,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// Compact: strip nulls/empty/zero
|
|
76
|
+
const compact = JSON.parse(JSON.stringify(data, (_, v) => v === null || v === "" || v === 0 || (Array.isArray(v) && v.length === 0) ? undefined : v));
|
|
77
|
+
// Result count hint
|
|
78
|
+
const results = data.results;
|
|
79
|
+
const resultCount = results?.length ?? 0;
|
|
80
|
+
let hint = "";
|
|
81
|
+
if (resultCount > 0) {
|
|
82
|
+
hint = `\n\n[${resultCount} results returned. Analyze these and answer the user. Only make a follow-up call if the results are clearly insufficient.]`;
|
|
83
|
+
}
|
|
84
|
+
else if (results !== undefined) {
|
|
85
|
+
hint = `\n\n[No results. Try broader keywords or different parameters. Do NOT retry the same query.]`;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
hint = `\n\n[Data returned. Present the results to the user.]`;
|
|
89
|
+
}
|
|
90
|
+
// Truncate long content (scrape)
|
|
91
|
+
const content = data.content;
|
|
92
|
+
if (content && content.length > 15000) {
|
|
93
|
+
compact.content =
|
|
94
|
+
content.slice(0, 15000) +
|
|
95
|
+
`\n\n[... truncated at 15000 chars. Total: ${content.length} chars.]`;
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
content: [{ type: "text", text: JSON.stringify(compact) + hint }],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
return {
|
|
103
|
+
content: [{ type: "text", text: `Connection error: ${err}` }],
|
|
104
|
+
isError: true,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/** Fingerprint a tool definition for change detection. */
|
|
110
|
+
function toolFingerprint(tool) {
|
|
111
|
+
return JSON.stringify({
|
|
112
|
+
name: tool.name,
|
|
113
|
+
description: tool.description,
|
|
114
|
+
endpoint: tool.endpoint,
|
|
115
|
+
params: tool.params,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// --- Fetch ---
|
|
119
|
+
async function fetchToolRegistry(baseUrl) {
|
|
120
|
+
try {
|
|
121
|
+
const res = await fetch(`${baseUrl}/v1/tools`);
|
|
122
|
+
if (!res.ok) {
|
|
123
|
+
console.error(`[dynamic] Failed to fetch /v1/tools: HTTP ${res.status}`);
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
return await res.json();
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
console.error(`[dynamic] Cannot reach ${baseUrl}/v1/tools:`, err);
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// --- Dynamic Tool Manager ---
|
|
134
|
+
class DynamicToolManager {
|
|
135
|
+
server;
|
|
136
|
+
callAPI;
|
|
137
|
+
baseUrl;
|
|
138
|
+
pollInterval;
|
|
139
|
+
pollTimer = null;
|
|
140
|
+
// Track registered tools: name → { handle, fingerprint }
|
|
141
|
+
registered = new Map();
|
|
142
|
+
constructor(server, callAPI, baseUrl, pollIntervalMs = 30_000) {
|
|
143
|
+
this.server = server;
|
|
144
|
+
this.callAPI = callAPI;
|
|
145
|
+
this.baseUrl = baseUrl;
|
|
146
|
+
this.pollInterval = pollIntervalMs;
|
|
147
|
+
}
|
|
148
|
+
/** Initial load — register all tools from registry. */
|
|
149
|
+
registerAll(registry) {
|
|
150
|
+
for (const tool of registry.tools) {
|
|
151
|
+
this.registerTool(tool);
|
|
152
|
+
}
|
|
153
|
+
return this.registered.size;
|
|
154
|
+
}
|
|
155
|
+
/** Start polling for changes. */
|
|
156
|
+
startPolling() {
|
|
157
|
+
if (this.pollTimer)
|
|
158
|
+
return;
|
|
159
|
+
this.pollTimer = setInterval(() => this.poll(), this.pollInterval);
|
|
160
|
+
console.error(`[dynamic] Hot-reload polling every ${this.pollInterval / 1000}s`);
|
|
161
|
+
}
|
|
162
|
+
/** Stop polling. */
|
|
163
|
+
stopPolling() {
|
|
164
|
+
if (this.pollTimer) {
|
|
165
|
+
clearInterval(this.pollTimer);
|
|
166
|
+
this.pollTimer = null;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/** Poll /v1/tools and apply changes. */
|
|
170
|
+
async poll() {
|
|
171
|
+
const registry = await fetchToolRegistry(this.baseUrl);
|
|
172
|
+
if (!registry)
|
|
173
|
+
return; // server unreachable, keep existing tools
|
|
174
|
+
const remoteNames = new Set(registry.tools.map((t) => t.name));
|
|
175
|
+
let changed = false;
|
|
176
|
+
// 1. Remove tools that no longer exist on server
|
|
177
|
+
for (const [name, entry] of this.registered) {
|
|
178
|
+
if (!remoteNames.has(name)) {
|
|
179
|
+
entry.handle.remove();
|
|
180
|
+
this.registered.delete(name);
|
|
181
|
+
console.error(`[dynamic] Removed tool: ${name}`);
|
|
182
|
+
changed = true;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// 2. Add or update tools
|
|
186
|
+
for (const tool of registry.tools) {
|
|
187
|
+
const fp = toolFingerprint(tool);
|
|
188
|
+
const existing = this.registered.get(tool.name);
|
|
189
|
+
if (!existing) {
|
|
190
|
+
// New tool
|
|
191
|
+
this.registerTool(tool);
|
|
192
|
+
console.error(`[dynamic] Added tool: ${tool.name}`);
|
|
193
|
+
changed = true;
|
|
194
|
+
}
|
|
195
|
+
else if (existing.fingerprint !== fp) {
|
|
196
|
+
// Changed tool — update description, schema, and handler
|
|
197
|
+
const schema = buildToolSchema(tool.params);
|
|
198
|
+
existing.handle.update({
|
|
199
|
+
description: tool.description,
|
|
200
|
+
paramsSchema: schema,
|
|
201
|
+
callback: makeToolHandler(tool.endpoint, schema, this.callAPI),
|
|
202
|
+
});
|
|
203
|
+
existing.fingerprint = fp;
|
|
204
|
+
console.error(`[dynamic] Updated tool: ${tool.name}`);
|
|
205
|
+
changed = true;
|
|
206
|
+
}
|
|
207
|
+
// else: unchanged, skip
|
|
208
|
+
}
|
|
209
|
+
// 3. Notify client to refresh tool list
|
|
210
|
+
if (changed) {
|
|
211
|
+
this.server.sendToolListChanged();
|
|
212
|
+
console.error(`[dynamic] Tool list changed — notified client`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/** Register a single tool and track it. */
|
|
216
|
+
registerTool(tool) {
|
|
217
|
+
const schema = buildToolSchema(tool.params);
|
|
218
|
+
const handle = this.server.tool(tool.name, tool.description, schema, makeToolHandler(tool.endpoint, schema, this.callAPI));
|
|
219
|
+
this.registered.set(tool.name, {
|
|
220
|
+
handle,
|
|
221
|
+
fingerprint: toolFingerprint(tool),
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
exports.DynamicToolManager = DynamicToolManager;
|
|
226
|
+
// --- Convenience (backwards compat) ---
|
|
227
|
+
function registerDynamicTools(server, registry, callAPI) {
|
|
228
|
+
const mgr = new DynamicToolManager(server, callAPI, "");
|
|
229
|
+
return mgr.registerAll(registry);
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=dynamic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic.js","sourceRoot":"","sources":["../src/dynamic.ts"],"names":[],"mappings":"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"}
|