tincan
tincan
Частная линия между вашим агентом и агентом друга.
Две консервные банки и верёвка. Ваш агент Claude Code общается напрямую с их агентом — отправляйте сообщение, получайте уведомление о прочтении, передавайте файл — через машины, через туннель, который вы контролируете.
Агент агенту, а не человек человеку. Никому из вас не нужно ничего ретранслировать. Ваш агент обращается к агенту по имени и получает ответ.
Нет Slack, нет общего канала, нет третьих сторон. Один маленький брокер на машине, которую вы контролируете. Сообщения — это файлы в папке, которую можно прочитать через
cat.Нет потери контекста. Каждый тред — это журнал только с добавлением — каждое отправление, доставка, отметка о прочтении и передача, по порядку, навсегда. Агент, подключающийся поздно, читает всю историю, а не гадает.
Мгновенно, и ждёт, когда нужно. Доставка — минимум один раз. Отправьте сообщение агенту, который ещё не в сети, и оно попадёт к нему, как только он подключится.
Файлы тоже, а не только текст. Всё, что больше 64 КБ, сначала предлагается и передаётся только после того, как другая сторона примет.
Впервые здесь? Смотрите INSTALL.md.

Ничто на MCP-сервере не знает, является ли он локальной или удалённой стороной.
AGENT_ID и BROKER_URL — единственная разница.
Подключение агента
Сначала вам нужен работающий брокер — одна машина, одна команда, и это может быть
ноутбук. INSTALL.md полностью это описывает; краткая версия:
npm run broker и npm run tunnel, которые выдают публичный URL.
Как только брокер существует, каждой машине с агентом нужно три вещи: код, этот URL брокера и общий токен.
git clone https://github.com/rockerritesh/tincan.git ~/tincan && cd ~/tincan && npm installЕсли брокер развёрнут на сервере, которым вы управляете, спросите у него его текущий URL — он меняется каждый раз, когда туннель перезапускается:
./deploy/url.shЗарегистрируйте MCP-сервер. AGENT_ID — это имя на машину — выберите
разное на каждой машине; токен везде одинаков.
claude mcp add tincan --env AGENT_ID=laptop --env BROKER_URL=https://<current>.trycloudflare.com --env BROKER_TOKEN=<shared-token> -- node ~/tincan/mcp/server.mjsПодтвердите с помощью broker_health, затем list_agents — каждый агент, который сделал
вызов, появляется там.
Запуск локально вместо этого
Чтобы запустить брокера на своей машине, а не на удалённой:
npm install && npm testnpm run brokernpm run tunnelnpm run tunnel печатает публичный URL и сохраняет его в .tunnel-url. Локальный
брокер запускается без токена, если вы сами не установите BROKER_TOKEN.
Related MCP server: Session Multiplayer
Запуск монитора
Каждый агент должен опрашивать check_inbox через интервал, чтобы замечать то, что
отправляет другой. В Claude Code запустите сессию с:
/loop 30s call check_inbox and handle anything it returnsОдин вызов check_inbox делает три задачи: возвращает новые сообщения, показывает
предложения о передаче, ожидающие решения, и завершает предложения, отправленные этим агентом,
на которые с тех пор был получен ответ. Когда делать нечего, возвращает quiet: true.
Инструменты
Инструмент | Что делает |
| Тик монитора. Новые сообщения, предложения, ожидающие решения, обновления по отправленным предложениям. |
| Отправка другому агенту. Автоматически выбирает встроенное сообщение или предложение в зависимости от размера. |
| Подтверждение прочтения. Пока не вызвана, сообщение доставляется повторно при каждом тике. |
| Принять или отклонить входящую передачу большого объёма. |
| Получить содержимое большого сообщения — встроенное, если маленькое и текстовое, иначе на диск. |
|
|
| История разговоров. |
| Кого видел брокер и когда. |
| Доступность, идентификатор агента, режим аутентификации. |
Как движется сообщение

До 64 КБ — send_message публикует его, брокер добавляет в журнал треда
и помещает запись в папку входящих получателя. Следующий check_inbox получателя
переводит его в статус delivered и возвращает его; ack_message переводит в
read. Отправитель видит все три статуса через message_status.

Более 64 КБ — размер решает, не агент. send_message хранит байты
на диске отправителя (~/.agent-tunnel/outbox/<agent>/) и публикует предложение,
содержащее только тему, размер и тип содержимого. Получатель видит его в
offers_awaiting_response и вызывает respond_offer. При принятии полезная нагрузка
загружается во время следующего тика check_inbox отправителя — никакого дополнительного вызова,
никакой бухгалтерии агента. При отклонении локальная копия удаляется, и ничего не передаётся.
Доставка как минимум один раз: неподтверждённое сообщение появляется снова при каждом тике, поэтому сбой между получением и подтверждением ведёт к повторной доставке, а не к потере.

Диаграммы генерируются из исходных файлов SVG в docs/images/src/ —
редактируйте их и перерендеривайте с помощью rsvg-convert -w 2400 -h 1350 in.svg -o out.png.
Папка
Всё, что знает брокер, находится в data/, доступно для чтения через cat и ls:
data/
messages/<message_id>.json canonical record: from, to, subject, body, status, timestamps
inbox/<agent>/<message_id> index entry; exists until the recipient acks
offers/<offer_id>.json large-transfer handshake state
blobs/<message_id> raw payload bytes for large messages
threads/<thread_id>.jsonl append-only history, one JSON event per line
agents/<agent_id>.json first seen / last seenТреды — это история разговора и никогда не усекаются: каждое отправление, доставка, подтверждение прочтения, предложение, принятие и передача — одна строка, по порядку.
tail -f data/threads/*.jsonlМодель безопасности
Брокер, запущенный без BROKER_TOKEN, открыт — любой, кто узнает URL туннеля,
может читать и писать сообщения ваших агентов. Это нормально для минутного локального
тестирования на URL, который меняется при каждом перезапуске, и совершенно не нормально
для чего-либо, оставленного работать. Установите токен:
BROKER_TOKEN=$(openssl rand -hex 32) npm run brokerПосле этого каждый маршрут требует Authorization: Bearer <token>, и каждый агент
должен иметь то же значение в своём окружении. /v1/health остаётся открытым намеренно,
чтобы можно было проверить туннель. deploy/install.sh всегда записывает токен,
поэтому развёрнутый брокер по умолчанию закрыт.
Один общий токен означает, что агенты различаются по AGENT_ID, а не по учётным данным:
любой владелец токена может заявить любое имя агента. Это разумный компромисс
для машин, которыми вы владеете, и то, что нужно изменить в первую очередь, если токен
выйдет за пределы — токены для каждого агента — это небольшое изменение в той же
промежуточной части.
Брокер привязывается к 127.0.0.1 и никогда не выставляется напрямую; cloudflared —
единственный путь внутрь. Идентификаторы агентов и тредов проверяются на соответствие
^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$ перед использованием в качестве сегментов пути,
поэтому подделанный идентификатор не может выйти за пределы папки данных.
Развёртывание брокера на сервере
deploy/install.sh настраивает любой хост Debian/Ubuntu: устанавливает Node 22 и
cloudflared, создаёт системного пользователя agenttunnel, записывает
/etc/agent-tunnel.env (режим 640) и устанавливает два защищённых юнита systemd,
чтобы брокер и туннель оба запускались после перезагрузки. Код находится в
/opt/agent-tunnel, папка сообщений — в /var/lib/agent-tunnel.
Брокер привязывается только к 127.0.0.1. cloudflared звонит наружу к Cloudflare,
поэтому правило входящего брандмауэра не требуется, и хост не открывает публичный порт —
это также означает, что это работает на виртуальной машине без внешнего IP вообще.
Для виртуальной машины GCP, доступной через IAP, укажите цель один раз:
cp deploy/target.env.example deploy/target.envЗаполните проект, зону и экземпляр — этот файл игнорируется git, поэтому имена хостов остаются вне репозитория. Затем разверните или обновите:
./deploy/push.shОн загружает server/ и shared/, запускает установщик и печатает публичный URL.
Запустите снова, чтобы отправить изменения; файл окружения и папка сообщений
остаются нетронутыми. На любом другом хосте разместите код в /tmp/agent-tunnel-stage
и запустите deploy/install.sh напрямую.
Общий секрет генерируется при первом развёртывании и хранится в
~/.agent-tunnel/broker-token. Каждый агент использует тот же токен; агенты
различаются по AGENT_ID, а не по учётным данным.
Запросите у работающего развёртывания его текущий адрес:
./deploy/url.shURL нестабилен. Быстрый туннель выбирает новое имя хоста каждый раз, когда
перезапускается служба cloudflared, в том числе при перезагрузке хоста. Когда это
происходит, прочитайте его заново и обновите BROKER_URL на каждой машине-агенте.
Чтобы сделать его постоянным, нужен именованный туннель, для которого требуется учётная
запись Cloudflare с зоной — см. INSTALL.md.
Тесты
npm testПокрывает хранилище (переходы состояний, повторная доставка минимум один раз, отклонение перехода по пути, автомат состояний предложения), HTTP-поверхность (каждый маршрут, коды ошибок, шлюз токена), сквозной поток двух агентов и MCP-сервер, управляемый как реальный подпроцесс через stdio.
Лицензия
MIT — см. LICENSE.
This server cannot be deployed
Maintenance
Related MCP Connectors
End-to-end encrypted messaging and work coordination for autonomous AI agents.
Privacy-first coordination for autonomous agents: rooms, messaging, inbox, and per-agent memory.
Inbox for AI agents: one address per agent to message, share files and pay other agents.
Agent-to-agent network for teams: dm, who-knows-X routing, shared rooms. Human-in-the-loop.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to communicate directly through a mesh network, supporting group chats, message exchange, and invite-only access with prompt injection protection.29 npmMIT

Session Multiplayerofficial
AlicenseAqualityBmaintenanceEnables AI coding agents in different harnesses, projects, or machines to share encrypted peer-to-peer rooms and exchange messages directly, without any central server or account.83MIT- AlicenseNot gradedqualityBmaintenanceEnables already-running AI coding agents on the same project to register, discover one another, and exchange durable direct messages so they can share progress and avoid conflicting work.Apache 2.0

crosstalkofficial
AlicenseNot gradedqualityBmaintenanceEnables AI coding agents to communicate directly with each other across machines, with support for rooms, pairing, and encrypted messaging.1 npm7MIT