| name | recipe |
| description | Parameterized YAML workflow recipes — create, run, list, and compose shareable automation packages with typed inputs, sub-recipes, and extension bundling (inspired by Goose) |
| type | skill |
| triggers | ["/recipe","When user asks to create, run, or manage workflow recipes","When user wants to package a repeatable workflow"] |
Recipe System for Claude Code
Recipes are parameterized, composable, shareable YAML workflow definitions.
They package instructions + required tools + typed parameters + sub-recipes into portable automation units.
Recipe Schema
version: "1.0"
title: "Human-readable recipe name"
description: "What this recipe does"
author: "creator name"
tags: ["domain", "category"]
parameters:
- key: param_name
input_type: string | number | boolean | select | file
description: "What this parameter controls"
requirement: required | optional
default: "default value"
options: ["a", "b", "c"]
requires:
mcp_servers: ["github", "filesystem"]
skills: ["security-review"]
cli_tools: ["ruff", "trivy"]
sub_recipes:
- name: "step_name"
path: "./sub/step.yaml"
params:
inherited_param: "{{ parent_param }}"
routing:
agent: "security-engineer"
authority: "L2"
risk_tier: "T1"
fallback: "code-reviewer"
prompt: |
Execute the following workflow:
Target: {{ target }}
Depth: {{ depth }}
Steps:
1. First do X
2. Then do Y
3. Finally verify Z
Recipe Directory
All recipes stored in ~/.claude/recipes/:
~/.claude/recipes/
lib/ # Shared utilities (recipe-runner.sh)
sub/ # Reusable sub-recipes
security/ # Security domain recipes
engineering/ # Engineering domain recipes
trading/ # Trading domain recipes
README.md # Recipe catalog
Commands
Create a Recipe
/recipe create <name>
Interactive recipe builder:
- Ask for title, description, tags
- Ask for parameters (name, type, required/optional, default)
- Ask for required MCP servers and skills
- Ask for agent routing preferences
- Ask for the prompt template
- Write YAML to
~/.claude/recipes/<domain>/<name>.yaml
Run a Recipe
/recipe run <name> [--param key=value ...]
Execution flow:
- Load recipe YAML from
~/.claude/recipes/
- Validate all required parameters are provided (prompt for missing ones)
- Resolve
{{ param }} placeholders in prompt
- Verify required MCP servers are available
- Verify required skills exist
- Load sub-recipes recursively (max depth 3)
- Route to specified agent or execute directly
- Track execution in
~/.claude/recipes/lib/history.jsonl
List Recipes
/recipe list [--domain <domain>] [--tag <tag>]
Show all available recipes with their parameters and descriptions.
Convert Skill to Recipe
/recipe convert <skill-name>
Read an existing SKILL.md file and generate a parameterized recipe YAML from it:
- Extract the skill's triggers and description
- Identify implicit parameters (things the skill expects the user to provide)
- Map skill's MCP server usage to
requires.mcp_servers
- Generate the recipe YAML
- Preserve the original skill (recipes complement, don't replace)
Execution Rules
- Parameter validation first — never execute with missing required params
- Tool verification — confirm MCP servers are active before running
- Sub-recipe depth limit — max 3 levels of nesting
- History tracking — log every execution with params, duration, outcome
- Template safety — sanitize parameter values before interpolation (no command injection)
- Composability — sub-recipes can reference other sub-recipes
- Idempotency — recipes should be safe to re-run (document exceptions)
Parameter Resolution Order
- CLI
--param key=value arguments (highest priority)
- Recipe
default values
- Interactive prompt for missing required params
- Environment variables matching
RECIPE_<KEY> pattern
Example: Security Audit Recipe
version: "1.0"
title: "Security Audit Pipeline"
description: "Full security audit: dependency scan, SAST, secrets detection, container scan"
author: "<your-name>"
tags: ["security", "audit", "ci"]
parameters:
- key: target_path
input_type: string
description: "Path to scan (relative or absolute)"
requirement: required
default: "."
- key: scan_depth
input_type: select
description: "How thorough the scan should be"
requirement: optional
default: "standard"
options: ["quick", "standard", "deep"]
- key: fix_issues
input_type: boolean
description: "Auto-fix safe issues"
requirement: optional
default: false
requires:
mcp_servers: ["filesystem"]
[]
[, , , ]
{{ }}
{{ }}
{{ }}
{ }
{ }