AgentSync: синхронизация MCP-конфигов между AI-агентами одной командой
Что такое синхронизация MCP-конфигов?
Синхронизация MCP-конфигов — это поддержание согласованности настроек серверов Model Context Protocol между несколькими AI-агентами (Claude Code, Cursor, Codex, Gemini), каждый из которых хранит конфиги в своём формате и в своём месте. Без синхронизации добавление или изменение MCP-сервера в одном агенте требует ручного дублирования изменений во всех остальных.
TL;DR
- -agentsync использует Claude Code как единственный source of truth и синхронизирует MCP-конфиги в Cursor, Codex и Gemini одной командой
- -Каждый агент хранит конфиги в своём формате: JSON (Claude/Cursor), TOML (Codex), MDC (Cursor rules) — agentsync конвертирует автоматически
- -Ошибки регистра вроде 'Notion' vs 'notion' вызывают тихие баги; agentsync дедублирует при синхронизации
- -Установка через pip/pipx/uvx; Python 3.9+, три зависимости: Click, PyYAML, Rich
- -Три команды: agentsync init → agentsync sync → agentsync validate
Работаете с несколькими AI coding agents — Claude Code, Cursor, Codex, Gemini? Значит, знаете боль ручного копирования MCP-конфигов между ними. Каждый агент хранит конфигурацию в своем формате, в своем месте, со своими особенностями. agentsync убирает эту рутину: один source of truth, одна команда — все агенты синхронизированы.
Проблема: конфиг-дрифт при работе с несколькими агентами
MCP (Model Context Protocol) — де-факто стандарт для подключения инструментов к AI-агентам. Типичный рабочий проект сегодня использует 10-30 MCP-серверов: Supabase, GitHub, Linear, Sentry, Notion, Langfuse, Cloudflare и десятки других. Каждый сервер — это блок конфигурации с command, args, env-переменными.
Всё ломается, когда агентов больше одного. А большинство разработчиков в 2026 году используют минимум два:
- Claude Code хранит серверы в
~/.claude.json(глобально) и.mcp.json(на уровне проекта), формат — JSON. - Cursor хранит серверы в
~/.cursor/mcp.json, формат — JSON, но с другой структурой. Правила проекта — в MDC-файлах с YAML frontmatter. - Codex (OpenAI) хранит серверы в
~/.codex/config.toml, формат — TOML. Правила — вAGENTS.md. - Antigravity/Gemini хранит серверы в
~/.gemini/antigravity/mcp_config.json, формат — JSON, но поддерживает только stdio-протокол.
Добавили новый MCP-сервер? Нужно отредактировать 3-4 файла вручную. Забыли один — агент молча не видит сервер. Опечатка в env-переменной — молчаливый сбой. Переименовали сервер в одном месте, но не в другом — дрифт конфигов, который вы обнаружите только когда что-то сломается.
По сути, это та же проблема configuration management, но в контексте AI-инструментов.
Решение: agentsync
agentsync — CLI-утилита. Берёт конфигурацию одного агента как source of truth, генерирует конфигурации для всех остальных. Конвертация форматов, дедупликация, фильтрация, бэкапы — из коробки.
Архитектура:
+--------------+
| Claude Code | Source of Truth
| .claude.json| --- MCP Servers
| .mcp.json | --- Rules (CLAUDE.md)
| CLAUDE.md |
+------+-------+
| agentsync sync
+------------------+-----------------+
v v v
+--------------+ +--------------+ +--------------+
| Cursor | | Codex | | Antigravity |
| mcp.json | | config.toml | |mcp_config.json|
| project.mdc | | AGENTS.md | | |
+--------------+ +--------------+ +--------------+
Почему Claude Code как source of truth? Самая гибкая конфигурация (3 уровня мержа: глобальный, проектный, локальный), поддержка и stdio, и HTTP-протоколов, плюс развитая система правил (CLAUDE.md).
Быстрый старт
Установка:
pip install agentsync-cli # pip
pipx install agentsync-cli # pipx (рекомендуется для CLI-утилит)
uvx agentsync-cli # uv (запуск без установки)
Инициализация и первая синхронизация:
agentsync init # Создает agentsync.yaml с дефолтными настройками
agentsync sync # Синхронизирует на все агенты
agentsync validate # Проверяет консистентность
Для безопасного первого запуска — dry-run:
agentsync sync --dry-run # Показывает что изменится, ничего не записывает
Конфигурация
Вся настройка живет в одном файле agentsync.yaml в корне проекта:
version: 1
source:
type: claude
global_config: ~/.claude.json # Глобальный конфиг Claude Code
project_mcp: .mcp.json # Проектные MCP-серверы
rules_file: CLAUDE.md # Правила проекта
targets:
cursor:
type: cursor
mcp_path: ~/.cursor/mcp.json
rules_path: .cursor/rules/project.mdc
rules_format: mdc # MDC = Markdown + YAML frontmatter
exclude_servers: []
codex:
type: codex
config_path: ~/.codex/config.toml
rules_path: AGENTS.md
rules_format: md
exclude_servers:
- codex # Codex не может вызывать сам себя
antigravity:
type: antigravity
mcp_path: ~/.gemini/antigravity/mcp_config.json
protocols:
- stdio # Только stdio-серверы (без HTTP)
rules:
exclude_sections:
- "MCP Servers" # Секции, специфичные для Claude Code
- "Context Management & Agents"
sync:
backup: true
backup_dir: .agentsync/backups
Несколько деталей:
- exclude_servers — исключает конкретные серверы для конкретных агентов. Типичный пример: Codex не может вызывать свой собственный MCP-сервер.
- protocols — фильтрация по типу протокола. Antigravity/Gemini поддерживает только stdio, поэтому HTTP-серверы автоматически отсеиваются.
- exclude_sections — секции из CLAUDE.md, которые не должны попадать в правила других агентов. Например, инструкции по работе с MCP-серверами или управлению контекстом специфичны для Claude Code.
Как работает пайплайн синхронизации
Что делает agentsync sync:
agentsync sync
|
+- Load config (agentsync.yaml)
+- Read source (Claude Code)
| +- ~/.claude.json -> global MCP servers
| +- .mcp.json -> project MCP servers
| +- CLAUDE.md -> rules sections
|
+- Deduplicate (case-insensitive)
+- Filter (exclude_servers, exclude_sections, protocols)
|
+- Generate + Write per target
+- Cursor: mcp.json + project.mdc (MDC frontmatter)
+- Codex: config.toml (marker-based) + AGENTS.md
+- Antigravity: mcp_config.json (stdio-only)
Трехуровневый мерж источника
Claude Code хранит серверы на трех уровнях, и agentsync мержит их с приоритетами (от низшего к высшему):
~/.claude.json— глобальные серверы (top-levelmcpServers)~/.claude.json— проектные серверы (projects[путь].mcpServers).mcp.json— локальные серверы (перезаписывают все предыдущие)
Case-insensitive дедупликация
Разные источники конфигов иногда называют один и тот же сервер по-разному: Notion в глобальном конфиге и notion в проектном. agentsync находит такие конфликты, оставляет запись с более высоким приоритетом и пишет warning в лог.
Конвертация форматов
Каждый адаптер пишет конфиг в нативном формате агента:
- Cursor — JSON с
mcpServersобъектом, правила в MDC с YAML frontmatter (alwaysApply: true) - Codex — TOML с
[mcp_servers.name]таблицами, вставляемый между маркерами# === AGENTSYNC START ===/# === AGENTSYNC END ===(остальной config.toml не трогается) - Antigravity — JSON, только stdio-серверы
Бэкапы и безопасность
Перед каждой записью agentsync делает бэкап в .agentsync/backups/. Отключить — флагом --no-backup. Dry-run режим (--dry-run) показывает все изменения без записи на диск.
Архитектура: адаптеры
agentsync построен на паттерне адаптеров. Каждый AI-агент реализует интерфейс TargetAdapter:
class TargetAdapter(ABC):
@abstractmethod
def generate_mcp(self, servers: dict[str, ServerConfig]) -> str | dict:
"""Генерация MCP-конфига в формате целевого агента."""
@abstractmethod
def generate_rules(self, sections: list[Section]) -> str:
"""Генерация правил в формате целевого агента."""
@abstractmethod
def write(self, dry_run: bool = False) -> list[WriteResult]:
"""Запись сгенерированных конфигов."""
@abstractmethod
def validate(self) -> list[ValidationResult]:
"""Валидация существующих конфигов."""
Для добавления нового агента нужно:
- Создать
src/agentsync/adapters/youragent.pyс реализациейTargetAdapter - Зарегистрировать в
cli.py(функцияcreate_targets) - Добавить тип в
KNOWN_TARGET_TYPESвconfig.py - Написать тесты
Структура проекта:
src/agentsync/
+-- adapters/ # Source и target адаптеры
| +-- base.py # Абстрактные базовые классы
| +-- claude.py # Claude Code source adapter
| +-- cursor.py # Cursor target adapter
| +-- codex.py # Codex target adapter
| +-- antigravity.py # Antigravity/Gemini target adapter
+-- utils/ # Утилиты
| +-- backup.py # Бэкапы файлов
| +-- dedup.py # Case-insensitive дедупликация
| +-- diff.py # Отображение различий серверов
| +-- io.py # Запись файлов с WriteResult
| +-- logger.py # Rich-логирование
| +-- markdown.py # Парсинг Markdown-секций
| +-- output.py # Форматирование вывода CLI
+-- cli.py # Click CLI команды
+-- config.py # Загрузка YAML-конфига
+-- sync.py # Оркестратор синхронизации
+-- validate.py # Оркестратор валидации
Минимум зависимостей — всего три: Click (CLI), PyYAML (конфиг), Rich (форматированный вывод). TOML генерируется вручную, без внешних зависимостей — ради совместимости с Python 3.9+.
CLI: полный набор команд
# Синхронизация
agentsync sync # Полная синхронизация (MCP + rules)
agentsync sync --dry-run # Предпросмотр без записи
agentsync sync --mcp-only # Только MCP-конфиги
agentsync sync --rules-only # Только правила
agentsync sync -t cursor # Синхронизация только на конкретный агент
agentsync sync --no-backup # Без создания бэкапов
# Валидация
agentsync validate # Проверка консистентности
agentsync validate -v # Подробный отчет (включая пройденные)
agentsync validate -t codex # Валидация конкретного агента
# Инициализация
agentsync init # Создать agentsync.yaml
agentsync init --force # Перезаписать существующий
# Статус
agentsync status # Информация об источнике, состояние целей, дрифт
Exit codes для интеграции в CI/CD:
| Код | Значение |
|---|---|
0 | Успех |
1 | Runtime-ошибка (синхронизация или валидация не прошла) |
2 | Ошибка конфигурации (нет конфига, невалидный YAML, неизвестный адаптер) |
Качество кода и CI/CD
Проект использует строгий CI-пайплайн на GitHub Actions:
- Линтинг: Ruff (check + format)
- Типизация: mypy со строгими настройками
- Тестирование: pytest на матрице Python 3.9-3.13 x Ubuntu/macOS (10 комбинаций)
- Покрытие: 192 теста, 97% coverage
- Сборка: hatchling + twine check
- Релиз: PyPI trusted publisher (OIDC, без токенов в секретах)
- Dependabot: автоматическое обновление зависимостей
Все тесты используют tmp_path fixtures — реальные пользовательские файлы не трогаются.
Практический пример
Допустим, в вашем проекте используется 15 MCP-серверов: Supabase, GitHub, Linear, Sentry, Notion, Langfuse, Cloudflare, Context7, Playwright, Mapbox и другие. Основная работа — в Claude Code, Cursor для быстрых правок, Codex — для code review.
Без agentsync: добавили Grafana MCP-сервер в .mcp.json для Claude Code. Через два дня открываете Cursor — Grafana недоступна. Вручную копируете конфиг, адаптируете формат. Ещё через неделю нужен Codex — снова ручная конвертация JSON в TOML.
С agentsync:
# Добавили Grafana в .mcp.json (как обычно)
# Одна команда — все агенты обновлены
agentsync sync
# Вывод:
# Sync complete: 3 targets, 6 files written, 0 errors
# cursor v 2 files
# codex v 2 files
# antigravity v 1 file
Можно встроить в pre-commit hook или CI:
agentsync validate || echo "MCP configs out of sync!"
Ссылки
- GitHub: github.com/spyrae/agentsync
- PyPI: pypi.org/project/agentsync-cli
- Лицензия: MIT
- Python: 3.9+
agentsync — open-source проект от Spyrae. Баг-репорты, feature-реквесты и PR приветствуются.
FAQ
Если обновить переменные окружения сервера напрямую в mcp.json Cursor, минуя Claude Code, перезапишет ли следующий agentsync sync эти изменения?
Да — sync всегда перезаписывает целевые файлы тем, что находится в источнике Claude Code. Любые правки напрямую в Cursor, Codex или Antigravity считаются временными. Правильный рабочий процесс: вносить все изменения в ~/.claude.json или .mcp.json Claude Code, затем синхронизировать. Если нужны переменные окружения, специфичные для агента, которые не должны распространяться (например, другой API endpoint в Cursor), используйте exclude_servers, чтобы исключить этот сервер из синхронизации и управлять им вручную.
Адаптер Codex использует marker-based вставку для сохранения содержимого config.toml. Что произойдёт, если кто-то случайно удалит маркеры AGENTSYNC START/END?
При следующей синхронизации agentsync не найдёт маркеры и добавит новый управляемый блок в конец файла. В результате возникнут дубликаты записей MCP-серверов — старые без маркеров и новые внутри пересозданного блока. Запустите agentsync validate -t codex для обнаружения: команда сообщит об ошибке консистентности, так как серверы из источника не соответствуют ожидаемым между маркерами. Решение: вручную удалить дублированные записи и позволить agentsync sync пересоздать маркированный блок.
Не рискует ли синхронизация правил CLAUDE.md в AGENTS.md попасть в Codex Claude-специфичными инструкциями, ломающими его поведение?
Именно для этого существует конфигурация rules.exclude_sections. Секции вроде «MCP Servers», «Context Management & Agents» и любые инструкции, специфичные для рабочих процессов Claude Code, должны быть там перечислены. Частая ошибка — забыть исключить секции, ссылающиеся на Claude-специфичные slash-команды или управление памятью: Codex получит эти инструкции и либо проигнорирует их, либо поведёт себя непредсказуемо. После первой синхронизации запустите agentsync validate -v для проверки утечек исключённых секций.