mcp-proxy-adapter 6.0.0__py3-none-any.whl → 6.0.1__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 (212) hide show
  1. mcp_proxy_adapter/__main__.py +27 -7
  2. mcp_proxy_adapter/api/app.py +209 -79
  3. mcp_proxy_adapter/api/handlers.py +16 -5
  4. mcp_proxy_adapter/api/middleware/__init__.py +14 -9
  5. mcp_proxy_adapter/api/middleware/command_permission_middleware.py +148 -0
  6. mcp_proxy_adapter/api/middleware/factory.py +36 -12
  7. mcp_proxy_adapter/api/middleware/protocol_middleware.py +84 -18
  8. mcp_proxy_adapter/api/middleware/unified_security.py +197 -0
  9. mcp_proxy_adapter/api/middleware/user_info_middleware.py +158 -0
  10. mcp_proxy_adapter/commands/__init__.py +7 -1
  11. mcp_proxy_adapter/commands/base.py +7 -4
  12. mcp_proxy_adapter/commands/builtin_commands.py +8 -2
  13. mcp_proxy_adapter/commands/command_registry.py +8 -0
  14. mcp_proxy_adapter/commands/echo_command.py +81 -0
  15. mcp_proxy_adapter/commands/health_command.py +1 -1
  16. mcp_proxy_adapter/commands/help_command.py +21 -14
  17. mcp_proxy_adapter/commands/proxy_registration_command.py +326 -185
  18. mcp_proxy_adapter/commands/role_test_command.py +141 -0
  19. mcp_proxy_adapter/commands/security_command.py +488 -0
  20. mcp_proxy_adapter/commands/ssl_setup_command.py +234 -351
  21. mcp_proxy_adapter/commands/token_management_command.py +1 -1
  22. mcp_proxy_adapter/config.py +323 -40
  23. mcp_proxy_adapter/core/app_factory.py +410 -0
  24. mcp_proxy_adapter/core/app_runner.py +272 -0
  25. mcp_proxy_adapter/core/certificate_utils.py +291 -73
  26. mcp_proxy_adapter/core/client.py +574 -0
  27. mcp_proxy_adapter/core/client_manager.py +284 -0
  28. mcp_proxy_adapter/core/client_security.py +384 -0
  29. mcp_proxy_adapter/core/logging.py +8 -3
  30. mcp_proxy_adapter/core/mtls_asgi.py +156 -0
  31. mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
  32. mcp_proxy_adapter/core/protocol_manager.py +169 -10
  33. mcp_proxy_adapter/core/proxy_client.py +602 -0
  34. mcp_proxy_adapter/core/proxy_registration.py +299 -47
  35. mcp_proxy_adapter/core/security_adapter.py +12 -15
  36. mcp_proxy_adapter/core/security_integration.py +286 -0
  37. mcp_proxy_adapter/core/server_adapter.py +282 -0
  38. mcp_proxy_adapter/core/server_engine.py +270 -0
  39. mcp_proxy_adapter/core/ssl_utils.py +13 -12
  40. mcp_proxy_adapter/core/transport_manager.py +5 -5
  41. mcp_proxy_adapter/core/unified_config_adapter.py +579 -0
  42. mcp_proxy_adapter/examples/__init__.py +13 -4
  43. mcp_proxy_adapter/examples/basic_framework/__init__.py +9 -0
  44. mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +4 -0
  45. mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +4 -0
  46. mcp_proxy_adapter/examples/basic_framework/main.py +44 -0
  47. mcp_proxy_adapter/examples/commands/__init__.py +5 -0
  48. mcp_proxy_adapter/examples/create_certificates_simple.py +550 -0
  49. mcp_proxy_adapter/examples/debug_request_state.py +112 -0
  50. mcp_proxy_adapter/examples/debug_role_chain.py +158 -0
  51. mcp_proxy_adapter/examples/demo_client.py +275 -0
  52. mcp_proxy_adapter/examples/examples/basic_framework/__init__.py +9 -0
  53. mcp_proxy_adapter/examples/examples/basic_framework/commands/__init__.py +4 -0
  54. mcp_proxy_adapter/examples/examples/basic_framework/hooks/__init__.py +4 -0
  55. mcp_proxy_adapter/examples/examples/basic_framework/main.py +44 -0
  56. mcp_proxy_adapter/examples/examples/full_application/__init__.py +12 -0
  57. mcp_proxy_adapter/examples/examples/full_application/commands/__init__.py +7 -0
  58. mcp_proxy_adapter/examples/examples/full_application/commands/custom_echo_command.py +80 -0
  59. mcp_proxy_adapter/examples/examples/full_application/commands/dynamic_calculator_command.py +90 -0
  60. mcp_proxy_adapter/examples/examples/full_application/hooks/__init__.py +7 -0
  61. mcp_proxy_adapter/examples/examples/full_application/hooks/application_hooks.py +75 -0
  62. mcp_proxy_adapter/examples/examples/full_application/hooks/builtin_command_hooks.py +71 -0
  63. mcp_proxy_adapter/examples/examples/full_application/main.py +173 -0
  64. mcp_proxy_adapter/examples/examples/full_application/proxy_endpoints.py +154 -0
  65. mcp_proxy_adapter/examples/full_application/__init__.py +12 -0
  66. mcp_proxy_adapter/examples/full_application/commands/__init__.py +7 -0
  67. mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +80 -0
  68. mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +90 -0
  69. mcp_proxy_adapter/examples/full_application/hooks/__init__.py +7 -0
  70. mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +75 -0
  71. mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +71 -0
  72. mcp_proxy_adapter/examples/full_application/main.py +173 -0
  73. mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +154 -0
  74. mcp_proxy_adapter/examples/generate_all_certificates.py +362 -0
  75. mcp_proxy_adapter/examples/generate_certificates.py +177 -0
  76. mcp_proxy_adapter/examples/generate_certificates_and_tokens.py +369 -0
  77. mcp_proxy_adapter/examples/generate_test_configs.py +331 -0
  78. mcp_proxy_adapter/examples/proxy_registration_example.py +334 -0
  79. mcp_proxy_adapter/examples/run_example.py +59 -0
  80. mcp_proxy_adapter/examples/run_full_test_suite.py +318 -0
  81. mcp_proxy_adapter/examples/run_proxy_server.py +146 -0
  82. mcp_proxy_adapter/examples/run_security_tests.py +544 -0
  83. mcp_proxy_adapter/examples/run_security_tests_fixed.py +247 -0
  84. mcp_proxy_adapter/examples/scripts/config_generator.py +740 -0
  85. mcp_proxy_adapter/examples/scripts/create_certificates_simple.py +560 -0
  86. mcp_proxy_adapter/examples/scripts/generate_certificates_and_tokens.py +369 -0
  87. mcp_proxy_adapter/examples/security_test_client.py +782 -0
  88. mcp_proxy_adapter/examples/setup_test_environment.py +328 -0
  89. mcp_proxy_adapter/examples/test_config.py +148 -0
  90. mcp_proxy_adapter/examples/test_config_generator.py +86 -0
  91. mcp_proxy_adapter/examples/test_examples.py +281 -0
  92. mcp_proxy_adapter/examples/universal_client.py +620 -0
  93. mcp_proxy_adapter/main.py +66 -148
  94. mcp_proxy_adapter/utils/config_generator.py +1008 -0
  95. mcp_proxy_adapter/version.py +5 -2
  96. mcp_proxy_adapter-6.0.1.dist-info/METADATA +679 -0
  97. mcp_proxy_adapter-6.0.1.dist-info/RECORD +140 -0
  98. mcp_proxy_adapter-6.0.1.dist-info/entry_points.txt +2 -0
  99. {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.0.1.dist-info}/licenses/LICENSE +2 -2
  100. mcp_proxy_adapter/api/middleware/auth.py +0 -146
  101. mcp_proxy_adapter/api/middleware/auth_adapter.py +0 -235
  102. mcp_proxy_adapter/api/middleware/mtls_adapter.py +0 -305
  103. mcp_proxy_adapter/api/middleware/mtls_middleware.py +0 -296
  104. mcp_proxy_adapter/api/middleware/rate_limit.py +0 -152
  105. mcp_proxy_adapter/api/middleware/rate_limit_adapter.py +0 -241
  106. mcp_proxy_adapter/api/middleware/roles_adapter.py +0 -365
  107. mcp_proxy_adapter/api/middleware/roles_middleware.py +0 -381
  108. mcp_proxy_adapter/api/middleware/security.py +0 -376
  109. mcp_proxy_adapter/api/middleware/token_auth_middleware.py +0 -261
  110. mcp_proxy_adapter/examples/README.md +0 -124
  111. mcp_proxy_adapter/examples/basic_server/README.md +0 -60
  112. mcp_proxy_adapter/examples/basic_server/__init__.py +0 -7
  113. mcp_proxy_adapter/examples/basic_server/basic_custom_settings.json +0 -39
  114. mcp_proxy_adapter/examples/basic_server/config.json +0 -70
  115. mcp_proxy_adapter/examples/basic_server/config_all_protocols.json +0 -54
  116. mcp_proxy_adapter/examples/basic_server/config_http.json +0 -70
  117. mcp_proxy_adapter/examples/basic_server/config_http_only.json +0 -52
  118. mcp_proxy_adapter/examples/basic_server/config_https.json +0 -58
  119. mcp_proxy_adapter/examples/basic_server/config_mtls.json +0 -58
  120. mcp_proxy_adapter/examples/basic_server/config_ssl.json +0 -46
  121. mcp_proxy_adapter/examples/basic_server/custom_settings_example.py +0 -238
  122. mcp_proxy_adapter/examples/basic_server/server.py +0 -114
  123. mcp_proxy_adapter/examples/custom_commands/README.md +0 -127
  124. mcp_proxy_adapter/examples/custom_commands/__init__.py +0 -27
  125. mcp_proxy_adapter/examples/custom_commands/advanced_hooks.py +0 -566
  126. mcp_proxy_adapter/examples/custom_commands/auto_commands/__init__.py +0 -6
  127. mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_echo_command.py +0 -103
  128. mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_info_command.py +0 -111
  129. mcp_proxy_adapter/examples/custom_commands/auto_commands/test_command.py +0 -105
  130. mcp_proxy_adapter/examples/custom_commands/catalog/commands/test_command.py +0 -129
  131. mcp_proxy_adapter/examples/custom_commands/config.json +0 -118
  132. mcp_proxy_adapter/examples/custom_commands/config_all_protocols.json +0 -46
  133. mcp_proxy_adapter/examples/custom_commands/config_https_only.json +0 -46
  134. mcp_proxy_adapter/examples/custom_commands/config_https_transport.json +0 -33
  135. mcp_proxy_adapter/examples/custom_commands/config_mtls_only.json +0 -46
  136. mcp_proxy_adapter/examples/custom_commands/config_mtls_transport.json +0 -33
  137. mcp_proxy_adapter/examples/custom_commands/config_single_transport.json +0 -33
  138. mcp_proxy_adapter/examples/custom_commands/custom_health_command.py +0 -169
  139. mcp_proxy_adapter/examples/custom_commands/custom_help_command.py +0 -215
  140. mcp_proxy_adapter/examples/custom_commands/custom_openapi_generator.py +0 -76
  141. mcp_proxy_adapter/examples/custom_commands/custom_settings.json +0 -96
  142. mcp_proxy_adapter/examples/custom_commands/custom_settings_manager.py +0 -241
  143. mcp_proxy_adapter/examples/custom_commands/data_transform_command.py +0 -135
  144. mcp_proxy_adapter/examples/custom_commands/echo_command.py +0 -122
  145. mcp_proxy_adapter/examples/custom_commands/full_help_response.json +0 -1
  146. mcp_proxy_adapter/examples/custom_commands/generated_openapi.json +0 -629
  147. mcp_proxy_adapter/examples/custom_commands/get_openapi.py +0 -103
  148. mcp_proxy_adapter/examples/custom_commands/hooks.py +0 -230
  149. mcp_proxy_adapter/examples/custom_commands/intercept_command.py +0 -123
  150. mcp_proxy_adapter/examples/custom_commands/loadable_commands/test_ignored.py +0 -129
  151. mcp_proxy_adapter/examples/custom_commands/manual_echo_command.py +0 -103
  152. mcp_proxy_adapter/examples/custom_commands/proxy_connection_manager.py +0 -278
  153. mcp_proxy_adapter/examples/custom_commands/server.py +0 -252
  154. mcp_proxy_adapter/examples/custom_commands/simple_openapi_server.py +0 -75
  155. mcp_proxy_adapter/examples/custom_commands/start_server_with_proxy_manager.py +0 -299
  156. mcp_proxy_adapter/examples/custom_commands/start_server_with_registration.py +0 -278
  157. mcp_proxy_adapter/examples/custom_commands/test_hooks.py +0 -176
  158. mcp_proxy_adapter/examples/custom_commands/test_openapi.py +0 -27
  159. mcp_proxy_adapter/examples/custom_commands/test_registry.py +0 -23
  160. mcp_proxy_adapter/examples/custom_commands/test_simple.py +0 -19
  161. mcp_proxy_adapter/examples/custom_project_example/README.md +0 -103
  162. mcp_proxy_adapter/examples/custom_project_example/README_EN.md +0 -103
  163. mcp_proxy_adapter/examples/deployment/README.md +0 -49
  164. mcp_proxy_adapter/examples/deployment/__init__.py +0 -7
  165. mcp_proxy_adapter/examples/deployment/config.development.json +0 -8
  166. mcp_proxy_adapter/examples/deployment/config.json +0 -29
  167. mcp_proxy_adapter/examples/deployment/config.production.json +0 -12
  168. mcp_proxy_adapter/examples/deployment/config.staging.json +0 -11
  169. mcp_proxy_adapter/examples/deployment/docker-compose.yml +0 -31
  170. mcp_proxy_adapter/examples/deployment/run.sh +0 -43
  171. mcp_proxy_adapter/examples/deployment/run_docker.sh +0 -84
  172. mcp_proxy_adapter/examples/simple_custom_commands/README.md +0 -149
  173. mcp_proxy_adapter/examples/simple_custom_commands/README_EN.md +0 -149
  174. mcp_proxy_adapter/schemas/base_schema.json +0 -114
  175. mcp_proxy_adapter/schemas/openapi_schema.json +0 -314
  176. mcp_proxy_adapter/schemas/roles_schema.json +0 -162
  177. mcp_proxy_adapter/tests/__init__.py +0 -0
  178. mcp_proxy_adapter/tests/api/__init__.py +0 -3
  179. mcp_proxy_adapter/tests/api/test_cmd_endpoint.py +0 -115
  180. mcp_proxy_adapter/tests/api/test_custom_openapi.py +0 -617
  181. mcp_proxy_adapter/tests/api/test_handlers.py +0 -522
  182. mcp_proxy_adapter/tests/api/test_middleware.py +0 -340
  183. mcp_proxy_adapter/tests/api/test_schemas.py +0 -546
  184. mcp_proxy_adapter/tests/api/test_tool_integration.py +0 -531
  185. mcp_proxy_adapter/tests/commands/__init__.py +0 -3
  186. mcp_proxy_adapter/tests/commands/test_config_command.py +0 -211
  187. mcp_proxy_adapter/tests/commands/test_echo_command.py +0 -127
  188. mcp_proxy_adapter/tests/commands/test_help_command.py +0 -136
  189. mcp_proxy_adapter/tests/conftest.py +0 -131
  190. mcp_proxy_adapter/tests/functional/__init__.py +0 -3
  191. mcp_proxy_adapter/tests/functional/test_api.py +0 -253
  192. mcp_proxy_adapter/tests/integration/__init__.py +0 -3
  193. mcp_proxy_adapter/tests/integration/test_cmd_integration.py +0 -129
  194. mcp_proxy_adapter/tests/integration/test_integration.py +0 -255
  195. mcp_proxy_adapter/tests/performance/__init__.py +0 -3
  196. mcp_proxy_adapter/tests/performance/test_performance.py +0 -189
  197. mcp_proxy_adapter/tests/stubs/__init__.py +0 -10
  198. mcp_proxy_adapter/tests/stubs/echo_command.py +0 -104
  199. mcp_proxy_adapter/tests/test_api_endpoints.py +0 -271
  200. mcp_proxy_adapter/tests/test_api_handlers.py +0 -289
  201. mcp_proxy_adapter/tests/test_base_command.py +0 -123
  202. mcp_proxy_adapter/tests/test_batch_requests.py +0 -117
  203. mcp_proxy_adapter/tests/test_command_registry.py +0 -281
  204. mcp_proxy_adapter/tests/test_config.py +0 -127
  205. mcp_proxy_adapter/tests/test_utils.py +0 -65
  206. mcp_proxy_adapter/tests/unit/__init__.py +0 -3
  207. mcp_proxy_adapter/tests/unit/test_base_command.py +0 -436
  208. mcp_proxy_adapter/tests/unit/test_config.py +0 -270
  209. mcp_proxy_adapter-6.0.0.dist-info/METADATA +0 -201
  210. mcp_proxy_adapter-6.0.0.dist-info/RECORD +0 -179
  211. {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.0.1.dist-info}/WHEEL +0 -0
  212. {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.0.1.dist-info}/top_level.txt +0 -0
mcp_proxy_adapter/main.py CHANGED
@@ -1,174 +1,92 @@
1
1
  #!/usr/bin/env python3
2
2
  """
3
- Main entry point for MCP Proxy Adapter.
3
+ MCP Proxy Adapter - Main Entry Point
4
4
 
5
- This module provides the main function for running the MCP Proxy Adapter server.
5
+ Author: Vasiliy Zdanovskiy
6
+ email: vasilyvz@gmail.com
6
7
  """
7
8
 
8
- import argparse
9
- import asyncio
10
- import uvicorn
11
9
  import sys
12
- import os
10
+ import ssl
11
+ import hypercorn.asyncio
12
+ import hypercorn.config
13
+ import asyncio
14
+ import argparse
13
15
  from pathlib import Path
14
16
 
15
- from mcp_proxy_adapter import create_app
16
- from mcp_proxy_adapter.core.logging import get_logger, setup_logging
17
- from mcp_proxy_adapter.core.settings import (
18
- Settings,
19
- get_server_host,
20
- get_server_port,
21
- get_server_debug,
22
- get_setting
23
- )
24
- from mcp_proxy_adapter.core.ssl_utils import SSLUtils
17
+ # Add the project root to the path
18
+ sys.path.insert(0, str(Path(__file__).parent.parent))
25
19
 
26
-
27
- def parse_args():
28
- """Parse command line arguments."""
29
- parser = argparse.ArgumentParser(description="MCP Proxy Adapter Server")
30
- parser.add_argument(
31
- "--config",
32
- type=str,
33
- default=None,
34
- help="Path to configuration file"
35
- )
36
- parser.add_argument(
37
- "--host",
38
- type=str,
39
- default=None,
40
- help="Host to bind to (overrides config)"
41
- )
42
- parser.add_argument(
43
- "--port",
44
- type=int,
45
- default=None,
46
- help="Port to bind to (overrides config)"
47
- )
48
- parser.add_argument(
49
- "--debug",
50
- action="store_true",
51
- help="Enable debug mode (overrides config)"
52
- )
53
- parser.add_argument(
54
- "--log-level",
55
- type=str,
56
- default=None,
57
- choices=["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"],
58
- help="Log level (overrides config)"
59
- )
60
- return parser.parse_args()
20
+ from mcp_proxy_adapter.api.app import create_app
21
+ from mcp_proxy_adapter.config import Config
61
22
 
62
23
 
63
24
  def main():
64
- """Run the MCP Proxy Adapter server."""
65
- args = parse_args()
25
+ """Main entry point for the MCP Proxy Adapter."""
26
+ # Parse command line arguments
27
+ parser = argparse.ArgumentParser(description="MCP Proxy Adapter Server")
28
+ parser.add_argument("--config", "-c", type=str, help="Path to configuration file")
29
+ args = parser.parse_args()
66
30
 
67
- # Load configuration if specified
31
+ # Load configuration
68
32
  if args.config:
69
- config_path = Path(args.config)
70
- if config_path.exists():
71
- from mcp_proxy_adapter.config import config
72
- config.load_from_file(str(config_path))
73
- print(f"✅ Loaded configuration from: {config_path}")
74
- else:
75
- print(f"❌ Configuration file not found: {config_path}")
76
- sys.exit(1)
33
+ config = Config(config_path=args.config)
77
34
  else:
78
- print("⚠️ No configuration file specified, using defaults")
79
-
80
- # Setup logging with configuration
81
- setup_logging()
82
- logger = get_logger("mcp_proxy_adapter")
83
-
84
- # Get settings from configuration
85
- server_settings = Settings.get_server_settings()
86
- logging_settings = Settings.get_logging_settings()
87
- commands_settings = Settings.get_commands_settings()
88
- ssl_settings = Settings.get_custom_setting("ssl", {})
89
- security_settings = Settings.get_custom_setting("security", {})
90
-
91
- # STRICT CONFIGURATION VALIDATION
92
- from mcp_proxy_adapter.core.config_validator import ConfigValidator
93
-
94
- # Get full config for validation
95
- full_config = {
96
- "server": server_settings,
97
- "logging": logging_settings,
98
- "commands": commands_settings,
99
- "ssl": ssl_settings,
100
- "security": security_settings,
101
- "auth_enabled": Settings.get_custom_setting("auth_enabled", False),
102
- "roles": Settings.get_custom_setting("roles", {})
103
- }
104
-
105
- # Validate configuration
106
- validator = ConfigValidator(full_config)
107
- if not validator.validate_all():
108
- logger.critical("CRITICAL SECURITY ERROR: Configuration validation failed")
109
- validator.print_validation_report()
110
- logger.critical("Server startup blocked for security reasons.")
111
- logger.critical("Please fix configuration errors or disable security features.")
112
- sys.exit(1)
35
+ config = Config()
36
+
37
+
38
+ # Create application
39
+ app = create_app(app_config=config)
113
40
 
114
- logger.info("Configuration validation passed")
41
+ # Get server configuration
42
+ host = config.get("server.host", "0.0.0.0")
43
+ port = config.get("server.port", 8000)
115
44
 
116
- # Override settings with command line arguments
117
- if args.host:
118
- server_settings['host'] = args.host
119
- if args.port:
120
- server_settings['port'] = args.port
121
- if args.debug:
122
- server_settings['debug'] = True
123
- if args.log_level:
124
- logging_settings['level'] = args.log_level
125
- server_settings['log_level'] = args.log_level
45
+ # Get SSL configuration
46
+ ssl_enabled = config.get("ssl.enabled", False)
47
+ ssl_cert_file = config.get("ssl.cert_file")
48
+ ssl_key_file = config.get("ssl.key_file")
49
+ ssl_ca_cert = config.get("ssl.ca_cert")
50
+ verify_client = config.get("ssl.verify_client", False)
126
51
 
127
- # Print server header and description
128
- print("=" * 80)
129
- print("🚀 MCP PROXY ADAPTER SERVER")
130
- print("=" * 80)
131
- print("📋 Configuration:")
132
- print(f" • Server: {server_settings['host']}:{server_settings['port']}")
133
- print(f" • Debug: {server_settings['debug']}")
134
- print(f" • Log Level: {logging_settings['level']}")
135
- print(f" Auto Discovery: {commands_settings['auto_discovery']}")
136
- print(f" SSL Enabled: {ssl_settings.get('enabled', False)}")
137
- print(f" • Security Enabled: {security_settings.get('enabled', False)}")
138
- if ssl_settings.get('enabled', False):
139
- print(f" • SSL Mode: {ssl_settings.get('mode', 'https_only')}")
140
- if security_settings.get('enabled', False):
141
- print(f" • Security Framework: {security_settings.get('framework', 'built-in')}")
142
- print("=" * 80)
143
- print()
52
+ print(f"🚀 Starting MCP Proxy Adapter")
53
+ print(f"🌐 Server: {host}:{port}")
54
+ if ssl_enabled:
55
+ print(f"🔐 SSL: Enabled")
56
+ print(f" Certificate: {ssl_cert_file}")
57
+ print(f" Key: {ssl_key_file}")
58
+ if ssl_ca_cert:
59
+ print(f" CA: {ssl_ca_cert}")
60
+ print(f" Client verification: {verify_client}")
61
+ print("=" * 50)
144
62
 
145
- logger.info("Starting MCP Proxy Adapter Server...")
146
- logger.info(f"Server configuration: {server_settings}")
147
- logger.info(f"Security configuration: {security_settings}")
63
+ # Configure hypercorn
64
+ config_hypercorn = hypercorn.config.Config()
65
+ config_hypercorn.bind = [f"{host}:{port}"]
148
66
 
149
- try:
150
- # Create application
151
- app = create_app(
152
- title="MCP Proxy Adapter Server",
153
- description="Model Context Protocol Proxy Adapter with Security Framework",
154
- version="1.0.0"
155
- )
67
+ if ssl_enabled and ssl_cert_file and ssl_key_file:
68
+ config_hypercorn.certfile = ssl_cert_file
69
+ config_hypercorn.keyfile = ssl_key_file
156
70
 
157
- # Get SSL configuration for uvicorn
158
- uvicorn_ssl_config = SSLUtils.get_ssl_config_for_uvicorn(ssl_settings)
71
+ if ssl_ca_cert:
72
+ config_hypercorn.ca_certs = ssl_ca_cert
159
73
 
160
- # Run the server
161
- uvicorn.run(
162
- app,
163
- host=server_settings['host'],
164
- port=server_settings['port'],
165
- log_level=server_settings.get('log_level', 'info').lower(),
166
- **uvicorn_ssl_config
167
- )
74
+ if verify_client:
75
+ # For mTLS, require client certificates
76
+ config_hypercorn.set_cert_reqs(ssl.CERT_REQUIRED)
77
+ config_hypercorn.verify_mode = ssl.CERT_REQUIRED
78
+ print("🔐 mTLS: Client certificate verification enabled")
79
+ else:
80
+ # For regular HTTPS without client verification
81
+ config_hypercorn.set_cert_reqs(ssl.CERT_NONE)
82
+ config_hypercorn.verify_mode = ssl.CERT_NONE
168
83
 
169
- except Exception as e:
170
- logger.error(f"Failed to start server: {e}")
171
- sys.exit(1)
84
+ print(f"🔐 Starting HTTPS server with hypercorn...")
85
+ else:
86
+ print(f"🌐 Starting HTTP server with hypercorn...")
87
+
88
+ # Run the server
89
+ asyncio.run(hypercorn.asyncio.serve(app, config_hypercorn))
172
90
 
173
91
 
174
92
  if __name__ == "__main__":