One config to rule them all.
Practical standard layer for multi-LLM development.
Quick Start Β·
Integrations Β·
Commands Β·
FAQ
Every AI coding tool wants its own config format:
| Codex | Claude | Gemini | Cursor | Copilot | Antigravity | Windsurf | OpenCode | Junie | |
|---|---|---|---|---|---|---|---|---|---|
| Config | .codex/config.toml |
CLI commands | .gemini/settings.json |
.cursor/mcp.json |
.vscode/mcp.json |
Global mcp.json |
Global mcp_config.json |
opencode.json |
.junie/mcp/mcp.json |
| Instructions | AGENTS.md |
CLAUDE.md |
AGENTS.md |
.cursorrules |
β | AGENTS.md |
AGENTS.md |
AGENTS.md |
AGENTS.md |
| Format | TOML | JSON (via CLI) | JSON | JSON | JSON | JSON | JSON | JSON | JSON |
Result: Duplicated configs, team drift, painful onboarding.
agents gives you one source of truth in .agents/ and syncs MCP servers, skills, and instructions to every tool automatically.
For Claude Code, it keeps AGENTS.md canonical and generates a minimal root CLAUDE.md wrapper (@AGENTS.md) when the Claude integration is enabled.
# 1. Install
npm install -g @agents-dev/cli
# 2. Interactive setup β picks integrations, adds MCP servers, syncs everything
agents start
# 3. Re-sync whenever config changes
agents syncThat's it. Your .agents/agents.json is now the single source of truth.
This repository uses @agents-dev/cli to keep MCP servers, skills, and instructions aligned across supported AI tools.
agents status
agents mcp add <url-or-name>
agents mcp test --runtime
agents sync
agents sync --checkAdd a server once in .agents/agents.json, then run agents sync to materialize it for enabled integrations.
- MCP Protocol Docs: https://modelcontextprotocol.io
- MCP servers catalog: https://mcpservers.org
- Project examples:
docs/EXAMPLES.md
| Integration | MCP Servers | Skills | Instructions | How it syncs |
|---|---|---|---|---|
| Codex | β | β | β | Writes .codex/config.toml |
| Claude Code | β | β | β | Calls claude mcp add/remove CLI + manages root CLAUDE.md wrapper |
| Gemini CLI | β | β | β | Writes .gemini/settings.json |
| Cursor | β | β | β | Writes .cursor/mcp.json + CLI enable |
| Copilot | β | β | β | Writes .vscode/mcp.json |
| Antigravity | β | β | β | Writes to global user profile mcp.json |
| Windsurf | β | β | β | Writes to global user profile ~/.codeium/windsurf/mcp_config.json + workspace .windsurf/skills |
| OpenCode | β | β | β | Writes project opencode.json (mcp block) |
| Junie | β | β | β | Writes .junie/mcp/mcp.json + skills bridge .junie/skills |
your-project/
βββ AGENTS.md β Canonical instructions for all tools
βββ CLAUDE.md β Generated Claude wrapper (`@AGENTS.md`)
βββ .agents/
β βββ agents.json β MCP servers & config (commit this)
β βββ local.json β Secrets & overrides (gitignored)
β βββ skills/ β Reusable workflow definitions
β β βββ my-skill/SKILL.md
β βββ generated/ β Auto-generated artifacts (gitignored)
β βββ codex.config.toml
β βββ gemini.settings.json
β βββ cursor.mcp.json
β βββ windsurf.mcp.json
β βββ opencode.json
β βββ ...
β
β ββββ Generated by `agents sync` ββββ
βββ .codex/config.toml β Materialized tool configs
βββ .gemini/settings.json β (gitignored in source-only mode)
βββ .cursor/mcp.json β
βββ .vscode/mcp.json β
βββ opencode.json β
βββ .claude/skills/ β .agents/skills β Claude workspace bridges
βββ .cursor/skills/ β .agents/skills β
βββ .gemini/skills/ β .agents/skills β
βββ .windsurf/skills/ β .agents/skillsβ
Git strategy: By default only
.agents/agents.json,.agents/skills/, andAGENTS.mdare committed. GeneratedCLAUDE.mdand tool-specific outputs are gitignored in source-only mode and regenerated withagents sync.
| Command | Description |
|---|---|
agents start |
Interactive setup wizard β integrations, MCP servers, skills, first sync |
agents start --inject-docs |
Also upsert an agents guide block in README.md (+ CONTRIBUTING.md if present) |
agents start --reinit |
Reinitialize existing .agents/agents.json with fresh wizard/default choices |
agents init |
Scaffold .agents/ directory without guided setup |
agents sync |
Regenerate and materialize all tool configs |
agents sync --check |
Strict read-only drift check β exits 2 if config is out of sync |
agents watch |
Auto-sync on .agents/ file changes (--once exits non-zero on sync failure) |
| Command | Description |
|---|---|
agents status |
Show integrations, MCP servers, file states, and live probes |
agents status --fast |
Skip external CLI probes for quicker output |
agents doctor |
Validate configs, check for issues, suggest fixes |
agents doctor --fix |
Auto-fix what can be fixed |
agents update |
Check for newer CLI version on npm |
| Command | Description |
|---|---|
agents mcp add <name> |
Add a server interactively |
agents mcp add <url> |
Import a server from URL (mcpservers.org, GitHub, etc.) |
agents mcp import --file config.json |
Bulk import from JSON/JSONC file |
agents mcp list |
List all configured servers |
agents mcp remove <name> |
Remove a server (--no-sync skips auto-sync for add/import/remove) |
agents mcp test |
Validate server definitions |
agents mcp test --runtime |
Live connectivity check via tool CLIs |
| Command | Description |
|---|---|
agents connect --llm cursor,claude |
Add integrations to the currently enabled set |
agents disconnect --llm codex |
Disable integrations |
agents reset |
Remove generated files, keep .agents/ |
agents reset --hard |
Full cleanup β removes all agents-managed setup |
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β agents sync β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β .agents/agents.json βββ merge βββ Resolved βββ Codex β
β (shared) β Registry TOML β
β β β β
β .agents/local.json βββββββ ββββββββββ Claude β
β (secrets) β CLI + root β
β β CLAUDE.md β
β ββββββββββ Gemini β
β ${ENV_VARS} βββ resolve ββββββββββββββ€ JSON β
β ${PROJECT_ROOT} ββββββββββ Cursor β
β β JSON + CLI β
β ββββββββββ Copilot β
β β VS Code β
β ββββββββββ Antigravityβ
β β Global β
β ββββββββββ Windsurf β
β β Global MCP β
β ββββββββββ OpenCode β
β β opencode.json β
β ββββββββββ Junie β
β .junie/mcp/ β
β β
β .agents/skills/ ββ symlink βββ .claude/skills β
β .cursor/skills β
β .gemini/skills β
β .junie/skills β
β .windsurf/skills β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Load β reads
.agents/agents.json+ merges secrets from.agents/local.json - Resolve β expands
${PROJECT_ROOT},${ENV_VAR}placeholders, filters byenabledandrequiredEnv - Route β sends each server to its target integrations (or all, if no
targetsspecified) - Generate β renders tool-specific config formats (TOML for Codex, JSON for others)
- Materialize β writes configs atomically (project-local and global targets), calls CLIs for Claude/Cursor, and manages Claude's root
CLAUDE.mdwrapper - Bridge skills β creates symlinks from tool directories to
.agents/skills/(including Windsurf workspace bridge)
agents mcp add https://mcpservers.org/servers/context7-mcpagents mcp add my-server \
--command npx \
--arg @my-org/mcp-server \
--arg /path/to/projectagents mcp add company-api \
--url "https://api.company.com/mcp" \
--secret-header "Authorization=Bearer {{API_TOKEN}}"Secrets are automatically detected and split: placeholders go to
agents.json(committed), real values tolocal.json(gitignored).
# Only for Claude
agents mcp add claude-only-server --url "https://..." --target claude
# Only for Cursor and Copilot
agents mcp add ide-server --command ide-mcp --target cursor --target copilot_vscode| What | Where | |
|---|---|---|
| π | Server definitions, team config | .agents/agents.json β committed |
| π | API keys, tokens, secrets | .agents/local.json β gitignored |
How secrets work:
- When you add a server,
agentsdetects secret-like values (API keys, tokens, JWTs) - Secrets are moved to
local.jsonand replaced with${PLACEHOLDER}inagents.json agents doctorwarns if it finds literal secrets in committed config- All env keys and header names are validated to prevent injection
Lead sets up the project:
agents start
agents mcp add https://mcpservers.org/servers/context7-mcp
agents mcp add company-api --url "https://api.company.com/mcp" \
--secret-header "Authorization=Bearer {{API_TOKEN}}"
git add .agents/agents.json .agents/skills/ AGENTS.md && git commit -m "Add agents config"New member onboards:
git clone <repo> && cd <repo>
agents start # Preserves team config and syncs local tool files
# Add your local secrets in .agents/local.json if required by project MCP serversOne command. Same MCP servers, same skills, same instructions. No drift.
Does this replace AGENTS.md?
No. It extends it.
AGENTS.md is human-readable guidance for LLMs; agents handles machine-readable config (MCP servers, skills) and keeps everything in sync.
When Claude integration is enabled, agents also generates a minimal root CLAUDE.md wrapper that references AGENTS.md.
Can I use this with only one tool?
Yes. You still get cleaner config management, safer git defaults, secret splitting, and easy MCP server management β even for a single tool.
Where should secrets live?
In
.agents/local.json (gitignored by default). The CLI automatically splits secrets from public config when you add MCP servers.
What happens during agents sync?
It reads your
.agents/ config, merges secrets, resolves placeholders, generates tool-specific files, and writes them atomically. For Claude and Cursor it also calls their CLIs to register servers. The whole process is idempotent and safe to run repeatedly.
For Claude it also maintains a root CLAUDE.md wrapper without duplicating the contents of AGENTS.md.
How do I keep configs in sync automatically?
Run
agents watch β it polls .agents/ files and auto-syncs on changes. Or run agents sync manually after editing config.
Can I target an MCP server to specific tools only?
Yes. Add
"targets": ["claude", "cursor"] to a server definition in agents.json, or use the --target flag with agents mcp add. Servers without targets go to all enabled integrations.
| Resource | |
|---|---|
| π | Usage Examples β solo dev, teams, monorepos, scripting |
| ποΈ | System Architecture β sync internals, file formats, security model |
| π | Changelog β version history and migration notes |

