Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build Claude Code plugins — skills, agents, MCP servers, hooks, and slash commands. Use when working with reference-architecture patterns. The complete guide to extending Claude Code with the Anthropic plugin system. Trigger with "claude code plugin", "build a skill", "create mcp server", "anthropic plugin architecture", "claude code hooks".
.claude/skills/jeremylongshore-clade-reference-architecture/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 30% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 4% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 30% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 108% | 0% |
Claude Code has a plugin system with 4 extension points: skills (auto-activating knowledge), commands (slash commands), agents (specialized sub-agents), and MCP servers (tool providers). This skill covers building all four.
Start with the smallest extension point that meets the requirement, declare only the tools and permissions it needs, and validate it locally before adding it to a marketplace or shared environment. Test discovery, activation, failure, and rollback paths; do not expose secrets through examples, environment files, logs, or MCP response payloads.
my-plugin/
├── .claude-plugin/
│ └── plugin.json # Required: name, version, description, author
├── skills/
│ └── my-skill/
│ └── SKILL.md # Auto-activating skill
├── commands/
│ └── my-command.md # Slash command (/my-command)
├── agents/
│ └── my-agent.md # Custom agent
└── README.mdyaml--- name: my-skill description: | When to activate this skill. Include trigger phrases so Claude knows when to use it. Be specific about the problem it solves. allowed-tools: Read, Write, Edit, Bash(npm:*) version: 1.0.0 author: Your Name <you@example.com> license: MIT compatible-with: claude-code tags: [category, topic] --- # Skill Title ## Overview What this skill does and when to use it. ## Prerequisites - Claude Code installed - Understanding of Markdown and YAML frontmatter - For MCP servers: Node.js 18+ and `@modelcontextprotocol/sdk` ## Instructions Step-by-step instructions Claude follows when this skill activates. ### Step 1: Do the thing Explain what to do with code examples. ## Output What the user should expect when this skill runs. ## Error Handling | Error | Cause | Solution | |-------|-------|----------| | ... | ... | ... |
yaml--- name: my-command description: "Run my custom workflow" user-invocable: true argument-hint: "<file-path>" allowed-tools: Read, Write, Edit, Bash(npm:*) version: 1.0.0 --- # /my-command When the user runs `/my-command <file-path>`, do the following: 1. Read the file at $ARGUMENTS 2. Analyze it for issues 3. Report findings
yaml--- name: my-agent description: "Specialized agent for code review" capabilities: ["code-review", "security-audit"] model: sonnet maxTurns: 10 --- # Code Review Agent You are a code review specialist. When invoked: 1. Read the files provided 2. Check for security issues, code quality, and performance 3. Report findings with specific line references
typescript// src/index.ts #!/usr/bin/env node import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; const server = new Server({ name: 'my-tools', version: '1.0.0' }, { capabilities: { tools: {} }, }); server.setRequestHandler('tools/list', async () => ({ tools: [{ name: 'search_docs', description: 'Search documentation for a query', inputSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'], }, }], })); server.setRequestHandler('tools/call', async (request) => { if (request.params.name === 'search_docs') { const results = await searchDocs(request.params.arguments.query); return { content: [{ type: 'text', text: JSON.stringify(results) }] }; } }); const transport = new StdioServerTransport(); await server.connect(transport);
json// .claude/settings.json { "hooks": { "pre-tool-call": [{ "matcher": "Edit", "command": "echo 'About to edit a file'" }], "post-tool-call": [{ "matcher": "Bash", "command": "echo 'Bash command completed'" }] } }
| Variable | Context | Resolves To | |----------|---------|-------------| | ${CLAUDE_SKILL_DIR} | Skills (bash/DCI) | Skill's directory | | ${CLAUDE_PLUGIN_ROOT} | Hooks | Plugin root directory | | ${CLAUDE_PLUGIN_DATA} | Persistent state | Survives updates | | $ARGUMENTS | Commands | User-provided args |
| Condition | Response | |---|---| | Manifest or metadata validation fails | Stop installation, correct the declared contract, and rerun validation. | | Plugin requests unapproved capability | Remove or narrowly justify the capability before release. | | MCP server fails or returns malformed data | Fail closed, redact diagnostic output, and preserve a correlation ID. | | Upgrade changes plugin behavior | Disable or pin the new version and restore the last tested release. |
Produce a plugin architecture record identifying the chosen extension point, manifest version, declared tools/permissions, test evidence, release owner, and rollback procedure. Treat a rendered example as illustrative only; the validated manifest and runtime behavior are the operative contract.
See Building a Skill (SKILL.md), Building a Slash Command, Building an Agent, Building an MCP Server, and Hooks configuration examples above.
See clade-multi-env-setup for managing plugins across environments.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 17,761 | 15,594 | -12% | 1 | 1 | 0% | 2,915 | 3,178 | +9% | 0 | 0 | — |
case-02 | fail→pass | 16,763 | 13,200 | -21% | 1 | 1 | 0% | 2,820 | 3,666 | +30% | 0 | 0 | — |
case-03 | fail→pass | 15,496 | 9,640 | -38% | 1 | 1 | 0% | 3,093 | 3,216 | +4% | 0 | 0 | — |
case-04 | fail→pass | 8,947 | 4,089 | -54% | 1 | 1 | 0% | 1,383 | 1,799 | +30% | 0 | 0 | — |
case-05 | fail→pass | 4,938 | 2,722 | -45% | 1 | 1 | 0% | 820 | 1,709 | +108% | 0 | 0 | — |
case-06 | fail→pass | 12,043 | 5,154 | -57% | 1 | 1 | 0% | 1,965 | 2,070 | +5% | 0 | 0 | — |
case-07 | pass→pass | 13,179 | 2,508 | -81% | 1 | 1 | 0% | 2,391 | 1,591 | -33% | 0 | 0 | — |
case-08 | pass→pass | 16,379 | 3,357 | -80% | 1 | 1 | 0% | 1,608 | 1,836 | +14% | 0 | 0 | — |
case-09 | pass→pass | 10,777 | 3,883 | -64% | 1 | 1 | 0% | 1,666 | 1,832 | +10% | 0 | 0 | — |
case-10 | fail→pass | 18,824 | 2,369 | -87% | 1 | 1 | 0% | 3,340 | 1,557 | -53% | 0 | 0 | — |
case-11 | pass→pass | 12,830 | 3,494 | -73% | 1 | 1 | 0% | 1,852 | 1,692 | -9% | 0 | 0 | — |
case-12 | fail→pass | 12,026 | 3,246 | -73% | 1 | 1 | 0% | 1,953 | 1,798 | -8% | 0 | 0 | — |
case-13 | pass→pass | 6,040 | 2,988 | -51% | 1 | 1 | 0% | 968 | 1,675 | +73% | 0 | 0 | — |
case-14 | pass→pass | 6,056 | 6,126 | +1% | 1 | 1 | 0% | 1,077 | 1,800 | +67% | 0 | 0 | — |
case-15 | pass→pass | 4,893 | 2,990 | -39% | 1 | 1 | 0% | 844 | 1,729 | +105% | 0 | 0 | — |
case-20 | pass→pass | 3,589 | 2,656 | -26% | 1 | 1 | 0% | 506 | 1,649 | +226% | 0 | 0 | — |
case-16 | fail→pass | 18,940 | 3,494 | -82% | 1 | 1 | 0% | 2,094 | 1,880 | -10% | 0 | 0 | — |
case-17 | pass→pass | 10,823 | 2,320 | -79% | 1 | 1 | 0% | 1,951 | 1,610 | -17% | 0 | 0 | — |
case-18 | pass→pass | 7,045 | 2,792 | -60% | 1 | 1 | 0% | 1,316 | 1,600 | +22% | 0 | 0 | — |
case-19 | fail→pass | 7,560 | 2,504 | -67% | 1 | 1 | 0% | 1,322 | 1,654 | +25% | 0 | 0 | — |
case-21 | pass→pass | 2,848 | 3,060 | +7% | 1 | 1 | 0% | 408 | 1,601 | +292% | 0 | 0 | — |
case-22 | pass→pass | 3,713 | 4,291 | +16% | 1 | 1 | 0% | 566 | 1,860 | +229% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +45 percentage points is the difference between those two pass rates over the 22 comparable cases.
The publisher has shipped newer versions since this run, so these numbers describe v1, not the version currently listed.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.