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>
157 lines
4.1 KiB
Markdown
157 lines
4.1 KiB
Markdown
# 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
|
|
|
|
```bash
|
|
cd mcp-claude-duo
|
|
npm install
|
|
```
|
|
|
|
## Démarrage
|
|
|
|
### 1. Lancer le broker (dans un terminal séparé)
|
|
|
|
```bash
|
|
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):
|
|
|
|
```json
|
|
{
|
|
"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:
|
|
|
|
```json
|
|
{
|
|
"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`):
|
|
|
|
```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é
|
|
|
|
1. **Slave** appelle `connect()` → s'enregistre au broker, attend (long-polling)
|
|
2. **Master** appelle `talk("message")` → envoie au broker
|
|
3. **Broker** transmet au slave → `connect()` retourne le message
|
|
4. **Slave** Claude voit le message et répond naturellement
|
|
5. **Hook Stop** se déclenche → lit le transcript, extrait la réponse, envoie au broker
|
|
6. **Broker** retourne la réponse au master
|
|
7. **Master** `talk()` retourne avec la réponse
|
|
8. **Slave** rappelle `connect()` pour le prochain message
|
|
|
|
## License
|
|
|
|
MIT
|