A plugin is a directory with a manifest and one or more component types. Mull discovers them from the filesystem.
plugins/
my-plugin/
plugin.json
skills/
my-skill/
SKILL.md
commands/
deploy.md
agents/
reviewer.md
.mcp.json
Create a plugin.json at the plugin root. Only name is required.
{
"name": "my-plugin",
"description": "What it does",
"version": "1.0.0",
"author": { "name": "You" },
"skills": "./skills",
"commands": "./commands",
"agents": "./agents",
"mcpServers": "./.mcp.json"
}
Field names are camelCase. Unknown fields are ignored. Paths are relative to the plugin root.
A skill is a directory containing a SKILL.md file. The directory name becomes the skill name.
---
name: my-skill
description: What this skill does
when-to-use: When the user asks for X
allowed-tools:
- Bash
- Read
---
# Instructions
Your markdown body goes here.
Frontmatter keys: name, description, when-to-use, allowed-tools, paths, model, effort, user-invocable, disable-model-invocation.
Any .md file in a commands/ directory. The filename stem becomes the command name.
commands/
deploy.md → /deploy
lint.md → /lint
Any .md file in an agents/ directory. The filename stem becomes the agent name.
agents/
reviewer.md → reviewer agent
tester.md → tester agent
Add a .mcp.json at the plugin root with your server configuration.
{
"mcpServers": {
"my-server": {
"command": "node",
"args": ["./server.js"]
}
}
}
Run the generator to add your plugin to the marketplace index:
bash scripts/generate.sh
This produces .mull-plugin/marketplace.json and .mull-plugin/plugin-index.json from the plugin directories. Never edit these files manually.
Questions? Open an issue.