mcp-proxy-adapter 2.0.1__py3-none-any.whl → 6.9.50__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.

Potentially problematic release.


This version of mcp-proxy-adapter might be problematic. Click here for more details.

Files changed (269) hide show
  1. mcp_proxy_adapter/__init__.py +47 -0
  2. mcp_proxy_adapter/__main__.py +13 -0
  3. mcp_proxy_adapter/api/__init__.py +0 -0
  4. mcp_proxy_adapter/api/app.py +66 -0
  5. mcp_proxy_adapter/api/core/__init__.py +18 -0
  6. mcp_proxy_adapter/api/core/app_factory.py +400 -0
  7. mcp_proxy_adapter/api/core/lifespan_manager.py +55 -0
  8. mcp_proxy_adapter/api/core/registration_context.py +356 -0
  9. mcp_proxy_adapter/api/core/registration_manager.py +307 -0
  10. mcp_proxy_adapter/api/core/registration_tasks.py +84 -0
  11. mcp_proxy_adapter/api/core/ssl_context_factory.py +88 -0
  12. mcp_proxy_adapter/api/handlers.py +181 -0
  13. mcp_proxy_adapter/api/middleware/__init__.py +21 -0
  14. mcp_proxy_adapter/api/middleware/base.py +54 -0
  15. mcp_proxy_adapter/api/middleware/command_permission_middleware.py +73 -0
  16. mcp_proxy_adapter/api/middleware/error_handling.py +76 -0
  17. mcp_proxy_adapter/api/middleware/factory.py +147 -0
  18. mcp_proxy_adapter/api/middleware/logging.py +31 -0
  19. mcp_proxy_adapter/api/middleware/performance.py +51 -0
  20. mcp_proxy_adapter/api/middleware/protocol_middleware.py +140 -0
  21. mcp_proxy_adapter/api/middleware/transport_middleware.py +87 -0
  22. mcp_proxy_adapter/api/middleware/unified_security.py +223 -0
  23. mcp_proxy_adapter/api/middleware/user_info_middleware.py +132 -0
  24. mcp_proxy_adapter/api/openapi/__init__.py +21 -0
  25. mcp_proxy_adapter/api/openapi/command_integration.py +105 -0
  26. mcp_proxy_adapter/api/openapi/openapi_generator.py +40 -0
  27. mcp_proxy_adapter/api/openapi/openapi_registry.py +62 -0
  28. mcp_proxy_adapter/api/openapi/schema_loader.py +116 -0
  29. mcp_proxy_adapter/api/schemas.py +270 -0
  30. mcp_proxy_adapter/api/tool_integration.py +131 -0
  31. mcp_proxy_adapter/api/tools.py +163 -0
  32. mcp_proxy_adapter/cli/__init__.py +12 -0
  33. mcp_proxy_adapter/cli/commands/__init__.py +15 -0
  34. mcp_proxy_adapter/cli/commands/client.py +100 -0
  35. mcp_proxy_adapter/cli/commands/config_generate.py +105 -0
  36. mcp_proxy_adapter/cli/commands/config_validate.py +94 -0
  37. mcp_proxy_adapter/cli/commands/generate.py +259 -0
  38. mcp_proxy_adapter/cli/commands/server.py +174 -0
  39. mcp_proxy_adapter/cli/commands/sets.py +132 -0
  40. mcp_proxy_adapter/cli/commands/testconfig.py +177 -0
  41. mcp_proxy_adapter/cli/examples/__init__.py +8 -0
  42. mcp_proxy_adapter/cli/examples/http_basic.py +82 -0
  43. mcp_proxy_adapter/cli/examples/https_token.py +96 -0
  44. mcp_proxy_adapter/cli/examples/mtls_roles.py +103 -0
  45. mcp_proxy_adapter/cli/main.py +63 -0
  46. mcp_proxy_adapter/cli/parser.py +338 -0
  47. mcp_proxy_adapter/cli/validators.py +231 -0
  48. mcp_proxy_adapter/client/jsonrpc_client/__init__.py +9 -0
  49. mcp_proxy_adapter/client/jsonrpc_client/client.py +42 -0
  50. mcp_proxy_adapter/client/jsonrpc_client/command_api.py +45 -0
  51. mcp_proxy_adapter/client/jsonrpc_client/proxy_api.py +224 -0
  52. mcp_proxy_adapter/client/jsonrpc_client/queue_api.py +60 -0
  53. mcp_proxy_adapter/client/jsonrpc_client/transport.py +108 -0
  54. mcp_proxy_adapter/client/proxy.py +123 -0
  55. mcp_proxy_adapter/commands/__init__.py +66 -0
  56. mcp_proxy_adapter/commands/auth_validation_command.py +69 -0
  57. mcp_proxy_adapter/commands/base.py +389 -0
  58. mcp_proxy_adapter/commands/builtin_commands.py +30 -0
  59. mcp_proxy_adapter/commands/catalog/__init__.py +20 -0
  60. mcp_proxy_adapter/commands/catalog/catalog_loader.py +34 -0
  61. mcp_proxy_adapter/commands/catalog/catalog_manager.py +122 -0
  62. mcp_proxy_adapter/commands/catalog/catalog_syncer.py +149 -0
  63. mcp_proxy_adapter/commands/catalog/command_catalog.py +43 -0
  64. mcp_proxy_adapter/commands/catalog/dependency_manager.py +37 -0
  65. mcp_proxy_adapter/commands/catalog_manager.py +97 -0
  66. mcp_proxy_adapter/commands/cert_monitor_command.py +552 -0
  67. mcp_proxy_adapter/commands/certificate_management_command.py +562 -0
  68. mcp_proxy_adapter/commands/command_registry.py +298 -0
  69. mcp_proxy_adapter/commands/config_command.py +102 -0
  70. mcp_proxy_adapter/commands/dependency_container.py +40 -0
  71. mcp_proxy_adapter/commands/dependency_manager.py +143 -0
  72. mcp_proxy_adapter/commands/echo_command.py +48 -0
  73. mcp_proxy_adapter/commands/health_command.py +142 -0
  74. mcp_proxy_adapter/commands/help_command.py +175 -0
  75. mcp_proxy_adapter/commands/hooks.py +172 -0
  76. mcp_proxy_adapter/commands/key_management_command.py +484 -0
  77. mcp_proxy_adapter/commands/load_command.py +123 -0
  78. mcp_proxy_adapter/commands/plugins_command.py +246 -0
  79. mcp_proxy_adapter/commands/protocol_management_command.py +216 -0
  80. mcp_proxy_adapter/commands/proxy_registration_command.py +319 -0
  81. mcp_proxy_adapter/commands/queue_commands.py +750 -0
  82. mcp_proxy_adapter/commands/registration_status_command.py +76 -0
  83. mcp_proxy_adapter/commands/registry/__init__.py +18 -0
  84. mcp_proxy_adapter/commands/registry/command_info.py +103 -0
  85. mcp_proxy_adapter/commands/registry/command_loader.py +207 -0
  86. mcp_proxy_adapter/commands/registry/command_manager.py +119 -0
  87. mcp_proxy_adapter/commands/registry/command_registry.py +217 -0
  88. mcp_proxy_adapter/commands/reload_command.py +136 -0
  89. mcp_proxy_adapter/commands/result.py +157 -0
  90. mcp_proxy_adapter/commands/role_test_command.py +99 -0
  91. mcp_proxy_adapter/commands/roles_management_command.py +502 -0
  92. mcp_proxy_adapter/commands/security_command.py +472 -0
  93. mcp_proxy_adapter/commands/settings_command.py +113 -0
  94. mcp_proxy_adapter/commands/ssl_setup_command.py +306 -0
  95. mcp_proxy_adapter/commands/token_management_command.py +500 -0
  96. mcp_proxy_adapter/commands/transport_management_command.py +129 -0
  97. mcp_proxy_adapter/commands/unload_command.py +92 -0
  98. mcp_proxy_adapter/config.py +32 -0
  99. mcp_proxy_adapter/core/__init__.py +8 -0
  100. mcp_proxy_adapter/core/app_factory.py +560 -0
  101. mcp_proxy_adapter/core/app_runner.py +318 -0
  102. mcp_proxy_adapter/core/auth_validator.py +508 -0
  103. mcp_proxy_adapter/core/certificate/__init__.py +20 -0
  104. mcp_proxy_adapter/core/certificate/certificate_creator.py +372 -0
  105. mcp_proxy_adapter/core/certificate/certificate_extractor.py +185 -0
  106. mcp_proxy_adapter/core/certificate/certificate_utils.py +249 -0
  107. mcp_proxy_adapter/core/certificate/certificate_validator.py +481 -0
  108. mcp_proxy_adapter/core/certificate/ssl_context_manager.py +65 -0
  109. mcp_proxy_adapter/core/certificate_utils.py +249 -0
  110. mcp_proxy_adapter/core/client.py +608 -0
  111. mcp_proxy_adapter/core/client_manager.py +271 -0
  112. mcp_proxy_adapter/core/client_security.py +411 -0
  113. mcp_proxy_adapter/core/config/__init__.py +18 -0
  114. mcp_proxy_adapter/core/config/config.py +237 -0
  115. mcp_proxy_adapter/core/config/config_factory.py +22 -0
  116. mcp_proxy_adapter/core/config/config_loader.py +66 -0
  117. mcp_proxy_adapter/core/config/feature_manager.py +31 -0
  118. mcp_proxy_adapter/core/config/simple_config.py +204 -0
  119. mcp_proxy_adapter/core/config/simple_config_generator.py +131 -0
  120. mcp_proxy_adapter/core/config/simple_config_validator.py +476 -0
  121. mcp_proxy_adapter/core/config_converter.py +252 -0
  122. mcp_proxy_adapter/core/config_validator.py +211 -0
  123. mcp_proxy_adapter/core/crl_utils.py +362 -0
  124. mcp_proxy_adapter/core/errors.py +276 -0
  125. mcp_proxy_adapter/core/job_manager.py +54 -0
  126. mcp_proxy_adapter/core/logging.py +250 -0
  127. mcp_proxy_adapter/core/mtls_asgi.py +140 -0
  128. mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
  129. mcp_proxy_adapter/core/mtls_proxy.py +229 -0
  130. mcp_proxy_adapter/core/mtls_server.py +154 -0
  131. mcp_proxy_adapter/core/protocol_manager.py +232 -0
  132. mcp_proxy_adapter/core/proxy/__init__.py +19 -0
  133. mcp_proxy_adapter/core/proxy/auth_manager.py +26 -0
  134. mcp_proxy_adapter/core/proxy/proxy_registration_manager.py +160 -0
  135. mcp_proxy_adapter/core/proxy/registration_client.py +186 -0
  136. mcp_proxy_adapter/core/proxy/ssl_manager.py +101 -0
  137. mcp_proxy_adapter/core/proxy_client.py +184 -0
  138. mcp_proxy_adapter/core/proxy_registration.py +80 -0
  139. mcp_proxy_adapter/core/role_utils.py +103 -0
  140. mcp_proxy_adapter/core/security_adapter.py +343 -0
  141. mcp_proxy_adapter/core/security_factory.py +96 -0
  142. mcp_proxy_adapter/core/security_integration.py +342 -0
  143. mcp_proxy_adapter/core/server_adapter.py +251 -0
  144. mcp_proxy_adapter/core/server_engine.py +217 -0
  145. mcp_proxy_adapter/core/settings.py +260 -0
  146. mcp_proxy_adapter/core/signal_handler.py +107 -0
  147. mcp_proxy_adapter/core/ssl_utils.py +161 -0
  148. mcp_proxy_adapter/core/transport_manager.py +153 -0
  149. mcp_proxy_adapter/core/unified_config_adapter.py +471 -0
  150. mcp_proxy_adapter/core/utils.py +101 -0
  151. mcp_proxy_adapter/core/validation/__init__.py +21 -0
  152. mcp_proxy_adapter/core/validation/config_validator.py +219 -0
  153. mcp_proxy_adapter/core/validation/file_validator.py +131 -0
  154. mcp_proxy_adapter/core/validation/protocol_validator.py +205 -0
  155. mcp_proxy_adapter/core/validation/security_validator.py +140 -0
  156. mcp_proxy_adapter/core/validation/validation_result.py +27 -0
  157. mcp_proxy_adapter/custom_openapi.py +58 -0
  158. mcp_proxy_adapter/examples/__init__.py +16 -0
  159. mcp_proxy_adapter/examples/basic_framework/__init__.py +9 -0
  160. mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +4 -0
  161. mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +4 -0
  162. mcp_proxy_adapter/examples/basic_framework/main.py +52 -0
  163. mcp_proxy_adapter/examples/bugfix_certificate_config.py +261 -0
  164. mcp_proxy_adapter/examples/cert_manager_bugfix.py +203 -0
  165. mcp_proxy_adapter/examples/check_config.py +413 -0
  166. mcp_proxy_adapter/examples/client_usage_example.py +164 -0
  167. mcp_proxy_adapter/examples/commands/__init__.py +5 -0
  168. mcp_proxy_adapter/examples/config_builder.py +234 -0
  169. mcp_proxy_adapter/examples/config_cli.py +282 -0
  170. mcp_proxy_adapter/examples/create_test_configs.py +174 -0
  171. mcp_proxy_adapter/examples/debug_request_state.py +130 -0
  172. mcp_proxy_adapter/examples/debug_role_chain.py +191 -0
  173. mcp_proxy_adapter/examples/demo_client.py +287 -0
  174. mcp_proxy_adapter/examples/full_application/__init__.py +12 -0
  175. mcp_proxy_adapter/examples/full_application/commands/__init__.py +8 -0
  176. mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +45 -0
  177. mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +52 -0
  178. mcp_proxy_adapter/examples/full_application/commands/echo_command.py +32 -0
  179. mcp_proxy_adapter/examples/full_application/commands/help_command.py +54 -0
  180. mcp_proxy_adapter/examples/full_application/commands/list_command.py +57 -0
  181. mcp_proxy_adapter/examples/full_application/hooks/__init__.py +5 -0
  182. mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +29 -0
  183. mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +27 -0
  184. mcp_proxy_adapter/examples/full_application/main.py +311 -0
  185. mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +161 -0
  186. mcp_proxy_adapter/examples/full_application/run_mtls.py +252 -0
  187. mcp_proxy_adapter/examples/full_application/run_simple.py +152 -0
  188. mcp_proxy_adapter/examples/full_application/test_minimal_server.py +45 -0
  189. mcp_proxy_adapter/examples/full_application/test_server.py +163 -0
  190. mcp_proxy_adapter/examples/full_application/test_simple_server.py +62 -0
  191. mcp_proxy_adapter/examples/generate_config.py +502 -0
  192. mcp_proxy_adapter/examples/proxy_registration_example.py +335 -0
  193. mcp_proxy_adapter/examples/queue_demo_simple.py +632 -0
  194. mcp_proxy_adapter/examples/queue_integration_example.py +578 -0
  195. mcp_proxy_adapter/examples/queue_server_demo.py +82 -0
  196. mcp_proxy_adapter/examples/queue_server_example.py +85 -0
  197. mcp_proxy_adapter/examples/queue_server_simple.py +173 -0
  198. mcp_proxy_adapter/examples/required_certificates.py +208 -0
  199. mcp_proxy_adapter/examples/run_example.py +77 -0
  200. mcp_proxy_adapter/examples/run_full_test_suite.py +619 -0
  201. mcp_proxy_adapter/examples/run_proxy_server.py +153 -0
  202. mcp_proxy_adapter/examples/run_security_tests_fixed.py +435 -0
  203. mcp_proxy_adapter/examples/security_test/__init__.py +18 -0
  204. mcp_proxy_adapter/examples/security_test/auth_manager.py +14 -0
  205. mcp_proxy_adapter/examples/security_test/ssl_context_manager.py +28 -0
  206. mcp_proxy_adapter/examples/security_test/test_client.py +159 -0
  207. mcp_proxy_adapter/examples/security_test/test_result.py +22 -0
  208. mcp_proxy_adapter/examples/security_test_client.py +72 -0
  209. mcp_proxy_adapter/examples/setup/__init__.py +24 -0
  210. mcp_proxy_adapter/examples/setup/certificate_manager.py +215 -0
  211. mcp_proxy_adapter/examples/setup/config_generator.py +12 -0
  212. mcp_proxy_adapter/examples/setup/config_validator.py +118 -0
  213. mcp_proxy_adapter/examples/setup/environment_setup.py +62 -0
  214. mcp_proxy_adapter/examples/setup/test_files_generator.py +10 -0
  215. mcp_proxy_adapter/examples/setup/test_runner.py +89 -0
  216. mcp_proxy_adapter/examples/setup_test_environment.py +235 -0
  217. mcp_proxy_adapter/examples/simple_protocol_test.py +125 -0
  218. mcp_proxy_adapter/examples/test_chk_hostname_automated.py +211 -0
  219. mcp_proxy_adapter/examples/test_config.py +205 -0
  220. mcp_proxy_adapter/examples/test_config_builder.py +110 -0
  221. mcp_proxy_adapter/examples/test_examples.py +308 -0
  222. mcp_proxy_adapter/examples/test_framework_complete.py +267 -0
  223. mcp_proxy_adapter/examples/test_mcp_server.py +187 -0
  224. mcp_proxy_adapter/examples/test_protocol_examples.py +337 -0
  225. mcp_proxy_adapter/examples/universal_client.py +674 -0
  226. mcp_proxy_adapter/examples/update_config_certificates.py +135 -0
  227. mcp_proxy_adapter/examples/validate_generator_compatibility.py +385 -0
  228. mcp_proxy_adapter/examples/validate_generator_compatibility_simple.py +61 -0
  229. mcp_proxy_adapter/integrations/__init__.py +25 -0
  230. mcp_proxy_adapter/integrations/queuemgr_integration.py +462 -0
  231. mcp_proxy_adapter/main.py +311 -0
  232. mcp_proxy_adapter/openapi.py +375 -0
  233. mcp_proxy_adapter/schemas/base_schema.json +114 -0
  234. mcp_proxy_adapter/schemas/openapi_schema.json +314 -0
  235. mcp_proxy_adapter/schemas/roles.json +37 -0
  236. mcp_proxy_adapter/schemas/roles_schema.json +162 -0
  237. mcp_proxy_adapter/version.py +5 -0
  238. mcp_proxy_adapter-6.9.50.dist-info/METADATA +1088 -0
  239. mcp_proxy_adapter-6.9.50.dist-info/RECORD +242 -0
  240. {mcp_proxy_adapter-2.0.1.dist-info → mcp_proxy_adapter-6.9.50.dist-info}/WHEEL +1 -1
  241. mcp_proxy_adapter-6.9.50.dist-info/entry_points.txt +14 -0
  242. mcp_proxy_adapter-6.9.50.dist-info/top_level.txt +1 -0
  243. adapters/__init__.py +0 -16
  244. analyzers/__init__.py +0 -14
  245. analyzers/docstring_analyzer.py +0 -199
  246. analyzers/type_analyzer.py +0 -151
  247. cli/__init__.py +0 -12
  248. cli/__main__.py +0 -79
  249. cli/command_runner.py +0 -233
  250. dispatchers/__init__.py +0 -14
  251. dispatchers/base_dispatcher.py +0 -85
  252. dispatchers/json_rpc_dispatcher.py +0 -198
  253. generators/__init__.py +0 -14
  254. generators/endpoint_generator.py +0 -172
  255. generators/openapi_generator.py +0 -254
  256. generators/rest_api_generator.py +0 -207
  257. mcp_proxy_adapter-2.0.1.dist-info/METADATA +0 -272
  258. mcp_proxy_adapter-2.0.1.dist-info/RECORD +0 -28
  259. mcp_proxy_adapter-2.0.1.dist-info/licenses/LICENSE +0 -21
  260. mcp_proxy_adapter-2.0.1.dist-info/top_level.txt +0 -7
  261. openapi_schema/__init__.py +0 -38
  262. openapi_schema/command_registry.py +0 -312
  263. openapi_schema/rest_schema.py +0 -510
  264. openapi_schema/rpc_generator.py +0 -307
  265. openapi_schema/rpc_schema.py +0 -416
  266. validators/__init__.py +0 -14
  267. validators/base_validator.py +0 -23
  268. validators/docstring_validator.py +0 -75
  269. validators/metadata_validator.py +0 -76
@@ -0,0 +1,337 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Author: Vasiliy Zdanovskiy
4
+ email: vasilyvz@gmail.com
5
+
6
+ Test script for HTTP and HTTPS protocol examples with proxy registration.
7
+ """
8
+
9
+ import json
10
+ import os
11
+ import subprocess
12
+ import sys
13
+ import time
14
+ import requests
15
+ from pathlib import Path
16
+
17
+
18
+ class ProtocolTester:
19
+ """Test HTTP and HTTPS protocol examples with proxy registration."""
20
+
21
+ def __init__(self):
22
+ self.base_dir = Path(__file__).parent
23
+ self.http_config = self.base_dir / "http_proxy_example.json"
24
+ self.https_config = self.base_dir / "https_proxy_example.json"
25
+ self.proxy_process = None
26
+ self.http_server_process = None
27
+ self.https_server_process = None
28
+
29
+ def check_ports_available(self):
30
+ """Check if required ports are available."""
31
+ # Check server ports (20021, 20022) - these should be free
32
+ server_ports = [20021, 20022]
33
+ occupied_ports = []
34
+
35
+ for port in server_ports:
36
+ try:
37
+ import socket
38
+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
39
+ s.settimeout(1)
40
+ result = s.connect_ex(('127.0.0.1', port))
41
+ if result == 0:
42
+ occupied_ports.append(port)
43
+ except Exception:
44
+ pass
45
+
46
+ # Check if proxy port (20005) is available or already running
47
+ proxy_port = 20005
48
+ proxy_running = False
49
+ try:
50
+ import socket
51
+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
52
+ s.settimeout(1)
53
+ result = s.connect_ex(('127.0.0.1', proxy_port))
54
+ if result == 0:
55
+ proxy_running = True
56
+ except Exception:
57
+ pass
58
+
59
+ if occupied_ports:
60
+ print(f"❌ Server ports {occupied_ports} are already in use")
61
+ print("Please stop services using these ports and try again")
62
+ return False
63
+
64
+ if proxy_running:
65
+ print(f"✅ Proxy server already running on port {proxy_port}")
66
+ else:
67
+ print(f"⚠️ Proxy server not running on port {proxy_port} - will start it")
68
+
69
+ print(f"✅ Server ports {server_ports} are available")
70
+ return True
71
+
72
+ def start_proxy_server(self):
73
+ """Start the proxy server if not already running."""
74
+ # Check if proxy is already running
75
+ if self.test_proxy_health():
76
+ print("✅ Proxy server already running")
77
+ return True
78
+
79
+ print("🚀 Starting proxy server...")
80
+ try:
81
+ self.proxy_process = subprocess.Popen([
82
+ sys.executable, "-m", "mcp_proxy_adapter.examples.run_proxy_server",
83
+ "--host", "127.0.0.1",
84
+ "--port", "20005",
85
+ "--log-level", "info"
86
+ ], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
87
+
88
+ # Wait for proxy to start
89
+ time.sleep(3)
90
+
91
+ # Test proxy health
92
+ if self.test_proxy_health():
93
+ print("✅ Proxy server started successfully")
94
+ return True
95
+ else:
96
+ print("❌ Proxy server failed to start")
97
+ return False
98
+
99
+ except Exception as e:
100
+ print(f"❌ Failed to start proxy server: {e}")
101
+ return False
102
+
103
+ def test_proxy_health(self):
104
+ """Test proxy server health on both HTTP and HTTPS."""
105
+ print("🔍 Testing proxy server health...")
106
+
107
+ # Try HTTP first
108
+ try:
109
+ response = requests.get(
110
+ "https://127.0.0.1:20005/health",
111
+ verify=False,
112
+ timeout=5
113
+ )
114
+ if response.status_code == 200:
115
+ print("✅ Proxy server responding on HTTP")
116
+ return True
117
+ except Exception as e:
118
+ print(f"⚠️ HTTP health check failed: {e}")
119
+
120
+ # Try HTTPS
121
+ try:
122
+ response = requests.get(
123
+ "https://127.0.0.1:20005/health",
124
+ verify=False,
125
+ timeout=5
126
+ )
127
+ if response.status_code == 200:
128
+ print("✅ Proxy server responding on HTTPS")
129
+ return True
130
+ except Exception as e:
131
+ print(f"⚠️ HTTPS health check failed: {e}")
132
+
133
+ print("❌ Proxy server not responding on either protocol")
134
+ return False
135
+
136
+ def start_http_server(self):
137
+ """Start HTTP test server."""
138
+ print("🚀 Starting HTTP test server...")
139
+ try:
140
+ self.http_server_process = subprocess.Popen([
141
+ sys.executable, "-m", "mcp_proxy_adapter",
142
+ "--config", str(self.http_config)
143
+ ], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
144
+
145
+ # Wait for server to start
146
+ time.sleep(5)
147
+
148
+ # Test server health
149
+ if self.test_server_health("http", 20021):
150
+ print("✅ HTTP server started successfully")
151
+ return True
152
+ else:
153
+ print("❌ HTTP server failed to start")
154
+ return False
155
+
156
+ except Exception as e:
157
+ print(f"❌ Failed to start HTTP server: {e}")
158
+ return False
159
+
160
+ def start_https_server(self):
161
+ """Start HTTPS test server."""
162
+ print("🚀 Starting HTTPS test server...")
163
+ try:
164
+ self.https_server_process = subprocess.Popen([
165
+ sys.executable, "-m", "mcp_proxy_adapter",
166
+ "--config", str(self.https_config)
167
+ ], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
168
+
169
+ # Wait for server to start
170
+ time.sleep(5)
171
+
172
+ # Test server health
173
+ if self.test_server_health("https", 20022):
174
+ print("✅ HTTPS server started successfully")
175
+ return True
176
+ else:
177
+ print("❌ HTTPS server failed to start")
178
+ return False
179
+
180
+ except Exception as e:
181
+ print(f"❌ Failed to start HTTPS server: {e}")
182
+ return False
183
+
184
+ def test_server_health(self, protocol, port):
185
+ """Test server health."""
186
+ # Try the specified protocol first
187
+ try:
188
+ url = f"{protocol}://127.0.0.1:{port}/health"
189
+ response = requests.get(
190
+ url,
191
+ verify=False if protocol == "https" else True,
192
+ timeout=5
193
+ )
194
+ if response.status_code == 200:
195
+ print(f"✅ {protocol.upper()} server responding on port {port}")
196
+ return True
197
+ else:
198
+ print(f"⚠️ {protocol.upper()} server health check failed: {response.status_code}")
199
+ except Exception as e:
200
+ print(f"⚠️ {protocol.upper()} server health check failed: {e}")
201
+
202
+ # If HTTPS failed, try HTTP as fallback
203
+ if protocol == "https":
204
+ try:
205
+ url = f"http://127.0.0.1:{port}/health"
206
+ response = requests.get(url, timeout=5)
207
+ if response.status_code == 200:
208
+ print(f"✅ Server responding on HTTP (fallback) on port {port}")
209
+ return True
210
+ else:
211
+ print(f"⚠️ HTTP fallback health check failed: {response.status_code}")
212
+ except Exception as e:
213
+ print(f"⚠️ HTTP fallback health check failed: {e}")
214
+
215
+ return False
216
+
217
+ def test_api_key_auth(self, protocol, port, token):
218
+ """Test API key authentication."""
219
+ try:
220
+ url = f"{protocol}://127.0.0.1:{port}/api/test"
221
+ headers = {"Authorization": f"Bearer {token}"}
222
+ response = requests.get(
223
+ url,
224
+ headers=headers,
225
+ verify=False if protocol == "https" else True,
226
+ timeout=5
227
+ )
228
+ if response.status_code == 200:
229
+ print(f"✅ {protocol.upper()} API key auth successful with token {token}")
230
+ return True
231
+ else:
232
+ print(f"⚠️ {protocol.upper()} API key auth failed: {response.status_code}")
233
+ return False
234
+ except Exception as e:
235
+ print(f"⚠️ {protocol.upper()} API key auth failed: {e}")
236
+ return False
237
+
238
+ def test_proxy_registration(self, protocol, port, server_id):
239
+ """Test proxy registration."""
240
+ try:
241
+ # Check if server is registered with proxy
242
+ response = requests.get(
243
+ "https://127.0.0.1:20005/list",
244
+ verify=False,
245
+ timeout=5
246
+ )
247
+ if response.status_code == 200:
248
+ registered_servers = response.json()
249
+ for server in registered_servers.get("adapters", []):
250
+ if server.get("name") == server_id:
251
+ print(f"✅ {protocol.upper()} server {server_id} registered with proxy")
252
+ return True
253
+
254
+ print(f"⚠️ {protocol.upper()} server {server_id} not found in proxy registry")
255
+ return False
256
+ else:
257
+ print(f"⚠️ Failed to get proxy registry: {response.status_code}")
258
+ return False
259
+ except Exception as e:
260
+ print(f"⚠️ Proxy registration check failed: {e}")
261
+ return False
262
+
263
+ def cleanup(self):
264
+ """Clean up all processes."""
265
+ print("🧹 Cleaning up processes...")
266
+
267
+ for process, name in [
268
+ (self.http_server_process, "HTTP server"),
269
+ (self.https_server_process, "HTTPS server"),
270
+ (self.proxy_process, "Proxy server")
271
+ ]:
272
+ if process and process.poll() is None:
273
+ print(f"🛑 Stopping {name}...")
274
+ process.terminate()
275
+ try:
276
+ process.wait(timeout=5)
277
+ except subprocess.TimeoutExpired:
278
+ process.kill()
279
+ process.wait()
280
+
281
+ def run_tests(self):
282
+ """Run all protocol tests."""
283
+ print("🧪 Starting Protocol Examples Test Suite")
284
+ print("=" * 50)
285
+
286
+ # Check ports
287
+ if not self.check_ports_available():
288
+ return False
289
+
290
+ try:
291
+ # Start proxy server
292
+ if not self.start_proxy_server():
293
+ return False
294
+
295
+ # Start HTTP server
296
+ if not self.start_http_server():
297
+ return False
298
+
299
+ # Start HTTPS server
300
+ if not self.start_https_server():
301
+ return False
302
+
303
+ print("\n🔍 Running tests...")
304
+ print("-" * 30)
305
+
306
+ # Test API key authentication
307
+ print("\n📋 Testing API Key Authentication:")
308
+ self.test_api_key_auth("http", 20021, "admin-secret-key")
309
+ self.test_api_key_auth("https", 20022, "admin-secret-key")
310
+
311
+ # Test proxy registration
312
+ print("\n📋 Testing Proxy Registration:")
313
+ self.test_proxy_registration("http", 20021, "http_test_server")
314
+ self.test_proxy_registration("https", 20022, "https_test_server")
315
+
316
+ print("\n✅ Protocol examples test completed!")
317
+ return True
318
+
319
+ except KeyboardInterrupt:
320
+ print("\n🛑 Test interrupted by user")
321
+ return False
322
+ except Exception as e:
323
+ print(f"\n❌ Test failed with error: {e}")
324
+ return False
325
+ finally:
326
+ self.cleanup()
327
+
328
+
329
+ def main():
330
+ """Main function."""
331
+ tester = ProtocolTester()
332
+ success = tester.run_tests()
333
+ sys.exit(0 if success else 1)
334
+
335
+
336
+ if __name__ == "__main__":
337
+ main()