open-edison 0.1.42__tar.gz → 0.1.44__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {open_edison-0.1.42 → open_edison-0.1.44}/PKG-INFO +10 -34
- {open_edison-0.1.42 → open_edison-0.1.44}/README.md +8 -33
- {open_edison-0.1.42 → open_edison-0.1.44}/config.json +38 -5
- {open_edison-0.1.42 → open_edison-0.1.44}/hatch_build.py +17 -19
- {open_edison-0.1.42 → open_edison-0.1.44}/pyproject.toml +9 -3
- {open_edison-0.1.42 → open_edison-0.1.44}/src/cli.py +8 -41
- open_edison-0.1.44/src/frontend_dist/assets/index-BUUcUfTt.js +51 -0
- open_edison-0.1.44/src/frontend_dist/assets/index-o6_8mdM8.css +1 -0
- open_edison-0.1.44/src/frontend_dist/index.html +21 -0
- open_edison-0.1.44/src/frontend_dist/sw.js +71 -0
- open_edison-0.1.44/src/mcp_importer/api.py +204 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/quick_cli.py +12 -15
- {open_edison-0.1.42 → open_edison-0.1.44}/src/oauth_manager.py +1 -1
- open_edison-0.1.44/src/setup_tui/__init__.py +5 -0
- open_edison-0.1.44/src/setup_tui/main.py +157 -0
- open_edison-0.1.42/src/mcp_importer/api.py +0 -106
- {open_edison-0.1.42 → open_edison-0.1.44}/.gitignore +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/LICENSE +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/desktop_ext/README.md +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/docs/README.md +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/docs/architecture/single_user_design.md +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/docs/core/configuration.md +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/docs/core/project_structure.md +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/docs/core/proxy_usage.md +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/docs/deployment/docker.md +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/docs/deployment/local.md +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/docs/development/contributing.md +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/docs/development/development_guide.md +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/docs/development/testing.md +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/docs/quick-reference/api_reference.md +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/docs/quick-reference/config_quick_start.md +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/installation_test/README.md +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/prompt_permissions.json +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/resource_permissions.json +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/__init__.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/__main__.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/config.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/config.pyi +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/events.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/__init__.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/__main__.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/cli.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/export_cli.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/exporters.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/import_api.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/importers.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/merge.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/parsers.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/paths.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/types.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/middleware/data_access_tracker.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/middleware/session_tracking.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/permissions.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/server.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/single_user_mcp.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/src/telemetry.py +0 -0
- {open_edison-0.1.42 → open_edison-0.1.44}/tool_permissions.json +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: open-edison
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.44
|
4
4
|
Summary: Open-source MCP security, aggregation, and monitoring. Single-user, self-hosted MCP proxy.
|
5
5
|
Author-email: Hugo Berg <hugo@edison.watch>
|
6
6
|
License-File: LICENSE
|
@@ -17,6 +17,7 @@ Requires-Dist: opentelemetry-exporter-otlp>=1.36.0
|
|
17
17
|
Requires-Dist: opentelemetry-sdk>=1.36.0
|
18
18
|
Requires-Dist: python-dotenv>=1.0.1
|
19
19
|
Requires-Dist: pyyaml>=6.0.2
|
20
|
+
Requires-Dist: questionary>=2.1.1
|
20
21
|
Requires-Dist: sqlalchemy>=2.0.41
|
21
22
|
Requires-Dist: starlette>=0.47.1
|
22
23
|
Requires-Dist: uvicorn>=0.35.0
|
@@ -72,11 +73,11 @@ curl -fsSL https://raw.githubusercontent.com/Edison-Watch/open-edison/main/curl_
|
|
72
73
|
|
73
74
|
Run locally with uvx: `uvx open-edison`
|
74
75
|
|
75
|
-
Optionally,
|
76
|
+
Optionally, run the setup wizard to import/configure MCP:
|
76
77
|
|
77
78
|
```bash
|
78
|
-
|
79
|
-
|
79
|
+
uv run python -m src.setup_tui.main
|
80
|
+
# add --dry-run to preview without writing
|
80
81
|
```
|
81
82
|
|
82
83
|
<details>
|
@@ -131,38 +132,13 @@ OPEN_EDISON_CONFIG_DIR=~/edison-config open-edison run
|
|
131
132
|
<details>
|
132
133
|
<summary>🔄 Import from Cursor/VS Code/Claude Code</summary>
|
133
134
|
|
134
|
-
|
135
|
+
Run the interactive setup wizard to detect clients, import servers, and configure your editor:
|
135
136
|
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
```bash
|
141
|
-
# From source (no install)
|
142
|
-
uv run python -m mcp_importer.quick_cli --yes
|
143
|
-
```
|
144
|
-
|
145
|
-
- Preview what will be imported (no writes):
|
146
|
-
|
147
|
-
```bash
|
148
|
-
uv run python -m mcp_importer --source cursor --dry-run
|
149
|
-
```
|
150
|
-
|
151
|
-
- Import servers into Open Edison `config.json` (merge policy defaults to `skip`):
|
152
|
-
|
153
|
-
```bash
|
154
|
-
uv run python -m mcp_importer --source cursor
|
155
|
-
uv run python -m mcp_importer --source vscode
|
156
|
-
uv run python -m mcp_importer --source claude-code
|
157
|
-
```
|
158
|
-
|
159
|
-
- Point your editor to Open Edison (backup original config and replace with a single Open Edison server):
|
137
|
+
```bash
|
138
|
+
uv run python -m src.setup_tui.main
|
139
|
+
```
|
160
140
|
|
161
|
-
|
162
|
-
uv run python -m mcp_importer export --target cursor --yes
|
163
|
-
uv run python -m mcp_importer export --target vscode --yes
|
164
|
-
uv run python -m mcp_importer export --target claude-code --yes
|
165
|
-
```
|
141
|
+
Use `--dry-run` to preview without writing.
|
166
142
|
|
167
143
|
</details>
|
168
144
|
|
@@ -48,11 +48,11 @@ curl -fsSL https://raw.githubusercontent.com/Edison-Watch/open-edison/main/curl_
|
|
48
48
|
|
49
49
|
Run locally with uvx: `uvx open-edison`
|
50
50
|
|
51
|
-
Optionally,
|
51
|
+
Optionally, run the setup wizard to import/configure MCP:
|
52
52
|
|
53
53
|
```bash
|
54
|
-
|
55
|
-
|
54
|
+
uv run python -m src.setup_tui.main
|
55
|
+
# add --dry-run to preview without writing
|
56
56
|
```
|
57
57
|
|
58
58
|
<details>
|
@@ -107,38 +107,13 @@ OPEN_EDISON_CONFIG_DIR=~/edison-config open-edison run
|
|
107
107
|
<details>
|
108
108
|
<summary>🔄 Import from Cursor/VS Code/Claude Code</summary>
|
109
109
|
|
110
|
-
|
110
|
+
Run the interactive setup wizard to detect clients, import servers, and configure your editor:
|
111
111
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
```bash
|
117
|
-
# From source (no install)
|
118
|
-
uv run python -m mcp_importer.quick_cli --yes
|
119
|
-
```
|
120
|
-
|
121
|
-
- Preview what will be imported (no writes):
|
122
|
-
|
123
|
-
```bash
|
124
|
-
uv run python -m mcp_importer --source cursor --dry-run
|
125
|
-
```
|
126
|
-
|
127
|
-
- Import servers into Open Edison `config.json` (merge policy defaults to `skip`):
|
128
|
-
|
129
|
-
```bash
|
130
|
-
uv run python -m mcp_importer --source cursor
|
131
|
-
uv run python -m mcp_importer --source vscode
|
132
|
-
uv run python -m mcp_importer --source claude-code
|
133
|
-
```
|
134
|
-
|
135
|
-
- Point your editor to Open Edison (backup original config and replace with a single Open Edison server):
|
112
|
+
```bash
|
113
|
+
uv run python -m src.setup_tui.main
|
114
|
+
```
|
136
115
|
|
137
|
-
|
138
|
-
uv run python -m mcp_importer export --target cursor --yes
|
139
|
-
uv run python -m mcp_importer export --target vscode --yes
|
140
|
-
uv run python -m mcp_importer export --target claude-code --yes
|
141
|
-
```
|
116
|
+
Use `--dry-run` to preview without writing.
|
142
117
|
|
143
118
|
</details>
|
144
119
|
|
@@ -38,10 +38,10 @@
|
|
38
38
|
"command": "npx",
|
39
39
|
"args": [
|
40
40
|
"-y",
|
41
|
-
"@
|
41
|
+
"@github/mcp-server-github"
|
42
42
|
],
|
43
43
|
"env": {
|
44
|
-
"
|
44
|
+
"GITHUB_TOKEN": "your-github-token-here"
|
45
45
|
},
|
46
46
|
"enabled": false
|
47
47
|
},
|
@@ -62,11 +62,10 @@
|
|
62
62
|
"command": "npx",
|
63
63
|
"args": [
|
64
64
|
"-y",
|
65
|
-
"@supabase/mcp-server"
|
65
|
+
"@supabase/mcp-server-supabase@latest"
|
66
66
|
],
|
67
67
|
"env": {
|
68
|
-
"
|
69
|
-
"SUPABASE_ANON_KEY": "your-supabase-anon-key"
|
68
|
+
"SUPABASE_ACCESS_TOKEN": "your-supabase-access-token"
|
70
69
|
},
|
71
70
|
"enabled": false
|
72
71
|
},
|
@@ -81,6 +80,40 @@
|
|
81
80
|
"env": {},
|
82
81
|
"enabled": false
|
83
82
|
},
|
83
|
+
{
|
84
|
+
"name": "figma",
|
85
|
+
"command": "npx",
|
86
|
+
"args": [
|
87
|
+
"-y",
|
88
|
+
"figma-developer-mcp",
|
89
|
+
"--stdio"
|
90
|
+
],
|
91
|
+
"env": {
|
92
|
+
"FIGMA_API_KEY": "your-figma-api-key"
|
93
|
+
},
|
94
|
+
"enabled": false
|
95
|
+
},
|
96
|
+
{
|
97
|
+
"name": "figma_dev_mode",
|
98
|
+
"command": "npx",
|
99
|
+
"args": [
|
100
|
+
"-y",
|
101
|
+
"mcp-remote",
|
102
|
+
"http://127.0.0.1:3845/sse"
|
103
|
+
],
|
104
|
+
"env": {},
|
105
|
+
"enabled": false
|
106
|
+
},
|
107
|
+
{
|
108
|
+
"name": "playwright",
|
109
|
+
"command": "npx",
|
110
|
+
"args": [
|
111
|
+
"-y",
|
112
|
+
"@automatalabs/mcp-server-playwright"
|
113
|
+
],
|
114
|
+
"env": {},
|
115
|
+
"enabled": false
|
116
|
+
},
|
84
117
|
{
|
85
118
|
"name": "google_drive",
|
86
119
|
"command": "npx",
|
@@ -16,12 +16,22 @@ class BuildHook(BuildHookInterface): # type: ignore
|
|
16
16
|
"""
|
17
17
|
|
18
18
|
def initialize(self, version: str, build_data: dict) -> None: # noqa: D401 # type: ignore
|
19
|
+
# For editable builds, just return without doing anything
|
20
|
+
# This prevents failures during `uv sync` in CI environments
|
21
|
+
if version == "editable":
|
22
|
+
return
|
23
|
+
|
24
|
+
# For wheel and sdist builds, ensure frontend assets are present
|
25
|
+
self._ensure_frontend_assets()
|
26
|
+
|
27
|
+
def _ensure_frontend_assets(self) -> None:
|
28
|
+
"""Ensure frontend assets are available for packaging."""
|
19
29
|
project_root = Path(self.root)
|
20
30
|
src_frontend_dist = project_root / "src" / "frontend_dist"
|
21
31
|
repo_frontend_dist = project_root / "frontend" / "dist"
|
22
32
|
|
23
33
|
# Always ensure frontend assets are available for packaging
|
24
|
-
# Fast path: already present in src/
|
34
|
+
# Fast path: already present in src/ with actual content
|
25
35
|
if (src_frontend_dist / "index.html").exists():
|
26
36
|
self.app.display_info("frontend_dist already present; skipping build/copy")
|
27
37
|
return
|
@@ -34,21 +44,9 @@ class BuildHook(BuildHookInterface): # type: ignore
|
|
34
44
|
self.app.display_info("Copied frontend/dist -> src/frontend_dist for packaging")
|
35
45
|
return
|
36
46
|
|
37
|
-
# If
|
38
|
-
# This
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
<html>
|
44
|
-
<head>
|
45
|
-
<title>Open Edison Dashboard</title>
|
46
|
-
<meta charset="utf-8">
|
47
|
-
</head>
|
48
|
-
<body>
|
49
|
-
<h1>Open Edison Dashboard</h1>
|
50
|
-
<p>Frontend assets not available. Run 'make build_package' to build the full dashboard.</p>
|
51
|
-
</body>
|
52
|
-
</html>"""
|
53
|
-
(src_frontend_dist / "index.html").write_text(placeholder_html)
|
54
|
-
self.app.display_info("Created minimal frontend placeholder for packaging")
|
47
|
+
# If we reach here, neither src/frontend_dist nor frontend/dist exist
|
48
|
+
# This should fail the build as requested
|
49
|
+
raise RuntimeError(
|
50
|
+
"Packaged dashboard (src/frontend_dist) missing and frontend/dist not found. "
|
51
|
+
"Run 'make build_package' to generate assets before packaging/uvx."
|
52
|
+
)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[project]
|
2
2
|
name = "open-edison"
|
3
|
-
version = "0.1.
|
3
|
+
version = "0.1.44"
|
4
4
|
description = "Open-source MCP security, aggregation, and monitoring. Single-user, self-hosted MCP proxy."
|
5
5
|
readme = "README.md"
|
6
6
|
authors = [
|
@@ -22,6 +22,7 @@ dependencies = [
|
|
22
22
|
"opentelemetry-sdk>=1.36.0",
|
23
23
|
"opentelemetry-exporter-otlp>=1.36.0",
|
24
24
|
"hatchling>=1.27.0",
|
25
|
+
"questionary>=2.1.1",
|
25
26
|
]
|
26
27
|
requires-python = ">= 3.12"
|
27
28
|
|
@@ -64,7 +65,10 @@ include = [
|
|
64
65
|
"prompt_permissions.json",
|
65
66
|
"docs/**",
|
66
67
|
]
|
67
|
-
|
68
|
+
artifacts = [
|
69
|
+
"src/frontend_dist/**",
|
70
|
+
]
|
71
|
+
|
68
72
|
|
69
73
|
[tool.hatch.build.targets.wheel.hooks.custom]
|
70
74
|
path = "hatch_build.py"
|
@@ -79,9 +83,11 @@ include = [
|
|
79
83
|
"resource_permissions.json",
|
80
84
|
"prompt_permissions.json",
|
81
85
|
"src/**",
|
82
|
-
"src/frontend_dist/**",
|
83
86
|
"docs/**",
|
84
87
|
]
|
88
|
+
artifacts = [
|
89
|
+
"src/frontend_dist/**",
|
90
|
+
]
|
85
91
|
|
86
92
|
|
87
93
|
[tool.hatch.build.targets.sdist.hooks.custom]
|
@@ -8,15 +8,15 @@ import argparse
|
|
8
8
|
import asyncio
|
9
9
|
import os
|
10
10
|
import subprocess as _subprocess
|
11
|
-
import sys
|
12
11
|
from contextlib import suppress
|
13
12
|
from pathlib import Path
|
14
|
-
from typing import Any, NoReturn
|
13
|
+
from typing import Any, NoReturn
|
15
14
|
|
16
15
|
from loguru import logger as _log # type: ignore[reportMissingImports]
|
17
16
|
|
18
|
-
from .config import Config, get_config_dir, get_config_json_path
|
19
|
-
from .
|
17
|
+
from src.config import Config, get_config_dir, get_config_json_path
|
18
|
+
from src.mcp_importer.cli import run_cli
|
19
|
+
from src.server import OpenEdisonProxy
|
20
20
|
|
21
21
|
log: Any = _log
|
22
22
|
|
@@ -45,7 +45,7 @@ def _parse_args(argv: list[str] | None = None) -> argparse.Namespace:
|
|
45
45
|
# import-mcp: import MCP servers from other tools into config.json
|
46
46
|
sp_import = subparsers.add_parser(
|
47
47
|
"import-mcp",
|
48
|
-
help="Import MCP servers from other tools (Cursor,
|
48
|
+
help="Import MCP servers from other tools (Cursor, VS Code, Claude Code)",
|
49
49
|
description=(
|
50
50
|
"Import MCP server configurations from other tools into Open Edison config.json.\n"
|
51
51
|
"Use --source to choose the tool and optional flags to control merging."
|
@@ -55,16 +55,10 @@ def _parse_args(argv: list[str] | None = None) -> argparse.Namespace:
|
|
55
55
|
"--source",
|
56
56
|
choices=[
|
57
57
|
"cursor",
|
58
|
-
"windsurf",
|
59
|
-
"cline",
|
60
|
-
"claude-desktop",
|
61
58
|
"vscode",
|
62
59
|
"claude-code",
|
63
|
-
"gemini-cli",
|
64
|
-
"codex",
|
65
|
-
"interactive",
|
66
60
|
],
|
67
|
-
default="
|
61
|
+
default="cursor",
|
68
62
|
help="Source application to import from",
|
69
63
|
)
|
70
64
|
sp_import.add_argument(
|
@@ -226,35 +220,8 @@ def main(argv: list[str] | None = None) -> NoReturn: # noqa: C901
|
|
226
220
|
raise SystemExit(exit_code)
|
227
221
|
|
228
222
|
if getattr(args, "command", None) == "import-mcp":
|
229
|
-
|
230
|
-
|
231
|
-
try:
|
232
|
-
if str(importer_pkg) not in sys.path:
|
233
|
-
sys.path.insert(0, str(importer_pkg))
|
234
|
-
from mcp_importer.cli import run_cli # type: ignore
|
235
|
-
except Exception as imp_exc: # noqa: BLE001
|
236
|
-
log.error(
|
237
|
-
"Failed to load MCP importer package from {}: {}",
|
238
|
-
importer_pkg,
|
239
|
-
imp_exc,
|
240
|
-
)
|
241
|
-
raise SystemExit(1) from imp_exc
|
242
|
-
|
243
|
-
importer_argv: list[str] = []
|
244
|
-
if args.source:
|
245
|
-
importer_argv += ["--source", str(args.source)]
|
246
|
-
if getattr(args, "config_dir", None):
|
247
|
-
importer_argv += [
|
248
|
-
"--config-dir",
|
249
|
-
str(Path(args.config_dir).expanduser().resolve()),
|
250
|
-
]
|
251
|
-
if args.merge:
|
252
|
-
importer_argv += ["--merge", str(args.merge)]
|
253
|
-
if bool(getattr(args, "dry_run", False)):
|
254
|
-
importer_argv += ["--dry-run"]
|
255
|
-
|
256
|
-
rc_val: int = int(cast(Any, run_cli)(importer_argv))
|
257
|
-
raise SystemExit(rc_val)
|
223
|
+
result_code = run_cli(argv)
|
224
|
+
raise SystemExit(result_code)
|
258
225
|
|
259
226
|
# default: run server (top-level flags)
|
260
227
|
try:
|