Help us improve
Share bugs, ideas, or general feedback.
Guides users through the Tool Executor sandbox workflow: searching tools, getting schemas, and executing code with pre-connected MCP clients. Also covers the Workspace API for file storage.
npx claudepluginhub espalier-redoubt/claudikins-tool-executorHow this skill is triggered — by the user, by Claude, or both
Slash command
/claudikins-tool-executor:te-guideThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
The Tool Executor wraps 7 MCP servers into 3 context-efficient tools. Master this workflow to reduce token consumption from ~50k to ~1.1k.
Guides Tool Executor workflow: search tools semantically, fetch schemas, execute TypeScript with MCP clients (serena, gemini, notebooklm) and workspace file API.
Creates or extends MCP servers with TypeScript-first guidance, from research through implementation to evaluation. Triggered by phrases like 'build an MCP server'.
Discovers and invokes MCP server capabilities on-demand using the mcp CLI tool. Useful for one-off calls, testing, and avoiding permanent integration.
Share bugs, ideas, or general feedback.
The Tool Executor wraps 7 MCP servers into 3 context-efficient tools. Master this workflow to reduce token consumption from ~50k to ~1.1k.
search_tools → get_tool_schema → execute_code
Find relevant tools with semantic search:
const result = await mcp__tool-executor__search_tools({
query: "generate diagram",
limit: 5
});
// Returns: { results: [{ name, server, description }], source, has_more }
Search tips:
offset for pagination when has_more is trueBefore calling a tool, get its complete specification:
const schema = await mcp__tool-executor__get_tool_schema({
name: "gemini_generateContent"
});
// Returns: { name, server, description, inputSchema, example, notes }
Why this step matters:
inputSchema shows all parameters, types, and required fieldsexample shows working code you can adaptnotes contains gotchas and tipsRun TypeScript in the sandbox with pre-connected MCP clients:
const result = await mcp__tool-executor__execute_code({
code: `
const response = await gemini.gemini_generateContent({
prompt: "Create a flowchart description for user authentication"
});
console.log("Generated:", response._savedTo || "inline");
`,
timeout: 30000
});
All clients are pre-connected and available as globals:
| Client | Purpose |
|---|---|
serena | Semantic code search (REQUIRED - cannot be removed) |
context7 | Library documentation lookup |
gemini | AI model queries, image generation, diagrams |
notebooklm | Research and notes |
shadcn | UI component generation |
apify | Web scraping |
sequentialThinking | Reasoning chains |
// All clients use the same pattern:
const result = await clientName.tool_name({ param: value });
// Examples:
await serena.find_symbol({ name_path: "MyClass" });
await gemini.query_gemini({ prompt: "Explain this code" });
await context7.resolve_library_id({ libraryName: "react" });
Persistent file storage scoped to ./workspace/. All paths are protected against traversal.
await workspace.write("notes.txt", "Hello world");
const content = await workspace.read("notes.txt");
await workspace.append("log.txt", "New line\n");
await workspace.delete("temp.txt");
await workspace.writeJSON("data.json", { key: "value" });
const data = await workspace.readJSON("data.json");
await workspace.writeBuffer("image.png", buffer);
const buffer = await workspace.readBuffer("image.png");
const files = await workspace.list("subdir");
const matches = await workspace.glob("**/*.json");
await workspace.mkdir("nested/path");
const exists = await workspace.exists("file.txt");
const stats = await workspace.stat("file.txt");
// stats: { size: number, mtime: Date, isDir: boolean }
// Clean up auto-saved MCP responses older than 1 hour
const deleted = await workspace.cleanupMcpResults();
MCP responses over 200 characters are automatically saved to workspace:
const response = await context7.get_library_docs({
context7CompatibleLibraryID: "/react/react"
});
// If large, response becomes:
// { _savedTo: "mcp-results/1234.json", _size: 5000, _preview: "...", _hint: "..." }
// Read full result when needed:
const full = await workspace.readJSON(response._savedTo);
Total console output over 500 characters is summarised. Keep logs concise:
// Good - concise logs
console.log("Created 5 files");
console.log("Done");
// Avoid - verbose output that gets truncated
console.log(JSON.stringify(largeObject, null, 2));
Minimise round-trips by batching work:
// Good - single execution with multiple operations
await mcp__tool-executor__execute_code({
code: `
const [lib1, lib2] = await Promise.all([
context7.resolve_library_id({ libraryName: "react" }),
context7.resolve_library_id({ libraryName: "vue" })
]);
console.log("Resolved both");
`
});
const response = await gemini.gemini_generateContent({
prompt: `Create a detailed flowchart description:
- User submits request
- Search for relevant tools
- Get tool schema
- Execute code in sandbox
`
});
await workspace.write("flowchart.md", response.content[0].text);
console.log("Saved flowchart.md");
const results = await serena.find_symbol({ name_path: "executeCode" });
console.log("Found:", results.content[0].text);
const code = await workspace.read("analysis-target.ts");
const analysis = await gemini.query_gemini({
prompt: `Analyse this code for potential issues:\n\n${code}`
});
await workspace.write("analysis.md", analysis.content[0].text);
Errors in execute_code return structured results:
const result = await mcp__tool-executor__execute_code({
code: `throw new Error("Something broke")`
});
// result: { logs: [...], error: "Something broke", stack: "..." }
Common errors:
timeout parameter or chunk work./workspace/For implementation details, see:
${CLAUDE_PLUGIN_ROOT}/src/sandbox/runtime.ts - Execution engine${CLAUDE_PLUGIN_ROOT}/src/sandbox/workspace.ts - Workspace API${CLAUDE_PLUGIN_ROOT}/src/sandbox/clients.ts - MCP client management${CLAUDE_PLUGIN_ROOT}/src/search.ts - Tool search implementation