Build a plugin

A plugin is a directory with a manifest and one or more component types. Mull discovers them from the filesystem.

Directory structure

plugins/
  my-plugin/
    plugin.json
    skills/
      my-skill/
        SKILL.md
    commands/
      deploy.md
    agents/
      reviewer.md
    .mcp.json

Manifest

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.

Skills

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.

Commands

Any .md file in a commands/ directory. The filename stem becomes the command name.

commands/
  deploy.md    →  /deploy
  lint.md      →  /lint

Agents

Any .md file in an agents/ directory. The filename stem becomes the agent name.

agents/
  reviewer.md  →  reviewer agent
  tester.md    →  tester agent

MCP servers

Add a .mcp.json at the plugin root with your server configuration.

{
  "mcpServers": {
    "my-server": {
      "command": "node",
      "args": ["./server.js"]
    }
  }
}

Register in the marketplace

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.

Plugin name rules

Questions? Open an issue.