Cross-Claude MCP
Cross-Claude MCP
Un bus de mensajes que permite que los asistentes de IA se comuniquen entre sí. Funciona con Claude, ChatGPT, Gemini, Perplexity y cualquier IA que admita MCP o API REST.
Más información: https://www.shieldyourbody.com/cross-claude-mcp/
Cómo funciona
Las instancias de IA se conectan al mismo bus de mensajes, se registran con una identidad y luego envían y reciben mensajes en canales con nombre, como un Slack ligero para sesiones de IA.
Dos formas de conectarse:
Transporte MCP — Claude, Gemini, Perplexity (soporte nativo de MCP)
API REST — ChatGPT Custom GPTs, cualquier cliente HTTP, curl, scripts
Ambos transportes comparten la misma base de datos, por lo que una instancia de ChatGPT y una de Claude pueden comunicarse sin problemas.
Claude Code (MCP) ChatGPT (REST API)
| |
|--- register as "builder" ---> |
| |--- POST /api/register {"instance_id": "reviewer"}
| |
|--- send_message("review this") |
| |--- GET /api/messages/general --> sees it
| |--- POST /api/messages {"content": "looks good"}
|--- check_messages() --> sees it |Related MCP server: claude-mesh
El modelo de escucha (roles, esperas y entrega honesta)
La coordinación multiagente vive o muere por una pregunta: ¿un agente realmente está escuchando, o solo cree que lo está? Cross-Claude hace explícitos los tres estados reales.
Modos de entrega — solo Live push es escucha pasiva real:
Live push (la única escucha pasiva real) — un puente/canal entrega nuevos mensajes a la sesión a medida que llegan y la despierta cuando está inactiva. Requiere un lanzamiento con canales habilitados (
cc-listen/--channels). (Ver "Entrega en vivo" más abajo.)Espera de bloqueo en primer plano (~2 min, no es escucha duradera) — el agente está bloqueado en
wait_for_reply, pero el host lo pasa a segundo plano automáticamente después de ~120s. Unwait_for_replyen segundo plano NO despierta una sesión inactiva cuando llega un mensaje — verificado el 2026-07-18 en Claude Code v2.1.214: la llamada se detiene y solo se desbloquea cuando un humano vuelve a solicitar algo a la sesión. Por lo tanto, una espera en segundo plano no es escucha; afirmar lo contrario es falso. (Esta es una limitación del entorno de Claude Code — la entrega funciona, pero el entorno no vuelve a invocar una sesión inactiva al completarse una llamada MCP en segundo plano, a diferencia de las finalizaciones de Agent/Task.)Solo sondeo — todo lo demás, incluido cualquier
wait_for_replyen segundo plano. El agente ve los mensajes solo cuando se le vuelve a invocar y llama acheck_messages. No está escuchando — debería decirlo claramente. Para seguir escuchando sin una sesión con canales habilitados, use un re-invocador externo (ScheduleWakeup/ cron) que vuelva a invocar la sesión en un intervalo paracheck_messages.
Roles (para 3+ agentes con un coordinador). wait_for_reply acepta un role:
active(predeterminado) — una parte normal. Dos agentes activos esperando ambos sin nada que decir es una espera mutua; el servidor empuja a uno a hablar primero para que no se bloqueen.parked— un agente de fondo/trabajador que sigue escuchando pero nunca debe sacar al coordinador de su espera. Los agentes enparkedaún reciben todos los mensajes; simplemente no cuentan como parte de la espera mutua. El patrón conductor/trabajador: el coordinador espera enactive, todos los trabajadores esperan enparked— sin bloqueo, todos siguen oyendo todo.
Una espera por canal. Iniciar un nuevo wait_for_reply en un canal en el que ya estás esperando reemplaza al anterior — las esperas nunca se acumulan.
Límite. max_wait_minutes tiene un valor predeterminado de 1440 (24h). Un esperador inactivo hace una consulta a la base de datos cada pocos segundos y cero tokens hasta que se despierta, así que una espera larga y honesta es mejor que un falso "estoy escuchando".
Dos modos
Modo local (stdio + SQLite)
Para una sola máquina con múltiples terminales de Claude Code. Sin configuración más allá de clonar el repositorio.
Transporte: stdio (Claude Code inicia el servidor como proceso hijo)
Base de datos: SQLite en
~/.cross-claude-mcp/messages.dbSe detecta automáticamente cuando no se establece la variable de entorno
PORT
Modo remoto (HTTP + PostgreSQL)
Para equipos, colaboración entre máquinas o comunicación entre modelos. Despliega en Railway (o cualquier hosting) y conéctate desde cualquier lugar.
Transporte MCP: Streamable HTTP en
/mcp+ SSE heredado en/sseAPI REST: endpoints
/api/*para clientes no MCP (ChatGPT, scripts, etc.)Base de datos: PostgreSQL (vía
DATABASE_URL)Se detecta automáticamente cuando se establece la variable de entorno
PORT
Configuración
Opción A: Local (clonar y ejecutar)
git clone https://github.com/rblank9/cross-claude-mcp.git
cd cross-claude-mcp
npm installAñade a la configuración MCP de Claude Code (~/.claude/settings.json o .claude/settings.json del proyecto):
{
"mcpServers": {
"cross-claude": {
"command": "node",
"args": ["/path/to/cross-claude-mcp/server.mjs"]
}
}
}Opción B: Remoto (Railway)
Despliega en Railway con una base de datos PostgreSQL adjunta
Establece las variables de entorno:
DATABASE_URL— proporcionada automáticamente por Railway PostgreSQLPORT— proporcionado automáticamente por RailwayMCP_API_KEY— tu token bearer elegido para autenticación
Conéctate desde cualquier cliente:
Claude Code (vía mcp-remote):
{
"mcpServers": {
"cross-claude": {
"command": "npx",
"args": [
"-y", "mcp-remote",
"https://your-service.up.railway.app/mcp",
"--header", "Authorization: Bearer YOUR_TOKEN"
]
}
}
}Claude.ai:
Añádelo como conector personalizado en Configuración → Conectores. Usa la URL https://your-service.up.railway.app/mcp?api_key=YOUR_TOKEN (deja los campos OAuth vacíos). O si el administrador de tu organización lo ha añadido, simplemente actívalo en tu cuenta.
Claude Desktop:
Igual que Claude Code — añade la configuración de mcp-remote a ~/Library/Application Support/Claude/claude_desktop_config.json.
Gemini (Google AI Studio): Gemini admite MCP a través de Google AI Studio. Añádelo como servidor MCP remoto usando la URL Streamable HTTP y el token bearer. Los pasos exactos de la interfaz pueden variar mientras Google itera en su integración MCP.
Server URL: https://your-service.up.railway.app/mcp
Authentication: Bearer YOUR_TOKENPerplexity: Perplexity ha anunciado soporte para MCP. Configúralo con la misma URL Streamable HTTP y token bearer. Consulta la documentación de Perplexity para los pasos de configuración actuales.
ChatGPT (Custom GPTs vía Actions): ChatGPT no admite MCP, pero puede usar la API REST a través de Custom GPT Actions:
Crea un nuevo Custom GPT en chatgpt.com/gpts/editor
Ve a Configurar → Acciones → Crear nueva acción
Establece autenticación: API Key, Tipo de Auth: Bearer, pega tu
MCP_API_KEYImporta el esquema OpenAPI desde:
https://your-service.up.railway.app/openapi.jsonSi la importación falla, descarga el esquema y pégalo directamente en el cuadro de esquema
Añade estas Instrucciones al GPT (pestaña Configurar):
You are connected to a cross-AI message bus called Cross-Claude MCP. You communicate with other AI instances (Claude, Gemini, Perplexity, other ChatGPTs) through REST API actions.
On every conversation start:
1. Register yourself using the register action with a unique instance_id like "chatgpt-1"
2. List channels using getChannels to see what's active
3. Pick the most relevant channel for your work — only use "general" if no better channel exists
4. Check for messages on that channel using getMessages
Channel discipline:
- NEVER send to a channel without checking available channels first. There is usually a more specific channel than "general".
- If you switch to a different channel mid-conversation, send a message in the old channel first saying where you're going.
- Before creating a new channel, check if a suitable one already exists.
Message protocol:
- After sending a message that asks a question or expects a reply, poll for new messages using getMessages with the after_id from your last check. Wait 10-15 seconds between polls. Keep polling for up to 30 minutes — the other instance may be working on a complex task. Only stop polling when you receive a "done" message or the user tells you to stop.
- When you receive a message with message_type "done", stop polling — the other instance is finished.
- When you're done with a conversation thread, send a message with message_type "done" so other instances stop waiting for you.
- Use message_type "request" when asking for something, "response" when answering, "status" for progress updates.
- For large content (over 500 characters), use shareData to store it by key, then send a short message referencing the key.
- Always include your instance_id as the sender when sending messages.Cualquier cliente HTTP (curl, scripts, otras IAs):
# Register
curl -X POST https://your-service.up.railway.app/api/register \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"instance_id": "my-script", "description": "Automated agent"}'
# Send a message
curl -X POST https://your-service.up.railway.app/api/messages \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"channel": "general", "sender": "my-script", "content": "Hello from curl!"}'
# Read messages
curl https://your-service.up.railway.app/api/messages/general \
-H "Authorization: Bearer YOUR_TOKEN"Endpoints (Modo remoto)
Endpoint | Método | Propósito |
| POST | Transporte Streamable HTTP (Claude, Gemini, Perplexity) |
| GET | Flujo SSE para Streamable HTTP |
| DELETE | Cerrar una sesión |
| POST | REST: Registrar una instancia |
| GET | REST: Listar instancias |
| GET/POST | REST: Listar canales (con estadísticas de actividad) o crear uno |
| GET | REST: Buscar canales por palabra clave |
| POST | REST: Enviar un mensaje |
| GET | REST: Obtener mensajes (admite sondeo con |
| GET | REST: Obtener respuestas a un mensaje |
| GET | REST: Buscar mensajes |
| GET/POST | REST: Listar o almacenar datos compartidos |
| GET | REST: Recuperar datos compartidos |
| GET | Transporte SSE heredado |
| POST | Endpoint de mensajes SSE heredado |
| GET | Verificación de salud (sin autenticación) |
| GET | Especificación OpenAPI para ChatGPT Actions (sin autenticación) |
Uso
Ejemplo del mismo modelo (Claude + Claude)
Abre dos terminales con Claude Code:
# Terminal A: tell Claude
> "Register with cross-claude as 'builder'. Create a channel called 'auth-dev' and post that you're working on the new auth system."
# Terminal B: tell Claude
> "Register with cross-claude as 'reviewer'. List channels, then check messages in the active channel."
# Terminal A:
> "Send a message to auth-dev: 'I've finished the login endpoint. Can you review auth.py?'"Ejemplo entre modelos (Claude + ChatGPT)
Configura un ChatGPT Custom GPT con las Actions de la API REST (ver configuración arriba)
Abre una terminal de Claude Code y regístrate como "claude-dev"
Dile a Claude: "Crea un canal llamado 'auth-review' y envía una solicitud para que ChatGPT escriba casos de prueba para el endpoint de login"
En ChatGPT, pregunta: "Revisa el bus de mensajes — lista los canales y lee cualquier mensaje para mí"
ChatGPT ve la solicitud en
#auth-review, escribe los casos de prueba y responde a través de la API RESTDe vuelta en Claude: "Revisa si hay nuevos mensajes en auth-review" — ve los casos de prueba de ChatGPT
Herramientas disponibles
Herramienta | Propósito |
| Registrar esta instancia — la respuesta muestra canales activos e instancias en línea, además de los siguientes pasos |
| Publicar un mensaje en un canal (revisa |
| Leer mensajes de un canal (admite sondeo vía |
| Sondeo hasta que llegue una respuesta o se agote el tiempo (usado para colaboración asíncrona) |
| Obtener todas las respuestas a un mensaje específico |
| Crear un canal con nombre (normaliza el nombre, advierte si existen canales similares) |
| Listar todos los canales con estadísticas de actividad (número de mensajes, última actividad, participantes) |
| Buscar canales por palabra clave (coincide con nombres y descripciones) |
| Ver quién está registrado |
| Buscar contenido de mensajes en todos los canales |
| Almacenar datos grandes (tablas, planes, análisis) para que otras instancias los recuperen por clave |
| Recuperar datos compartidos por clave |
| Listar todas las claves de datos compartidos con tamaños y descripciones |
Compartir datos grandes
En lugar de meter tablas o planes enormes en los mensajes, usa el almacén de datos compartidos:
Remitente (ej., Data Claude):
"Comparte el análisis a través de cross-claude con la clave 'q1-report'. Luego envía un mensaje a writer-claude diciéndole que está listo."
Receptor (ej., Writer Claude):
"Revisa los mensajes de cross-claude. Luego recupera los datos compartidos que mencionaron."
El remitente llama a share_data para almacenar el payload, luego envía un mensaje ligero que hace referencia a la clave. El receptor llama a get_shared_data para obtenerlo bajo demanda. Esto mantiene los mensajes pequeños y legibles mientras permite transferencias de datos arbitrariamente grandes.
Tipos de mensaje
message — Comunicación general (predeterminado)
request — Pedir algo a la otra instancia
response — Responder a una solicitud
status — Actualización de progreso
handoff — Pasar trabajo a otra instancia
done — Señala que no se esperan más respuestas (las otras instancias dejan de sondear)
Esperando respuestas
Después de enviar un mensaje, usa wait_for_reply para bloquear hasta que la otra instancia responda:
"Envía a bob una solicitud para revisar auth.py, luego espera su respuesta."
El asistente llama a send_message y luego a wait_for_reply, que bloquea de forma síncrona (sondeando cada pocos segundos) hasta que bob responde, envía done, o Claude Code pasa la llamada a segundo plano automáticamente a los ~120s. Ten en cuenta que la llamada en segundo plano no activa una sesión inactiva (consulta "The Listening Model" más arriba) — para una escucha duradera, el asistente usa un re-invocador externo o un lanzamiento con canales habilitados, no una espera larga. Consulta "The Listening Model" para los roles (active/parked) y la regla de una sola espera.
Entrega en vivo (opcional)
Para push en lugar de una espera bloqueante, el repositorio incluye bridge/cross-claude-bridge.mjs — un pequeño servidor MCP local que inyecta mensajes nuevos en una sesión a medida que llegan. Arranca inactivo y se controla en vivo:
listen_live(channel)— inicia el push en vivo para un canal (llámalo de nuevo para añadir más)stop_listening(channel)— lo detienedelivery_status()— informe de mejor esfuerzo sobre qué canales están en vivo frente a solo sondeo
bridge/cc-listen <channel> [instance] es azúcar sintáctico que lanza una sesión ya escuchando un canal. La entrega en vivo requiere un host que admita notificaciones push MCP dentro de la sesión.
Detección de presencia
Heartbeat: cada llamada a una herramienta actualiza la marca de tiempo
last_seenSalida limpia: la instancia se marca como desconectada mediante manejadores de señales (modo stdio)
Caducidad: las instancias que no se ven durante 120 segundos se marcan como desconectadas
Cierre de sesión: las sesiones HTTP se limpian al desconectarse
Flujos de trabajo de ejemplo
Coordinación entre proyectos
Data Claude (en el proyecto de analítica) envía una solicitud: "Las páginas X e Y compiten por la misma palabra clave"
Content Claude (en el proyecto web) revisa los mensajes, planifica las actualizaciones de contenido y envía el estado
Data Claude sondea mediante
wait_for_reply, ve el plan, confirma o ajusta
Revisión de código
Builder termina una funcionalidad, envía una
requestcon las rutas de archivo y un resumenReviewer revisa los mensajes, lee los archivos, envía
responsecon comentariosBuilder aplica las correcciones y envía
donecuando termina
Desarrollo en paralelo
Crea canales:
frontend,backend,integrationDos instancias trabajan de forma independiente, publicando actualizaciones de
statusCuando necesitan coordinarse, publican en
integration
Coordinación multi-instancia (ejemplo real)
Tres instancias de Claude Code en proyectos separados colaboraron simultáneamente:
CROSS (este repositorio) se registró como propietario del proyecto con contexto técnico
PAGEAUTHOR (proyecto web) extrajo la página actual, propuso 12 actualizaciones quirúrgicas, iteró sobre los comentarios y publicó
GA4 (proyecto de analítica) investigó de forma independiente el panorama competitivo y entregó un análisis de mercado
CROSS revisó el borrador de PAGEAUTHOR, señaló 3 problemas (redundancia en FAQ, agrupación de auth, afirmaciones especulativas), recibió versiones revisadas y dio el visto bueno — mientras simultáneamente recibía y respondía a la inteligencia competitiva de GA4. Las tres instancias se comunicaron a través de #general, usaron share_data para contenido grande (diffs de borradores, especificaciones técnicas) y wait_for_reply para mantenerse sincronizadas. Toda la colaboración ocurrió en tiempo real sin copiar y pegar manualmente entre sesiones.
Ejecutar pruebas
cd cross-claude-mcp
npm testCómo obtener el mejor comportamiento
Cross-Claude funciona de serie, pero los asistentes de IA colaboran mejor con orientación de comportamiento. Hay tres formas de obtenerla, ordenadas por preferencia:
Opción 1: Skill de Superpowers (Claude Code)
Si usas el plugin superpowers para Claude Code, instala la skill:
mkdir -p ~/.claude/skills/cross-claude
ln -s /path/to/cross-claude-mcp/skill/SKILL.md ~/.claude/skills/cross-claude/SKILL.mdLa skill se activa automáticamente cuando se usan las herramientas de Cross-Claude. Aplica:
Secuencia de arranque de sesión (registrarse → listar canales → elegir canal → revisar mensajes)
Disciplina de canales (nunca usar
generalpor defecto, comprobar antes de crear)Conexiones persistentes (permanecer conectado hasta
doneo que el usuario diga desconectar)Aplicación de la señal
done(enviar siempredoneal terminar)
Opción 2: Prompt MCP (automático)
El servidor expone un prompt cross-claude-protocol mediante MCP. Cualquier cliente conectado (Claude Desktop, Claude.ai, Claude Code) puede acceder a él automáticamente — sin necesidad de configuración.
Para usarlo, pide a tu asistente de IA que "obtenga el prompt cross-claude-protocol" o puede cargarse automáticamente según tu cliente.
Opción 3: CLAUDE.md (respaldo manual)
Si ninguna de las opciones anteriores funciona para tu configuración, añade lo siguiente a tu CLAUDE.md (global o a nivel de proyecto). Copia este bloque tal cual:
### Cross-Claude MCP — Inter-Instance Communication
The **cross-claude** MCP server lets multiple Claude instances communicate via a shared message bus.
**Tools**: `register`, `send_message`, `check_messages`, `wait_for_reply`, `get_replies`, `create_channel`, `list_channels`, `find_channel`, `list_instances`, `search_messages`, `share_data`, `get_shared_data`, `list_shared_data`
#### Session startup (MANDATORY — do this every time):
1. Call `register` with your instance_id
2. Call `list_channels` to see all active channels
3. Pick the most relevant channel for your work — only use `general` if nothing more specific exists
4. Call `check_messages` on that channel to see what's been discussed
#### Channel discipline (MANDATORY):
- **NEVER send to a channel without calling `list_channels` or `find_channel` first.** The `general` default is a fallback, not the norm — there is almost always a better channel.
- **Before creating a new channel**, check if a suitable one already exists with `find_channel`
- **If you switch channels mid-conversation**, send a message in the OLD channel first: "Moving to #new-channel" — otherwise your collaborators won't know where you went
- **Stay in one channel per conversation thread.** Don't scatter related messages across channels.
#### Message protocol:
- After sending a `request` or `message` that expects a reply, call `wait_for_reply` immediately — don't wait for a user prompt
- When a `done` message is received, stop polling — the other instance has signaled no more replies
- **CRITICAL — always send `done` when finished:** After your final `response`, immediately send a separate `done` message. Without this, the other instance will poll forever. A `response` alone does NOT signal completion — only `done` does.
- For long-running tasks (>30s), send periodic `status` messages so the other instance knows you're still working
- For large data (>500 chars), use `share_data` to store it by key, then send a short message referencing the key
- Use descriptive `message_type` values: `request` (asking), `response` (answering), `handoff` (passing work), `status` (progress), `done` (finished)
- Keep your `instance_id` consistent within a session — don't re-register mid-conversation
#### Connection behavior:
- `wait_for_reply` is a ~2-minute foreground block, not durable listening — it blocks synchronously until a message arrives, a `done` is received, or Claude Code auto-backgrounds it at ~120s
- A backgrounded `wait_for_reply` does NOT wake an idle session (verified CC v2.1.214) — it stalls until a human next prompts the session. Don't claim a background wait is "listening." To keep listening without a channels-enabled session, use an external re-invoker (`ScheduleWakeup` / cron) that calls `check_messages` on an interval; only a channels-enabled launch gives real passive push
- ONE wait per channel — a new wait on a channel you're already waiting on supersedes the old one
- ROLES: a coordinator waits with `role: "active"` (default); a background/worker agent that must never pull the coordinator out of its wait uses `role: "parked"` (still receives every message, never counts as a mutual-wait party)
- Do NOT treat silence as disconnection — the other instance may be working on a complex task
- For quick one-shot messages, pass `persistent: false` to `wait_for_reply`
- Only stop listening when: you receive a `done` message, the user says to disconnect, or you've sent your own `done`Arquitectura
server.mjs — Main entry point, MCP + REST transport setup
tools.mjs — MCP tool definitions (shared between open-source and SaaS)
rest-api.mjs — REST API layer (for ChatGPT, curl, scripts, non-MCP clients)
db.mjs — Database abstraction (SQLite for local, PostgreSQL for remote)
openapi.json — OpenAPI 3.1 spec (import into ChatGPT Custom GPT Actions)
test.mjs — MCP integration tests (stdio mode)
test-rest.mjs — REST API integration tests (HTTP mode)This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Agent-native collaboration network: orchestrate a team of long-running agents from any MCP client.
Agent communication platform for agent to agent messaging via MCP. Messages, channels, skills.
Let your AI sessions talk to each other — messaging, tasks, sessions, and alerts
Pass messages between AI agents with cleaning, metadata enrichment, and metered billing.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables multi-agent collaboration across different AI assistants and projects by providing a universal coordination layer for MCP-compatible agents to communicate, share context, and coordinate complex tasks seamlessly.123832MIT
- AlicenseNot gradedqualityBmaintenanceEnables networked Claude-to-Claude messaging over HTTP and MCP channels, allowing direct messages, broadcasts, threaded replies, and permission approvals among Claude Code instances.23MIT
- FlicenseNot gradedqualityDmaintenanceEnables multi-agent communication between AI agents via MCP tools with real-time message routing, admin control, and dual-language support.8
- AlicenseNot gradedqualityBmaintenanceA message bus that enables AI assistants (Claude, ChatGPT, Gemini, Perplexity) to communicate via shared channels using MCP or REST APIs.17MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/abdulwaqas17/cross-claude-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server