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,142 @@
1
+ """
2
+ Module with health command implementation.
3
+ """
4
+
5
+ import os
6
+ import platform
7
+ import sys
8
+ import psutil
9
+ from datetime import datetime
10
+
11
+ from mcp_proxy_adapter.commands.base import Command
12
+ from mcp_proxy_adapter.commands.command_registry import registry
13
+ from mcp_proxy_adapter.core.proxy_registration import get_proxy_registration_status
14
+
15
+
16
+ class HealthResult(SuccessResult):
17
+ """
18
+ Result of the health command execution.
19
+ """
20
+
21
+ def __init__(
22
+ self, status: str, version: str, uptime: float, components: Dict[str, Any]
23
+ ):
24
+ """
25
+ Initialize health command result.
26
+
27
+ Args:
28
+ status: Server status ("ok" or "error")
29
+ version: Server version
30
+ uptime: Server uptime in seconds
31
+ components: Dictionary with components status
32
+ """
33
+ super().__init__(
34
+ data={
35
+ "status": status,
36
+ "version": version,
37
+ "uptime": uptime,
38
+ "components": components,
39
+ }
40
+ )
41
+
42
+ @classmethod
43
+ def get_schema(cls) -> Dict[str, Any]:
44
+ """
45
+ Get JSON schema for result validation.
46
+
47
+ Returns:
48
+ Dict[str, Any]: JSON schema
49
+ """
50
+ return {
51
+ "type": "object",
52
+ "properties": {
53
+ "data": {
54
+ "type": "object",
55
+ "properties": {
56
+ "status": {"type": "string"},
57
+ "version": {"type": "string"},
58
+ "uptime": {"type": "number"},
59
+ "components": {
60
+ "type": "object",
61
+ "properties": {
62
+ "system": {"type": "object"},
63
+ "process": {"type": "object"},
64
+ "commands": {"type": "object"},
65
+ },
66
+ },
67
+ },
68
+ "required": ["status", "version", "uptime", "components"],
69
+ }
70
+ },
71
+ "required": ["data"],
72
+ }
73
+
74
+
75
+ class HealthCommand(Command):
76
+ """
77
+ Command that returns information about server health and status.
78
+ """
79
+
80
+ name = "health"
81
+ result_class = HealthResult
82
+
83
+ async def execute(self, **kwargs) -> HealthResult:
84
+ """
85
+ Execute health command.
86
+
87
+ Returns:
88
+ HealthResult: Health command result
89
+ """
90
+ # Get version from package
91
+ try:
92
+ except ImportError:
93
+ version = "unknown"
94
+
95
+ # Get process start time
96
+ process = psutil.Process(os.getpid())
97
+ start_time = datetime.fromtimestamp(process.create_time())
98
+ uptime_seconds = (datetime.now() - start_time).total_seconds()
99
+
100
+ # Get system information
101
+ memory_info = process.memory_info()
102
+
103
+ return HealthResult(
104
+ status="ok",
105
+ version=version,
106
+ uptime=uptime_seconds,
107
+ components={
108
+ "system": {
109
+ "python_version": sys.version,
110
+ "platform": platform.platform(),
111
+ "cpu_count": os.cpu_count(),
112
+ },
113
+ "process": {
114
+ "pid": os.getpid(),
115
+ "memory_usage_mb": memory_info.rss / (1024 * 1024),
116
+ "start_time": start_time.isoformat(),
117
+ },
118
+ "commands": {"registered_count": len(registry.get_all_commands())},
119
+ "proxy_registration": {
120
+ "enabled": get_proxy_registration_status().get("enabled", False),
121
+ "registered": get_proxy_registration_status().get(
122
+ "registered", False
123
+ ),
124
+ "server_key": get_proxy_registration_status().get("server_key"),
125
+ "proxy_url": get_proxy_registration_status().get("proxy_url"),
126
+ },
127
+ },
128
+ )
129
+
130
+ @classmethod
131
+ def get_schema(cls) -> Dict[str, Any]:
132
+ """
133
+ Get JSON schema for command parameters validation.
134
+
135
+ Returns:
136
+ Dict[str, Any]: JSON schema
137
+ """
138
+ return {
139
+ "type": "object",
140
+ "additionalProperties": False,
141
+ "description": "Command doesn't accept any parameters",
142
+ }
@@ -0,0 +1,175 @@
1
+ """
2
+ Module with help command implementation.
3
+ """
4
+
5
+ from typing import Dict, Any, Optional
6
+ import logging
7
+ import traceback
8
+
9
+ from mcp_proxy_adapter.commands.base import Command
10
+ from mcp_proxy_adapter.commands.result import CommandResult
11
+ from mcp_proxy_adapter.commands.command_registry import registry
12
+ from mcp_proxy_adapter.core.errors import NotFoundError
13
+ from mcp_proxy_adapter.core.logging import get_global_logger
14
+
15
+ # Добавляем логирование
16
+ logger = logging.getLogger("mcp_proxy_adapter.commands.help_command")
17
+
18
+
19
+ class HelpResult(CommandResult):
20
+ """
21
+ Result of the help command execution.
22
+ """
23
+
24
+ def __init__(
25
+ self,
26
+ commands_info: Optional[Dict[str, Any]] = None,
27
+ command_info: Optional[Dict[str, Any]] = None,
28
+ ):
29
+ """
30
+ Initialize help command result.
31
+
32
+ Args:
33
+ commands_info: Information about all commands (for request without parameters)
34
+ command_info: Information about a specific command (for request with cmdname parameter)
35
+ """
36
+ get_global_logger().debug(
37
+ f"HelpResult.__init__: commands_info={commands_info is not None}, command_info={command_info is not None}"
38
+ )
39
+ self.commands_info = commands_info
40
+ self.command_info = command_info
41
+
42
+
43
+ @classmethod
44
+
45
+
46
+ class HelpCommand(Command):
47
+ """
48
+ Command for getting help information about available commands.
49
+ """
50
+
51
+ name = "help"
52
+ result_class = HelpResult
53
+
54
+ async def execute(self, cmdname: Optional[str] = None, **kwargs) -> HelpResult:
55
+ """
56
+ Execute help command.
57
+
58
+ Args:
59
+ cmdname: Name of the command to get information about (optional)
60
+ **kwargs: Any additional parameters (will be ignored)
61
+
62
+ Returns:
63
+ HelpResult: Help command result
64
+
65
+ Raises:
66
+ NotFoundError: If specified command not found
67
+ """
68
+ get_global_logger().debug(f"HelpCommand.execute начало: cmdname={cmdname}, kwargs={kwargs}")
69
+
70
+ try:
71
+ # Handle case when cmdname is provided
72
+ if cmdname is not None and cmdname != "":
73
+ get_global_logger().debug(f"Обработка запроса для конкретной команды: {cmdname}")
74
+ try:
75
+ # Get command info from registry
76
+ command_info = registry.get_command_info(cmdname)
77
+ if command_info is None:
78
+ raise NotFoundError(f"Command '{cmdname}' not found")
79
+ get_global_logger().debug(f"Получены метаданные для команды {cmdname}")
80
+ return HelpResult(command_info=command_info)
81
+ except NotFoundError:
82
+ get_global_logger().warning(f"Команда '{cmdname}' не найдена")
83
+ # Получаем список всех команд
84
+ all_commands = list(registry.get_all_commands().keys())
85
+ if all_commands:
86
+ example_cmd = all_commands[0]
87
+ example = {
88
+ "command": "help",
89
+ "params": {"cmdname": example_cmd},
90
+ }
91
+ note = f"Use help with an existing command name to get detailed info. For example: help with cmdname '{example_cmd}'. To list all commands: call help without parameters."
92
+ else:
93
+ example = {"command": "help"}
94
+ note = "No commands registered. To list all commands: call help without parameters."
95
+ return HelpResult(
96
+ commands_info={
97
+ "commands": {},
98
+ "error": f"Command '{cmdname}' not found",
99
+ "example": example,
100
+ "note": note,
101
+ }
102
+ )
103
+
104
+ # Otherwise, return information about all available commands
105
+ get_global_logger().debug("Обработка запроса для всех команд")
106
+
107
+ # Get info for all commands
108
+ all_commands_info = registry.get_all_commands_info()
109
+ get_global_logger().debug(
110
+ f"Получены метаданные для {len(all_commands_info.get('commands', {}))} команд"
111
+ )
112
+
113
+ # Prepare response format with tool metadata
114
+ result = {
115
+ "tool_info": {
116
+ "name": "MCP-Proxy API Service",
117
+ "description": "JSON-RPC API for microservice command execution",
118
+ "version": "1.0.0",
119
+ },
120
+ "help_usage": {
121
+ "description": "Get information about commands",
122
+ "examples": [
123
+ {
124
+ "command": "help",
125
+ "description": "List of all available commands",
126
+ },
127
+ {
128
+ "command": "help",
129
+ "params": {"cmdname": "command_name"},
130
+ "description": "Get detailed information about a specific command",
131
+ },
132
+ ],
133
+ },
134
+ "commands": {},
135
+ }
136
+
137
+ # Add brief information about commands
138
+ commands_data = all_commands_info.get("commands", {})
139
+ for name, command_info in commands_data.items():
140
+ try:
141
+ get_global_logger().debug(f"Обработка метаданных команды {name}")
142
+ # Безопасное получение параметров с проверкой на наличие ключей
143
+ metadata = command_info.get("metadata", {})
144
+ schema = command_info.get("schema", {})
145
+ result["commands"][name] = {
146
+ "summary": metadata.get("summary", ""),
147
+ "params_count": len(schema.get("properties", {})),
148
+ }
149
+ except Exception as e:
150
+ get_global_logger().error(f"Ошибка при обработке метаданных команды {name}: {e}")
151
+ get_global_logger().debug(f"Метаданные команды {name}: {command_info}")
152
+ # Пропускаем проблемную команду
153
+ continue
154
+
155
+ get_global_logger().debug(
156
+ f"HelpCommand.execute завершение: возвращаем результат с {len(result['commands'])} командами"
157
+ )
158
+ return HelpResult(commands_info=result)
159
+ except Exception as e:
160
+ get_global_logger().error(f"Неожиданная ошибка в HelpCommand.execute: {e}")
161
+ get_global_logger().debug(f"Трассировка: {traceback.format_exc()}")
162
+ # В случае неожиданной ошибки возвращаем пустой результат вместо ошибки
163
+ return HelpResult(
164
+ commands_info={
165
+ "tool_info": {
166
+ "name": "MCP-Proxy API Service",
167
+ "description": "JSON-RPC API for microservice command execution",
168
+ "version": "1.0.0",
169
+ },
170
+ "commands": {},
171
+ "error": str(e),
172
+ }
173
+ )
174
+
175
+ @classmethod
@@ -0,0 +1,172 @@
1
+ """
2
+ Module for command registration hooks.
3
+
4
+ This module provides a hook system for registering custom commands
5
+ that will be called during system initialization.
6
+ """
7
+
8
+ from enum import Enum
9
+ from dataclasses import dataclass
10
+ from mcp_proxy_adapter.core.logging import get_global_logger
11
+
12
+
13
+ class HookType(Enum):
14
+ """Types of hooks that can be registered."""
15
+
16
+ CUSTOM_COMMANDS = "custom_commands"
17
+ BEFORE_INIT = "before_init"
18
+ AFTER_INIT = "after_init"
19
+ BEFORE_COMMAND = "before_command"
20
+ AFTER_COMMAND = "after_command"
21
+ BEFORE_EXECUTION = "before_execution"
22
+ AFTER_EXECUTION = "after_execution"
23
+
24
+
25
+ @dataclass
26
+ class HookContext:
27
+ """Context object passed to hook functions."""
28
+
29
+ hook_type: HookType
30
+ command_name: Optional[str] = None
31
+ params: Optional[Dict[str, Any]] = None
32
+ result: Optional[Any] = None
33
+ registry: Optional[Any] = None
34
+ metadata: Optional[Dict[str, Any]] = None
35
+ standard_processing: bool = True
36
+
37
+ def __post_init__(self):
38
+ """Initialize metadata if not provided."""
39
+ if self.metadata is None:
40
+ self.metadata = {}
41
+
42
+
43
+ class CommandHooks:
44
+ """
45
+ Hook system for command registration.
46
+ """
47
+
48
+ def __init__(self):
49
+ """
50
+ Initialize command hooks.
51
+ """
52
+ self._custom_commands_hooks: List[Callable] = []
53
+ self._before_init_hooks: List[Callable] = []
54
+ self._after_init_hooks: List[Callable] = []
55
+ self._before_command_hooks: List[Callable] = []
56
+ self._after_command_hooks: List[Callable] = []
57
+
58
+ def register_custom_commands_hook(self, hook_func: Callable) -> None:
59
+ """
60
+ Register a hook function for custom commands registration.
61
+
62
+ Args:
63
+ hook_func: Function that registers custom commands.
64
+ Should accept registry as parameter.
65
+ """
66
+ self._custom_commands_hooks.append(hook_func)
67
+ get_global_logger().debug(f"Registered custom commands hook: {hook_func.__name__}")
68
+
69
+ def register_before_init_hook(self, hook_func: Callable) -> None:
70
+ """
71
+ Register a hook function to be called before system initialization.
72
+
73
+ Args:
74
+ hook_func: Function to call before initialization.
75
+ """
76
+ self._before_init_hooks.append(hook_func)
77
+ get_global_logger().debug(f"Registered before init hook: {hook_func.__name__}")
78
+
79
+ def register_after_init_hook(self, hook_func: Callable) -> None:
80
+ """
81
+ Register a hook function to be called after system initialization.
82
+
83
+ Args:
84
+ hook_func: Function to call after initialization.
85
+ """
86
+ self._after_init_hooks.append(hook_func)
87
+ get_global_logger().debug(f"Registered after init hook: {hook_func.__name__}")
88
+
89
+ def register_before_command_hook(self, hook_func: Callable) -> None:
90
+ """
91
+ Register a hook function to be called before command execution.
92
+
93
+ Args:
94
+ hook_func: Function to call before command execution.
95
+ Should accept command_name and params as parameters.
96
+ """
97
+ self._before_command_hooks.append(hook_func)
98
+ get_global_logger().debug(f"Registered before command hook: {hook_func.__name__}")
99
+
100
+ def register_after_command_hook(self, hook_func: Callable) -> None:
101
+ """
102
+ Register a hook function to be called after command execution.
103
+
104
+ Args:
105
+ hook_func: Function to call after command execution.
106
+ Should accept command_name, params, and result as parameters.
107
+ """
108
+ self._after_command_hooks.append(hook_func)
109
+ get_global_logger().debug(f"Registered after command hook: {hook_func.__name__}")
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+
118
+ # Global hooks instance
119
+ hooks = CommandHooks()
120
+
121
+
122
+ def register_custom_commands_hook(hook_func: Callable) -> None:
123
+ """
124
+ Register a hook function for custom commands registration.
125
+
126
+ Args:
127
+ hook_func: Function that registers custom commands.
128
+ Should accept registry as parameter.
129
+ """
130
+ hooks.register_custom_commands_hook(hook_func)
131
+
132
+
133
+ def register_before_init_hook(hook_func: Callable) -> None:
134
+ """
135
+ Register a hook function to be called before system initialization.
136
+
137
+ Args:
138
+ hook_func: Function to call before initialization.
139
+ """
140
+ hooks.register_before_init_hook(hook_func)
141
+
142
+
143
+ def register_after_init_hook(hook_func: Callable) -> None:
144
+ """
145
+ Register a hook function to be called after system initialization.
146
+
147
+ Args:
148
+ hook_func: Function to call after initialization.
149
+ """
150
+ hooks.register_after_init_hook(hook_func)
151
+
152
+
153
+ def register_before_command_hook(hook_func: Callable) -> None:
154
+ """
155
+ Register a hook function to be called before command execution.
156
+
157
+ Args:
158
+ hook_func: Function to call before command execution.
159
+ Should accept command_name and params as parameters.
160
+ """
161
+ hooks.register_before_command_hook(hook_func)
162
+
163
+
164
+ def register_after_command_hook(hook_func: Callable) -> None:
165
+ """
166
+ Register a hook function to be called after command execution.
167
+
168
+ Args:
169
+ hook_func: Function to call after command execution.
170
+ Should accept command_name, params, and result as parameters.
171
+ """
172
+ hooks.register_after_command_hook(hook_func)