8.4 KiB
Claude Code Integration Patterns
Formal patterns for integrating Claude Code features (agents, MCP tools, skills) in subagent prompts.
1. Subagent Composition
Pattern:
agent(type, description) :: Context → Output
Semantics:
agent(type, desc) =
invoke_task_tool(subagent_type: type, prompt: desc) ∧
await_completion ∧
return output
Usage in prompt:
agent(project-planner,
"Create detailed TDD implementation plan for: ${objectives}\n" +
"Scope: ${scope}\n" +
"Constraints: ${constraints}"
) → plan
Actual invocation (Claude Code):
Task(subagent_type="project-planner", description=f"Create detailed TDD...")
Declaration:
agents_required :: [AgentType]
agents_required = [project-planner, stage-executor, ...]
Best practices:
- Declare all agents in dependencies section
- Pass context explicitly via description string
- Use meaningful variable names for outputs (→ plan, → result)
- Handle agent failures with conditional logic
Example:
generate_plan :: Requirements → Plan
generate_plan(req) =
agent(project-planner, "Create plan for: ${req.objectives}") → plan ∧
validate_plan(plan) ∧
return plan
2. MCP Tool Integration
Pattern:
mcp::tool_name(params) :: → Data
Semantics:
mcp::tool_name(p) =
direct_invocation(mcp__namespace__tool_name, p) ∧
handle_result ∧
return data
Usage in prompt:
mcp::query_tool_errors(limit: 20) → recent_errors
mcp::query_summaries() → summaries
mcp::query_user_messages(pattern: ".*bug.*") → bug_reports
Actual invocation (Claude Code):
mcp__meta_cc__query_tool_errors(limit=20)
mcp__meta_cc__query_summaries()
mcp__meta_cc__query_user_messages(pattern=".*bug.*")
Declaration:
mcp_tools_required :: [ToolName]
mcp_tools_required = [
mcp__meta-cc__query_tool_errors,
mcp__meta-cc__query_summaries,
mcp__meta-cc__query_user_messages
]
Best practices:
- Use mcp:: prefix for clarity
- Declare all MCP tools in dependencies section
- Specify full tool name in declaration (mcp__namespace__tool)
- Handle empty results gracefully
- Limit result sizes with parameters
Example:
error_analysis :: Execution → ErrorReport
error_analysis(exec) =
mcp::query_tool_errors(limit: 20) → recent_errors ∧
if |recent_errors| > 0 then
categorize(recent_errors) ∧
suggest_fixes(recent_errors)
else
report("No errors found")
3. Skill Reference
Pattern:
skill(name) :: Context → Result
Semantics:
skill(name) =
invoke_skill_tool(command: name) ∧
await_completion ∧
return guidelines
Usage in prompt:
skill(testing-strategy) → test_guidelines
skill(code-refactoring) → refactor_patterns
skill(methodology-bootstrapping) → baime_framework
Actual invocation (Claude Code):
Skill(command="testing-strategy")
Skill(command="code-refactoring")
Skill(command="methodology-bootstrapping")
Declaration:
skills_required :: [SkillName]
skills_required = [testing-strategy, code-refactoring, ...]
Best practices:
- Reference skill by name (kebab-case)
- Declare all skills in dependencies section
- Use skill guidelines to inform agent decisions
- Skills provide context, not direct execution
- Apply skill patterns via agent logic
Example:
enhance_tests :: CodeArtifact → ImprovedTests
enhance_tests(code) =
skill(testing-strategy) → guidelines ∧
current_coverage = analyze_coverage(code) ∧
gaps = identify_gaps(code, guidelines) ∧
generate_tests(gaps, guidelines)
4. Resource Loading
Pattern:
read(path) :: Path → Content
Semantics:
read(p) =
load_file(p) ∧
parse_content ∧
return content
Usage in prompt:
read("docs/plan.md") → plan_doc
read("iteration_{n-1}.md") → previous_iteration
read("TODO.md") → tasks
Actual invocation (Claude Code):
Read(file_path="docs/plan.md")
Read(file_path=f"iteration_{n-1}.md")
Read(file_path="TODO.md")
Best practices:
- Use relative paths when possible
- Handle file not found errors
- Parse structured content (markdown, JSON)
- Extract relevant sections only
- Cache frequently accessed files
Example:
load_context :: IterationNumber → Context
load_context(n) =
if n > 0 then
read(f"iteration_{n-1}.md") → prev ∧
extract_state(prev)
else
initial_state()
5. Combined Integration
Pattern: Multiple feature types in single prompt
Example (phase-planner-executor):
execute_phase :: FeatureSpec → PhaseReport
execute_phase(spec) =
# Agent composition
plan = agent(project-planner, spec.objectives) →
# Sequential agent execution
∀stage_num ∈ [1..|plan.stages|]:
result = agent(stage-executor, plan.stages[stage_num]) →
# MCP tool integration for error analysis
if result.status == "error" then
errors = mcp::query_tool_errors(limit: 20) →
analysis = analyze(errors) →
return (plan, results, analysis)
# Final reporting
report(plan, results, quality_check, progress_tracking)
Integration score: 4 features (2 agents + 2 MCP tools) → 0.75
Best practices:
- Use ≥3 features for high integration score (≥0.75)
- Combine patterns appropriately (orchestration + analysis)
- Declare all dependencies upfront
- Handle failures at integration boundaries
- Maintain compactness despite multiple integrations
6. Conditional Integration
Pattern: Feature usage based on runtime conditions
Example:
execute_with_monitoring :: Task → Result
execute_with_monitoring(task) =
result = agent(executor, task) →
if result.status == "error" then
# Conditional MCP integration
errors = mcp::query_tool_errors(limit: 10) →
recent_patterns = mcp::query_summaries() →
enhanced_diagnosis = combine(errors, recent_patterns)
else if result.needs_improvement then
# Conditional skill reference
guidelines = skill(code-refactoring) →
suggestions = apply_guidelines(result, guidelines)
else
result
Benefits:
- Resource-efficient (only invoke when needed)
- Clearer error handling
- Adaptive behavior
Integration Complexity Matrix
| Features | Integration Score | Complexity | Example |
|---|---|---|---|
| 1 agent | 0.25 | Low | Simple executor |
| 2 agents | 0.50 | Medium | Planner + executor |
| 2 agents + 1 MCP | 0.60 | Medium-High | Executor + error query |
| 2 agents + 2 MCP | 0.75 | High | phase-planner-executor |
| 3 agents + 2 MCP + 1 skill | 0.90 | Very High | Complex orchestration |
Recommendation: Target 0.50-0.75 for maintainability
Dependencies Section Template
## Dependencies
agents_required :: [AgentType]
agents_required = [
agent-type-1,
agent-type-2,
...
]
mcp_tools_required :: [ToolName]
mcp_tools_required = [
mcp__namespace__tool_1,
mcp__namespace__tool_2,
...
]
skills_required :: [SkillName]
skills_required = [
skill-name-1,
skill-name-2,
...
]
Rules:
- All sections optional (omit if not used)
- List all features used in prompt
- Use correct naming conventions (kebab-case for skills/agents, mcp__namespace__tool for MCP)
- Order: agents, MCP tools, skills
Error Handling Patterns
Agent Failure
result = agent(executor, task) →
if result.status == "error" then
error_analysis(result) →
return (partial_result, error_report)
MCP Tool Empty Results
data = mcp::query_tool(params) →
if |data| == 0 then
return "No data available for analysis"
else
process(data)
Skill Not Available
guidelines = skill(optional-skill) →
if guidelines.available then
apply(guidelines)
else
use_default_approach()
Validation Criteria
Integration quality checklist:
- All features declared in dependencies section
- Feature invocations use correct syntax
- Error handling at integration boundaries
- Integration score ≥0.50
- Compactness maintained despite integrations
- Clear separation between feature types
- Meaningful variable names for outputs
Related Resources
- Patterns:
patterns.md(orchestration, analysis, enhancement patterns) - Symbolic Language:
symbolic-language.md(formal syntax) - Template:
../templates/subagent-template.md(includes dependencies section) - Example:
../examples/phase-planner-executor.md(2 agents + 2 MCP tools)