Skip to main content
A Tool component packages a function or API capability that an agent calls during task execution. When an agent decides it needs to search for papers, read a file, fetch a URL, or execute a shell command, it reaches for a tool. Tools are stateless per invocation — each call is independent — and are always agent-initiated, not user-triggered.

Tool vs. Command

The key distinction is who initiates the call: If a user types a slash command to invoke it, use a Command. If an agent calls it as a function during its task loop, use a Tool.

Entrypoint format

Tool entrypoints can be:
  • JSON (.json) — a function descriptor object
  • YAML (.yaml) — a function descriptor object
  • Executable script — any regular executable file
The portable validation minimum requires:
  • JSON and YAML descriptor entrypoints must exist and parse successfully.
  • Script entrypoints must exist and be regular files. Host executability and local policy are checked at load time, not during portable validation.
Agent Volumes v0.1 does not standardize a full tool ABI. If your entrypoint is a JSON or YAML descriptor and it includes name and inputSchema fields, those are interpreted as function-description metadata. The spec does not define the complete execution contract — that remains runtime-local.

Declaring a tool in volume.toml

Add a [[components]] entry with type = "tool" and point entrypoint to your tool descriptor or script.

JSON descriptor example

A JSON tool descriptor describes the function’s name, what it does, and the shape of its inputs:

Portable capability classes

Agent Volumes describes tools in terms of portable capability classes — stable cross-runtime concepts that work regardless of which runtime loads your volume. When you design a tool, consider which capability class it belongs to: Runtime-specific tool names like Bash, WebFetch, or run_shell_command are profile-facing names. The portable capability class is what matters for cross-runtime compatibility.

Permissions for tools

Declare the permissions your tool needs. Most tools require either filesystem or network access — or both.
For a tool that reads and writes files:
Component permissions can only be equal to or narrower than the volume-level permissions. Declaring shell = "allow" at the component level when the volume declares shell = "deny" is a validation failure.

Complete volume example with tools

Component identifier

Once published, reference the tool using a purl identifier:
Other components can declare a dependency on this tool: