open-edison 0.1.15__py3-none-any.whl → 0.1.17__py3-none-any.whl
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.15.dist-info → open_edison-0.1.17.dist-info}/METADATA +82 -121
- open_edison-0.1.17.dist-info/RECORD +14 -0
- src/middleware/session_tracking.py +2 -2
- src/server.py +41 -145
- src/single_user_mcp.py +5 -22
- src/telemetry.py +17 -1
- open_edison-0.1.15.dist-info/RECORD +0 -18
- src/frontend_dist/assets/index-_NTxjOfh.js +0 -51
- src/frontend_dist/assets/index-h6k8aL6h.css +0 -1
- src/frontend_dist/index.html +0 -21
- src/mcp_manager.py +0 -137
- {open_edison-0.1.15.dist-info → open_edison-0.1.17.dist-info}/WHEEL +0 -0
- {open_edison-0.1.15.dist-info → open_edison-0.1.17.dist-info}/entry_points.txt +0 -0
- {open_edison-0.1.15.dist-info → open_edison-0.1.17.dist-info}/licenses/LICENSE +0 -0
src/single_user_mcp.py
CHANGED
@@ -11,7 +11,6 @@ from fastmcp import FastMCP
|
|
11
11
|
from loguru import logger as log
|
12
12
|
|
13
13
|
from src.config import MCPServerConfig, config
|
14
|
-
from src.mcp_manager import MCPManager
|
15
14
|
from src.middleware.session_tracking import (
|
16
15
|
SessionTrackingMiddleware,
|
17
16
|
get_current_session_data_tracker,
|
@@ -42,9 +41,8 @@ class SingleUserMCP(FastMCP[Any]):
|
|
42
41
|
All enabled MCP servers are mounted through a single FastMCP composite proxy.
|
43
42
|
"""
|
44
43
|
|
45
|
-
def __init__(self
|
44
|
+
def __init__(self):
|
46
45
|
super().__init__(name="open-edison-single-user")
|
47
|
-
self.mcp_manager: MCPManager = mcp_manager
|
48
46
|
self.mounted_servers: dict[str, MountedServerInfo] = {}
|
49
47
|
self.composite_proxy: FastMCP[Any] | None = None
|
50
48
|
|
@@ -110,21 +108,12 @@ class SingleUserMCP(FastMCP[Any]):
|
|
110
108
|
True if composite proxy was created successfully, False otherwise
|
111
109
|
"""
|
112
110
|
try:
|
113
|
-
|
114
|
-
real_servers = [s for s in enabled_servers if s.command != "echo"]
|
115
|
-
|
116
|
-
if not real_servers:
|
111
|
+
if not enabled_servers:
|
117
112
|
log.info("No real servers to mount in composite proxy")
|
118
113
|
return True
|
119
114
|
|
120
|
-
# Start all required server processes
|
121
|
-
for server_config in real_servers:
|
122
|
-
if not await self.mcp_manager.is_server_running(server_config.name):
|
123
|
-
log.info(f"Starting server process: {server_config.name}")
|
124
|
-
_ = await self.mcp_manager.start_server(server_config.name)
|
125
|
-
|
126
115
|
# Convert to FastMCP config format
|
127
|
-
fastmcp_config = self._convert_to_fastmcp_config(
|
116
|
+
fastmcp_config = self._convert_to_fastmcp_config(enabled_servers)
|
128
117
|
|
129
118
|
log.info(
|
130
119
|
f"Creating composite proxy for servers: {list(fastmcp_config['mcpServers'].keys())}"
|
@@ -140,12 +129,12 @@ class SingleUserMCP(FastMCP[Any]):
|
|
140
129
|
await self.import_server(self.composite_proxy)
|
141
130
|
|
142
131
|
# Track mounted servers for status reporting
|
143
|
-
for server_config in
|
132
|
+
for server_config in enabled_servers:
|
144
133
|
self.mounted_servers[server_config.name] = MountedServerInfo(
|
145
134
|
config=server_config, proxy=self.composite_proxy
|
146
135
|
)
|
147
136
|
|
148
|
-
log.info(f"✅ Created composite proxy with {len(
|
137
|
+
log.info(f"✅ Created composite proxy with {len(enabled_servers)} servers")
|
149
138
|
return True
|
150
139
|
|
151
140
|
except Exception as e:
|
@@ -221,7 +210,6 @@ class SingleUserMCP(FastMCP[Any]):
|
|
221
210
|
try:
|
222
211
|
# Remove from mounted servers
|
223
212
|
await self._cleanup_mounted_server(excluded_server)
|
224
|
-
await self._stop_server_process(excluded_server)
|
225
213
|
|
226
214
|
# Get remaining servers that should be in composite proxy
|
227
215
|
remaining_configs = [
|
@@ -249,11 +237,6 @@ class SingleUserMCP(FastMCP[Any]):
|
|
249
237
|
del self.mounted_servers[server_name]
|
250
238
|
log.info(f"✅ Unmounted MCP server: {server_name}")
|
251
239
|
|
252
|
-
async def _stop_server_process(self, server_name: str) -> None:
|
253
|
-
"""Stop the server subprocess if it's not a test server."""
|
254
|
-
if server_name != "test-echo":
|
255
|
-
await self.mcp_manager.stop_server(server_name)
|
256
|
-
|
257
240
|
async def get_mounted_servers(self) -> list[ServerStatusInfo]:
|
258
241
|
"""Get list of currently mounted servers."""
|
259
242
|
return [
|
src/telemetry.py
CHANGED
@@ -22,6 +22,7 @@ from __future__ import annotations
|
|
22
22
|
|
23
23
|
import json
|
24
24
|
import os
|
25
|
+
import platform
|
25
26
|
import traceback
|
26
27
|
import uuid
|
27
28
|
from collections.abc import Callable
|
@@ -175,12 +176,27 @@ def initialize_telemetry(override: TelemetryConfig | None = None) -> None: # no
|
|
175
176
|
|
176
177
|
# Provider/meter
|
177
178
|
try:
|
179
|
+
# Capture platform/runtime details
|
180
|
+
install_id = _ensure_install_id()
|
181
|
+
os_type = platform.system().lower() or "unknown"
|
182
|
+
os_description = platform.platform()
|
183
|
+
host_arch = platform.machine()
|
184
|
+
runtime_version = platform.python_version()
|
185
|
+
service_version = getattr(config, "version", "unknown")
|
186
|
+
|
178
187
|
# Attach a resource so metrics include service identifiers
|
179
188
|
resource = Resource.create(
|
180
189
|
{
|
181
190
|
"service.name": "open-edison",
|
182
191
|
"service.namespace": "open-edison",
|
192
|
+
"service.version": service_version,
|
193
|
+
"service.instance.id": install_id,
|
183
194
|
"telemetry.sdk.language": "python",
|
195
|
+
"os.type": os_type,
|
196
|
+
"os.description": os_description,
|
197
|
+
"host.arch": host_arch,
|
198
|
+
"process.runtime.name": "python",
|
199
|
+
"process.runtime.version": runtime_version,
|
184
200
|
}
|
185
201
|
)
|
186
202
|
provider: Any = ot_sdk_metrics.MeterProvider(metric_readers=[reader], resource=resource)
|
@@ -209,7 +225,7 @@ def initialize_telemetry(override: TelemetryConfig | None = None) -> None: # no
|
|
209
225
|
log.error("Metrics instrument creation failed\n{}", traceback.format_exc())
|
210
226
|
return
|
211
227
|
|
212
|
-
_ =
|
228
|
+
_ = install_id
|
213
229
|
_initialized = True
|
214
230
|
log.info("📈 Telemetry initialized")
|
215
231
|
|
@@ -1,18 +0,0 @@
|
|
1
|
-
src/__init__.py,sha256=QWeZdjAm2D2B0eWhd8m2-DPpWvIP26KcNJxwEoU1oEQ,254
|
2
|
-
src/__main__.py,sha256=kQsaVyzRa_ESC57JpKDSQJAHExuXme0rM5beJsYxFeA,161
|
3
|
-
src/cli.py,sha256=9cJN6mRvjbCcpTyTdUVl47J7OB7bxzSy0h8tfVbHuQU,9982
|
4
|
-
src/config.py,sha256=2a5rdImQmNGggL690PQprqZVsRUAJcdo8KS2Foj9N-U,9345
|
5
|
-
src/mcp_manager.py,sha256=VpRdVMy1WLegC-gBnyTcBMcKzQsdIn4JIWuHf7Q40hg,4442
|
6
|
-
src/server.py,sha256=fVJatqKZFBacEd-fm3UROevG6U_JLIQUxt_-UdZEQFM,30727
|
7
|
-
src/single_user_mcp.py,sha256=ue5UnC0nfmuLR4z87904WqH7B-0FaACFDWaBNNL7hXE,15259
|
8
|
-
src/telemetry.py,sha256=PDS3YrwDHOKNyQwr_CclqOfPzeMnjj_x4rfN5OBmFvo,11931
|
9
|
-
src/frontend_dist/index.html,sha256=Y4ZfK2hzHsfCiqh7Z7dzajTdojVjKCC5YL4JxdXeig4,673
|
10
|
-
src/frontend_dist/assets/index-_NTxjOfh.js,sha256=KetbIa26YNfMP_SwWa04fCr9jGNnoPeZsA41-Oxgx6w,236658
|
11
|
-
src/frontend_dist/assets/index-h6k8aL6h.css,sha256=Lq5FK1bsPMR67cAwD_-fMvWqKbo_IyraMSKndoQf8i8,13875
|
12
|
-
src/middleware/data_access_tracker.py,sha256=RZh1RCBYDEbvVIJPkDUz0bfLmK-xYIdV0lGbIxbJYc0,25966
|
13
|
-
src/middleware/session_tracking.py,sha256=mApPfJLjHfiSf5CjMeq-IWqjKFsjvWgBgGrgy5GJWa0,20043
|
14
|
-
open_edison-0.1.15.dist-info/METADATA,sha256=hiQZYgHCzeahyIB26lrwRaQI_QbjCUJ7MxaG90aX62U,8967
|
15
|
-
open_edison-0.1.15.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
16
|
-
open_edison-0.1.15.dist-info/entry_points.txt,sha256=qNAkJcnoTXRhj8J--3PDmXz_TQKdB8H_0C9wiCtDIyA,72
|
17
|
-
open_edison-0.1.15.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
18
|
-
open_edison-0.1.15.dist-info/RECORD,,
|