1) Create a class library
Create anet8.0 class library and reference:
Vitruvian.Abstractions- optionally
Vitruvian.PluginSdk
2) Implement IVitruvianModule
3) Add SDK attributes
Use capability, goals, lane, cost/risk, cooldown, and conflict metadata where relevant.4) Declare permissions and secrets
5) Build and install
6) Tool calling from modules
UseModelToolBuilder and IModelClient.ExecuteWithToolsAsync for robust function and MCP tool flows.
Plugin author gotchas
- Always declare side-effect permissions.
- Handle missing model clients gracefully (
IModelClient?). - Return user-facing errors, not only technical stack traces.
- Reuse
ICommandRunnerfor process execution instead of custom process code.