| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345 |
- ---
- title: Tools
- description: Manage the tools an LLM can use.
- ---
- Tools allow the LLM to perform actions in your codebase. OpenCode comes with a set of built-in tools, but you can extend it with [custom tools](/docs/custom-tools) or [MCP servers](/docs/mcp-servers).
- By default, all tools are **enabled** and don't need permission to run. You can control tool behavior through [permissions](/docs/permissions).
- ---
- ## Configure
- Use the `permission` field to control tool behavior. You can allow, deny, or require approval for each tool.
- ```json title="opencode.json"
- {
- "$schema": "https://opencode.ai/config.json",
- "permission": {
- "edit": "deny",
- "bash": "ask",
- "webfetch": "allow"
- }
- }
- ```
- You can also use wildcards to control multiple tools at once. For example, to require approval for all tools from an MCP server:
- ```json title="opencode.json"
- {
- "$schema": "https://opencode.ai/config.json",
- "permission": {
- "mymcp_*": "ask"
- }
- }
- ```
- [Learn more](/docs/permissions) about configuring permissions.
- ---
- ## Built-in
- Here are all the built-in tools available in OpenCode.
- ---
- ### bash
- Execute shell commands in your project environment.
- ```json title="opencode.json" {4}
- {
- "$schema": "https://opencode.ai/config.json",
- "permission": {
- "bash": "allow"
- }
- }
- ```
- This tool allows the LLM to run terminal commands like `npm install`, `git status`, or any other shell command.
- ---
- ### edit
- Modify existing files using exact string replacements.
- ```json title="opencode.json" {4}
- {
- "$schema": "https://opencode.ai/config.json",
- "permission": {
- "edit": "allow"
- }
- }
- ```
- This tool performs precise edits to files by replacing exact text matches. It's the primary way the LLM modifies code.
- ---
- ### write
- Create new files or overwrite existing ones.
- ```json title="opencode.json" {4}
- {
- "$schema": "https://opencode.ai/config.json",
- "permission": {
- "edit": "allow"
- }
- }
- ```
- Use this to allow the LLM to create new files. It will overwrite existing files if they already exist.
- :::note
- The `write` tool is controlled by the `edit` permission, which covers all file modifications (`edit`, `write`, `patch`, `multiedit`).
- :::
- ---
- ### read
- Read file contents from your codebase.
- ```json title="opencode.json" {4}
- {
- "$schema": "https://opencode.ai/config.json",
- "permission": {
- "read": "allow"
- }
- }
- ```
- This tool reads files and returns their contents. It supports reading specific line ranges for large files.
- ---
- ### grep
- Search file contents using regular expressions.
- ```json title="opencode.json" {4}
- {
- "$schema": "https://opencode.ai/config.json",
- "permission": {
- "grep": "allow"
- }
- }
- ```
- Fast content search across your codebase. Supports full regex syntax and file pattern filtering.
- ---
- ### glob
- Find files by pattern matching.
- ```json title="opencode.json" {4}
- {
- "$schema": "https://opencode.ai/config.json",
- "permission": {
- "glob": "allow"
- }
- }
- ```
- Search for files using glob patterns like `**/*.js` or `src/**/*.ts`. Returns matching file paths sorted by modification time.
- ---
- ### list
- List files and directories in a given path.
- ```json title="opencode.json" {4}
- {
- "$schema": "https://opencode.ai/config.json",
- "permission": {
- "list": "allow"
- }
- }
- ```
- This tool lists directory contents. It accepts glob patterns to filter results.
- ---
- ### lsp (experimental)
- Interact with your configured LSP servers to get code intelligence features like definitions, references, hover info, and call hierarchy.
- :::note
- This tool is only available when `OPENCODE_EXPERIMENTAL_LSP_TOOL=true` (or `OPENCODE_EXPERIMENTAL=true`).
- :::
- ```json title="opencode.json" {4}
- {
- "$schema": "https://opencode.ai/config.json",
- "permission": {
- "lsp": "allow"
- }
- }
- ```
- Supported operations include `goToDefinition`, `findReferences`, `hover`, `documentSymbol`, `workspaceSymbol`, `goToImplementation`, `prepareCallHierarchy`, `incomingCalls`, and `outgoingCalls`.
- To configure which LSP servers are available for your project, see [LSP Servers](/docs/lsp).
- ---
- ### patch
- Apply patches to files.
- ```json title="opencode.json" {4}
- {
- "$schema": "https://opencode.ai/config.json",
- "permission": {
- "edit": "allow"
- }
- }
- ```
- This tool applies patch files to your codebase. Useful for applying diffs and patches from various sources.
- :::note
- The `patch` tool is controlled by the `edit` permission, which covers all file modifications (`edit`, `write`, `patch`, `multiedit`).
- :::
- ---
- ### skill
- Load a [skill](/docs/skills) (a `SKILL.md` file) and return its content in the conversation.
- ```json title="opencode.json" {4}
- {
- "$schema": "https://opencode.ai/config.json",
- "permission": {
- "skill": "allow"
- }
- }
- ```
- ---
- ### todowrite
- Manage todo lists during coding sessions.
- ```json title="opencode.json" {4}
- {
- "$schema": "https://opencode.ai/config.json",
- "permission": {
- "todowrite": "allow"
- }
- }
- ```
- Creates and updates task lists to track progress during complex operations. The LLM uses this to organize multi-step tasks.
- :::note
- This tool is disabled for subagents by default, but you can enable it manually. [Learn more](/docs/agents/#permissions)
- :::
- ---
- ### todoread
- Read existing todo lists.
- ```json title="opencode.json" {4}
- {
- "$schema": "https://opencode.ai/config.json",
- "permission": {
- "todoread": "allow"
- }
- }
- ```
- Reads the current todo list state. Used by the LLM to track what tasks are pending or completed.
- :::note
- This tool is disabled for subagents by default, but you can enable it manually. [Learn more](/docs/agents/#permissions)
- :::
- ---
- ### webfetch
- Fetch web content.
- ```json title="opencode.json" {4}
- {
- "$schema": "https://opencode.ai/config.json",
- "permission": {
- "webfetch": "allow"
- }
- }
- ```
- Allows the LLM to fetch and read web pages. Useful for looking up documentation or researching online resources.
- ---
- ### question
- Ask the user questions during execution.
- ```json title="opencode.json" {4}
- {
- "$schema": "https://opencode.ai/config.json",
- "permission": {
- "question": "allow"
- }
- }
- ```
- This tool allows the LLM to ask the user questions during a task. It's useful for:
- - Gathering user preferences or requirements
- - Clarifying ambiguous instructions
- - Getting decisions on implementation choices
- - Offering choices about what direction to take
- Each question includes a header, the question text, and a list of options. Users can select from the provided options or type a custom answer. When there are multiple questions, users can navigate between them before submitting all answers.
- ---
- ## Custom tools
- Custom tools let you define your own functions that the LLM can call. These are defined in your config file and can execute arbitrary code.
- [Learn more](/docs/custom-tools) about creating custom tools.
- ---
- ## MCP servers
- MCP (Model Context Protocol) servers allow you to integrate external tools and services. This includes database access, API integrations, and third-party services.
- [Learn more](/docs/mcp-servers) about configuring MCP servers.
- ---
- ## Internals
- Internally, tools like `grep`, `glob`, and `list` use [ripgrep](https://github.com/BurntSushi/ripgrep) under the hood. By default, ripgrep respects `.gitignore` patterns, which means files and directories listed in your `.gitignore` will be excluded from searches and listings.
- ---
- ### Ignore patterns
- To include files that would normally be ignored, create a `.ignore` file in your project root. This file can explicitly allow certain paths.
- ```text title=".ignore"
- !node_modules/
- !dist/
- !build/
- ```
- For example, this `.ignore` file allows ripgrep to search within `node_modules/`, `dist/`, and `build/` directories even if they're listed in `.gitignore`.
|