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,335 @@
1
+ """
2
+ Proxy Registration Example
3
+ This example demonstrates how to use the MCP Proxy Adapter framework
4
+ for proxy registration with different authentication methods.
5
+ Author: Vasiliy Zdanovskiy
6
+ email: vasilyvz@gmail.com
7
+ """
8
+
9
+ import asyncio
10
+ import json
11
+ import sys
12
+ import os
13
+ from pathlib import Path
14
+ from typing import Dict, Any, Optional
15
+
16
+ # Add project root to path
17
+ project_root = Path(__file__).parent.parent.parent
18
+ sys.path.insert(0, str(project_root))
19
+ import aiohttp
20
+ from aiohttp import ClientTimeout, TCPConnector
21
+ import ssl
22
+ from mcp_proxy_adapter.core.logging import get_global_logger
23
+
24
+
25
+ class ProxyRegistrationExample:
26
+ """Example client for testing proxy registration functionality."""
27
+
28
+ def __init__(self, server_url: str, auth_token: Optional[str] = None):
29
+ """
30
+ Initialize example client.
31
+ Args:
32
+ server_url: Server URL
33
+ auth_token: Authentication token
34
+ """
35
+ self.server_url = server_url
36
+ self.auth_token = auth_token
37
+ self.session: Optional[aiohttp.ClientSession] = None
38
+ # Test data
39
+ self.test_servers = [
40
+ {
41
+ "server_id": "example-server-1",
42
+ "server_url": "http://localhost:8001",
43
+ "server_name": "Example Server 1",
44
+ "description": "Example server for registration testing",
45
+ "version": "1.0.0",
46
+ "capabilities": ["jsonrpc", "rest"],
47
+ "endpoints": {
48
+ "jsonrpc": "/api/jsonrpc",
49
+ "rest": "/cmd",
50
+ "health": "/health",
51
+ },
52
+ "auth_method": "api_key",
53
+ "security_enabled": True,
54
+ },
55
+ {
56
+ "server_id": "example-server-2",
57
+ "server_url": "http://localhost:8002",
58
+ "server_name": "Example Server 2",
59
+ "description": "Another example server",
60
+ "version": "1.0.0",
61
+ "capabilities": ["jsonrpc", "rest", "security"],
62
+ "endpoints": {
63
+ "jsonrpc": "/api/jsonrpc",
64
+ "rest": "/cmd",
65
+ "health": "/health",
66
+ },
67
+ "auth_method": "certificate",
68
+ "security_enabled": True,
69
+ },
70
+ ]
71
+
72
+ async def __aenter__(self):
73
+ """Async context manager entry."""
74
+ # Create SSL context for HTTPS
75
+ ssl_context = None
76
+ if self.server_url.startswith("https"):
77
+ ssl_context = ssl.create_default_context()
78
+ ssl_context.check_hostname = False
79
+ ssl_context.verify_mode = ssl.CERT_NONE
80
+ # Create connector
81
+ connector = TCPConnector(ssl=ssl_context) if ssl_context else None
82
+ # Create session
83
+ timeout = ClientTimeout(total=30)
84
+ self.session = aiohttp.ClientSession(connector=connector, timeout=timeout)
85
+ return self
86
+
87
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
88
+ """Async context manager exit."""
89
+ if self.session:
90
+ await self.session.close()
91
+
92
+ def _get_headers(self) -> Dict[str, str]:
93
+ """Get request headers with authentication."""
94
+ headers = {"Content-Type": "application/json"}
95
+ if self.auth_token:
96
+ headers["X-API-Key"] = self.auth_token
97
+ return headers
98
+
99
+ async def test_registration(self, server_data: Dict[str, Any]) -> Dict[str, Any]:
100
+ """
101
+ Test registration with authentication.
102
+ Args:
103
+ server_data: Server registration data
104
+ Returns:
105
+ Test result
106
+ """
107
+ try:
108
+ # Prepare JSON-RPC request
109
+ request_data = {
110
+ "jsonrpc": "2.0",
111
+ "id": 1,
112
+ "method": "proxy_registration",
113
+ "params": {"operation": "register", **server_data},
114
+ }
115
+ get_global_logger().info(f"Testing registration for server: {server_data['server_id']}")
116
+ get_global_logger().debug(f"Request data: {json.dumps(request_data, indent=2)}")
117
+ # Make request
118
+ async with self.session.post(
119
+ f"{self.server_url}/cmd", json=request_data, headers=self._get_headers()
120
+ ) as response:
121
+ result = await response.json()
122
+ get_global_logger().info(f"Response status: {response.status}")
123
+ get_global_logger().debug(f"Response: {json.dumps(result, indent=2)}")
124
+ return {
125
+ "success": response.status == 200,
126
+ "status_code": response.status,
127
+ "result": result,
128
+ "server_id": server_data["server_id"],
129
+ }
130
+ except Exception as e:
131
+ get_global_logger().error(f"Registration test failed: {e}")
132
+ return {
133
+ "success": False,
134
+ "error": str(e),
135
+ "server_id": server_data["server_id"],
136
+ }
137
+
138
+ async def test_discovery(self) -> Dict[str, Any]:
139
+ """
140
+ Test discovery operation.
141
+ Returns:
142
+ Test result
143
+ """
144
+ try:
145
+ # Prepare JSON-RPC request
146
+ request_data = {
147
+ "jsonrpc": "2.0",
148
+ "id": 1,
149
+ "method": "proxy_registration",
150
+ "params": {"operation": "discover"},
151
+ }
152
+ get_global_logger().info("Testing discovery operation")
153
+ # Make request
154
+ async with self.session.post(
155
+ f"{self.server_url}/cmd", json=request_data, headers=self._get_headers()
156
+ ) as response:
157
+ result = await response.json()
158
+ get_global_logger().info(f"Response status: {response.status}")
159
+ get_global_logger().debug(f"Response: {json.dumps(result, indent=2)}")
160
+ return {
161
+ "success": response.status == 200,
162
+ "status_code": response.status,
163
+ "result": result,
164
+ }
165
+ except Exception as e:
166
+ get_global_logger().error(f"Discovery test failed: {e}")
167
+ return {"success": False, "error": str(e)}
168
+
169
+ async def test_heartbeat(self, server_key: str) -> Dict[str, Any]:
170
+ """
171
+ Test heartbeat operation.
172
+ Args:
173
+ server_key: Server key for heartbeat
174
+ Returns:
175
+ Test result
176
+ """
177
+ try:
178
+ # Prepare JSON-RPC request
179
+ request_data = {
180
+ "jsonrpc": "2.0",
181
+ "id": 1,
182
+ "method": "proxy_registration",
183
+ "params": {
184
+ "operation": "heartbeat",
185
+ "server_key": server_key,
186
+ "timestamp": 1234567890,
187
+ "status": "healthy",
188
+ },
189
+ }
190
+ get_global_logger().info(f"Testing heartbeat for server: {server_key}")
191
+ # Make request
192
+ async with self.session.post(
193
+ f"{self.server_url}/cmd", json=request_data, headers=self._get_headers()
194
+ ) as response:
195
+ result = await response.json()
196
+ get_global_logger().info(f"Response status: {response.status}")
197
+ get_global_logger().debug(f"Response: {json.dumps(result, indent=2)}")
198
+ return {
199
+ "success": response.status == 200,
200
+ "status_code": response.status,
201
+ "result": result,
202
+ "server_key": server_key,
203
+ }
204
+ except Exception as e:
205
+ get_global_logger().error(f"Heartbeat test failed: {e}")
206
+ return {"success": False, "error": str(e), "server_key": server_key}
207
+
208
+
209
+ async def run_proxy_registration_example():
210
+ """Run proxy registration example."""
211
+ get_global_logger().info("šŸš€ Starting proxy registration example")
212
+ # Test configurations
213
+ test_configs = [
214
+ {
215
+ "name": "Admin Token",
216
+ "server_url": "http://localhost:8002",
217
+ "auth_token": "test-token-123",
218
+ },
219
+ {
220
+ "name": "User Token",
221
+ "server_url": "http://localhost:8002",
222
+ "auth_token": "user-token-456",
223
+ },
224
+ {
225
+ "name": "Readonly Token",
226
+ "server_url": "http://localhost:8002",
227
+ "auth_token": "readonly-token-123",
228
+ },
229
+ ]
230
+ results = []
231
+ for config in test_configs:
232
+ get_global_logger().info(f"\nšŸ“‹ Testing: {config['name']}")
233
+ get_global_logger().info(f"Server URL: {config['server_url']}")
234
+ get_global_logger().info(f"Auth Token: {config['auth_token']}")
235
+ async with ProxyRegistrationExample(
236
+ config["server_url"], config["auth_token"]
237
+ ) as client:
238
+ # Test registration
239
+ for server_data in client.test_servers:
240
+ result = await client.test_registration(server_data)
241
+ results.append(
242
+ {
243
+ "test": f"{config['name']} - Registration",
244
+ "server_id": server_data["server_id"],
245
+ **result,
246
+ }
247
+ )
248
+ # If registration successful, test heartbeat
249
+ if result["success"] and "result" in result:
250
+ server_key = result["result"].get("result", {}).get("server_key")
251
+ if server_key:
252
+ heartbeat_result = await client.test_heartbeat(server_key)
253
+ results.append(
254
+ {
255
+ "test": f"{config['name']} - Heartbeat",
256
+ "server_key": server_key,
257
+ **heartbeat_result,
258
+ }
259
+ )
260
+ # Test discovery
261
+ discovery_result = await client.test_discovery()
262
+ results.append(
263
+ {"test": f"{config['name']} - Discovery", **discovery_result}
264
+ )
265
+ # Test without authentication
266
+ get_global_logger().info(f"\nšŸ“‹ Testing: No Authentication")
267
+ async with ProxyRegistrationExample("http://localhost:8002") as client:
268
+ for server_data in client.test_servers:
269
+ result = await client.test_registration(server_data)
270
+ results.append(
271
+ {
272
+ "test": "No Auth - Registration",
273
+ "server_id": server_data["server_id"],
274
+ **result,
275
+ }
276
+ )
277
+ # Print results
278
+ get_global_logger().info("\n" + "=" * 80)
279
+ get_global_logger().info("šŸ“Š EXAMPLE RESULTS")
280
+ get_global_logger().info("=" * 80)
281
+ passed = 0
282
+ failed = 0
283
+ for result in results:
284
+ status = "āœ… PASS" if result["success"] else "āŒ FAIL"
285
+ get_global_logger().info(f"{status} {result['test']}")
286
+ if result["success"]:
287
+ passed += 1
288
+ else:
289
+ failed += 1
290
+ if "error" in result:
291
+ get_global_logger().error(f" Error: {result['error']}")
292
+ elif "result" in result:
293
+ result_data = result["result"]
294
+ if "error" in result_data:
295
+ get_global_logger().error(f" API Error: {result_data['error']}")
296
+ elif "result" in result_data:
297
+ api_result = result_data["result"]
298
+ if "server_key" in api_result:
299
+ get_global_logger().info(f" Server Key: {api_result['server_key']}")
300
+ if "message" in api_result:
301
+ get_global_logger().info(f" Message: {api_result['message']}")
302
+ get_global_logger().info("\n" + "=" * 80)
303
+ get_global_logger().info(f"šŸ“ˆ SUMMARY: {passed} passed, {failed} failed")
304
+ get_global_logger().info("=" * 80)
305
+ return passed, failed
306
+
307
+
308
+ def main():
309
+ """Main function for the example."""
310
+ get_global_logger().info("šŸ”§ MCP Proxy Adapter - Proxy Registration Example")
311
+ get_global_logger().info("=" * 60)
312
+ # Check if server is running
313
+ import socket
314
+
315
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
316
+ result = sock.connect_ex(("localhost", 8002))
317
+ sock.close()
318
+ if result != 0:
319
+ get_global_logger().error("āŒ Server is not running on localhost:8002")
320
+ get_global_logger().info("šŸ’” Please start the server first:")
321
+ get_global_logger().info(" cd mcp_proxy_adapter/examples")
322
+ get_global_logger().info(
323
+ " python -m mcp_proxy_adapter.main --config server_configs/config_proxy_registration.json"
324
+ )
325
+ sys.exit(1)
326
+ get_global_logger().info("āœ… Server is running on localhost:8002")
327
+ get_global_logger().info("šŸš€ Starting proxy registration example...")
328
+ # Run example
329
+ passed, failed = asyncio.run(run_proxy_registration_example())
330
+ # Exit with appropriate code
331
+ sys.exit(0 if failed == 0 else 1)
332
+
333
+
334
+ if __name__ == "__main__":
335
+ main()