open-edison 0.1.39__tar.gz → 0.1.40__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.39 → open_edison-0.1.40}/PKG-INFO +10 -10
- {open_edison-0.1.39 → open_edison-0.1.40}/README.md +9 -9
- {open_edison-0.1.39 → open_edison-0.1.40}/pyproject.toml +5 -8
- {open_edison-0.1.39 → open_edison-0.1.40}/src/mcp_importer/__init__.py +1 -1
- {open_edison-0.1.39 → open_edison-0.1.40}/src/mcp_importer/__main__.py +2 -2
- {open_edison-0.1.39 → open_edison-0.1.40}/src/mcp_importer/api.py +32 -10
- {open_edison-0.1.39 → open_edison-0.1.40}/src/mcp_importer/quick_cli.py +1 -1
- {open_edison-0.1.39 → open_edison-0.1.40}/.gitignore +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/LICENSE +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/config.json +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/desktop_ext/README.md +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/docs/README.md +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/docs/architecture/single_user_design.md +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/docs/core/configuration.md +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/docs/core/project_structure.md +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/docs/core/proxy_usage.md +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/docs/deployment/docker.md +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/docs/deployment/local.md +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/docs/development/contributing.md +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/docs/development/development_guide.md +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/docs/development/testing.md +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/docs/quick-reference/api_reference.md +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/docs/quick-reference/config_quick_start.md +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/hatch_build.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/installation_test/README.md +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/prompt_permissions.json +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/resource_permissions.json +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/__init__.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/__main__.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/cli.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/config.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/config.pyi +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/events.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/frontend_dist/assets/index-BUUcUfTt.js +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/frontend_dist/assets/index-o6_8mdM8.css +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/frontend_dist/index.html +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/frontend_dist/sw.js +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/mcp_importer/cli.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/mcp_importer/export_cli.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/mcp_importer/exporters.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/mcp_importer/import_api.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/mcp_importer/importers.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/mcp_importer/merge.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/mcp_importer/parsers.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/mcp_importer/paths.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/mcp_importer/types.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/middleware/data_access_tracker.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/middleware/session_tracking.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/oauth_manager.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/permissions.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/server.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/single_user_mcp.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/src/telemetry.py +0 -0
- {open_edison-0.1.39 → open_edison-0.1.40}/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.40
|
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
|
@@ -76,7 +76,7 @@ Optionally, import your existing MCP configs from Cursor, VS Code, or Claude Cod
|
|
76
76
|
|
77
77
|
```bash
|
78
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.mcp_importer.quick_cli --yes
|
80
80
|
```
|
81
81
|
|
82
82
|
<details>
|
@@ -139,29 +139,29 @@ OPEN_EDISON_CONFIG_DIR=~/edison-config open-edison run
|
|
139
139
|
|
140
140
|
```bash
|
141
141
|
# From source (no install)
|
142
|
-
uv run python -m mcp_importer.quick_cli --yes
|
142
|
+
uv run python -m src.mcp_importer.quick_cli --yes
|
143
143
|
```
|
144
144
|
|
145
145
|
- Preview what will be imported (no writes):
|
146
146
|
|
147
147
|
```bash
|
148
|
-
uv run python -m mcp_importer --source cursor --dry-run
|
148
|
+
uv run python -m src.mcp_importer --source cursor --dry-run
|
149
149
|
```
|
150
150
|
|
151
151
|
- Import servers into Open Edison `config.json` (merge policy defaults to `skip`):
|
152
152
|
|
153
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
|
154
|
+
uv run python -m src.mcp_importer --source cursor
|
155
|
+
uv run python -m src.mcp_importer --source vscode
|
156
|
+
uv run python -m src.mcp_importer --source claude-code
|
157
157
|
```
|
158
158
|
|
159
159
|
- Point your editor to Open Edison (backup original config and replace with a single Open Edison server):
|
160
160
|
|
161
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
|
162
|
+
uv run python -m src.mcp_importer export --target cursor --yes
|
163
|
+
uv run python -m src.mcp_importer export --target vscode --yes
|
164
|
+
uv run python -m src.mcp_importer export --target claude-code --yes
|
165
165
|
```
|
166
166
|
|
167
167
|
</details>
|
@@ -52,7 +52,7 @@ Optionally, import your existing MCP configs from Cursor, VS Code, or Claude Cod
|
|
52
52
|
|
53
53
|
```bash
|
54
54
|
# From source (no install) — quick one-liner (add --dry-run to preview)
|
55
|
-
uv run python -m mcp_importer.quick_cli --yes
|
55
|
+
uv run python -m src.mcp_importer.quick_cli --yes
|
56
56
|
```
|
57
57
|
|
58
58
|
<details>
|
@@ -115,29 +115,29 @@ OPEN_EDISON_CONFIG_DIR=~/edison-config open-edison run
|
|
115
115
|
|
116
116
|
```bash
|
117
117
|
# From source (no install)
|
118
|
-
uv run python -m mcp_importer.quick_cli --yes
|
118
|
+
uv run python -m src.mcp_importer.quick_cli --yes
|
119
119
|
```
|
120
120
|
|
121
121
|
- Preview what will be imported (no writes):
|
122
122
|
|
123
123
|
```bash
|
124
|
-
uv run python -m mcp_importer --source cursor --dry-run
|
124
|
+
uv run python -m src.mcp_importer --source cursor --dry-run
|
125
125
|
```
|
126
126
|
|
127
127
|
- Import servers into Open Edison `config.json` (merge policy defaults to `skip`):
|
128
128
|
|
129
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
|
130
|
+
uv run python -m src.mcp_importer --source cursor
|
131
|
+
uv run python -m src.mcp_importer --source vscode
|
132
|
+
uv run python -m src.mcp_importer --source claude-code
|
133
133
|
```
|
134
134
|
|
135
135
|
- Point your editor to Open Edison (backup original config and replace with a single Open Edison server):
|
136
136
|
|
137
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
|
138
|
+
uv run python -m src.mcp_importer export --target cursor --yes
|
139
|
+
uv run python -m src.mcp_importer export --target vscode --yes
|
140
|
+
uv run python -m src.mcp_importer export --target claude-code --yes
|
141
141
|
```
|
142
142
|
|
143
143
|
</details>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[project]
|
2
2
|
name = "open-edison"
|
3
|
-
version = "0.1.
|
3
|
+
version = "0.1.40"
|
4
4
|
description = "Open-source MCP security, aggregation, and monitoring. Single-user, self-hosted MCP proxy."
|
5
5
|
readme = "README.md"
|
6
6
|
authors = [
|
@@ -28,8 +28,8 @@ requires-python = ">= 3.12"
|
|
28
28
|
[project.scripts]
|
29
29
|
open-edison = "src.cli:main"
|
30
30
|
open_edison = "src.cli:main"
|
31
|
-
mcp-importer = "mcp_importer.__main__:main"
|
32
|
-
mcp-importer-quick = "mcp_importer.quick_cli:main"
|
31
|
+
mcp-importer = "src.mcp_importer.__main__:main"
|
32
|
+
mcp-importer-quick = "src.mcp_importer.quick_cli:main"
|
33
33
|
|
34
34
|
[build-system]
|
35
35
|
requires = ["hatchling"]
|
@@ -54,10 +54,7 @@ dev-dependencies = [
|
|
54
54
|
allow-direct-references = true
|
55
55
|
|
56
56
|
[tool.hatch.build.targets.wheel]
|
57
|
-
packages = ["src"
|
58
|
-
exclude = [
|
59
|
-
"src/mcp_importer/**",
|
60
|
-
]
|
57
|
+
packages = ["src"]
|
61
58
|
include = [
|
62
59
|
"README.md",
|
63
60
|
"LICENSE",
|
@@ -66,8 +63,8 @@ include = [
|
|
66
63
|
"resource_permissions.json",
|
67
64
|
"prompt_permissions.json",
|
68
65
|
"docs/**",
|
69
|
-
"src/frontend_dist/**",
|
70
66
|
]
|
67
|
+
force-include = { "src/frontend_dist" = "frontend_dist" }
|
71
68
|
|
72
69
|
[tool.hatch.build.targets.wheel.hooks.custom]
|
73
70
|
path = "hatch_build.py"
|
@@ -2,8 +2,8 @@ from __future__ import annotations
|
|
2
2
|
|
3
3
|
import sys
|
4
4
|
|
5
|
-
from mcp_importer.cli import run_cli as import_run_cli
|
6
|
-
from mcp_importer.export_cli import run_cli as export_run_cli
|
5
|
+
from src.mcp_importer.cli import run_cli as import_run_cli
|
6
|
+
from src.mcp_importer.export_cli import run_cli as export_run_cli
|
7
7
|
|
8
8
|
|
9
9
|
def main() -> int:
|
@@ -3,18 +3,35 @@ import asyncio
|
|
3
3
|
from collections.abc import Awaitable
|
4
4
|
from enum import Enum
|
5
5
|
from pathlib import Path
|
6
|
-
from typing import Any
|
6
|
+
from typing import Any, Protocol, cast, runtime_checkable
|
7
7
|
|
8
8
|
from fastmcp import FastMCP
|
9
9
|
|
10
|
-
import mcp_importer.paths as _paths
|
11
|
-
from mcp_importer.exporters import export_to_claude_code, export_to_cursor, export_to_vscode
|
12
|
-
from mcp_importer.importers import import_from_claude_code, import_from_cursor, import_from_vscode
|
13
|
-
from mcp_importer.merge import MergePolicy, merge_servers
|
14
10
|
from src.config import Config, MCPServerConfig, get_config_json_path
|
11
|
+
from src.mcp_importer import paths as _paths
|
12
|
+
from src.mcp_importer.exporters import (
|
13
|
+
ExportResult,
|
14
|
+
export_to_claude_code,
|
15
|
+
export_to_cursor,
|
16
|
+
export_to_vscode,
|
17
|
+
)
|
18
|
+
from src.mcp_importer.importers import (
|
19
|
+
import_from_claude_code,
|
20
|
+
import_from_cursor,
|
21
|
+
import_from_vscode,
|
22
|
+
)
|
23
|
+
from src.mcp_importer.merge import MergePolicy, merge_servers
|
15
24
|
from src.oauth_manager import OAuthStatus, get_oauth_manager
|
16
25
|
|
17
26
|
|
27
|
+
@runtime_checkable
|
28
|
+
class _MCPClientLike(Protocol):
|
29
|
+
async def list_tools(self) -> Any: ...
|
30
|
+
async def list_resources(self) -> Any: ...
|
31
|
+
async def list_prompts(self) -> Any: ...
|
32
|
+
def shutdown(self) -> Awaitable[Any] | Any: ...
|
33
|
+
|
34
|
+
|
18
35
|
class CLIENT(str, Enum):
|
19
36
|
CURSOR = "cursor"
|
20
37
|
VSCODE = "vscode"
|
@@ -79,12 +96,17 @@ def export_edison_to(
|
|
79
96
|
dry_run: bool = False,
|
80
97
|
force: bool = False,
|
81
98
|
create_if_missing: bool = False,
|
82
|
-
) ->
|
99
|
+
) -> ExportResult:
|
83
100
|
if dry_run:
|
84
101
|
print(
|
85
102
|
f"[dry-run] Would export Open Edison to '{client}' (backup and replace editor MCP config)"
|
86
103
|
)
|
87
|
-
return
|
104
|
+
return ExportResult(
|
105
|
+
target_path=Path(""),
|
106
|
+
backup_path=None,
|
107
|
+
wrote_changes=False,
|
108
|
+
dry_run=True,
|
109
|
+
)
|
88
110
|
match client:
|
89
111
|
case CLIENT.CURSOR:
|
90
112
|
return export_to_cursor(
|
@@ -115,7 +137,7 @@ def export_edison_to(
|
|
115
137
|
)
|
116
138
|
|
117
139
|
|
118
|
-
def verify_mcp_server(server: MCPServerConfig) -> bool:
|
140
|
+
def verify_mcp_server(server: MCPServerConfig) -> bool: # noqa
|
119
141
|
"""Minimal validation: try listing tools/resources/prompts via FastMCP within a timeout."""
|
120
142
|
|
121
143
|
async def _verify_async() -> bool:
|
@@ -136,7 +158,7 @@ def verify_mcp_server(server: MCPServerConfig) -> bool:
|
|
136
158
|
proxy: FastMCP[Any] | None = None
|
137
159
|
try:
|
138
160
|
proxy = FastMCP.as_proxy(backend=backend_cfg, name=f"open-edison-verify-{server.name}")
|
139
|
-
s:
|
161
|
+
s: _MCPClientLike = cast(_MCPClientLike, proxy)
|
140
162
|
await asyncio.wait_for(
|
141
163
|
asyncio.gather(
|
142
164
|
s.list_tools(),
|
@@ -160,7 +182,7 @@ def verify_mcp_server(server: MCPServerConfig) -> bool:
|
|
160
182
|
return asyncio.run(_verify_async())
|
161
183
|
|
162
184
|
|
163
|
-
def server_needs_oauth(server: MCPServerConfig) -> bool:
|
185
|
+
def server_needs_oauth(server: MCPServerConfig) -> bool: # noqa
|
164
186
|
"""Return True if the remote server currently needs OAuth; False otherwise."""
|
165
187
|
|
166
188
|
async def _needs_oauth_async() -> bool:
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|