bhived-mcp 1.1.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/LICENSE +21 -0
- package/README.md +396 -0
- package/dist/agentsMd.d.ts +38 -0
- package/dist/agentsMd.d.ts.map +1 -0
- package/dist/agentsMd.js +392 -0
- package/dist/agentsMd.js.map +1 -0
- package/dist/childMcp/delivery.d.ts +73 -0
- package/dist/childMcp/delivery.d.ts.map +1 -0
- package/dist/childMcp/delivery.js +130 -0
- package/dist/childMcp/delivery.js.map +1 -0
- package/dist/childMcp/manager.d.ts +111 -0
- package/dist/childMcp/manager.d.ts.map +1 -0
- package/dist/childMcp/manager.js +454 -0
- package/dist/childMcp/manager.js.map +1 -0
- package/dist/client/restClient.d.ts +36 -0
- package/dist/client/restClient.d.ts.map +1 -0
- package/dist/client/restClient.js +154 -0
- package/dist/client/restClient.js.map +1 -0
- package/dist/client/types.d.ts +220 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +8 -0
- package/dist/client/types.js.map +1 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +28 -0
- package/dist/config.js.map +1 -0
- package/dist/formatters/inspectFormatter.d.ts +13 -0
- package/dist/formatters/inspectFormatter.d.ts.map +1 -0
- package/dist/formatters/inspectFormatter.js +68 -0
- package/dist/formatters/inspectFormatter.js.map +1 -0
- package/dist/formatters/queryFormatter.d.ts +18 -0
- package/dist/formatters/queryFormatter.d.ts.map +1 -0
- package/dist/formatters/queryFormatter.js +250 -0
- package/dist/formatters/queryFormatter.js.map +1 -0
- package/dist/formatters/writeFormatter.d.ts +16 -0
- package/dist/formatters/writeFormatter.d.ts.map +1 -0
- package/dist/formatters/writeFormatter.js +56 -0
- package/dist/formatters/writeFormatter.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +387 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/learnAndShare.d.ts +8 -0
- package/dist/prompts/learnAndShare.d.ts.map +1 -0
- package/dist/prompts/learnAndShare.js +77 -0
- package/dist/prompts/learnAndShare.js.map +1 -0
- package/dist/prompts/reviewMemory.d.ts +8 -0
- package/dist/prompts/reviewMemory.d.ts.map +1 -0
- package/dist/prompts/reviewMemory.js +61 -0
- package/dist/prompts/reviewMemory.js.map +1 -0
- package/dist/registries/childMcpRegistry.d.ts +65 -0
- package/dist/registries/childMcpRegistry.d.ts.map +1 -0
- package/dist/registries/childMcpRegistry.js +74 -0
- package/dist/registries/childMcpRegistry.js.map +1 -0
- package/dist/registries/index.d.ts +12 -0
- package/dist/registries/index.d.ts.map +1 -0
- package/dist/registries/index.js +9 -0
- package/dist/registries/index.js.map +1 -0
- package/dist/registries/resourceRegistry.d.ts +48 -0
- package/dist/registries/resourceRegistry.d.ts.map +1 -0
- package/dist/registries/resourceRegistry.js +91 -0
- package/dist/registries/resourceRegistry.js.map +1 -0
- package/dist/registries/skillRegistry.d.ts +48 -0
- package/dist/registries/skillRegistry.d.ts.map +1 -0
- package/dist/registries/skillRegistry.js +47 -0
- package/dist/registries/skillRegistry.js.map +1 -0
- package/dist/resources/guide.d.ts +7 -0
- package/dist/resources/guide.d.ts.map +1 -0
- package/dist/resources/guide.js +77 -0
- package/dist/resources/guide.js.map +1 -0
- package/dist/resources/status.d.ts +7 -0
- package/dist/resources/status.d.ts.map +1 -0
- package/dist/resources/status.js +38 -0
- package/dist/resources/status.js.map +1 -0
- package/dist/tools/initiateMcp.d.ts +10 -0
- package/dist/tools/initiateMcp.d.ts.map +1 -0
- package/dist/tools/initiateMcp.js +224 -0
- package/dist/tools/initiateMcp.js.map +1 -0
- package/dist/tools/initiateSkill.d.ts +13 -0
- package/dist/tools/initiateSkill.d.ts.map +1 -0
- package/dist/tools/initiateSkill.js +277 -0
- package/dist/tools/initiateSkill.js.map +1 -0
- package/dist/tools/inspect.d.ts +8 -0
- package/dist/tools/inspect.d.ts.map +1 -0
- package/dist/tools/inspect.js +110 -0
- package/dist/tools/inspect.js.map +1 -0
- package/dist/tools/listActive.d.ts +9 -0
- package/dist/tools/listActive.d.ts.map +1 -0
- package/dist/tools/listActive.js +177 -0
- package/dist/tools/listActive.js.map +1 -0
- package/dist/tools/query.d.ts +15 -0
- package/dist/tools/query.d.ts.map +1 -0
- package/dist/tools/query.js +98 -0
- package/dist/tools/query.js.map +1 -0
- package/dist/tools/readResource.d.ts +9 -0
- package/dist/tools/readResource.d.ts.map +1 -0
- package/dist/tools/readResource.js +110 -0
- package/dist/tools/readResource.js.map +1 -0
- package/dist/tools/runScript.d.ts +17 -0
- package/dist/tools/runScript.d.ts.map +1 -0
- package/dist/tools/runScript.js +320 -0
- package/dist/tools/runScript.js.map +1 -0
- package/dist/tools/stopMcp.d.ts +8 -0
- package/dist/tools/stopMcp.d.ts.map +1 -0
- package/dist/tools/stopMcp.js +91 -0
- package/dist/tools/stopMcp.js.map +1 -0
- package/dist/tools/useTool.d.ts +10 -0
- package/dist/tools/useTool.d.ts.map +1 -0
- package/dist/tools/useTool.js +127 -0
- package/dist/tools/useTool.js.map +1 -0
- package/dist/tools/write.d.ts +9 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +224 -0
- package/dist/tools/write.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hivemind_run_script Tool
|
|
3
|
+
*
|
|
4
|
+
* Executes a script from an activated skill in a sandboxed subprocess.
|
|
5
|
+
* Scripts are admin-curated — agents never upload their own scripts.
|
|
6
|
+
*
|
|
7
|
+
* Runtime detection:
|
|
8
|
+
* .py → python3 (or python on Windows)
|
|
9
|
+
* .js → node
|
|
10
|
+
* .ts → npx tsx
|
|
11
|
+
* .sh → bash (Git Bash on Windows, /bin/bash on Unix)
|
|
12
|
+
*
|
|
13
|
+
* Cross-platform: Windows (Git Bash / WSL), Linux, macOS
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync } from "node:fs";
|
|
16
|
+
import { z } from "zod/v4";
|
|
17
|
+
import { spawn } from "node:child_process";
|
|
18
|
+
import { writeFile, unlink, mkdtemp } from "node:fs/promises";
|
|
19
|
+
import { tmpdir } from "node:os";
|
|
20
|
+
import { join } from "node:path";
|
|
21
|
+
import { skillRegistry } from "../registries/skillRegistry.js";
|
|
22
|
+
import { config } from "../config.js";
|
|
23
|
+
const RunScriptInputSchema = z.object({
|
|
24
|
+
skill: z
|
|
25
|
+
.string()
|
|
26
|
+
.min(1)
|
|
27
|
+
.describe("Name of the activated skill."),
|
|
28
|
+
script: z
|
|
29
|
+
.string()
|
|
30
|
+
.min(1)
|
|
31
|
+
.describe('Script filename (e.g., "analyze.py").'),
|
|
32
|
+
args: z
|
|
33
|
+
.string()
|
|
34
|
+
.optional()
|
|
35
|
+
.describe("Command-line arguments to pass."),
|
|
36
|
+
input_data: z
|
|
37
|
+
.string()
|
|
38
|
+
.optional()
|
|
39
|
+
.describe("Data to pipe to stdin."),
|
|
40
|
+
timeout: z
|
|
41
|
+
.number()
|
|
42
|
+
.int()
|
|
43
|
+
.min(1000)
|
|
44
|
+
.max(120000)
|
|
45
|
+
.default(30000)
|
|
46
|
+
.describe("Execution timeout in milliseconds (default: 30000, max: 120000)."),
|
|
47
|
+
}).strict();
|
|
48
|
+
const RUN_SCRIPT_DESCRIPTION = `Execute a script from an activated skill. The script runs in
|
|
49
|
+
the HiveMind MCP server's process and returns its output. Scripts are
|
|
50
|
+
sandboxed to the skill's context and admin-curated.
|
|
51
|
+
|
|
52
|
+
Example: hivemind_run_script(skill="structured-brainstorm",
|
|
53
|
+
script="analyze.py", args="--input ideas.json")`;
|
|
54
|
+
/** Cached result for Git Bash detection on Windows */
|
|
55
|
+
let _gitBashPath;
|
|
56
|
+
/**
|
|
57
|
+
* Find Git Bash on Windows. Checks common install locations.
|
|
58
|
+
* Returns the full path to bash.exe or null if not found.
|
|
59
|
+
* Result is cached after first call.
|
|
60
|
+
*/
|
|
61
|
+
function findGitBash() {
|
|
62
|
+
if (_gitBashPath !== undefined)
|
|
63
|
+
return _gitBashPath;
|
|
64
|
+
const candidates = [
|
|
65
|
+
`${process.env.ProgramFiles}\\Git\\bin\\bash.exe`,
|
|
66
|
+
"C:\\Program Files\\Git\\bin\\bash.exe",
|
|
67
|
+
"C:\\Program Files (x86)\\Git\\bin\\bash.exe",
|
|
68
|
+
`${process.env.LOCALAPPDATA}\\Programs\\Git\\bin\\bash.exe`,
|
|
69
|
+
].filter(Boolean);
|
|
70
|
+
for (const p of candidates) {
|
|
71
|
+
try {
|
|
72
|
+
if (existsSync(p)) {
|
|
73
|
+
console.error(`[RunScript] Found Git Bash at: ${p}`);
|
|
74
|
+
_gitBashPath = p;
|
|
75
|
+
return _gitBashPath;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Continue checking
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
_gitBashPath = null;
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Detect the appropriate runtime command from the script file extension.
|
|
87
|
+
* Cross-platform: Windows (PowerShell for .ps1, cmd for .bat, Git Bash for .sh),
|
|
88
|
+
* Linux and macOS (native bash for .sh).
|
|
89
|
+
*/
|
|
90
|
+
function detectRuntime(filename) {
|
|
91
|
+
const ext = filename.split(".").pop()?.toLowerCase();
|
|
92
|
+
switch (ext) {
|
|
93
|
+
case "py":
|
|
94
|
+
return {
|
|
95
|
+
command: process.platform === "win32" ? "python" : "python3",
|
|
96
|
+
args: [],
|
|
97
|
+
};
|
|
98
|
+
case "js":
|
|
99
|
+
return { command: "node", args: [] };
|
|
100
|
+
case "ts":
|
|
101
|
+
return { command: "npx", args: ["tsx"] };
|
|
102
|
+
case "ps1":
|
|
103
|
+
// PowerShell — native on Windows, available on Linux/macOS via pwsh
|
|
104
|
+
return {
|
|
105
|
+
command: process.platform === "win32" ? "powershell" : "pwsh",
|
|
106
|
+
args: ["-ExecutionPolicy", "Bypass", "-File"],
|
|
107
|
+
};
|
|
108
|
+
case "bat":
|
|
109
|
+
case "cmd":
|
|
110
|
+
// Windows batch scripts
|
|
111
|
+
if (process.platform !== "win32") {
|
|
112
|
+
return {
|
|
113
|
+
command: "",
|
|
114
|
+
args: [],
|
|
115
|
+
error: `.bat/.cmd scripts can only run on Windows.`,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
return { command: "cmd.exe", args: ["/c"] };
|
|
119
|
+
case "sh": {
|
|
120
|
+
if (process.platform === "win32") {
|
|
121
|
+
// Try Git Bash — most Windows devs have Git installed
|
|
122
|
+
const gitBash = findGitBash();
|
|
123
|
+
if (gitBash) {
|
|
124
|
+
return { command: gitBash, args: [], bashType: "git" };
|
|
125
|
+
}
|
|
126
|
+
// No bash available — clear error
|
|
127
|
+
return {
|
|
128
|
+
command: "",
|
|
129
|
+
args: [],
|
|
130
|
+
error: `.sh scripts require Git for Windows (Git Bash). ` +
|
|
131
|
+
`Install from https://git-scm.com/download/win — ` +
|
|
132
|
+
`or ask the skill author to provide a .ps1 or .bat alternative.`,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
// Linux / macOS — native bash
|
|
136
|
+
return { command: "/bin/bash", args: [], bashType: "native" };
|
|
137
|
+
}
|
|
138
|
+
default:
|
|
139
|
+
return { command: "node", args: [] };
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Convert a Windows file path for use with Git Bash.
|
|
144
|
+
* Git Bash: C:\Users\... → C:/Users/... (just forward slashes)
|
|
145
|
+
* Native (Linux/macOS): no conversion needed
|
|
146
|
+
*/
|
|
147
|
+
function convertPathForBash(filePath, bashType) {
|
|
148
|
+
if (bashType === "native")
|
|
149
|
+
return filePath;
|
|
150
|
+
// Git Bash handles C:/Users/... with forward slashes
|
|
151
|
+
return filePath.replace(/\\/g, "/");
|
|
152
|
+
}
|
|
153
|
+
// ── Tool registration ───────────────────────────────────────────
|
|
154
|
+
export function registerRunScriptTool(server) {
|
|
155
|
+
server.registerTool("hivemind_run_script", {
|
|
156
|
+
title: "Run Skill Script",
|
|
157
|
+
description: RUN_SCRIPT_DESCRIPTION,
|
|
158
|
+
inputSchema: RunScriptInputSchema,
|
|
159
|
+
annotations: {
|
|
160
|
+
readOnlyHint: false,
|
|
161
|
+
destructiveHint: false,
|
|
162
|
+
idempotentHint: false,
|
|
163
|
+
openWorldHint: true,
|
|
164
|
+
},
|
|
165
|
+
}, async (params) => {
|
|
166
|
+
let tempDir;
|
|
167
|
+
let tempFile;
|
|
168
|
+
try {
|
|
169
|
+
// 1. Look up skill
|
|
170
|
+
const skill = skillRegistry.get(params.skill);
|
|
171
|
+
if (!skill) {
|
|
172
|
+
return {
|
|
173
|
+
content: [
|
|
174
|
+
{
|
|
175
|
+
type: "text",
|
|
176
|
+
text: `❌ Skill '${params.skill}' is not active. Call hivemind_initiate_skill first.`,
|
|
177
|
+
},
|
|
178
|
+
],
|
|
179
|
+
isError: true,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
// 2. Look up script
|
|
183
|
+
const scriptContent = skill.scripts[params.script];
|
|
184
|
+
if (scriptContent === undefined) {
|
|
185
|
+
const available = Object.keys(skill.scripts);
|
|
186
|
+
const availableList = available.length > 0
|
|
187
|
+
? "\n\nAvailable scripts:\n" + available.map((s) => ` • ${s}`).join("\n")
|
|
188
|
+
: "\n\nNo scripts registered for this skill.";
|
|
189
|
+
return {
|
|
190
|
+
content: [
|
|
191
|
+
{
|
|
192
|
+
type: "text",
|
|
193
|
+
text: `❌ Script '${params.script}' not found in skill '${params.skill}'.${availableList}`,
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
isError: true,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
// 3. Write script to temp file
|
|
200
|
+
tempDir = await mkdtemp(join(tmpdir(), "hivemind-script-"));
|
|
201
|
+
// Script name may include subdirectory (e.g. "math/index.js")
|
|
202
|
+
// Extract just the base filename for the temp file
|
|
203
|
+
const scriptBasename = params.script.split("/").pop() ?? params.script;
|
|
204
|
+
tempFile = join(tempDir, scriptBasename);
|
|
205
|
+
await writeFile(tempFile, scriptContent, "utf-8");
|
|
206
|
+
// 4. Detect runtime and build command
|
|
207
|
+
const runtime = detectRuntime(params.script);
|
|
208
|
+
// If runtime detection failed (e.g. .sh on Windows without Git Bash)
|
|
209
|
+
if (runtime.error) {
|
|
210
|
+
return {
|
|
211
|
+
content: [
|
|
212
|
+
{
|
|
213
|
+
type: "text",
|
|
214
|
+
text: `❌ Cannot run '${params.script}': ${runtime.error}`,
|
|
215
|
+
},
|
|
216
|
+
],
|
|
217
|
+
isError: true,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
// Convert path for Git Bash on Windows (forward slashes)
|
|
221
|
+
let scriptPath = tempFile;
|
|
222
|
+
if (runtime.bashType && process.platform === "win32") {
|
|
223
|
+
scriptPath = convertPathForBash(tempFile, runtime.bashType);
|
|
224
|
+
}
|
|
225
|
+
const execArgs = [
|
|
226
|
+
...runtime.args,
|
|
227
|
+
scriptPath,
|
|
228
|
+
...(params.args ? params.args.split(" ") : []),
|
|
229
|
+
];
|
|
230
|
+
// 5. Execute with timeout
|
|
231
|
+
const timeout = Math.min(params.timeout ?? config.scriptTimeout, 120000);
|
|
232
|
+
const result = await executeScript(runtime.command, execArgs, params.input_data, timeout);
|
|
233
|
+
// 6. Format and return output
|
|
234
|
+
const header = `## ⚡ Script Output: ${params.script}\n**Skill**: ${params.skill} · **Exit code**: ${result.exitCode} · **Duration**: ${result.durationMs}ms\n\n---\n\n`;
|
|
235
|
+
const output = result.stdout
|
|
236
|
+
? `### stdout\n\`\`\`\n${result.stdout}\n\`\`\`\n`
|
|
237
|
+
: "";
|
|
238
|
+
const stderr = result.stderr
|
|
239
|
+
? `\n### stderr\n\`\`\`\n${result.stderr}\n\`\`\`\n`
|
|
240
|
+
: "";
|
|
241
|
+
return {
|
|
242
|
+
content: [
|
|
243
|
+
{
|
|
244
|
+
type: "text",
|
|
245
|
+
text: header + output + stderr,
|
|
246
|
+
},
|
|
247
|
+
],
|
|
248
|
+
isError: result.exitCode !== 0,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
return {
|
|
253
|
+
content: [
|
|
254
|
+
{
|
|
255
|
+
type: "text",
|
|
256
|
+
text: `Error running script: ${error instanceof Error ? error.message : String(error)}`,
|
|
257
|
+
},
|
|
258
|
+
],
|
|
259
|
+
isError: true,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
finally {
|
|
263
|
+
// Cleanup temp file
|
|
264
|
+
if (tempFile) {
|
|
265
|
+
try {
|
|
266
|
+
await unlink(tempFile);
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
// Best effort cleanup
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
function executeScript(command, args, inputData, timeout = 30000) {
|
|
276
|
+
return new Promise((resolve, reject) => {
|
|
277
|
+
const startTime = Date.now();
|
|
278
|
+
const child = spawn(command, args, {
|
|
279
|
+
timeout,
|
|
280
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
281
|
+
env: { ...process.env },
|
|
282
|
+
});
|
|
283
|
+
let stdout = "";
|
|
284
|
+
let stderr = "";
|
|
285
|
+
child.stdout.on("data", (data) => {
|
|
286
|
+
stdout += data.toString();
|
|
287
|
+
// Cap output at 50KB to prevent memory issues
|
|
288
|
+
if (stdout.length > 50 * 1024) {
|
|
289
|
+
stdout = stdout.slice(0, 50 * 1024) + "\n...[output truncated at 50KB]";
|
|
290
|
+
child.kill("SIGTERM");
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
child.stderr.on("data", (data) => {
|
|
294
|
+
stderr += data.toString();
|
|
295
|
+
if (stderr.length > 50 * 1024) {
|
|
296
|
+
stderr = stderr.slice(0, 50 * 1024) + "\n...[output truncated at 50KB]";
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
child.on("error", (err) => {
|
|
300
|
+
reject(new Error(`Failed to execute ${command}: ${err.message}`));
|
|
301
|
+
});
|
|
302
|
+
child.on("close", (code) => {
|
|
303
|
+
resolve({
|
|
304
|
+
stdout: stdout.trim(),
|
|
305
|
+
stderr: stderr.trim(),
|
|
306
|
+
exitCode: code ?? 1,
|
|
307
|
+
durationMs: Date.now() - startTime,
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
// Write stdin data if provided
|
|
311
|
+
if (inputData) {
|
|
312
|
+
child.stdin.write(inputData);
|
|
313
|
+
child.stdin.end();
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
child.stdin.end();
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=runScript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runScript.js","sourceRoot":"","sources":["../../src/tools/runScript.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stopMcp.d.ts","sourceRoot":"","sources":["../../src/tools/stopMcp.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyBzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgF3D"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hivemind_stop_mcp Tool
|
|
3
|
+
*
|
|
4
|
+
* Stops an MCP process.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod/v4";
|
|
7
|
+
import { childMcpRegistry } from "../registries/childMcpRegistry.js";
|
|
8
|
+
import { childMcpManager } from "../childMcp/manager.js";
|
|
9
|
+
// ── Input Schema ─────────────────────────────────────────────────
|
|
10
|
+
const StopMcpInputSchema = z.object({
|
|
11
|
+
mcp: z
|
|
12
|
+
.string()
|
|
13
|
+
.min(1)
|
|
14
|
+
.describe("Name of the MCP server to stop."),
|
|
15
|
+
}).strict();
|
|
16
|
+
// ── Tool Description ─────────────────────────────────────────────
|
|
17
|
+
const STOP_MCP_DESCRIPTION = `Stop a running standalone MCP server and free its resources.
|
|
18
|
+
|
|
19
|
+
Only MCPs (spawned via hivemind_initiate_mcp or by skills) can be stopped with this tool.
|
|
20
|
+
|
|
21
|
+
Example: hivemind_stop_mcp(mcp="playwright")`;
|
|
22
|
+
// ── Registration ─────────────────────────────────────────────────
|
|
23
|
+
export function registerStopMcpTool(server) {
|
|
24
|
+
server.registerTool("hivemind_stop_mcp", {
|
|
25
|
+
title: "Stop MCP",
|
|
26
|
+
description: STOP_MCP_DESCRIPTION,
|
|
27
|
+
inputSchema: StopMcpInputSchema,
|
|
28
|
+
annotations: {
|
|
29
|
+
readOnlyHint: false,
|
|
30
|
+
destructiveHint: true,
|
|
31
|
+
idempotentHint: true,
|
|
32
|
+
openWorldHint: false,
|
|
33
|
+
},
|
|
34
|
+
}, async (params) => {
|
|
35
|
+
try {
|
|
36
|
+
// 1. Look up MCP in ChildMcpRegistry
|
|
37
|
+
const entry = childMcpRegistry.get(params.mcp);
|
|
38
|
+
if (!entry) {
|
|
39
|
+
const available = childMcpRegistry.names();
|
|
40
|
+
const availableList = available.length > 0
|
|
41
|
+
? `\n\nActive MCPs: ${available.map((n) => `\`${n}\``).join(", ")}`
|
|
42
|
+
: "\n\nNo MCPs currently active.";
|
|
43
|
+
return {
|
|
44
|
+
content: [
|
|
45
|
+
{
|
|
46
|
+
type: "text",
|
|
47
|
+
text: `❌ No active MCP named '${params.mcp}'.${availableList}`,
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
isError: true,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// Standalone restriction removed
|
|
54
|
+
// 3. Capture info before stopping
|
|
55
|
+
const toolCount = entry.tools.length;
|
|
56
|
+
const toolNames = entry.tools.map((t) => t.name);
|
|
57
|
+
// 4. Stop via ChildMcpManager
|
|
58
|
+
await childMcpManager.stop(params.mcp);
|
|
59
|
+
// 5. Build summary
|
|
60
|
+
const lines = [];
|
|
61
|
+
lines.push(`## ✅ MCP Stopped: ${params.mcp}\n`);
|
|
62
|
+
lines.push("### Cleanup Summary\n");
|
|
63
|
+
lines.push(`- 🔌 Process terminated`);
|
|
64
|
+
lines.push(`- 🔧 ${toolCount} tool(s) removed: ${toolNames.map((n) => `\`${n}\``).join(", ") || "none"}`);
|
|
65
|
+
// Show remaining capacity
|
|
66
|
+
const remainingStandalone = childMcpRegistry.countBySource("standalone");
|
|
67
|
+
const remainingTotal = childMcpRegistry.count();
|
|
68
|
+
lines.push(`\n> ${remainingStandalone} standalone MCP(s) remaining. ${remainingTotal} total child process(es) active.`);
|
|
69
|
+
return {
|
|
70
|
+
content: [
|
|
71
|
+
{
|
|
72
|
+
type: "text",
|
|
73
|
+
text: lines.join("\n"),
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
return {
|
|
80
|
+
content: [
|
|
81
|
+
{
|
|
82
|
+
type: "text",
|
|
83
|
+
text: `❌ Error stopping MCP '${params.mcp}': ${error instanceof Error ? error.message : String(error)}`,
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
isError: true,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=stopMcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stopMcp.js","sourceRoot":"","sources":["../../src/tools/stopMcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hivemind_use_tool Tool
|
|
3
|
+
*
|
|
4
|
+
* Proxies tool calls to child MCP processes. This is the
|
|
5
|
+
* Level 3 (default) tool delivery mechanism — agents call child
|
|
6
|
+
* MCP tools through this single proxy tool.
|
|
7
|
+
*/
|
|
8
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
9
|
+
export declare function registerUseToolTool(server: McpServer): void;
|
|
10
|
+
//# sourceMappingURL=useTool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTool.d.ts","sourceRoot":"","sources":["../../src/tools/useTool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA2BzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyG3D"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hivemind_use_tool Tool
|
|
3
|
+
*
|
|
4
|
+
* Proxies tool calls to child MCP processes. This is the
|
|
5
|
+
* Level 3 (default) tool delivery mechanism — agents call child
|
|
6
|
+
* MCP tools through this single proxy tool.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod/v4";
|
|
9
|
+
import { childMcpRegistry } from "../registries/childMcpRegistry.js";
|
|
10
|
+
const UseToolInputSchema = z.object({
|
|
11
|
+
mcp: z
|
|
12
|
+
.string()
|
|
13
|
+
.min(1)
|
|
14
|
+
.describe("Name of the child MCP server."),
|
|
15
|
+
tool: z
|
|
16
|
+
.string()
|
|
17
|
+
.min(1)
|
|
18
|
+
.describe("Name of the tool to call."),
|
|
19
|
+
params: z
|
|
20
|
+
.record(z.string(), z.unknown())
|
|
21
|
+
.optional()
|
|
22
|
+
.describe("Parameters to pass to the tool (as a JSON object)."),
|
|
23
|
+
}).strict();
|
|
24
|
+
const USE_TOOL_DESCRIPTION = `Execute a tool from an activated MCP server. Works for both
|
|
25
|
+
MCPs spawned by skills (via hivemind_initiate_skill) and standalone MCPs
|
|
26
|
+
(via hivemind_initiate_mcp).
|
|
27
|
+
|
|
28
|
+
Example: hivemind_use_tool(mcp="playwright", tool="navigate",
|
|
29
|
+
params={url: "https://example.com"})`;
|
|
30
|
+
export function registerUseToolTool(server) {
|
|
31
|
+
server.registerTool("hivemind_use_tool", {
|
|
32
|
+
title: "Use MCP Tool",
|
|
33
|
+
description: USE_TOOL_DESCRIPTION,
|
|
34
|
+
inputSchema: UseToolInputSchema,
|
|
35
|
+
annotations: {
|
|
36
|
+
readOnlyHint: false,
|
|
37
|
+
destructiveHint: false,
|
|
38
|
+
idempotentHint: false,
|
|
39
|
+
openWorldHint: true,
|
|
40
|
+
},
|
|
41
|
+
}, async (params) => {
|
|
42
|
+
try {
|
|
43
|
+
// 1. Look up the child MCP
|
|
44
|
+
const entry = childMcpRegistry.get(params.mcp);
|
|
45
|
+
if (!entry) {
|
|
46
|
+
// List available MCPs to help the agent
|
|
47
|
+
const available = childMcpRegistry.names();
|
|
48
|
+
const availableList = available.length > 0
|
|
49
|
+
? `\n\nAvailable MCPs: ${available.map((n) => `\`${n}\``).join(", ")}`
|
|
50
|
+
: "\n\nNo MCPs currently active. Use hivemind_initiate_mcp or hivemind_initiate_skill to activate one.";
|
|
51
|
+
return {
|
|
52
|
+
content: [
|
|
53
|
+
{
|
|
54
|
+
type: "text",
|
|
55
|
+
text: `❌ No active MCP named '${params.mcp}'. Use hivemind_list_active to see what's available.${availableList}`,
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
isError: true,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// 2. Verify the MCP is healthy
|
|
62
|
+
if (entry.status === "crashed") {
|
|
63
|
+
return {
|
|
64
|
+
content: [
|
|
65
|
+
{
|
|
66
|
+
type: "text",
|
|
67
|
+
text: `❌ MCP '${params.mcp}' has crashed and is no longer responding. Try restarting it.`,
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
isError: true,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// 3. Verify the tool exists
|
|
74
|
+
const toolExists = entry.tools.some((t) => t.name === params.tool);
|
|
75
|
+
if (!toolExists) {
|
|
76
|
+
const availableTools = entry.tools.map((t) => `\`${t.name}\``).join(", ");
|
|
77
|
+
return {
|
|
78
|
+
content: [
|
|
79
|
+
{
|
|
80
|
+
type: "text",
|
|
81
|
+
text: `❌ Tool '${params.tool}' not found in MCP '${params.mcp}'.\n\nAvailable tools: ${availableTools || "none discovered"}`,
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
isError: true,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// 4. Forward the tool call to the child MCP client
|
|
88
|
+
const result = await entry.client.callTool({
|
|
89
|
+
name: params.tool,
|
|
90
|
+
arguments: params.params ?? {},
|
|
91
|
+
});
|
|
92
|
+
// 5. Return the result, preserving the child's response format
|
|
93
|
+
if (result.content && Array.isArray(result.content)) {
|
|
94
|
+
return {
|
|
95
|
+
content: result.content.map((item) => {
|
|
96
|
+
if (typeof item === "object" && item !== null && "type" in item) {
|
|
97
|
+
return item;
|
|
98
|
+
}
|
|
99
|
+
return { type: "text", text: String(item) };
|
|
100
|
+
}),
|
|
101
|
+
isError: result.isError === true,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
// Fallback: wrap raw result as text
|
|
105
|
+
return {
|
|
106
|
+
content: [
|
|
107
|
+
{
|
|
108
|
+
type: "text",
|
|
109
|
+
text: typeof result === "string" ? result : JSON.stringify(result, null, 2),
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
return {
|
|
116
|
+
content: [
|
|
117
|
+
{
|
|
118
|
+
type: "text",
|
|
119
|
+
text: `Error calling tool '${params.tool}' on MCP '${params.mcp}': ${error instanceof Error ? error.message : String(error)}`,
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
isError: true,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=useTool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTool.js","sourceRoot":"","sources":["../../src/tools/useTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Write Tools — hivemind_write_instruction, hivemind_write_mistake, hivemind_write_update
|
|
3
|
+
*
|
|
4
|
+
* Three tools sharing the same REST endpoint (POST /v1/memories)
|
|
5
|
+
* but with different `type` values set automatically.
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
8
|
+
export declare function registerWriteTools(server: McpServer): void;
|
|
9
|
+
//# sourceMappingURL=write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0OzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4D1D"}
|