mcp-claude-duo/README.md
StillHammer b7766853cf Initial commit - MCP Claude Duo
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>
2026-01-24 03:42:25 +07:00

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