Skip to main content

Tool registry

The tool registry is the index of every ITool in the running Unity Editor. It is populated by reflection on Editor reload and re-queried whenever the LLM plans a step. There are 3,691 tools at the time of 1.0.

How discovery works

  1. On Editor reload, the registry scans every assembly in the current AppDomain.
  2. For each assembly, it enumerates types that implement ITool and are not abstract.
  3. Each candidate is instantiated once and added to a Dictionary<string, ITool> keyed on Name.
  4. Duplicate names trigger a build-time error — Buril CI fails if two tools share a name.

There is no Tools.json manifest. There is no [BurilTool] attribute. The contract is structural: implement ITool, drop the file under Editor/Tools/, ship.

The CATALOG.md regen

A flat, human-readable catalog of every shipped tool lives at Tools/CATALOG.md. It is regenerated by a tool, naturally:

tool_catalog_regen

This tool walks the registry, sorts by family, and emits Markdown with one section per family and one row per tool. The CI regen-catalog job runs this on every push to main and commits the result — so CATALOG.md is always in sync with what actually ships.

Querying the catalog from chat:

What are all the asset_* tools?

This triggers tool_registry_list with a family: "asset" filter and returns ~150 rows.

Tool families (high level)

The 3,691 tools group into 322 families. The top 25 by tool count:

FamilyApprox. countPurpose
asset_280AssetDatabase operations — import, move, label, refresh
gameobject_220GameObject lifecycle, transforms, components
scene_180Scene I/O, hierarchy, root sets
script_165C# script CRUD, compile checks, reference search
editor_150Editor windows, play mode, project state
material_140Material creation, shader binding, property edits
mesh_130Mesh import, deduplication, optimization
prefab_125Prefab create / apply / unpack / variant chains
animation_120AnimationClip authoring + ai-animation pipelines
tester_115Autoplay foundation (Wave 7 / mce-play absorbed)
vroid_95VRoid Studio bridge — VRM I/O, pipeline orchestration
cascadeur_85Cascadeur Indie+ bridge — keyframes, alembic
marvelous_80Marvelous Designer bridge — cloth bake, VTuber pipeline
zbrush_75ZBrush Python API bridge
daz3d_70Daz Studio bridge
comfyui_65ComfyUI workflow execution
hunyuan3d_60Local Hunyuan3D 2.1+ image-to-3D
agent_team_55Multi-Agent Studio orchestration
mcp_50External MCP server registration + dispatch
clothing_50Wave 8 clothing pipelines
pixel_452D pixel art pipelines + Aseprite bridge
voice_40Voice + lipsync (ElevenLabs, Audio2Face, uLipSync)
build_40Player builds, batchmode entrypoints
lighting_35Lightmaps, probes, environment
physics_30Colliders, rigidbodies, Obi family

The full breakdown lives in Tools/CATALOG.md.

Dispatch

Every tool call travels the same path:

LLM tool_call {name, input}
→ MCP server validates {name exists, input matches schema}
→ Dispatcher pins to main editor thread (or honors [OffThread])
→ ITool.Run(input)
→ Result serialized as JSON
→ MCP server returns to caller
→ LLM consumes result and decides next step

The dispatcher logs every call to the Buril → History window with timestamps, input, output, and duration. This log is local-only and rotates after 10,000 entries by default.

Listing tools at runtime

From chat:

list tools matching "material"

From C#:

var allTools = BurilToolRegistry.Instance.ListAll();
var oneTool = BurilToolRegistry.Instance.Get("asset_import_fbx");

From the headless CLI:

buril --list-tools | rg material
buril --tool-info asset_import_fbx

Versioning

ITool names are part of the public contract. If you need to make a breaking change:

  1. Add the new tool with a new name (e.g., asset_import_fbx_v2).
  2. Keep the old tool for at least one minor version, optionally with a deprecation notice in its Description.
  3. Add a one-line note to CHANGELOG.md under the next release.
  4. Remove the old tool in the following minor version.

Never silently swap Run semantics — even if the name and schema look the same, agents that learned the old behavior will be subtly broken.