Skip to main content
Describe a plugin with tai-plugin.yml — the descriptor the marketplace indexes a plugin from. Every plugin ships a tai-plugin.yml at its repository root and inside its built wheel. It is the single source for what the plugin is (name, package, version, license, contract range) and what it provides (one entry per contained item). The registry validates a release’s artifact against it before publishing, and the installer patches the server manifest from its provides list. It is not the server manifest: tai-plugin.yml describes what a plugin offers; the server manifest declares what a server loads.

The fields

Each provides entry’s module is the module whose import registers the item, and its kind maps onto the server-manifest field the installer patches — a tool lands under tools, an extension under extensions_modules, and so on.

Router and middleware kinds

A plugin can also provide an HTTP router or an ASGI middleware — the two provides kinds that map onto the manifest’s module lists: The module you name registers the route or middleware on import, exactly as an authored code plugin does — the descriptor just lets the marketplace install it and merge it into the server manifest for you.
An installed router or middleware activates on the next server restart, not instantly. Installing merges the module into the persisted manifest, but the served route table and the middleware stack are fixed when the server boots, so the new routes bind only the next time it starts. Tools and agents hot-activate on install; a router or middleware needs a restart.
For a router, the installer orders the router ahead of the Studio SPA catch-all, so its routes are not shadowed by the catch-all — an authored router never has to manage that ordering itself. A middleware is appended to the stack, where it wraps the built-in middleware and so runs outermost. If a plugin middleware needs a precise position relative to the others, that ordering is not configurable.

A real descriptor

The toolbox’s own descriptor, in full:
tai-plugin.yml

Package it

Ship the file twice: at the repository root (the registry reads it from the repo) and as package-data inside the wheel (the registry validates the built artifact against the listing). Keep the wheel copy under your package directory and name it in the package-data config so the build includes it:
pyproject.toml

Validate it

Load and validate a descriptor before you publish with load_plugin_spec, which parses the file and returns a validated PluginSpec — a schema violation raises rather than returning a partial spec:

See also