Use this skill when users ask "how does tool executor work", "how to use execute_code", "workspace API", "MCP client examples", "search_tools examples", "context-efficient patterns", or need guidance writing code for the Tool Executor sandbox.
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 implementationSearch for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer