From dcf06f5758d92804a6c23ef2d6df441701de5bb4 Mon Sep 17 00:00:00 2001 From: Sannidhya Date: Tue, 23 Dec 2025 23:44:25 +0530 Subject: [PATCH 1/2] docs: add Custom Tools experimental feature documentation - Created new documentation page at docs/features/experimental/custom-tools.md - Added Custom Tools entry to experimental-features.md overview - Updated features/index.md to include Custom Tools in experimental section - Added screenshot showing the settings toggle at static/img/custom-tools/custom-tools.png This documents the new experimental Custom Tools feature released in v3.37, which allows users to define TypeScript/JavaScript tools in .roo/tools/ directories that Roo can call like built-in tools. --- docs/features/experimental/custom-tools.md | 93 ++++++++++++++++++ .../experimental/experimental-features.md | 1 + docs/features/index.md | 1 + static/img/custom-tools/custom-tools.png | Bin 0 -> 40927 bytes 4 files changed, 95 insertions(+) create mode 100644 docs/features/experimental/custom-tools.md create mode 100644 static/img/custom-tools/custom-tools.png diff --git a/docs/features/experimental/custom-tools.md b/docs/features/experimental/custom-tools.md new file mode 100644 index 00000000..58e1e5eb --- /dev/null +++ b/docs/features/experimental/custom-tools.md @@ -0,0 +1,93 @@ +--- +description: Define TypeScript/JavaScript tools that extend Roo's capabilities beyond built-in tools, enabling project-specific workflows and team standardization. +keywords: + - experimental features + - custom tools + - TypeScript tools + - JavaScript tools + - tool extension + - defineCustomTool + - workflow automation +image: /img/social-share.jpg +--- +# Custom Tools + +Define TypeScript or JavaScript tools that Roo can call like built-in tools—standardize team workflows instead of re-prompting the same steps every task. + +:::warning Experimental Feature +Custom tools is an experimental feature. Custom tools are **automatically approved** when enabled—Roo won't ask for permission before running them. Only enable this feature if you trust your tool code. +::: + +--- + +## What it does + +Custom tools let you codify project-specific actions into TypeScript/JavaScript files that Roo calls like [`read_file()`](../../basic-usage/how-tools-work) or [`execute_command()`](../../basic-usage/how-tools-work). Ship tool schemas alongside your repo so teammates don't need to keep re-explaining the same workflow steps. Tools are validated with Zod and automatically transpiled from TypeScript. + +--- + +## How to create a tool + +Tools live in `.roo/tools/` (project-specific) or `~/.roo/tools/` (global) as `.ts` or `.js` files. Tools from later directories can override earlier ones. + +#### Basic structure + +```typescript +import { parametersSchema as z, defineCustomTool } from "@roo-code/types" + +export default defineCustomTool({ + name: "tool_name", + description: "What the tool does (shown to AI)", + parameters: z.object({ + param1: z.string().describe("Parameter description"), + param2: z.number().describe("Another parameter"), + }), + async execute(args, context) { + // args are type-safe and validated + // context provides: mode, task + return "Result string shown to AI" + } +}) +``` + +#### What you define + +- **`name`**: Tool name Roo sees in its available tools list +- **`description`**: Shown to the AI so it knows when to call the tool +- **`parameters`**: Zod schema converted to JSON Schema for validation +- **`execute`**: Async function returning a string result to Roo + +Tools are dynamically loaded and transpiled with esbuild. Changes to tool files trigger automatic reload. + +--- + +## Enabling the feature + +1. Open Roo Code settings (gear icon in top right) +2. Go to the "Experimental" tab +3. Toggle "Enable custom tools" + +Enable custom tools toggle in experimental settings + +**Critical:** When enabled, custom tools are **auto-approved**—Roo runs them without asking. Disable if you don't trust the tool code. + +--- + +## Tool directories + +- **`.roo/tools/`** in your workspace: project-specific tools shared with your team +- **`~/.roo/tools/`** in your home folder: personal tools across all projects + +Tools from both directories are loaded. Tools with the same name in `.roo/tools/` override those in `~/.roo/tools/`. + +--- + +## Limits + +- **No approval prompts**: Tools are auto-approved when the feature is enabled—security trade-off for convenience +- **String-only results**: Tools must return strings (Roo's protocol constraint) +- **No interactive input**: Tools can't prompt the user mid-execution +- **No npm packages**: Tools are transpiled in isolation; use Node.js built-ins only +- **Cache invalidation**: Tool updates may require reloading the window + +**vs. MCP:** [MCP](/features/mcp/overview) is for external services (search, APIs). Custom tools are for in-repo logic you control directly. MCP is more extensible; custom tools are lighter weight for project-specific actions. diff --git a/docs/features/experimental/experimental-features.md b/docs/features/experimental/experimental-features.md index e68f32b5..2aab8612 100644 --- a/docs/features/experimental/experimental-features.md +++ b/docs/features/experimental/experimental-features.md @@ -32,6 +32,7 @@ To enable or disable experimental features: The following experimental features are currently available: +- [Custom Tools](/features/experimental/custom-tools) - Define TypeScript/JavaScript tools that Roo can call like built-in tools - [Concurrent File Edits](/features/experimental/concurrent-file-edits) - Edit multiple files in a single operation - [Power Steering](/features/experimental/power-steering) - Enhanced consistency in AI responses - [Background Editing](/features/experimental/background-editing) - Work uninterrupted while Roo edits files in the background diff --git a/docs/features/index.md b/docs/features/index.md index 6bc708bc..aedbcbdf 100644 --- a/docs/features/index.md +++ b/docs/features/index.md @@ -58,6 +58,7 @@ Discover the powerful features that make Roo Code your ultimate AI-powered codin Push the boundaries with cutting-edge capabilities: +- [**Custom Tools**](/features/experimental/custom-tools) - Define TypeScript/JavaScript tools that Roo can call - [**Concurrent File Edits**](/features/experimental/concurrent-file-edits) - Edit multiple files in a single operation - [**Power Steering**](/features/experimental/power-steering) - Enhanced consistency in AI responses - [**More Experimental Features**](/features/experimental/experimental-features) - Explore features under development diff --git a/static/img/custom-tools/custom-tools.png b/static/img/custom-tools/custom-tools.png new file mode 100644 index 0000000000000000000000000000000000000000..d696c64b1b92919511dc21c70dbc776a40f24ff7 GIT binary patch literal 40927 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 AGynhq literal 0 HcmV?d00001 From 0a6f967e94ace81d407ec9b2e1f2e7afb42b4117 Mon Sep 17 00:00:00 2001 From: Sannidhya Date: Tue, 23 Dec 2025 23:52:07 +0530 Subject: [PATCH 2/2] Fix absolute links per .roorules and add custom-tools to sidebar --- docs/features/experimental/custom-tools.md | 2 +- sidebars.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/features/experimental/custom-tools.md b/docs/features/experimental/custom-tools.md index 58e1e5eb..739e47af 100644 --- a/docs/features/experimental/custom-tools.md +++ b/docs/features/experimental/custom-tools.md @@ -22,7 +22,7 @@ Custom tools is an experimental feature. Custom tools are **automatically approv ## What it does -Custom tools let you codify project-specific actions into TypeScript/JavaScript files that Roo calls like [`read_file()`](../../basic-usage/how-tools-work) or [`execute_command()`](../../basic-usage/how-tools-work). Ship tool schemas alongside your repo so teammates don't need to keep re-explaining the same workflow steps. Tools are validated with Zod and automatically transpiled from TypeScript. +Custom tools let you codify project-specific actions into TypeScript/JavaScript files that Roo calls like [`read_file()`](/basic-usage/how-tools-work) or [`execute_command()`](/basic-usage/how-tools-work). Ship tool schemas alongside your repo so teammates don't need to keep re-explaining the same workflow steps. Tools are validated with Zod and automatically transpiled from TypeScript. --- diff --git a/sidebars.ts b/sidebars.ts index 80e49fb1..af0a92e3 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -70,6 +70,7 @@ const sidebars: SidebarsConfig = { label: 'Experimental', items: [ 'features/experimental/experimental-features', + 'features/experimental/custom-tools', 'features/experimental/concurrent-file-edits', 'features/experimental/power-steering', 'features/experimental/background-editing',