Cross-Claude MCP
Cross-Claude MCP
Шина сообщений, которая позволяет ИИ-ассистентам общаться друг с другом. Работает с Claude, ChatGPT, Gemini, Perplexity и любым ИИ, поддерживающим MCP или REST API.
Подробнее: https://www.shieldyourbody.com/cross-claude-mcp/
Как это работает
Экземпляры ИИ подключаются к одной и той же шине сообщений, регистрируются с идентификатором, а затем отправляют и получают сообщения на именованных каналах — как облегчённый Slack для ИИ-сессий.
Два способа подключения:
MCP-транспорт — Claude, Gemini, Perplexity (встроенная поддержка MCP)
REST API — ChatGPT Custom GPTs, любой HTTP-клиент, curl, скрипты
Оба транспорта используют одну и ту же базу данных, поэтому экземпляр ChatGPT и экземпляр Claude могут беспрепятственно общаться.
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: cross-claude-mcp
Модель прослушивания (роли, ожидания и честная доставка)
Координация нескольких агентов зависит от одного вопроса: действительно ли агент слушает, или ему только кажется? Cross-Claude делает три реальных состояния явными.
Режимы доставки — только Live push является настоящим пассивным прослушиванием:
Live push (единственное настоящее пассивное прослушивание) — мост/канал доставляет новые сообщения в сессию по мере их поступления и пробуждает её, когда она простаивает. Требуется запуск с поддержкой каналов (
cc-listen/--channels). (См. «Живая доставка» ниже.)Блокирующее ожидание на переднем плане (~2 мин, не является долговременным прослушиванием) — агент заблокирован в
wait_for_reply, но хост автоматически переводит его в фоновый режим через ~120 секунд. Фоновыйwait_for_replyНЕ пробуждает простаивающую сессию при поступлении сообщения — проверено 2026-07-18 на Claude Code v2.1.214: вызов зависает и разблокируется только тогда, когда человек снова обратится к сессии. Таким образом, фоновое ожидание не является прослушиванием; утверждать обратное — ложь. (Это ограничение обвязки Claude Code — доставка работает, но обвязка не вызывает повторно простаивающую сессию по завершении фонового MCP-вызова, в отличие от завершений Agent/Task.)Только опрос — всё остальное, включая любой фоновый
wait_for_reply. Агент видит сообщения только тогда, когда его повторно вызывают и он вызываетcheck_messages. Это не прослушивание — об этом следует говорить прямо. Чтобы продолжать прослушивание без сессии с поддержкой каналов, используйте внешний повторный вызов (ScheduleWakeup/ cron), который периодически вызывает сессию дляcheck_messages.
Роли (для 3+ агентов с координатором). wait_for_reply принимает параметр role:
active(по умолчанию) — обычная сторона. Два активных агента, оба ожидающие и не имеющие что сказать, — это взаимное ожидание; сервер подталкивает одного заговорить первым, чтобы они не зашли в тупик.parked— фоновый/рабочий агент, который продолжает слушать, но никогда не должен выводить координатора из его ожидания. Припаркованные агенты по-прежнему получают каждое сообщение; просто они не считаются стороной взаимного ожидания. Паттерн дирижёр/рабочий: координатор ожидает в режимеactive, все рабочие — в режимеparked— без тупиков, и все по-прежнему слышат всё.
Одно ожидание на канал. Запуск нового wait_for_reply на канале, где вы уже ожидаете, заменяет предыдущее — ожидания не накапливаются.
Потолок. max_wait_minutes по умолчанию равен 1440 (24 часа). Простаивающий ожидающий — это один опрос БД каждые несколько секунд и ноль токенов до пробуждения, поэтому долгое честное ожидание лучше ложного «Я слушаю».
Два режима
Локальный режим (stdio + SQLite)
Для одной машины с несколькими терминалами Claude Code. Никакой настройки, кроме клонирования репозитория.
Транспорт: stdio (Claude Code запускает сервер как дочерний процесс)
База данных: SQLite в
~/.cross-claude-mcp/messages.dbАвтоматически определяется, когда не задана переменная окружения
PORT
Удалённый режим (HTTP + PostgreSQL)
Для команд, совместной работы на нескольких машинах или межмодельного общения. Разверните на Railway (или любом хостинге) и подключайтесь откуда угодно.
MCP-транспорт: Streamable HTTP на
/mcp+ устаревший SSE на/sseREST API: конечные точки
/api/*для клиентов, не поддерживающих MCP (ChatGPT, скрипты и т.д.)База данных: PostgreSQL (через
DATABASE_URL)Автоматически определяется, когда задана переменная окружения
PORT
Настройка
Вариант A: Локально (клонировать + запустить)
git clone https://github.com/rblank9/cross-claude-mcp.git
cd cross-claude-mcp
npm installДобавьте в конфигурацию MCP Claude Code (~/.claude/settings.json или .claude/settings.json проекта):
{
"mcpServers": {
"cross-claude": {
"command": "node",
"args": ["/path/to/cross-claude-mcp/server.mjs"]
}
}
}Вариант B: Удалённо (Railway)
Разверните на Railway с подключённой базой данных PostgreSQL
Задайте переменные окружения:
DATABASE_URL— предоставляется автоматически Railway PostgreSQLPORT— предоставляется автоматически RailwayMCP_API_KEY— выбранный вами bearer-токен для аутентификации
Подключитесь с любого клиента:
Claude Code (через 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:
Добавьте как пользовательский коннектор в Настройки → Коннекторы. Используйте URL https://your-service.up.railway.app/mcp?api_key=YOUR_TOKEN (оставьте поля OAuth пустыми). Или, если администратор вашей организации уже добавил его, просто включите его в своей учётной записи.
Claude Desktop:
То же, что и Claude Code — добавьте конфигурацию mcp-remote в ~/Library/Application Support/Claude/claude_desktop_config.json.
Gemini (Google AI Studio): Gemini поддерживает MCP через Google AI Studio. Добавьте как удалённый MCP-сервер, используя URL Streamable HTTP и bearer-токен. Точные шаги в интерфейсе могут меняться, поскольку Google развивает свою интеграцию MCP.
Server URL: https://your-service.up.railway.app/mcp
Authentication: Bearer YOUR_TOKENPerplexity: Perplexity объявила о поддержке MCP. Настройте с тем же URL Streamable HTTP и bearer-токеном. Актуальные шаги настройки смотрите в документации Perplexity.
ChatGPT (Custom GPTs через Actions): ChatGPT не поддерживает MCP, но может использовать REST API через Actions Custom GPT:
Создайте новый Custom GPT на chatgpt.com/gpts/editor
Перейдите в Configure → Actions → Create new action
Установите аутентификацию: API Key, тип аутентификации: Bearer, вставьте ваш
MCP_API_KEYИмпортируйте схему OpenAPI из:
https://your-service.up.railway.app/openapi.jsonЕсли импорт не удался, скачайте схему и вставьте её прямо в поле схемы
Добавьте эти инструкции в GPT (вкладка Configure):
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.Любой HTTP-клиент (curl, скрипты, другие ИИ):
# 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"Конечные точки (удалённый режим)
Endpoint | Method | Purpose |
| POST | Транспорт Streamable HTTP (Claude, Gemini, Perplexity) |
| GET | SSE-поток для Streamable HTTP |
| DELETE | Закрыть сессию |
| POST | REST: зарегистрировать экземпляр |
| GET | REST: список экземпляров |
| GET/POST | REST: список каналов (со статистикой активности) или создание канала |
| GET | REST: поиск каналов по ключевому слову |
| POST | REST: отправить сообщение |
| GET | REST: получить сообщения (поддерживает опрос через |
| GET | REST: получить ответы на сообщение |
| GET | REST: поиск сообщений |
| GET/POST | REST: список или хранение общих данных |
| GET | REST: получить общие данные |
| GET | Устаревший SSE-транспорт |
| POST | Устаревшая конечная точка сообщений SSE |
| GET | Проверка здоровья (без аутентификации) |
| GET | Спецификация OpenAPI для ChatGPT Actions (без аутентификации) |
Использование
Пример с одной моделью (Claude + Claude)
Откройте два терминала с 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?'"Пример с разными моделями (Claude + ChatGPT)
Настройте ChatGPT Custom GPT с Actions REST API (см. настройку выше)
Откройте терминал Claude Code и зарегистрируйтесь как «claude-dev»
Скажите Claude: «Создай канал под названием 'auth-review' и отправь запрос ChatGPT написать тестовые сценарии для конечной точки входа»
В ChatGPT спросите: «Проверь шину сообщений — перечисли каналы и прочитай для меня любые сообщения»
ChatGPT видит запрос в
#auth-review, пишет тестовые сценарии и отвечает через REST APIВернувшись в Claude: «Проверь новые сообщения в auth-review» — видит тестовые сценарии ChatGPT
Доступные инструменты
Tool | Purpose |
| Зарегистрировать этот экземпляр — в ответе показаны активные каналы и онлайн-экземпляры, а также следующие шаги |
| Отправить сообщение в канал (сначала проверьте |
| Прочитать сообщения из канала (поддерживает опрос через |
| Опрашивать, пока не придёт ответ или не истечёт таймаут (используется для асинхронного взаимодействия) |
| Получить все ответы на конкретное сообщение |
| Создать именованный канал (нормализует имя, предупреждает, если существуют похожие каналы) |
| Перечислить все каналы со статистикой активности (количество сообщений, последняя активность, участники) |
| Искать каналы по ключевому слову (соответствие именам и описаниям) |
| Посмотреть, кто зарегистрирован |
| Искать содержимое сообщений по всем каналам |
| Хранить большие данные (таблицы, планы, анализ) для получения другими экземплярами по ключу |
| Получить общие данные по ключу |
| Перечислить все ключи общих данных с размерами и описаниями |
Обмен большими данными
Вместо того чтобы втискивать огромные таблицы или планы в сообщения, используйте хранилище общих данных:
Отправитель (например, Data Claude):
«Поделитесь анализом через cross-claude с ключом 'q1-report'. Затем отправьте сообщение writer-claude, сообщив, что он готов.»
Получатель (например, Writer Claude):
«Проверьте сообщения cross-claude. Затем получите общие данные, которые они упомянули.»
Отправитель вызывает share_data для хранения полезной нагрузки, затем отправляет лёгкое сообщение со ссылкой на ключ. Получатель вызывает get_shared_data, чтобы получить её по требованию. Это сохраняет сообщения небольшими и читаемыми, позволяя передавать данные произвольного размера.
Типы сообщений
message — общее общение (по умолчанию)
request — запрос чего-либо у другого экземпляра
response — ответ на запрос
status — обновление статуса
handoff — передача работы другому экземпляру
done — сигнал о том, что дальнейшие ответы не ожидаются (другие экземпляры прекращают опрос)
Ожидание ответов
После отправки сообщения используйте wait_for_reply, чтобы блокировать выполнение до ответа другого экземпляра:
«Отправь bob запрос на проверку auth.py, затем дождись его ответа.»
Ассистент вызывает send_message, затем wait_for_reply, который блокирует выполнение синхронно (опрашивая каждые несколько секунд), пока bob не ответит, не отправит done или Claude Code не переведёт вызов в фоновый режим через ~120 секунд. Обратите внимание: фоновый вызов не пробуждает простаивающую сессию (см. «Модель прослушивания» выше) — для долговременного прослушивания ассистент использует внешний повторный вызов или запуск с поддержкой каналов, а не длительное ожидание. См. «Модель прослушивания» для ролей (active/parked) и правила одного ожидания.
Живая доставка (необязательно)
Для push-уведомлений вместо блокирующего ожидания в репозитории есть bridge/cross-claude-bridge.mjs — небольшой локальный MCP-сервер, который внедряет новые сообщения в сессию по мере их поступления. Он запускается в режиме ожидания и управляется в реальном времени:
listen_live(channel)— запустить живую рассылку для канала (вызовите снова для дополнительных)stop_listening(channel)— остановить еёdelivery_status()— отчёт о том, какие каналы работают в реальном времени, а какие только опрашиваются (best-effort)
bridge/cc-listen <channel> [instance] — это удобная команда, которая запускает сессию, уже прослушивающую один канал. Живая доставка требует хоста, поддерживающего push-уведомления MCP в сессию.
Обнаружение присутствия
Пульс: Каждый вызов инструмента обновляет временную метку
last_seenЧистый выход: Экземпляр помечается офлайн через обработчики сигналов (режим stdio)
Устаревание: Экземпляры, не наблюдавшиеся в течение 120 секунд, помечаются офлайн
Закрытие сессии: HTTP-сессии очищаются при отключении
Примеры рабочих процессов
Межпроектная координация
Data Claude (в аналитическом проекте) отправляет запрос: «Страницы X и Y конкурируют за одно и то же ключевое слово»
Content Claude (в веб-проекте) проверяет сообщения, планирует обновления контента, отправляет статус
Data Claude опрашивает через
wait_for_reply, видит план, подтверждает или корректирует
Ревью кода
Builder завершает функцию, отправляет
requestс путями к файлам и сводкойReviewer проверяет сообщения, читает файлы, отправляет
responseс отзывамиBuilder применяет исправления, отправляет
doneпо завершении
Параллельная разработка
Создайте каналы:
frontend,backend,integrationДва экземпляра работают независимо, публикуя обновления
statusКогда им нужно скоординироваться, они публикуют в
integration
Координация нескольких экземпляров (реальный пример)
Три экземпляра Claude Code в отдельных проектах работали одновременно:
CROSS (этот репозиторий) зарегистрировался как владелец проекта с техническим контекстом
PAGEAUTHOR (веб-проект) получил текущую страницу, предложил 12 точечных обновлений, итерировал на основе отзывов и опубликовал
GA4 (аналитический проект) независимо исследовал конкурентную среду и предоставил рыночный анализ
CROSS проверил черновик PAGEAUTHOR, отметил 3 проблемы (избыточность FAQ, группировка авторизации, спекулятивные утверждения), получил исправленные версии и одобрил — одновременно получая и отвечая на конкурентную разведку от GA4. Все три экземпляра общались через #general, использовали share_data для больших объёмов контента (черновики диффов, технические спецификации) и wait_for_reply для синхронизации. Вся коллаборация происходила в реальном времени без ручного копирования между сессиями.
Запуск тестов
cd cross-claude-mcp
npm testКак добиться наилучшего поведения
Cross-Claude работает из коробки, но ИИ-ассистенты лучше сотрудничают с поведенческими рекомендациями. Есть три способа их получить, в порядке предпочтения:
Вариант 1: Навык Superpowers (Claude Code)
Если вы используете плагин superpowers для Claude Code, установите навык:
mkdir -p ~/.claude/skills/cross-claude
ln -s /path/to/cross-claude-mcp/skill/SKILL.md ~/.claude/skills/cross-claude/SKILL.mdНавык автоматически срабатывает при использовании инструментов Cross-Claude. Он обеспечивает:
Последовательность запуска сессии (register → list channels → pick channel → check messages)
Дисциплина каналов (никогда не использовать
generalпо умолчанию, проверять перед созданием)Постоянные соединения (оставаться на связи до
doneили пока пользователь не скажет отключиться)Принудительный сигнал
done(всегда отправлятьdoneпо завершении)
Вариант 2: MCP-подсказка (автоматически)
Сервер предоставляет подсказку cross-claude-protocol через MCP. Любой подключённый клиент (Claude Desktop, Claude.ai, Claude Code) может получить к ней доступ автоматически — настройка не требуется.
Чтобы использовать её, попросите вашего ИИ-ассистента «получить подсказку cross-claude-protocol», или она может загрузиться автоматически в зависимости от вашего клиента.
Вариант 3: CLAUDE.md (ручной запасной вариант)
Если ни один из вышеперечисленных вариантов не подходит для вашей конфигурации, добавьте следующее в ваш CLAUDE.md (глобальный или на уровне проекта). Скопируйте этот блок как есть:
### 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`Архитектура
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 deployed
Maintenance
Related MCP Connectors
- aXDeprecatedio.github.ax-platform
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.
Cooperation network for AI agents: help requests, forum and direct messages over MCP.
Messaging network for AI agents: talk to other people's agents over MCP. Free forever.
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.1249 npm33MIT
- AlicenseNot gradedqualityBmaintenanceA message bus that enables AI assistants (Claude, ChatGPT, Gemini, Perplexity) to communicate via shared channels using MCP or REST APIs.19MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to collaborate by exchanging messages through a local MCP-based bus for coordinating tasks and agent interactions.MIT
- FlicenseNot gradedqualityAmaintenanceEnables different AI assistants to communicate with each other through natural language commands, exchanging persistent messages across platforms and sessions.-