MCP Manager
Universal MCP Server Manager — add, remove, monitor, and configure all your MCP servers from one place.
Features
- 7 harnesses — OpenCode, Claude Desktop, Cursor, Windsurf, Cline, Zed, Continue.dev
- 23 tools — server management, health checks, token rotation, cross-harness sync
- 20+ server catalog — GitHub, Supabase, Playwright, Docker, PostgreSQL, and more
- Encrypted tokens — Fernet AES-128-CBC with PBKDF2 key derivation
- Cross-harness sync — migrate servers between different AI coding tools
Quick Start
git clone https://github.com/kobramantra-debug/mcp-manager-mcp-manage.git
cd mcp-manager-mcp-manage
pip install -e .
Installation
From source
git clone https://github.com/kobramantra-debug/mcp-manager-mcp-manage.git
cd mcp-manager-mcp-manage
pip install -e .
Docker
docker build -t mcp-manager .
Configuration
Environment Variables
| Variable | Default | Description |
|---|---|---|
MCP_HARNESS |
opencode |
Active harness to manage |
MCP_CONFIG_PATH |
(auto-detected) | Override config file path |
MCP_MANAGER_MASTER_PASSWORD |
(none) | Master password for Fernet encryption |
OpenCode
Add to ~/.config/opencode/opencode.json:
{
"mcp": {
"mcp-manager": {
"type": "local",
"command": ["python", "-m", "src"],
"cwd": "/path/to/mcp-manager",
"enabled": true
}
}
}
Claude Desktop
Add to %APPDATA%/Claude/claude_desktop_config.json:
{
"mcpServers": {
"mcp-manager": {
"command": "python",
"args": ["-m", "src"],
"cwd": "/path/to/mcp-manager"
}
}
}
Cursor
Add to ~/.cursor/mcp.json:
{
"mcpServers": {
"mcp-manager": {
"command": "python",
"args": ["-m", "src"],
"cwd": "/path/to/mcp-manager"
}
}
}
Docker (STDIO)
{
"mcp": {
"mcp-manager": {
"type": "docker",
"command": ["docker", "run", "-i", "--rm", "mcp-manager"],
"enabled": true
}
}
}
Examples
1. List all harnesses and see which are installed
list_harnesses_info()
{
"harnesses": [
{"id": "opencode", "name": "OpenCode", "installed": true, "is_active": true},
{"id": "claude-desktop", "name": "Claude Desktop", "installed": true, "is_active": false},
{"id": "cursor", "name": "Cursor", "installed": false, "is_active": false},
{"id": "windsurf", "name": "Windsurf", "installed": false, "is_active": false},
{"id": "cline", "name": "Cline", "installed": false, "is_active": false},
{"id": "zed", "name": "Zed", "installed": false, "is_active": false},
{"id": "continue", "name": "Continue.dev", "installed": false, "is_active": false}
],
"active": "opencode",
"installed_count": 2
}
2. Switch to Claude Desktop and list its servers
switch_harness("claude-desktop")
list_servers()
{
"harness": "Claude Desktop",
"servers": [
{"name": "github", "enabled": true, "type": "docker"},
{"name": "playwright", "enabled": true, "type": "npx"}
],
"count": 2
}
3. Add GitHub MCP server from the catalog
add_from_catalog("github")
{
"success": true,
"action": "added",
"server": "github",
"harness": "OpenCode",
"catalog_entry": "github",
"config": {
"type": "docker",
"command": ["docker", "run", "-i", "--rm", "-e", "GITHUB_TOKEN={env:GITHUB_TOKEN}", "ghcr.io/github/github-mcp-server"],
"enabled": true
}
}
4. Add a custom remote server
add_server(
name="my-api",
server_type="remote",
url="https://api.example.com/mcp",
env_vars="API_KEY=sk-123,BASE_URL=https://api.example.com"
)
{
"success": true,
"action": "added",
"server": "my-api",
"config": {
"type": "remote",
"url": "https://api.example.com/mcp",
"environment": {"API_KEY": "sk-123", "BASE_URL": "https://api.example.com"},
"enabled": true
}
}
5. Run health check on all servers
health_check()
{
"harness": "opencode",
"summary": {"total": 3, "healthy": 2, "unhealthy": 1, "unknown": 0, "timeout": 0},
"results": {
"github": {"status": "healthy", "message": "Server: github-mcp-server", "latency_ms": 1250.3},
"playwright": {"status": "healthy", "message": "Server: playwright", "latency_ms": 890.1},
"my-api": {"status": "unhealthy", "message": "No response (exit 1)", "latency_ms": 5000.0}
}
}
6. Sync all servers from OpenCode to Cursor
sync_to_harness("cursor")
{
"success": true,
"source": "OpenCode",
"target": "Cursor",
"servers_synced": 3,
"added": 3,
"updated": 0
}
7. Rotate a token with expiration
rotate_token("github", "ghp_new_token_abc123", expires_at="2026-12-31")
{
"success": true,
"action": "token_rotated",
"server": "github",
"preview": "ghp_***abc123",
"expires_at": "2026-12-31"
}
8. Search the server catalog
search_catalog("database")
{
"results": [
{"id": "postgres", "name": "PostgreSQL", "description": "PostgreSQL database server", "category": "database"},
{"id": "sqlite", "name": "SQLite", "description": "SQLite database server", "category": "database"}
],
"count": 2
}
9. Export config for a different harness
export_for_harness("claude-desktop")
{
"source_harness": "opencode",
"target_harness": "claude-desktop",
"config": {
"mcpServers": {
"github": {"command": "docker", "args": ["run", "-i", "--rm", "ghcr.io/github/github-mcp-server"]},
"playwright": {"command": "npx", "args": ["-y", "@anthropic/playwright-mcp"]}
}
},
"note": "Import this JSON into Claude Desktop"
}
10. List all stored tokens (safe — previews only)
list_all_tokens()
{
"tokens": {
"github": {"token_preview": "ghp_***abc123", "storage_backend": "encrypted_sqlite"},
"supabase": {"token_preview": "sb-***xyz789", "storage_backend": "encrypted_sqlite"}
},
"count": 2
}
Tools Reference
Harness Management
| Tool | Description |
|---|---|
list_harnesses_info |
List all harnesses and installation status |
switch_harness |
Switch active harness |
get_active_harness |
Get current harness info |
Server Management
| Tool | Description |
|---|---|
list_servers |
List configured servers |
add_server |
Add a new server |
remove_server |
Remove a server |
get_server_detail |
Get server details |
enable_server |
Enable a disabled server |
disable_server |
Disable a server |
Health & Monitoring
| Tool | Description |
|---|---|
test_connection |
Test a single server |
health_check |
Test all servers |
get_logs |
Get health check history |
Token Management
| Tool | Description |
|---|---|
rotate_token |
Update API token |
retrieve_token |
Get decrypted token (use with caution) |
list_all_tokens |
List stored tokens (previews only) |
get_token_history |
Get rotation history |
list_token_backends |
Show encryption status |
Export / Import / Sync
| Tool | Description |
|---|---|
export_config |
Export config as JSON |
import_config |
Import config from JSON |
export_for_harness |
Export in another harness format |
sync_to_harness |
Sync servers to another harness |
Catalog
| Tool | Description |
|---|---|
search_catalog |
Search server catalog |
add_from_catalog |
Add server from catalog |
Supported Harnesses
| Harness | Config Path | Format |
|---|---|---|
| OpenCode | ~/.config/opencode/opencode.json |
mcp (keyed object) |
| Claude Desktop | %APPDATA%/Claude/claude_desktop_config.json |
mcpServers (keyed object) |
| Cursor | ~/.cursor/mcp.json |
mcpServers (keyed object) |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
mcpServers (keyed object) |
| Cline | %APPDATA%/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json |
mcpServers (keyed object) |
| Zed | %APPDATA%/Zed/settings.json |
context_servers (nested object) |
| Continue.dev | ~/.continue/config.json |
mcpServers (array) |
Server Catalog
| Server | Type | Description |
|---|---|---|
| github | docker | GitHub MCP Server |
| supabase | npx | Supabase MCP Server |
| playwright | npx | Playwright browser automation |
| chrome-devtools | npx | Chrome DevTools Protocol |
| context7 | npx | Context7 documentation lookup |
| filesystem | local | Filesystem access |
| git | local | Git operations |
| postgres | npx | PostgreSQL database |
| sqlite | npx | SQLite database |
| docker | local | Docker management |
| brave-search | npx | Brave Search API |
| fetch | npx | HTTP fetch tool |
| memory | local | Knowledge graph memory |
| slack | npx | Slack workspace integration |
| gdrive | npx | Google Drive access |
| google-maps | npx | Google Maps API |
| puppeteer | npx | Puppeteer browser automation |
| everything | npx | Universal search |
| stitch | npx | Stitch UI design |
Token Security
Tokens are stored in an encrypted SQLite database using Fernet (AES-128-CBC).
Set MCP_MANAGER_MASTER_PASSWORD to enable encryption:
# Linux/macOS
export MCP_MANAGER_MASTER_PASSWORD="your-secure-password"
# Windows
set MCP_MANAGER_MASTER_PASSWORD=your-secure-password
Without a master password, tokens are stored in plaintext (not recommended for production).
License
MIT License — see LICENSE for details.
Metadata
Release files for mcp-manager-universal 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mcp_manager_universal-0.1.0.tar.gz | 24.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mcp_manager_universal-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 49.4 kB
Release files / mcp_manager_universal-0.1.0.tar.gz
| Download URL | mcp_manager_universal-0.1.0.tar.gz |
|---|---|
| Size | 24.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
898bc2d71f7061159aac6d8ee1278afa4a5dcff0fddead8e60adf7a85e99da65
|
|
BLAKE2b-256 checksum How to use checksums |
22e665bb266b8c3c2eb67d00cae534fd1231788d91f875df4a1a3bb9592ee49e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logRelease files / mcp_manager_universal-0.1.0-py3-none-any.whl
| Download URL | mcp_manager_universal-0.1.0-py3-none-any.whl |
|---|---|
| Size | 24.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9e07568c703c0bd9d20b7f2fae9a1ee97aaad817188eef2eceec92b2d923703a
|
|
BLAKE2b-256 checksum How to use checksums |
1a4f7997ad75ea24fb7fe6ac5ee3539dda2b25963c7406e20ff4d8dcaebfca8a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency log