| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- ---
- title: Custom Tools
- description: Create tools the LLM can call in opencode.
- ---
- Custom tools are functions you create that the LLM can call during conversations. They work alongside opencode's [built-in tools](/docs/tools) like `read`, `write`, and `bash`.
- ---
- ## Creating a tool
- Tools are defined as **TypeScript** or **JavaScript** files.
- ---
- ### Location
- They can be defined:
- - Locally by placing them in the `.opencode/tool/` directory of your project.
- - Or globally, by placing them in `~/.config/opencode/tool/`.
- ---
- ### Structure
- The easiest way to create tools is using the `tool()` helper which provides type-safety and validation.
- ```ts title=".opencode/tool/database.ts" {1}
- import { tool } from "@opencode-ai/plugin"
- export default tool({
- description: "Query the project database",
- args: {
- query: tool.schema.string().describe("SQL query to execute"),
- },
- async execute(args) {
- // Your database logic here
- return `Executed query: ${args.query}`
- },
- })
- ```
- The **filename** becomes the **tool name**. The above creates a `database` tool.
- ---
- ### Arguments
- You can use `tool.schema`, which is just [Zod](https://zod.dev), to define argument types.
- ```ts "tool.schema"
- args: {
- query: tool.schema.string().describe("SQL query to execute")
- }
- ```
- You can also import [Zod](https://zod.dev) directly and return a plain object:
- ```ts {6}
- import { z } from "zod"
- export default {
- description: "Tool description",
- args: {
- param: z.string().describe("Parameter description"),
- },
- async execute(args, context) {
- // Tool implementation
- return "result"
- },
- }
- ```
- ---
- ## Context
- Tools receive context about the current session:
- ```ts title=".opencode/tool/project.ts" {8}
- import { tool } from "@opencode-ai/plugin"
- export default tool({
- description: "Get project information",
- args: {},
- async execute(args, context) {
- // Access context information
- const { agent, sessionID, messageID } = context
- return `Agent: ${agent}, Session: ${sessionID}, Message: ${messageID}`
- },
- })
- ```
- ---
- ## Multiple tools per file
- You can also export multiple tools from a single file. Each export becomes **a separate tool** with the name **`<filename>_<exportname>`**:
- ```ts title=".opencode/tool/math.ts"
- import { tool } from "@opencode-ai/plugin"
- export const add = tool({
- description: "Add two numbers",
- args: {
- a: tool.schema.number().describe("First number"),
- b: tool.schema.number().describe("Second number"),
- },
- async execute(args) {
- return args.a + args.b
- },
- })
- export const multiply = tool({
- description: "Multiply two numbers",
- args: {
- a: tool.schema.number().describe("First number"),
- b: tool.schema.number().describe("Second number"),
- },
- async execute(args) {
- return args.a * args.b
- },
- })
- ```
- This creates two tools: `math_add` and `math_multiply`.
|