read, write, and bash.
Creating a tool
Tools are defined as TypeScript or JavaScript files. However, the tool definition can invoke scripts written in any language — TypeScript or JavaScript is only used for the tool definition itself.Location
They can be defined:- Locally by placing them in the
.symbiotic/tools/directory of your project. - Or globally, by placing them in
~/.config/symbiotic/tools/.
Structure
The easiest way to create tools is using thetool() helper which provides type-safety and validation.
.symbiotic/tools/database.ts
database tool.
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>:
.symbiotic/tools/math.ts
math_add and math_multiply.
Name collisions with built-in tools
Custom tools are keyed by tool name. If a custom tool uses the same name as a built-in tool, the custom tool takes precedence. For example, this file replaces the built-inbash tool:
.symbiotic/tools/bash.ts
Prefer unique names unless you intentionally want to replace a built-in tool. If you want to disable a built in tool but not override it, use permissions.
Arguments
You can usetool.schema, which is just Zod, to define argument types.
Context
Tools receive context about the current session:.symbiotic/tools/project.ts
context.directory for the session working directory.
Use context.worktree for the git worktree root.
Examples
Write a tool in Python
You can write your tools in any language you want. Here’s an example that adds two numbers using Python. First, create the tool as a Python script:.symbiotic/tools/add.py
.symbiotic/tools/python-add.ts
Bun.$ utility to run the Python script.