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,246 @@
1
+ """
2
+ Module with plugins command implementation.
3
+ """
4
+
5
+ from typing import Dict, Any, Optional, List
6
+
7
+ from mcp_proxy_adapter.commands.base import Command
8
+ from mcp_proxy_adapter.commands.command_registry import registry
9
+ from mcp_proxy_adapter.config import get_config
10
+
11
+
12
+ class PluginsResult(SuccessResult):
13
+ """
14
+ Result of the plugins command execution.
15
+ """
16
+
17
+ def __init__(
18
+ self,
19
+ success: bool,
20
+ plugins_server: str,
21
+ plugins: list,
22
+ total_plugins: int,
23
+ error: Optional[str] = None,
24
+ ):
25
+ """
26
+ Initialize plugins command result.
27
+
28
+ Args:
29
+ success: Whether operation was successful
30
+ plugins_server: URL of the plugins server
31
+ plugins: List of available plugins
32
+ total_plugins: Total number of plugins
33
+ error: Error message if operation failed
34
+ """
35
+ data = {
36
+ "success": success,
37
+ "plugins_server": plugins_server,
38
+ "plugins": plugins,
39
+ "total_plugins": total_plugins,
40
+ }
41
+ if error:
42
+ data["error"] = error
43
+
44
+ message = f"Found {total_plugins} plugins from {plugins_server}"
45
+ if error:
46
+ message = f"Failed to load plugins from {plugins_server}: {error}"
47
+
48
+ super().__init__(data=data, message=message)
49
+
50
+ @classmethod
51
+ def get_schema(cls) -> Dict[str, Any]:
52
+ """
53
+ Get JSON schema for result validation.
54
+
55
+ Returns:
56
+ Dict[str, Any]: JSON schema
57
+ """
58
+ return {
59
+ "type": "object",
60
+ "properties": {
61
+ "data": {
62
+ "type": "object",
63
+ "properties": {
64
+ "success": {"type": "boolean"},
65
+ "plugins_server": {"type": "string"},
66
+ "plugins": {
67
+ "type": "array",
68
+ "items": {
69
+ "type": "object",
70
+ "properties": {
71
+ "name": {"type": "string"},
72
+ "description": {"type": "string"},
73
+ "url": {"type": "string"},
74
+ "version": {"type": "string"},
75
+ "author": {"type": "string"},
76
+ },
77
+ },
78
+ },
79
+ "total_plugins": {"type": "integer"},
80
+ "error": {"type": "string"},
81
+ },
82
+ "required": [
83
+ "success",
84
+ "plugins_server",
85
+ "plugins",
86
+ "total_plugins",
87
+ ],
88
+ }
89
+ },
90
+ "required": ["data"],
91
+ }
92
+
93
+
94
+ class PluginsCommand(Command):
95
+ """
96
+ Command that reads and displays available plugins from a plugins server.
97
+
98
+ This command fetches a JSON file from a configured plugins server URL that contains
99
+ a list of available plugins. Each plugin in the list typically contains metadata
100
+ such as name, description, URL, version, and author information.
101
+
102
+ The plugins server URL is configured in the system configuration under
103
+ 'commands.plugins_server'. The JSON file should contain an array of plugin objects
104
+ with the following structure:
105
+
106
+ {
107
+ "plugins": [
108
+ {
109
+ "name": "plugin_name",
110
+ "description": "Plugin description",
111
+ "url": "https://server.com/plugin.py",
112
+ "version": "1.0.0",
113
+ "author": "Author Name"
114
+ }
115
+ ]
116
+ }
117
+
118
+ This command is useful for:
119
+ - Discovering available plugins without manually browsing the server
120
+ - Getting metadata about plugins before loading them
121
+ - Building plugin management interfaces
122
+ - Checking plugin availability and versions
123
+
124
+ The command will return the list of all available plugins along with their
125
+ metadata, making it easy to choose which plugins to load.
126
+ """
127
+
128
+ name = "plugins"
129
+ result_class = PluginsResult
130
+
131
+ async def execute(self, **kwargs) -> PluginsResult:
132
+ """
133
+ Execute plugins command.
134
+
135
+ Args:
136
+ **kwargs: Additional parameters
137
+
138
+ Returns:
139
+ PluginsResult: Plugins command result
140
+ """
141
+ try:
142
+ # Get configuration from the global config instance
143
+ config_instance = get_config()
144
+ plugins_server_url = config_instance.get("commands.plugins_server")
145
+
146
+ if not plugins_server_url:
147
+ return PluginsResult(
148
+ success=False,
149
+ plugins_server="",
150
+ plugins=[],
151
+ total_plugins=0,
152
+ error="Plugins server URL not configured",
153
+ )
154
+
155
+ # Import requests if available
156
+ try:
157
+ import requests
158
+ except ImportError:
159
+ return PluginsResult(
160
+ success=False,
161
+ plugins_server=plugins_server_url,
162
+ plugins=[],
163
+ total_plugins=0,
164
+ error="requests library not available",
165
+ )
166
+
167
+ # Fetch plugins list
168
+ response = requests.get(plugins_server_url, timeout=30)
169
+ response.raise_for_status()
170
+
171
+ # Parse JSON response
172
+ plugins_data = response.json()
173
+
174
+ # Handle different JSON formats
175
+ if isinstance(plugins_data, list):
176
+ # Direct array format
177
+ plugins_list = plugins_data
178
+ elif "plugins" in plugins_data:
179
+ # Standard plugins format
180
+ plugins_list = plugins_data.get("plugins", [])
181
+ elif "plugin" in plugins_data:
182
+ # Single plugin format (like from plugins.techsup.od.ua/)
183
+ plugins_list = [
184
+ {
185
+ "name": plugins_data.get("plugin", "").replace(".py", ""),
186
+ "description": plugins_data.get("descr", ""),
187
+ "url": f"{plugins_server_url.rstrip('/')}/{plugins_data.get('plugin', '')}",
188
+ "version": "1.0.0",
189
+ "author": "Unknown",
190
+ "category": plugins_data.get("category", ""),
191
+ }
192
+ ]
193
+ else:
194
+ # Unknown format, try to extract any plugin-like data
195
+ plugins_list = []
196
+ for key, value in plugins_data.items():
197
+ if isinstance(value, dict) and any(
198
+ k in value for k in ["name", "plugin", "url"]
199
+ ):
200
+ plugins_list.append(value)
201
+
202
+ return PluginsResult(
203
+ success=True,
204
+ plugins_server=plugins_server_url,
205
+ plugins=plugins_list,
206
+ total_plugins=len(plugins_list),
207
+ )
208
+
209
+ except Exception as e:
210
+ return PluginsResult(
211
+ success=False,
212
+ plugins_server=(
213
+ plugins_server_url if "plugins_server_url" in locals() else ""
214
+ ),
215
+ plugins=[],
216
+ total_plugins=0,
217
+ error=str(e),
218
+ )
219
+
220
+ @classmethod
221
+
222
+ @classmethod
223
+ def _generate_examples(
224
+ cls, params: Dict[str, Dict[str, Any]]
225
+ ) -> List[Dict[str, Any]]:
226
+ """
227
+ Generate examples for the command.
228
+
229
+ Args:
230
+ params: Command parameters schema
231
+
232
+ Returns:
233
+ List[Dict[str, Any]]: List of examples
234
+ """
235
+ examples = [
236
+ {
237
+ "command": cls.name,
238
+ "description": "Get list of available plugins from configured server",
239
+ },
240
+ {"command": cls.name, "description": "Discover plugins without parameters"},
241
+ {
242
+ "command": cls.name,
243
+ "description": "Check plugin availability and metadata",
244
+ },
245
+ ]
246
+ return examples
@@ -0,0 +1,216 @@
1
+ """
2
+ Protocol management command module.
3
+
4
+ This module provides commands for managing and querying protocol configurations,
5
+ including HTTP, HTTPS, and MTLS protocols.
6
+ """
7
+
8
+ from typing import Dict, List, Optional, Any
9
+ from dataclasses import dataclass
10
+
11
+ from mcp_proxy_adapter.commands.base import Command
12
+ from mcp_proxy_adapter.commands.result import SuccessResult, ErrorResult
13
+ from mcp_proxy_adapter.core.protocol_manager import protocol_manager
14
+ from mcp_proxy_adapter.core.logging import get_global_logger
15
+
16
+
17
+ @dataclass
18
+ class ProtocolInfo:
19
+ """Protocol information data class."""
20
+
21
+ name: str
22
+ enabled: bool
23
+ allowed: bool
24
+ port: Optional[int]
25
+ requires_ssl: bool
26
+ ssl_context_available: bool
27
+
28
+
29
+ @dataclass
30
+ class ProtocolManagementResult:
31
+ """Result data for protocol management operations."""
32
+
33
+ protocols: Dict[str, Dict[str, Any]]
34
+ allowed_protocols: List[str]
35
+ validation_errors: List[str]
36
+ total_protocols: int
37
+ enabled_protocols: int
38
+
39
+
40
+ class ProtocolManagementCommand(Command):
41
+ """
42
+ Command for managing and querying protocol configurations.
43
+
44
+ This command provides functionality to:
45
+ - Get information about all configured protocols
46
+ - Check protocol validation status
47
+ - Get allowed protocols list
48
+ - Validate protocol configurations
49
+ """
50
+
51
+ name = "protocol_management"
52
+ descr = "Manage and query protocol configurations (HTTP, HTTPS, MTLS)"
53
+
54
+ @classmethod
55
+
56
+ async def execute(self, **kwargs) -> SuccessResult | ErrorResult:
57
+ """
58
+ Execute protocol management command.
59
+
60
+ Args:
61
+ action: Action to perform (get_info, validate_config, get_allowed, check_protocol)
62
+ protocol: Protocol name for check_protocol action
63
+
64
+ Returns:
65
+ Command execution result
66
+ """
67
+ try:
68
+ action = kwargs.get("action")
69
+
70
+ if action == "get_info":
71
+ return await self._get_protocol_info()
72
+ elif action == "validate_config":
73
+ return await self._validate_configuration()
74
+ elif action == "get_allowed":
75
+ return await self._get_allowed_protocols()
76
+ elif action == "check_protocol":
77
+ protocol = kwargs.get("protocol")
78
+ if not protocol:
79
+ return ErrorResult(
80
+ "Protocol parameter required for check_protocol action"
81
+ )
82
+ return await self._check_protocol(protocol)
83
+ else:
84
+ return ErrorResult(f"Unknown action: {action}")
85
+
86
+ except Exception as e:
87
+ get_global_logger().error(f"Protocol management command error: {e}")
88
+ return ErrorResult(f"Protocol management error: {str(e)}")
89
+
90
+ async def _get_protocol_info(self) -> SuccessResult:
91
+ """
92
+ Get information about all protocols.
93
+
94
+ Returns:
95
+ Success result with protocol information
96
+ """
97
+ try:
98
+ protocol_info = protocol_manager.get_protocol_info()
99
+ allowed_protocols = protocol_manager.get_allowed_protocols()
100
+ validation_errors = protocol_manager.validate_protocol_configuration()
101
+
102
+ enabled_count = sum(1 for info in protocol_info.values() if info["enabled"])
103
+
104
+ result_data = ProtocolManagementResult(
105
+ protocols=protocol_info,
106
+ allowed_protocols=allowed_protocols,
107
+ validation_errors=validation_errors,
108
+ total_protocols=len(protocol_info),
109
+ enabled_protocols=enabled_count,
110
+ )
111
+
112
+ return SuccessResult(
113
+ data={
114
+ "protocol_info": result_data.protocols,
115
+ "allowed_protocols": result_data.allowed_protocols,
116
+ "validation_errors": result_data.validation_errors,
117
+ "total_protocols": result_data.total_protocols,
118
+ "enabled_protocols": result_data.enabled_protocols,
119
+ "protocols_enabled": protocol_manager.enabled,
120
+ },
121
+ message="Protocol information retrieved successfully",
122
+ )
123
+
124
+ except Exception as e:
125
+ get_global_logger().error(f"Error getting protocol info: {e}")
126
+ return ErrorResult(f"Failed to get protocol info: {str(e)}")
127
+
128
+ async def _validate_configuration(self) -> SuccessResult:
129
+ """
130
+ Validate protocol configuration.
131
+
132
+ Returns:
133
+ Success result with validation results
134
+ """
135
+ try:
136
+ validation_errors = protocol_manager.validate_protocol_configuration()
137
+ is_valid = len(validation_errors) == 0
138
+
139
+ return SuccessResult(
140
+ data={
141
+ "is_valid": is_valid,
142
+ "validation_errors": validation_errors,
143
+ "error_count": len(validation_errors),
144
+ },
145
+ message=f"Configuration validation {'passed' if is_valid else 'failed'}",
146
+ )
147
+
148
+ except Exception as e:
149
+ get_global_logger().error(f"Error validating configuration: {e}")
150
+ return ErrorResult(f"Failed to validate configuration: {str(e)}")
151
+
152
+ async def _get_allowed_protocols(self) -> SuccessResult:
153
+ """
154
+ Get list of allowed protocols.
155
+
156
+ Returns:
157
+ Success result with allowed protocols
158
+ """
159
+ try:
160
+ allowed_protocols = protocol_manager.get_allowed_protocols()
161
+
162
+ return SuccessResult(
163
+ data={
164
+ "allowed_protocols": allowed_protocols,
165
+ "count": len(allowed_protocols),
166
+ },
167
+ message="Allowed protocols retrieved successfully",
168
+ )
169
+
170
+ except Exception as e:
171
+ get_global_logger().error(f"Error getting allowed protocols: {e}")
172
+ return ErrorResult(f"Failed to get allowed protocols: {str(e)}")
173
+
174
+ async def _check_protocol(self, protocol: str) -> SuccessResult:
175
+ """
176
+ Check specific protocol configuration.
177
+
178
+ Args:
179
+ protocol: Protocol name to check
180
+
181
+ Returns:
182
+ Success result with protocol check results
183
+ """
184
+ try:
185
+ protocol_lower = protocol.lower()
186
+
187
+ if protocol_lower not in ["http", "https", "mtls"]:
188
+ return ErrorResult(f"Unknown protocol: {protocol}")
189
+
190
+ is_allowed = protocol_manager.is_protocol_allowed(protocol_lower)
191
+ port = protocol_manager.get_protocol_port(protocol_lower)
192
+ config = protocol_manager.get_protocol_config(protocol_lower)
193
+
194
+ ssl_context_available = None
195
+ if protocol_lower in ["https", "mtls"]:
196
+ ssl_context_available = (
197
+ protocol_manager.get_ssl_context_for_protocol(protocol_lower)
198
+ is not None
199
+ )
200
+
201
+ return SuccessResult(
202
+ data={
203
+ "protocol": protocol_lower,
204
+ "is_allowed": is_allowed,
205
+ "port": port,
206
+ "enabled": config.get("enabled", False),
207
+ "requires_ssl": protocol_lower in ["https", "mtls"],
208
+ "ssl_context_available": ssl_context_available,
209
+ "configuration": config,
210
+ },
211
+ message=f"Protocol '{protocol}' check completed",
212
+ )
213
+
214
+ except Exception as e:
215
+ get_global_logger().error(f"Error checking protocol {protocol}: {e}")
216
+ return ErrorResult(f"Failed to check protocol {protocol}: {str(e)}")