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.
Files changed (57) hide show
  1. {open_edison-0.1.42 → open_edison-0.1.44}/PKG-INFO +10 -34
  2. {open_edison-0.1.42 → open_edison-0.1.44}/README.md +8 -33
  3. {open_edison-0.1.42 → open_edison-0.1.44}/config.json +38 -5
  4. {open_edison-0.1.42 → open_edison-0.1.44}/hatch_build.py +17 -19
  5. {open_edison-0.1.42 → open_edison-0.1.44}/pyproject.toml +9 -3
  6. {open_edison-0.1.42 → open_edison-0.1.44}/src/cli.py +8 -41
  7. open_edison-0.1.44/src/frontend_dist/assets/index-BUUcUfTt.js +51 -0
  8. open_edison-0.1.44/src/frontend_dist/assets/index-o6_8mdM8.css +1 -0
  9. open_edison-0.1.44/src/frontend_dist/index.html +21 -0
  10. open_edison-0.1.44/src/frontend_dist/sw.js +71 -0
  11. open_edison-0.1.44/src/mcp_importer/api.py +204 -0
  12. {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/quick_cli.py +12 -15
  13. {open_edison-0.1.42 → open_edison-0.1.44}/src/oauth_manager.py +1 -1
  14. open_edison-0.1.44/src/setup_tui/__init__.py +5 -0
  15. open_edison-0.1.44/src/setup_tui/main.py +157 -0
  16. open_edison-0.1.42/src/mcp_importer/api.py +0 -106
  17. {open_edison-0.1.42 → open_edison-0.1.44}/.gitignore +0 -0
  18. {open_edison-0.1.42 → open_edison-0.1.44}/LICENSE +0 -0
  19. {open_edison-0.1.42 → open_edison-0.1.44}/desktop_ext/README.md +0 -0
  20. {open_edison-0.1.42 → open_edison-0.1.44}/docs/README.md +0 -0
  21. {open_edison-0.1.42 → open_edison-0.1.44}/docs/architecture/single_user_design.md +0 -0
  22. {open_edison-0.1.42 → open_edison-0.1.44}/docs/core/configuration.md +0 -0
  23. {open_edison-0.1.42 → open_edison-0.1.44}/docs/core/project_structure.md +0 -0
  24. {open_edison-0.1.42 → open_edison-0.1.44}/docs/core/proxy_usage.md +0 -0
  25. {open_edison-0.1.42 → open_edison-0.1.44}/docs/deployment/docker.md +0 -0
  26. {open_edison-0.1.42 → open_edison-0.1.44}/docs/deployment/local.md +0 -0
  27. {open_edison-0.1.42 → open_edison-0.1.44}/docs/development/contributing.md +0 -0
  28. {open_edison-0.1.42 → open_edison-0.1.44}/docs/development/development_guide.md +0 -0
  29. {open_edison-0.1.42 → open_edison-0.1.44}/docs/development/testing.md +0 -0
  30. {open_edison-0.1.42 → open_edison-0.1.44}/docs/quick-reference/api_reference.md +0 -0
  31. {open_edison-0.1.42 → open_edison-0.1.44}/docs/quick-reference/config_quick_start.md +0 -0
  32. {open_edison-0.1.42 → open_edison-0.1.44}/installation_test/README.md +0 -0
  33. {open_edison-0.1.42 → open_edison-0.1.44}/prompt_permissions.json +0 -0
  34. {open_edison-0.1.42 → open_edison-0.1.44}/resource_permissions.json +0 -0
  35. {open_edison-0.1.42 → open_edison-0.1.44}/src/__init__.py +0 -0
  36. {open_edison-0.1.42 → open_edison-0.1.44}/src/__main__.py +0 -0
  37. {open_edison-0.1.42 → open_edison-0.1.44}/src/config.py +0 -0
  38. {open_edison-0.1.42 → open_edison-0.1.44}/src/config.pyi +0 -0
  39. {open_edison-0.1.42 → open_edison-0.1.44}/src/events.py +0 -0
  40. {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/__init__.py +0 -0
  41. {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/__main__.py +0 -0
  42. {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/cli.py +0 -0
  43. {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/export_cli.py +0 -0
  44. {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/exporters.py +0 -0
  45. {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/import_api.py +0 -0
  46. {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/importers.py +0 -0
  47. {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/merge.py +0 -0
  48. {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/parsers.py +0 -0
  49. {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/paths.py +0 -0
  50. {open_edison-0.1.42 → open_edison-0.1.44}/src/mcp_importer/types.py +0 -0
  51. {open_edison-0.1.42 → open_edison-0.1.44}/src/middleware/data_access_tracker.py +0 -0
  52. {open_edison-0.1.42 → open_edison-0.1.44}/src/middleware/session_tracking.py +0 -0
  53. {open_edison-0.1.42 → open_edison-0.1.44}/src/permissions.py +0 -0
  54. {open_edison-0.1.42 → open_edison-0.1.44}/src/server.py +0 -0
  55. {open_edison-0.1.42 → open_edison-0.1.44}/src/single_user_mcp.py +0 -0
  56. {open_edison-0.1.42 → open_edison-0.1.44}/src/telemetry.py +0 -0
  57. {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.42
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, import your existing MCP configs from Cursor, VS Code, or Claude Code with:
76
+ Optionally, run the setup wizard to import/configure MCP:
76
77
 
77
78
  ```bash
78
- # From source (no install) — quick one-liner (add --dry-run to preview)
79
- uv run python -m mcp_importer.quick_cli --yes
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
- ### Import from Cursor/VS Code/Claude Code
135
+ Run the interactive setup wizard to detect clients, import servers, and configure your editor:
135
136
 
136
- - **CLI**
137
-
138
- - Import & configure to use edison as your MCP server:
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
- ```bash
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, import your existing MCP configs from Cursor, VS Code, or Claude Code with:
51
+ Optionally, run the setup wizard to import/configure MCP:
52
52
 
53
53
  ```bash
54
- # From source (no install) — quick one-liner (add --dry-run to preview)
55
- uv run python -m mcp_importer.quick_cli --yes
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
- ### Import from Cursor/VS Code/Claude Code
110
+ Run the interactive setup wizard to detect clients, import servers, and configure your editor:
111
111
 
112
- - **CLI**
113
-
114
- - Import & configure to use edison as your MCP server:
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
- ```bash
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
- "@modelcontextprotocol/server-github"
41
+ "@github/mcp-server-github"
42
42
  ],
43
43
  "env": {
44
- "GITHUB_PERSONAL_ACCESS_TOKEN": "your-github-token-here"
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
- "SUPABASE_URL": "https://YOUR_PROJECT.supabase.co",
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 no frontend assets are available, create a minimal placeholder
38
- # This prevents build failures while still allowing the package to be built
39
- if not src_frontend_dist.exists():
40
- src_frontend_dist.mkdir(parents=True, exist_ok=True)
41
- # Create a minimal index.html placeholder
42
- placeholder_html = """<!DOCTYPE html>
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.42"
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
- force-include = { "src/frontend_dist" = "frontend_dist" }
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, cast
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 .server import OpenEdisonProxy
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, Windsurf, Cline, Claude Desktop, etc.)",
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="interactive",
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
- # Defer-import importer package (lives under repository scripts/)
230
- importer_pkg = Path(__file__).parent.parent / "scripts" / "mcp_importer"
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: