claude-chat-mcp
v0.3.0
Published
E2E-encrypted chat for Claude users: MCP client, relay server and business bots
Readme
Claude Chat
👋 Не программист? Читай ИНСТРУКЦИЮ простыми словами — без жаргона, с аналогиями и таблицей «что сказать Claude». Этот README — технический, для разработчиков.
E2E-зашифрованный мессенджер для пользователей Claude. Пользователь Claude Code подключает MCP-сервер одной командой — и его Claude становится клиентом чата: пишет, читает и суммаризирует переписку. Бизнесы подключают в чат ботов на Claude API, которые отвечают клиентам на основе знаний о бизнесе.
Архитектура
Claude Code (Алиса) ──stdio──> client/mcp.js ──HTTPS──┐
(ключи и шифрование │
только на её машине) ▼
server/index.js ← хранит ТОЛЬКО
(relay-сервер) шифротекст и публичные ключи
▲
Claude Code (Боб) ────stdio──> client/mcp.js ──────────┤
│
Бот бизнеса (bot/run-bot.js + Claude API) ─────────────┘- Шифрование: libsodium
crypto_box(X25519 + XSalsa20-Poly1305). Сообщение шифруется на машине отправителя публичным ключом получателя и расшифровывается только на машине получателя. Сервер физически не может прочитать переписку (это проверяется тестом). - Аутентификация: каждый запрос подписан Ed25519-ключом клиента; сервер проверяет подпись и отбрасывает запросы старше 5 минут. Занять чужой username нельзя.
- Ключи: генерируются локально при регистрации, лежат в
~/.claude-chat/identity.json(права 0600) и никогда не отправляются на сервер.
Быстрый старт (пользователь)
Одна команда — и всё:
claude mcp add claude-chat -- npx -y claude-chat-mcp
# пока пакет не опубликован в npm: claude mcp add claude-chat -- node /путь/до/chat/client/mcp.jsРегистрация не нужна: при первом же действии («напиши boba…») клиент сам сгенерирует
ключи и зарегистрирует тебя под именем из системы (его можно поменять, попросив Claude
«зарегистрируй меня как …» до первого действия). Адрес продакшен-сервера зашит по
умолчанию; свой сервер — через --env CLAUDE_CHAT_SERVER=….
Дальше просто разговаривай с Claude: «напиши боту coffeebot, что я хочу капучино», «проверь входящие», «создай проект и пригласи исполнителя».
Приглашения
Владелец проекта: «сделай инвайт для исполнителя» → Claude отдаёт готовое
сообщение-приглашение с кодом и тремя шагами подключения — его целиком пересылают
человеку в любой мессенджер. Тот говорит своему Claude «вступи в проект по коду …» и
оказывается в проекте (регистрация автоматическая). Инвайт одноразовый и живёт 7 дней
(настраивается), роль зашита в приглашение. Знание кода = право войти, поэтому коды не
публикуем. Ссылка /join/<токен> со страницей-инструкцией тоже работает как запасной
вариант.
Инструменты MCP
| Инструмент | Что делает |
|---|---|
| chat_register | Создаёт ключи локально, регистрирует username |
| chat_whoami | Текущая личность |
| chat_list_users | Все пользователи и боты сервера |
| chat_send | Отправить зашифрованное сообщение |
| chat_check_inbox | Получить и расшифровать входящие |
| chat_history | Локальная история переписки |
| chat_create_project | Создать проект (ты — owner) |
| chat_my_projects | Мои проекты и роли в них |
| chat_project_info | Участники и задачи проекта |
| chat_add_member | Добавить участника по имени (owner) |
| chat_invite | Создать ссылку-приглашение с ролью (owner) |
| chat_join | Вступить в проект по ссылке/токену |
| chat_create_task | Создать задачу, опционально назначить |
| chat_update_task | Двигать статус задачи / переназначать |
Проекты, роли и задачи
Проект — рабочее пространство с ролями:
- owner — создатель: приглашает людей, назначает задачи, принимает или отклоняет работу;
- member — полноправный участник: видит всё, создаёт задачи;
- contractor (исполнитель) — видит только назначенные ему задачи, двигает их по воркфлоу, не может создавать задачи и приглашать людей.
Жизненный цикл задачи: open → in_progress → submitted → accepted / rejected
(после reject исполнитель возвращает задачу в работу). Исполнитель не может принять
собственную работу — принимает только owner.
Сценарий «биржи»: управляющий кофейни создаёт проект, приглашает исполнителя как
contractor, ставит задачу «сделать рилс», исполнитель делает контент своими скилами,
сдаёт (submitted), владелец принимает. Обсуждение работы идёт в E2E-зашифрованных
личных сообщениях.
⚠️ Метаданные задач (названия, статусы) в MVP хранятся на сервере открыто — это координация, а не переписка. Переписка остаётся E2E-зашифрованной. В roadmap — ключи комнат и шифрование задач для участников.
Деплой на сервер
Вариант А: быстрый тест — туннель с твоего Mac
npm run server # терминал 1
brew install cloudflared
cloudflared tunnel --url http://localhost:8787 # терминал 2 → выдаст https://…trycloudflare.comВторой человек подключается к этому URL (см. ниже). Минусы: URL живёт, пока запущен туннель, и Mac не должен уходить в сон.
Вариант Б: нормальный — VPS (Ubuntu)
# на сервере (Node 20+):
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash - && sudo apt install -y nodejs
rsync -av --exclude node_modules ./ user@SERVER:/opt/claude-chat/ # с твоего Mac
cd /opt/claude-chat && npm install --omit=dev
sudo npm i -g pm2 && pm2 start server/index.js --name claude-chat && pm2 save && pm2 startup
# HTTPS через Caddy (автоматический сертификат, нужен домен, указывающий на сервер):
sudo apt install -y caddy
echo 'chat.example.com { reverse_proxy localhost:8787 }' | sudo tee /etc/caddy/Caddyfile
sudo systemctl reload caddyПодключение клиентов
На машине каждого пользователя (нужен Node и папка client/ + node_modules проекта):
claude mcp add claude-chat \
--env CLAUDE_CHAT_SERVER=https://chat.example.com \
-- node /путь/до/chat/client/mcp.jsДве учётки на одном компьютере (для теста в одиночку)
Личность привязана к папке CLAUDE_CHAT_HOME, поэтому можно поднять два MCP с разными
папками и переключаться между ними в одном Claude Code:
claude mcp add chat-igor --env CLAUDE_CHAT_HOME=$HOME/.claude-chat-igor -- node /путь/до/chat/client/mcp.js
claude mcp add chat-buyer --env CLAUDE_CHAT_HOME=$HOME/.claude-chat-buyer -- node /путь/до/chat/client/mcp.jsДальше: «через chat-igor зарегистрируй меня как igor», «через chat-buyer зарегистрируйся как buyer и напиши igor…» — и переписка/проекты работают между двумя личностями.
Бизнес-бот
ANTHROPIC_API_KEY=sk-ant-... node bot/run-bot.js \
--username coffeebot \
--knowledge bot/knowledge.example.mdБот регистрируется как участник чата, раз в 3 секунды забирает входящие, расшифровывает,
отвечает через Claude API (по умолчанию claude-opus-4-8, можно --model claude-haiku-4-5
для дешёвых ответов) и шлёт ответ обратно в зашифрованном виде. Знания о бизнесе — обычный
markdown-файл.
Тесты
npm testСквозной тест: регистрация, обмен сообщениями в обе стороны, проверка что в базе сервера нет открытого текста, отказ при попытке занять чужой username и при неподписанных запросах.
Ограничения прототипа (честно)
- Нет forward secrecy: один статичный ключ на пользователя. Для продакшена — Signal Protocol (double ratchet) или хотя бы ротация ключей.
- Trust on first use: сервер раздаёт публичные ключи, и злонамеренный сервер мог бы подменить ключ при первом знакомстве (MITM). Лечится сверкой отпечатков ключей вне канала или журналом прозрачности ключей.
- Метаданные видны серверу: кто, кому и когда пишет. Содержимое — нет.
- Хранилище — JSON-файл; для продакшена нужен Postgres/SQLite и доставка по WebSocket вместо поллинга.
- «Пользователи Claude» пока не верифицируются — публичного API «проверить подписку Claude» не существует; канал дистрибуции — MCP.
Дорожная карта
- Групповые чаты (комнаты) — ключ комнаты, зашифрованный для каждого участника.
- WebSocket-доставка вместо поллинга.
- Маркетплейс ботов: бизнес платит за подключение бота и объём сообщений.
- Сверка отпечатков ключей + ротация.
- Remote MCP (SSE/HTTP) — подключение из claude.ai без локальной установки.
