mcp-proxy-adapter 6.4.42__tar.gz → 6.4.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.
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/PKG-INFO +1 -1
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/api/app.py +9 -3
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/proxy_registration.py +80 -43
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/create_test_configs.py +51 -16
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/run_full_test_suite.py +22 -4
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/run_security_tests_fixed.py +1 -1
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/security_test_client.py +31 -13
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/setup_test_environment.py +164 -15
- mcp_proxy_adapter-6.4.44/mcp_proxy_adapter/examples/simple_protocol_test.py +125 -0
- mcp_proxy_adapter-6.4.44/mcp_proxy_adapter/examples/test_protocol_examples.py +338 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/version.py +1 -1
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter.egg-info/PKG-INFO +1 -1
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter.egg-info/SOURCES.txt +5 -19
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/pyproject.toml +1 -1
- mcp_proxy_adapter-6.4.42/mcp_proxy_adapter/examples/create_certificates_simple.py +0 -661
- mcp_proxy_adapter-6.4.42/mcp_proxy_adapter/examples/generate_certificates.py +0 -192
- mcp_proxy_adapter-6.4.42/mcp_proxy_adapter/examples/generate_certificates_and_tokens.py +0 -515
- mcp_proxy_adapter-6.4.42/mcp_proxy_adapter/examples/generate_test_configs.py +0 -393
- mcp_proxy_adapter-6.4.42/mcp_proxy_adapter/examples/run_security_tests.py +0 -677
- mcp_proxy_adapter-6.4.42/mcp_proxy_adapter/examples/scripts/config_generator.py +0 -842
- mcp_proxy_adapter-6.4.42/mcp_proxy_adapter/examples/scripts/create_certificates_simple.py +0 -673
- mcp_proxy_adapter-6.4.42/mcp_proxy_adapter/examples/scripts/generate_certificates_and_tokens.py +0 -515
- mcp_proxy_adapter-6.4.42/mcp_proxy_adapter/examples/test_config_generator.py +0 -102
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/README.md +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/__init__.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/__main__.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/api/__init__.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/api/handlers.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/api/middleware/__init__.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/api/middleware/base.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/api/middleware/command_permission_middleware.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/api/middleware/error_handling.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/api/middleware/factory.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/api/middleware/logging.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/api/middleware/performance.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/api/middleware/protocol_middleware.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/api/middleware/transport_middleware.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/api/middleware/unified_security.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/api/middleware/user_info_middleware.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/api/schemas.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/api/tool_integration.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/api/tools.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/__init__.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/auth_validation_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/base.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/builtin_commands.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/catalog_manager.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/cert_monitor_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/certificate_management_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/command_registry.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/config_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/dependency_container.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/dependency_manager.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/echo_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/health_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/help_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/hooks.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/key_management_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/load_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/plugins_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/protocol_management_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/proxy_registration_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/reload_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/result.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/role_test_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/roles_management_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/security_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/settings_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/ssl_setup_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/token_management_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/transport_management_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/commands/unload_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/config.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/__init__.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/app_factory.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/app_runner.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/auth_validator.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/certificate_utils.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/client.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/client_manager.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/client_security.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/config_converter.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/config_validator.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/crl_utils.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/errors.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/logging.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/mtls_asgi.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/mtls_asgi_app.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/mtls_server.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/protocol_manager.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/proxy_client.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/role_utils.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/security_adapter.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/security_factory.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/security_integration.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/server_adapter.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/server_engine.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/settings.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/ssl_utils.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/transport_manager.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/unified_config_adapter.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/utils.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/custom_openapi.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/__init__.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/basic_framework/__init__.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/basic_framework/main.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/commands/__init__.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/debug_request_state.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/debug_role_chain.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/demo_client.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/full_application/__init__.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/full_application/commands/__init__.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/full_application/hooks/__init__.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/full_application/main.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/generate_all_certificates.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/proxy_registration_example.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/run_example.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/run_proxy_server.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/test_config.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/test_examples.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/examples/universal_client.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/main.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/openapi.py +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter.egg-info/dependency_links.txt +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter.egg-info/entry_points.txt +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter.egg-info/not-zip-safe +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter.egg-info/requires.txt +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter.egg-info/top_level.txt +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/setup.cfg +0 -0
- {mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/setup.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: mcp-proxy-adapter
|
3
|
-
Version: 6.4.
|
3
|
+
Version: 6.4.44
|
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
|
@@ -74,9 +74,15 @@ def create_lifespan(config_path: Optional[str] = None):
|
|
74
74
|
# Compute server_url EARLY and inject into registration manager so
|
75
75
|
# that reload_system (which may perform registration) uses the correct
|
76
76
|
# externally reachable address.
|
77
|
-
server_config = config.get("server"
|
78
|
-
|
79
|
-
|
77
|
+
server_config = config.get("server")
|
78
|
+
if not server_config:
|
79
|
+
raise ValueError("server configuration is required")
|
80
|
+
server_host = server_config.get("host")
|
81
|
+
server_port = server_config.get("port")
|
82
|
+
if not server_host:
|
83
|
+
raise ValueError("server.host is required")
|
84
|
+
if not server_port:
|
85
|
+
raise ValueError("server.port is required")
|
80
86
|
|
81
87
|
reg_cfg = config.get("registration", {})
|
82
88
|
public_host = reg_cfg.get("public_host")
|
{mcp_proxy_adapter-6.4.42 → mcp_proxy_adapter-6.4.44}/mcp_proxy_adapter/core/proxy_registration.py
RENAMED
@@ -69,41 +69,83 @@ class ProxyRegistrationManager:
|
|
69
69
|
pass
|
70
70
|
|
71
71
|
# Basic registration settings
|
72
|
-
self.proxy_url = self.registration_config.get(
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
self.
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
)
|
72
|
+
self.proxy_url = self.registration_config.get("proxy_url")
|
73
|
+
if not self.proxy_url:
|
74
|
+
raise ValueError(
|
75
|
+
"proxy_url is required in registration configuration. "
|
76
|
+
"Please specify a valid proxy URL in your configuration."
|
77
|
+
)
|
78
|
+
self.server_id = self.registration_config.get("server_id")
|
79
|
+
if not self.server_id:
|
80
|
+
# Try to get from proxy_info.name as fallback
|
81
|
+
self.server_id = self.registration_config.get("proxy_info", {}).get("name")
|
82
|
+
if not self.server_id:
|
83
|
+
raise ValueError(
|
84
|
+
"server_id is required in registration configuration. "
|
85
|
+
"Please specify a server_id or proxy_info.name in your configuration."
|
86
|
+
)
|
87
|
+
self.server_name = self.registration_config.get("server_name")
|
88
|
+
if not self.server_name:
|
89
|
+
# Try to get from proxy_info.name as fallback
|
90
|
+
self.server_name = self.registration_config.get("proxy_info", {}).get("name")
|
91
|
+
if not self.server_name:
|
92
|
+
raise ValueError(
|
93
|
+
"server_name is required in registration configuration. "
|
94
|
+
"Please specify a server_name or proxy_info.name in your configuration."
|
95
|
+
)
|
96
|
+
self.description = self.registration_config.get("description")
|
97
|
+
if not self.description:
|
98
|
+
# Try to get from proxy_info.description as fallback
|
99
|
+
self.description = self.registration_config.get("proxy_info", {}).get("description")
|
100
|
+
if not self.description:
|
101
|
+
raise ValueError(
|
102
|
+
"description is required in registration configuration. "
|
103
|
+
"Please specify a description or proxy_info.description in your configuration."
|
104
|
+
)
|
105
|
+
self.version = self.registration_config.get("version")
|
106
|
+
if not self.version:
|
107
|
+
# Try to get from proxy_info.version as fallback
|
108
|
+
self.version = self.registration_config.get("proxy_info", {}).get("version")
|
109
|
+
if not self.version:
|
110
|
+
raise ValueError(
|
111
|
+
"version is required in registration configuration. "
|
112
|
+
"Please specify a version or proxy_info.version in your configuration."
|
113
|
+
)
|
97
114
|
|
98
115
|
# Heartbeat settings
|
99
116
|
heartbeat_config = self.registration_config.get("heartbeat", {})
|
100
|
-
self.timeout = heartbeat_config.get("timeout"
|
101
|
-
self.
|
102
|
-
|
103
|
-
|
117
|
+
self.timeout = heartbeat_config.get("timeout")
|
118
|
+
if self.timeout is None:
|
119
|
+
raise ValueError(
|
120
|
+
"heartbeat.timeout is required in registration configuration. "
|
121
|
+
"Please specify a timeout value."
|
122
|
+
)
|
123
|
+
self.retry_attempts = heartbeat_config.get("retry_attempts")
|
124
|
+
if self.retry_attempts is None:
|
125
|
+
raise ValueError(
|
126
|
+
"heartbeat.retry_attempts is required in registration configuration. "
|
127
|
+
"Please specify a retry_attempts value."
|
128
|
+
)
|
129
|
+
self.retry_delay = heartbeat_config.get("retry_delay")
|
130
|
+
if self.retry_delay is None:
|
131
|
+
raise ValueError(
|
132
|
+
"heartbeat.retry_delay is required in registration configuration. "
|
133
|
+
"Please specify a retry_delay value."
|
134
|
+
)
|
135
|
+
self.heartbeat_interval = heartbeat_config.get("interval")
|
136
|
+
if self.heartbeat_interval is None:
|
137
|
+
raise ValueError(
|
138
|
+
"heartbeat.interval is required in registration configuration. "
|
139
|
+
"Please specify an interval value."
|
140
|
+
)
|
104
141
|
|
105
142
|
# Auto registration settings
|
106
|
-
self.auto_register = self.registration_config.get("enabled"
|
143
|
+
self.auto_register = self.registration_config.get("enabled")
|
144
|
+
if self.auto_register is None:
|
145
|
+
raise ValueError(
|
146
|
+
"enabled is required in registration configuration. "
|
147
|
+
"Please specify whether registration is enabled (true/false)."
|
148
|
+
)
|
107
149
|
self.auto_unregister = True # Always unregister on shutdown
|
108
150
|
|
109
151
|
# Initialize client security manager
|
@@ -273,20 +315,15 @@ class ProxyRegistrationManager:
|
|
273
315
|
context.verify_mode = ssl.CERT_REQUIRED
|
274
316
|
logger.debug("SSL verification enabled (CERT_REQUIRED)")
|
275
317
|
else:
|
276
|
-
#
|
277
|
-
context.check_hostname =
|
278
|
-
context.verify_mode = ssl.
|
279
|
-
logger.debug("SSL verification
|
318
|
+
# For test environments, default to CERT_NONE to avoid certificate issues
|
319
|
+
context.check_hostname = False
|
320
|
+
context.verify_mode = ssl.CERT_NONE
|
321
|
+
logger.debug("SSL verification disabled (default for test environment)")
|
280
322
|
else:
|
281
|
-
# No specific ssl_config, default to
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
context.verify_mode = ssl.CERT_REQUIRED
|
286
|
-
logger.debug("Using default SSL verification with provided client certs")
|
287
|
-
else:
|
288
|
-
# Last resort: use system defaults
|
289
|
-
logger.debug("Using system default SSL verification")
|
323
|
+
# No specific ssl_config, default to CERT_NONE for test environments
|
324
|
+
context.check_hostname = False
|
325
|
+
context.verify_mode = ssl.CERT_NONE
|
326
|
+
logger.debug("Using CERT_NONE for test environment (no ssl_config)")
|
290
327
|
|
291
328
|
logger.info("Created custom SSL context for proxy registration")
|
292
329
|
return context
|
@@ -7,6 +7,7 @@ email: vasilyvz@gmail.com
|
|
7
7
|
"""
|
8
8
|
import json
|
9
9
|
import shutil
|
10
|
+
import uuid
|
10
11
|
from pathlib import Path
|
11
12
|
from typing import Dict, Any, Optional
|
12
13
|
|
@@ -44,6 +45,10 @@ class TestConfigGenerator:
|
|
44
45
|
# Deep copy the base config
|
45
46
|
config = json.loads(json.dumps(self.base_config))
|
46
47
|
|
48
|
+
# Add UUID if not present
|
49
|
+
if "uuid" not in config:
|
50
|
+
config["uuid"] = str(uuid.uuid4())
|
51
|
+
|
47
52
|
# Apply modifications
|
48
53
|
for key, value in modifications.items():
|
49
54
|
self._set_nested_value(config, key, value)
|
@@ -93,29 +98,32 @@ class TestConfigGenerator:
|
|
93
98
|
"admin": "admin-secret-key",
|
94
99
|
"user": "user-secret-key"
|
95
100
|
},
|
96
|
-
"proxy_registration.enabled":
|
101
|
+
"proxy_registration.enabled": True,
|
102
|
+
"proxy_registration.auth_method": "token",
|
103
|
+
"proxy_registration.server_url": "https://127.0.0.1:20005/register",
|
104
|
+
"proxy_registration.proxy_url": "https://127.0.0.1:20005",
|
105
|
+
"proxy_registration.server_id": "http_token_server",
|
106
|
+
"proxy_registration.server_name": "HTTP Token Server",
|
107
|
+
"proxy_registration.description": "HTTP server with token authentication",
|
108
|
+
"proxy_registration.version": "1.0.0",
|
109
|
+
"proxy_registration.token.enabled": True,
|
110
|
+
"proxy_registration.token.token": "http_token_123",
|
111
|
+
"proxy_registration.heartbeat.enabled": True,
|
112
|
+
"proxy_registration.heartbeat.interval": 30,
|
113
|
+
"proxy_registration.heartbeat.timeout": 10,
|
114
|
+
"proxy_registration.heartbeat.retry_attempts": 3,
|
115
|
+
"proxy_registration.heartbeat.retry_delay": 5,
|
97
116
|
"protocols.allowed_protocols": ["http"],
|
98
117
|
"protocols.default_protocol": "http"
|
99
118
|
})
|
100
119
|
|
101
|
-
# 3. HTTPS
|
102
|
-
self.create_config("https_simple", {
|
103
|
-
"server.port": 20022, # Dedicated port for https
|
104
|
-
"ssl.enabled": True,
|
105
|
-
"ssl.cert_file": "certs/localhost_server.crt",
|
106
|
-
"ssl.key_file": "keys/server_key.pem",
|
107
|
-
"security.enabled": False,
|
108
|
-
"proxy_registration.enabled": False,
|
109
|
-
"protocols.allowed_protocols": ["https"],
|
110
|
-
"protocols.default_protocol": "https"
|
111
|
-
})
|
112
|
-
|
113
|
-
# 4. HTTPS with Auth (renamed to https_token for security tests)
|
120
|
+
# 3. HTTPS with Auth (renamed to https_token for security tests)
|
114
121
|
self.create_config("https_token", {
|
115
122
|
"server.port": 20023, # Dedicated port for https_token
|
116
123
|
"ssl.enabled": True,
|
117
|
-
"ssl.cert_file": "certs/
|
118
|
-
"ssl.key_file": "
|
124
|
+
"ssl.cert_file": "certs/mcp_proxy_adapter_server.crt",
|
125
|
+
"ssl.key_file": "certs/mcp_proxy_adapter_server.key",
|
126
|
+
"ssl.ca_cert": "certs/mcp_proxy_adapter_ca_ca.crt",
|
119
127
|
"security.enabled": True,
|
120
128
|
"security.auth.enabled": True,
|
121
129
|
"security.auth.methods": ["api_key"],
|
@@ -123,6 +131,33 @@ class TestConfigGenerator:
|
|
123
131
|
"admin": "admin-secret-key",
|
124
132
|
"user": "user-secret-key"
|
125
133
|
},
|
134
|
+
"proxy_registration.enabled": True,
|
135
|
+
"proxy_registration.auth_method": "token",
|
136
|
+
"proxy_registration.server_url": "https://127.0.0.1:20005/register",
|
137
|
+
"proxy_registration.proxy_url": "https://127.0.0.1:20005",
|
138
|
+
"proxy_registration.server_id": "https_token_server",
|
139
|
+
"proxy_registration.server_name": "HTTPS Token Server",
|
140
|
+
"proxy_registration.description": "HTTPS server with token authentication",
|
141
|
+
"proxy_registration.version": "1.0.0",
|
142
|
+
"proxy_registration.token.enabled": True,
|
143
|
+
"proxy_registration.token.token": "https_token_123",
|
144
|
+
"proxy_registration.heartbeat.enabled": True,
|
145
|
+
"proxy_registration.heartbeat.interval": 30,
|
146
|
+
"proxy_registration.heartbeat.timeout": 10,
|
147
|
+
"proxy_registration.heartbeat.retry_attempts": 3,
|
148
|
+
"proxy_registration.heartbeat.retry_delay": 5,
|
149
|
+
"protocols.allowed_protocols": ["https"],
|
150
|
+
"protocols.default_protocol": "https"
|
151
|
+
})
|
152
|
+
|
153
|
+
# 4. HTTPS Simple (without auth)
|
154
|
+
self.create_config("https_simple", {
|
155
|
+
"server.port": 20022, # Dedicated port for https_simple
|
156
|
+
"ssl.enabled": True,
|
157
|
+
"ssl.cert_file": "certs/mcp_proxy_adapter_server.crt",
|
158
|
+
"ssl.key_file": "certs/mcp_proxy_adapter_server.key",
|
159
|
+
"ssl.ca_cert": "certs/mcp_proxy_adapter_ca_ca.crt",
|
160
|
+
"security.enabled": False,
|
126
161
|
"proxy_registration.enabled": False,
|
127
162
|
"protocols.allowed_protocols": ["https"],
|
128
163
|
"protocols.default_protocol": "https"
|
@@ -324,15 +324,27 @@ class FullTestSuiteRunner:
|
|
324
324
|
"verify_client": True,
|
325
325
|
},
|
326
326
|
"registration": {
|
327
|
-
|
328
|
-
|
329
|
-
|
327
|
+
"enabled": True,
|
328
|
+
"auth_method": "token",
|
329
|
+
"server_url": "https://127.0.0.1:20005/register",
|
330
|
+
"proxy_url": "https://127.0.0.1:20005",
|
331
|
+
"fallback_proxy_url": "http://127.0.0.1:20005",
|
332
|
+
"ssl": {
|
333
|
+
"verify_mode": "CERT_NONE",
|
334
|
+
"check_hostname": False
|
335
|
+
},
|
336
|
+
"server_id": "mcp_test_server",
|
337
|
+
"server_name": "MCP Test Server",
|
338
|
+
"description": "Test server for proxy registration",
|
339
|
+
"version": "1.0.0",
|
330
340
|
"token": {
|
331
341
|
"enabled": True,
|
332
342
|
"token": "proxy_registration_token_123",
|
333
343
|
},
|
334
344
|
"proxy_info": {
|
335
345
|
"name": "mcp_test_server",
|
346
|
+
"description": "Test server for proxy registration",
|
347
|
+
"version": "1.0.0",
|
336
348
|
"capabilities": [
|
337
349
|
"jsonrpc",
|
338
350
|
"rest",
|
@@ -345,7 +357,13 @@ class FullTestSuiteRunner:
|
|
345
357
|
"health": "/health",
|
346
358
|
},
|
347
359
|
},
|
348
|
-
"heartbeat": {
|
360
|
+
"heartbeat": {
|
361
|
+
"enabled": True,
|
362
|
+
"interval": 30,
|
363
|
+
"timeout": 10,
|
364
|
+
"retry_attempts": 3,
|
365
|
+
"retry_delay": 60
|
366
|
+
},
|
349
367
|
},
|
350
368
|
"security": {
|
351
369
|
"enabled": True,
|
@@ -19,7 +19,7 @@ from typing import Dict, List, Optional, Tuple
|
|
19
19
|
# Add project root to path
|
20
20
|
project_root = Path(__file__).parent.parent.parent
|
21
21
|
sys.path.insert(0, str(project_root))
|
22
|
-
from security_test_client import SecurityTestClient, TestResult
|
22
|
+
from .security_test_client import SecurityTestClient, TestResult
|
23
23
|
|
24
24
|
|
25
25
|
class SecurityTestRunner:
|
@@ -30,8 +30,8 @@ sys.path.insert(0, str(current_dir))
|
|
30
30
|
|
31
31
|
# Import mcp_security_framework components
|
32
32
|
try:
|
33
|
-
from mcp_security_framework import
|
34
|
-
from mcp_security_framework.schemas.config import SSLConfig
|
33
|
+
from mcp_security_framework import SecurityManager, SSLConfig
|
34
|
+
from mcp_security_framework.schemas.config import SSLConfig as SSLConfigSchema
|
35
35
|
|
36
36
|
_MCP_SECURITY_AVAILABLE = True
|
37
37
|
print("✅ mcp_security_framework available")
|
@@ -221,14 +221,18 @@ class SecurityTestClient:
|
|
221
221
|
"""Create authentication headers."""
|
222
222
|
headers = {"Content-Type": "application/json"}
|
223
223
|
if auth_type == "api_key":
|
224
|
-
token = kwargs.get("token"
|
224
|
+
token = kwargs.get("token")
|
225
|
+
if not token:
|
226
|
+
raise ValueError("token is required for api_key authentication")
|
225
227
|
print(f"🔍 DEBUG: Using token: {token}")
|
226
228
|
# Provide both common header styles to maximize compatibility
|
227
229
|
headers["X-API-Key"] = token
|
228
230
|
headers["Authorization"] = f"Bearer {token}"
|
229
231
|
elif auth_type == "basic":
|
230
|
-
username = kwargs.get("username"
|
231
|
-
password = kwargs.get("password"
|
232
|
+
username = kwargs.get("username")
|
233
|
+
password = kwargs.get("password")
|
234
|
+
if not username or not password:
|
235
|
+
raise ValueError("username and password are required for basic authentication")
|
232
236
|
import base64
|
233
237
|
|
234
238
|
credentials = base64.b64encode(f"{username}:{password}".encode()).decode()
|
@@ -550,8 +554,12 @@ class SecurityTestClient:
|
|
550
554
|
test_name = f"Role-Based Access ({auth_type})"
|
551
555
|
try:
|
552
556
|
# Test with different roles
|
553
|
-
role = kwargs.get("role"
|
554
|
-
|
557
|
+
role = kwargs.get("role")
|
558
|
+
if not role:
|
559
|
+
raise ValueError("role is required for role-based access test")
|
560
|
+
token = self.test_tokens.get(role)
|
561
|
+
if not token:
|
562
|
+
raise ValueError(f"token for role '{role}' is not configured")
|
555
563
|
headers = self.create_auth_headers("api_key", token=token)
|
556
564
|
data = {
|
557
565
|
"jsonrpc": "2.0",
|
@@ -604,9 +612,15 @@ class SecurityTestClient:
|
|
604
612
|
test_name = f"Role Permissions Test ({auth_type})"
|
605
613
|
try:
|
606
614
|
# Test with different roles and actions
|
607
|
-
role = kwargs.get("role"
|
608
|
-
action = kwargs.get("action"
|
609
|
-
|
615
|
+
role = kwargs.get("role")
|
616
|
+
action = kwargs.get("action")
|
617
|
+
if not role:
|
618
|
+
raise ValueError("role is required for role permissions test")
|
619
|
+
if not action:
|
620
|
+
raise ValueError("action is required for role permissions test")
|
621
|
+
token = self.test_tokens.get(role)
|
622
|
+
if not token:
|
623
|
+
raise ValueError(f"token for role '{role}' is not configured")
|
610
624
|
headers = self.create_auth_headers("api_key", token=token)
|
611
625
|
data = {
|
612
626
|
"jsonrpc": "2.0",
|
@@ -659,7 +673,9 @@ class SecurityTestClient:
|
|
659
673
|
test_name = f"Multiple Roles Test ({auth_type})"
|
660
674
|
try:
|
661
675
|
# Test admin role (should have all permissions)
|
662
|
-
admin_token = self.test_tokens.get("admin"
|
676
|
+
admin_token = self.test_tokens.get("admin")
|
677
|
+
if not admin_token:
|
678
|
+
raise ValueError("admin token is not configured")
|
663
679
|
admin_headers = self.create_auth_headers("api_key", token=admin_token)
|
664
680
|
admin_data = {
|
665
681
|
"jsonrpc": "2.0",
|
@@ -681,7 +697,9 @@ class SecurityTestClient:
|
|
681
697
|
duration=time.time() - start_time,
|
682
698
|
)
|
683
699
|
# Test readonly role (should only have read permission)
|
684
|
-
readonly_token = self.test_tokens.get("readonly"
|
700
|
+
readonly_token = self.test_tokens.get("readonly")
|
701
|
+
if not readonly_token:
|
702
|
+
raise ValueError("readonly token is not configured")
|
685
703
|
readonly_headers = self.create_auth_headers(
|
686
704
|
"api_key", token=readonly_token
|
687
705
|
)
|
@@ -739,7 +757,7 @@ class SecurityTestClient:
|
|
739
757
|
self.test_echo_command(server_url, auth_type, **kwargs),
|
740
758
|
self.test_security_command(server_url, auth_type, **kwargs),
|
741
759
|
self.test_negative_auth(server_url, auth_type, **kwargs),
|
742
|
-
self.test_role_based_access(server_url, auth_type, **kwargs),
|
760
|
+
self.test_role_based_access(server_url, auth_type, role="admin", **kwargs),
|
743
761
|
]
|
744
762
|
results = []
|
745
763
|
for test in tests:
|