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.
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 mcp_manager_universal-0.1.0.tar.gz.
File metadata
- Download URL: mcp_manager_universal-0.1.0.tar.gz
- Upload date:
- Size: 24.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
898bc2d71f7061159aac6d8ee1278afa4a5dcff0fddead8e60adf7a85e99da65
|
|
| MD5 |
29ffbb692f50e88f3b60bf2867134b0b
|
|
| BLAKE2b-256 |
22e665bb266b8c3c2eb67d00cae534fd1231788d91f875df4a1a3bb9592ee49e
|
Provenance
The following attestation bundles were made for mcp_manager_universal-0.1.0.tar.gz:
Publisher:
publish.yml on kobramantra-debug/mcp-manager-mcp-manage
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcp_manager_universal-0.1.0.tar.gz -
Subject digest:
898bc2d71f7061159aac6d8ee1278afa4a5dcff0fddead8e60adf7a85e99da65 - Sigstore transparency entry: 2605761370
- Sigstore integration time:
-
Permalink:
kobramantra-debug/mcp-manager-mcp-manage@65fcb04d2c25bbcde6b32e84b443dc1391d79296 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/kobramantra-debug
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@65fcb04d2c25bbcde6b32e84b443dc1391d79296 -
Trigger Event:
release
-
Statement type:
File details
Details for the file mcp_manager_universal-0.1.0-py3-none-any.whl.
File metadata
- Download URL: mcp_manager_universal-0.1.0-py3-none-any.whl
- Upload date:
- Size: 24.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9e07568c703c0bd9d20b7f2fae9a1ee97aaad817188eef2eceec92b2d923703a
|
|
| MD5 |
bb6d99b98a97a21b1fbd9a1116705298
|
|
| BLAKE2b-256 |
1a4f7997ad75ea24fb7fe6ac5ee3539dda2b25963c7406e20ff4d8dcaebfca8a
|
Provenance
The following attestation bundles were made for mcp_manager_universal-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on kobramantra-debug/mcp-manager-mcp-manage
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcp_manager_universal-0.1.0-py3-none-any.whl -
Subject digest:
9e07568c703c0bd9d20b7f2fae9a1ee97aaad817188eef2eceec92b2d923703a - Sigstore transparency entry: 2605761481
- Sigstore integration time:
-
Permalink:
kobramantra-debug/mcp-manager-mcp-manage@65fcb04d2c25bbcde6b32e84b443dc1391d79296 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/kobramantra-debug
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@65fcb04d2c25bbcde6b32e84b443dc1391d79296 -
Trigger Event:
release
-
Statement type: