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 twoprovides 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.
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 withload_plugin_spec,
which parses the file and returns a validated PluginSpec — a schema violation
raises rather than returning a partial spec:
See also
- The marketplace model — listings, items, versions.
- Install a plugin — what the installer does with
provides. - Python SDK reference — the
PluginSpecmodel.

