open-edison 0.1.39__tar.gz → 0.1.41__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 (54) hide show
  1. {open_edison-0.1.39 → open_edison-0.1.41}/PKG-INFO +10 -10
  2. {open_edison-0.1.39 → open_edison-0.1.41}/README.md +9 -9
  3. {open_edison-0.1.39 → open_edison-0.1.41}/pyproject.toml +5 -8
  4. {open_edison-0.1.39 → open_edison-0.1.41}/src/cli.py +2 -8
  5. {open_edison-0.1.39 → open_edison-0.1.41}/src/mcp_importer/__init__.py +1 -1
  6. {open_edison-0.1.39 → open_edison-0.1.41}/src/mcp_importer/__main__.py +2 -2
  7. {open_edison-0.1.39 → open_edison-0.1.41}/src/mcp_importer/api.py +32 -10
  8. {open_edison-0.1.39 → open_edison-0.1.41}/src/mcp_importer/quick_cli.py +1 -1
  9. {open_edison-0.1.39 → open_edison-0.1.41}/.gitignore +0 -0
  10. {open_edison-0.1.39 → open_edison-0.1.41}/LICENSE +0 -0
  11. {open_edison-0.1.39 → open_edison-0.1.41}/config.json +0 -0
  12. {open_edison-0.1.39 → open_edison-0.1.41}/desktop_ext/README.md +0 -0
  13. {open_edison-0.1.39 → open_edison-0.1.41}/docs/README.md +0 -0
  14. {open_edison-0.1.39 → open_edison-0.1.41}/docs/architecture/single_user_design.md +0 -0
  15. {open_edison-0.1.39 → open_edison-0.1.41}/docs/core/configuration.md +0 -0
  16. {open_edison-0.1.39 → open_edison-0.1.41}/docs/core/project_structure.md +0 -0
  17. {open_edison-0.1.39 → open_edison-0.1.41}/docs/core/proxy_usage.md +0 -0
  18. {open_edison-0.1.39 → open_edison-0.1.41}/docs/deployment/docker.md +0 -0
  19. {open_edison-0.1.39 → open_edison-0.1.41}/docs/deployment/local.md +0 -0
  20. {open_edison-0.1.39 → open_edison-0.1.41}/docs/development/contributing.md +0 -0
  21. {open_edison-0.1.39 → open_edison-0.1.41}/docs/development/development_guide.md +0 -0
  22. {open_edison-0.1.39 → open_edison-0.1.41}/docs/development/testing.md +0 -0
  23. {open_edison-0.1.39 → open_edison-0.1.41}/docs/quick-reference/api_reference.md +0 -0
  24. {open_edison-0.1.39 → open_edison-0.1.41}/docs/quick-reference/config_quick_start.md +0 -0
  25. {open_edison-0.1.39 → open_edison-0.1.41}/hatch_build.py +0 -0
  26. {open_edison-0.1.39 → open_edison-0.1.41}/installation_test/README.md +0 -0
  27. {open_edison-0.1.39 → open_edison-0.1.41}/prompt_permissions.json +0 -0
  28. {open_edison-0.1.39 → open_edison-0.1.41}/resource_permissions.json +0 -0
  29. {open_edison-0.1.39 → open_edison-0.1.41}/src/__init__.py +0 -0
  30. {open_edison-0.1.39 → open_edison-0.1.41}/src/__main__.py +0 -0
  31. {open_edison-0.1.39 → open_edison-0.1.41}/src/config.py +0 -0
  32. {open_edison-0.1.39 → open_edison-0.1.41}/src/config.pyi +0 -0
  33. {open_edison-0.1.39 → open_edison-0.1.41}/src/events.py +0 -0
  34. {open_edison-0.1.39 → open_edison-0.1.41}/src/frontend_dist/assets/index-BUUcUfTt.js +0 -0
  35. {open_edison-0.1.39 → open_edison-0.1.41}/src/frontend_dist/assets/index-o6_8mdM8.css +0 -0
  36. {open_edison-0.1.39 → open_edison-0.1.41}/src/frontend_dist/index.html +0 -0
  37. {open_edison-0.1.39 → open_edison-0.1.41}/src/frontend_dist/sw.js +0 -0
  38. {open_edison-0.1.39 → open_edison-0.1.41}/src/mcp_importer/cli.py +0 -0
  39. {open_edison-0.1.39 → open_edison-0.1.41}/src/mcp_importer/export_cli.py +0 -0
  40. {open_edison-0.1.39 → open_edison-0.1.41}/src/mcp_importer/exporters.py +0 -0
  41. {open_edison-0.1.39 → open_edison-0.1.41}/src/mcp_importer/import_api.py +0 -0
  42. {open_edison-0.1.39 → open_edison-0.1.41}/src/mcp_importer/importers.py +0 -0
  43. {open_edison-0.1.39 → open_edison-0.1.41}/src/mcp_importer/merge.py +0 -0
  44. {open_edison-0.1.39 → open_edison-0.1.41}/src/mcp_importer/parsers.py +0 -0
  45. {open_edison-0.1.39 → open_edison-0.1.41}/src/mcp_importer/paths.py +0 -0
  46. {open_edison-0.1.39 → open_edison-0.1.41}/src/mcp_importer/types.py +0 -0
  47. {open_edison-0.1.39 → open_edison-0.1.41}/src/middleware/data_access_tracker.py +0 -0
  48. {open_edison-0.1.39 → open_edison-0.1.41}/src/middleware/session_tracking.py +0 -0
  49. {open_edison-0.1.39 → open_edison-0.1.41}/src/oauth_manager.py +0 -0
  50. {open_edison-0.1.39 → open_edison-0.1.41}/src/permissions.py +0 -0
  51. {open_edison-0.1.39 → open_edison-0.1.41}/src/server.py +0 -0
  52. {open_edison-0.1.39 → open_edison-0.1.41}/src/single_user_mcp.py +0 -0
  53. {open_edison-0.1.39 → open_edison-0.1.41}/src/telemetry.py +0 -0
  54. {open_edison-0.1.39 → open_edison-0.1.41}/tool_permissions.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: open-edison
3
- Version: 0.1.39
3
+ Version: 0.1.41
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.39"
3
+ version = "0.1.41"
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", "src/mcp_importer"]
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"
@@ -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(
@@ -1,6 +1,6 @@
1
1
  """MCP importer package for Open Edison scripts.
2
2
 
3
- Import submodules explicitly as needed, e.g. `from mcp_importer import cli`.
3
+ Import submodules explicitly as needed, e.g. `from src.mcp_importer import cli`.
4
4
  """
5
5
 
6
6
  # pyright: reportUnsupportedDunderAll=false
@@ -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
- ) -> Any:
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 None
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: Any = proxy
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:
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import argparse
4
4
  from collections.abc import Iterable
5
5
 
6
- from mcp_importer.api import (
6
+ from src.mcp_importer.api import (
7
7
  CLIENT,
8
8
  detect_clients,
9
9
  export_edison_to,
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes