Mcp Manager — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Mcp Manager (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
One CLI to discover, diagnose, health-check, and sync MCP servers across Codex, Claude Code, Cursor, Windsurf, and more.
Think of it as docker-compose for MCP — a single .mcp-manager.yml in your repo that describes which AI tools your project needs, with one command to sync them to every IDE your team uses.
This branch is the integrated v1.0.0 release candidate. Publication and real-client acceptance are still pending; installing from PyPI does not install this candidate until the release is published. It manages configuration and diagnostics; it does not host MCP servers or guarantee the behavior of third-party servers and clients. See Status, Production Readiness, and Security for the supported contract.
The Model Context Protocol (MCP) is the open standard for connecting AI agents to external tools — databases, browsers, filesystems, APIs. But every IDE stores MCP configs differently, and there's no way to share them across a team.
mcp-manager gives you:
.mcp-manager.yml) committed with your codemcp-manager sync --ide cursor)mcp-manager init — detects IDE, imports servers, scaffolds configNo more manual copy-paste. No more "works on my machine" for AI tool configs.
mcp-manager demo
You use Codex, Claude Code, Cursor, and Windsurf. Each stores MCP servers in a different location, scope, or dialect.
~/.claude.json
~/.cursor/mcp.json
~/.codeium/windsurf/mcp_config.json
~/.codex/config.tomlYour 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.
# Install
pip install arete-mcp
# See every MCP server across every IDE
mcp-manager list
# See supported targets and diagnose stale paths or missing env vars
mcp-manager targets
mcp-manager doctor
# 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 cursormcp-manager connects client-specific configuration formats through one typed McpServer model. The CLI dispatches to command handlers, which coordinate the configuration and diagnostic paths below.
flowchart TB
clients["Existing client configs<br/>JSON / TOML"]
project["Project config<br/>.mcp-manager.yml"]
subgraph manager["mcp-manager"]
discovery["Read-only discovery<br/>Client adapters"]
loader["Project config loader"]
model["McpServer<br/>Shared typed model"]
checks["Diagnostics<br/>Health + protocol probes"]
writeback["Writeback + adapters<br/>Validate + render"]
discovery --> model
loader --> model
model --> checks
model --> writeback
end
clients --> discovery
project --> loader
checks --> servers["MCP servers<br/>stdio / HTTP / SSE"]
writeback --> output["Updated client configs<br/>Backup + atomic replacement"]Arrows show the main configuration and diagnostic flows. Parsing and rendering use the same adapter layer; diagnostics connect to or launch the configured servers.
discovery.py reads client configs;project_config.py loads project YAML. sync uses discovered client configs, while project export uses .mcp-manager.yml.
health.py runs transport-specific checks;compatibility.py probes protocol compatibility through the MCP SDK.
adapters/ owns client dialects andtranslation capabilities; writeback.py provides previews, backups, and atomic writes for Codex, Claude Code, Claude Desktop, Cursor, and Windsurf.
Supporting modules handle registries, marketplace installs, authentication, version locks, and process monitoring.
| mcp-manager | Manual Config | |
|---|---|---|
| Share via git | ✅ .mcp-manager.yml committed with code | ❌ Per-IDE JSON scattered in home dirs |
| Switch projects | ✅ One command: mcp-manager sync --ide cursor | ❌ Manual copy-paste between configs |
| Team onboarding | ✅ mcp-manager init detects IDE + imports | ❌ Everyone configures manually |
| Health verification | ✅ Deep checks: tools/list, deps on PATH | ❌ "Looks like it started" |
| Rollback | ✅ Atomic write + backup | ❌ Direct overwrite |
| CI gate | ✅ mcp-manager validate --strict | ❌ Nothing |
| mcp-manager | Other Managers | |
|---|---|---|
| Config lives in repo | ✅ .mcp-manager.yml committed with your code | ❌ Global client-native config 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-client discovery | ✅ Reads Codex, Claude, Cursor, Windsurf, and project-scoped configs | ⚠️ Partial coverage |
Reads MCP server configs from:
~/.claude.json)~/.cursor/mcp.json)~/.codeium/windsurf/mcp_config.json)~/.codex/config.toml).mcp.json, walks parent dirs)node, python, docker on PATH) + verify tools/list returns non-emptymcp-manager health.mcp-manager-backup created before any modificationDiscover and install curated MCP servers without hunting through GitHub:
# Search for servers by name or category
mcp-manager search filesystem
mcp-manager search --category Database
# View details before installing
mcp-manager info postgres
# Add a server to your project config (interactive env var prompts)
mcp-manager install postgres
mcp-manager install slack --no-prompt # skip prompts, keep ${VAR} placeholdersShipped with 6 official MCP reference servers. Verified servers are shown by default; use --include-unverified to browse the full catalog.
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}${VAR}) resolved at load timePin exact MCP server versions for reproducible CI and team consistency:
mcp-manager lock # Resolve and write .mcp-manager.lock
mcp-manager lock --check # Validate lockfile is current (CI gate)
mcp-manager lock --json # Output resolved versions as JSONThe lockfile records the resolved npm version for each npx-based server so every developer and CI runner uses identical tooling.
Portable YAML/JSON for backup, sharing, and CI:
mcp-manager export servers.yaml
mcp-manager import servers.yamlKeep stdio MCP servers alive in development:
mcp-manager monitor --project .mcp-manager monitor --jsonTest whether your IDE's permission prompts faithfully display what MCP tools actually do — the only tool in the ecosystem that tests the display layer, not just the protocol layer.
# List built-in probe specs
mcp-manager audit list
# Generate a markdown runbook for manual verification
mcp-manager audit runbook --output runbook.md
# Start the benign probe MCP server
mcp-manager audit serveBuilt-in probes cover HackerOne Category 3: tool/parameter misrepresentation in permission prompts. Each probe registers misleading metadata but returns a safe JSON marker — no actual behavior is executed. Supports custom --probe-spec YAML files for private threat models.
Validate .mcp-manager.yml on every PR:
# .github/workflows/mcp-validate.yml
- uses: AreteDriver/mcp-manager@v1
with:
path: "."
strict: "false"Catches missing env vars, broken commands, and (with --strict) failing servers before merge.
# 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
# Probe MCP 2026-07-28 discovery, caching, and legacy fallback
mcp-manager doctor --protocol my-server
mcp-manager doctor --protocol my-server --strict-modern --json
# Deep health check — validate dependencies and verify tools/list
mcp-manager health --deep
# Show server-to-IDE mapping
mcp-manager map
# Search and install from the marketplace
mcp-manager search filesystem
mcp-manager info postgres
mcp-manager install postgres
# 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
mcp-manager sync --ide codex --dry-run
# Write a client-native project config instead of a user config
mcp-manager sync --ide codex --scope project --project . --create
# 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
# Lockfile — pin exact versions
mcp-manager lock # Resolve and write .mcp-manager.lock
mcp-manager lock --check # Validate lockfile is current (CI gate)
# Permission-prompt security audit
mcp-manager audit list # Show all built-in audit probes
mcp-manager audit runbook # Run full permission-prompt audit
mcp-manager audit serve # Start an MCP server that runs the auditAuthenticate against private registries so registry diff and registry pull can fetch server definitions behind HTTP Basic or Bearer auth.
# Store a Bearer token (validates via HEAD request before saving)
mcp-manager registry login https://reg.example.com/mcp.yaml --token ghp_xxx
# Store Basic auth credentials
mcp-manager registry login https://reg.example.com/mcp.yaml --user alice --password secret
# List stored profiles (credentials are masked)
mcp-manager registry auth-list
# Remove a profile
mcp-manager registry logout https://reg.example.com/mcp.yamlCredentials are stored in ~/.mcp-manager/auth.json with 0o600 permissions. You can override the path with MCP_MANAGER_AUTH_FILE.
Auth priority chain (highest wins):
--token, --user)MCP_MANAGER_REGISTRY_TOKEN, MCP_MANAGER_REGISTRY_USER / PASSWORD)⚠️ Security note: passing --token on the CLI is insecure — it appears in shell history and ps output. Prefer registry login (stored credentials) or env vars.
| Target | User Config | Project Config | Format | Write-Back |
|---|---|---|---|---|
| Codex | ~/.codex/config.toml | .codex/config.toml | TOML | ✅ |
| Claude Code | ~/.claude.json | .mcp.json | JSON | ✅ |
| Claude Desktop | Platform-specific | — | JSON | ✅ |
| Cursor | ~/.cursor/mcp.json | .cursor/mcp.json | JSON | ✅ |
| Windsurf | ~/.codeium/windsurf/mcp_config.json | — | JSON | ✅ |
Run mcp-manager targets for the installed version's exact capability matrix.
.mcp-manager.yml supporttools/list verification)mcp-manager validate + GitHub Action)mcp-manager lock --check)extends:) for shared team configs--tag / --exclude-tag filtersmcp-manager init)mcp-manager template list / use)registry login / logout / auth-list)mcp-manager audit)targets, doctor)See ROADMAP.md for what's next.
git clone https://github.com/AreteDriver/mcp-manager.git
cd mcp-manager
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"# 1. Linting & formatting
ruff check .
ruff format --check
# 2. Type checking
mypy src/mcp_manager
# 3. Tests with coverage (must be ≥87%)
pytest --cov=mcp_manager --cov-fail-under=87
# 4. Security audit
pip-audit --strict --desc=on .
bandit -r src -llCI enforces all of the above. PRs that fail any gate will not merge.
MCP servers register tools with names and descriptions that appear in permission prompts. A malicious or buggy server can misrepresent what a tool actually does — e.g., register a tool as "read_file" that actually executes shell commands.
mcp-manager audit tests this display layer with safe, built-in probes:
# List all built-in probes (HackerOne-style categories)
mcp-manager audit list
# Run the full audit runbook against a target server
mcp-manager audit runbook --target ./my-server
# Start an MCP server that exposes the audit as a tool
mcp-manager audit serveAll probes use benign handlers — they register misleading metadata but return safe JSON markers. No actual harmful behavior is performed. This makes the audit safe to run against production configs.
pip install ai-spend)pip install agentlinter)Discord — Join the community
Part of the [AreteDriver](https://github.com/AreteDriver) AI tooling ecosystem.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.