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,319 @@
1
+ """
2
+ Proxy Registration Command
3
+
4
+ This command handles proxy registration functionality with security framework integration.
5
+ It provides endpoints for registration, unregistration, heartbeat, and discovery.
6
+
7
+ Author: Vasiliy Zdanovskiy
8
+ email: vasilyvz@gmail.com
9
+ """
10
+
11
+ import json
12
+ import time
13
+ from typing import Dict, Any, List, Optional
14
+ from dataclasses import dataclass
15
+
16
+ from mcp_proxy_adapter.commands.base import Command
17
+ from mcp_proxy_adapter.commands.result import SuccessResult
18
+ from mcp_proxy_adapter.core.logging import get_global_logger
19
+
20
+
21
+ @dataclass
22
+ class ProxyRegistrationCommandResult(SuccessResult):
23
+ """Result of proxy registration command."""
24
+
25
+ operation: str
26
+ success: bool
27
+ server_key: Optional[str] = None
28
+ message: str = ""
29
+ details: Optional[Dict[str, Any]] = None
30
+
31
+
32
+ @classmethod
33
+
34
+
35
+ class ProxyRegistrationCommand(Command):
36
+ """Proxy registration command with security framework integration."""
37
+
38
+ name = "proxy_registration"
39
+ descr = "Proxy registration operations (register, unregister, heartbeat, discover)"
40
+ category = "proxy"
41
+ author = "Vasiliy Zdanovskiy"
42
+ email = "vasilyvz@gmail.com"
43
+
44
+ # In-memory registry for testing
45
+ _registry: Dict[str, Dict[str, Any]] = {}
46
+ _server_counter = 1
47
+
48
+ async def execute(self, **kwargs) -> ProxyRegistrationCommandResult:
49
+ """
50
+ Execute proxy registration command.
51
+
52
+ Args:
53
+ operation: Operation to perform (register, unregister, heartbeat, discover)
54
+ server_id: Server ID for registration
55
+ server_url: Server URL for registration
56
+ server_name: Server name
57
+ description: Server description
58
+ version: Server version
59
+ capabilities: Server capabilities
60
+ endpoints: Server endpoints
61
+ auth_method: Authentication method
62
+ security_enabled: Whether security is enabled
63
+ server_key: Server key for unregistration/heartbeat
64
+ copy_number: Copy number for unregistration
65
+ timestamp: Timestamp for heartbeat
66
+ status: Status for heartbeat
67
+
68
+ Returns:
69
+ ProxyRegistrationCommandResult
70
+ """
71
+ operation = kwargs.get("operation", "register")
72
+
73
+ # Check user permissions
74
+ context = kwargs.get("context", {})
75
+ user_info = context.get("user", {})
76
+ user_permissions = user_info.get("permissions", [])
77
+
78
+ # Define required permissions for each operation
79
+ operation_permissions = {
80
+ "register": ["register"],
81
+ "unregister": ["unregister"],
82
+ "heartbeat": ["heartbeat"],
83
+ "discover": ["discover"],
84
+ }
85
+
86
+ required_permissions = operation_permissions.get(operation, ["read"])
87
+
88
+ # Check if security is enabled before checking permissions
89
+ security_enabled = self.config.get("security", {}).get("enabled", False)
90
+
91
+ # Only check permissions if security is enabled
92
+ if security_enabled:
93
+ get_global_logger().info(
94
+ f"Checking permissions: user_permissions={user_permissions}, required={required_permissions}"
95
+ )
96
+ if not self._check_permissions(user_permissions, required_permissions):
97
+ return ProxyRegistrationCommandResult(
98
+ operation=operation,
99
+ success=False,
100
+ message=f"Permission denied: {operation} requires {required_permissions}",
101
+ )
102
+ else:
103
+ get_global_logger().debug(f"Security disabled, skipping permission check for operation: {operation}")
104
+
105
+ get_global_logger().info(f"Executing proxy registration operation: {operation}")
106
+ get_global_logger().debug(
107
+ f"User permissions: {user_permissions}, required: {required_permissions}"
108
+ )
109
+
110
+ if operation == "register":
111
+ return await self._handle_register(kwargs)
112
+ elif operation == "unregister":
113
+ return await self._handle_unregister(kwargs)
114
+ elif operation == "heartbeat":
115
+ return await self._handle_heartbeat(kwargs)
116
+ elif operation == "discover":
117
+ return await self._handle_discover(kwargs)
118
+ else:
119
+ return ProxyRegistrationCommandResult(
120
+ operation=operation,
121
+ success=False,
122
+ message=f"Unknown operation: {operation}",
123
+ )
124
+
125
+ async def _handle_register(
126
+ self, kwargs: Dict[str, Any]
127
+ ) -> ProxyRegistrationCommandResult:
128
+ """Handle registration operation."""
129
+ server_id = kwargs.get("server_id")
130
+ server_url = kwargs.get("server_url")
131
+ server_name = kwargs.get("server_name", "Unknown Server")
132
+ description = kwargs.get("description", "")
133
+ version = kwargs.get("version", "1.0.0")
134
+ capabilities = kwargs.get("capabilities", ["jsonrpc", "rest"])
135
+ endpoints = kwargs.get("endpoints", {})
136
+ auth_method = kwargs.get("auth_method", "none")
137
+ security_enabled = kwargs.get("security_enabled", False)
138
+
139
+ if not server_id or not server_url:
140
+ return ProxyRegistrationCommandResult(
141
+ operation="register",
142
+ success=False,
143
+ message="Missing required parameters: server_id and server_url",
144
+ )
145
+
146
+ # Check if server already exists
147
+ existing_servers = [
148
+ key for key in self._registry.keys() if key.startswith(server_id)
149
+ ]
150
+ copy_number = len(existing_servers) + 1
151
+ server_key = f"{server_id}_{copy_number}"
152
+
153
+ # Create server record
154
+ server_record = {
155
+ "server_id": server_id,
156
+ "server_url": server_url,
157
+ "server_name": server_name,
158
+ "description": description,
159
+ "version": version,
160
+ "capabilities": capabilities,
161
+ "endpoints": endpoints,
162
+ "auth_method": auth_method,
163
+ "security_enabled": security_enabled,
164
+ "registered_at": int(time.time()),
165
+ "last_heartbeat": int(time.time()),
166
+ "status": "active",
167
+ }
168
+
169
+ self._registry[server_key] = server_record
170
+
171
+ get_global_logger().info(f"Registered server: {server_key} at {server_url}")
172
+
173
+ return ProxyRegistrationCommandResult(
174
+ operation="register",
175
+ success=True,
176
+ server_key=server_key,
177
+ message=f"Server registered successfully with key: {server_key}",
178
+ details={
179
+ "server_id": server_id,
180
+ "copy_number": copy_number,
181
+ "registered_at": server_record["registered_at"],
182
+ },
183
+ )
184
+
185
+ async def _handle_unregister(
186
+ self, kwargs: Dict[str, Any]
187
+ ) -> ProxyRegistrationCommandResult:
188
+ """Handle unregistration operation."""
189
+ server_id = kwargs.get("server_id")
190
+ copy_number = kwargs.get("copy_number", 1)
191
+
192
+ if not server_id:
193
+ return ProxyRegistrationCommandResult(
194
+ operation="unregister",
195
+ success=False,
196
+ message="Missing required parameter: server_id",
197
+ )
198
+
199
+ server_key = f"{server_id}_{copy_number}"
200
+
201
+ if server_key in self._registry:
202
+ del self._registry[server_key]
203
+ get_global_logger().info(f"Unregistered server: {server_key}")
204
+
205
+ return ProxyRegistrationCommandResult(
206
+ operation="unregister",
207
+ success=True,
208
+ message=f"Server unregistered successfully: {server_key}",
209
+ details={"unregistered": True},
210
+ )
211
+ else:
212
+ return ProxyRegistrationCommandResult(
213
+ operation="unregister",
214
+ success=True,
215
+ message=f"Server not found in registry: {server_key}",
216
+ details={"unregistered": False},
217
+ )
218
+
219
+ async def _handle_heartbeat(
220
+ self, kwargs: Dict[str, Any]
221
+ ) -> ProxyRegistrationCommandResult:
222
+ """Handle heartbeat operation."""
223
+ server_id = kwargs.get("server_id")
224
+ server_key = kwargs.get("server_key")
225
+ timestamp = kwargs.get("timestamp", int(time.time()))
226
+ status = kwargs.get("status", "healthy")
227
+
228
+ if not server_key:
229
+ return ProxyRegistrationCommandResult(
230
+ operation="heartbeat",
231
+ success=False,
232
+ message="Missing required parameter: server_key",
233
+ )
234
+
235
+ if server_key in self._registry:
236
+ self._registry[server_key]["last_heartbeat"] = timestamp
237
+ self._registry[server_key]["status"] = status
238
+
239
+ get_global_logger().debug(f"Heartbeat received for server: {server_key}")
240
+
241
+ return ProxyRegistrationCommandResult(
242
+ operation="heartbeat",
243
+ success=True,
244
+ message="Heartbeat processed successfully",
245
+ details={
246
+ "server_key": server_key,
247
+ "timestamp": timestamp,
248
+ "status": status,
249
+ },
250
+ )
251
+ else:
252
+ return ProxyRegistrationCommandResult(
253
+ operation="heartbeat",
254
+ success=False,
255
+ message=f"Server not found: {server_key}",
256
+ )
257
+
258
+ async def _handle_discover(
259
+ self, kwargs: Dict[str, Any]
260
+ ) -> ProxyRegistrationCommandResult:
261
+ """Handle discovery operation."""
262
+ # Return all registered servers
263
+ proxies = []
264
+
265
+ for server_key, server_record in self._registry.items():
266
+ # Check if server is active (heartbeat within last 5 minutes)
267
+ last_heartbeat = server_record.get("last_heartbeat", 0)
268
+ if time.time() - last_heartbeat < 300: # 5 minutes
269
+ proxy_info = {
270
+ "server_key": server_key,
271
+ "server_id": server_record["server_id"],
272
+ "server_url": server_record["server_url"],
273
+ "server_name": server_record["server_name"],
274
+ "description": server_record["description"],
275
+ "version": server_record["version"],
276
+ "capabilities": server_record["capabilities"],
277
+ "endpoints": server_record["endpoints"],
278
+ "auth_method": server_record["auth_method"],
279
+ "security_enabled": server_record["security_enabled"],
280
+ "registered_at": server_record["registered_at"],
281
+ "last_heartbeat": server_record["last_heartbeat"],
282
+ "status": server_record["status"],
283
+ }
284
+ proxies.append(proxy_info)
285
+
286
+ get_global_logger().info(f"Discovery request returned {len(proxies)} active servers")
287
+
288
+ return ProxyRegistrationCommandResult(
289
+ operation="discover",
290
+ success=True,
291
+ message=f"Found {len(proxies)} active proxy servers",
292
+ details={"proxies": proxies},
293
+ )
294
+
295
+ def _check_permissions(
296
+ self, user_permissions: List[str], required_permissions: List[str]
297
+ ) -> bool:
298
+ """
299
+ Check if user has required permissions.
300
+
301
+ Args:
302
+ user_permissions: User's permissions
303
+ required_permissions: Required permissions
304
+
305
+ Returns:
306
+ True if user has required permissions
307
+ """
308
+ # Admin has all permissions
309
+ if "*" in user_permissions:
310
+ return True
311
+
312
+ # Check if user has all required permissions
313
+ for required in required_permissions:
314
+ if required not in user_permissions:
315
+ return False
316
+
317
+ return True
318
+
319
+ @classmethod