Are you the author? Sign in to claim
iris-mcp
Model Context Protocol server for cross-project Claude Code coordination
Iris MCP enables Claude Code instances across different project directories to communicate and coordinate. Stay in one project while orchestrating teams across your entire codebase ecosystem.
Iris MCP is a groundbreaking Model Context Protocol server that enables direct communication between Claude Code instances across different project directories, machines, and networks, creating the first true cross-codebase AI collaboration system with remote orchestration.
Modern software development involves multiple codebases (frontend, backend, mobile, infrastructure) that must stay synchronized. Currently, when you need to coordinate changes across projects:
This workflow is slow, error-prone, and breaks your flow state. Studies show developers lose 23 minutes of productivity on average when context switching.
Stay in your current project while Claude coordinates with other teams automatically:
You (in frontend project):
"Ask the backend team what their API versioning strategy is"
Claude (frontend) → Iris MCP → Claude (backend) → analyzes backend code → responds
↓
"The backend team uses semantic versioning with /api/v1, /api/v2 prefixes"
You never left the frontend project. Iris handled the coordination automatically.
Iris fills critical gaps that no existing multi-agent system addresses:
| Feature | Iris MCP | Symphony of One | Claude-Flow | Agent-MCP | Others |
|---|---|---|---|---|---|
| Cross-Project Communication | ✅ | ❌ | ❌ | ❌ | ❌ |
| Independent Team Contexts | ✅ | ❌ | ❌ | ❌ | ❌ |
| Direct Agent-to-Agent Messaging | ✅ | ❌ | ❌ | ❌ | ❌ |
| Per-Team MCP Server Access | ✅ | ❌ | ❌ | ❌ | ❌ |
| Zero Shared State | ✅ | ❌ | ❌ | ❌ | ❌ |
| Natural Language Coordination | ✅ | ❌ | ❌ | ❌ | ❌ |
| Remote Execution via SSH | ✅ | ❌ | ❌ | ❌ | ❌ |
| Bidirectional SSH Tunneling | ✅ | ❌ | ❌ | ❌ | ❌ |
| Session Persistence | ✅ | ❌ | ❌ | ❌ | ❌ |
All existing solutions work within a single project boundary. Iris breaks this limitation by enabling communication between completely independent codebases, each with their own:
.claude/ configurationEach team's Claude instance maintains complete context isolation, meaning more accurate, specialized responses:
Team Frontend Claude knows:
✅ React components, Tailwind classes, Redux patterns
✅ Frontend-specific MCP servers (Figma, Storybook)
✅ Frontend CLAUDE.md instructions
❌ Backend database schemas (not needed!)
❌ Mobile iOS/Android specifics (not needed!)
Team Backend Claude knows:
✅ Database schemas, API endpoints, migrations
✅ Backend-specific MCP servers (PostgreSQL, Redis)
✅ Backend CLAUDE.md instructions
❌ Frontend component structure (not needed!)
Your frontend in TypeScript/React can coordinate with your backend in Python/Django, and your mobile app in Swift—all simultaneously, all with perfect context.
From GitHub Issue #2929:
"Use cases are infinite. I could have a specialist claude run on my specific server answering to natural language requests, while a local generalist claude call it, having no clue of the specific API."
Developers are already asking for this! Iris MCP delivers it.
Execute Claude Code on remote machines via SSH while maintaining local orchestration:
teams:
team-production:
remote: "ssh user@prod-server"
claudePath: "~/.local/bin/claude"
path: "/opt/production/app"
enableReverseMcp: true # Enable bidirectional tunneling
Capabilities:
Bidirectional orchestration where remote teams can coordinate local teams:
Local Machine ←────SSH Tunnel────→ Remote Machine
(Iris MCP) -R 1615:... (Claude Code)
↑ │
└──────── HTTP via tunnel ─────────────┘
Remote Claude instances can use Iris MCP tools to:
Security: SSH-encrypted tunneling, permission approval system, localhost-only binding.
New to Iris? Check out GETTING_STARTED.md for a complete setup guide!
Linux/macOS:
curl -fsSL https://raw.githubusercontent.com/jenova-marie/iris-mcp/main/setup.sh | bash
Windows (PowerShell):
iwr -useb https://raw.githubusercontent.com/jenova-marie/iris-mcp/main/setup.ps1 | iex
Note: The PowerShell script is untested on real Windows systems. If you encounter errors, please open an issue with error details or submit a PR with fixes. We appreciate your help! 🙏
These interactive scripts will:
That's it! You'll be coordinating AI teams in under 5 minutes. 🚀
# Install globally from npm
npm install -g @jenova-marie/iris-mcp
# Verify installation
iris-mcp --version
# Add your projects as teams
iris-mcp add-team frontend ~/code/my-frontend
iris-mcp add-team backend ~/code/my-backend
# Connect to Claude Code
iris-mcp install
# Start the server
iris-mcp
See GETTING_STARTED.md for detailed usage examples and troubleshooting.
Iris MCP provides 17 comprehensive tools for team coordination:
send_messageSend a message to a team and wait for response.
{
fromTeam: "team-frontend",
toTeam: "team-backend",
message: "What authentication strategy do you use?",
timeout: 30000 // optional, default 30s
}
Modes:
timeout > 0: Wait for response (default)timeout: -1: Fire-and-forget (async)persist: true: Queue in database for laterExample prompts:
ask_messageSemantic alias for send_message emphasizing questions.
{
fromTeam: "team-frontend",
toTeam: "team-backend",
message: "What database migration system do you use?",
timeout: 30000
}
Example prompts:
quick_messageFire-and-forget messaging without waiting for response.
{
fromTeam: "team-backend",
toTeam: "team-frontend",
message: "New API endpoint deployed: GET /api/v2/users"
}
Example prompts:
session_rebootCreate a brand new session with fresh UUID.
{
fromTeam: "team-iris",
toTeam: "team-backend"
}
Terminates existing process and creates new session with clean slate.
session_deletePermanently delete a session without creating replacement.
{
fromTeam: "team-iris",
toTeam: "team-backend"
}
session_forkLaunch interactive terminal window for manual interaction.
{
fromTeam: "team-iris",
toTeam: "team-backend"
}
Opens separate terminal with claude --resume --fork-session for direct interaction.
session_cancelCancel a running session operation.
{
fromTeam: "team-iris",
team: "team-backend"
}
Attempts to interrupt long-running operations by sending ESC to stdin.
session_reportView conversation history for a session.
{
fromTeam: "team-iris",
team: "team-backend"
}
Returns complete conversation cache including all messages and protocol responses.
team_wakeWake up a team by ensuring its process is active.
{
fromTeam: "team-iris",
team: "team-backend"
}
Creates session-specific process (e.g., iris->backend) for conversation isolation.
team_launchSemantic alias for team_wake emphasizing activation.
{
fromTeam: "team-iris",
team: "team-backend"
}
team_sleepPut a team to sleep by terminating its process.
{
fromTeam: "team-iris",
team: "team-backend",
force: false // optional
}
team_wake_allWake all configured teams sequentially.
{
fromTeam: "team-iris",
parallel: false // NOT RECOMMENDED - unstable
}
Warning: Parallel mode causes timeouts due to simultaneous Claude spawning.
team_statusGet status of teams, processes, and notifications.
{
fromTeam: "team-iris",
team: "team-backend", // optional, omit for all teams
includeNotifications: true // optional, default true
}
Response:
{
"teams": [{
"name": "team-backend",
"path": "/Users/you/projects/backend",
"active": true,
"processInfo": {
"status": "idle",
"pid": 12345,
"uptime": 180000
},
"sessionInfo": {
"sessionId": "abc-123",
"messageCount": 47,
"lastUsed": 1704067200000
}
}],
"pool": {
"totalProcesses": 3,
"maxProcesses": 10
}
}
list_teamsList all configured teams.
{}
Returns team names with configuration details (path, description, color, settings).
get_logsQuery in-memory logs from Iris MCP server.
{
logs_since: 1704067200000, // optional timestamp
level: "error", // optional: 'trace'|'debug'|'info'|'warn'|'error'|'fatal'
format: "parsed" // optional: 'raw'|'parsed'
}
get_dateGet current system date and time.
{}
Returns ISO 8601, UTC string, Unix timestamp, and detailed components.
permissions__approvePermission approval handler for Claude Code's --permission-prompt-tool.
{
tool_name: "mcp__iris__team_wake",
input: { team: "team-backend" },
reason: "Need to coordinate deployment"
}
Auto-approves all mcp__iris__* tools, denies everything else.
iris-mcp/
├── src/
│ ├── index.ts # MCP server entry point
│ ├── iris.ts # IrisOrchestrator (Business Logic Layer)
│ ├── config/
│ │ ├── teams-config.ts # Configuration with Zod validation
│ │ └── iris-config.ts # Config schema and types
│ ├── session/
│ │ ├── session-manager.ts # Session database and file management
│ │ ├── session-store.ts # SQLite session store
│ │ ├── path-utils.ts # Session file path utilities
│ │ └── types.ts # Session interfaces
│ ├── process-pool/
│ │ ├── pool-manager.ts # Process pool with LRU eviction
│ │ ├── claude-process.ts # Claude process wrapper
│ │ └── types.ts # Process interfaces
│ ├── transport/
│ │ ├── base-transport.ts # Transport abstraction interface
│ │ ├── local-transport.ts # Local process execution
│ │ ├── ssh-transport.ts # OpenSSH client execution
│ │ └── remote-ssh2-transport.ts # ssh2 library execution
│ ├── actions/
│ │ ├── send-message.ts # send_message tool
│ │ ├── ask-message.ts # ask_message tool
│ │ ├── quick-message.ts # quick_message tool
│ │ ├── session-reboot.ts # session_reboot tool
│ │ ├── session-delete.ts # session_delete tool
│ │ ├── session-fork.ts # session_fork tool
│ │ ├── session-cancel.ts # session_cancel tool
│ │ ├── team-wake.ts # team_wake tool
│ │ ├── team-launch.ts # team_launch tool
│ │ ├── team-sleep.ts # team_sleep tool
│ │ ├── team-wake-all.ts # team_wake_all tool
│ │ ├── team-status.ts # team_status tool
│ │ ├── session-report.ts # session_report tool
│ │ ├── list-teams.ts # list_teams tool
│ │ ├── get-logs.ts # get_logs tool
│ │ ├── get-date.ts # get_date tool
│ │ └── grant-permission.ts # permissions__approve tool
│ ├── dashboard/
│ │ ├── app.tsx # React SPA entry point
│ │ ├── components/ # React components
│ │ └── server.ts # Express + WebSocket backend
│ ├── notifications/
│ │ ├── queue.ts # SQLite notification queue
│ │ └── schema.sql # Database schema
│ ├── logging/
│ │ ├── wonder-logger.ts # Wonder Logger implementation
│ │ └── opentelemetry.ts # OpenTelemetry integration
│ └── utils/
│ ├── logger.ts # Structured logging to stderr
│ ├── errors.ts # Custom error hierarchy
│ ├── validation.ts # Input validation
│ └── env-interpolation.ts # Environment variable interpolation
├── docs/
│ ├── CONCEPT.md # Vision and conceptual overview
│ ├── ARCHITECTURE.md # System design and components
│ ├── ACTIONS.md # All 17 MCP tools documentation
│ ├── CONFIG.md # Configuration management
│ ├── SESSION.md # Session management deep dive
│ ├── REMOTE.md # Remote execution via SSH
│ ├── REVERSE_MCP.md # Bidirectional SSH tunneling
│ ├── DASHBOARD.md # Web dashboard documentation
│ ├── FEATURES.md # Comprehensive feature inventory
│ └── NOMENCLATURE.md # Core concepts and terminology
├── data/
│ ├── team-sessions.db # Session database (auto-created)
│ └── notifications.db # Notification queue (auto-created)
├── config.yaml # Your team configuration
└── package.json
Iris uses a clean three-layer architecture with strict separation of concerns:
┌─────────────────────────────────────────────┐
│ IrisOrchestrator (BLL) │
│ Coordinates SessionManager + PoolManager │
└──────────────┬──────────────────────────────┘
│
┌───────┴────────┐
│ │
▼ ▼
┌──────────────┐ ┌─────────────────────┐
│SessionManager│ │ClaudeProcessPool │
│ │ │ │
│DB + Files │ │Process Lifecycle │
│ │ │ │
│NO processes │ │NO session lookup │
└──────┬───────┘ └──────────┬──────────┘
│ │
▼ ▼
┌──────────────┐ ┌─────────────────────┐
│SessionStore │ │ClaudeProcess │
│SQLite │ │Transport Abstraction│
└──────────────┘ └─────────────────────┘
│
┌───────────┴───────────┐
│ │
▼ ▼
┌─────────────┐ ┌──────────────┐
│LocalTransport│ │SSHTransport │
└─────────────┘ └──────────────┘
Layer 1: IrisOrchestrator (Business Logic Layer)
Layer 2: SessionManager + ClaudeProcessPool
Layer 3: SessionStore + ClaudeProcess
Iris supports multiple execution modes via pluggable transports:
LocalTransport:
spawn()SSHTransport (OpenSSH client):
ssh user@hostRemoteSSH2Transport (ssh2 library):
Persistent team-to-team sessions maintain conversation continuity:
(fromTeam, toTeam) pair has exactly one session (e.g., iris→backend, backend→frontend)~/.claude/projects/{escaped-path}/{sessionId}.jsonlSchema:
CREATE TABLE sessions (
pool_key TEXT PRIMARY KEY,
session_id TEXT NOT NULL,
message_count INTEGER DEFAULT 0,
last_used_at INTEGER,
status TEXT DEFAULT 'active',
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL
);
Iris maintains a pool of Claude Code processes with:
--resume <sessionId>Two-Timeout Architecture:
responseTimeout: How long to wait for Claude to respond (default: 2 minutes)mcpTimeout: Maximum time for MCP server communication (default: 5 seconds)Iris uses RxJS observables for event-driven communication:
// Process events as Observable streams
process.events$
.pipe(
filter(event => event.type === 'message-response'),
timeout(responseTimeout),
catchError(err => of({ type: 'error', error: err }))
)
.subscribe(handleResponse);
Benefits:
Remote teams can be configured with Session MCP - per-session MCP configuration:
teams:
team-remote:
remote: "ssh user@remote-host"
sessionMcpEnabled: true
sessionMcpPath: "/path/to/session-mcp-server"
Each session gets its own MCP server instance with session-specific context.
OpenTelemetry-based observability with structured logging:
logger.info('Process spawned', {
poolKey: 'iris->backend',
sessionId: 'abc-123',
pid: 12345,
transport: 'ssh'
});
Features:
Four modes for controlling team actions:
yes: Auto-approve all actions (default)no: Auto-deny all actions (read-only mode)ask: Prompt user for each action (via Dashboard)forward: Forward permission request to calling teamteams:
team-production:
grantPermission: ask # Require approval for all actions
settings:
# Process Timeouts
sessionInitTimeout: 30000 # 30 seconds for session creation
spawnTimeout: 20000 # 20 seconds for process spawn
responseTimeout: 120000 # 2 minutes for Claude response
mcpTimeout: 5000 # 5 seconds for MCP server communication
# Process Pool
idleTimeout: 3600000 # 1 hour idle before termination
maxProcesses: 10 # Max concurrent processes
healthCheckInterval: 30000 # 30 seconds health check
# Server
httpPort: ${IRIS_HTTP_PORT:-1615}
defaultTransport: http # stdio or http
teams:
# Local Team
team-frontend:
path: /Users/you/projects/frontend
description: React frontend application
idleTimeout: 600000 # 10 minutes (override)
grantPermission: yes
color: "#61DAFB"
# Remote Team with Reverse MCP
team-production:
remote: "ssh user@prod-server"
claudePath: "~/.local/bin/claude"
path: "/opt/production/app"
description: Production backend server
enableReverseMcp: true # Enable bidirectional tunneling
reverseMcpPort: 1615 # Port to tunnel
allowHttp: false # Use HTTPS for production
grantPermission: ask # Require approval for actions
color: "#E34F26"
# Remote Team with Session MCP
team-mobile:
remote: "ssh user@mobile-server"
path: "/home/user/mobile-app"
sessionMcpEnabled: true
sessionMcpPath: "/usr/local/bin/session-mcp"
color: "#3DDC84"
Use ${VAR:-default} syntax for dynamic configuration:
settings:
httpPort: ${IRIS_HTTP_PORT:-1615}
idleTimeout: ${IRIS_IDLE_TIMEOUT:-3600000}
maxProcesses: ${IRIS_MAX_PROCESSES:-10}
teams:
team-production:
path: ${PROD_PATH} # Required (throws if not set)
idleTimeout: ${PROD_TIMEOUT:-1800000}
Example .env file:
IRIS_HTTP_PORT=1615
IRIS_MAX_PROCESSES=20
PROD_PATH=/opt/production/app
PROD_TIMEOUT=3600000
Iris watches config.yaml with fs.watchFile() (1s interval) and automatically reloads configuration changes without server restart.
pnpm build
pnpm dev
# Run all tests
pnpm test
# Unit tests only (fast, mocked)
pnpm test:unit
# Integration tests only (slow, real Claude processes)
pnpm test:integration
# Run specific test file
pnpm test:run path/to/test.ts
# Watch mode with UI
pnpm test:ui
pnpm inspector
This opens the MCP inspector at http://localhost:5173 to test tools interactively.
All logs go to stderr in JSON format:
{"level":"info","context":"server","message":"Iris MCP Server initialized","teams":["frontend","backend"],"timestamp":"2025-01-15T10:30:00.000Z"}
{"level":"info","context":"pool","message":"Process spawned","poolKey":"iris->backend","sessionId":"abc-123","pid":12345,"timestamp":"2025-01-15T10:30:15.000Z"}
Log Contexts:
server: MCP server lifecycleconfig: Configuration loadingsession-manager: Session operationssession-store: Database operationspool: Process pool managementprocess:teamName: Individual process logstransport:ssh: SSH transport operationsCold Start (first request to a team):
Warm Start (subsequent requests):
Speedup: 10-20x faster with pooling!
Without Iris (each request):
With Iris:
(fromTeam, toTeam) sessionsProcess Pool Management:
Memory Usage (typical):
Test Optimizations:
beforeAll optimizationSymptom: TeamNotFoundError when using tools
Solutions:
config.yaml matches exactly (case-sensitive)config.yaml (or wait for hot-reload)Symptom: Error during process creation
Solutions:
which claudeclaude --session-id test-$(uuidgen) --print ping manually in the team directorycontext:"process:teamName"ssh user@host 'which claude'Symptom: Message takes longer than configured timeout
Solutions:
responseTimeout in settings: responseTimeout: 180000 (3 minutes)sessionInitTimeout in configSymptom: Session initialization fails
Solutions:
~/.claude/projects/ directory exists: mkdir -p ~/.claude/projectsls -la ~/.claudedf -hSymptom: Remote team execution fails
Solutions:
ssh user@host 'echo hello'claudePath is correct on remote machinessh -v user@hostSymptom: SQLite errors about locked database
Solutions:
rm data/*.db-wal data/*.db-shmps aux | grep irisSymptom: All process slots occupied
Solutions:
maxProcesses in config.yaml settingsidleTimeout to free processes fasterStatus: Fully implemented and production-ready!
See src/api/README.md
iris ask commandiris status monitoringSee src/cli/README.md
See src/intelligence/README.md
We welcome contributions! Please see our Contributing Guidelines for details.
git checkout -b feature/amazing-feature)git commit -m 'Add some amazing feature')git push origin feature/amazing-feature)# Clone your fork
git clone https://github.com/your-username/iris-mcp
cd iris-mcp
# Install dependencies
pnpm install
# Run tests
pnpm test
# Run in watch mode
pnpm dev
# Build the project
pnpm build
Please ensure all tests pass before submitting a PR.
MIT License - see LICENSE file for details
Iris was the Greek goddess of the rainbow and messenger of the gods, bridging heaven and earth. Similarly, Iris MCP bridges your AI agents across project boundaries.
One messenger. Many teams. Infinite coordination.
Built with ❤️ by Jenova Marie
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots
Google's universal MCP server supporting PostgreSQL, MySQL, MongoDB, Redis, and 10+ databases
Official GitHub integration for repos, issues, PRs, and CI/CD workflows