Claude Swarm orchestrates multiple Claude Code instances as a collaborative AI development team. It enables running AI agents with specialized roles, tools, and directory contexts, communicating via MCP (Model Context Protocol) in a tree-like hierarchy. Define your swarm topology in simple YAML and let Claude instances delegate tasks through connected instances. Perfect for complex projects requiring specialized AI agents for frontend, backend, testing, DevOps, or research tasks.
Install the gem by executing:
gem install claude_swarmOr add it to your Gemfile:
gem 'claude_swarm'Then run:
bundle install- Ruby 3.1.0 or higher
- Claude CLI installed and configured
- Any MCP servers you plan to use (optional)
- Run
claude-swarm initor create aclaude-swarm.ymlfile in your project:
version: 1
swarm:
name: "My Dev Team"
main: lead
instances:
lead:
description: "Team lead coordinating development efforts"
directory: .
model: opus
connections: [frontend, backend]
tools: # Tools aren't required if you run it with `--vibe`
- Read
- Edit
- Bash
frontend:
description: "Frontend specialist handling UI and user experience"
directory: ./frontend
model: opus
tools:
- Edit
- Write
- Bash
backend:
description: "Backend developer managing APIs and data layer"
directory: ./backend
model: opus
tools:
- Edit
- Write
- Bash- Start the swarm:
claude-swarmor if you are feeling the vibes...
claude-swarm --vibe # That will allow ALL tools for all instances! Be Careful!This will:
- Launch the main instance (lead) with connections to other instances
- The lead instance can communicate with the other instances via MCP
- All session files are stored in
.claude-swarm/sessions/{timestamp}/
Here's a more complex example showing specialized teams working on different parts of a project:
version: 1
swarm:
name: "Multi-Service Development Team"
main: architect
instances:
architect:
description: "System architect coordinating between service teams"
directory: .
model: opus
connections: [frontend_lead, backend_lead, mobile_lead, devops]
prompt: "You are the system architect coordinating between different service teams"
tools: [Read, Edit, WebSearch]
frontend_lead:
description: "Frontend team lead overseeing React development"
directory: ./web-frontend
model: opus
connections: [react_dev, css_expert]
prompt: "You lead the web frontend team working with React"
tools: [Read, Edit, Bash]
react_dev:
description: "React developer specializing in components and state management"
directory: ./web-frontend/src
model: opus
prompt: "You specialize in React components and state management"
tools: [Edit, Write, "Bash(npm:*)"]
css_expert:
description: "CSS specialist handling styling and responsive design"
directory: ./web-frontend/styles
model: opus
prompt: "You handle all CSS and styling concerns"
tools: [Edit, Write, Read]
backend_lead:
description: "Backend team lead managing API development"
directory: ./api-server
model: opus
connections: [api_dev, database_expert]
prompt: "You lead the API backend team"
tools: [Read, Edit, Bash]
api_dev:
description: "API developer building REST endpoints"
directory: ./api-server/src
model: opus
prompt: "You develop REST API endpoints"
tools: [Edit, Write, Bash]
database_expert:
description: "Database specialist managing schemas and migrations"
directory: ./api-server/db
model: opus
prompt: "You handle database schema and migrations"
tools: [Edit, Write, "Bash(psql:*, migrate:*)"]
mobile_lead:
description: "Mobile team lead coordinating cross-platform development"
directory: ./mobile-app
model: opus
connections: [ios_dev, android_dev]
prompt: "You coordinate mobile development across platforms"
tools: [Read, Edit]
ios_dev:
description: "iOS developer building native Apple applications"
directory: ./mobile-app/ios
model: opus
prompt: "You develop the iOS application"
tools: [Edit, Write, "Bash(xcodebuild:*, pod:*)"]
android_dev:
description: "Android developer creating native Android apps"
directory: ./mobile-app/android
model: opus
prompt: "You develop the Android application"
tools: [Edit, Write, "Bash(gradle:*, adb:*)"]
devops:
description: "DevOps engineer managing CI/CD and infrastructure"
directory: ./infrastructure
model: opus
prompt: "You handle CI/CD and infrastructure"
tools: [Read, Edit, "Bash(docker:*, kubectl:*)"]In this setup:
- The architect (main instance) can delegate tasks to team leads
- Each team lead can work with their specialized developers
- Each instance is independent - connections create separate MCP server instances
- Teams work in isolated directories with role-appropriate tools
version: 1 # Required, currently only version 1 is supported
swarm:
name: "Swarm Name" # Display name for your swarm
main: instance_key # Which instance to launch as the main interface
instances:
# Instance definitions...Each instance must have:
- description (required): Brief description of the agent's role (used in task tool descriptions)
Each instance can have:
- directory: Working directory for this instance (can use ~ for home)
- model: Claude model to use (opus, sonnet, haiku)
- connections: Array of other instances this one can communicate with
- tools: Array of tools this instance can use
- mcps: Array of additional MCP servers to connect
- prompt: Custom system prompt to append to the instance
instance_name:
description: "Specialized agent focused on specific tasks"
directory: ~/project/path
model: opus
connections: [other_instance1, other_instance2]
prompt: "You are a specialized agent focused on..."
tools:
- Read
- Edit
- Write
- Bash
- WebFetch
- WebSearch
mcps:
- name: server_name
type: stdio
command: command_to_run
args: ["arg1", "arg2"]
env:
VAR1: value1mcps:
- name: my_tool
type: stdio
command: /path/to/executable
args: ["--flag", "value"]
env:
API_KEY: "secret"mcps:
- name: remote_api
type: sse
url: "https://api.example.com/mcp"Specify which tools each instance can use:
tools:
- Bash # Command execution
- Edit # File editing
- Write # File creation
- Read # File reading
- WebFetch # Fetch web content
- WebSearch # Search the webTools are passed to Claude using the --allowedTools flag with comma-separated values.
You can restrict tools with pattern-based filters:
tools:
- Read # Unrestricted read access
- Edit # Unrestricted edit access
- "Bash(npm:*)" # Only allow npm commands
- "Bash(git:*, make:*)" # Only allow git and make commandsversion: 1
swarm:
name: "Full Stack Team"
main: architect
instances:
architect:
description: "Lead architect responsible for system design and code quality"
directory: .
model: opus
connections: [frontend, backend, devops]
prompt: "You are the lead architect responsible for system design and code quality"
tools:
- Read
- Edit
- WebSearch
frontend:
description: "Frontend developer specializing in React and TypeScript"
directory: ./frontend
model: opus
connections: [architect]
prompt: "You specialize in React, TypeScript, and modern frontend development"
tools:
- Edit
- Write
- Bash
backend:
description: "Backend developer building APIs and services"
directory: ./backend
model: opus
connections: [architect, database]
tools:
- Edit
- Write
- Bash
database:
description: "Database administrator managing data persistence"
directory: ./db
model: haiku
tools:
- Read
- Bash
devops:
description: "DevOps engineer handling deployment and infrastructure"
directory: .
model: opus
connections: [architect]
tools:
- Read
- Edit
- Bashversion: 1
swarm:
name: "Research Team"
main: lead_researcher
instances:
lead_researcher:
description: "Lead researcher coordinating analysis and documentation"
directory: ~/research
model: opus
connections: [data_analyst, writer]
tools:
- Read
- WebSearch
- WebFetch
mcps:
- name: arxiv
type: sse
url: "https://arxiv-mcp.example.com"
data_analyst:
description: "Data analyst processing research data and statistics"
directory: ~/research/data
model: opus
tools:
- Read
- Write
- Bash
mcps:
- name: jupyter
type: stdio
command: jupyter-mcp
args: ["--notebook-dir", "."]
writer:
description: "Technical writer preparing research documentation"
directory: ~/research/papers
model: opus
tools:
- Edit
- Write
- Read# Use default claude-swarm.yml in current directory
claude-swarm
# Specify a different configuration file
claude-swarm --config my-swarm.yml
claude-swarm -c team-config.yml
# Run with --dangerously-skip-permissions for all instances
claude-swarm --vibe
# Run in non-interactive mode with a prompt
claude-swarm -p "Implement the new user authentication feature"
claude-swarm --prompt "Fix the bug in the payment module"
# Show version
claude-swarm version
# Internal command for MCP server (used by connected instances)
claude-swarm mcp-serve INSTANCE_NAME --config CONFIG_FILE --session-timestamp TIMESTAMP- Configuration Parsing: Claude Swarm reads your YAML configuration and validates it
- MCP Generation: For each instance, it generates an MCP configuration file that includes:
- Any explicitly defined MCP servers
- MCP servers for each connected instance (using
claude-swarm mcp-serve)
- Session Management: Claude Swarm maintains session continuity:
- Generates a shared session timestamp for all instances
- Each instance can maintain its own Claude session ID
- Sessions can be reset via the MCP server interface
- Main Instance Launch: The main instance is launched with its MCP configuration, giving it access to all connected instances
- Inter-Instance Communication: Connected instances expose themselves as MCP servers with these tools:
- task: Execute tasks using Claude Code with configurable tools and return results. The tool description includes the instance name and description (e.g., "Execute a task using Agent frontend_dev. Frontend developer specializing in React and TypeScript")
- session_info: Get current Claude session information including ID and working directory
- reset_session: Reset the Claude session for a fresh start
- Session Management: All session files are organized in
.claude-swarm/sessions/{timestamp}/:- MCP configuration files:
{instance_name}.mcp.json - Session log:
session.logwith detailed request/response tracking
- MCP configuration files:
"Configuration file not found"
- Ensure
claude-swarm.ymlexists in the current directory - Or specify the path with
--config
"Main instance not found in instances"
- Check that your
main:field references a valid instance key
"Unknown instance in connections"
- Verify all instances in
connections:arrays are defined
Permission Errors
- Ensure Claude CLI is properly installed and accessible
- Check directory permissions for specified paths
The swarm will display:
- Session directory location (
.claude-swarm/sessions/{timestamp}/) - Main instance details (model, directory, tools, connections)
- The exact command being run
Check the session directory .claude-swarm/sessions/{timestamp}/ for:
session.log: Detailed logs with request/response tracking{instance}.mcp.json: MCP configuration for each instance- All files for a session are kept together for easy review
Claude Swarm consists of these core components:
- ClaudeSwarm::CLI (
cli.rb): Thor-based command-line interface withstartandmcp-servecommands - ClaudeSwarm::Configuration (
configuration.rb): YAML parser and validator with path expansion - ClaudeSwarm::McpGenerator (
mcp_generator.rb): Generates MCP JSON configs for each instance - ClaudeSwarm::Orchestrator (
orchestrator.rb): Launches the main Claude instance with shared session management - ClaudeSwarm::ClaudeCodeExecutor (
claude_code_executor.rb): Wrapper for executing Claude commands with session persistence - ClaudeSwarm::ClaudeMcpServer (
claude_mcp_server.rb): FastMCP-based server providing task execution, session info, and reset capabilities
After checking out the repo, run bin/setup to install dependencies. Then, run rake test to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install.
bin/setup # Install dependencies
rake test # Run the Minitest test suite
rake rubocop -A # Run RuboCop linter with auto-fix
bin/console # Start IRB session with gem loaded
bundle exec rake install # Install gem locally
bundle exec rake release # Release gem to RubyGems.org
rake # Default: runs both tests and RuboCopBug reports and pull requests are welcome on GitHub at https://github.com/parruda/claude-swarm.
The gem is available as open source under the terms of the MIT License.