Permet à deux instances Claude Code de discuter ensemble via MCP. Architecture: - broker/ : Serveur HTTP central avec heartbeat - mcp-master/ : MCP pour envoyer des messages (talk, list_partners) - mcp-slave/ : MCP pour recevoir et répondre (connect, respond) - hooks/ : Hook Stop pour capturer les réponses (optionnel) Features: - Long-polling sans timeout - Heartbeat toutes les 30s (fix bug Claude Code SSE) - Sauvegarde des conversations par date - ID basé sur le dossier de travail (unique par projet) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
4.1 KiB
4.1 KiB
MCP Claude Duo
Fait discuter deux instances Claude Code ensemble via MCP.
Architecture
Terminal 1 (Master) Terminal 2 (Slave)
┌─────────────────┐ ┌─────────────────┐
│ Claude Code │ │ Claude Code │
│ + MCP Master │ ┌───────┐ │ + MCP Slave │
│ │ │Broker │ │ + Hook Stop │
│ talk("yo") ────┼────────►│ HTTP │─────────►│ │
│ │ │ │ │ reçoit "yo" │
│ │ │ │ │ répond "salut" │
│ reçoit "salut"◄┼─────────│ │◄─────────┼── (hook envoie) │
└─────────────────┘ └───────┘ └─────────────────┘
Installation
cd mcp-claude-duo
npm install
Démarrage
1. Lancer le broker (dans un terminal séparé)
npm run broker
Le broker tourne sur http://localhost:3210 par défaut.
2. Configurer le Master (Terminal 1)
Ajoute dans ta config MCP Claude Code (~/.claude.json ou settings):
{
"mcpServers": {
"duo-master": {
"command": "node",
"args": ["C:/Users/alexi/Documents/projects/mcp-claude-duo/mcp-master/index.js"],
"env": {
"BROKER_URL": "http://localhost:3210"
}
}
}
}
3. Configurer le Slave (Terminal 2)
Config MCP:
{
"mcpServers": {
"duo-slave": {
"command": "node",
"args": ["C:/Users/alexi/Documents/projects/mcp-claude-duo/mcp-slave/index.js"],
"env": {
"BROKER_URL": "http://localhost:3210",
"SLAVE_NAME": "Bob"
}
}
}
}
Config Hook (dans .claude/settings.json du projet ou ~/.claude/settings.json):
{
"hooks": {
"Stop": [
{
"matcher": {},
"hooks": [
{
"type": "command",
"command": "node C:/Users/alexi/Documents/projects/mcp-claude-duo/hooks/on-stop.js"
}
]
}
]
}
}
Utilisation
Terminal 2 (Slave) - Se connecter
Toi: "Connecte-toi en tant que partenaire"
Claude: *utilise connect()* → "Connecté, en attente de messages..."
Terminal 1 (Master) - Parler
Toi: "Parle à mon partenaire, dis lui salut"
Claude: *utilise talk("Salut !")*
→ attend la réponse...
→ "Partenaire: Hey ! Ça va ?"
Terminal 2 (Slave) - Reçoit et répond
Claude: "Message reçu: Salut !"
Claude: "Je lui réponds..." → écrit sa réponse
→ Le hook capture et envoie au broker
Claude: *utilise connect()* → attend le prochain message
Tools disponibles
MCP Master
| Tool | Description |
|---|---|
talk(message) |
Envoie un message et attend la réponse |
list_partners() |
Liste les partenaires connectés |
MCP Slave
| Tool | Description |
|---|---|
connect(name?) |
Se connecte et attend les messages |
disconnect() |
Se déconnecte |
Variables d'environnement
| Variable | Description | Défaut |
|---|---|---|
BROKER_URL |
URL du broker | http://localhost:3210 |
BROKER_PORT |
Port du broker | 3210 |
SLAVE_NAME |
Nom du slave | Partner |
Flow détaillé
- Slave appelle
connect()→ s'enregistre au broker, attend (long-polling) - Master appelle
talk("message")→ envoie au broker - Broker transmet au slave →
connect()retourne le message - Slave Claude voit le message et répond naturellement
- Hook Stop se déclenche → lit le transcript, extrait la réponse, envoie au broker
- Broker retourne la réponse au master
- Master
talk()retourne avec la réponse - Slave rappelle
connect()pour le prochain message
License
MIT