mcp-proxy-adapter 4.1.1__py3-none-any.whl → 6.1.0__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.
Files changed (253) hide show
  1. mcp_proxy_adapter/__main__.py +12 -0
  2. mcp_proxy_adapter/api/app.py +254 -33
  3. mcp_proxy_adapter/api/handlers.py +32 -6
  4. mcp_proxy_adapter/api/middleware/__init__.py +36 -30
  5. mcp_proxy_adapter/api/middleware/command_permission_middleware.py +148 -0
  6. mcp_proxy_adapter/api/middleware/error_handling.py +9 -0
  7. mcp_proxy_adapter/api/middleware/factory.py +243 -0
  8. mcp_proxy_adapter/api/middleware/logging.py +32 -6
  9. mcp_proxy_adapter/api/middleware/protocol_middleware.py +135 -0
  10. mcp_proxy_adapter/api/middleware/transport_middleware.py +122 -0
  11. mcp_proxy_adapter/api/middleware/unified_security.py +152 -0
  12. mcp_proxy_adapter/api/middleware/user_info_middleware.py +83 -0
  13. mcp_proxy_adapter/commands/__init__.py +19 -4
  14. mcp_proxy_adapter/commands/auth_validation_command.py +408 -0
  15. mcp_proxy_adapter/commands/base.py +66 -32
  16. mcp_proxy_adapter/commands/builtin_commands.py +95 -0
  17. mcp_proxy_adapter/commands/catalog_manager.py +838 -0
  18. mcp_proxy_adapter/commands/cert_monitor_command.py +620 -0
  19. mcp_proxy_adapter/commands/certificate_management_command.py +608 -0
  20. mcp_proxy_adapter/commands/command_registry.py +711 -354
  21. mcp_proxy_adapter/commands/dependency_manager.py +245 -0
  22. mcp_proxy_adapter/commands/echo_command.py +81 -0
  23. mcp_proxy_adapter/commands/health_command.py +7 -0
  24. mcp_proxy_adapter/commands/help_command.py +21 -14
  25. mcp_proxy_adapter/commands/hooks.py +200 -167
  26. mcp_proxy_adapter/commands/key_management_command.py +506 -0
  27. mcp_proxy_adapter/commands/load_command.py +176 -0
  28. mcp_proxy_adapter/commands/plugins_command.py +235 -0
  29. mcp_proxy_adapter/commands/protocol_management_command.py +232 -0
  30. mcp_proxy_adapter/commands/proxy_registration_command.py +409 -0
  31. mcp_proxy_adapter/commands/reload_command.py +48 -50
  32. mcp_proxy_adapter/commands/result.py +1 -0
  33. mcp_proxy_adapter/commands/role_test_command.py +141 -0
  34. mcp_proxy_adapter/commands/roles_management_command.py +697 -0
  35. mcp_proxy_adapter/commands/security_command.py +488 -0
  36. mcp_proxy_adapter/commands/ssl_setup_command.py +483 -0
  37. mcp_proxy_adapter/commands/token_management_command.py +529 -0
  38. mcp_proxy_adapter/commands/transport_management_command.py +144 -0
  39. mcp_proxy_adapter/commands/unload_command.py +158 -0
  40. mcp_proxy_adapter/config.py +159 -2
  41. mcp_proxy_adapter/core/app_factory.py +326 -0
  42. mcp_proxy_adapter/core/auth_validator.py +606 -0
  43. mcp_proxy_adapter/core/certificate_utils.py +827 -0
  44. mcp_proxy_adapter/core/client_security.py +384 -0
  45. mcp_proxy_adapter/core/config_converter.py +405 -0
  46. mcp_proxy_adapter/core/config_validator.py +218 -0
  47. mcp_proxy_adapter/core/logging.py +19 -3
  48. mcp_proxy_adapter/core/mtls_asgi.py +156 -0
  49. mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
  50. mcp_proxy_adapter/core/protocol_manager.py +235 -0
  51. mcp_proxy_adapter/core/proxy_client.py +602 -0
  52. mcp_proxy_adapter/core/proxy_registration.py +522 -0
  53. mcp_proxy_adapter/core/role_utils.py +426 -0
  54. mcp_proxy_adapter/core/security_adapter.py +370 -0
  55. mcp_proxy_adapter/core/security_factory.py +239 -0
  56. mcp_proxy_adapter/core/security_integration.py +277 -0
  57. mcp_proxy_adapter/core/server_adapter.py +345 -0
  58. mcp_proxy_adapter/core/server_engine.py +364 -0
  59. mcp_proxy_adapter/core/settings.py +1 -0
  60. mcp_proxy_adapter/core/ssl_utils.py +233 -0
  61. mcp_proxy_adapter/core/transport_manager.py +292 -0
  62. mcp_proxy_adapter/core/unified_config_adapter.py +579 -0
  63. mcp_proxy_adapter/custom_openapi.py +22 -11
  64. mcp_proxy_adapter/examples/README.md +230 -97
  65. mcp_proxy_adapter/examples/README_EN.md +258 -0
  66. mcp_proxy_adapter/examples/SECURITY_TESTING.md +455 -0
  67. mcp_proxy_adapter/examples/__pycache__/security_configurations.cpython-312.pyc +0 -0
  68. mcp_proxy_adapter/examples/__pycache__/security_test_client.cpython-312.pyc +0 -0
  69. mcp_proxy_adapter/examples/basic_framework/configs/http_auth.json +37 -0
  70. mcp_proxy_adapter/examples/basic_framework/configs/http_simple.json +23 -0
  71. mcp_proxy_adapter/examples/basic_framework/configs/https_auth.json +39 -0
  72. mcp_proxy_adapter/examples/basic_framework/configs/https_simple.json +25 -0
  73. mcp_proxy_adapter/examples/basic_framework/configs/mtls_no_roles.json +39 -0
  74. mcp_proxy_adapter/examples/basic_framework/configs/mtls_with_roles.json +45 -0
  75. mcp_proxy_adapter/examples/basic_framework/main.py +63 -0
  76. mcp_proxy_adapter/examples/basic_framework/roles.json +21 -0
  77. mcp_proxy_adapter/examples/cert_config.json +9 -0
  78. mcp_proxy_adapter/examples/certs/admin.crt +32 -0
  79. mcp_proxy_adapter/examples/certs/admin.key +52 -0
  80. mcp_proxy_adapter/examples/certs/admin_cert.pem +21 -0
  81. mcp_proxy_adapter/examples/certs/admin_key.pem +28 -0
  82. mcp_proxy_adapter/examples/certs/ca_cert.pem +23 -0
  83. mcp_proxy_adapter/examples/certs/ca_cert.srl +1 -0
  84. mcp_proxy_adapter/examples/certs/ca_key.pem +28 -0
  85. mcp_proxy_adapter/examples/certs/cert_config.json +9 -0
  86. mcp_proxy_adapter/examples/certs/client.crt +32 -0
  87. mcp_proxy_adapter/examples/certs/client.key +52 -0
  88. mcp_proxy_adapter/examples/certs/client_admin.crt +32 -0
  89. mcp_proxy_adapter/examples/certs/client_admin.key +52 -0
  90. mcp_proxy_adapter/examples/certs/client_user.crt +32 -0
  91. mcp_proxy_adapter/examples/certs/client_user.key +52 -0
  92. mcp_proxy_adapter/examples/certs/guest_cert.pem +21 -0
  93. mcp_proxy_adapter/examples/certs/guest_key.pem +28 -0
  94. mcp_proxy_adapter/examples/certs/mcp_proxy_adapter_ca_ca.crt +23 -0
  95. mcp_proxy_adapter/examples/certs/proxy_cert.pem +21 -0
  96. mcp_proxy_adapter/examples/certs/proxy_key.pem +28 -0
  97. mcp_proxy_adapter/examples/certs/readonly.crt +32 -0
  98. mcp_proxy_adapter/examples/certs/readonly.key +52 -0
  99. mcp_proxy_adapter/examples/certs/readonly_cert.pem +21 -0
  100. mcp_proxy_adapter/examples/certs/readonly_key.pem +28 -0
  101. mcp_proxy_adapter/examples/certs/server.crt +32 -0
  102. mcp_proxy_adapter/examples/certs/server.key +52 -0
  103. mcp_proxy_adapter/examples/certs/server_cert.pem +32 -0
  104. mcp_proxy_adapter/examples/certs/server_key.pem +52 -0
  105. mcp_proxy_adapter/examples/certs/test_ca_ca.crt +20 -0
  106. mcp_proxy_adapter/examples/certs/user.crt +32 -0
  107. mcp_proxy_adapter/examples/certs/user.key +52 -0
  108. mcp_proxy_adapter/examples/certs/user_cert.pem +21 -0
  109. mcp_proxy_adapter/examples/certs/user_key.pem +28 -0
  110. mcp_proxy_adapter/examples/client_configs/api_key_client.json +13 -0
  111. mcp_proxy_adapter/examples/client_configs/basic_auth_client.json +13 -0
  112. mcp_proxy_adapter/examples/client_configs/certificate_client.json +22 -0
  113. mcp_proxy_adapter/examples/client_configs/jwt_client.json +15 -0
  114. mcp_proxy_adapter/examples/client_configs/no_auth_client.json +9 -0
  115. mcp_proxy_adapter/examples/commands/__init__.py +1 -0
  116. mcp_proxy_adapter/examples/create_certificates_simple.py +307 -0
  117. mcp_proxy_adapter/examples/debug_request_state.py +144 -0
  118. mcp_proxy_adapter/examples/debug_role_chain.py +205 -0
  119. mcp_proxy_adapter/examples/demo_client.py +341 -0
  120. mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +99 -0
  121. mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +106 -0
  122. mcp_proxy_adapter/examples/full_application/configs/http_auth.json +37 -0
  123. mcp_proxy_adapter/examples/full_application/configs/http_simple.json +23 -0
  124. mcp_proxy_adapter/examples/full_application/configs/https_auth.json +39 -0
  125. mcp_proxy_adapter/examples/full_application/configs/https_simple.json +25 -0
  126. mcp_proxy_adapter/examples/full_application/configs/mtls_no_roles.json +39 -0
  127. mcp_proxy_adapter/examples/full_application/configs/mtls_with_roles.json +45 -0
  128. mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +97 -0
  129. mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +95 -0
  130. mcp_proxy_adapter/examples/full_application/main.py +138 -0
  131. mcp_proxy_adapter/examples/full_application/roles.json +21 -0
  132. mcp_proxy_adapter/examples/generate_all_certificates.py +429 -0
  133. mcp_proxy_adapter/examples/generate_certificates.py +121 -0
  134. mcp_proxy_adapter/examples/keys/ca_key.pem +28 -0
  135. mcp_proxy_adapter/examples/keys/mcp_proxy_adapter_ca_ca.key +28 -0
  136. mcp_proxy_adapter/examples/keys/test_ca_ca.key +28 -0
  137. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log +220 -0
  138. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.1 +1 -0
  139. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.2 +1 -0
  140. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.3 +1 -0
  141. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.4 +1 -0
  142. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.5 +1 -0
  143. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log +220 -0
  144. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.1 +1 -0
  145. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.2 +1 -0
  146. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.3 +1 -0
  147. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.4 +1 -0
  148. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.5 +1 -0
  149. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log +2 -0
  150. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.1 +1 -0
  151. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.2 +1 -0
  152. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.3 +1 -0
  153. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.4 +1 -0
  154. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.5 +1 -0
  155. mcp_proxy_adapter/examples/proxy_registration_example.py +401 -0
  156. mcp_proxy_adapter/examples/roles.json +38 -0
  157. mcp_proxy_adapter/examples/run_example.py +81 -0
  158. mcp_proxy_adapter/examples/run_security_tests.py +326 -0
  159. mcp_proxy_adapter/examples/run_security_tests_fixed.py +300 -0
  160. mcp_proxy_adapter/examples/security_test_client.py +743 -0
  161. mcp_proxy_adapter/examples/server_configs/config_basic_http.json +204 -0
  162. mcp_proxy_adapter/examples/server_configs/config_http_token.json +238 -0
  163. mcp_proxy_adapter/examples/server_configs/config_https.json +215 -0
  164. mcp_proxy_adapter/examples/server_configs/config_https_token.json +231 -0
  165. mcp_proxy_adapter/examples/server_configs/config_mtls.json +215 -0
  166. mcp_proxy_adapter/examples/server_configs/config_proxy_registration.json +250 -0
  167. mcp_proxy_adapter/examples/server_configs/config_simple.json +46 -0
  168. mcp_proxy_adapter/examples/server_configs/roles.json +38 -0
  169. mcp_proxy_adapter/examples/test_examples.py +344 -0
  170. mcp_proxy_adapter/examples/universal_client.py +628 -0
  171. mcp_proxy_adapter/main.py +186 -0
  172. mcp_proxy_adapter/utils/config_generator.py +639 -0
  173. mcp_proxy_adapter/version.py +2 -1
  174. mcp_proxy_adapter-6.1.0.dist-info/METADATA +205 -0
  175. mcp_proxy_adapter-6.1.0.dist-info/RECORD +193 -0
  176. mcp_proxy_adapter-6.1.0.dist-info/entry_points.txt +2 -0
  177. {mcp_proxy_adapter-4.1.1.dist-info → mcp_proxy_adapter-6.1.0.dist-info}/licenses/LICENSE +2 -2
  178. mcp_proxy_adapter/api/middleware/auth.py +0 -146
  179. mcp_proxy_adapter/api/middleware/rate_limit.py +0 -152
  180. mcp_proxy_adapter/commands/reload_settings_command.py +0 -125
  181. mcp_proxy_adapter/examples/__init__.py +0 -7
  182. mcp_proxy_adapter/examples/basic_server/README.md +0 -60
  183. mcp_proxy_adapter/examples/basic_server/__init__.py +0 -7
  184. mcp_proxy_adapter/examples/basic_server/basic_custom_settings.json +0 -39
  185. mcp_proxy_adapter/examples/basic_server/config.json +0 -35
  186. mcp_proxy_adapter/examples/basic_server/custom_settings_example.py +0 -238
  187. mcp_proxy_adapter/examples/basic_server/server.py +0 -103
  188. mcp_proxy_adapter/examples/custom_commands/README.md +0 -127
  189. mcp_proxy_adapter/examples/custom_commands/__init__.py +0 -27
  190. mcp_proxy_adapter/examples/custom_commands/advanced_hooks.py +0 -250
  191. mcp_proxy_adapter/examples/custom_commands/auto_commands/__init__.py +0 -6
  192. mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_echo_command.py +0 -103
  193. mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_info_command.py +0 -111
  194. mcp_proxy_adapter/examples/custom_commands/config.json +0 -35
  195. mcp_proxy_adapter/examples/custom_commands/custom_health_command.py +0 -169
  196. mcp_proxy_adapter/examples/custom_commands/custom_help_command.py +0 -215
  197. mcp_proxy_adapter/examples/custom_commands/custom_openapi_generator.py +0 -76
  198. mcp_proxy_adapter/examples/custom_commands/custom_settings.json +0 -96
  199. mcp_proxy_adapter/examples/custom_commands/custom_settings_manager.py +0 -241
  200. mcp_proxy_adapter/examples/custom_commands/data_transform_command.py +0 -135
  201. mcp_proxy_adapter/examples/custom_commands/echo_command.py +0 -122
  202. mcp_proxy_adapter/examples/custom_commands/hooks.py +0 -230
  203. mcp_proxy_adapter/examples/custom_commands/intercept_command.py +0 -123
  204. mcp_proxy_adapter/examples/custom_commands/manual_echo_command.py +0 -103
  205. mcp_proxy_adapter/examples/custom_commands/server.py +0 -228
  206. mcp_proxy_adapter/examples/custom_commands/test_hooks.py +0 -176
  207. mcp_proxy_adapter/examples/deployment/README.md +0 -49
  208. mcp_proxy_adapter/examples/deployment/__init__.py +0 -7
  209. mcp_proxy_adapter/examples/deployment/config.development.json +0 -8
  210. mcp_proxy_adapter/examples/deployment/config.json +0 -29
  211. mcp_proxy_adapter/examples/deployment/config.production.json +0 -12
  212. mcp_proxy_adapter/examples/deployment/config.staging.json +0 -11
  213. mcp_proxy_adapter/examples/deployment/docker-compose.yml +0 -31
  214. mcp_proxy_adapter/examples/deployment/run.sh +0 -43
  215. mcp_proxy_adapter/examples/deployment/run_docker.sh +0 -84
  216. mcp_proxy_adapter/schemas/base_schema.json +0 -114
  217. mcp_proxy_adapter/schemas/openapi_schema.json +0 -314
  218. mcp_proxy_adapter/tests/__init__.py +0 -0
  219. mcp_proxy_adapter/tests/api/__init__.py +0 -3
  220. mcp_proxy_adapter/tests/api/test_cmd_endpoint.py +0 -115
  221. mcp_proxy_adapter/tests/api/test_custom_openapi.py +0 -617
  222. mcp_proxy_adapter/tests/api/test_handlers.py +0 -522
  223. mcp_proxy_adapter/tests/api/test_middleware.py +0 -340
  224. mcp_proxy_adapter/tests/api/test_schemas.py +0 -546
  225. mcp_proxy_adapter/tests/api/test_tool_integration.py +0 -531
  226. mcp_proxy_adapter/tests/commands/__init__.py +0 -3
  227. mcp_proxy_adapter/tests/commands/test_config_command.py +0 -211
  228. mcp_proxy_adapter/tests/commands/test_echo_command.py +0 -127
  229. mcp_proxy_adapter/tests/commands/test_help_command.py +0 -136
  230. mcp_proxy_adapter/tests/conftest.py +0 -131
  231. mcp_proxy_adapter/tests/functional/__init__.py +0 -3
  232. mcp_proxy_adapter/tests/functional/test_api.py +0 -253
  233. mcp_proxy_adapter/tests/integration/__init__.py +0 -3
  234. mcp_proxy_adapter/tests/integration/test_cmd_integration.py +0 -129
  235. mcp_proxy_adapter/tests/integration/test_integration.py +0 -255
  236. mcp_proxy_adapter/tests/performance/__init__.py +0 -3
  237. mcp_proxy_adapter/tests/performance/test_performance.py +0 -189
  238. mcp_proxy_adapter/tests/stubs/__init__.py +0 -10
  239. mcp_proxy_adapter/tests/stubs/echo_command.py +0 -104
  240. mcp_proxy_adapter/tests/test_api_endpoints.py +0 -271
  241. mcp_proxy_adapter/tests/test_api_handlers.py +0 -289
  242. mcp_proxy_adapter/tests/test_base_command.py +0 -123
  243. mcp_proxy_adapter/tests/test_batch_requests.py +0 -117
  244. mcp_proxy_adapter/tests/test_command_registry.py +0 -281
  245. mcp_proxy_adapter/tests/test_config.py +0 -127
  246. mcp_proxy_adapter/tests/test_utils.py +0 -65
  247. mcp_proxy_adapter/tests/unit/__init__.py +0 -3
  248. mcp_proxy_adapter/tests/unit/test_base_command.py +0 -436
  249. mcp_proxy_adapter/tests/unit/test_config.py +0 -217
  250. mcp_proxy_adapter-4.1.1.dist-info/METADATA +0 -200
  251. mcp_proxy_adapter-4.1.1.dist-info/RECORD +0 -110
  252. {mcp_proxy_adapter-4.1.1.dist-info → mcp_proxy_adapter-6.1.0.dist-info}/WHEEL +0 -0
  253. {mcp_proxy_adapter-4.1.1.dist-info → mcp_proxy_adapter-6.1.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,292 @@
1
+ """
2
+ Transport manager module.
3
+
4
+ This module provides transport management functionality for the MCP Proxy Adapter.
5
+ """
6
+
7
+ from typing import Dict, Any, Optional
8
+ from dataclasses import dataclass
9
+ from enum import Enum
10
+ from pathlib import Path
11
+
12
+ from mcp_proxy_adapter.core.logging import logger
13
+
14
+
15
+ class TransportType(Enum):
16
+ """Transport types enumeration."""
17
+ HTTP = "http"
18
+ HTTPS = "https"
19
+ MTLS = "mtls"
20
+
21
+
22
+ @dataclass
23
+ class TransportConfig:
24
+ """Transport configuration data class."""
25
+ type: TransportType
26
+ port: Optional[int]
27
+ ssl_enabled: bool
28
+ cert_file: Optional[str]
29
+ key_file: Optional[str]
30
+ ca_cert: Optional[str]
31
+ verify_client: bool
32
+ client_cert_required: bool
33
+
34
+
35
+ class TransportManager:
36
+ """
37
+ Transport manager for handling different transport types.
38
+
39
+ This class manages transport configuration and provides utilities
40
+ for determining ports and SSL settings based on transport type.
41
+ """
42
+
43
+ # Default ports for transport types
44
+ DEFAULT_PORTS = {
45
+ TransportType.HTTP: 8000,
46
+ TransportType.HTTPS: 8443,
47
+ TransportType.MTLS: 9443
48
+ }
49
+
50
+ def __init__(self):
51
+ """Initialize transport manager."""
52
+ self._config: Optional[TransportConfig] = None
53
+ self._current_transport: Optional[TransportType] = None
54
+
55
+ def load_config(self, config: Dict[str, Any]) -> bool:
56
+ """
57
+ Load transport configuration from config dict.
58
+
59
+ Args:
60
+ config: Configuration dictionary
61
+
62
+ Returns:
63
+ True if config loaded successfully, False otherwise
64
+ """
65
+ try:
66
+ transport_config = config.get("transport", {})
67
+
68
+ # Get transport type
69
+ transport_type_str = transport_config.get("type", "http").lower()
70
+ try:
71
+ transport_type = TransportType(transport_type_str)
72
+ except ValueError:
73
+ logger.error(f"Invalid transport type: {transport_type_str}")
74
+ return False
75
+
76
+ # Get port (use default if not specified)
77
+ port = transport_config.get("port")
78
+ if port is None:
79
+ port = self.DEFAULT_PORTS.get(transport_type, 8000)
80
+
81
+ # Get SSL configuration
82
+ ssl_config = transport_config.get("ssl", {})
83
+ ssl_enabled = ssl_config.get("enabled", False)
84
+
85
+ # Validate SSL requirements
86
+ if transport_type in [TransportType.HTTPS, TransportType.MTLS] and not ssl_enabled:
87
+ logger.error(f"SSL must be enabled for transport type: {transport_type.value}")
88
+ return False
89
+
90
+ if transport_type == TransportType.HTTP and ssl_enabled:
91
+ logger.warning("SSL enabled for HTTP transport - this may cause issues")
92
+
93
+ # Create transport config
94
+ self._config = TransportConfig(
95
+ type=transport_type,
96
+ port=port,
97
+ ssl_enabled=ssl_enabled,
98
+ cert_file=ssl_config.get("cert_file") if ssl_enabled else None,
99
+ key_file=ssl_config.get("key_file") if ssl_enabled else None,
100
+ ca_cert=ssl_config.get("ca_cert") if ssl_enabled else None,
101
+ verify_client=ssl_config.get("verify_client", False),
102
+ client_cert_required=ssl_config.get("client_cert_required", False)
103
+ )
104
+
105
+ self._current_transport = transport_type
106
+
107
+ logger.info(f"Transport config loaded: {transport_type.value} on port {port}")
108
+ return True
109
+
110
+ except Exception as e:
111
+ logger.error(f"Failed to load transport config: {e}")
112
+ return False
113
+
114
+ def get_transport_type(self) -> Optional[TransportType]:
115
+ """
116
+ Get current transport type.
117
+
118
+ Returns:
119
+ Current transport type or None if not configured
120
+ """
121
+ return self._current_transport
122
+
123
+ def get_port(self) -> Optional[int]:
124
+ """
125
+ Get configured port.
126
+
127
+ Returns:
128
+ Port number or None if not configured
129
+ """
130
+ return self._config.port if self._config else None
131
+
132
+ def is_ssl_enabled(self) -> bool:
133
+ """
134
+ Check if SSL is enabled.
135
+
136
+ Returns:
137
+ True if SSL is enabled, False otherwise
138
+ """
139
+ return self._config.ssl_enabled if self._config else False
140
+
141
+ def get_ssl_config(self) -> Optional[Dict[str, Any]]:
142
+ """
143
+ Get SSL configuration.
144
+
145
+ Returns:
146
+ SSL configuration dict or None if SSL not enabled
147
+ """
148
+ if not self._config or not self._config.ssl_enabled:
149
+ return None
150
+
151
+ return {
152
+ "cert_file": self._config.cert_file,
153
+ "key_file": self._config.key_file,
154
+ "ca_cert": self._config.ca_cert,
155
+ "verify_client": self._config.verify_client,
156
+ "client_cert_required": self._config.client_cert_required
157
+ }
158
+
159
+ def is_mtls(self) -> bool:
160
+ """
161
+ Check if current transport is MTLS.
162
+
163
+ Returns:
164
+ True if MTLS transport, False otherwise
165
+ """
166
+ return self._current_transport == TransportType.MTLS
167
+
168
+ def is_https(self) -> bool:
169
+ """
170
+ Check if current transport is HTTPS.
171
+
172
+ Returns:
173
+ True if HTTPS transport, False otherwise
174
+ """
175
+ return self._current_transport == TransportType.HTTPS
176
+
177
+ def is_http(self) -> bool:
178
+ """
179
+ Check if current transport is HTTP.
180
+
181
+ Returns:
182
+ True if HTTP transport, False otherwise
183
+ """
184
+ return self._current_transport == TransportType.HTTP
185
+
186
+ def get_transport_info(self) -> Dict[str, Any]:
187
+ """
188
+ Get transport information.
189
+
190
+ Returns:
191
+ Dictionary with transport information
192
+ """
193
+ if not self._config:
194
+ return {"error": "Transport not configured"}
195
+
196
+ return {
197
+ "type": self._config.type.value,
198
+ "port": self._config.port,
199
+ "ssl_enabled": self._config.ssl_enabled,
200
+ "is_mtls": self.is_mtls(),
201
+ "is_https": self.is_https(),
202
+ "is_http": self.is_http(),
203
+ "ssl_config": self.get_ssl_config()
204
+ }
205
+
206
+ def validate_config(self) -> bool:
207
+ """
208
+ Validate current transport configuration.
209
+
210
+ Returns:
211
+ True if configuration is valid, False otherwise
212
+ """
213
+ if not self._config:
214
+ logger.error("Transport not configured")
215
+ return False
216
+
217
+ # Validate SSL requirements
218
+ if self._config.type in [TransportType.HTTPS, TransportType.MTLS]:
219
+ if not self._config.ssl_enabled:
220
+ logger.error(f"SSL must be enabled for {self._config.type.value}")
221
+ return False
222
+
223
+ if not self._config.cert_file or not self._config.key_file:
224
+ logger.error(f"SSL certificate and key required for {self._config.type.value}")
225
+ return False
226
+
227
+ # Validate SSL files exist
228
+ if not self.validate_ssl_files():
229
+ return False
230
+
231
+ # Validate MTLS requirements
232
+ if self._config.type == TransportType.MTLS:
233
+ if not self._config.verify_client:
234
+ logger.warning("MTLS transport should have client verification enabled")
235
+
236
+ if not self._config.ca_cert:
237
+ logger.warning("CA certificate recommended for MTLS transport")
238
+
239
+ logger.info(f"Transport configuration validated: {self._config.type.value}")
240
+ return True
241
+
242
+ def validate_ssl_files(self) -> bool:
243
+ """
244
+ Check if SSL files exist.
245
+
246
+ Returns:
247
+ True if all SSL files exist, False otherwise
248
+ """
249
+ if not self._config or not self._config.ssl_enabled:
250
+ return True
251
+
252
+ files_to_check = []
253
+ if self._config.cert_file:
254
+ files_to_check.append(self._config.cert_file)
255
+ if self._config.key_file:
256
+ files_to_check.append(self._config.key_file)
257
+ if self._config.ca_cert:
258
+ files_to_check.append(self._config.ca_cert)
259
+
260
+ for file_path in files_to_check:
261
+ if not Path(file_path).exists():
262
+ logger.error(f"SSL file not found: {file_path}")
263
+ return False
264
+
265
+ logger.info(f"All SSL files validated successfully: {files_to_check}")
266
+ return True
267
+
268
+ def get_uvicorn_config(self) -> Dict[str, Any]:
269
+ """
270
+ Get configuration for uvicorn.
271
+
272
+ Returns:
273
+ Uvicorn configuration dictionary
274
+ """
275
+ config = {
276
+ "host": "0.0.0.0", # Can be moved to settings
277
+ "port": self.get_port(),
278
+ "log_level": "info"
279
+ }
280
+
281
+ if self.is_ssl_enabled():
282
+ ssl_config = self.get_ssl_config()
283
+ if ssl_config:
284
+ from mcp_proxy_adapter.core.ssl_utils import SSLUtils
285
+ uvicorn_ssl = SSLUtils.get_ssl_config_for_uvicorn(ssl_config)
286
+ config.update(uvicorn_ssl)
287
+
288
+ return config
289
+
290
+
291
+ # Global transport manager instance
292
+ transport_manager = TransportManager()