Discover, health-check, and sync MCP servers across Claude Code, Cursor, Windsurf, and more. Git-native project configs with atomic IDE write-back.
Project description
arete-mcp
One CLI to discover, health-check, and sync MCP servers across Claude Code, Cursor, Windsurf, and more.
The Problem
You use Claude Code, Cursor, and Windsurf. Each stores MCP servers in a different JSON file with a different schema.
~/.claude.json
~/.cursor/mcp.json
~/.windsurf/mcp_config.json
Your team can't share configs via git. Switching projects means manual copy-paste. One IDE has a server the others don't. You have no idea which servers are actually healthy.
mcp-manager gives you one CLI — and one .mcp-manager.yml in your repo — to rule them all.
30-Second Quickstart
# Install
pip install arete-mcp
# See every MCP server across every IDE
mcp-manager list
# Check if they actually work (not just "starts")
mcp-manager health --deep
# Scaffold a project config
mcp-manager project init
# Sync it to Cursor (dry-run first, then commit)
mcp-manager sync --ide cursor --dry-run
mcp-manager sync --ide cursor
What Makes This Different
| arete-mcp | Other Managers | |
|---|---|---|
| Config lives in repo | ✅ .mcp-manager.yml committed with your code |
❌ Global per-IDE JSON files |
| Atomic write-back | ✅ Backups + dry-run before touching IDE configs | ❌ Direct overwrite, no rollback |
| Deep health checks | ✅ Verifies tools/list responds, deps on PATH |
❌ "Process started" only |
| Zero daemon | ✅ CLI-only, no background services | ❌ Some require persistent gateway/web UI |
| Python-native | ✅ pip install, works wherever Python 3.11+ does |
❌ Node/Go binaries, extra tooling |
| Cross-IDE discovery | ✅ Reads Claude, Cursor, Windsurf, project-level .mcp.json |
⚠️ Partial coverage |
Features
🔍 Discovery
Reads MCP server configs from:
- Claude Code (
~/.claude.json) - Claude Desktop (
~/.config/Claude/claude_desktop_config.json) - Cursor (
~/.cursor/mcp.json) - Windsurf (
~/.windsurf/mcp_config.json) - Project-level (
.mcp.json, walks parent dirs)
🏥 Health Checks
- Fast: Process spawn (stdio) or HTTP ping (SSE) — 10s timeout
- Deep: Dependency validation (
node,python,dockeron PATH) + verifytools/listreturns non-empty - Batch: Check all servers in parallel with
mcp-manager health
📝 Config Write-Back (Atomic & Safe)
- Writes discovered/merged configs back to IDE-specific JSON files
- Atomic: temp file + rename (never corrupts your IDE config)
- Backups:
.mcp-manager-backupcreated before any modification - Dry-run: Preview changes without touching disk
📁 Project-Scoped Configs
Create .mcp-manager.yml in any repo root:
project: my-service
servers:
postgres-local:
command: node
args: ["./mcp/postgres-server/dist/index.js"]
env:
DATABASE_URL: ${DATABASE_URL}
stripe-mcp:
command: npx
args: ["-y", "@stripe/mcp"]
env:
STRIPE_SECRET_KEY: ${STRIPE_SECRET_KEY}
- Environment variables (
${VAR}) resolved at load time - Validated before write-back (missing env vars or commands caught early)
- Project config wins on merge conflicts with global registry
🔄 Export / Import
Portable YAML/JSON for backup, sharing, and CI:
mcp-manager export servers.yaml
mcp-manager import servers.yaml
🖥️ Server Monitor (Auto-Restart)
Keep stdio MCP servers alive in development:
mcp-manager monitor --project .
- Watches server processes and restarts on crash
- Exponential backoff (1s → 2s → 4s ... max 30s)
- Graceful shutdown on Ctrl+C / SIGTERM
- JSON status output:
mcp-manager monitor --json
🔒 CI Gate / GitHub Action
Validate .mcp-manager.yml on every PR:
# .github/workflows/mcp-validate.yml
- uses: AreteDriver/mcp-manager/.github/actions/mcp-manager-validate@main
with:
path: "."
strict: "false"
Catches missing env vars, broken commands, and (with --strict) failing servers before merge.
Usage
# List all MCP servers across all IDEs
mcp-manager list
# Filter by IDE
mcp-manager list --tool cursor
# Health check all servers
mcp-manager health
# Deep health check — validate dependencies and verify tools/list
mcp-manager health --deep
# Show server-to-IDE mapping
mcp-manager map
# Export/import configs (portable YAML/JSON)
mcp-manager export servers.yaml
mcp-manager import servers.yaml
# Add/remove servers from the registry
mcp-manager add my-server --command "node server.js"
mcp-manager remove my-server
# Sync project config to IDE
mcp-manager sync --ide cursor --dry-run
mcp-manager sync --ide cursor
# Project-level MCP config
mcp-manager project init # Scaffold .mcp-manager.yml
mcp-manager project validate # Check env vars, commands on PATH
mcp-manager project export --ide cursor
# Keep stdio servers alive with auto-restart
mcp-manager monitor # Foreground monitor, Ctrl+C to stop
# CI gate — validate .mcp-manager.yml in CI
mcp-manager validate # Fast validation
mcp-manager validate --strict # + deep health checks on all servers
Supported IDEs
| IDE | Config Path | Write-Back |
|---|---|---|
| Claude Code | ~/.claude.json |
✅ |
| Claude Desktop | ~/.config/Claude/claude_desktop_config.json |
✅ |
| Cursor | ~/.cursor/mcp.json |
✅ |
| Windsurf | ~/.windsurf/mcp_config.json |
✅ |
| Project-level | .mcp.json (walks parent dirs) |
✅ |
Transport Types
- stdio — local subprocess, JSON-RPC over stdin/stdout
- sse — Server-Sent Events over HTTP
- http — HTTP POST JSON-RPC
Status
- Read-only config discovery across 5 IDE configs
- Async health checks with timeout
- JSON registry with add/remove
- YAML/JSON export/import
- Protocol handshake testing
- Config write-back (atomic, with backups)
- Project-scoped
.mcp-manager.ymlsupport - Deep health checks (dependency validation +
tools/listverification) - Server auto-restart monitor
- CI gate (
mcp-manager validate+ GitHub Action) - Server marketplace / remote registry
See ROADMAP.md for what's next.
Contributing
git clone https://github.com/AreteDriver/mcp-manager.git
cd mcp-manager
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
Preflight Checklist (required before PR)
# 1. Linting & formatting
ruff check .
ruff format --check
# 2. Type checking
mypy src/mcp_manager
# 3. Tests with coverage (must be ≥80%)
pytest --cov=mcp_manager --cov-fail-under=80
# 4. Security audit
pip-audit
CI enforces all of the above. PRs that fail any gate will not merge.
Discord — Join the community
Part of the AreteDriver AI tooling ecosystem.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file arete_mcp-0.3.0.tar.gz.
File metadata
- Download URL: arete_mcp-0.3.0.tar.gz
- Upload date:
- Size: 51.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e47bb16f9cc9a808aaa87465750eb5aca2a9028fad0c4ca61665188304fc6c54
|
|
| MD5 |
19960e8d184d5056d422062b7ed9ea4d
|
|
| BLAKE2b-256 |
fa8f557cd1d92e766ba7f3bf4be3bd58c4dd7983c50981eb35bdbb484c336c97
|
Provenance
The following attestation bundles were made for arete_mcp-0.3.0.tar.gz:
Publisher:
release.yml on AreteDriver/mcp-manager
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
arete_mcp-0.3.0.tar.gz -
Subject digest:
e47bb16f9cc9a808aaa87465750eb5aca2a9028fad0c4ca61665188304fc6c54 - Sigstore transparency entry: 2204777475
- Sigstore integration time:
-
Permalink:
AreteDriver/mcp-manager@c292c70f8bc576d50ffafa3a76362ce422c11f0f -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/AreteDriver
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c292c70f8bc576d50ffafa3a76362ce422c11f0f -
Trigger Event:
push
-
Statement type:
File details
Details for the file arete_mcp-0.3.0-py3-none-any.whl.
File metadata
- Download URL: arete_mcp-0.3.0-py3-none-any.whl
- Upload date:
- Size: 35.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
df2f0102e725ee0b6d00769519110e0d60397c52e89641048fd96dc9c19f1527
|
|
| MD5 |
4e67565ddc20cad7e718ae667715167f
|
|
| BLAKE2b-256 |
5ab14b7a55d28498d383cbcacdf5905c1c9b270bad6ef89f2d252f20011b90a2
|
Provenance
The following attestation bundles were made for arete_mcp-0.3.0-py3-none-any.whl:
Publisher:
release.yml on AreteDriver/mcp-manager
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
arete_mcp-0.3.0-py3-none-any.whl -
Subject digest:
df2f0102e725ee0b6d00769519110e0d60397c52e89641048fd96dc9c19f1527 - Sigstore transparency entry: 2204777493
- Sigstore integration time:
-
Permalink:
AreteDriver/mcp-manager@c292c70f8bc576d50ffafa3a76362ce422c11f0f -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/AreteDriver
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c292c70f8bc576d50ffafa3a76362ce422c11f0f -
Trigger Event:
push
-
Statement type: