./.graph/tools/ (or ~/.config/graph/tools/ for tools you want everywhere) and it becomes user__<name> — callable by the agent, referenced in plan steps or from the CLI.
exec — wrap any command
Unparseable
json output, non-zero exit (with stderr captured), and timeouts all return as structured tool errors.
prompt — an LLM call as a tool
output_schema, the result is validated JSON; without one, {"text": …}. Useful as a cheap sub-task inside plans — classify, extract, reword — with model controlling cost: any configured role — a standard one like chat (the default, with the usual fallback to default) or a custom one like nano. An unknown name fails the call with the configured names listed.
Shared behavior
input_schemavalidates before dispatch — missing fields return actionable errors (in chat, the agent asks and retries).output_schema, when declared, feeds the planner’s shape knowledge just like an MCP output schema.- Names must match
[a-zA-Z0-9_-]+; templates referencing anything but{{input.*}}are load-time errors. - Files are read strictly: a key the tool’s
kinddoes not accept is a load error naming it (unknown field(s) \tmeout_secs` for a `exec` tool`), never ignored. versionis the file version the document is written in; omitted means1.graph tools migrate <path>brings a file to the current version.