OpenCode kommt mit einem Set eingebauter Tools und erlaubt das Erstellen eigener Custom Tools.
Offizielle Docs: opencode.ai/docs/tools | opencode.ai/docs/custom-tools
| Tool | Beschreibung | Permission Key |
|---|---|---|
bash |
Shell-Befehle ausfuehren | bash |
edit |
Dateien bearbeiten (exakte String-Replacement) | edit |
write |
Neue Dateien erstellen / ueberschreiben | edit |
read |
Datei-Inhalte lesen | read |
grep |
Inhalte mit Regex durchsuchen | grep |
glob |
Dateien per Pattern finden | glob |
list |
Verzeichnisse auflisten | list |
patch |
Patches anwenden | edit |
skill |
Skills laden | skill |
todowrite |
Todo-Listen verwalten | todowrite |
webfetch |
Web-Inhalte abrufen | webfetch |
websearch |
Web-Suche (Exa AI) | websearch |
question |
User-Fragen stellen | question |
lsp |
LSP-Abfragen (experimentell) | lsp |
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"edit": "ask",
"bash": "ask",
"webfetch": "allow",
"read": "allow"
}
}{
"permission": {
"mymcp_*": "ask"
}
}Custom Tools sind TypeScript/JavaScript-Dateien, die das LLM waehrend Konversationen aufrufen kann.
- Lokal:
.opencode/tools/ - Global:
~/.config/opencode/tools/
// .opencode/tools/database.ts
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) {
return `Executed query: ${args.query}`
},
})Der Dateiname wird zum Tool-Namen (database.ts -> Tool database).
// .opencode/tools/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
},
})Erstellt: math_add und math_multiply.
export default tool({
description: "Get project information",
args: {},
async execute(args, context) {
const { agent, sessionID, messageID, directory, worktree } = context
return `Agent: ${agent}, Dir: ${directory}`
},
})Beispiel: Python-Tool via TypeScript-Wrapper:
// .opencode/tools/python-add.ts
import { tool } from "@opencode-ai/plugin"
import path from "path"
export default tool({
description: "Add two numbers using Python",
args: {
a: tool.schema.number().describe("First number"),
b: tool.schema.number().describe("Second number"),
},
async execute(args, context) {
const script = path.join(context.worktree, ".opencode/tools/add.py")
const result = await Bun.$`python3 ${script} ${args.a} ${args.b}`.text()
return result.trim()
},
})Tools wie grep, glob, list verwenden intern ripgrep und respektieren .gitignore. Um ignorierte Dateien einzubeziehen:
# .ignore
!node_modules/
!dist/
!build/
- Custom Tools fuer wiederkehrende Aufgaben: DB-Abfragen, API-Calls, Build-Scripts
- Klare Descriptions: Der Agent entscheidet anhand der Beschreibung, wann er das Tool nutzt
- Zod-Schemas nutzen: Typsichere Argumente mit guten
.describe()Texten - Permissions beachten: Custom Tools, die gleich heissen wie Built-in Tools, ueberschreiben diese
- Context.worktree nutzen: Fuer relative Pfade innerhalb des Projekts