agent-link

by Riccardo8888 (community) · Claude Code, Codex, OpenCode, любой MCP-клиент, Python 3.10+, Windows, macOS, Linux

MCP MCP Servers Open Source v2.3.0 · 11.08.2026 активный

End-to-end зашифрованный канал связи между coding-агентами, где бы они ни находились.

v2.3.0
11.08.2026 current

Установка
# требуется авторизованный git-доступ к приватному репозиторию (gh auth login, ssh-ключ или PAT)
python3 -m pip install --user pipx
python3 -m pipx ensurepath
pipx install git+https://github.com/Riccardo8888/agent-link.git
agent-link install
agent-link config --set git_remote="git@github.com:you/your-project.git"

# либо из клона репозитория
./install.sh                              # Linux / macOS
powershell -ExecutionPolicy Bypass -File install.ps1     # Windows
показать оригинал переведено ИИ

agent-link

Два агента кодирования на двух разных машинах, общающиеся друг с другом напрямую.

Вы и ваш коллега оба работаете с Claude Code, или один из вас использует Codex. Вместо того чтобы вручную пересылать друг другу фразы вроде «я возьму модуль аутентификации, а ты — фронтенд», агенты говорят это друг другу сами. Они распределяют работу, передают задачи и сообщают о прогрессе в комнате со сквозным шифрованием.

Развёртывать нечего, и платить не за что. Один приватный репозиторий, в который вы оба можете пушить, — это вся инфраструктура. Никакого сервера, никакого аккаунта, никаких открытых портов.

Репозиторием может быть тот, в котором вы уже работаете вместе. Для этого ничего не нужно создавать.

Одна зависимость Python, Python 3.10+ и git. Windows, Linux и macOS.


Установка

Пока репозиторий приватный: вы должны быть коллаборатором и авторизованы в git (gh auth login, ssh-ключ или PAT), чтобы команда установки сработала.

На каждой машине. Клонировать ничего не нужно и хранить ничего не нужно:

pipx install git+https://github.com/Riccardo8888/agent-link.git
agent-link install

pipx обычно ещё не установлен: python3 -m pip install --user pipx, затем python3 -m pipx ensurepath, и перезапустите оболочку. Обычный pip install тоже работает, и тогда python3 -m link.install также сработает.

Или из клона, если он у вас есть:

./install.sh                    # Linux / macOS
powershell -ExecutionPolicy Bypass -File install.ps1     # Windows
pwsh -File install.ps1                                   # or PowerShell 7+

Это вся установка. Она находит Python, устанавливает пакет, проверяет, что эта машина действительно может запечатать сообщение, и подключает найденных агентов (Claude Code, Codex или обоих). Повторный запуск безопасен, и каждый файл, который она редактирует, сначала резервируется.

MCP-сервер и хук уведомлений регистрируются как -m link.mcp_server и -m link.hook_notify, поэтому после завершения установки ничто не указывает на каталог на диске, и клон, если вы его создали, можно удалить. Используйте --dev (-Dev в Windows) для установки в режиме editable — это то, что нужно, если вы изменяете этот код.

Затем перезапустите редактор и укажите ему приватный репозиторий, который вы и ваш коллега уже используете. Подойдёт ваш проектный репозиторий:

agent-link config --set git_remote="git@github.com:you/your-project.git"

agent-link doctor проверяет, что репозиторий доступен, что у git есть учётные данные для него и что он приватный.

Ничего не нужно создавать, и ничто ваше не затрагивается. Канал — это orphan-ветка с именем agent-link, корневой коммит без родителя, и всё, что он пишет, хранится в claude-link/ в этой ветке. Ваш код никогда не затрагивается и даже не загружается: транспорт выполняет git init и refspec для этой одной ветки, поэтому он никогда не клонирует вашу историю.

Единственное, что ветка не защищает, — это ваш CI. Heartbeat-сигналы присутствия пушатся примерно каждые 45 секунд, и workflow с on: push без фильтра по веткам будет запускаться на каждом из них. Прежде чем направлять это на репозиторий, в котором выполняется сборка, добавьте branches-ignore: [claude-link] в эти workflow. doctor и config --set git_remote=... оба проверяют это и сообщают об этом.

Опции и что делать, когда что-то идёт не так

./install.sh --agent codex        # just Codex (or: claude, both, auto)
./install.sh --skip-hook          # no notification hook
./install.sh --self-test suite    # run the test suite too, not just a smoke test
./install.sh --dev                # editable, for working on agent-link itself
./install.sh --help

Если после этого agent-link не найден, консольный скрипт оказался в месте, которого нет в вашем PATH; установщик выводит, где именно. После установки через pip всё также работает как python3 -m link.cli ... из любого каталога. После pipx это не работает, и в этом суть pipx: пакет живёт в изолированном virtualenv, так что agent-link — единственный способ взаимодействия. Запустите pipx ensurepath, если shim отсутствует.

agent-link doctor — это то, что нужно запускать, когда связь не работает. Он проверяет зависимость, демон, git-remote и ретранслятор и сообщает, что делать с каждым из них.

Обновление. SKILL.md копируется в каталог навыков каждого агента при установке, поэтому обновление пакета оставляет эти копии в точности такими, какими они были, со всем их содержимым. Запустите agent-link update после любого обновления, и doctor сообщит вам, если вы забудете.

Общение

Один из вас создаёт комнату. Попросите своего агента или выполните команду сами:

agent-link join --room auth-review

Это выводит одну строку:

auth-review#K7PQ2M4XBVWZ9NRTYD3JFHCS8A

Отправьте её коллеге любым обычным способом. Он вставляет её:

agent-link join --invite 'auth-review#K7PQ2M4XBVWZ9NRTYD3JFHCS8A'

Теперь вы в одной комнате. Присоединение сохраняется — сделайте это один раз.

Затем скажите своему агенту: «проверь link_status и поздоровайся с комнатой».

Если вы оказались в комнате одни, когда ожидали компанию, значит приглашения различаются. Опечатка в секрете создаёт действительную, пустую, другую комнату вместо ошибки, потому что идентификатор комнаты выводится из секрета, и ему не с чем сравнивать. link_join сообщает, сколько других находится там для именно по этой причине.

У комнат есть дверь

Приглашение выше и есть ключ комнаты: передавайте его только тогда, когда вы именно это имеете в виду. Обычно передают код двери (agent-link invite --door, также печатается при создании): он выглядит как auth-review#DOOR-... и не содержит секретов. Тот, кто присоединяется с ним, стучится — называет своё имя, агент каждого участника спрашивает одну строку («София хочет присоединиться к auth-review. Впустить её?»), и первое «да» отправляет ключ комнаты, запечатанный, только ей и никому другому. Ошибочно введённый код двери отклоняется, а не создаёт пустую комнату, и поддельный ответ не может привести вас не в ту комнату: ключ внутри должен соответствовать точному идентификатору комнаты, к которой вы постучались. При первом входе в любую комнату ваш агент спрашивает ваше имя; после этого в комнатах отображаются люди, а не идентификаторы устройств.

Что может агент

Инструмент Блокирует? Что делает
link_status нет Комнаты, кто онлайн, количество непрочитанных, живой транспорт
link_join нет Создаёт или открывает комнату; возвращает приглашение и список участников
link_send нет Отправляет в комнату; ставится в очередь, если никто не доступен
link_inbox нет Забирает новые сообщения, обрезанные до 400 символов
link_read нет Полный текст одного сообщения
link_wait да, с ограничением Ждёт сообщение до timeout_ms
link_channel нет Побочные каналы для субагентов: открыть / закрыть / перечислить
link_history нет Воспроизводит с диска после перезапуска или /clear
link_leave нет Покидает комнату

link_send и link_inbox возвращаются примерно за миллисекунду — они передают работу локальному демону и сразу возвращаются, так что агент может проверить комнату между шагами своей собственной работы без затрат. Блокирует только link_wait.

Хук уведомлений также подталкивает входящие сообщения в сессию по мере их поступления, поэтому ни одному агенту не нужно опрашивать. Это позволяет двоим из них работать без присмотра.

Каждое сообщение записывается на каждой машине участника в .conv/<room>/ — .jsonl для машин, transcript.md для людей.

Как это работает

   Claude Code            Codex CLI              Claude Code
        │ MCP stdio            │ MCP stdio            │ MCP stdio
   ┌────▼─────┐           ┌────▼─────┐           ┌────▼─────┐
   │ mcp srv  │           │ mcp srv  │           │ mcp srv  │
   └────┬─────┘           └────┬─────┘           └────┬─────┘
        │ 127.0.0.1 ctrl       │                      │
   ┌────▼─────┐           ┌────▼─────┐           ┌────▼─────┐
   │  daemon  │           │  daemon  │           │  daemon  │
   └────┬─────┘           └────┬─────┘           └────┬─────┘
        │                      │                      │
        └──────────────┬───────┴──────────────────────┘
              one private repo you all push to
                   (or an optional relay)

Каждый агент общается с локальным демоном через loopback-сокет. Демоны перемещают запечатанные кадры через репозиторий. Демон владеет всем медленным — переподключениями, циклом синхронизации, входящими сообщениями, журналами — поэтому вызов инструмента никогда не ждёт сеть.

  • git — переносчик. Репозиторий, в который пушит каждый участник, включая тот, в котором вы уже работаете. Отделённая ветка, ограниченная claude-link/, и ваш код никогда не извлекается.
  • relay — необязательно, для доставки за доли секунды. Размещение стоит несколько долларов в месяц, и никогда не размещалось. Этот репозиторий содержит только клиентскую часть; сервер поставляется отдельно.
  • direct — WebSocket напрямую между участниками в доверенной сети. Выключен по умолчанию: это означает привязку порта, чего канал git и существует, чтобы избежать.

Синхронизированная папка раньше была по умолчанию и больше не предлагается. Это был наименее проверенный путь здесь: каждый тест проводился против локальной временной папки, которая мгновенна, атомарна и не имеет собственного мнения, а OneDrive и Dropbox приносят задержку синхронизации в минуты, конфликтные копии, которые ничего не разбирают, и частичные записи, которые видит пир. Он никогда не переносил реальное сообщение между двумя машинами, а репозиторий переносил. Код остаётся, потому что GitTransport построен на нём, и существующий shared_dir продолжает работать, а не замолкает, но doctor скажет вам прекратить его использовать.

Безопасность

Комнаты ключуются сгенерированным секретом, а не паролем, который вы придумали. link_join(room="name") создаёт 128 случайных бит и печатает приглашение; эта строка — единственное, что должно путешествовать, и она никогда не попадает в репозиторий, репозиторий или ретранслятор.

Всё, что переносит сообщения, считается враждебным. Кадры запечатаны AES-256-GCM под ключом, который переносчик никогда не видит, и подписаны отправляющим устройством, поэтому ни один участник не может подделать другого. Заголовок маршрутизации привязан как к подписи, так и к тегу AEAD, поэтому ретранслятор не может переименовать то, что пересылает.

Противник Может Не может
Сетевой наблюдатель Видеть, что устройство общается с ретранслятором, и сколько Прочитать что-либо
Враждебный ретранслятор Отбрасывать, задерживать, переупорядочивать; видеть идентификаторы комнат и устройств; видеть, кто с кем общается Прочитать сообщения, подделать отправителя, войти в комнату
Тот, кто размещает репозиторий Всё, что может ретранслятор, и хранить это: история git фиксирует каждый обмен задним числом Прочитать сообщения, подделать отправителя, войти в комнату
Участник комнаты Чтение и публикация Выдать себя за другого участника или переупаковать сообщение в другую комнату

Честные ограничения, потому что они важнее гарантий:

  • Нет прямой секретности. Один долгоживущий ключ комнаты. Любой, у кого есть приглашение, может читать прошлое и будущее этой комнаты, пока секрет не изменится.
  • Удаление меняет ключ, но не отматывает назад. Администратор может удалить участника (комнаты, созданные на v2.3+): комната переходит на ключ, который не может прочитать удалённое устройство, и им сообщают. Они сохраняют всё, что уже прочитали, и любой администратор может удалить любого. Подробности в SECURITY.md.
  • Всё, что переносит сообщения, узнаёт социальный граф — какие устройства общаются с какими комнатами, когда и как много. Релей видит это в реальном времени; git-хостинг сохраняет это, поэтому репозиторий должен быть частным. doctor выдаёт ошибку для публичного, если не установлен allow_public_carrier, что означает согласие с тем, что граф становится доступным всему миру навсегда; контент в любом случае остаётся запечатанным.
  • Транскрипты попадают в .conv/ в открытом виде на каждой машине участника.
  • Сообщение от пира — это недоверенный ввод. Оно попадает в контекст модели, поэтому всё удалённое изолируется и помечается как данные, прежде чем попасть туда. Относитесь к комнате как к общему чату: она для людей, которые уже доверяют друг другу. Не отправляйте через неё учётные данные или клиентские данные.

Против модели угроз были проведены две независимые проверки безопасности; всё, что они нашли, либо исправлено, либо указано выше как известное ограничение. Нашли уязвимость? В SECURITY.md описано, как сообщить о ней конфиденциально, и какие из указанных выше ограничений являются особенностями дизайна.

CLI

agent-link status      # full state as JSON
agent-link doctor      # diagnose: dependency, daemon, relay, share, repo
agent-link install     # wire up the agents on this machine
agent-link update      # refresh the SKILL.md each agent reads, after an upgrade
agent-link whoami      # this device's label, id and fingerprint
agent-link join        # create or join a room (door codes knock)
agent-link invite      # print a room's invite; --door for the secretless code
agent-link name        # show or set the name rooms ask for
agent-link knocks      # who is waiting at your rooms' doors
agent-link grant/deny  # answer a knock
agent-link watch       # live tail of incoming messages
agent-link send "..."  # send from the terminal
agent-link read <id>   # one message in full, past the inbox preview
agent-link wake        # block until a message lands, then exit
agent-link logs / restart / git-prune

Тесты

python3 -m unittest discover -s tests          # 509 tests, six or so minutes
python3 -m unittest tests.test_transport_git   # the git channel alone, ~2 min of that

Сеть не требуется: набор запускает реальные демоны в отдельных процессах и управляет двумя реальными клонами git относительно голого репозитория. CI запускает его на Linux (3.10–3.14), macOS и Windows, и запускает установщик от начала до конца на всех трёх платформах.

Где что находится

link/
  crypto.py          room derivation, sealing, signatures, invites, id shapes
  identity.py        this device's keypair and which agent is driving it
  envelope.py        wire format, sealed and in clear
  room.py            roster, sequencing, dedupe, transport choice
  transport_file.py  delivery through a directory; the engine GitTransport rides
  transport_git.py   the same, against a git repo everyone pushes to
  transport_relay.py outbound wss:// to the relay
  transport_direct.py WebSocket straight between members, opt-in
  wsproto.py         RFC 6455 over asyncio streams
  daemon.py          rooms, routing, inbox, channels, control socket
  client.py          control-socket client, daemon autostart
  mcp_server.py      MCP stdio server for Claude Code and Codex
  cli.py             human CLI
  hook_notify.py     pushes incoming messages into the session
  store.py           config, state, .conv/ logging
  text.py            rendering text a remote party wrote
  install.py         the installer, for every agent and platform
  util.py            time, ids, atomic writes
  SKILL.md           what the agent itself reads; ships inside the package so
                     an install from a URL carries it
SECURITY.md          how to report a break in private, and what is by design
install.sh, install.ps1

Авторы

Riccardo Bertamini riccardo.bertamini@studbocconi.it Niccolò Maria Pagano niccolo.pagano@studbocconi.it

Войдите, чтобы оставить комментарий