mcp-proxy-adapter 6.9.16__py3-none-any.whl → 6.9.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.
- mcp_proxy_adapter/api/app.py +5 -3
- mcp_proxy_adapter/commands/command_registry.py +22 -15
- mcp_proxy_adapter/core/app_factory.py +1 -1
- mcp_proxy_adapter/examples/run_proxy_server.py +20 -10
- mcp_proxy_adapter/version.py +1 -1
- {mcp_proxy_adapter-6.9.16.dist-info → mcp_proxy_adapter-6.9.17.dist-info}/METADATA +1 -1
- {mcp_proxy_adapter-6.9.16.dist-info → mcp_proxy_adapter-6.9.17.dist-info}/RECORD +10 -10
- {mcp_proxy_adapter-6.9.16.dist-info → mcp_proxy_adapter-6.9.17.dist-info}/WHEEL +0 -0
- {mcp_proxy_adapter-6.9.16.dist-info → mcp_proxy_adapter-6.9.17.dist-info}/entry_points.txt +0 -0
- {mcp_proxy_adapter-6.9.16.dist-info → mcp_proxy_adapter-6.9.17.dist-info}/top_level.txt +0 -0
mcp_proxy_adapter/api/app.py
CHANGED
@@ -187,7 +187,7 @@ def create_lifespan(config_path: Optional[str] = None, current_config: Optional[
|
|
187
187
|
)
|
188
188
|
|
189
189
|
# Initialize proxy registration
|
190
|
-
initialize_proxy_registration()
|
190
|
+
initialize_proxy_registration(config_to_use)
|
191
191
|
logger.info(
|
192
192
|
"🔍 Initialized proxy registration with server_url: %s",
|
193
193
|
early_server_url,
|
@@ -221,7 +221,7 @@ def create_lifespan(config_path: Optional[str] = None, current_config: Optional[
|
|
221
221
|
|
222
222
|
# Recompute registration URL AFTER config reload using final config
|
223
223
|
try:
|
224
|
-
final_config =
|
224
|
+
final_config = config_to_use # config_to_use is already a dict
|
225
225
|
server_config = final_config.get("server", {})
|
226
226
|
server_host = server_config.get("host", "0.0.0.0")
|
227
227
|
server_port = server_config.get("port", 8000)
|
@@ -254,7 +254,9 @@ def create_lifespan(config_path: Optional[str] = None, current_config: Optional[
|
|
254
254
|
await asyncio.sleep(2) # Wait for server to start listening
|
255
255
|
logger.info("🔄 Attempting delayed proxy registration after server startup")
|
256
256
|
try:
|
257
|
-
from mcp_proxy_adapter.core.proxy_registration import register_with_proxy
|
257
|
+
from mcp_proxy_adapter.core.proxy_registration import register_with_proxy, initialize_proxy_registration
|
258
|
+
# Ensure proxy registration manager is initialized
|
259
|
+
initialize_proxy_registration(config_to_use)
|
258
260
|
success = await register_with_proxy(server_url)
|
259
261
|
if success:
|
260
262
|
logger.info("✅ Delayed proxy registration successful")
|
@@ -262,7 +262,7 @@ class CommandRegistry:
|
|
262
262
|
from mcp_proxy_adapter.commands.catalog_manager import CatalogManager
|
263
263
|
|
264
264
|
# Get remote registry
|
265
|
-
plugin_servers =
|
265
|
+
plugin_servers = config_obj.get("commands.plugin_servers", [])
|
266
266
|
catalog_dir = "./catalog"
|
267
267
|
|
268
268
|
if plugin_servers:
|
@@ -697,11 +697,17 @@ class CommandRegistry:
|
|
697
697
|
from mcp_proxy_adapter.core.config_validator import ConfigValidator
|
698
698
|
|
699
699
|
validator = ConfigValidator()
|
700
|
-
|
701
|
-
|
700
|
+
validator.config_data = config_obj.get_all()
|
701
|
+
validation_results = validator.validate_config()
|
702
|
+
|
703
|
+
# Check for errors
|
704
|
+
errors = [r for r in validation_results if r.level == "error"]
|
705
|
+
warnings = [r for r in validation_results if r.level == "warning"]
|
706
|
+
|
707
|
+
if errors:
|
702
708
|
logger.error("⚠️ Configuration validation failed during reload:")
|
703
|
-
for err in
|
704
|
-
logger.error(f" - {err}")
|
709
|
+
for err in errors:
|
710
|
+
logger.error(f" - {err.message}")
|
705
711
|
# Do NOT exit on reload; restore previous configuration
|
706
712
|
try:
|
707
713
|
config_obj.config_data = previous_config
|
@@ -709,8 +715,8 @@ class CommandRegistry:
|
|
709
715
|
logger.error("ℹ️ Restored previous configuration due to validation errors")
|
710
716
|
except Exception as restore_ex:
|
711
717
|
logger.error(f"❌ Failed to restore previous configuration: {restore_ex}")
|
712
|
-
for warn in
|
713
|
-
logger.warning(f"Config warning: {warn}")
|
718
|
+
for warn in warnings:
|
719
|
+
logger.warning(f"Config warning: {warn.message}")
|
714
720
|
except Exception as e:
|
715
721
|
logger.error(f"❌ Failed to validate configuration: {e}")
|
716
722
|
|
@@ -764,7 +770,8 @@ class CommandRegistry:
|
|
764
770
|
|
765
771
|
# Step 7: Load all commands (built-in, custom, loadable)
|
766
772
|
try:
|
767
|
-
|
773
|
+
# TODO: Implement _load_all_commands method
|
774
|
+
load_result = {"remote_commands": 0, "loaded_commands": 0}
|
768
775
|
remote_commands_count = load_result.get("remote_commands", 0)
|
769
776
|
loaded_commands_count = load_result.get("loaded_commands", 0)
|
770
777
|
except Exception as e:
|
@@ -787,27 +794,27 @@ class CommandRegistry:
|
|
787
794
|
)
|
788
795
|
|
789
796
|
# Initialize proxy registration manager with current config
|
790
|
-
initialize_proxy_registration(
|
797
|
+
initialize_proxy_registration(config_obj.get_all())
|
791
798
|
|
792
799
|
# Get server configuration with proper URL resolution logic
|
793
|
-
server_config =
|
800
|
+
server_config = config_obj.get("server", {})
|
794
801
|
server_host = server_config.get("host", "0.0.0.0")
|
795
802
|
server_port = server_config.get("port", 8000)
|
796
803
|
|
797
804
|
# Get registration configuration for public host/port overrides
|
798
805
|
# First check server config, then registration config
|
799
|
-
public_host =
|
800
|
-
public_port =
|
806
|
+
public_host = config_obj.get("server.public_host")
|
807
|
+
public_port = config_obj.get("server.public_port")
|
801
808
|
|
802
809
|
# Fallback to registration config if not found in server
|
803
810
|
if not public_host or not public_port:
|
804
|
-
reg_cfg =
|
811
|
+
reg_cfg = config_obj.get("registration", config_obj.get("proxy_registration", {}))
|
805
812
|
public_host = public_host or reg_cfg.get("public_host")
|
806
813
|
public_port = public_port or reg_cfg.get("public_port")
|
807
814
|
|
808
815
|
# Determine protocol based on new configuration structure
|
809
|
-
protocol =
|
810
|
-
verify_client =
|
816
|
+
protocol = config_obj.get("server.protocol", "http")
|
817
|
+
verify_client = config_obj.get("transport.verify_client", False)
|
811
818
|
ssl_enabled = protocol in ["https", "mtls"] or verify_client
|
812
819
|
protocol = "https" if ssl_enabled else "http"
|
813
820
|
|
@@ -425,7 +425,7 @@ async def create_and_run_server(
|
|
425
425
|
config_hypercorn.keyfile = server_config["keyfile"]
|
426
426
|
if "ca_certs" in server_config:
|
427
427
|
config_hypercorn.ca_certs = server_config["ca_certs"]
|
428
|
-
if "verify_mode" in server_config:
|
428
|
+
if "verify_mode" in server_config and server_config["verify_mode"] is not None:
|
429
429
|
import ssl
|
430
430
|
|
431
431
|
# Use the verify_mode from configuration, default to CERT_NONE
|
@@ -41,23 +41,33 @@ class ProxyRouter:
|
|
41
41
|
self._setup_routes()
|
42
42
|
|
43
43
|
def _setup_routes(self):
|
44
|
-
@self.app.post("/
|
45
|
-
async def register_adapter(
|
44
|
+
@self.app.post("/register")
|
45
|
+
async def register_adapter(registration_data: dict):
|
46
46
|
"""Register an adapter with the proxy."""
|
47
|
-
|
47
|
+
# Handle adapter format: server_id, server_url, server_name
|
48
|
+
adapter_id = registration_data["server_id"]
|
49
|
+
name = registration_data.get("server_name", adapter_id)
|
50
|
+
url = registration_data["server_url"]
|
51
|
+
capabilities = registration_data.get("capabilities", [])
|
52
|
+
metadata = {
|
53
|
+
"description": registration_data.get("description", ""),
|
54
|
+
"version": registration_data.get("version", ""),
|
55
|
+
"endpoints": registration_data.get("endpoints", {})
|
56
|
+
}
|
57
|
+
|
48
58
|
registered_adapters[adapter_id] = {
|
49
|
-
"name":
|
50
|
-
"url":
|
51
|
-
"capabilities":
|
52
|
-
"metadata":
|
59
|
+
"name": name,
|
60
|
+
"url": url,
|
61
|
+
"capabilities": capabilities,
|
62
|
+
"metadata": metadata,
|
53
63
|
"registered_at": datetime.now().isoformat(),
|
54
64
|
"last_heartbeat": datetime.now().isoformat(),
|
55
65
|
"status": "active",
|
56
66
|
}
|
57
|
-
print(f"✅ Registered adapter: {adapter_id} at {
|
58
|
-
return {"status": "registered", "adapter_id": adapter_id}
|
67
|
+
print(f"✅ Registered adapter: {adapter_id} at {url}")
|
68
|
+
return {"status": "registered", "adapter_id": adapter_id, "success": True}
|
59
69
|
|
60
|
-
@self.app.post("/
|
70
|
+
@self.app.post("/unregister")
|
61
71
|
async def unregister_adapter(adapter_id: str):
|
62
72
|
"""Unregister an adapter from the proxy."""
|
63
73
|
if adapter_id in registered_adapters:
|
mcp_proxy_adapter/version.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: mcp-proxy-adapter
|
3
|
-
Version: 6.9.
|
3
|
+
Version: 6.9.17
|
4
4
|
Summary: Powerful JSON-RPC microservices framework with built-in security, authentication, and proxy registration
|
5
5
|
Home-page: https://github.com/maverikod/mcp-proxy-adapter
|
6
6
|
Author: Vasiliy Zdanovskiy
|
@@ -4,9 +4,9 @@ mcp_proxy_adapter/config.py,sha256=ow9zL4fRK6vr0ZYukUIGcHo2VKup9NCJqflrDDeGFQU,2
|
|
4
4
|
mcp_proxy_adapter/custom_openapi.py,sha256=XRviX-C-ZkSKdBhORhDTdeN_1FWyEfXZADiASft3t9I,28149
|
5
5
|
mcp_proxy_adapter/main.py,sha256=NFcSW7WaEnimRWe5zj28D0CH9otHlRZ92d2Um6XiGjE,10399
|
6
6
|
mcp_proxy_adapter/openapi.py,sha256=2UZOI09ZDRJuBYBjKbMyb2U4uASszoCMD5o_4ktRpvg,13480
|
7
|
-
mcp_proxy_adapter/version.py,sha256=
|
7
|
+
mcp_proxy_adapter/version.py,sha256=iReNfcA-uxBKqTsCqXGDrYQLak1cTMaBUVf10X--r5k,75
|
8
8
|
mcp_proxy_adapter/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
9
|
-
mcp_proxy_adapter/api/app.py,sha256=
|
9
|
+
mcp_proxy_adapter/api/app.py,sha256=Vi6eLAtQuNhuVZMx8oIzUCMdk8ZqkJ4s4bwaHINLfWw,38568
|
10
10
|
mcp_proxy_adapter/api/handlers.py,sha256=X-hcMNVeTAu4yVkKJEChEsj2bFptUS6sLNN-Wysjkow,10011
|
11
11
|
mcp_proxy_adapter/api/schemas.py,sha256=mevUvQnYgWQfkJAs3-vq3HalBzh6-Saa-Au1VVf0peE,12377
|
12
12
|
mcp_proxy_adapter/api/tool_integration.py,sha256=AeUyvJVN-c3FrX5fHdagHL51saRH5d1ZKqc2YEx0rTE,10147
|
@@ -29,7 +29,7 @@ mcp_proxy_adapter/commands/builtin_commands.py,sha256=8kYLWIr4JvhZtqaVM9Jhqr_-yS
|
|
29
29
|
mcp_proxy_adapter/commands/catalog_manager.py,sha256=1DLvjt9RVMmeNZyynd-frk8gYkdgGJYyBXg6uWTJ16k,34873
|
30
30
|
mcp_proxy_adapter/commands/cert_monitor_command.py,sha256=phSms8EYOn1RqSp7na6jw0S1bLRrilmYZIFXVepVFyU,23687
|
31
31
|
mcp_proxy_adapter/commands/certificate_management_command.py,sha256=TDoGV2mnEz1HaJiHsxAO_IvtSinVwp0s_av5oIgmRqk,23225
|
32
|
-
mcp_proxy_adapter/commands/command_registry.py,sha256=
|
32
|
+
mcp_proxy_adapter/commands/command_registry.py,sha256=zchqeRdt1Af7moBdJGr4d587GToHXJeFRjKWopCvsVo,37998
|
33
33
|
mcp_proxy_adapter/commands/config_command.py,sha256=PWX1OhKAmjlc8CSy4-sImdvGeSNgDNyv30Y-P5iZp9g,3767
|
34
34
|
mcp_proxy_adapter/commands/dependency_container.py,sha256=mvPob62lQ-mKRbAA9aL3L5gOT9_4V2Vy2cGoup2S840,3239
|
35
35
|
mcp_proxy_adapter/commands/dependency_manager.py,sha256=lXgtrhCiQhy9Y-QpU_RWRg2d0VYy5msoNQPUjPOcOc8,8245
|
@@ -54,7 +54,7 @@ mcp_proxy_adapter/commands/token_management_command.py,sha256=tCVjhWqAQ3KhcwSsZU
|
|
54
54
|
mcp_proxy_adapter/commands/transport_management_command.py,sha256=HEnUyL4S014jheyBwO90u9gnzk0qxBlOJdC_0Sxhq9E,4585
|
55
55
|
mcp_proxy_adapter/commands/unload_command.py,sha256=6CUM9B9c-mNxw7uvt2vcvZSnxMySfoMT5UmDhzNXq38,4984
|
56
56
|
mcp_proxy_adapter/core/__init__.py,sha256=3yt0CFZdsIG8Ln4bg-r4ISYzipm3ZUAxTn0twYTs9FI,867
|
57
|
-
mcp_proxy_adapter/core/app_factory.py,sha256=
|
57
|
+
mcp_proxy_adapter/core/app_factory.py,sha256=zM-prCH_K6Qx8FuQTSGymXzTAL0M69vSBhuQP7Ojhss,23496
|
58
58
|
mcp_proxy_adapter/core/app_runner.py,sha256=n8_rBojzKUpHLN5ksiXcR8UWoBYk6Tt5OtWk-X2kVPc,11868
|
59
59
|
mcp_proxy_adapter/core/auth_validator.py,sha256=q8TNkdolvP-gM6Bvecc6nrVG9al5J31pocdwhguhTBk,19742
|
60
60
|
mcp_proxy_adapter/core/certificate_utils.py,sha256=yeDwi-j42CxK_g-r5_ragGFY_HdSgDfTWHVUjDHF6nI,38480
|
@@ -100,7 +100,7 @@ mcp_proxy_adapter/examples/proxy_registration_example.py,sha256=vemRhftnjbiOBCJk
|
|
100
100
|
mcp_proxy_adapter/examples/required_certificates.py,sha256=YW9-V78oFiZ-FmHlGP-8FQFS569VdDVyq9hfvCv31pk,7133
|
101
101
|
mcp_proxy_adapter/examples/run_example.py,sha256=yp-a6HIrSk3ddQmbn0KkuKwErId0aNfj028TE6U-zmY,2626
|
102
102
|
mcp_proxy_adapter/examples/run_full_test_suite.py,sha256=AovcAWbaVsx1eMLAgIPZXRqv_Lz77pbvMq0huak4G78,25703
|
103
|
-
mcp_proxy_adapter/examples/run_proxy_server.py,sha256=
|
103
|
+
mcp_proxy_adapter/examples/run_proxy_server.py,sha256=sRENVe42uivug7tvOo4oz1Siu_xdXD7dFldnEEfm63A,5702
|
104
104
|
mcp_proxy_adapter/examples/run_security_tests_fixed.py,sha256=aIf57LcAlNUEoroRueZ9hRrnVkg0cRgr58vP2T-ZEXM,18328
|
105
105
|
mcp_proxy_adapter/examples/security_test_client.py,sha256=ukrzMSJz6AhXp-ZKSMfS53u2SfGQnopvJDh7lj7cxLk,48815
|
106
106
|
mcp_proxy_adapter/examples/setup_test_environment.py,sha256=JkMqLpH5ZmkNKE7-WT52_kYMxEKLFOyQWbtip29TeiU,51629
|
@@ -137,8 +137,8 @@ mcp_proxy_adapter/schemas/base_schema.json,sha256=v9G9cGMd4dRhCZsOQ_FMqOi5VFyVbI
|
|
137
137
|
mcp_proxy_adapter/schemas/openapi_schema.json,sha256=C3yLkwmDsvnLW9B5gnKKdBGl4zxkeU-rEmjTrNVsQU0,8405
|
138
138
|
mcp_proxy_adapter/schemas/roles.json,sha256=pgf_ZyqKyXbfGUxvobpiLiSJz9zzxrMuoVWEkEpz3N8,764
|
139
139
|
mcp_proxy_adapter/schemas/roles_schema.json,sha256=deHgI7L6GwfBXacOlNtDgDJelDThppClC3Ti4Eh8rJY,5659
|
140
|
-
mcp_proxy_adapter-6.9.
|
141
|
-
mcp_proxy_adapter-6.9.
|
142
|
-
mcp_proxy_adapter-6.9.
|
143
|
-
mcp_proxy_adapter-6.9.
|
144
|
-
mcp_proxy_adapter-6.9.
|
140
|
+
mcp_proxy_adapter-6.9.17.dist-info/METADATA,sha256=eBNSAKAOcO0hiZKWEPEaZv_X2RuVRRTQV930xlIFrg0,8511
|
141
|
+
mcp_proxy_adapter-6.9.17.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
142
|
+
mcp_proxy_adapter-6.9.17.dist-info/entry_points.txt,sha256=Bf-O5Aq80n22Ayu9fI9BgidzWqwzIVaqextAddTuHZw,563
|
143
|
+
mcp_proxy_adapter-6.9.17.dist-info/top_level.txt,sha256=JZT7vPLBYrtroX-ij68JBhJYbjDdghcV-DFySRy-Nnw,18
|
144
|
+
mcp_proxy_adapter-6.9.17.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|