Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 8 additions & 33 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,11 @@ curl -fsSL https://raw.githubusercontent.com/Edison-Watch/open-edison/main/curl_

Run locally with uvx: `uvx open-edison`

Optionally, import your existing MCP configs from Cursor, VS Code, or Claude Code with:
Optionally, run the setup wizard to import/configure MCP:

```bash
# From source (no install) — quick one-liner (add --dry-run to preview)
uv run python -m mcp_importer.quick_cli --yes
uv run python -m src.setup_tui.main
# add --dry-run to preview without writing
```

<details>
Expand Down Expand Up @@ -107,38 +107,13 @@ OPEN_EDISON_CONFIG_DIR=~/edison-config open-edison run
<details>
<summary>🔄 Import from Cursor/VS Code/Claude Code</summary>

### Import from Cursor/VS Code/Claude Code
Run the interactive setup wizard to detect clients, import servers, and configure your editor:

- **CLI**

- Import & configure to use edison as your MCP server:

```bash
# From source (no install)
uv run python -m mcp_importer.quick_cli --yes
```

- Preview what will be imported (no writes):

```bash
uv run python -m mcp_importer --source cursor --dry-run
```

- Import servers into Open Edison `config.json` (merge policy defaults to `skip`):

```bash
uv run python -m mcp_importer --source cursor
uv run python -m mcp_importer --source vscode
uv run python -m mcp_importer --source claude-code
```

- Point your editor to Open Edison (backup original config and replace with a single Open Edison server):
```bash
uv run python -m src.setup_tui.main
```

```bash
uv run python -m mcp_importer export --target cursor --yes
uv run python -m mcp_importer export --target vscode --yes
uv run python -m mcp_importer export --target claude-code --yes
```
Use `--dry-run` to preview without writing.

</details>

Expand Down
43 changes: 38 additions & 5 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-github"
"@github/mcp-server-github"
],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "your-github-token-here"
"GITHUB_TOKEN": "your-github-token-here"
},
"enabled": false
},
Expand All @@ -62,11 +62,10 @@
"command": "npx",
"args": [
"-y",
"@supabase/mcp-server"
"@supabase/mcp-server-supabase@latest"
],
"env": {
"SUPABASE_URL": "https://YOUR_PROJECT.supabase.co",
"SUPABASE_ANON_KEY": "your-supabase-anon-key"
"SUPABASE_ACCESS_TOKEN": "your-supabase-access-token"
},
"enabled": false
},
Expand All @@ -81,6 +80,40 @@
"env": {},
"enabled": false
},
{
"name": "figma",
"command": "npx",
"args": [
"-y",
"figma-developer-mcp",
"--stdio"
],
"env": {
"FIGMA_API_KEY": "your-figma-api-key"
},
"enabled": false
},
{
"name": "figma_dev_mode",
"command": "npx",
"args": [
"-y",
"mcp-remote",
"http://127.0.0.1:3845/sse"
],
"env": {},
"enabled": false
},
{
"name": "playwright",
"command": "npx",
"args": [
"-y",
"@automatalabs/mcp-server-playwright"
],
"env": {},
"enabled": false
},
{
"name": "google_drive",
"command": "npx",
Expand Down
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "open-edison"
version = "0.1.42"
version = "0.1.44"
description = "Open-source MCP security, aggregation, and monitoring. Single-user, self-hosted MCP proxy."
readme = "README.md"
authors = [
Expand All @@ -22,6 +22,7 @@ dependencies = [
"opentelemetry-sdk>=1.36.0",
"opentelemetry-exporter-otlp>=1.36.0",
"hatchling>=1.27.0",
"questionary>=2.1.1",
]
requires-python = ">= 3.12"

Expand Down Expand Up @@ -83,7 +84,6 @@ include = [
"docs/**",
]


[tool.hatch.build.targets.sdist.hooks.custom]
path = "hatch_build.py"

Expand Down
49 changes: 8 additions & 41 deletions src/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@
import asyncio
import os
import subprocess as _subprocess
import sys
from contextlib import suppress
from pathlib import Path
from typing import Any, NoReturn, cast
from typing import Any, NoReturn

from loguru import logger as _log # type: ignore[reportMissingImports]

from .config import Config, get_config_dir, get_config_json_path
from .server import OpenEdisonProxy
from src.config import Config, get_config_dir, get_config_json_path
from src.mcp_importer.cli import run_cli
from src.server import OpenEdisonProxy

log: Any = _log

Expand Down Expand Up @@ -45,7 +45,7 @@ def _parse_args(argv: list[str] | None = None) -> argparse.Namespace:
# import-mcp: import MCP servers from other tools into config.json
sp_import = subparsers.add_parser(
"import-mcp",
help="Import MCP servers from other tools (Cursor, Windsurf, Cline, Claude Desktop, etc.)",
help="Import MCP servers from other tools (Cursor, VS Code, Claude Code)",
description=(
"Import MCP server configurations from other tools into Open Edison config.json.\n"
"Use --source to choose the tool and optional flags to control merging."
Expand All @@ -55,16 +55,10 @@ def _parse_args(argv: list[str] | None = None) -> argparse.Namespace:
"--source",
choices=[
"cursor",
"windsurf",
"cline",
"claude-desktop",
"vscode",
"claude-code",
"gemini-cli",
"codex",
"interactive",
],
default="interactive",
default="cursor",
help="Source application to import from",
)
sp_import.add_argument(
Expand Down Expand Up @@ -226,35 +220,8 @@ def main(argv: list[str] | None = None) -> NoReturn: # noqa: C901
raise SystemExit(exit_code)

if getattr(args, "command", None) == "import-mcp":
# Defer-import importer package (lives under repository scripts/)
importer_pkg = Path(__file__).parent.parent / "scripts" / "mcp_importer"
try:
if str(importer_pkg) not in sys.path:
sys.path.insert(0, str(importer_pkg))
from mcp_importer.cli import run_cli # type: ignore
except Exception as imp_exc: # noqa: BLE001
log.error(
"Failed to load MCP importer package from {}: {}",
importer_pkg,
imp_exc,
)
raise SystemExit(1) from imp_exc

importer_argv: list[str] = []
if args.source:
importer_argv += ["--source", str(args.source)]
if getattr(args, "config_dir", None):
importer_argv += [
"--config-dir",
str(Path(args.config_dir).expanduser().resolve()),
]
if args.merge:
importer_argv += ["--merge", str(args.merge)]
if bool(getattr(args, "dry_run", False)):
importer_argv += ["--dry-run"]

rc_val: int = int(cast(Any, run_cli)(importer_argv))
raise SystemExit(rc_val)
result_code = run_cli(argv)
raise SystemExit(result_code)

# default: run server (top-level flags)
try:
Expand Down
Loading