1. Project Overview & Quickstart (luongnv89/claude-howto)
File: README.md
🌐 Language / Ngôn ngữ / 语言 / Мова: English | Tiếng Việt | 中文 | Українська | 日本語
Master Claude Code in a Weekend
Go from typing claude to orchestrating agents, hooks, skills, and MCP servers — with visual tutorials, copy-paste templates, and a guided learning path.
Get Started in 15 Minutes | Find Your Level | Browse the Feature Catalog
Table of Contents
- The Problem
- How Claude How To Fixes This
- How It Works
- Not Sure Where to Start?
- Get Started in 15 Minutes
- What Can You Build With This?
- FAQ
- Contributing
- License
The Problem
You installed Claude Code. You ran a few prompts. Now what?
- The official docs describe features — but don't show you how to combine them. You know slash commands exist, but not how to chain them with hooks, memory, and subagents into a workflow that actually saves hours.
- There's no clear learning path. Should you learn MCP before hooks? Skills before subagents? You end up skimming everything and mastering nothing.
- Examples are too basic. A "hello world" slash command doesn't help you build a production code review pipeline that uses memory, delegates to specialized agents, and runs security scans automatically.
You're leaving 90% of Claude Code's power on the table — and you don't know what you don't know.
How Claude How To Fixes This
This isn't another feature reference. It's a structured, visual, example-driven guide that teaches you to use every Claude Code feature with real-world templates you can copy into your project today.
| Official Docs | This Guide | |
|---|---|---|
| Format | Reference documentation | Visual tutorials with Mermaid diagrams |
| Depth | Feature descriptions | How it works under the hood |
| Examples | Basic snippets | Production-ready templates you use immediately |
| Structure | Feature-organized | Progressive learning path (beginner to advanced) |
| Onboarding | Self-directed | Guided roadmap with time estimates |
| Self-Assessment | None | Interactive quizzes to find your gaps and build a personalized path |
What you get:
- 10 tutorial modules covering every Claude Code feature — from slash commands to custom agent teams
- Copy-paste configs — slash commands, CLAUDE.md templates, hook scripts, MCP configs, subagent definitions, and full plugin bundles
- Mermaid diagrams showing how each feature works internally, so you understand why, not just how
- A guided learning path that takes you from beginner to power user in 11-13 hours
- Built-in self-assessment — run
/self-assessmentor/lesson-quiz hooksdirectly in Claude Code to identify gaps
How It Works
1. Find your level
Take the self-assessment quiz or run /self-assessment in Claude Code. Get a personalized roadmap based on what you already know.
2. Follow the guided path
Work through 10 modules in order — each builds on the last. Copy templates directly into your project as you learn.
3. Combine features into workflows
The real power is in combining features. Learn to wire slash commands + memory + subagents + hooks into automated pipelines that handle code reviews, deployments, and documentation generation.
4. Test your understanding
Run /lesson-quiz [topic] after each module. The quiz pinpoints what you missed so you can fill gaps fast.
Trusted by Developers
- GitHub stars from developers who use Claude Code daily
- Forks from teams adapting this guide for their own workflows
- Actively maintained — synced with every Claude Code release (latest: v2.1.235, August 2026)
- Community-driven — contributions from developers who share their real-world configurations
Not Sure Where to Start?
Take the self-assessment or pick your level:
| Level | You can... | Start here | Time |
|---|---|---|---|
| Beginner | Start Claude Code and chat | Slash Commands | ~2.5 hours |
| Intermediate | Use CLAUDE.md and custom commands | Skills | ~3.5 hours |
| Advanced | Configure MCP servers and hooks | Advanced Features | ~5 hours |
Full learning path with all 10 modules:
| Order | Module | Level | Time |
|---|---|---|---|
| 1 | Slash Commands | Beginner | 30 min |
| 2 | Memory | Beginner+ | 45 min |
| 3 | Checkpoints | Intermediate | 45 min |
| 4 | CLI Basics | Beginner+ | 30 min |
| 5 | Skills | Intermediate | 1 hour |
| 6 | Hooks | Intermediate | 1 hour |
| 7 | MCP | Intermediate+ | 1 hour |
| 8 | Subagents | Intermediate+ | 1.5 hours |
| 9 | Advanced Features | Advanced | 2-3 hours |
| 10 | Plugins | Advanced | 2 hours |
Get Started in 15 Minutes
Installation note: Starting in v2.1.113, Claude Code ships as a native per-platform binary (macOS/Linux/Windows).
npm install @anthropic-ai/claude-codestill works — the native binary is downloaded as an optional dep on first use. As of v2.1.116, downloads come fromhttps://downloads.claude.ai/claude-code-releases— corporate proxies must allowlist this host.
# 1. Clone the guide
git clone https://github.com/luongnv89/claude-howto.git
cd claude-howto
# 2. Copy your first slash command
mkdir -p /path/to/your-project/.claude/commands
cp 01-slash-commands/optimize.md /path/to/your-project/.claude/commands/
# 3. Try it — in Claude Code, type:
# /optimize
# 4. Ready for more? Set up project memory:
cp 02-memory/project-CLAUDE.md /path/to/your-project/CLAUDE.md
# 5. Install a skill:
cp -r 03-skills/code-review-specialist ~/.claude/skills/Want the full setup? Here's the 1-hour essential setup:
# Slash commands (15 min)
cp 01-slash-commands/*.md .claude/commands/
# Project memory (15 min)
cp 02-memory/project-CLAUDE.md ./CLAUDE.md
# Install a skill (15 min)
cp -r 03-skills/code-review-specialist ~/.claude/skills/
# Weekend goal: add hooks, subagents, MCP, and plugins
# Follow the learning path for guided setupView the Full Installation Reference
What Can You Build With This?
| Use Case | Features You'll Combine |
|---|---|
| Automated Code Review | Slash Commands + Subagents + Memory + MCP |
| Team Onboarding | Memory + Slash Commands + Plugins |
| CI/CD Automation | CLI Reference + Hooks + Background Tasks |
| Documentation Generation | Skills + Subagents + Plugins |
| Security Audits | Subagents + Skills + Hooks (read-only mode) |
| DevOps Pipelines | Plugins + MCP + Hooks + Background Tasks |
| Complex Refactoring | Checkpoints + Planning Mode + Hooks |
FAQ
Is this free?
Yes. MIT licensed, free forever. Use it in personal projects, at work, in your team — no restrictions beyond including the license notice.
Is this maintained?
Actively. The guide is synced with every Claude Code release. Current version: v2.1.220 (July 2026), compatible with Claude Code 2.1+.
How is this different from the official docs?
The official docs are a feature reference. This guide is a tutorial with diagrams, production-ready templates, and a progressive learning path. They complement each other — start here to learn, reference the docs when you need specifics.
How long does it take to go through everything?
11-13 hours for the full path. But you'll get immediate value in 15 minutes — just copy a slash command template and try it.
Can I use this with Claude Sonnet / Haiku / Opus?
Yes. All templates work with Claude Opus 5, Claude Sonnet 5, Claude Sonnet 4.6, Claude Opus 4.8, and Claude Haiku 4.5.
Can I contribute?
Absolutely. See CONTRIBUTING.md for guidelines. We welcome new examples, bug fixes, documentation improvements, and community templates.
Can I read this offline?
Yes. Run uv run scripts/build_epub.py to generate an EPUB ebook with all content and rendered diagrams.
Start Mastering Claude Code Today
You already have Claude Code installed. The only thing between you and 10x productivity is knowing how to use it. This guide gives you the structured path, the visual explanations, and the copy-paste templates to get there.
MIT licensed. Free forever. Clone it, fork it, make it yours.
Start the Learning Path -> | Browse the Feature Catalog | Get Started in 15 Minutes
Quick Navigation — All Features
| Feature | Description | Folder |
|---|---|---|
| Feature Catalog | Complete reference with installation commands | CATALOG.md |
| Slash Commands | User-invoked shortcuts | 01-slash-commands/ |
| Memory | Persistent context | 02-memory/ |
| Skills | Reusable capabilities | 03-skills/ |
| Subagents | Specialized AI assistants | 04-subagents/ |
| MCP Protocol | External tool access | 05-mcp/ |
| Hooks | Event-driven automation | 06-hooks/ |
| Plugins | Bundled features | 07-plugins/ |
| Checkpoints | Session snapshots & rewind | 08-checkpoints/ |
| Advanced Features | Planning, thinking, background tasks | 09-advanced-features/ |
| CLI Reference | Commands, flags, and options | 10-cli/ |
| Blog Posts | Real-world usage examples | Blog Posts |
Feature Comparison
| Feature | Invocation | Persistence | Best For |
|---|---|---|---|
| Slash Commands | Manual (/cmd) |
Session only | Quick shortcuts |
| Memory | Auto-loaded | Cross-session | Long-term learning |
| Skills | Auto-invoked | Filesystem | Automated workflows |
| Subagents | Auto-delegated | Isolated context | Task distribution |
| MCP Protocol | Auto-queried | Real-time | Live data access |
| Hooks | Event-triggered | Configured | Automation & validation |
| Plugins | One command | All features | Complete solutions |
| Checkpoints | Manual/Auto | Session-based | Safe experimentation |
| Planning Mode | Manual/Auto | Plan phase | Complex implementations |
| Background Tasks | Manual | Task duration | Long-running operations |
| CLI Reference | Terminal commands | Session/Script | Automation & scripting |
Installation Quick Reference
# Slash Commands
cp 01-slash-commands/*.md .claude/commands/
# Memory
cp 02-memory/project-CLAUDE.md ./CLAUDE.md
# Skills
cp -r 03-skills/code-review-specialist ~/.claude/skills/
# Subagents
cp 04-subagents/*.md .claude/agents/
# MCP
export GITHUB_TOKEN="token"
claude mcp add github -- npx -y @modelcontextprotocol/server-github
# Hooks
mkdir -p ~/.claude/hooks
cp 06-hooks/*.sh ~/.claude/hooks/
chmod +x ~/.claude/hooks/*.sh
# Plugins
/plugin install pr-review
# Checkpoints (auto-enabled, configure in settings)
# See 08-checkpoints/README.md
# Advanced Features (configure in settings)
# See 09-advanced-features/config-examples.json
# CLI Reference (no installation needed)
# See 10-cli/README.md for usage examples- Slash Commands
Location: 01-slash-commands/
What: User-invoked shortcuts stored as Markdown files
Examples:
optimize.md- Code optimization analysispr.md- Pull request preparationgenerate-api-docs.md- API documentation generator
Installation:
cp 01-slash-commands/*.md /path/to/project/.claude/commands/Usage:
/optimize
/pr
/generate-api-docsLearn More: Discovering Claude Code Slash Commands
- Memory
Location: 02-memory/
What: Persistent context across sessions
Examples:
project-CLAUDE.md- Team-wide project standardsdirectory-api-CLAUDE.md- Directory-specific rulespersonal-CLAUDE.md- Personal preferences
Installation:
# Project memory
cp 02-memory/project-CLAUDE.md /path/to/project/CLAUDE.md
# Directory memory
cp 02-memory/directory-api-CLAUDE.md /path/to/project/src/api/CLAUDE.md
# Personal memory
cp 02-memory/personal-CLAUDE.md ~/.claude/CLAUDE.mdUsage: Automatically loaded by Claude
- Skills
Location: 03-skills/
What: Reusable, auto-invoked capabilities with instructions and scripts
Examples:
code-review-specialist/- Comprehensive code review with scriptsbrand-voice/- Brand voice consistency checkerdoc-generator/- API documentation generator
Installation:
# Personal skills
cp -r 03-skills/code-review-specialist ~/.claude/skills/
# Project skills
cp -r 03-skills/code-review-specialist /path/to/project/.claude/skills/Usage: Automatically invoked when relevant
- Subagents
Location: 04-subagents/
What: Specialized AI assistants with isolated contexts and custom prompts
Examples:
code-reviewer.md- Comprehensive code quality analysistest-engineer.md- Test strategy and coveragedocumentation-writer.md- Technical documentationsecure-reviewer.md- Security-focused review (read-only)implementation-agent.md- Full feature implementation
Installation:
cp 04-subagents/*.md /path/to/project/.claude/agents/Usage: Automatically delegated by main agent
- MCP Protocol
Location: 05-mcp/
What: Model Context Protocol for accessing external tools and APIs
Examples:
github-mcp.json- GitHub integrationdatabase-mcp.json- Database queriesfilesystem-mcp.json- File operationsmulti-mcp.json- Multiple MCP servers
Installation:
# Set environment variables
export GITHUB_TOKEN="your_token"
export DATABASE_URL="postgresql://..."
# Add MCP server via CLI
claude mcp add github -- npx -y @modelcontextprotocol/server-github
# Or add to project .mcp.json manually (see 05-mcp/ for examples)Usage: MCP tools are automatically available to Claude once configured
- Hooks
Location: 06-hooks/
What: Event-driven shell commands that execute automatically in response to Claude Code events
Examples:
format-code.sh- Auto-format code before writingpre-commit.sh- Run tests before commitssecurity-scan.sh- Scan for security issueslog-bash.sh- Log all bash commandsvalidate-prompt.sh- Validate user promptsnotify-team.sh- Send notifications on events
Installation:
mkdir -p ~/.claude/hooks
cp 06-hooks/*.sh ~/.claude/hooks/
chmod +x ~/.claude/hooks/*.shConfigure hooks in ~/.claude/settings.json:
{
"hooks": {
"PreToolUse": [{
"matcher": "Write",
"hooks": ["~/.claude/hooks/format-code.sh"]
}],
"PostToolUse": [{
"matcher": "Write",
"hooks": ["~/.claude/hooks/security-scan.sh"]
}]
}
}Usage: Hooks execute automatically on events
Hook Types (5): command, http, prompt, mcp_tool, agent — how a hook runs.
Hook Events (31, in 4 categories) — when it runs:
- Tool Hooks:
PreToolUse,PostToolUse,PostToolUseFailure,PostToolBatch,PermissionRequest,PermissionDenied - Session Hooks:
SessionStart,Setup,SessionEnd,Stop,StopFailure,SubagentStart,SubagentStop - Task Hooks:
UserPromptSubmit,UserPromptExpansion,MessageDisplay,TaskCompleted,TaskCreated,TeammateIdle—TaskCompletedandTaskCreatedonly fire when the todo tools are enabled, which is off by default on Opus 4.8, Sonnet 5, Fable 5, Mythos 5, and newer models (CLAUDE_CODE_ENABLE_TODO_TOOLS=1restores them) - Lifecycle Hooks:
ConfigChange,CwdChanged,DirectoryAdded,FileChanged,PreCompact,PostCompact,WorktreeCreate,WorktreeRemove,Notification,InstructionsLoaded,Elicitation,ElicitationResult
- Plugins
Location: 07-plugins/
What: Bundled collections of commands, agents, MCP, and hooks
Examples:
pr-review/- Complete PR review workflowdevops-automation/- Deployment and monitoringdocumentation/- Documentation generation
Installation:
/plugin install pr-review
/plugin install devops-automation
/plugin install documentationUsage: Use bundled slash commands and features
- Checkpoints and Rewind
Location: 08-checkpoints/
What: Save conversation state and rewind to previous points to explore different approaches
Key Concepts:
- Checkpoint: Snapshot of conversation state
- Rewind: Return to previous checkpoint
- Branch Point: Explore multiple approaches from same checkpoint
Usage:
# Checkpoints are created automatically with every user prompt
# To rewind, press Esc twice or use:
/rewind
# Then choose from five options:
# 1. Restore code and conversation
# 2. Restore conversation
# 3. Restore code
# 4. Summarize from here
# 5. Never mindUse Cases:
- Try different implementation approaches
- Recover from mistakes
- Safe experimentation
- Compare alternative solutions
- A/B testing different designs
- Advanced Features
Location: 09-advanced-features/
What: Advanced capabilities for complex workflows and automation
Includes:
- Planning Mode — Create detailed implementation plans before coding
- Extended Thinking — Deep reasoning for complex problems (toggle with
Alt+T/Option+T) - Background Tasks — Run long operations without blocking
- Permission Modes —
manual(formerlydefault;defaultstill accepted),acceptEdits,plan,auto,dontAsk,bypassPermissions - Headless Mode — Run Claude Code in CI/CD:
claude -p "Run tests and generate report" - Session Management —
/resume,/rename,/fork,/branch,claude -c,claude -r - Configuration — Customize behavior in
~/.claude/settings.json
See config-examples.json for complete configurations.
- CLI Reference
Location: 10-cli/
What: Complete command-line interface reference for Claude Code
Quick Examples:
# Interactive mode
claude "explain this project"
# Print mode (non-interactive)
claude -p "review this code"
# Process file content
cat error.log | claude -p "explain this error"
# JSON output for scripts
claude -p --output-format json "list functions"
# Resume session
claude -r "feature-auth" "continue implementation"Use Cases: CI/CD pipeline integration, script automation, batch processing, multi-session workflows, custom agent configurations
Example Workflows
Complete Code Review Workflow
# Uses: Slash Commands + Subagents + Memory + MCP
User: /review-pr
Claude:
1. Loads project memory (coding standards)
2. Fetches PR via GitHub MCP
3. Delegates to code-reviewer subagent
4. Delegates to test-engineer subagent
5. Synthesizes findings
6. Provides comprehensive reviewAutomated Documentation
# Uses: Skills + Subagents + Memory
User: "Generate API documentation for the auth module"
Claude:
1. Loads project memory (doc standards)
2. Detects doc generation request
3. Auto-invokes doc-generator skill
4. Delegates to api-documenter subagent
5. Creates comprehensive docs with examplesDevOps Deployment
# Uses: Plugins + MCP + Hooks
User: /deploy production
Claude:
1. Runs pre-deploy hook (validates environment)
2. Delegates to deployment-specialist subagent
3. Executes deployment via Kubernetes MCP
4. Monitors progress
5. Runs post-deploy hook (health checks)
6. Reports statusDirectory Structure
├── 01-slash-commands/
│ ├── optimize.md
│ ├── pr.md
│ ├── generate-api-docs.md
│ └── README.md
├── 02-memory/
│ ├── project-CLAUDE.md
│ ├── directory-api-CLAUDE.md
│ ├── personal-CLAUDE.md
│ └── README.md
├── 03-skills/
│ ├── code-review-specialist/
│ │ ├── SKILL.md
│ │ ├── scripts/
│ │ └── templates/
│ ├── brand-voice/
│ │ ├── SKILL.md
│ │ └── templates/
│ ├── doc-generator/
│ │ ├── SKILL.md
│ │ └── generate-docs.py
│ └── README.md
├── 04-subagents/
│ ├── code-reviewer.md
│ ├── test-engineer.md
│ ├── documentation-writer.md
│ ├── secure-reviewer.md
│ ├── implementation-agent.md
│ └── README.md
├── 05-mcp/
│ ├── github-mcp.json
│ ├── database-mcp.json
│ ├── filesystem-mcp.json
│ ├── multi-mcp.json
│ └── README.md
├── 06-hooks/
│ ├── format-code.sh
│ ├── pre-commit.sh
│ ├── security-scan.sh
│ ├── log-bash.sh
│ ├── validate-prompt.sh
│ ├── notify-team.sh
│ └── README.md
├── 07-plugins/
│ ├── pr-review/
│ ├── devops-automation/
│ ├── documentation/
│ └── README.md
├── 08-checkpoints/
│ ├── checkpoint-examples.md
│ └── README.md
├── 09-advanced-features/
│ ├── config-examples.json
│ ├── planning-mode-examples.md
│ └── README.md
├── 10-cli/
│ └── README.md
└── README.md (this file)Best Practices
Do's
- Start simple with slash commands
- Add features incrementally
- Use memory for team standards
- Test configurations locally first
- Document custom implementations
- Version control project configurations
- Share plugins with team
Don'ts
- Don't create redundant features
- Don't hardcode credentials
- Don't skip documentation
- Don't over-complicate simple tasks
- Don't ignore security best practices
- Don't commit sensitive data
Troubleshooting
Feature Not Loading
- Check file location and naming
- Verify YAML frontmatter syntax
- Check file permissions
- Review Claude Code version compatibility
MCP Connection Failed
- Verify environment variables
- Check MCP server installation
- Test credentials
- Review network connectivity
Subagent Not Delegating
- Check tool permissions
- Verify agent description clarity
- Review task complexity
- Test agent independently
Testing
This project includes comprehensive automated testing:
- Unit Tests: Python tests using pytest (Python 3.10, 3.11, 3.12)
- Code Quality: Linting and formatting with Ruff
- Security: Vulnerability scanning with Bandit
- Type Checking: Static type analysis with mypy
- Build Verification: EPUB generation testing
- Coverage Tracking: Codecov integration
# Install development dependencies
uv pip install -r requirements-dev.txt
# Run all unit tests
pytest scripts/tests/ -v
# Run tests with coverage report
pytest scripts/tests/ -v --cov=scripts --cov-report=html
# Run code quality checks
ruff check scripts/
ruff format --check scripts/
# Run security scan
bandit -c pyproject.toml -r scripts/ --exclude scripts/tests/
# Run type checking
mypy scripts/ --ignore-missing-importsTests run automatically on every push to main/develop and every PR to main. See TESTING.md for detailed information.
EPUB Generation
Want to read this guide offline? Generate an EPUB ebook:
uv run scripts/build_epub.pyThis creates claude-howto-guide.epub with all content, including rendered Mermaid diagrams.
See scripts/README.md for more options.
Contributing
Found an issue or want to contribute an example? We'd love your help!
Please read CONTRIBUTING.md for detailed guidelines on:
- Types of contributions (examples, docs, features, bugs, feedback)
- How to set up your development environment
- Directory structure and how to add content
- Writing guidelines and best practices
- Commit and PR process
Our Community Standards:
- CODE_OF_CONDUCT.md - How we treat each other
- SECURITY.md - Security policy and vulnerability reporting
Reporting Security Issues
If you discover a security vulnerability, please report it responsibly:
- Use GitHub Private Vulnerability Reporting: https://github.com/luongnv89/claude-howto/security/advisories
- Or read .github/SECURITY_REPORTING.md for detailed instructions
- Do NOT open a public issue for security vulnerabilities
Quick start:
- Fork and clone the repository
- Create a descriptive branch (
add/feature-name,fix/bug,docs/improvement) - Make your changes following the guidelines
- Submit a pull request with a clear description
Need help? Open an issue or discussion, and we'll guide you through the process.
Additional Resources
- Claude Code Documentation
- MCP Protocol Specification
- Skills Repository - Collection of ready-to-use skills
- Anthropic Cookbook
- Boris Cherny's Claude Code Workflow - The creator of Claude Code shares his systematized workflow: parallel agents, shared CLAUDE.md, Plan mode, slash commands, subagents, and verification hooks for autonomous long-running sessions.
Contributing
We welcome contributions! Please see our Contributing Guide for details on how to get started.
License
MIT License - see LICENSE. Free to use, modify, and distribute. The only requirement is including the license notice.
Last Updated: August 19, 2026
Claude Code Version: 2.1.235
Sources:
- https://code.claude.com/docs/en/hooks
- https://code.claude.com/docs/en/overview
- https://code.claude.com/docs/en/changelog
- https://code.claude.com/docs/en/permission-modes
- https://platform.claude.com/docs/en/about-claude/models/overview
- https://github.com/anthropics/claude-code/releases
- https://github.com/anthropics/claude-code/releases/tag/v2.1.154
- https://code.claude.com/docs/en/model-config
- https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md
Compatible Models: Claude Fable 5, Claude Opus 5, Claude Sonnet 5, Claude Sonnet 4.6, Claude Opus 4.8, Claude Haiku 4.5
File: 01-slash-commands/README.md
Slash Commands
Overview
Slash commands are shortcuts that control Claude's behavior during an interactive session. They come in several types:
- Built-in commands: Provided by Claude Code (
/help,/clear,/model) - Skills: User-defined commands created as
SKILL.mdfiles (/optimize,/pr) - Plugin commands: Commands from installed plugins (
/frontend-design:frontend-design) - MCP prompts: Commands from MCP servers (
/mcp__github__list_prs)
Note: Custom slash commands have been merged into skills. Files in
.claude/commands/still work, but skills (.claude/skills/) are now the recommended approach. Both create/command-nameshortcuts. See the Skills Guide for the full reference.
Built-in Commands Reference
Built-in commands are shortcuts for common actions. There are 60+ built-in commands and 10 bundled skills available. Type / in Claude Code to see the full list, or type / followed by any letters to filter.
| Command | Purpose |
|---|---|
/add-dir |
Add working directory |
/agents |
Manage agent configurations |
/branch [name] |
Switch into a copy of the conversation at this point, preserving the original (return to it with /resume) |
/fork [prompt] |
Copy the current conversation into a new background session and keep working here; the two are independent from that point on and the copy gets its own row in claude agents (v2.1.212+). Except when the copy edits in place, Claude Code instructs it to create a worktree of its own before making code changes (isolation instruction requires v2.1.221+) |
/subtask <task> |
Spawn a forked subagent that inherits the full conversation and works on the task while you keep going; its result returns to this conversation when it finishes (v2.1.212+) |
/btw <question> |
Ask an ephemeral side question while Claude is working on the main task; doesn't pollute the main conversation context |
/cd |
Move the session to a new working directory without breaking the prompt cache (added v2.1.169) |
/chrome |
Configure Chrome browser integration |
/clear |
Clear conversation (aliases: /reset, /new) |
/color [color|default] |
Set prompt bar color. Bare /color (no args) picks a random session color (v2.1.128+); pass a color name or hex to set explicitly. |
/compact [instructions] |
Compact conversation with optional focus instructions. A failed compact now displays as an error in the UI instead of silently doing nothing (v2.1.216) |
/config |
Open Settings (alias: /settings) |
/context |
Visualize context usage as colored grid. Shows an explicit warning when usage is over the context window limit (v2.1.216) |
/copy [N] |
Copy assistant response to clipboard; w writes to file |
/cost |
Typing-shortcut alias for /usage — opens the cost tab (v2.1.118+) |
/desktop |
Continue in Desktop app (alias: /app) |
/diff |
Interactive diff viewer for uncommitted changes |
/doctor |
Diagnose installation health — openable while Claude is responding; shows status icons; press f to auto-fix issues (enhanced in v2.1.116; layout refreshed to a flat tree with clearer icons in v2.1.178) |
/effort [low|medium|high|xhigh|max|auto] |
Set effort level via interactive arrow-key slider. Levels: low → medium → high → xhigh (new in v2.1.111) → max. Default is high on Opus 5, Sonnet 5, and Opus 4.8 (xhigh on Opus 4.7); xhigh needs Opus 5, Sonnet 5, Opus 4.8, or Opus 4.7; max works on Opus 5, Sonnet 5, Opus 4.8/4.7/4.6 and Sonnet 4.6. The menu also offers ultracode (not a model effort level — it sends xhigh and has Claude orchestrate dynamic workflows; session-only) |
/exit |
Exit the REPL (alias: /quit) |
/export [filename] |
Export the current conversation to a file or clipboard |
/usage-credits |
Configure extra usage for rate limits (renamed from /extra-usage in v2.1.144; /extra-usage still works as an alias) |
/fast [on|off] |
Toggle fast mode. Applies to Opus 5 and Opus 4.8 (v2.1.219) |
/feedback |
Submit feedback (alias: /bug). Since v2.1.141, can attach recent sessions (last 24h or 7d) so reports spanning more than one session include context. As of v2.1.178, /bug requires a description before it can be submitted. |
/focus |
Toggle focus view (added v2.1.110; replaces Ctrl+O for focus toggle) |
/goal <statement> |
Register a session-level completion condition; Claude keeps working until the goal is met. /goal clear removes it. Active goal appears in the status line, with a live overlay panel showing elapsed time, turn count, and token usage (added v2.1.139). |
/help |
Show help |
/hooks |
View hook configurations |
/ide |
Manage IDE integrations |
/init |
Initialize CLAUDE.md. Set CLAUDE_CODE_NEW_INIT=1 for interactive flow |
/insights |
Generate session analysis report |
/install-github-app |
Set up GitHub Actions app |
/install-slack-app |
Install Slack app |
/keybindings |
Open keybindings configuration |
/fewer-permission-prompts |
Analyze recent Bash/MCP tool calls and add a prioritized allowlist to .claude/settings.json to reduce permission prompts (added v2.1.111) |
/login |
Switch Anthropic accounts |
/logout |
Sign out from your Anthropic account |
/mcp |
Manage MCP servers and OAuth |
/memory |
Edit CLAUDE.md, toggle auto-memory |
/mobile |
QR code for mobile app (aliases: /ios, /android) |
/model [model] |
Select model with left/right arrows for effort. Since v2.1.153, the choice is saved as the default for new sessions (matching the IDE); press s after selecting to apply it to the current session only. (The keybinding modelPicker:setAsDefault was renamed to modelPicker:thisSessionOnly; the old d action is now s.) As of v2.1.219, the picker shows the merged Opus row as "Opus (1M context)". |
/passes |
Share free week of Claude Code |
/permissions |
View/update permissions (alias: /allowed-tools) |
/plan [description] |
Enter plan mode |
/plugin |
Manage plugins |
/proactive |
Alias for /loop (added v2.1.105) |
/powerup |
Discover features through interactive lessons with animated demos |
/privacy-settings |
Privacy settings (Pro/Max only) |
/release-notes |
View changelog |
/recap |
Show session recap / summary when returning to a session (added v2.1.108) |
/reload-plugins |
Reload active plugins. Since v2.1.221 most installs activate immediately, so this is only needed when the install summary says Run /reload-plugins to activate. |
/reload-skills |
Re-scan skill directories without restarting the session (added v2.1.152) |
/remote-control |
Remote control from claude.ai (alias: /rc) |
/remote-env |
Configure default remote environment |
/rename [name] |
Rename session |
/resume [session] |
Resume conversation (alias: /continue) |
/review [low|medium|high|xhigh|max|ultra] [--fix] [--comment] [pr#|branch|path] |
Alias of /code-review (v2.1.223): reviews the current diff, or a PR number, branch, or path you pass — e.g. /review 1234. Takes the same effort levels and flags. With no level given, it reuses the last low–max level you typed |
/rewind |
Rewind conversation and/or code (alias: /checkpoint) |
/sandbox |
Toggle sandbox mode |
/schedule [description] |
Create/manage Cloud scheduled tasks |
/scroll-speed <+N|-N> |
Tune mouse-wheel scroll speed of the TUI live-preview pane with a live preview. Persists per-machine to ~/.claude/preferences.json (added v2.1.139). |
/security-review |
Analyze branch for security vulnerabilities |
/skills |
List available skills |
/stats |
Typing-shortcut alias for /usage — opens the stats tab (daily usage, sessions, streaks) (v2.1.118+) |
/stickers |
Order Claude Code stickers |
/status |
Show version, model, account, and a Session kind row reading background job · attached, background job · unattended, or interactive (row added v2.1.221). Openable while Claude is responding |
/statusline |
Configure status line |
/tasks |
List/manage background tasks |
/team-onboarding |
Generate a teammate ramp-up guide from the project's Claude Code setup (new in v2.1.101) |
/teleport |
Resume a Claude Code on the web session in this terminal; opens a picker of your web sessions (alias: /tp). Requires a claude.ai subscription |
/terminal-setup |
Configure terminal keybindings |
/theme |
Open theme picker / manage custom themes (v2.1.118). Define custom themes via JSON in ~/.claude/themes/<name>.json |
/tui |
Toggle fullscreen TUI (text user interface) mode with flicker-free rendering (added v2.1.110) |
/ultrareview |
Comprehensive cloud-based multi-agent code review (added v2.1.111). The preferred invocation is now /code-review ultra; /ultrareview remains as an alias. Includes 3 free runs on Pro and Max, then requires usage credits |
/undo |
Alias for /rewind (added v2.1.108) |
/upgrade |
Open upgrade page for higher plan tier |
/usage |
Canonical usage dashboard (v2.1.118) — combines plan usage limits, rate limits, cost, and daily session stats. /cost and /stats are typing-shortcut aliases that open specific tabs |
/voice |
Toggle push-to-talk voice dictation |
/workflows |
View running and completed dynamic workflow runs (added v2.1.154). See Dynamic Workflows |
Why
/cdmatters: changing directories used to lose cache warmth (making the next turn slower and costlier);/cdpreserves the prompt cache across the switch.
Bundled Skills
These skills ship with Claude Code and are invoked like slash commands:
| Skill | Purpose |
|---|---|
/batch |
Orchestrate large-scale parallel changes using worktrees |
/claude-api |
Load Claude API reference for project language |
/dataviz |
Chart and dashboard design guidance with a runnable color-palette validator (v2.1.198) |
/debug [description] |
Enable debug logging |
/loop [interval] |
Run prompt repeatedly on interval |
/code-review [low|medium|high|xhigh|max|ultra] [--fix] [--comment] [pr#|branch|path] |
Review the current diff — or a PR number, branch, or path you pass — for correctness bugs. Pass --fix to apply findings, --comment to post them as inline GitHub PR comments, or ultra to run a deep cloud review; with ultra on a github.com PR target, --post preselects posting the findings to the PR. With no effort level given, the review reuses the last level you typed (v2.1.223). Originally absorbed /simplify in v2.1.146, but /simplify returned as a distinct command in v2.1.154 |
/simplify |
Run a cleanup-only review (reuse / simplification / efficiency / altitude) and apply the fixes; does not hunt for bugs — use /code-review for that. Briefly an alias of /code-review --fix (v2.1.152), it became cleanup-only in v2.1.154 |
Deprecated Commands
| Command | Status |
|---|---|
/output-style |
Removed in v2.1.91 (deprecated v2.1.73) — use /config → Output style, or the outputStyle setting |
/pr-comments |
Removed in v2.1.91 — ask Claude directly to view PR comments |
/vim |
Removed in v2.1.92 — use /config → Editor mode |
Recent Changes
/forkand/subtaskswapped roles in v2.1.212./forknow copies the conversation into a new independent background session; the forked-subagent behavior it used to have moved to the new/subtaskcommand. History:/forkwas an alias for/branchfrom v2.1.77 to v2.1.161; from v2.1.161 to v2.1.211 it started a forked subagent (what/subtaskdoes now). When agent view is turned off,/subtaskis unavailable and/forkkeeps the forked-subagent behavior/resume(no arguments) opens a picker of past sessions — including ones removed from the visible list — and resumes the chosen one as a background session (v2.1.212)/output-styledeprecated (v2.1.73) and removed (v2.1.91) — output styles are still available via/config→ Output style or theoutputStylesetting; the built-ins are Default, Proactive, Explanatory, and Learning/reviewbecame a full alias of/code-review— same targets, effort levels, and flags (v2.1.223). History: it first moved onto the/code-review mediumengine in v2.1.186 while remaining PR-only/effortcommand added;maxlevel available on Opus 4.6+ (originally Opus 4.6-only)/voicecommand added for push-to-talk voice dictation/schedulecommand added for creating/managing scheduled tasks/colorcommand added for prompt bar customization- /pr-comments removed in v2.1.91 — ask Claude directly to view PR comments
- /vim removed in v2.1.92 — use /config → Editor mode instead
/ultraplanwas removed in v2.1.222 — use plan mode instead- /powerup added for interactive feature lessons
- /sandbox added for toggling sandbox mode
/modelpicker now shows human-readable labels (e.g., "Sonnet 4.6") instead of raw model IDs/resumesupports/continuealias- MCP prompts are available as
/mcp__<server>__commands (see MCP Prompts as Commands) /team-onboardingadded for auto-generating teammate ramp-up guides (v2.1.101)/tuicommand added for flicker-free fullscreen TUI rendering (v2.1.110)/focuscommand added for focus view toggle;Ctrl+Onow only toggles verbose transcript (v2.1.110)/recapcommand added to manually trigger session context recap (v2.1.108)/undoadded as alias for/rewind(v2.1.108)/proactiveadded as alias for/loop(v2.1.105)/effortgained interactive arrow-key slider and newxhighlevel betweenhighandmax; default effort raised toxhighfor Opus 4.7 plans (v2.1.111). On Opus 4.8 the default ishigh(v2.1.154); Opus 5 also defaults tohigh(v2.1.219)/ultrareviewadded for comprehensive cloud-based multi-agent code review (v2.1.111)/fewer-permission-promptsadded to analyze Bash/MCP tool calls and reduce permission prompts via an allowlist in.claude/settings.json(v2.1.111)- Auto mode no longer requires the
--enable-auto-modeflag for Max subscribers on Opus 4.7 (v2.1.112) /goaladded — session-level completion condition that Claude works toward across turns; live overlay shows elapsed time, turn count, and token usage (v2.1.139)/scroll-speedadded — tune mouse-wheel scroll speed of the TUI live-preview pane; persists per-machine (v2.1.139)/reload-skillsadded — re-scan skill directories without restarting the session (v2.1.152)/modelnow saves the selected model as the default for new sessions; presssfor session-only (keybindingmodelPicker:setAsDefault→modelPicker:thisSessionOnly) (v2.1.153)/workflowsadded — view running and completed dynamic workflow runs (v2.1.154)/simplifyreturned as a distinct cleanup-only review command (reuse / simplification / efficiency / altitude), separate from/code-review's bug hunt (v2.1.154)/statusgained aSession kindrow distinguishing attached and unattended background jobs from interactive sessions (v2.1.221)- Plugin installs now activate immediately when it is safe to do so;
/reload-pluginsis only needed when the install summary asks for it (v2.1.221) /ultraplanremoved — use plan mode (v2.1.222)/code-reviewand/reviewremember the last effort level you typed when you omit one (v2.1.223)/code-review ultrabecame the preferred entry point for cloud multi-agent review;/ultrareviewstays as an alias (v2.1.223)/code-reviewathigh,xhigh, andmaxeffort now runs in a background agent like the other levels (v2.1.232)- The startup tip suggesting you create custom subagents, and the matching nudge in the
/poweruptour, were removed (v2.1.232) /permissionscan now be opened while Claude is working — rule changes apply to the rest of the current turn (v2.1.234)/add-dircan now be used while Claude is working; the/add-dir,/autocompact,/theme,/help,/config, and/advisordialogs open mid-turn in the fullscreen TUI, instead of queuing until Claude finishes responding (/bugalready opened immediately, since v2.1.232) (v2.1.234)
`/goal` — Session-Level Completion Condition
New in v2.1.139
Use /goal to register a completion condition for the current session. Claude works toward it across turns, and an overlay panel shows elapsed time, turn count, and tokens used. Clear it with /goal clear. Works in interactive mode, claude -p, and Remote Control.
User: /goal Migrate the payments service from REST to gRPC and get the integration tests passing.
Claude: Goal registered. I'll work toward this until you clear it.
[Goal panel: ⏱ 0s · turns 0 · tokens 0]
User: start by listing the REST endpoints
Claude: [does the work, panel updates]Check-in on stalled background tasks (v2.1.234): while a goal is active, if a background task makes no progress for 30+ minutes, Claude checks in with a status update instead of silently continuing. Tune the threshold (in minutes) with the CLAUDE_CODE_GOAL_CHECKIN_MINUTES environment variable, or set it to 0 to disable check-ins entirely.
`/team-onboarding` — Teammate Ramp-Up Guide
New in v2.1.101
Use /team-onboarding to generate a teammate ramp-up guide from your project's local Claude Code usage. The command inspects your CLAUDE.md, installed skills, subagents, hooks, and recent workflows, then produces an onboarding document that helps new developers become productive quickly.
It's a built-in command — nothing to install.
Usage:
claude /team-onboardingThe generated guide summarizes:
- Project purpose and key conventions from
CLAUDE.md - Available skills and when they are auto-invoked
- Configured subagents and their responsibilities
- Hooks that run on common events
- Common workflows newcomers should know about
Availability: Shipped in Claude Code v2.1.101 (April 11, 2026).
Custom Commands (Now Skills)
Custom slash commands have been merged into skills. Both approaches create commands you can invoke with /command-name:
| Approach | Location | Status |
|---|---|---|
| Skills (Recommended) | .claude/skills/<name>/SKILL.md |
Current standard |
| Legacy Commands | .claude/commands/<name>.md |
Still works |
If a skill and a command share the same name, the skill takes precedence. For example, when both .claude/commands/review.md and .claude/skills/review/SKILL.md exist, the skill version is used.
Migration Path
Your existing .claude/commands/ files continue to work without changes. To migrate to skills:
Before (Command):
.claude/commands/optimize.mdAfter (Skill):
.claude/skills/optimize/SKILL.mdWhy Skills?
Skills offer additional features over legacy commands:
- Directory structure: Bundle scripts, templates, and reference files
- Auto-invocation: Claude can trigger skills automatically when relevant
- Invocation control: Choose whether users, Claude, or both can invoke
- Subagent execution: Run skills in isolated contexts with
context: fork - Progressive disclosure: Load additional files only when needed
Creating a Custom Command as a Skill
Create a directory with a SKILL.md file:
mkdir -p .claude/skills/my-commandFile: .claude/skills/my-command/SKILL.md
---
name: my-command
---
# My Command
Instructions for Claude to follow when this command is invoked.
1. First step
2. Second step
3. Third stepFrontmatter Reference
| Field | Purpose | Default |
|---|---|---|
name |
Command name (becomes /name) |
Directory name |
description |
Brief description (helps Claude know when to use it) | First paragraph |
argument-hint |
Expected arguments for auto-completion | None |
allowed-tools |
Tools the command can use without permission | Inherits |
model |
Specific model to use | Inherits |
disable-model-invocation |
If true, only user can invoke (not Claude) |
false |
user-invocable |
If false, hide from / menu |
true |
context |
Set to fork to run in isolated subagent |
None |
agent |
Agent type when using context: fork |
general-purpose |
hooks |
Skill-scoped hooks (PreToolUse, PostToolUse, Stop) | None |
Arguments
Commands can receive arguments:
All arguments with $ARGUMENTS:
---
name: fix-issue
---
Fix issue #$ARGUMENTS following our coding standardsUsage: /fix-issue 123 → $ARGUMENTS becomes "123"
Individual arguments with $0, $1, etc.:
---
name: review-pr
---
Review PR #$0 with priority $1Usage: /review-pr 456 high → $0="456", $1="high"
${CLAUDE_PROJECT_DIR} resolves to the absolute path of the project root (v2.1.196).
Dynamic Context with Shell Commands
Execute bash commands before the prompt using !`command`:
---
name: commit
allowed-tools: Bash(git *)
---
## Context
- Current git status: !`git status`
- Current git diff: !`git diff HEAD`
- Current branch: !`git branch --show-current`
- Recent commits: !`git log --oneline -5`
## Your task
Based on the above changes, create a single git commit.File References
Include file contents using @:
Review the implementation in @src/utils/helpers.js
Compare @src/old-version.js with @src/new-version.jsPlugin Commands
Plugins can provide custom commands:
/plugin-name:command-nameOr simply /command-name when there are no naming conflicts.
Examples:
/frontend-design:frontend-design
/commit-commands:commitMCP Prompts as Commands
MCP servers can expose prompts as slash commands:
/mcp__<server-name>__ [arguments]Examples:
/mcp__github__list_prs
/mcp__github__pr_review 456
/mcp__jira__create_issue "Bug title" highMCP Permission Syntax
Control MCP server access in permissions:
mcp__github- Access entire GitHub MCP servermcp__github__*- Wildcard access to all toolsmcp__github__get_issue- Specific tool access
Command Architecture
graph TD
A["User Input: /command-name"] --> B{"Command Type?"}
B -->|Built-in| C["Execute Built-in"]
B -->|Skill| D["Load SKILL.md"]
B -->|Plugin| E["Load Plugin Command"]
B -->|MCP| F["Execute MCP Prompt"]
D --> G["Parse Frontmatter"]
G --> H["Substitute Variables"]
H --> I["Execute Shell Commands"]
I --> J["Send to Claude"]
J --> K["Return Results"]Command Lifecycle
sequenceDiagram
participant User
participant Claude as Claude Code
participant FS as File System
participant CLI as Shell/Bash
User->>Claude: Types /optimize
Claude->>FS: Searches .claude/skills/ and .claude/commands/
FS-->>Claude: Returns optimize/SKILL.md
Claude->>Claude: Parses frontmatter
Claude->>CLI: Executes !`command` substitutions
CLI-->>Claude: Command outputs
Claude->>Claude: Substitutes $ARGUMENTS
Claude->>User: Processes prompt
Claude->>User: Returns resultsAvailable Commands in This Folder
These example commands can be installed as skills or legacy commands.
1. `/optimize` - Code Optimization
Analyzes code for performance issues, memory leaks, and optimization opportunities.
Usage:
/optimize
[Paste your code]2. `/pr` - Pull Request Preparation
Guides through PR preparation checklist including linting, testing, and commit formatting.
Usage:
/prScreenshot:
3. `/generate-api-docs` - API Documentation Generator
Generates comprehensive API documentation from source code.
Usage:
/generate-api-docs4. `/commit` - Git Commit with Context
Creates a git commit with dynamic context from your repository.
Usage:
/commit [optional message]5. `/push-all` - Stage, Commit, and Push
Stages all changes, creates a commit, and pushes to remote with safety checks.
Usage:
/push-allSafety Checks:
- Secrets:
.env*,*.key,*.pem,credentials.json - API Keys: Detects real keys vs. placeholders
- Large files:
>10MBwithout Git LFS - Build artifacts:
node_modules/,dist/,__pycache__/
6. `/doc-refactor` - Documentation Restructuring
Restructures project documentation for clarity and accessibility.
Usage:
/doc-refactor7. `/setup-ci-cd` - CI/CD Pipeline Setup
Implements pre-commit hooks and GitHub Actions for quality assurance.
Usage:
/setup-ci-cd8. `/unit-test-expand` - Test Coverage Expansion
Increases test coverage by targeting untested branches and edge cases.
Usage:
/unit-test-expandInstallation
As Skills (Recommended)
Copy to your skills directory:
# Create skills directory
mkdir -p .claude/skills
# For each command file, create a skill directory
for cmd in optimize pr commit; do
mkdir -p .claude/skills/$cmd
cp 01-slash-commands/$cmd.md .claude/skills/$cmd/SKILL.md
doneAs Legacy Commands
Copy to your commands directory:
# Project-wide (team)
mkdir -p .claude/commands
cp 01-slash-commands/*.md .claude/commands/
# Personal use
mkdir -p ~/.claude/commands
cp 01-slash-commands/*.md ~/.claude/commands/Creating Your Own Commands
Skill Template (Recommended)
Create .claude/skills/my-command/SKILL.md:
---
name: my-command
argument-hint: [optional-args]
allowed-tools: Bash(npm *), Read, Grep
---
# Command Title
## Context
- Current branch: !`git branch --show-current`
- Related files: @package.json
## Instructions
1. First step
2. Second step with argument: $ARGUMENTS
3. Third step
## Output Format
- How to format the response
- What to includeUser-Only Command (No Auto-Invocation)
For commands with side effects that Claude shouldn't trigger automatically:
---
name: deploy
disable-model-invocation: true
allowed-tools: Bash(npm *), Bash(git *)
---
Deploy the application to production:
1. Run tests
2. Build application
3. Push to deployment target
4. Verify deploymentBest Practices
| Do | Don't |
|---|---|
| Use clear, action-oriented names | Create commands for one-time tasks |
Include description with trigger conditions |
Build complex logic in commands |
| Keep commands focused on single task | Hardcode sensitive information |
Use disable-model-invocation for side effects |
Skip the description field |
Use ! prefix for dynamic context |
Assume Claude knows current state |
| Organize related files in skill directories | Put everything in one file |
Troubleshooting
Command Not Found
Solutions:
- Check file is in
.claude/skills/<name>/SKILL.mdor.claude/commands/<name>.md - Verify the
namefield in frontmatter matches expected command name - Restart Claude Code session
- Run
/helpto see available commands
Command Not Executing as Expected
Solutions:
- Add more specific instructions
- Include examples in the skill file
- Check
allowed-toolsif using bash commands - Test with simple inputs first
Skill vs Command Conflict
If both exist with the same name, the skill takes precedence. Remove one or rename it.
Related Guides
- Skills - Full reference for skills (auto-invoked capabilities)
- Memory - Persistent context with CLAUDE.md
- Subagents - Delegated AI agents
- Plugins - Bundled command collections
- Hooks - Event-driven automation
Additional Resources
- Official Interactive Mode Documentation - Built-in commands reference
- Official Skills Documentation - Complete skills reference
- CLI Reference - Command-line options
Last Updated: August 19, 2026
Claude Code Version: 2.1.235
Sources:
- https://code.claude.com/docs/en/skills
- https://code.claude.com/docs/en/interactive-mode
- https://code.claude.com/docs/en/changelog
- https://code.claude.com/docs/en/commands
- https://code.claude.com/docs/en/model-config
- https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md
- https://github.com/anthropics/claude-code/releases/tag/v2.1.139
- https://github.com/anthropics/claude-code/releases/tag/v2.1.144
- https://github.com/anthropics/claude-code/releases/tag/v2.1.152
- https://github.com/anthropics/claude-code/releases/tag/v2.1.153
- https://github.com/anthropics/claude-code/releases/tag/v2.1.154
Compatible Models: Claude Fable 5, Claude Opus 5, Claude Sonnet 5, Claude Sonnet 4.6, Claude Opus 4.8, Claude Haiku 4.5
Part of the Claude How To guide series
File: 02-memory/README.md
Memory Guide
Memory enables Claude to retain context across sessions and conversations. It exists in two forms: automatic synthesis in claude.ai, and filesystem-based CLAUDE.md in Claude Code.
Overview
Memory in Claude Code provides persistent context that carries across multiple sessions and conversations. Unlike temporary context windows, memory files allow you to:
- Share project standards across your team
- Store personal development preferences
- Maintain directory-specific rules and configurations
- Import external documentation
- Version control memory as part of your project
The memory system operates at multiple levels, from global personal preferences down to specific subdirectories, allowing for fine-grained control over what Claude remembers and how it applies that knowledge.
Memory Commands Quick Reference
| Command | Purpose | Usage | When to Use |
|---|---|---|---|
/init |
Initialize project memory | /init |
Starting new project, first-time CLAUDE.md setup |
/memory |
Edit memory files in editor | /memory |
Extensive updates, reorganization, reviewing content |
# prefix |
— | Use /memory or ask conversationally instead |
|
@path/to/file |
Import external content | @README.md or @docs/api.md |
Referencing existing documentation in CLAUDE.md |
Quick Start: Initializing Memory
The `/init` Command
The /init command is the fastest way to set up project memory in Claude Code. It initializes a CLAUDE.md file with foundational project documentation.
Usage:
/initWhat it does:
- Creates a new CLAUDE.md file in your project (typically at
./CLAUDE.mdor./.claude/CLAUDE.md) - Establishes project conventions and guidelines
- Sets up the foundation for context persistence across sessions
- Provides a template structure for documenting your project standards
Enhanced interactive mode: Set CLAUDE_CODE_NEW_INIT=1 to enable a multi-phase interactive flow that walks you through project setup step by step:
CLAUDE_CODE_NEW_INIT=1 claude
/initWhen to use /init:
- Starting a new project with Claude Code
- Establishing team coding standards and conventions
- Creating documentation about your codebase structure
- Setting up memory hierarchy for collaborative development
Example workflow:
# In your project directory
/init
# Claude creates CLAUDE.md with structure like:
# Project Configuration
## Project Overview
- Name: Your Project
- Tech Stack: [Your technologies]
- Team Size: [Number of developers]
## Development Standards
- Code style preferences
- Testing requirements
- Git workflow conventionsQuick Memory Updates
Note: The
#shortcut for inline memory was discontinued. Use/memoryto edit memory files directly, or ask Claude conversationally to remember something (e.g., "remember that we always use TypeScript strict mode").
The recommended ways to add information to memory are:
Option 1: Use /memory command
/memoryOpens your memory files in your system editor for direct editing.
Option 2: Ask conversationally
Remember that we always use TypeScript strict mode in this project.
Please add to memory: prefer async/await over promise chains.Claude will update the appropriate CLAUDE.md file based on your request.
Historical reference (no longer functional):
The # prefix shortcut previously allowed adding rules inline:
# Always use TypeScript strict mode in this project ← no longer worksIf you relied on this pattern, switch to the /memory command or conversational requests.
The `/memory` Command
The /memory command provides direct access to edit your CLAUDE.md memory files within Claude Code sessions. It opens your memory files in your system editor for comprehensive editing. When the file opens in a GUI editor, the session no longer blocks while the file stays open, so you can keep working in parallel (v2.1.216); terminal editors like Vim still take over the terminal until you exit.
Usage:
/memoryWhat it does:
- Opens your memory files in your system's default editor
- Allows you to make extensive additions, modifications, and reorganizations
- Provides direct access to all memory files in the hierarchy
- Enables you to manage persistent context across sessions
When to use /memory:
- Reviewing existing memory content
- Making extensive updates to project standards
- Reorganizing memory structure
- Adding detailed documentation or guidelines
- Maintaining and updating memory as your project evolves
Comparison: /memory vs /init
| Aspect | /memory |
/init |
|---|---|---|
| Purpose | Edit existing memory files | Initialize new CLAUDE.md |
| When to use | Update/modify project context | Begin new projects |
| Action | Opens editor for changes | Generates starter template |
| Workflow | Ongoing maintenance | One-time setup |
Example workflow:
# Open memory for editing
/memory
# Claude presents options:
# 1. Managed Policy Memory
# 2. Project Memory (./CLAUDE.md)
# 3. User Memory (~/.claude/CLAUDE.md)
# 4. Local Project Memory
# Choose option 2 (Project Memory)
# Your default editor opens with ./CLAUDE.md content
# Make changes, save, and close editor
# Claude automatically reloads the updated memoryUsing Memory Imports:
CLAUDE.md files support the @path/to/file syntax to include external content:
# Project Documentation
See @README.md for project overview
See @package.json for available npm commands
See @docs/architecture.md for system design
# Import from home directory using absolute path
@~/.claude/my-project-instructions.mdImport features:
- Both relative and absolute paths are supported (e.g.,
@docs/api.mdor@~/.claude/my-project-instructions.md) - Recursive imports are supported with a maximum depth of 4 hops
- First-time imports from external locations trigger an approval dialog for security
- Import directives are not evaluated inside markdown code spans or code blocks (so documenting them in examples is safe)
- Helps avoid duplication by referencing existing documentation
- Automatically includes referenced content in Claude's context
Memory Architecture
Memory in Claude Code follows a hierarchical system where different scopes serve different purposes. Unlike Claude Web/Desktop's 24-hour synthesis cycle (see Memory in Claude Web/Desktop below), Claude Code has two memory systems that both load at the start of every session and update continuously, not on a timer:
graph TB
A["Session Start"]
B["CLAUDE.md Files(you write)"]
C["Auto Memory(Claude writes)"]
D["Claude Session"]
E["Your Correction /Preference"]
B -->|loaded in full| A
C -->|MEMORY.md loaded| A
A --> D
D -->|"Remember that..."| E
E -->|writes during session| C
D -->|"add this to CLAUDE.md"| BMemory Hierarchy in Claude Code
Claude Code has two complementary memory systems, both loaded at the start of every conversation: CLAUDE.md files (instructions you write) and auto memory (notes Claude writes itself). CLAUDE.md files are concatenated into context rather than overriding each other — this is not a strict precedence chain where a higher tier replaces a lower one. .claude/rules/*.md files are a separate, related mechanism for topic- or path-scoped instructions.
CLAUDE.md file locations, in load order (broadest scope to most specific):
| Scope | Location | Purpose |
|---|---|---|
| Managed policy | macOS: /Library/Application Support/ClaudeCode/CLAUDE.mdLinux/WSL: /etc/claude-code/CLAUDE.mdWindows: C:\Program Files\ClaudeCode\CLAUDE.md |
Organization-wide instructions managed by IT/DevOps. Cannot be excluded by individual settings. |
| User instructions | ~/.claude/CLAUDE.md |
Personal preferences for all projects |
| Project instructions | ./CLAUDE.md or ./.claude/CLAUDE.md |
Team-shared instructions, version controlled |
| Local instructions | ./CLAUDE.local.md |
Personal project-specific preferences; add to .gitignore |
Within the directory tree, Claude Code walks up from your working directory: foo/CLAUDE.md loads before foo/bar/CLAUDE.md if you launch from foo/bar/, so instructions closer to where you launched are read last — not "highest priority" in an override sense, just most recent in context. Within each directory, CLAUDE.local.md is appended after CLAUDE.md. CLAUDE.md and CLAUDE.local.md files in subdirectories under your working directory load on demand, when Claude reads files in those subdirectories, rather than at launch.
Organizations can also put managed CLAUDE.md content directly inside managed-settings.json via the claudeMd key, instead of deploying a separate file. This is honored only in managed/policy settings — setting claudeMd in user or project settings has no effect.
.claude/rules/*.md — modular, topic-specific instructions, optionally scoped to file paths via paths frontmatter. Rules without a paths field load unconditionally with the same priority as .claude/CLAUDE.md; path-scoped rules load on demand when Claude reads a matching file. User-level rules (~/.claude/rules/) load before project rules.
Auto memory (~/.claude/projects//memory/) is a separate system: Claude's own notes, not CLAUDE.md content, and not part of the concatenation order above. See Auto Memory below.
Note:
CLAUDE.local.mdis fully supported and documented in the official documentation. It provides personal project-specific preferences that are not committed to version control. AddCLAUDE.local.mdto your.gitignore.
Memory Discovery Behavior:
graph TD
A["Managed Policy/Library/.../ClaudeCode/CLAUDE.md"] -->|loads first| B["User Instructions~/.claude/CLAUDE.md"]
B --> C["Project Instructions./CLAUDE.md or ./.claude/CLAUDE.md"]
C --> D["Local Instructions./CLAUDE.local.md"]
C -->|imports| H["@docs/architecture.md"]
H -->|imports| I["@docs/api-standards.md"]
style A fill:#fce4ec,stroke:#333,color:#333
style B fill:#f3e5f5,stroke:#333,color:#333
style C fill:#e1f5fe,stroke:#333,color:#333
style D fill:#e8f5e9,stroke:#333,color:#333
style H fill:#e1f5fe,stroke:#333,color:#333
style I fill:#e1f5fe,stroke:#333,color:#333All files shown are concatenated into one context, not selected by override — later boxes appear later in context, not "instead of" earlier ones.
Excluding CLAUDE.md Files with `claudeMdExcludes`
In large monorepos, some CLAUDE.md files may be irrelevant to your current work. The claudeMdExcludes setting lets you skip specific CLAUDE.md files so they are not loaded into context:
// In ~/.claude/settings.json or .claude/settings.json
{
"claudeMdExcludes": [
"packages/legacy-app/CLAUDE.md",
"vendors/**/CLAUDE.md"
]
}Patterns are matched against paths relative to the project root. This is particularly useful for:
- Monorepos with many sub-projects, where only some are relevant
- Repositories that contain vendored or third-party CLAUDE.md files
- Reducing noise in Claude's context window by excluding stale or unrelated instructions
Settings File Hierarchy
Claude Code settings (including autoMemoryDirectory, claudeMdExcludes, and other configuration) resolve by precedence — unlike CLAUDE.md files above, settings genuinely override rather than concatenate. When the same setting appears in multiple scopes, the higher level wins:
| Level | Location | Scope |
|---|---|---|
| 1 (Highest) | Managed — managed-settings.json, plist/registry, or server-managed |
Organization-wide enforcement; cannot be overridden |
| 2 | Command line arguments | Temporary session overrides |
| 3 | .claude/settings.local.json |
Local overrides (git-ignored) |
| 4 | .claude/settings.json |
Project-level (committed to git) |
| 5 (Lowest) | ~/.claude/settings.json |
User preferences |
Managed settings also support a drop-in directory, managed-settings.d/, alongside managed-settings.json: the base file merges first, then *.json files in the drop-in directory merge on top in alphabetical order (scalars override, arrays concatenate and de-duplicate, objects deep-merge). This lets separate teams deploy independent policy fragments without editing a shared file. Note this is a settings.json mechanism, not a CLAUDE.md one — it doesn't apply to the CLAUDE.md file locations described above.
Permission rules (allow/ask/deny) behave differently from other settings: they merge across scopes instead of the higher level replacing the lower one.
Platform-specific configuration (v2.1.51+):
Settings can also be configured via:
- macOS: Property list (plist) files
- Windows: Windows Registry
These platform-native mechanisms are read alongside JSON settings files and follow the same precedence rules.
Note (v2.1.119):
/configchanges now persist to~/.claude/settings.json. Values written via/configparticipate in the normal policy/local/project precedence chain described above — they are no longer session-only. Use/configfor interactive edits and editsettings.jsonfiles directly for scripted or managed configuration.
Retention and Cleanup Settings
| Setting | Type | Default | Description |
|---|---|---|---|
cleanupPeriodDays |
integer (days) | 30 | Retention window for on-disk artifacts. As of v2.1.117, it applies to all four of: checkpoints (~/.claude/checkpoints/), tasks (~/.claude/tasks/), shell-snapshots (~/.claude/shell-snapshots/), and backups (~/.claude/backups/). Files older than the window are pruned at startup. |
// ~/.claude/settings.json
{
"cleanupPeriodDays": 14
}Attribution, Voice, and PR URL Settings
| Setting | Type | Description |
|---|---|---|
attribution.commit |
boolean | Adds the Co-Authored-By: Claude trailer to commits Claude creates. Replaces the deprecated includeCoAuthoredBy flag. |
attribution.pr |
boolean | Adds Claude attribution to pull request descriptions. Replaces the deprecated includeCoAuthoredBy flag for PRs. |
attribution.sessionUrl |
boolean | Omit the claude.ai session link from commits and PRs created in web and Remote Control sessions (v2.1.183+). |
voice.enabled |
boolean | Enables push-to-talk voice dictation (/voice). Replaces the deprecated voiceEnabled flag. |
prUrlTemplate |
string | New in v2.1.119. Custom URL template for the footer PR badge; useful for GitLab, Bitbucket, or internal code-review platforms. Supports {{owner}}, {{repo}}, and {{number}} placeholders. |
// ~/.claude/settings.json
{
"attribution": {
"commit": false,
"pr": true
},
"voice": {
"enabled": true
},
"prUrlTemplate": "https://gitlab.internal/{{owner}}/{{repo}}/-/merge_requests/{{number}}"
}Deprecated setting names
The following legacy setting keys still work but are deprecated. Prefer the replacements above.
| Deprecated key | Replacement | Notes |
|---|---|---|
includeCoAuthoredBy |
attribution.commit / attribution.pr |
The old single flag is split into separate commit and PR switches. Users on older installs can keep the legacy key; new projects should use the nested form. |
voiceEnabled |
voice.enabled |
Grouped under the voice namespace alongside future voice-related options. |
Modular Rules System
Create organized, path-specific rules using the .claude/rules/ directory structure. Rules can be defined at both the project level and user level:
your-project/
├── .claude/
│ ├── CLAUDE.md
│ └── rules/
│ ├── code-style.md
│ ├── testing.md
│ ├── security.md
│ └── api/ # Subdirectories supported
│ ├── conventions.md
│ └── validation.md
~/.claude/
├── CLAUDE.md
└── rules/ # User-level rules (all projects)
├── personal-style.md
└── preferred-patterns.mdRules are discovered recursively within the rules/ directory, including any subdirectories. User-level rules at ~/.claude/rules/ are loaded before project-level rules, allowing personal defaults that projects can override.
Path-Specific Rules with YAML Frontmatter
Define rules that apply only to specific file paths:
---
paths: src/api/**/*.ts
---
# API Development Rules
- All API endpoints must include input validation
- Use Zod for schema validation
- Document all parameters and response types
- Include error handling for all operationsGlob Pattern Examples:
**/*.ts- All TypeScript filessrc/**/*- All files under src/src/**/*.{ts,tsx}- Multiple extensions{src,lib}/**/*.ts, tests/**/*.test.ts- Multiple patterns
Subdirectories and Symlinks
Rules in .claude/rules/ support two organizational features:
- Subdirectories: Rules are discovered recursively, so you can organize them into topic-based folders (e.g.,
rules/api/,rules/testing/,rules/security/) - Symlinks: Symlinks are supported for sharing rules across multiple projects. For example, you can symlink a shared rule file from a central location into each project's
.claude/rules/directory
Memory Locations Table
CLAUDE.md files and rules are concatenated into context, not selected by strict override — "Load order" below means where in context it appears, not which one wins. Auto memory is a separate mechanism with its own storage location.
| Location | Type | Load order | Shared | Access | Best For |
|---|---|---|---|---|---|
/Library/Application Support/ClaudeCode/CLAUDE.md (macOS) |
Managed Policy | 1st (loads first) | Organization | System | Company-wide policies |
/etc/claude-code/CLAUDE.md (Linux/WSL) |
Managed Policy | 1st (loads first) | Organization | System | Organization standards |
C:\Program Files\ClaudeCode\CLAUDE.md (Windows) |
Managed Policy | 1st (loads first) | Organization | System | Corporate guidelines |
~/.claude/rules/*.md |
User Rules | 2nd | Individual | Filesystem | Personal rules (all projects) |
~/.claude/CLAUDE.md |
User Memory | 3rd | Individual | Filesystem | Personal preferences (all projects) |
./.claude/rules/*.md |
Project Rules | 4th | Team | Git | Path-specific, modular rules |
./CLAUDE.md or ./.claude/CLAUDE.md |
Project Memory | 5th | Team | Git | Team standards, shared architecture |
./CLAUDE.local.md |
Project Local | 6th (loads last) | Individual | Git (ignored) | Personal project-specific preferences |
~/.claude/projects//memory/ |
Auto Memory | N/A — separate mechanism | Individual | Filesystem | Claude's automatic notes and learnings |
Memory Update Lifecycle
Here's how memory updates flow through your Claude Code sessions:
sequenceDiagram
participant User
participant Claude as Claude Code
participant Editor as File System
participant Memory as CLAUDE.md
User->>Claude: "Remember: use async/await"
Claude->>User: "Which memory file?"
User->>Claude: "Project memory"
Claude->>Editor: Open ~/.claude/settings.json
Claude->>Memory: Write to ./CLAUDE.md
Memory-->>Claude: File saved
Claude->>Claude: Load updated memory
Claude-->>User: "Memory saved!"Auto Memory
Auto memory is a persistent directory where Claude automatically records learnings, patterns, and insights as it works with your project. Unlike CLAUDE.md files which you write and maintain manually, auto memory is written by Claude itself during sessions.
How Auto Memory Works
- Location:
~/.claude/projects//memory/ - Entrypoint:
MEMORY.mdserves as the main file in the auto memory directory - Topic files: Optional additional files for specific subjects (e.g.,
debugging.md,api-conventions.md) - Loading behavior: The first 200 lines of
MEMORY.md(or first 25KB, whichever comes first) are loaded into context at session start. Topic files are loaded on demand, not at startup. - Read/write: Claude reads and writes memory files during sessions as it discovers patterns and project-specific knowledge
- Frontmatter: Files that begin with YAML frontmatter get a
modifiedfield — an ISO 8601 timestamp Claude Code records each time it writes the file (v2.1.214)
Auto Memory Architecture
graph TD
A["Claude Session Starts"] --> B["Load MEMORY.md(first 200 lines / 25KB)"]
B --> C["Session Active"]
C --> D["Claude discoverspatterns & insights"]
D --> E{"Write toauto memory"}
E -->|General notes| F["MEMORY.md"]
E -->|Topic-specific| G["debugging.md"]
E -->|Topic-specific| H["api-conventions.md"]
C --> I["On-demand loadtopic files"]
I --> C
style A fill:#e1f5fe,stroke:#333,color:#333
style B fill:#e1f5fe,stroke:#333,color:#333
style C fill:#e8f5e9,stroke:#333,color:#333
style D fill:#f3e5f5,stroke:#333,color:#333
style E fill:#fff3e0,stroke:#333,color:#333
style F fill:#fce4ec,stroke:#333,color:#333
style G fill:#fce4ec,stroke:#333,color:#333
style H fill:#fce4ec,stroke:#333,color:#333
style I fill:#f3e5f5,stroke:#333,color:#333Auto Memory Directory Structure
~/.claude/projects//memory/
├── MEMORY.md # Entrypoint (first 200 lines / 25KB loaded at startup)
├── debugging.md # Topic file (loaded on demand)
├── api-conventions.md # Topic file (loaded on demand)
└── testing-patterns.md # Topic file (loaded on demand)Version Requirement
Auto memory requires Claude Code v2.1.59 or later. If you are on an older version, upgrade first:
npm install @anthropic-ai/claude-code@latestTurning Auto Memory On or Off
Auto memory is on by default. The autoMemoryEnabled setting (default true) controls it; when false, Claude neither reads from nor writes to the auto memory directory. You can also toggle it with /memory during a session.
{
"autoMemoryEnabled": false
}To disable it via environment instead, set CLAUDE_CODE_DISABLE_AUTO_MEMORY=1. Setting it to 0 forces auto memory on even when --bare mode or autoMemoryEnabled: false would otherwise disable it.
Custom Auto Memory Directory
By default, auto memory is stored in ~/.claude/projects//memory/. You can change this location using the autoMemoryDirectory setting (available since v2.1.74):
// In ~/.claude/settings.json or .claude/settings.local.json (user/local settings only)
{
"autoMemoryDirectory": "/path/to/custom/memory/directory"
}Note:
autoMemoryDirectorycan only be set in user-level (~/.claude/settings.json) or local settings (.claude/settings.local.json), not in project or managed policy settings.
This is useful when you want to:
- Store auto memory in a shared or synced location
- Separate auto memory from the default Claude configuration directory
- Use a project-specific path outside the default hierarchy
Worktree and Repository Sharing
All worktrees and subdirectories within the same git repository share a single auto memory directory. This means switching between worktrees or working in different subdirectories of the same repo will read and write to the same memory files.
Subagent Memory
Subagents (spawned via tools like Task or parallel execution) can have their own memory context. Use the memory frontmatter field in the subagent definition to specify which memory scopes to load:
memory: user # Load user-level memory only
memory: project # Load project-level memory only
memory: local # Load local memory onlyThis allows subagents to operate with focused context rather than inheriting the full memory hierarchy.
Note: Subagents can also maintain their own auto memory. See the official subagent memory documentation for details.
Controlling Auto Memory
Auto memory can be controlled via the CLAUDE_CODE_DISABLE_AUTO_MEMORY environment variable:
| Value | Behavior |
|---|---|
0 |
Force auto memory on |
1 |
Force auto memory off |
| (unset) | Default behavior (auto memory enabled) |
# Disable auto memory for a session
CLAUDE_CODE_DISABLE_AUTO_MEMORY=1 claude
# Force auto memory on explicitly
CLAUDE_CODE_DISABLE_AUTO_MEMORY=0 claudeAdditional Directories with `--add-dir`
The --add-dir flag allows Claude Code to load CLAUDE.md files from additional directories beyond the current working directory. This is useful for monorepos or multi-project setups where context from other directories is relevant.
To enable this feature, set the environment variable:
CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1Then launch Claude Code with the flag:
claude --add-dir /path/to/other/projectClaude will load CLAUDE.md from the specified additional directory alongside the memory files from your current working directory.
Practical Examples
Example 1: Project Memory Structure
File: ./CLAUDE.md
/* Detailed source-code truncated for AI context efficiency. */Example 2: Directory-Specific Memory
File: ./src/api/CLAUDE.md
# API Module Standards
This file overrides root CLAUDE.md for everything in /src/api/
## API-Specific Standards
### Request Validation
- Use Zod for schema validation
- Always validate input
- Return 400 with validation errors
- Include field-level error details
### Authentication
- All endpoints require JWT token
- Token in Authorization header
- Token expires after 24 hours
- Implement refresh token mechanism
### Response Format
All responses must follow this structure:
```json
{
"success": true,
"data": { /* actual data */ },
"timestamp": "2025-11-06T10:30:00Z",
"version": "1.0"
}
```
Error responses:
```json
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "User message",
"details": { /* field errors */ }
},
"timestamp": "2025-11-06T10:30:00Z"
}
```
### Pagination
- Use cursor-based pagination (not offset)
- Include `hasMore` boolean
- Limit max page size to 100
- Default page size: 20
### Rate Limiting
- 1000 requests per hour for authenticated users
- 100 requests per hour for public endpoints
- Return 429 when exceeded
- Include retry-after header
### Caching
- Use Redis for session caching
- Cache duration: 5 minutes default
- Invalidate on write operations
- Tag cache keys with resource typeExample 3: Personal Memory
File: ~/.claude/CLAUDE.md
# My Development Preferences
## About Me
- **Experience Level**: 8 years full-stack development
- **Preferred Languages**: TypeScript, Python
- **Communication Style**: Direct, with examples
- **Learning Style**: Visual diagrams with code
## Code Preferences
### Error Handling
I prefer explicit error handling with try-catch blocks and meaningful error messages.
Avoid generic errors. Always log errors for debugging.
### Comments
Use comments for WHY, not WHAT. Code should be self-documenting.
Comments should explain business logic or non-obvious decisions.
### Testing
I prefer TDD (test-driven development).
Write tests first, then implementation.
Focus on behavior, not implementation details.
### Architecture
I prefer modular, loosely-coupled design.
Use dependency injection for testability.
Separate concerns (Controllers, Services, Repositories).
## Debugging Preferences
- Use console.log with prefix: `[DEBUG]`
- Include context: function name, relevant variables
- Use stack traces when available
- Always include timestamps in logs
## Communication
- Explain complex concepts with diagrams
- Show concrete examples before explaining theory
- Include before/after code snippets
- Summarize key points at the end
## Project Organization
I organize my projects as:
project/
├── src/
│ ├── api/
│ ├── services/
│ ├── models/
│ └── utils/
├── tests/
├── docs/
└── docker/
## Tooling
- **IDE**: VS Code with vim keybindings
- **Terminal**: Zsh with Oh-My-Zsh
- **Format**: Prettier (100 char line length)
- **Linter**: ESLint with airbnb config
- **Test Framework**: Jest with React Testing LibraryMy Test
Ask Claude to save a new rule
Claude has not save the rule because I did not have any Claude.md file anywhere. Then asked Claude to confirm the location.
Example 4: Memory Update During Session
You can add new rules to memory during an active Claude Code session by asking conversationally:
User: Remember that I prefer using React hooks instead of class components
for all new components.
Claude: I'm adding that to your memory. Which memory file should this go in?
1. Project memory (./CLAUDE.md)
2. Personal memory (~/.claude/CLAUDE.md)
User: Project memory
Claude: ✅ Memory saved!
Added to ./CLAUDE.md:
---
### Component Development
- Use functional components with React Hooks
- Prefer hooks over class components
- Custom hooks for reusable logic
- Use useCallback for event handlers
- Use useMemo for expensive computationsOr use /memory to edit memory files directly for extensive updates or reorganization.
Tips for Adding Memory
- Be specific and actionable in your rules
- Group related rules together under a section header
- Update existing sections instead of duplicating content
- Choose the appropriate memory scope (project vs. personal)
Memory Features Comparison
| Feature | Claude Web/Desktop | Claude Code (CLAUDE.md) |
|---|---|---|
| Auto-synthesis | ✅ Every 24h | ✅ Auto memory |
| Cross-project | ✅ Shared | ❌ Project-specific |
| Team access | ✅ Shared projects | ✅ Git-tracked |
| Searchable | ✅ Built-in | ✅ Through /memory |
| Editable | ✅ In-chat | ✅ Direct file edit |
| Import/Export | ✅ Yes | ✅ Copy/paste |
| Persistent | ✅ 24h+ | ✅ Indefinite |
Memory in Claude Web/Desktop
Memory Synthesis Timeline
graph LR
A["Day 1: UserConversations"] -->|24 hours| B["Day 2: MemorySynthesis"]
B -->|Automatic| C["Memory UpdatedSummarized"]
C -->|Loaded in| D["Day 2-N:New Conversations"]
D -->|Add to| E["Memory"]
E -->|24 hours later| F["Memory Refreshed"]Example Memory Summary:
## Claude's Memory of User
### Professional Background
- Senior full-stack developer with 8 years experience
- Focus on TypeScript/Node.js backends and React frontends
- Active open source contributor
- Interested in AI and machine learning
### Project Context
- Currently building e-commerce platform
- Tech stack: Node.js, PostgreSQL, React 18, Docker
- Working with team of 5 developers
- Using CI/CD and blue-green deployments
### Communication Preferences
- Prefers direct, concise explanations
- Likes visual diagrams and examples
- Appreciates code snippets
- Explains business logic in comments
### Current Goals
- Improve API performance
- Increase test coverage to 90%
- Implement caching strategy
- Document architectureBest Practices
Do's - What To Include
Be specific and detailed: Use clear, detailed instructions rather than vague guidance
- ✅ Good: "Use 2-space indentation for all JavaScript files"
- ❌ Avoid: "Follow best practices"
Keep organized: Structure memory files with clear markdown sections and headings
Use appropriate hierarchy levels:
- Managed policy: Company-wide policies, security standards, compliance requirements
- Project memory: Team standards, architecture, coding conventions (commit to git)
- User memory: Personal preferences, communication style, tooling choices
- Directory memory: Module-specific rules and overrides
Leverage imports: Use
@path/to/filesyntax to reference existing documentation- Supports a maximum depth of 4 hops for recursive imports
- Avoids duplication across memory files
- Example:
See @README.md for project overview
Document frequent commands: Include commands you use repeatedly to save time
Version control project memory: Commit project-level CLAUDE.md files to git for team benefit
Review periodically: Update memory regularly as projects evolve and requirements change
Provide concrete examples: Include code snippets and specific scenarios
Don'ts - What To Avoid
Don't store secrets: Never include API keys, passwords, tokens, or credentials
Don't include sensitive data: No PII, private information, or proprietary secrets
Don't duplicate content: Use imports (
@path) to reference existing documentation insteadDon't be vague: Avoid generic statements like "follow best practices" or "write good code"
Don't make it too long: Target under 200 lines per CLAUDE.md. Longer files still load in full, but adherence drops — see Keeping CLAUDE.md small below
Don't over-organize: Use hierarchy strategically; don't create excessive subdirectory overrides
Don't forget to update: Stale memory can cause confusion and outdated practices
Don't exceed nesting limits: Memory imports support a maximum depth of 4 hops
Keeping CLAUDE.md Small
Anthropic's current guidance is the opposite of "put everything in CLAUDE.md". The file loads into every session, so every line you add is a line that competes for attention on tasks it has nothing to do with.
Rule of thumb: keep CLAUDE.md under 200 lines. Longer files still load in full, but instruction adherence degrades as the file grows.
When it starts growing, move content out rather than trimming prose:
| Content | Where it belongs | Why |
|---|---|---|
| Multi-step procedures | A skill | Loads on demand, only when relevant |
| Directory- or file-type-specific rules | .claude/rules/*.md with paths: frontmatter |
Scoped by glob; loads only when you touch matching files |
| Reference material and long examples | A skill's references/ directory |
Read only when the skill needs it |
| Things Claude should remember about you | Auto memory (on by default) | Written and loaded automatically |
Note:
@pathimports organize a large CLAUDE.md but do not save context — imported files are pulled in at load time just the same. Splitting into path-scoped rules is what actually reduces what loads.
/doctor (v2.1.206+) inspects your configuration and proposes trims when CLAUDE.md has grown past the point of usefulness.
Don't Write Verification Reminders
Older guidance encouraged lines like "always run the tests before saying you're done" or "double-check your work". On Claude Opus 5 and Fable 5 these now cause over-verification — Claude re-checks work that was already correct, burning turns and tokens.
Anthropic removed more than 80% of Claude Code's own system prompt for the Claude 5 generation with no measured regression. The same principle applies to your CLAUDE.md: prefer stating the goal and letting Claude exercise judgment over enumerating the checks it should perform.
Delete verification reminders from existing CLAUDE.md files targeting Opus 5 or Fable 5. Keep genuinely non-obvious project requirements — "integration tests need Docker running" is information, not a reminder.
Memory Management Tips
Choose the right memory level:
| Use Case | Memory Level | Rationale |
|---|---|---|
| Company security policy | Managed Policy | Applies to all projects organization-wide |
| Team code style guide | Project | Shared with team via git |
| Your preferred editor shortcuts | User | Personal preference, not shared |
| API module standards | Directory | Specific to that module only |
Quick update workflow:
- For single rules: Use
/memoryto open editor, or ask conversationally - For multiple changes: Use
/memoryto open editor - For initial setup: Use
/initto create template
Import best practices:
# Good: Reference existing docs
@README.md
@docs/architecture.md
@package.json
# Avoid: Copying content that exists elsewhere
# Instead of copying README content into CLAUDE.md, just import itInstallation Instructions
Setup Project Memory
Method 1: Using `/init` Command (Recommended)
The fastest way to set up project memory:
Navigate to your project directory:
bashcd /path/to/your/projectRun the init command in Claude Code:
bash/initClaude will create and populate CLAUDE.md with a template structure
Customize the generated file to match your project needs
Commit to git:
bashgit add CLAUDE.md git commit -m "Initialize project memory with /init"
Method 2: Manual Creation
If you prefer manual setup:
Create a CLAUDE.md in your project root:
bashcd /path/to/your/project touch CLAUDE.mdAdd project standards:
bashcat > CLAUDE.md << 'EOF' # Project Configuration ## Project Overview - **Name**: Your Project Name - **Tech Stack**: List your technologies - **Team Size**: Number of developers ## Development Standards - Your coding standards - Naming conventions - Testing requirements EOFCommit to git:
bashgit add CLAUDE.md git commit -m "Add project memory configuration"
Setup Personal Memory
Create ~/.claude directory:
bashmkdir -p ~/.claudeCreate personal CLAUDE.md:
bashtouch ~/.claude/CLAUDE.mdAdd your preferences:
bashcat > ~/.claude/CLAUDE.md << 'EOF' # My Development Preferences ## About Me - Experience Level: [Your level] - Preferred Languages: [Your languages] - Communication Style: [Your style] ## Code Preferences - [Your preferences] EOF
Setup Directory-Specific Memory
Create memory for specific directories:
bashmkdir -p /path/to/directory/.claude touch /path/to/directory/CLAUDE.mdAdd directory-specific rules:
bashcat > /path/to/directory/CLAUDE.md << 'EOF' # [Directory Name] Standards This file overrides root CLAUDE.md for this directory. ## [Specific Standards] EOFCommit to version control:
bashgit add /path/to/directory/CLAUDE.md git commit -m "Add [directory] memory configuration"
Verify Setup
Check memory locations:
bash# Project root memory ls -la ./CLAUDE.md # Personal memory ls -la ~/.claude/CLAUDE.mdClaude Code will automatically load these files when starting a session
Test with Claude Code by starting a new session in your project
Official Documentation
For the most up-to-date information, refer to the official Claude Code documentation:
- Memory Documentation - Complete memory system reference
- Slash Commands Reference - All built-in commands including
/initand/memory - CLI Reference - Command-line interface documentation
Key Technical Details from Official Docs
Memory Loading:
- All memory files are automatically loaded when Claude Code launches
- Claude traverses upward from the current working directory to discover CLAUDE.md files
- Subtree files are discovered and loaded contextually when accessing those directories
Import Syntax:
- Use
@path/to/fileto include external content (e.g.,@~/.claude/my-project-instructions.md) - Supports both relative and absolute paths (relative paths resolve relative to the file containing the import, not the working directory)
- Recursive imports supported with a maximum depth of 4 hops
- First-time external imports trigger an approval dialog
- Not evaluated inside markdown code spans or code blocks
- Automatically includes referenced content in Claude's context
CLAUDE.md Load Order (concatenated into context, not strict override — see Memory Hierarchy in Claude Code above):
- Managed Policy (loads first)
- User-Level Rules (
~/.claude/rules/) - User Memory
- Project Rules (
.claude/rules/) - Project Memory
- Local Project Memory (loads last)
Auto Memory is a separate mechanism (~/.claude/projects//memory/), not part of this concatenation order.
Related Concepts Links
Integration Points
- MCP Protocol - Live data access alongside memory
- Slash Commands - Session-specific shortcuts
- Skills - Automated workflows with memory context
Related Claude Features
- Claude Web Memory - Automatic synthesis
- Official Memory Docs - Anthropic documentation
Last Updated: August 4, 2026
Claude Code Version: 2.1.220
Sources:
- https://code.claude.com/docs/en/memory
Compatible Models: Claude Fable 5, Claude Opus 5, Claude Sonnet 5, Claude Sonnet 4.6, Claude Opus 4.8, Claude Haiku 4.5
File: 03-skills/README.md
Agent Skills Guide
Agent Skills are reusable, filesystem-based capabilities that extend Claude's functionality. They package domain-specific expertise, workflows, and best practices into discoverable components that Claude automatically uses when relevant.
Overview
Agent Skills are modular capabilities that transform general-purpose agents into specialists. Unlike prompts (conversation-level instructions for one-off tasks), Skills load on-demand and eliminate the need to repeatedly provide the same guidance across multiple conversations.
Key Benefits
- Specialize Claude: Tailor capabilities for domain-specific tasks
- Reduce repetition: Create once, use automatically across conversations
- Compose capabilities: Combine Skills to build complex workflows
- Scale workflows: Reuse skills across multiple projects and teams
- Maintain quality: Embed best practices directly into your workflow
Skills follow the Agent Skills open standard, which works across multiple AI tools. Claude Code extends the standard with additional features like invocation control, subagent execution, and dynamic context injection.
Note: Custom slash commands have been merged into skills.
.claude/commands/files still work and support the same frontmatter fields. Skills are recommended for new development. When both exist at the same path (e.g.,.claude/commands/review.mdand.claude/skills/review/SKILL.md), the skill takes precedence.
How Skills Work: Progressive Disclosure
Skills leverage a progressive disclosure architecture—Claude loads information in stages as needed, rather than consuming context upfront. This enables efficient context management while maintaining unlimited scalability.
Three Levels of Loading
graph TB
subgraph "Level 1: Metadata (Always Loaded)"
A["YAML Frontmatter"]
A1["~100 tokens per skill"]
A2["name + description"]
end
subgraph "Level 2: Instructions (When Triggered)"
B["SKILL.md Body"]
B1["Under 5k tokens"]
B2["Workflows & guidance"]
end
subgraph "Level 3: Resources (As Needed)"
C["Bundled Files"]
C1["Effectively unlimited"]
C2["Scripts, templates, docs"]
end
A --> B
B --> C| Level | When Loaded | Token Cost | Content |
|---|---|---|---|
| Level 1: Metadata | Always (at startup) | ~100 tokens per Skill | name and description from YAML frontmatter |
| Level 2: Instructions | When Skill is triggered | Under 5k tokens | SKILL.md body with instructions and guidance |
| Level 3+: Resources | As needed | Effectively unlimited | Bundled files executed via bash without loading contents into context |
This means you can install many Skills without context penalty—Claude only knows each Skill exists and when to use it until actually triggered.
Skill Loading Process
sequenceDiagram
participant User
participant Claude
participant System
participant SkillInst as Skill Instructions
participant SkillRes as Skill Resources
User->>Claude: "Review this code for security issues"
Claude->>System: Check available skills (metadata)
System-->>Claude: Skill descriptions loaded at startup
Claude->>Claude: Match request to skill description
Claude->>SkillInst: Read code-review-specialist/SKILL.md
SkillInst-->>Claude: Level 2: Instructions loaded
Claude->>Claude: Determine: Need templates?
Claude->>SkillRes: Read templates/checklist.md
SkillRes-->>Claude: Level 3: Template loaded
Claude->>Claude: Execute skill instructions
Claude->>User: Comprehensive code reviewSkill Types & Locations
| Type | Location | Scope | Shared | Best For |
|---|---|---|---|---|
| Enterprise | Managed settings | All org users | Yes | Organization-wide standards |
| Personal | ~/.claude/skills/<skill-name>/SKILL.md |
Individual | No | Personal workflows |
| Project | .claude/skills/<skill-name>/SKILL.md |
Team | Yes (via git) | Team standards |
| Plugin | /skills/<skill-name>/SKILL.md |
Where enabled | Depends | Bundled with plugins |
When skills share the same name across levels, higher-priority locations win: enterprise > project > personal. Project skills override personal ones by default; the skillOverrides setting (v2.1.129+) tunes that behavior — see Controlling Skill Override Behavior. Plugin skills use a plugin-name:skill-name namespace, so they cannot conflict.
Subagent skill discovery (v2.1.133+): Subagents now discover project, user, and plugin skills via the Skill tool the same way the main session does. Earlier versions limited subagents to their own embedded set, which meant skill+subagent workflows quietly degraded; from v2.1.133 the same skill catalog is visible to both.
Automatic Discovery
Nested directories: When you work with files in subdirectories, Claude Code automatically discovers skills from nested .claude/skills/ directories. For example, if you're editing a file in packages/frontend/, Claude Code also looks for skills in packages/frontend/.claude/skills/. This supports monorepo setups where packages have their own skills. As of v2.1.178, when a skill name collides across nested .claude/skills/ directories, the directory closest to your current working directory wins — a package-level skill overrides a repo-root skill of the same name.
--add-dir directories: Skills from directories added via --add-dir are loaded automatically with live change detection. Any edits to skill files in those directories take effect immediately without restarting Claude Code.
Reloading skills: The /reload-skills command (added v2.1.152) re-scans all skill directories without restarting the session — useful after adding or editing a skill that isn't picked up by live detection. A SessionStart hook can trigger the same re-scan by returning reloadSkills: true (see Hooks).
Description budget: Skill descriptions (Level 1 metadata) are capped at 1% of the context window (fallback: 8,000 characters). If you have many skills installed, descriptions may be shortened. All skill names are always included, but descriptions are trimmed to fit. Front-load the key use case in descriptions. Override the budget with the SLASH_COMMAND_TOOL_CHAR_BUDGET environment variable.
Creating Custom Skills
Basic Directory Structure
my-skill/
├── SKILL.md # Main instructions (required)
├── template.md # Template for Claude to fill in
├── examples/
│ └── sample.md # Example output showing expected format
└── scripts/
└── validate.sh # Script Claude can executeSKILL.md Format
---
name: your-skill-name
---
# Your Skill Name
## Instructions
Provide clear, step-by-step guidance for Claude.
## Examples
Show concrete examples of using this Skill.Required Fields
- name: lowercase letters, numbers, hyphens only (max 64 characters). Cannot contain "anthropic" or "claude".
- description: what the Skill does AND when to use it (max 1024 characters). This is critical for Claude to know when to activate the skill.
Optional Frontmatter Fields
---
name: my-skill
argument-hint: "[filename] [format]" # Hint for autocomplete
disable-model-invocation: true # Only user can invoke
user-invocable: false # Hide from slash menu
allowed-tools: Read, Grep, Glob # Restrict tool access
disallowed-tools: Write, Edit # Remove specific tools while active (v2.1.152)
model: opus # Specific model to use
effort: high # Effort level override (low, medium, high, xhigh, max)
context: fork # Run in isolated subagent
agent: Explore # Which agent type (with context: fork)
background: false # Fork skills run in background (default true); false = foreground
shell: bash # Shell for commands: bash (default) or powershell
hooks: # Skill-scoped hooks
PreToolUse:
- matcher: "Bash"
hooks:
- type: command
command: "./scripts/validate.sh"
paths: "src/api/**/*.ts" # Glob patterns limiting when skill activates
---| Field | Description |
|---|---|
name |
Lowercase letters, numbers, hyphens only (max 64 chars). Cannot contain "anthropic" or "claude". |
description |
What the Skill does AND when to use it (max 1024 chars). Critical for auto-invocation matching. |
argument-hint |
Hint shown in the / autocomplete menu (e.g., "[filename] [format]"). |
disable-model-invocation |
true = only the user can invoke via /name. Claude will never auto-invoke. |
user-invocable |
false = hidden from the / menu. Only Claude can invoke it automatically. |
allowed-tools |
Comma-separated list of tools the skill may use without permission prompts. |
disallowed-tools |
Comma-separated list of tools to remove while the skill is active (complements allowed-tools). Added v2.1.152. |
model |
Model override while the skill is active (e.g., opus, sonnet). |
effort |
Effort level override while the skill is active: low, medium, high, xhigh, or max — all five are supported on Opus 5, Sonnet 5, Opus 4.8, and Opus 4.7. The default effort is high on every model that supports effort, except Opus 4.7 which defaults to xhigh. |
context |
fork to run the skill in a forked subagent context with its own context window. |
agent |
Subagent type when context: fork (e.g., Explore, Plan, general-purpose). |
background |
Only meaningful with context: fork. Defaults to true for context: fork skills, so they run in the background; set false to run them in the foreground. Added v2.1.218. |
shell |
Shell used for !`command` substitutions and scripts: bash (default) or powershell. |
hooks |
Hooks scoped to this skill's lifecycle (same format as global hooks). |
paths |
Glob patterns that limit when the skill is auto-activated. Comma-separated string or YAML list. Same format as path-specific rules. |
Since v2.1.218, boolean frontmatter fields also accept yes/no, on/off, and 1/0 (case-insensitive) in addition to true/false.
Skill Content Types
Skills can contain two types of content, each suited for different purposes:
Reference Content
Adds knowledge Claude applies to your current work—conventions, patterns, style guides, domain knowledge. Runs inline with your conversation context.
---
name: api-conventions
---
When writing API endpoints:
- Use RESTful naming conventions
- Return consistent error formats
- Include request validationTask Content
Step-by-step instructions for specific actions. Often invoked directly with /skill-name.
---
name: deploy
context: fork
disable-model-invocation: true
---
Deploy the application:
1. Run the test suite
2. Build the application
3. Push to the deployment targetControlling Skill Invocation
By default, both you and Claude can invoke any skill. Two frontmatter fields control the three invocation modes:
| Frontmatter | You can invoke | Claude can invoke |
|---|---|---|
| (default) | Yes | Yes |
disable-model-invocation: true |
Yes | No |
user-invocable: false |
No | Yes |
Use disable-model-invocation: true for workflows with side effects: /commit, /deploy, /send-slack-message. You don't want Claude deciding to deploy because your code looks ready.
Use user-invocable: false for background knowledge that isn't actionable as a command. A legacy-system-context skill explains how an old system works—useful for Claude, but not a meaningful action for users.
String Substitutions
Skills support dynamic values that are resolved before the skill content reaches Claude:
| Variable | Description |
|---|---|
$ARGUMENTS |
All arguments passed when invoking the skill |
$ARGUMENTS[N] or $N |
Access specific argument by index (0-based) |
${CLAUDE_SESSION_ID} |
Current session ID |
${CLAUDE_SKILL_DIR} |
Directory containing the skill's SKILL.md file |
${CLAUDE_PROJECT_DIR} |
Absolute path to the project root. Usable in the skill body and in allowed-tools (v2.1.196) |
${CLAUDE_EFFORT} |
Current effort level (low, medium, high, xhigh, or max). Useful for branching skill behavior: e.g., [ "${CLAUDE_EFFORT}" = "max" ] && deep_analysis (v2.1.120+) |
!`command` |
Dynamic context injection — runs a shell command and inlines the output |
Example:
---
name: fix-issue
---
Fix GitHub issue $ARGUMENTS following our coding standards.
1. Read the issue description
2. Implement the fix
3. Write tests
4. Create a commitRunning /fix-issue 123 replaces $ARGUMENTS with 123.
Stacking Skills
You can stack slash-skills in a single invocation, like /code-review /fix-issue 123. As of v2.1.199, this loads ALL leading skills — the first plus up to 5 more — and passes the trailing arguments (123) to each; previously only the first skill loaded. If the same skill is invoked more than once, its identical content is de-duplicated (v2.1.202) rather than appended twice.
Injecting Dynamic Context
The !`command` syntax runs shell commands before the skill content is sent to Claude:
---
name: pr-summary
context: fork
agent: Explore
---
## Pull request context
- PR diff: !`gh pr diff`
- PR comments: !`gh pr view --comments`
- Changed files: !`gh pr diff --name-only`
## Your task
Summarize this pull request...Commands execute immediately; Claude only sees the final output. By default, commands run in bash. Set shell: powershell in frontmatter to use PowerShell instead.
Running Skills in Subagents
Add context: fork to run a skill in an isolated subagent context. The skill content becomes the task for a dedicated subagent with its own context window, keeping the main conversation uncluttered. As of v2.1.218, background defaults to true for context: fork skills, so they run in the background; set background: false in the frontmatter to run a fork skill in the foreground instead.
v2.1.145 fix: A skill using
context: forkcould previously trigger an infinite re-invocation loop in rare cases. Upgrade to v2.1.145+ if you author or rely on forking skills.
The agent field specifies which agent type to use:
| Agent Type | Best For |
|---|---|
Explore |
Read-only research, codebase analysis |
Plan |
Creating implementation plans |
general-purpose |
Broad tasks requiring all tools |
| Custom agents | Specialized agents defined in your configuration |
Example frontmatter:
---
context: fork
agent: Explore
---Full skill example:
---
name: topic-research
context: fork
agent: Explore
---
Research $ARGUMENTS thoroughly:
1. Find relevant files using Glob and Grep
2. Read and analyze the code
3. Summarize findings with specific file referencesPractical Examples
Example 1: Code Review Skill
Directory Structure:
~/.claude/skills/code-review-specialist/
├── SKILL.md
├── templates/
│ ├── review-checklist.md
│ └── finding-template.md
└── scripts/
├── analyze-metrics.py
└── compare-complexity.pyFile: ~/.claude/skills/code-review-specialist/SKILL.md
---
name: code-review-specialist
---
# Code Review Skill
This skill provides comprehensive code review capabilities focusing on:
1. **Security Analysis**
- Authentication/authorization issues
- Data exposure risks
- Injection vulnerabilities
- Cryptographic weaknesses
2. **Performance Review**
- Algorithm efficiency (Big O analysis)
- Memory optimization
- Database query optimization
- Caching opportunities
3. **Code Quality**
- SOLID principles
- Design patterns
- Naming conventions
- Test coverage
4. **Maintainability**
- Code readability
- Function size (should be < 50 lines)
- Cyclomatic complexity
- Type safety
## Review Template
For each piece of code reviewed, provide:
### Summary
- Overall quality assessment (1-5)
- Key findings count
- Recommended priority areas
### Critical Issues (if any)
- **Issue**: Clear description
- **Location**: File and line number
- **Impact**: Why this matters
- **Severity**: Critical/High/Medium
- **Fix**: Code example
For detailed checklists, see [templates/review-checklist.md](templates/review-checklist.md).Example 2: Codebase Visualizer Skill
A skill that generates interactive HTML visualizations:
Directory Structure:
~/.claude/skills/codebase-visualizer/
├── SKILL.md
└── scripts/
└── visualize.pyFile: ~/.claude/skills/codebase-visualizer/SKILL.md
---
name: codebase-visualizer
allowed-tools: Bash(python *)
---
# Codebase Visualizer
Generate an interactive HTML tree view showing your project's file structure.
## Usage
Run the visualization script from your project root:
```bash
python ~/.claude/skills/codebase-visualizer/scripts/visualize.py .
```
This creates `codebase-map.html` and opens it in your default browser.
## What the visualization shows
- **Collapsible directories**: Click folders to expand/collapse
- **File sizes**: Displayed next to each file
- **Colors**: Different colors for different file types
- **Directory totals**: Shows aggregate size of each folderThe bundled Python script does the heavy lifting while Claude handles orchestration.
Example 3: Deploy Skill (User-Invoked Only)
---
name: deploy
disable-model-invocation: true
allowed-tools: Bash(npm *), Bash(git *)
---
Deploy $ARGUMENTS to production:
1. Run the test suite: `npm test`
2. Build the application: `npm run build`
3. Push to the deployment target
4. Verify the deployment succeeded
5. Report deployment statusExample 4: Brand Voice Skill (Background Knowledge)
---
name: brand-voice
user-invocable: false
---
## Tone of Voice
- **Friendly but professional** - approachable without being casual
- **Clear and concise** - avoid jargon
- **Confident** - we know what we're doing
- **Empathetic** - understand user needs
## Writing Guidelines
- Use "you" when addressing readers
- Use active voice
- Keep sentences under 20 words
- Start with value proposition
For templates, see [templates/](templates/).Example 5: CLAUDE.md Generator Skill
---
name: claude-md
---
## Core Principles
**LLMs are stateless**: CLAUDE.md is the only file automatically included in every conversation.
### The Golden Rules
1. **Less is More**: Keep under 300 lines (ideally under 100)
2. **Universal Applicability**: Only include information relevant to EVERY session
3. **Don't Use Claude as a Linter**: Use deterministic tools instead
4. **Never Auto-Generate**: Craft it manually with careful consideration
## Essential Sections
- **Project Name**: Brief one-line description
- **Tech Stack**: Primary language, frameworks, database
- **Development Commands**: Install, test, build commands
- **Critical Conventions**: Only non-obvious, high-impact conventions
- **Known Issues / Gotchas**: Things that trip up developersExample 6: Refactoring Skill with Scripts
Directory Structure:
refactor/
├── SKILL.md
├── references/
│ ├── code-smells.md
│ └── refactoring-catalog.md
├── templates/
│ └── refactoring-plan.md
└── scripts/
├── analyze-complexity.py
└── detect-smells.pyFile: refactor/SKILL.md
---
name: refactor
---
# Code Refactoring Skill
A phased approach emphasizing safe, incremental changes backed by tests.
## Workflow
Phase 1: Research & Analysis → Phase 2: Test Coverage Assessment →
Phase 3: Code Smell Identification → Phase 4: Refactoring Plan Creation →
Phase 5: Incremental Implementation → Phase 6: Review & Iteration
## Core Principles
1. **Behavior Preservation**: External behavior must remain unchanged
2. **Small Steps**: Make tiny, testable changes
3. **Test-Driven**: Tests are the safety net
4. **Continuous**: Refactoring is ongoing, not a one-time event
For code smell catalog, see [references/code-smells.md](references/code-smells.md).
For refactoring techniques, see [references/refactoring-catalog.md](references/refactoring-catalog.md).Supporting Files
Skills can include multiple files in their directory beyond SKILL.md. These supporting files (templates, examples, scripts, reference documents) let you keep the main skill file focused while providing Claude with additional resources it can load as needed.
my-skill/
├── SKILL.md # Main instructions (required, keep under 500 lines)
├── templates/ # Templates for Claude to fill in
│ └── output-format.md
├── examples/ # Example outputs showing expected format
│ └── sample-output.md
├── references/ # Domain knowledge and specifications
│ └── api-spec.md
└── scripts/ # Scripts Claude can execute
└── validate.shGuidelines for supporting files:
- Keep
SKILL.mdunder 500 lines. Move detailed reference material, large examples, and specifications to separate files. - Reference additional files from
SKILL.mdusing relative paths (e.g.,[API reference](references/api-spec.md)). - Supporting files are loaded at Level 3 (as needed), so they do not consume context until Claude actually reads them.
Managing Skills
Viewing Available Skills
Ask Claude directly:
What Skills are available?Or check the filesystem:
# List personal Skills
ls ~/.claude/skills/
# List project Skills
ls .claude/skills/Tip (v2.1.121+): Type to filter the
/skillsinteractive menu — useful when many skills are installed.
Testing a Skill
Two ways to test:
Let Claude invoke it automatically by asking something that matches the description:
Can you help me review this code for security issues?Or invoke it directly with the skill name:
/code-review-specialist src/auth/login.tsNote: This local skill is installed as
code-review-specialistso it does not collide with the built-in/code-reviewcommand (the renamed/simplify, shipped in Claude Code v2.1.146). If you copy it to~/.claude/skills/code-review/instead, it will shadow the built-in — keep the-specialistsuffix to avoid that.
Updating a Skill
Edit the SKILL.md file directly. Changes take effect on next Claude Code startup.
# Personal Skill
code ~/.claude/skills/my-skill/SKILL.md
# Project Skill
code .claude/skills/my-skill/SKILL.mdRestricting Claude's Skill Access
Three ways to control which skills Claude can invoke:
Disable all skills in /permissions:
# Add to deny rules:
SkillAllow or deny specific skills:
# Allow only specific skills
Skill(commit)
Skill(review-pr *)
# Deny specific skills
Skill(deploy *)Hide individual skills by adding disable-model-invocation: true to their frontmatter.
Controlling Skill Override Behavior (`skillOverrides`)
When a project skill and a user skill share the same name, project wins by default. The skillOverrides setting (v2.1.129+) lets you tune this. Add it to ~/.claude/settings.json or project .claude/settings.json:
{
"skillOverrides": "name-only"
}Accepted values:
| Value | Behavior |
|---|---|
"on" (default) |
A repo skill can override a user skill of the same name. |
"off" |
Disable overriding entirely — user skills always win. |
"name-only" |
Match overrides only on skill name (ignore description / source). |
"user-invocable-only" |
Only user-invocable skills can be overridden — model-invoked skills always come from their original location. |
Useful when team policy says "user-defined skills must always take precedence" ("off") or "only allow narrow name-based overrides" ("name-only").
Best Practices
1. Make Descriptions Specific
- Bad (Vague): "Helps with documents"
- Good (Specific): "Extract text and tables from PDF files, fill forms, merge documents. Use when working with PDF files or when the user mentions PDFs, forms, or document extraction."
2. Keep Skills Focused
- One Skill = one capability
- ✅ "PDF form filling"
- ❌ "Document processing" (too broad)
3. Include Trigger Terms
Add keywords in descriptions that match user requests:
4. Keep SKILL.md Under 500 Lines
Move detailed reference material to separate files that Claude loads as needed.
5. Reference Supporting Files
## Additional resources
- For complete API details, see [reference.md](reference.md)
- For usage examples, see [examples.md](examples.md)Do's
- Use clear, descriptive names
- Include comprehensive instructions
- Add concrete examples
- Package related scripts and templates
- Test with real scenarios
- Document dependencies
Don'ts
- Don't create skills for one-time tasks
- Don't duplicate existing functionality
- Don't make skills too broad
- Don't skip the description field
- Don't install skills from untrusted sources without auditing
Troubleshooting
Quick Reference
| Issue | Solution |
|---|---|
| Claude doesn't use Skill | Make description more specific with trigger terms |
| Skill file not found | Verify path: ~/.claude/skills/name/SKILL.md |
| YAML errors | Check --- markers, indentation, no tabs |
| Skills conflict | Use distinct trigger terms in descriptions |
| Scripts not running | Check permissions: chmod +x scripts/*.py |
| Claude doesn't see all skills | Too many skills; check /context for warnings |
Skill Not Triggering
If Claude doesn't use your skill when expected:
- Check the description includes keywords users would naturally say
- Verify the skill appears when asking "What skills are available?"
- Try rephrasing your request to match the description
- Invoke directly with
/skill-nameto test
Skill Triggers Too Often
If Claude uses your skill when you don't want it:
- Make the description more specific
- Add
disable-model-invocation: truefor manual-only invocation
Claude Doesn't See All Skills
Skill descriptions are loaded at 1% of the context window (fallback: 8,000 characters). Each entry is capped at 250 characters regardless of budget. Run /context to check for warnings about excluded skills. Override the budget with the SLASH_COMMAND_TOOL_CHAR_BUDGET environment variable.
Security Considerations
Only use Skills from trusted sources. Skills provide Claude with capabilities through instructions and code—a malicious Skill can direct Claude to invoke tools or execute code in harmful ways.
Key security considerations:
- Audit thoroughly: Review all files in the Skill directory
- External sources are risky: Skills that fetch from external URLs can be compromised
- Tool misuse: Malicious Skills can invoke tools in harmful ways
- Treat like installing software: Only use Skills from trusted sources
Disabling shell substitution in skills
Skills support the !`command` syntax to inject the output of shell commands into the prompt before Claude sees it. In security-sensitive environments (shared enterprise deployments, locked-down CI runners) you can disable this substitution entirely via the disableSkillShellExecution setting (added in v2.1.91):
// ~/.claude/settings.json or managed policy
{
"disableSkillShellExecution": true
}When disableSkillShellExecution is true, any !`command` markers in a skill are left as literal text instead of being executed — removing the skill-level shell-injection attack surface without disabling skills themselves. Consider combining this with an allowedTools allowlist for defense in depth.
Hiding bundled skills (`disableBundledSkills`)
The disableBundledSkills setting (added in v2.1.169) hides the bundled skills, workflows, and commands that ship with Claude Code from the model. Use it when the built-in skills are noise for a given project, or to reduce the model's skill surface:
// ~/.claude/settings.json or project .claude/settings.json
{
"disableBundledSkills": true
}The equivalent environment-variable form is:
export CLAUDE_CODE_DISABLE_BUNDLED_SKILLS=1Skills vs Other Features
| Feature | Invocation | Best For |
|---|---|---|
| Skills | Auto or /name |
Reusable expertise, workflows |
| Slash Commands | User-initiated /name |
Quick shortcuts (merged into skills) |
| Subagents | Auto-delegated | Isolated task execution |
| Memory (CLAUDE.md) | Always loaded | Persistent project context |
| MCP | Real-time | External data/service access |
| Hooks | Event-driven | Automated side effects |
Bundled Skills
Claude Code ships with a set of built-in skills that are always available without installation (the most useful ones are listed below; see the commands reference for the full set):
| Skill | Description |
|---|---|
/batch |
Orchestrate large-scale parallel changes across codebase using git worktrees |
/claude-api |
Load Claude API/SDK reference; auto-activates on anthropic/@anthropic-ai/sdk imports |
/dataviz |
Chart and dashboard design guidance with a runnable color-palette validator (v2.1.198) |
/debug [description] |
Troubleshoot current session by reading debug log |
/deep-research <topic> |
Run an in-depth research pass on a topic (explicit invocation only since v2.1.218 — Claude won't trigger this on its own) |
/fewer-permission-prompts |
Scan transcripts and propose a prioritized allowlist for common read-only tools |
/loop [interval] |
Run prompt repeatedly on interval (e.g., /loop 5m check the deploy) |
/run (v2.1.145+) |
Launch this project's app to see a change running — looks for a project skill, otherwise falls back to built-in patterns per project type |
/run-skill-generator (v2.1.145+) |
Teach /run//verify how to handle a specific project by generating a per-project skill |
/code-review [effort] |
Review the current diff for correctness bugs at a chosen effort level (e.g. /code-review high); pass --comment to post findings as inline PR comments. A distinct skill from /simplify (quality/reuse cleanups), which was split back out in v2.1.154. (explicit invocation only since v2.1.215 — Claude won't trigger this on its own) Since v2.1.218 it runs as a background subagent, so review work no longer fills your conversation and stacked slash commands stay its review target. |
/simplify |
Cleanup-only review — reuse, simplification, efficiency, altitude — and applies the fixes. Split back out from /code-review in v2.1.154 |
/verify (v2.1.145+) |
Build, run, and observe the app to confirm a fix works (not just that tests pass) (explicit invocation only since v2.1.215 — Claude won't trigger this on its own) |
These skills are available out-of-the-box and do not need to be installed or configured. They follow the same SKILL.md format as custom skills.
Sharing Skills
Project Skills (Team Sharing)
- Create Skill in
.claude/skills/ - Commit to git
- Team members pull changes — Skills available immediately
Personal Skills
# Copy to personal directory
cp -r my-skill ~/.claude/skills/
# Make scripts executable
chmod +x ~/.claude/skills/my-skill/scripts/*.pyPlugin Distribution
Package skills in a plugin's skills/ directory for broader distribution.
Going Further: A Skill Collection and a Skill Manager
Once you start building skills seriously, two things become essential: a library of proven skills and a tool to manage them.
luongnv89/skills — A collection of skills I use daily across almost all my projects. Highlights include logo-designer (generates project logos on the fly) and ollama-optimizer (tunes local LLM performance for your hardware). Great starting point if you want ready-to-use skills.
luongnv89/asm — Agent Skill Manager. Handles skill development, duplicate detection, and testing. The asm link command lets you test a skill in any project without copying files around — essential once you have more than a handful of skills.
Additional Resources
- Official Skills Documentation
- Agent Skills Architecture Blog
- Skills Repository - Collection of ready-to-use skills
- Slash Commands Guide - User-initiated shortcuts
- Subagents Guide - Delegated AI agents
- Memory Guide - Persistent context
- MCP (Model Context Protocol) - Real-time external data
- Hooks Guide - Event-driven automation
Last Updated: August 4, 2026
Claude Code Version: 2.1.220
Sources:
- https://code.claude.com/docs/en/skills
- https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md
- https://code.claude.com/docs/en/model-config
Compatible Models: Claude Fable 5, Claude Opus 5, Claude Sonnet 5, Claude Sonnet 4.6, Claude Opus 4.8, Claude Haiku 4.5
File: 04-subagents/README.md
Subagents - Complete Reference Guide
Subagents are specialized AI assistants that Claude Code can delegate tasks to. Each subagent has a specific purpose, uses its own context window separate from the main conversation, and can be configured with specific tools and a custom system prompt.
Table of Contents
- Overview
- Key Benefits
- File Locations
- Configuration
- Built-in Subagents
- Managing Subagents
- Using Subagents
- Resumable Agents
- Chaining Subagents
- Persistent Memory for Subagents
- Background Subagents
- Worktree Isolation
- Forked Subagents
- Restrict Spawnable Subagents
claude agentsCLI Command- Agent Teams (Experimental)
- Plugin Subagent Security
- Architecture
- Context Management
- When to Use Subagents
- Best Practices
- Example Subagents in This Folder
- Installation Instructions
- File Structure
- Related Concepts
- Observability
- Additional Resources
Overview
Subagents enable delegated task execution in Claude Code by:
- Creating isolated AI assistants with separate context windows
- Providing customized system prompts for specialized expertise
- Enforcing tool access control to limit capabilities
- Preventing context pollution from complex tasks
- Enabling parallel execution of multiple specialized tasks
Each subagent operates independently with a clean slate, receiving only the specific context necessary for their task, then returning results to the main agent for synthesis.
Quick Start: Ask Claude to create a subagent for you ("create a subagent that reviews security"), or add a .claude/agents/<name>.md file directly — see Managing Subagents below.
Note: As of v2.1.198, the
/agentscommand no longer opens an interactive creation wizard. Create and manage subagents by asking Claude or editing.claude/agents/files directly.
Key Benefits
| Benefit | Description |
|---|---|
| Context preservation | Operates in separate context, preventing pollution of main conversation |
| Specialized expertise | Fine-tuned for specific domains with higher success rates |
| Reusability | Use across different projects and share with teams |
| Flexible permissions | Different tool access levels for different subagent types |
| Scalability | Multiple agents work on different aspects simultaneously |
File Locations
Subagent files can be stored in multiple locations with different scopes:
| Priority | Type | Location | Scope |
|---|---|---|---|
| 1 (highest) | CLI-defined | Via --agents flag (JSON) |
Session only |
| 2 | Project subagents | .claude/agents/ |
Current project |
| 3 | User subagents | ~/.claude/agents/ |
All projects |
| 4 (lowest) | Plugin agents | Plugin agents/ directory |
Via plugins |
When duplicate names exist, higher-priority sources take precedence.
Nested
.claude/precedence (v2.1.178): When the same agent name is defined in multiple nested.claude/agents/directories (for example, a monorepo with package-level.claude/folders), the definition closest to your current working directory wins. The same closest-wins rule applies to nested workflow and output-style definitions.
Configuration
File Format
Subagents are defined in YAML frontmatter followed by the system prompt in markdown:
---
name: your-sub-agent-name
tools: tool1, tool2, tool3 # Optional - inherits all tools if omitted
disallowedTools: tool4 # Optional - explicitly disallowed tools
model: sonnet # Optional - sonnet, opus, haiku, or inherit
permissionMode: default # Optional - permission mode
maxTurns: 20 # Optional - limit agentic turns
skills: skill1, skill2 # Optional - skills to preload into context
mcpServers: server1 # Optional - MCP servers to make available
memory: user # Optional - persistent memory scope (user, project, local)
background: false # Optional - run as background task
effort: high # Optional - reasoning effort (low, medium, high, xhigh, max)
isolation: worktree # Optional - git worktree isolation
initialPrompt: "Start by analyzing the codebase" # Optional - auto-submitted first turn
hooks: # Optional - component-scoped hooks
PreToolUse:
- matcher: "Bash"
hooks:
- type: command
command: "./scripts/security-check.sh"
---
Your subagent's system prompt goes here. This can be multiple paragraphs
and should clearly define the subagent's role, capabilities, and approach
to solving problems.Configuration Fields
| Field | Required | Description |
|---|---|---|
name |
Yes | Unique identifier (lowercase letters and hyphens). Lookup is normalized (case- and separator-insensitive — see below), but a name containing : is rejected as of v2.1.218: : is reserved for plugin namespacing |
description |
Yes | Natural language description of purpose. Include "use PROACTIVELY" to encourage automatic invocation |
tools |
No | Comma-separated list of specific tools. Omit to inherit all tools. Supports Agent(agent_name) syntax to restrict spawnable subagents |
disallowedTools |
No | Comma-separated list of tools the subagent must not use |
model |
No | Model to use: sonnet, opus, haiku, full model ID, or inherit. Defaults to configured subagent model |
permissionMode |
No | default, acceptEdits, dontAsk, bypassPermissions, plan. As of v2.1.212, the Task tool's mode invocation parameter is deprecated and ignored — subagents inherit the parent session's permission mode by default unless overridden here |
maxTurns |
No | Maximum number of agentic turns the subagent can take |
skills |
No | Comma-separated list of skills to preload. Injects full skill content into the subagent's context at startup. v2.1.133+: subagents also discover project, user, and plugin skills via the Skill tool — same catalog as the main session, no longer limited to their own embedded set. |
mcpServers |
No | MCP servers to make available to the subagent |
hooks |
No | Component-scoped hooks (PreToolUse, PostToolUse, Stop) |
memory |
No | Persistent memory directory scope: user, project, or local |
background |
No | Subagents already run in the background by default (v2.1.198). Set to true to force background always and prevent inline execution |
effort |
No | Reasoning effort level: low, medium, high, xhigh, or max. Overrides the session effort level; available levels depend on the model |
isolation |
No | Set to worktree to give the subagent its own git worktree |
initialPrompt |
No | Auto-submitted first turn when the subagent runs as the main agent |
color |
No | Display color for the subagent in the task list and transcript. Accepts red, blue, green, yellow, purple, orange, pink, or cyan |
Main-Thread Agent Frontmatter Honoring (v2.1.117+/v2.1.119+)
When an agent is invoked as the main-thread agent (via claude --agent <name> or --print mode), these frontmatter fields are honored:
| Field | Version | Notes |
|---|---|---|
mcpServers |
v2.1.117+ | Loaded when agent is invoked as main-thread agent via claude --agent <name> |
permissionMode |
v2.1.119+ | Honored for built-in agents via --agent <name> |
tools / disallowedTools |
v2.1.119+ | Honored in --print mode (non-interactive/scripted usage) |
Example — agent with mcpServers and permissionMode:
---
name: secure-researcher
permissionMode: acceptEdits
mcpServers:
notion:
type: http
url: https://mcp.notion.com/mcp
github:
type: http
url: https://api.github.com/mcp
tools: Read, Grep, Glob
---
You are a research agent. You may query Notion and GitHub through the
configured MCP servers, and read local files, but you cannot write or
execute commands outside of accepted edits.Run with:
claude --agent secure-researcherTool Configuration Options
Option 1: Inherit All Tools (omit the field)
---
name: full-access-agent
---Option 2: Specify Individual Tools
---
name: limited-agent
tools: Read, Grep, Glob, Bash
---Note on Glob/Grep (v2.1.113+): On native macOS/Linux builds, Glob and Grep are provided as
bfs/ugrepthrough the Bash tool rather than as separate tools. Windows and npm-JS builds still expose them as standalone tools. Authors can still reference Glob/Grep inallowedTools; the backend substitution is transparent.
Option 3: Conditional Tool Access
---
name: conditional-agent
tools: Read, Bash(npm:*), Bash(test:*)
---CLI-Based Configuration
Define subagents for a single session using the --agents flag with JSON format:
claude --agents '{
"code-reviewer": {
"description": "Expert code reviewer. Use proactively after code changes.",
"prompt": "You are a senior code reviewer. Focus on code quality, security, and best practices.",
"tools": ["Read", "Grep", "Glob", "Bash"],
"model": "sonnet"
}
}'JSON Format for --agents flag:
{
"agent-name": {
"description": "Required: when to invoke this agent",
"prompt": "Required: system prompt for the agent",
"tools": ["Optional", "array", "of", "tools"],
"model": "optional: sonnet|opus|haiku"
}
}Priority of Agent Definitions:
Agent definitions are loaded with this priority order (first match wins):
- CLI-defined -
--agentsflag (session only, JSON) - Project-level -
.claude/agents/(current project) - User-level -
~/.claude/agents/(all projects) - Plugin-level - Plugin
agents/directory
This allows CLI definitions to override all other sources for a single session.
Built-in Subagents
Claude Code includes several built-in subagents that are always available:
| Agent | Model | Purpose |
|---|---|---|
| general-purpose | Inherits | Complex, multi-step tasks |
| Plan | Inherits | Research for plan mode |
| Explore | Inherits (capped at Opus) | Read-only codebase exploration (quick/medium/very thorough) |
| Bash | Inherits | Terminal commands in separate context |
| statusline-setup | Sonnet | Configure status line |
| Claude Code Guide | Haiku | Answer Claude Code feature questions |
General-Purpose Subagent
| Property | Value |
|---|---|
| Model | Inherits from parent |
| Tools | All tools |
| Purpose | Complex research tasks, multi-step operations, code modifications |
When used: Tasks requiring both exploration and modification with complex reasoning.
Plan Subagent
| Property | Value |
|---|---|
| Model | Inherits from parent |
| Tools | Read, Glob, Grep, Bash |
| Purpose | Used automatically in plan mode to research codebase |
When used: When Claude needs to understand the codebase before presenting a plan.
Explore Subagent
| Property | Value |
|---|---|
| Model | Inherits the session model, capped at Opus (v2.1.198). Set model: haiku to keep it fast and cheap |
| Mode | Strictly read-only |
| Tools | Glob, Grep, Read, Bash (read-only commands only) |
| Purpose | Fast codebase searching and analysis |
When used: When searching/understanding code without making changes.
Thoroughness Levels - Specify the depth of exploration:
- "quick" - Fast searches with minimal exploration, good for finding specific patterns
- "medium" - Moderate exploration, balanced speed and thoroughness, default approach
- "very thorough" - Comprehensive analysis across multiple locations and naming conventions, may take longer
Bash Subagent
| Property | Value |
|---|---|
| Model | Inherits from parent |
| Tools | Bash |
| Purpose | Execute terminal commands in a separate context window |
When used: When running shell commands that benefit from isolated context.
Statusline Setup Subagent
| Property | Value |
|---|---|
| Model | Sonnet |
| Tools | Read, Write, Bash |
| Purpose | Configure the Claude Code status line display |
When used: When setting up or customizing the status line.
Claude Code Guide Subagent
| Property | Value |
|---|---|
| Model | Haiku (fast, low-latency) |
| Tools | Read-only |
| Purpose | Answer questions about Claude Code features and usage |
When used: When users ask questions about how Claude Code works or how to use specific features.
Managing Subagents
Ask Claude (Recommended)
The simplest way to create or manage a subagent is to ask Claude directly:
Create a subagent that reviews code for security vulnerabilities.Claude writes the .claude/agents/<name>.md file for you, choosing sensible frontmatter (tools, model, description). You can then refine the file by hand or ask Claude to adjust it.
Note: The
/agentscommand no longer opens an interactive creation wizard (removed in v2.1.198). It now points you to ask Claude or edit.claude/agents/files directly.
Direct File Management
# Create a project subagent
mkdir -p .claude/agents
cat > .claude/agents/test-runner.md << 'EOF'
---
name: test-runner
---
You are a test automation expert. When you see code changes, proactively
run the appropriate tests. If tests fail, analyze the failures and fix
them while preserving the original test intent.
EOF
# Create a user subagent (available in all projects)
mkdir -p ~/.claude/agentsUsing Subagents
Automatic Delegation
Claude proactively delegates tasks based on:
- Task description in your request
- The
descriptionfield in subagent configurations - Current context and available tools
To encourage proactive use, include "use PROACTIVELY" or "MUST BE USED" in your description field:
---
name: code-reviewer
---Explicit Invocation
You can explicitly request a specific subagent:
> Use the test-runner subagent to fix failing tests
> Have the code-reviewer subagent look at my recent changes
> Ask the debugger subagent to investigate this errorCase- and separator-insensitive
subagent_typematching (v2.1.140):subagent_type(inAgenttool calls or--agentflags) is matched case-insensitively and ignores separator style —code-reviewer,Code Reviewer, andcode_reviewerall resolve to the same agent. This removes a long-standing footgun where minor capitalization differences silently fell back to the default agent.
@-Mention Invocation
Use the @ prefix to guarantee a specific subagent is invoked (bypasses automatic delegation heuristics):
> @"code-reviewer (agent)" review the auth moduleSession-Wide Agent
Run an entire session using a specific agent as the main agent:
# Via CLI flag
claude --agent code-reviewer
# Via settings.json
{
"agent": "code-reviewer"
}Listing Available Agents
Use the claude agents command to list all configured agents from all sources:
claude agentsResumable Agents
Subagents can continue previous conversations with full context preserved:
# Initial invocation
> Use the code-analyzer agent to start reviewing the authentication module
# Returns agentId: "abc123"
# Resume the agent later
> Resume agent abc123 and now analyze the authorization logic as wellUse cases:
- Long-running research across multiple sessions
- Iterative refinement without losing context
- Multi-step workflows maintaining context
Chaining Subagents
Execute multiple subagents in sequence:
> First use the code-analyzer subagent to find performance issues,
then use the optimizer subagent to fix themThis enables complex workflows where the output of one subagent feeds into another.
Persistent Memory for Subagents
The memory field gives subagents a persistent directory that survives across conversations. This allows subagents to build up knowledge over time, storing notes, findings, and context that persist between sessions.
Memory Scopes
| Scope | Directory | Use Case |
|---|---|---|
user |
~/.claude/agent-memory/<name>/ |
Personal notes and preferences across all projects |
project |
.claude/agent-memory/<name>/ |
Project-specific knowledge shared with the team |
local |
.claude/agent-memory-local/<name>/ |
Local project knowledge not committed to version control |
How It Works
- The first 200 lines of
MEMORY.mdin the memory directory are automatically loaded into the subagent's system prompt - The
Read,Write, andEdittools are automatically enabled for the subagent to manage its memory files - The subagent can create additional files in its memory directory as needed
Example Configuration
---
name: researcher
memory: user
---
You are a research assistant. Use your memory directory to store findings,
track progress across sessions, and build up knowledge over time.
Check your MEMORY.md file at the start of each session to recall previous context.graph LR
A["SubagentSession 1"] -->|writes| M["MEMORY.md(persistent)"]
M -->|loads into| B["SubagentSession 2"]
B -->|updates| M
M -->|loads into| C["SubagentSession 3"]
style A fill:#e1f5fe,stroke:#333,color:#333
style B fill:#e1f5fe,stroke:#333,color:#333
style C fill:#e1f5fe,stroke:#333,color:#333
style M fill:#f3e5f5,stroke:#333,color:#333Background Subagents
Subagents run in the background by default (v2.1.198). Claude keeps working on the main conversation while a subagent runs and is notified when it finishes, so you no longer wait on a subagent to return before continuing.
Configuration
Because background is already the default, background: true in the frontmatter forces the subagent to always run in the background and prevents it from running inline:
---
name: long-runner
background: true
---Keyboard Shortcuts
| Shortcut | Action |
|---|---|
Ctrl+B |
Background a currently running subagent task |
Ctrl+F |
Kill all background agents (press twice to confirm) |
Disabling Background Tasks
Set the environment variable to disable background task support entirely:
export CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1Worktree Isolation
The isolation: worktree setting gives a subagent its own git worktree, allowing it to make changes independently without affecting the main working tree.
Configuration
---
name: feature-builder
isolation: worktree
tools: Read, Write, Edit, Bash, Grep, Glob
---How It Works
graph TB
Main["Main Working Tree"] -->|spawns| Sub["Subagent withIsolated Worktree"]
Sub -->|makes changes in| WT["Separate GitWorktree + Branch"]
WT -->|no changes| Clean["Auto-cleaned"]
WT -->|has changes| Return["Returns worktreepath and branch"]
style Main fill:#e1f5fe,stroke:#333,color:#333
style Sub fill:#f3e5f5,stroke:#333,color:#333
style WT fill:#e8f5e9,stroke:#333,color:#333
style Clean fill:#fff3e0,stroke:#333,color:#333
style Return fill:#fff3e0,stroke:#333,color:#333- The subagent operates in its own git worktree on a separate branch
- If the subagent makes no changes, the worktree is automatically cleaned up
- If changes exist, the worktree path and branch name are returned to the main agent for review or merging
Forked Subagents
Forked subagents (context: fork) inherit the parent agent's full conversation context at the moment of forking, rather than starting with a clean slate. This is useful for exploring alternative paths without losing the work done so far.
Availability: GA in v2.1.117. Since v2.1.232, fork mode is on by default in interactive sessions — on every build, first-party or not. It stays off by default in non-interactive mode (
claude -p) and in the Agent SDK. On Claude Code older than v2.1.232, or to turn it on where it is off by default, setCLAUDE_CODE_FORK_SUBAGENT=1.
Fork-mode subagents run in the background. Where fork mode is on — as it is by default in an interactive session — Claude Code runs the subagent in the background, forked and non-forked subagents alike.
Configuration
---
name: alternative-explorer
context: fork
tools: Read, Edit, Bash, Grep, Glob
---
You are a forked subagent. You inherit the parent's full conversation and
may explore an alternative approach. Return your findings and the parent
will decide whether to adopt them.Enabling Fork Mode Explicitly
Interactive sessions on v2.1.232+ need no flag. Use this on older versions, in headless
runs, or in the Agent SDK:
export CLAUDE_CODE_FORK_SUBAGENT=1
claudeWhen to Use Fork vs Clean Context
| Scenario | context: fork |
Clean context (default) |
|---|---|---|
| Explore alternative implementations | Yes | No (would lose context) |
| Long research with existing context | Yes | No |
| Independent specialized task | No | Yes |
| Avoiding context pollution | No | Yes |
Restrict Spawnable Subagents
You can control which subagents a given subagent is allowed to spawn by using the Agent(agent_type) syntax in the tools field. This provides a way to allowlist specific subagents for delegation.
Note: In v2.1.63, the
Tasktool was renamed toAgent. ExistingTask(...)references still work as aliases.
Example
---
name: coordinator
tools: Agent(worker, researcher), Read, Bash
---
You are a coordinator agent. You can delegate work to the "worker" and
"researcher" subagents only. Use Read and Bash for your own exploration.In this example, the coordinator subagent can only spawn the worker and researcher subagents. It cannot spawn any other subagents, even if they are defined elsewhere.
`claude agents` CLI Command
The claude agents command lists all configured agents grouped by source (built-in, user-level, project-level):
claude agentsThis command:
- Shows all available agents from all sources
- Groups agents by their source location
- Indicates overrides when an agent at a higher priority level shadows one at a lower level (e.g., a project-level agent with the same name as a user-level agent)
Agent Teams (Experimental)
Agent Teams coordinate multiple Claude Code instances working together on complex tasks. Unlike subagents (which are delegated subtasks returning results), teammates work independently with their own context windows and can message each other directly through a shared mailbox system.
Official Documentation: code.claude.com/docs/en/agent-teams
Note: Agent Teams is experimental and disabled by default. Requires Claude Code v2.1.32+. Enable it before use.
Subagents vs Agent Teams
| Aspect | Subagents | Agent Teams |
|---|---|---|
| Delegation model | Parent delegates subtask, waits for result | Team lead coordinates work, teammates execute independently |
| Context | Fresh context per subtask, results distilled back | Each teammate maintains its own persistent context window |
| Coordination | Sequential or parallel, managed by parent | Shared task list with automatic dependency management |
| Communication | Results returned to parent only (no inter-agent messaging) | Teammates can message each other directly via mailbox |
| Session resumption | Supported | Not supported with in-process teammates |
| Best for | Focused, well-defined subtasks | Complex work requiring inter-agent communication and parallel execution |
Enabling Agent Teams
Set the environment variable or add it to your settings.json:
export CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1Or in settings.json:
{
"env": {
"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
}
}Starting a team
Once enabled, ask Claude to work with teammates in your prompt:
User: Build the authentication module. Use a team — one teammate for the API endpoints,
one for the database schema, and one for the test suite.Claude will create the team, assign tasks, and coordinate the work automatically.
Display modes
Control how teammate activity is displayed:
| Mode | Flag | Description |
|---|---|---|
| Auto | --teammate-mode auto |
Automatically chooses the best display mode for your terminal |
| In-process (default) | --teammate-mode in-process |
Shows teammate output inline in the current terminal |
| Split-panes | --teammate-mode tmux |
Opens each teammate in a separate tmux or iTerm2 pane |
| iTerm2 | --teammate-mode iterm2 |
(v2.1.186+) Spawns teammates in dedicated iTerm2 panes. Requires the it2 CLI; auto mode warns when it can't be found |
claude --teammate-mode tmuxYou can also set the display mode in settings.json:
{
"teammateMode": "tmux"
}Note: Split-pane mode requires tmux or iTerm2. It is not available in VS Code terminal, Windows Terminal, or Ghostty.
Navigation
Use Shift+Down to navigate between teammates in split-pane mode.
Team Configuration
Team configurations are stored at ~/.claude/teams/{team-name}/config.json.
Teammate Model Selection
As of v2.1.234, the "Default teammate model" /config setting was removed. Teammates now inherit the team lead's model by default, unless the spawn call specifies a different model explicitly.
Architecture
graph TB
Lead["Team Lead(Coordinator)"]
TaskList["Shared Task List(Dependencies)"]
Mailbox["Mailbox(Messages)"]
T1["Teammate 1(Own Context)"]
T2["Teammate 2(Own Context)"]
T3["Teammate 3(Own Context)"]
Lead -->|assigns tasks| TaskList
Lead -->|sends messages| Mailbox
TaskList -->|picks up work| T1
TaskList -->|picks up work| T2
TaskList -->|picks up work| T3
T1 -->|reads/writes| Mailbox
T2 -->|reads/writes| Mailbox
T3 -->|reads/writes| Mailbox
T1 -->|updates status| TaskList
T2 -->|updates status| TaskList
T3 -->|updates status| TaskList
style Lead fill:#e1f5fe,stroke:#333,color:#333
style TaskList fill:#fff9c4,stroke:#333,color:#333
style Mailbox fill:#f3e5f5,stroke:#333,color:#333
style T1 fill:#e8f5e9,stroke:#333,color:#333
style T2 fill:#e8f5e9,stroke:#333,color:#333
style T3 fill:#e8f5e9,stroke:#333,color:#333Key components:
- Team Lead: The main Claude Code session that creates the team, assigns tasks, and coordinates
- Shared Task List: A synchronized list of tasks with automatic dependency tracking
- Mailbox: An inter-agent messaging system for teammates to communicate status and coordinate
- Teammates: Independent Claude Code instances, each with their own context window
Task assignment and messaging
The team lead breaks work into tasks and assigns them to teammates. The shared task list handles:
- Automatic dependency management — tasks wait for their dependencies to complete
- Status tracking — teammates update task status as they work
- Inter-agent messaging — teammates send messages via the mailbox for coordination (e.g., "Database schema is ready, you can start writing queries")
Plan approval workflow
For complex tasks, the team lead creates an execution plan before teammates begin work. The user reviews and approves the plan, ensuring the team's approach aligns with expectations before any code changes are made.
Hook events for teams
Agent Teams introduce two additional hook events:
| Event | Fires When | Use Case |
|---|---|---|
TeammateIdle |
A teammate finishes its current task and has no pending work | Trigger notifications, assign follow-up tasks |
TaskCompleted |
A task in the shared task list is marked complete | Run validation, update dashboards, chain dependent work |
Best practices
- Team size: Keep teams at 3-5 teammates for optimal coordination
- Task sizing: Break work into tasks that take 5-15 minutes each — small enough to parallelize, large enough to be meaningful
- Avoid file conflicts: Assign different files or directories to different teammates to prevent merge conflicts
- Start simple: Use in-process mode for your first team; switch to split-panes once comfortable
- Clear task descriptions: Provide specific, actionable task descriptions so teammates can work independently
Limitations
- Experimental: Feature behavior may change in future releases
- No session resumption: In-process teammates cannot be resumed after a session ends
- One team per session: Cannot create nested teams or multiple teams in a single session
- Fixed leadership: The team lead role cannot be transferred to a teammate
- Split-pane restrictions: tmux/iTerm2 required; not available in VS Code terminal, Windows Terminal, or Ghostty
- No cross-session teams: Teammates exist only within the current session
Warning: Agent Teams is experimental. Test with non-critical work first and monitor teammate coordination for unexpected behavior.
Plugin Subagent Security
Plugin-provided subagents have restricted frontmatter capabilities for security. The following fields are not allowed in plugin subagent definitions:
hooks- Cannot define lifecycle hooksmcpServers- Cannot configure MCP serverspermissionMode- Cannot override permission settings
This prevents plugins from escalating privileges or executing arbitrary commands through subagent hooks.
Subagent Output Scanning (v2.1.210+)
As of v2.1.210, Claude Code scans each subagent's final report for text that imitates the harness's own output format — fake <system-reminder>-style tags, fabricated Human:/Assistant: turns, or mentions of permission-bypass flags and settings-file paths. This defends against prompt injection carried in subagent output, such as a subagent that fetched a malicious web page containing fake control tokens designed to manipulate the parent session.
When the scan flags something, Claude Code neutralizes it — inserting a backslash or an inline marker such as [harness: subagent output matched instruction-shaped pattern(s): ...] naming what triggered the scan — and the parent session is expected to treat the flagged text as a finding to relay, not an instruction to follow. The scan is on by default with no documented opt-out. It errs toward flagging: a legitimate subagent report that quotes a real flag name (e.g. --dangerously-skip-permissions) verbatim can trigger a marker even though nothing malicious occurred — a false positive is preferable to a missed injection.
Subagent Concurrency and Depth Limits
The per-session spawn cap is gone. Claude Code capped subagent spawns at 200 per session from v2.1.212, but v2.1.224 removed that cap — long-running sessions no longer refuse new agents, and the official subagents reference now states plainly that there is no limit on the total number of subagents Claude can spawn over a session. The
CLAUDE_CODE_MAX_SUBAGENTS_PER_SESSIONvariable that overrode it is gone with it.
Two limits on subagent fan-out do still apply, both set by environment variable:
CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS(v2.1.217) - Maximum number of subagents running concurrently at once. Default: 20.CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH(v2.1.217) - Maximum nesting depth for subagents spawning their own subagents. Default: 3 since v2.1.219 (was 1 in v2.1.217–v2.1.218). Set this to1to disable nesting (see Key Behaviors).
export CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS=20
export CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH=5Architecture
High-Level Architecture
graph TB
User["User"]
Main["Main Agent(Coordinator)"]
Reviewer["Code ReviewerSubagent"]
Tester["Test EngineerSubagent"]
Docs["DocumentationSubagent"]
User -->|asks| Main
Main -->|delegates| Reviewer
Main -->|delegates| Tester
Main -->|delegates| Docs
Reviewer -->|returns result| Main
Tester -->|returns result| Main
Docs -->|returns result| Main
Main -->|synthesizes| UserSubagent Lifecycle
sequenceDiagram
participant User
participant MainAgent as Main Agent
participant CodeReviewer as Code ReviewerSubagent
participant Context as SeparateContext Window
User->>MainAgent: "Build new auth feature"
MainAgent->>MainAgent: Analyze task
MainAgent->>CodeReviewer: "Review this code"
CodeReviewer->>Context: Initialize clean context
Context->>CodeReviewer: Load reviewer instructions
CodeReviewer->>CodeReviewer: Perform review
CodeReviewer-->>MainAgent: Return findings
MainAgent->>MainAgent: Incorporate results
MainAgent-->>User: Provide synthesisContext Management
graph TB
A["Main Agent Context50,000 tokens"]
B["Subagent 1 Context20,000 tokens"]
C["Subagent 2 Context20,000 tokens"]
D["Subagent 3 Context20,000 tokens"]
A -->|Clean slate| B
A -->|Clean slate| C
A -->|Clean slate| D
B -->|Results only| A
C -->|Results only| A
D -->|Results only| A
style A fill:#e1f5fe
style B fill:#fff9c4
style C fill:#fff9c4
style D fill:#fff9c4Key Points
- Each subagent gets a fresh context window without the main conversation history
- Only the relevant context is passed to the subagent for their specific task
- Results are distilled back to the main agent
- This prevents context token exhaustion on long projects
Performance Considerations
- Context efficiency - Agents preserve main context, enabling longer sessions
- Latency - Subagents start with clean slate and may add latency gathering initial context
Key Behaviors
- Nested spawning on by default, depth 3 (v2.1.219) - Subagents can spawn their own subagents up to three layers below the main conversation. Set
CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTHto change the limit, or1to turn nesting off. At the depth limit, Claude Code withholds theAgenttool from every subagent except a fork. (History: v2.1.172–v2.1.216 nested by default up to 5 layers with no way to change it; v2.1.217 made nesting opt-in at depth 1; v2.1.219 set the default to 3.) Use theAgent(agent_type)restriction syntax (see Restrict Spawnable Subagents) to control which subagents a given subagent may spawn - Background permissions - Background subagents auto-deny any permissions that are not pre-approved
- Backgrounding - Press
Ctrl+Bto background a currently running task - Transcripts - Subagent transcripts are stored at
~/.claude/projects/{project}/{sessionId}/subagents/agent-{agentId}.jsonl - Auto-compaction - Subagent context auto-compacts at ~95% capacity (override with
CLAUDE_AUTOCOMPACT_PCT_OVERRIDEenvironment variable) - Extended thinking inherited (v2.1.198) - Subagents and context compaction now inherit the session's extended-thinking configuration (previously always disabled). There is no per-subagent thinking field
Additional Controls
- Disable built-in Explore/Plan agents - Set
CLAUDE_CODE_DISABLE_EXPLORE_PLAN_AGENTS=1to remove the built-in Explore and Plan agents (v2.1.198) - Append to every subagent prompt - In non-interactive /
--printmode,--append-subagent-system-prompt "<text>"appends text to every subagent's system prompt (v2.1.205)
When to Use Subagents
| Scenario | Use Subagent | Why |
|---|---|---|
| Complex feature with many steps | Yes | Separate concerns, prevent context pollution |
| Quick code review | No | Unnecessary overhead |
| Parallel task execution | Yes | Each subagent has own context |
| Specialized expertise needed | Yes | Custom system prompts |
| Long-running analysis | Yes | Prevents main context exhaustion |
| Single task | No | Adds latency unnecessarily |
Best Practices
Design Principles
Do:
- Start with Claude-generated agents - Generate initial subagent with Claude, then iterate to customize
- Design focused subagents - Single, clear responsibilities rather than one doing everything
- Write detailed prompts - Include specific instructions, examples, and constraints
- Limit tool access - Grant only necessary tools for the subagent's purpose
- Version control - Check project subagents into version control for team collaboration
Don't:
- Create overlapping subagents with same roles
- Give subagents unnecessary tool access
- Use subagents for simple, single-step tasks
- Mix concerns in one subagent's prompt
- Forget to pass necessary context
System Prompt Best Practices
Be Specific About Role
textYou are an expert code reviewer specializing in [specific areas]Define Priorities Clearly
textReview priorities (in order): 1. Security Issues 2. Performance Problems 3. Code QualitySpecify Output Format
textFor each issue provide: Severity, Category, Location, Description, Fix, ImpactInclude Action Steps
textWhen invoked: 1. Run git diff to see recent changes 2. Focus on modified files 3. Begin review immediately
Tool Access Strategy
- Start Restrictive: Begin with only essential tools
- Expand Only When Needed: Add tools as requirements demand
- Read-Only When Possible: Use Read/Grep for analysis agents
- Sandboxed Execution: Limit Bash commands to specific patterns
Example Subagents in This Folder
This folder contains ready-to-use example subagents:
1. Code Reviewer (`code-reviewer.md`)
Purpose: Comprehensive code quality and maintainability analysis
Tools: Read, Grep, Glob, Bash
Specialization:
- Security vulnerability detection
- Performance optimization identification
- Code maintainability assessment
- Test coverage analysis
Use When: You need automated code reviews with focus on quality and security
2. Test Engineer (`test-engineer.md`)
Purpose: Test strategy, coverage analysis, and automated testing
Tools: Read, Write, Bash, Grep
Specialization:
- Unit test creation
- Integration test design
- Edge case identification
- Coverage analysis (>80% target)
Use When: You need comprehensive test suite creation or coverage analysis
3. Documentation Writer (`documentation-writer.md`)
Purpose: Technical documentation, API docs, and user guides
Tools: Read, Write, Grep
Specialization:
- API endpoint documentation
- User guide creation
- Architecture documentation
- Code comment improvement
Use When: You need to create or update project documentation
4. Secure Reviewer (`secure-reviewer.md`)
Purpose: Security-focused code review with minimal permissions
Tools: Read, Grep
Specialization:
- Security vulnerability detection
- Authentication/authorization issues
- Data exposure risks
- Injection attack identification
Use When: You need security audits without modification capabilities
5. Implementation Agent (`implementation-agent.md`)
Purpose: Full implementation capabilities for feature development
Tools: Read, Write, Edit, Bash, Grep, Glob
Specialization:
- Feature implementation
- Code generation
- Build and test execution
- Codebase modification
Use When: You need a subagent to implement features end-to-end
6. Debugger (`debugger.md`)
Purpose: Debugging specialist for errors, test failures, and unexpected behavior
Tools: Read, Edit, Bash, Grep, Glob
Specialization:
- Root cause analysis
- Error investigation
- Test failure resolution
- Minimal fix implementation
Use When: You encounter bugs, errors, or unexpected behavior
7. Data Scientist (`data-scientist.md`)
Purpose: Data analysis expert for SQL queries and data insights
Tools: Bash, Read, Write
Specialization:
- SQL query optimization
- BigQuery operations
- Data analysis and visualization
- Statistical insights
Use When: You need data analysis, SQL queries, or BigQuery operations
8. Clean Code Reviewer (`clean-code-reviewer.md`)
Purpose: Readability and maintainability review against clean-code principles
Tools: Read, Grep, Glob, Bash
Specialization:
- Naming, function length, and argument count
- Duplication and dead code
- Comment quality and intent
- Structural clarity over cleverness
Use When: You want a style and maintainability pass distinct from correctness review
9. Performance Optimizer (`performance-optimizer.md`)
Purpose: Identify and remediate performance bottlenecks
Tools: Read, Edit, Bash, Grep, Glob
Specialization:
- Algorithmic complexity and hot paths
- Memory allocation and leaks
- Caching and query optimization
- Concurrency and I/O bottlenecks
Use When: Code is measurably slow and you need targeted optimization
Installation Instructions
Method 1: Ask Claude (Recommended)
Describe the subagent you want and let Claude create the file:
Create a project-level subagent that runs tests and fixes failures.
Give it access to Bash, Read, Edit, and Grep.Claude writes .claude/agents/<name>.md with appropriate frontmatter. Review the generated file, then use it. (The /agents interactive creation wizard was removed in v2.1.198 — ask Claude or edit the file directly instead.)
Method 2: Copy to Project
Copy the agent files to your project's .claude/agents/ directory:
# Navigate to your project
cd /path/to/your/project
# Create agents directory if it doesn't exist
mkdir -p .claude/agents
# Copy all agent files from this folder
cp /path/to/04-subagents/*.md .claude/agents/
# Remove the README (not needed in .claude/agents)
rm .claude/agents/README.mdMethod 3: Copy to User Directory
For agents available in all your projects:
# Create user agents directory
mkdir -p ~/.claude/agents
# Copy agents
cp /path/to/04-subagents/code-reviewer.md ~/.claude/agents/
cp /path/to/04-subagents/debugger.md ~/.claude/agents/
# ... copy others as neededVerification
After installation, verify the agents are recognized by listing the directory:
ls .claude/agents/You can also ask Claude which subagents are available in the current session, and it will report the built-in and custom agents it can delegate to.
File Structure
project/
├── .claude/
│ └── agents/
│ ├── code-reviewer.md
│ ├── test-engineer.md
│ ├── documentation-writer.md
│ ├── secure-reviewer.md
│ ├── implementation-agent.md
│ ├── debugger.md
│ ├── data-scientist.md
│ ├── clean-code-reviewer.md
│ └── performance-optimizer.md
└── ...Related Concepts
Related Features
- Slash Commands - Quick user-invoked shortcuts
- Memory - Persistent cross-session context
- Skills - Reusable autonomous capabilities
- MCP Protocol - Real-time external data access
- Hooks - Event-driven shell command automation
- Plugins - Bundled extension packages
Comparison with Other Features
| Feature | User-Invoked | Auto-Invoked | Persistent | External Access | Isolated Context |
|---|---|---|---|---|---|
| Slash Commands | Yes | No | No | No | No |
| Subagents | Yes | Yes | No | No | Yes |
| Memory | Auto | Auto | Yes | No | No |
| MCP | Auto | Yes | No | Yes | No |
| Skills | Yes | Yes | No | No | No |
Integration Pattern
graph TD
User["User Request"] --> Main["Main Agent"]
Main -->|Uses| Memory["Memory(Context)"]
Main -->|Queries| MCP["MCP(Live Data)"]
Main -->|Invokes| Skills["Skills(Auto Tools)"]
Main -->|Delegates| Subagents["Subagents(Specialists)"]
Subagents -->|Use| Memory
Subagents -->|Query| MCP
Subagents -->|Isolated| Context["Clean ContextWindow"]Observability
Added in v2.1.139.
API requests originating from a subagent carry two extra HTTP headers so traces and logs can be correlated back to the dispatching session:
| Header | Description |
|---|---|
x-claude-code-agent-id |
UUID of the subagent making the request. |
x-claude-code-parent-agent-id |
UUID of the agent that dispatched this subagent (the main agent, or a higher-level subagent in a chain). |
The same identifiers are exposed on claude_code.llm_request OpenTelemetry spans as the attributes claude.code.agent.id and claude.code.agent.parent_id. Use them to:
- Attribute API spend to a specific subagent type rather than the parent session
- Reconstruct a chain of agent invocations after the fact (parent_id forms a tree)
- Alert on runaway subagents (e.g., one
agent.idaccounting for >50% of session spend)
See the OpenTelemetry section in Advanced Features → Telemetry for end-to-end exporter setup.
Additional Resources
- Official Subagents Documentation
- CLI Reference -
--agentsflag and other CLI options - Plugins Guide - For bundling agents with other features
- Skills Guide - For auto-invoked capabilities
- Memory Guide - For persistent context
- Hooks Guide - For event-driven automation
Last Updated: August 19, 2026
Claude Code Version: 2.1.235
Sources:
- https://code.claude.com/docs/en/sub-agents
- https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md
- https://code.claude.com/docs/en/cli-reference
- https://code.claude.com/docs/en/agent-teams
- https://code.claude.com/docs/en/changelog#2-1-172
- https://code.claude.com/docs/en/changelog
- https://github.com/anthropics/claude-code/releases/tag/v2.1.117
- https://github.com/anthropics/claude-code/releases/tag/v2.1.131
- https://github.com/anthropics/claude-code/releases/tag/v2.1.138
- https://github.com/anthropics/claude-code/releases/tag/v2.1.139
- https://github.com/anthropics/claude-code/releases/tag/v2.1.140
- https://code.claude.com/docs/en/model-config
Compatible Models: Claude Fable 5, Claude Opus 5, Claude Sonnet 5, Claude Sonnet 4.6, Claude Opus 4.8, Claude Haiku 4.5
File: 05-mcp/README.md
MCP (Model Context Protocol)
This folder contains comprehensive documentation and examples for MCP server configurations and usage with Claude Code.
Overview
MCP (Model Context Protocol) is a standardized way for Claude to access external tools, APIs, and real-time data sources. Unlike Memory, MCP provides live access to changing data.
Key characteristics:
- Real-time access to external services
- Live data synchronization
- Extensible architecture
- Secure authentication
- Tool-based interactions
MCP Architecture
graph TB
A["Claude"]
B["MCP Server"]
C["External Service"]
A -->|Request: list_issues| B
B -->|Query| C
C -->|Data| B
B -->|Response| A
A -->|Request: create_issue| B
B -->|Action| C
C -->|Result| B
B -->|Response| A
style A fill:#e1f5fe,stroke:#333,color:#333
style B fill:#f3e5f5,stroke:#333,color:#333
style C fill:#e8f5e9,stroke:#333,color:#333MCP Ecosystem
graph TB
A["Claude"] -->|MCP| B["FilesystemMCP Server"]
A -->|MCP| C["GitHubMCP Server"]
A -->|MCP| D["DatabaseMCP Server"]
A -->|MCP| E["SlackMCP Server"]
A -->|MCP| F["Google DocsMCP Server"]
B -->|File I/O| G["Local Files"]
C -->|API| H["GitHub Repos"]
D -->|Query| I["PostgreSQL/MySQL"]
E -->|Messages| J["Slack Workspace"]
F -->|Docs| K["Google Drive"]
style A fill:#e1f5fe,stroke:#333,color:#333
style B fill:#f3e5f5,stroke:#333,color:#333
style C fill:#f3e5f5,stroke:#333,color:#333
style D fill:#f3e5f5,stroke:#333,color:#333
style E fill:#f3e5f5,stroke:#333,color:#333
style F fill:#f3e5f5,stroke:#333,color:#333
style G fill:#e8f5e9,stroke:#333,color:#333
style H fill:#e8f5e9,stroke:#333,color:#333
style I fill:#e8f5e9,stroke:#333,color:#333
style J fill:#e8f5e9,stroke:#333,color:#333
style K fill:#e8f5e9,stroke:#333,color:#333MCP Installation Methods
Claude Code supports multiple transport protocols for MCP server connections:
HTTP Transport (Recommended)
# Basic HTTP connection
claude mcp add --transport http notion https://mcp.notion.com/mcp
# HTTP with authentication header
claude mcp add --transport http secure-api https://api.example.com/mcp \
--header "Authorization: Bearer your-token"Stdio Transport (Local)
For locally running MCP servers:
# Local Node.js server
claude mcp add --transport stdio myserver -- npx @myorg/mcp-server
# With environment variables
claude mcp add --transport stdio myserver --env KEY=value -- npx server`CLAUDE_PROJECT_DIR` for stdio servers (v2.1.139+)
Every MCP stdio server is spawned with CLAUDE_PROJECT_DIR=<absolute path to repo root> already set in its environment — the same convention used for hooks. Plugin and project .mcp.json files can reference ${CLAUDE_PROJECT_DIR} in the command, args, and env values, and the substitution happens before execve():
{
"mcpServers": {
"repo-tools": {
"type": "stdio",
"command": "node",
"args": ["${CLAUDE_PROJECT_DIR}/.claude/mcp/repo-tools.js"],
"env": {
"REPO_ROOT": "${CLAUDE_PROJECT_DIR}"
}
}
}
}Use this when your stdio server needs to read files relative to the project root regardless of where Claude Code was launched.
stdio MCP servers also receive CLAUDE_CODE_SESSION_ID (matching the value passed to hooks and Bash), including when the session is resumed with --resume (v2.1.163+).
SSE Transport (Deprecated)
Server-Sent Events transport is deprecated in favor of http but still supported:
claude mcp add --transport sse legacy-server https://example.com/sseSession Working Directories (roots/list)
MCP servers can discover the session's working directories: the launch directory plus all --add-dir/additionalDirectories entries are returned via the MCP roots/list request, and a notifications/roots/list_changed notification is sent whenever the set changes (v2.1.203). The idle timeout now also applies to stdio servers (30 minutes), with a per-server timeout acting as an idle floor (v2.1.203).
Windows-Specific Note
On native Windows (not WSL), use cmd /c for npx commands:
claude mcp add --transport stdio my-server -- cmd /c npx -y @some/packageOAuth 2.0 Authentication
Claude Code supports OAuth 2.0 for MCP servers that require it. When connecting to an OAuth-enabled server, Claude Code handles the entire authentication flow:
# Connect to an OAuth-enabled MCP server (interactive flow)
claude mcp add --transport http my-service https://my-service.example.com/mcp
# Pre-configure OAuth credentials for non-interactive setup
claude mcp add --transport http my-service https://my-service.example.com/mcp \
--client-id "your-client-id" \
--client-secret "your-client-secret" \
--callback-port 8080| Feature | Description |
|---|---|
| Interactive OAuth | Use /mcp to trigger the browser-based OAuth flow |
| Pre-configured OAuth clients | Built-in OAuth clients for common services like Notion, Stripe, and others (v2.1.30+) |
| Pre-configured credentials | --client-id, --client-secret, --callback-port flags for automated setup |
| Token storage | Tokens are stored securely in your system keychain |
| Step-up auth | Supports step-up authentication for privileged operations |
| Discovery caching | OAuth discovery metadata is cached for faster reconnections |
| Metadata override | oauth.authServerMetadataUrl in .mcp.json to override default OAuth metadata discovery |
Overriding OAuth Metadata Discovery
If your MCP server returns errors on the standard OAuth metadata endpoint (/.well-known/oauth-authorization-server) but exposes a working OIDC endpoint, you can tell Claude Code to fetch OAuth metadata from a specific URL. Set authServerMetadataUrl in the oauth object of your server config:
{
"mcpServers": {
"my-server": {
"type": "http",
"url": "https://mcp.example.com/mcp",
"oauth": {
"authServerMetadataUrl": "https://auth.example.com/.well-known/openid-configuration"
}
}
}
}The URL must use https://. This option requires Claude Code v2.1.64 or later.
Authentication Startup Notice and Dynamic-Header Refresh (v2.1.193)
- Startup auth notice (v2.1.193+): At startup, Claude Code surfaces a notice listing any MCP servers that still need authentication, so a server that needs a login isn't left silently non-working.
headersHelperauto-refresh (v2.1.193+): If you supply custom auth via aheadersHelper, the helper is re-invoked automatically when a server returns HTTP 401 or 403. Credentials refresh on the fly without a manual reconnect. See Use dynamic headers for custom authentication.
Claude.ai MCP Connectors
MCP servers configured in your Claude.ai account are automatically available in Claude Code. This means any MCP connections you set up through the Claude.ai web interface will be accessible without additional configuration.
Claude.ai MCP connectors are also available in --print mode (v2.1.83+), enabling non-interactive and scripted usage.
Startup note (v2.1.117+): Concurrent connect is the default when both local and claude.ai MCP servers are configured (previously serial), reducing startup latency when multiple servers are in use.
To disable Claude.ai MCP servers in Claude Code, set the ENABLE_CLAUDEAI_MCP_SERVERS environment variable to false:
ENABLE_CLAUDEAI_MCP_SERVERS=false claudeNote: This feature is only available for users logged in with Claude.ai accounts.
MCP Setup Process
sequenceDiagram
participant User
participant Claude as Claude Code
participant Config as Config File
participant Service as External Service
User->>Claude: Type /mcp
Claude->>Claude: List available MCP servers
Claude->>User: Show options
User->>Claude: Select GitHub MCP
Claude->>Config: Update configuration
Config->>Claude: Activate connection
Claude->>Service: Test connection
Service-->>Claude: Authentication successful
Claude->>User: ✅ MCP connected!`/mcp` command
Type /mcp inside a session to list connected servers, trigger OAuth flows, and inspect connection state.
- Since v2.1.121, MCP retries the initial connection up to 3 times on transient errors.
- Since v2.1.128,
/mcpdisplays the tool count for each connected server and visually flags servers reporting 0 tools so misconfigured servers stand out at a glance.
MCP Tool Search
When MCP tool descriptions exceed 10% of the context window, Claude Code automatically enables tool search to efficiently select the right tools without overwhelming the model context.
| Setting | Value | Description |
|---|---|---|
ENABLE_TOOL_SEARCH |
auto (default) |
Automatically enables when tool descriptions exceed 10% of context |
ENABLE_TOOL_SEARCH |
auto:<N> |
Automatically enables at a custom threshold of N tools |
ENABLE_TOOL_SEARCH |
true |
Always enabled regardless of tool count |
ENABLE_TOOL_SEARCH |
false |
Disabled; all tool descriptions sent in full |
Note: Tool search requires Sonnet 4 or later, or Opus 4 or later. Haiku models are not supported for tool search.
Bypassing Tool Search per Server (v2.1.121+)
If a particular MCP server's tools are needed on every turn, mark its
configuration with "alwaysLoad": true to skip tool-search deferral and
keep its tools always available:
{
"mcpServers": {
"always-on-tool": {
"command": "node",
"args": ["./tools/always.js"],
"alwaysLoad": true
}
}
}Use sparingly — every always-loaded tool consumes context that could
otherwise be used for tool search to surface a more relevant tool.
Dynamic Tool Updates
Claude Code supports MCP list_changed notifications. When an MCP server dynamically adds, removes, or modifies its available tools, Claude Code receives the update and adjusts its tool list automatically -- no reconnection or restart required.
MCP Apps
MCP Apps is the first official MCP extension, enabling MCP tool calls to return interactive UI components that render directly in the chat interface. Instead of plain text responses, MCP servers can deliver rich dashboards, forms, data visualizations, and multi-step workflows -- all displayed inline without leaving the conversation.
MCP Elicitation
MCP servers can request structured input from the user via interactive dialogs (v2.1.49+). This allows an MCP server to ask for additional information mid-workflow -- for example, prompting for a confirmation, selecting from a list of options, or filling in required fields -- adding interactivity to MCP server interactions.
Tool Description and Instruction Cap
As of v2.1.84, Claude Code enforces a 2 KB cap on tool descriptions and instructions per MCP server. This prevents individual servers from consuming excessive context with overly verbose tool definitions, reducing context bloat and keeping interactions efficient.
MCP Prompts as Slash Commands
MCP servers can expose prompts that appear as slash commands in Claude Code. Prompts are accessible using the naming convention:
/mcp__<server>__For example, if a server named github exposes a prompt called review, you can invoke it as /mcp__github__review.
Server Deduplication
When the same MCP server is defined at multiple scopes (local, project, user), the local configuration takes precedence. This allows you to override project-level or user-level MCP settings with local customizations without conflicts.
Recent Lifecycle Fixes (v2.1.136)
Two long-standing MCP lifecycle bugs were fixed in v2.1.136 — worth upgrading for if you run multi-server setups:
- MCP servers persist across
/clear: Servers configured via.mcp.json, plugins, or claude.ai connectors no longer disappear after/clearin VS Code, JetBrains, or the Agent SDK. Earlier versions silently dropped them and required a restart. - OAuth refresh-token concurrent-refresh fix: Multi-server OAuth setups no longer lose refresh tokens when several servers race to refresh simultaneously. This eliminates the "every morning I have to re-auth" pattern that affected setups with multiple OAuth-protected MCP servers.
MCP Resources via @ Mentions
You can reference MCP resources directly in your prompts using the @ mention syntax:
@server-name:protocol://resource/pathFor example, to reference a specific database resource:
@database:postgres://mydb/usersThis allows Claude to fetch and include MCP resource content inline as part of the conversation context.
MCP Scopes
MCP configurations can be stored at different scopes with varying levels of sharing:
| Scope | Flag | Location | Description | Shared With | Requires Approval |
|---|---|---|---|---|---|
| Local (default) | --scope local |
~/.claude.json (under project path) |
Private to current user, current project only (was called project in older versions) |
Just you | No |
| Project | --scope project |
.mcp.json |
Checked into git repository | Team members | Yes (first use) |
| User | --scope user |
~/.claude.json |
Available across all projects (was called global in older versions) |
Just you | No |
Select a scope when adding a server with --scope (short form -s). Omit it and
Claude Code uses local:
# Project scope — writes to .mcp.json so the team shares it
claude mcp add --scope project --transport http github https://api.github.com/mcp
# User scope — available in every project
claude mcp add --scope user --transport stdio memory -- npx @modelcontextprotocol/server-memoryUsing Project Scope
Store project-specific MCP configurations in .mcp.json:
{
"mcpServers": {
"github": {
"type": "http",
"url": "https://api.github.com/mcp"
}
}
}Team members will see an approval prompt on first use of project MCPs. In an untrusted workspace, servers that a repo self-approved via a committed .claude/settings.json are not auto-spawned by claude mcp list/get — they show ⏸ Pending approval until you accept the trust dialog, and enableAllProjectMcpServers is ignored in an untrusted folder (v2.1.196).
MCP Configuration Management
Adding MCP Servers
# Add HTTP-based server
claude mcp add --transport http github https://api.github.com/mcp
# Add local stdio server
claude mcp add --transport stdio database -- npx @company/db-server
# List all MCP servers
claude mcp list
# Get details on specific server
claude mcp get github
# Remove an MCP server
claude mcp remove github
# Reset project-specific approval choices
claude mcp reset-project-choices
# Authenticate an MCP server from the CLI (v2.1.186+)
claude mcp login github
# Sign out of an MCP server (v2.1.186+)
claude mcp logout github
# Import from Claude Desktop
claude mcp add-from-claude-desktop
# Add a server from a JSON blob (useful for scripted setup)
claude mcp add-json events-server '{"type":"stdio","command":"npx","args":["@modelcontextprotocol/server-events"]}'Note: In JSON configs —
.mcp.json,~/.claude.json, orclaude mcp add-json— thetypefield acceptsstreamable-httpas an alias forhttp. The MCP specification uses the namestreamable-httpfor this transport, so configurations copied from a server's own documentation work unmodified.
claude mcp login <name> / claude mcp logout <name> are the non-interactive equivalent of the OAuth flow in the /mcp menu — authenticate or sign out without opening it. Add --no-browser to login to complete OAuth over SSH or in a headless session (it redirects the flow through stdin).
Available MCP Servers Table
| MCP Server | Purpose | Common Tools | Auth | Real-time |
|---|---|---|---|---|
| Filesystem | File operations | read, write, delete | OS permissions | ✅ Yes |
| GitHub | Repository management | list_prs, create_issue, push | OAuth | ✅ Yes |
| Slack | Team communication | send_message, list_channels | Token | ✅ Yes |
| Database | SQL queries | query, insert, update | Credentials | ✅ Yes |
| Google Docs | Document access | read, write, share | OAuth | ✅ Yes |
| Asana | Project management | create_task, update_status | API Key | ✅ Yes |
| Stripe | Payment data | list_charges, create_invoice | API Key | ✅ Yes |
| Memory | Persistent memory | store, retrieve, delete | Local | ❌ No |
Practical Examples
Example 1: GitHub MCP Configuration
File: .mcp.json (project root)
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["@modelcontextprotocol/server-github"],
"env": {
"GITHUB_TOKEN": "${GITHUB_TOKEN}"
}
}
}
}Available GitHub MCP Tools:
Pull Request Management
list_prs- List all PRs in repositoryget_pr- Get PR details including diffcreate_pr- Create new PRupdate_pr- Update PR description/titlemerge_pr- Merge PR to main branchreview_pr- Add review comments
Example request:
/mcp__github__get_pr 456
# Returns:
Title: Add dark mode support
Author: @alice
Status: OPEN
Reviewers: @bob, @charlieIssue Management
list_issues- List all issuesget_issue- Get issue detailscreate_issue- Create new issueclose_issue- Close issueadd_comment- Add comment to issue
Repository Information
get_repo_info- Repository detailslist_files- File tree structureget_file_content- Read file contentssearch_code- Search across codebase
Commit Operations
list_commits- Commit historyget_commit- Specific commit detailscreate_commit- Create new commit
Setup:
export GITHUB_TOKEN="your_github_token"
# Or use the CLI to add directly:
claude mcp add --transport stdio github -- npx @modelcontextprotocol/server-githubEnvironment Variable Expansion in Configuration
MCP configurations support environment variable expansion with fallback defaults. The ${VAR} and ${VAR:-default} syntax works in the following fields: command, args, env, url, and headers.
{
"mcpServers": {
"api-server": {
"type": "http",
"url": "${API_BASE_URL:-https://api.example.com}/mcp",
"headers": {
"Authorization": "Bearer ${API_KEY}",
"X-Custom-Header": "${CUSTOM_HEADER:-default-value}"
}
},
"local-server": {
"command": "${MCP_BIN_PATH:-npx}",
"args": ["${MCP_PACKAGE:-@company/mcp-server}"],
"env": {
"DB_URL": "${DATABASE_URL:-postgresql://localhost/dev}"
}
}
}
}Variables are expanded at runtime:
${VAR}- Uses environment variable, error if not set${VAR:-default}- Uses environment variable, falls back to default if not set
Example 2: Database MCP Setup
Configuration:
{
"mcpServers": {
"database": {
"command": "npx",
"args": ["@modelcontextprotocol/server-database"],
"env": {
"DATABASE_URL": "${DATABASE_URL}"
}
}
}
}Example Usage:
User: Fetch all users with more than 10 orders
Claude: I'll query your database to find that information.
# Using MCP database tool:
SELECT u.*, COUNT(o.id) as order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id
HAVING COUNT(o.id) > 10
ORDER BY order_count DESC;
# Results:
- Alice: 15 orders
- Bob: 12 orders
- Charlie: 11 ordersSetup:
export DATABASE_URL="postgresql://user:pass@localhost/mydb"
# Or use the CLI to add directly:
claude mcp add --transport stdio database -- npx @modelcontextprotocol/server-databaseExample 3: Multi-MCP Workflow
Scenario: Daily Report Generation
# Daily Report Workflow using Multiple MCPs
## Setup
1. GitHub MCP - fetch PR metrics
2. Database MCP - query sales data
3. Slack MCP - post report
4. Filesystem MCP - save report
## Workflow
### Step 1: Fetch GitHub Data
/mcp__github__list_prs completed:true last:7days
Output:
- Total PRs: 42
- Average merge time: 2.3 hours
- Review turnaround: 1.1 hours
### Step 2: Query Database
SELECT COUNT(*) as sales, SUM(amount) as revenue
FROM orders
WHERE created_at > NOW() - INTERVAL '1 day'
Output:
- Sales: 247
- Revenue: $12,450
### Step 3: Generate Report
Combine data into HTML report
### Step 4: Save to Filesystem
Write report.html to /reports/
### Step 5: Post to Slack
Send summary to #daily-reports channel
Final Output:
✅ Report generated and posted
📊 47 PRs merged this week
💰 $12,450 in daily salesSetup:
export GITHUB_TOKEN="your_github_token"
export DATABASE_URL="postgresql://user:pass@localhost/mydb"
export SLACK_TOKEN="your_slack_token"
# Add each MCP server via the CLI or configure them in .mcp.jsonExample 4: Filesystem MCP Operations
Configuration:
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["@modelcontextprotocol/server-filesystem", "/home/user/projects"]
}
}
}Available Operations:
| Operation | Command | Purpose |
|---|---|---|
| List files | ls ~/projects |
Show directory contents |
| Read file | cat src/main.ts |
Read file contents |
| Write file | create docs/api.md |
Create new file |
| Edit file | edit src/app.ts |
Modify file |
| Search | grep "async function" |
Search in files |
| Delete | rm old-file.js |
Delete file |
Setup:
# Use the CLI to add directly:
claude mcp add --transport stdio filesystem -- npx @modelcontextprotocol/server-filesystem /home/user/projectsMCP vs Memory: Decision Matrix
graph TD
A["Need external data?"]
A -->|No| B["Use Memory"]
A -->|Yes| C["Does it change frequently?"]
C -->|No/Rarely| B
C -->|Yes/Often| D["Use MCP"]
B -->|Stores| E["PreferencesContextHistory"]
D -->|Accesses| F["Live APIsDatabasesServices"]
style A fill:#fff3e0,stroke:#333,color:#333
style B fill:#e1f5fe,stroke:#333,color:#333
style C fill:#fff3e0,stroke:#333,color:#333
style D fill:#f3e5f5,stroke:#333,color:#333
style E fill:#e8f5e9,stroke:#333,color:#333
style F fill:#e8f5e9,stroke:#333,color:#333Request/Response Pattern
sequenceDiagram
participant App as Claude
participant MCP as MCP Server
participant DB as Database
App->>MCP: Request: "SELECT * FROM users WHERE id=1"
MCP->>DB: Execute query
DB-->>MCP: Result set
MCP-->>App: Return parsed data
App->>App: Process result
App->>App: Continue task
Note over MCP,DB: Real-time accessNo cachingEnvironment Variables
Store sensitive credentials in environment variables:
# ~/.bashrc or ~/.zshrc
export GITHUB_TOKEN="ghp_xxxxxxxxxxxxx"
export DATABASE_URL="postgresql://user:pass@localhost/mydb"
export SLACK_TOKEN="xoxb-xxxxxxxxxxxxx"Then reference them in MCP config:
{
"env": {
"GITHUB_TOKEN": "${GITHUB_TOKEN}"
}
}Claude as MCP Server (`claude mcp serve`)
Claude Code itself can act as an MCP server for other applications. This enables external tools, editors, and automation systems to leverage Claude's capabilities through the standard MCP protocol.
# Start Claude Code as an MCP server on stdio
claude mcp serveOther applications can then connect to this server as they would any stdio-based MCP server. For example, to add Claude Code as an MCP server in another Claude Code instance:
claude mcp add --transport stdio claude-agent -- claude mcp serveThis is useful for building multi-agent workflows where one Claude instance orchestrates another.
Managed MCP Configuration (Enterprise)
For enterprise deployments, IT administrators can enforce MCP server policies through the managed-mcp.json configuration file. This file provides exclusive control over which MCP servers are permitted or blocked organization-wide.
Location:
- macOS:
/Library/Application Support/ClaudeCode/managed-mcp.json - Linux:
~/.config/ClaudeCode/managed-mcp.json - Windows:
%APPDATA%\ClaudeCode\managed-mcp.json
Features:
allowedMcpServers-- whitelist of permitted serversdeniedMcpServers-- blocklist of prohibited serversallowAllClaudeAiMcps-- managed setting that permits loading claude.ai cloud MCP connectors organization-wide (v2.1.149+)- Supports matching by server name, command, and URL patterns
- Organization-wide MCP policies enforced before user configuration
- Prevents unauthorized server connections
Example configuration:
{
"allowedMcpServers": [
{
"serverName": "github",
"serverUrl": "https://api.github.com/mcp"
},
{
"serverName": "company-internal",
"serverCommand": "company-mcp-server"
}
],
"deniedMcpServers": [
{
"serverName": "untrusted-*"
},
{
"serverUrl": "http://*"
}
]
}Note: When both
allowedMcpServersanddeniedMcpServersmatch a server, the deny rule takes precedence.
Plugin-Provided MCP Servers
Plugins can bundle their own MCP servers, making them available automatically when the plugin is installed. Plugin-provided MCP servers can be defined in two ways:
- Standalone
.mcp.json-- Place a.mcp.jsonfile in the plugin root directory - Inline in
plugin.json-- Define MCP servers directly within the plugin manifest
Use the ${CLAUDE_PLUGIN_ROOT} variable to reference paths relative to the plugin's installation directory:
{
"mcpServers": {
"plugin-tools": {
"command": "node",
"args": ["${CLAUDE_PLUGIN_ROOT}/dist/mcp-server.js"],
"env": {
"CONFIG_PATH": "${CLAUDE_PLUGIN_ROOT}/config.json"
}
}
}
}Subagent-Scoped MCP
MCP servers can be defined inline within agent frontmatter using the mcpServers: key, scoping them to a specific subagent rather than the entire project. This is useful when an agent needs access to a particular MCP server that other agents in the workflow do not require.
---
mcpServers:
my-tool:
type: http
url: https://my-tool.example.com/mcp
---
You are an agent with access to my-tool for specialized operations.Subagent-scoped MCP servers are only available within that agent's execution context and are not shared with the parent or sibling agents.
MCP Output Limits
Claude Code enforces limits on MCP tool output to prevent context overflow:
| Limit | Threshold | Behavior |
|---|---|---|
| Warning | 10,000 tokens | A warning is displayed that the output is large |
| Default max | 25,000 tokens | Output is truncated beyond this limit |
| Disk persistence | 50,000 characters | Tool results exceeding 50K characters are persisted to disk |
The maximum output limit is configurable via the MAX_MCP_OUTPUT_TOKENS environment variable:
# Increase the max output to 50,000 tokens
export MAX_MCP_OUTPUT_TOKENS=50000Auto-Backgrounding Long-Running Tool Calls (v2.1.212)
MCP tool calls that run longer than 2 minutes now move to the background automatically, so the session stays usable instead of blocking on a slow tool. The threshold is configurable, and the behavior can be tuned or disabled, via CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS:
# Change the auto-background threshold to 5 minutes (300,000ms)
export CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS=300000Solving Context Bloat with Code Execution
As MCP adoption scales, connecting to dozens of servers with hundreds or thousands of tools creates a significant challenge: context bloat. This is arguably the biggest problem with MCP at scale, and Anthropic's engineering team has proposed an elegant solution — using code execution instead of direct tool calls.
Source: Code Execution with MCP: Building More Efficient Agents — Anthropic Engineering Blog
The Problem: Two Sources of Token Waste
1. Tool definitions overload the context window
Most MCP clients load all tool definitions upfront. When connected to thousands of tools, the model must process hundreds of thousands of tokens before it even reads the user's request.
2. Intermediate results consume additional tokens
Every intermediate tool result passes through the model's context. Consider transferring a meeting transcript from Google Drive to Salesforce — the full transcript flows through context twice: once when reading it, and again when writing it to the destination. A 2-hour meeting transcript could mean 50,000+ extra tokens.
graph LR
A["Model"] -->|"Tool Call: getDocument"| B["MCP Server"]
B -->|"Full transcript (50K tokens)"| A
A -->|"Tool Call: updateRecord(re-sends full transcript)"| B
B -->|"Confirmation"| A
style A fill:#ffcdd2,stroke:#333,color:#333
style B fill:#f3e5f5,stroke:#333,color:#333The Solution: MCP Tools as Code APIs
Instead of passing tool definitions and results through the context window, the agent writes code that calls MCP tools as APIs. The code runs in a sandboxed execution environment, and only the final result returns to the model.
graph LR
A["Model"] -->|"Writes code"| B["Code ExecutionEnvironment"]
B -->|"Calls tools directly"| C["MCP Servers"]
C -->|"Data stays inexecution env"| B
B -->|"Only final result(minimal tokens)"| A
style A fill:#c8e6c9,stroke:#333,color:#333
style B fill:#e1f5fe,stroke:#333,color:#333
style C fill:#f3e5f5,stroke:#333,color:#333How It Works
MCP tools are presented as a file tree of typed functions:
servers/
├── google-drive/
│ ├── getDocument.ts
│ └── index.ts
├── salesforce/
│ ├── updateRecord.ts
│ └── index.ts
└── ...Each tool file contains a typed wrapper:
// ./servers/google-drive/getDocument.ts
import { callMCPTool } from "../../../client.js";
interface GetDocumentInput {
documentId: string;
}
interface GetDocumentResponse {
content: string;
}
export async function getDocument(
input: GetDocumentInput
): Promise<GetDocumentResponse> {
return callMCPTool<GetDocumentResponse>(
'google_drive__get_document', input
);
}The agent then writes code to orchestrate the tools:
import * as gdrive from './servers/google-drive';
import * as salesforce from './servers/salesforce';
// Data flows directly between tools — never through the model
const transcript = (
await gdrive.getDocument({ documentId: 'abc123' })
).content;
await salesforce.updateRecord({
objectType: 'SalesMeeting',
recordId: '00Q5f000001abcXYZ',
data: { Notes: transcript }
});Result: Token usage drops from ~150,000 to ~2,000 — a 98.7% reduction.
Key Benefits
| Benefit | Description |
|---|---|
| Progressive Disclosure | Agent browses the filesystem to load only the tool definitions it needs, instead of all tools upfront |
| Context-Efficient Results | Data is filtered/transformed in the execution environment before returning to the model |
| Powerful Control Flow | Loops, conditionals, and error handling run in code without round-tripping through the model |
| Privacy Preservation | Intermediate data (PII, sensitive records) stays in the execution environment; never enters the model context |
| State Persistence | Agents can save intermediate results to files and build reusable skill functions |
Example: Filtering Large Datasets
// Without code execution — all 10,000 rows flow through context
// TOOL CALL: gdrive.getSheet(sheetId: 'abc123')
// -> returns 10,000 rows in context
// With code execution — filter in the execution environment
const allRows = await gdrive.getSheet({ sheetId: 'abc123' });
const pendingOrders = allRows.filter(
row => row["Status"] === 'pending'
);
console.log(`Found ${pendingOrders.length} pending orders`);
console.log(pendingOrders.slice(0, 5)); // Only 5 rows reach the modelExample: Loop Without Round-Tripping
// Poll for a deployment notification — runs entirely in code
let found = false;
while (!found) {
const messages = await slack.getChannelHistory({
channel: 'C123456'
});
found = messages.some(
m => m.text.includes('deployment complete')
);
if (!found) await new Promise(r => setTimeout(r, 5000));
}
console.log('Deployment notification received');Trade-offs to Consider
Code execution introduces its own complexity. Running agent-generated code requires:
- A secure sandboxed execution environment with appropriate resource limits
- Monitoring and logging of executed code
- Additional infrastructure overhead compared to direct tool calls
The benefits — reduced token costs, lower latency, improved tool composition — should be weighed against these implementation costs. For agents with only a few MCP servers, direct tool calls may be simpler. For agents at scale (dozens of servers, hundreds of tools), code execution is a significant improvement.
MCPorter: A Runtime for MCP Tool Composition
MCPorter is a TypeScript runtime and CLI toolkit that makes calling MCP servers practical without boilerplate — and helps reduce context bloat through selective tool exposure and typed wrappers.
What it solves: Instead of loading all tool definitions from all MCP servers upfront, MCPorter lets you discover, inspect, and call specific tools on demand — keeping your context lean.
Key features:
| Feature | Description |
|---|---|
| Zero-config discovery | Auto-discovers MCP servers from Cursor, Claude, Codex, or local configs |
| Typed tool clients | mcporter emit-ts generates .d.ts interfaces and ready-to-run wrappers |
| Composable API | createServerProxy() exposes tools as camelCase methods with .text(), .json(), .markdown() helpers |
| CLI generation | mcporter generate-cli converts any MCP server into a standalone CLI with --include-tools / --exclude-tools filtering |
| Parameter hiding | Optional parameters stay hidden by default, reducing schema verbosity |
Installation:
npx mcporter list # No install required — discover servers instantly
pnpm add mcporter # Add to a project
brew install steipete/tap/mcporter # macOS via HomebrewExample — composing tools in TypeScript:
import { createRuntime, createServerProxy } from "mcporter";
const runtime = await createRuntime();
const gdrive = createServerProxy(runtime, "google-drive");
const salesforce = createServerProxy(runtime, "salesforce");
// Data flows between tools without passing through the model context
const doc = await gdrive.getDocument({ documentId: "abc123" });
await salesforce.updateRecord({
objectType: "SalesMeeting",
recordId: "00Q5f000001abcXYZ",
data: { Notes: doc.text() }
});Example — CLI tool call:
# Call a specific tool directly
npx mcporter call linear.create_comment issueId:ENG-123 body:'Looks good!'
# List available servers and tools
npx mcporter listMCPorter complements the code-execution approach described above by providing the runtime infrastructure for calling MCP tools as typed APIs — making it straightforward to keep intermediate data out of the model context.
Best Practices
Security Considerations
Do's ✅
- Use environment variables for all credentials
- Rotate tokens and API keys regularly (monthly recommended)
- Use read-only tokens when possible
- Limit MCP server access scope to minimum required
- Monitor MCP server usage and access logs
- Use OAuth for external services when available
- Implement rate limiting on MCP requests
- Test MCP connections before production use
- Document all active MCP connections
- Keep MCP server packages updated
Don'ts ❌
- Don't hardcode credentials in config files
- Don't commit tokens or secrets to git
- Don't share tokens in team chats or emails
- Don't use personal tokens for team projects
- Don't grant unnecessary permissions
- Don't ignore authentication errors
- Don't expose MCP endpoints publicly
- Don't run MCP servers with root/admin privileges
- Don't cache sensitive data in logs
- Don't disable authentication mechanisms
Configuration Best Practices
- Version Control: Keep
.mcp.jsonin git but use environment variables for secrets - Least Privilege: Grant minimum permissions needed for each MCP server
- Isolation: Run different MCP servers in separate processes when possible
- Monitoring: Log all MCP requests and errors for audit trails
- Testing: Test all MCP configurations before deploying to production
Performance Tips
- Cache frequently accessed data at the application level
- Use MCP queries that are specific to reduce data transfer
- Monitor response times for MCP operations
- Consider rate limiting for external APIs
- Use batching when performing multiple operations
Installation Instructions
Prerequisites
- Node.js and npm installed
- Claude Code CLI installed
- API tokens/credentials for external services
Step-by-Step Setup
- Add your first MCP server using the CLI (example: GitHub):
claude mcp add --transport stdio github -- npx @modelcontextprotocol/server-github Or create a .mcp.json file in your project root:
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["@modelcontextprotocol/server-github"],
"env": {
"GITHUB_TOKEN": "${GITHUB_TOKEN}"
}
}
}
}- Set environment variables:
export GITHUB_TOKEN="your_github_personal_access_token"- Test the connection:
claude /mcp- Use MCP tools:
/mcp__github__list_prs
/mcp__github__create_issue "Title" "Description"Installation for Specific Services
GitHub MCP:
npm install @modelcontextprotocol/server-githubDatabase MCP:
npm install @modelcontextprotocol/server-databaseFilesystem MCP:
npm install @modelcontextprotocol/server-filesystemSlack MCP:
npm install @modelcontextprotocol/server-slackTroubleshooting
Start With the Error Output (v2.1.219+)
If a server won't connect, run claude mcp list (or /mcp inside a session) before changing anything. Claude Code now prints the HTTP status code and the server's error text next to the failing server, so you get 401 Unauthorized or 404 Not Found instead of a generic "failed to connect":
# Shows connection status plus HTTP status and error text for failures
claude mcp listRead the status first — it tells you which fix applies:
401/403→ bad or expired credentials; re-authenticate withclaude mcp login <name>404→ wrong URL (a missing/mcpor/ssepath suffix is the usual cause)5xx/ timeout → the remote server is down; see Connection Timeout
Hidden Whitespace in Config Values (v2.1.219+)
Claude Code warns when an MCP config value has leading or trailing whitespace. This is a common and hard-to-spot cause of auth failures: a token copy-pasted from a browser or a chat message often carries a trailing space or newline, which gets sent verbatim in the Authorization header and fails as an invalid credential.
If you see this warning, re-check the value in .mcp.json (or the env var it expands from) and trim it:
# Reveals hidden leading/trailing whitespace between the delimiters
printf '[%s]\n' "$GITHUB_TOKEN"Skipped Servers in Headless Runs (v2.1.219+)
Servers passed via --mcp-config that fail config validation are skipped rather than aborting the run, so a headless script can appear to work while missing half its tools. Claude Code now reports which ones were dropped:
- Headless /
-pruns: the stream-jsoninitevent carries anmcp_server_errorsfield listing every skipped entry. Check it before trusting the run's output. - Interactive terminal runs: the same problem is printed as a startup warning when the session begins.
# Inspect skipped --mcp-config entries in a headless run
claude -p "list my tools" --mcp-config ./servers.json \
--output-format stream-json --verbose \
| jq -r 'select(.type == "system" and .subtype == "init") | .mcp_server_errors'MCP Server Not Found
# Verify MCP server is installed
npm list -g @modelcontextprotocol/server-github
# Install if missing
npm install @modelcontextprotocol/server-githubAuthentication Failed
# Verify environment variable is set
echo $GITHUB_TOKEN
# Re-export if needed
export GITHUB_TOKEN="your_token"
# Verify token has correct permissions
# Check GitHub token scopes at: https://github.com/settings/tokensConnection Timeout
- Check network connectivity:
ping api.github.com - Verify API endpoint is accessible
- Check rate limits on API
- Try increasing timeout in config
- Check for firewall or proxy issues
MCP Server Crashes
- Check MCP server logs:
~/.claude/logs/ - Verify all environment variables are set
- Ensure proper file permissions
- Try reinstalling the MCP server package
- Check for conflicting processes on the same port
Related Concepts
Memory vs MCP
- Memory: Stores persistent, unchanging data (preferences, context, history)
- MCP: Accesses live, changing data (APIs, databases, real-time services)
When to Use Each
- Use Memory for: User preferences, conversation history, learned context
- Use MCP for: Current GitHub issues, live database queries, real-time data
Integration with Other Claude Features
- Combine MCP with Memory for rich context
- Use MCP tools in prompts for better reasoning
- Leverage multiple MCPs for complex workflows
Additional Resources
- Official MCP Documentation
- MCP Protocol Specification
- MCP GitHub Repository
- Available MCP Servers
- MCPorter — TypeScript runtime & CLI for calling MCP servers without boilerplate
- Code Execution with MCP — Anthropic's engineering blog on solving context bloat
- Claude Code CLI Reference
- Claude API Documentation
Last Updated: August 19, 2026
Claude Code Version: 2.1.235
Sources:
- https://code.claude.com/docs/en/mcp
- https://code.claude.com/docs/en/changelog
- https://github.com/anthropics/claude-code/releases/tag/v2.1.117
- https://github.com/anthropics/claude-code/releases/tag/v2.1.139
- https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md
- https://code.claude.com/docs/en/model-config
Compatible Models: Claude Fable 5, Claude Opus 5, Claude Sonnet 5, Claude Sonnet 4.6, Claude Opus 4.8, Claude Haiku 4.5
2. Official Technical Reference & Guides (luongnv89/luongnv89.github.io)
luongnv.com
Personal portfolio website for Luong Nguyen - Senior AI & Cybersecurity Engineer.
Live site: https://luongnv.com
Tech Stack
- Framework: React 18 + TypeScript
- Build Tool: Vite
- Styling: Tailwind CSS
- Icons: Lucide React
- Deployment: GitHub Pages + GitHub Actions
Features
- Dark/Light mode with system preference detection
- Matrix rain background animation (pause by hovering avatar)
- Live GitHub stats fetching
- Responsive design (mobile, tablet, desktop)
- SEO optimized with Schema.org structured data
- Smooth scroll navigation
Project Structure
.
├── src/
│ ├── components/ # React components
│ ├── hooks/ # Custom React hooks
│ ├── lib/ # Utilities
│ ├── data/ # Static data (projects)
│ └── styles/ # Global CSS
├── public/ # Static assets
├── scripts/ # Build scripts
├── .github/workflows/ # GitHub Actions CI/CD
├── 2025-ares/ # LLM Security presentation
├── img/ # Shared images
├── package.json
├── vite.config.ts
└── CNAME # Custom domain configDevelopment
npm install
npm run dev # Start dev server at localhost:5173
npm run build # Build for productionDeployment
Push to master branch triggers automatic deployment via GitHub Actions.
The workflow:
- Builds the React app
- Copies legacy assets (presentations, images)
- Deploys to GitHub Pages
Contact
- GitHub: @luongnv89
- LinkedIn: luongnv89
- Twitter: @luongnv89
- Bluesky: @luongnv89.bsky.social
- Medium: @luongnv89
License
MIT