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,149 @@
1
+ """
2
+ Author: Vasiliy Zdanovskiy
3
+ email: vasilyvz@gmail.com
4
+
5
+ Catalog synchronization utilities for MCP Proxy Adapter.
6
+ """
7
+
8
+ from pathlib import Path
9
+ from typing import Dict, List, Any, Optional
10
+ from packaging import version as pkg_version
11
+
12
+ from mcp_proxy_adapter.core.logging import get_global_logger
13
+ from .command_catalog import CommandCatalog
14
+ from .catalog_loader import CatalogLoader
15
+ from .dependency_manager import DependencyManager
16
+
17
+ # Try to import requests, but don't fail if not available
18
+ try:
19
+ import requests
20
+ REQUESTS_AVAILABLE = True
21
+ except ImportError:
22
+ REQUESTS_AVAILABLE = False
23
+
24
+
25
+ class CatalogSyncer:
26
+ """Synchronizer for command catalogs."""
27
+
28
+ def __init__(self, catalog_dir: str):
29
+ """
30
+ Initialize catalog syncer.
31
+
32
+ Args:
33
+ catalog_dir: Directory for catalog storage
34
+ """
35
+ self.catalog_dir = Path(catalog_dir)
36
+ self.logger = get_global_logger()
37
+ self.loader = CatalogLoader()
38
+ self.dependency_manager = DependencyManager()
39
+
40
+
41
+ def _should_download_command(self, command_name: str, server_cmd: CommandCatalog) -> bool:
42
+ """
43
+ Check if command should be downloaded.
44
+
45
+ Args:
46
+ command_name: Name of the command
47
+ server_cmd: Server command catalog entry
48
+
49
+ Returns:
50
+ True if command should be downloaded, False otherwise
51
+ """
52
+ # Check if command exists locally
53
+ local_file = self.catalog_dir / f"{command_name}.py"
54
+ if not local_file.exists():
55
+ return True
56
+
57
+ # Check version
58
+ try:
59
+ local_version = self._get_local_version(command_name)
60
+ if local_version:
61
+ return pkg_version.parse(server_cmd.version) > pkg_version.parse(local_version)
62
+ except Exception as e:
63
+ self.logger.warning(f"Failed to compare versions for {command_name}: {e}")
64
+
65
+ return True
66
+
67
+ def _download_command(self, command_name: str, server_cmd: CommandCatalog) -> bool:
68
+ """
69
+ Download command from server.
70
+
71
+ Args:
72
+ command_name: Name of the command
73
+ server_cmd: Server command catalog entry
74
+
75
+ Returns:
76
+ True if download successful, False otherwise
77
+ """
78
+ if not REQUESTS_AVAILABLE:
79
+ self.logger.error("requests library not available, cannot download command")
80
+ return False
81
+
82
+ try:
83
+ # Download command file
84
+ response = requests.get(server_cmd.source_url, timeout=30)
85
+ response.raise_for_status()
86
+
87
+ # Save to local file
88
+ local_file = self.catalog_dir / f"{command_name}.py"
89
+ with open(local_file, 'w', encoding='utf-8') as f:
90
+ f.write(response.text)
91
+
92
+ # Update local catalog
93
+ server_cmd.file_path = str(local_file)
94
+ self._update_local_catalog(command_name, server_cmd)
95
+
96
+ return True
97
+
98
+ except Exception as e:
99
+ self.logger.error(f"Failed to download command {command_name}: {e}")
100
+ return False
101
+
102
+ def _get_local_version(self, command_name: str) -> Optional[str]:
103
+ """
104
+ Get local version of command.
105
+
106
+ Args:
107
+ command_name: Name of the command
108
+
109
+ Returns:
110
+ Local version string or None
111
+ """
112
+ try:
113
+ local_file = self.catalog_dir / f"{command_name}.py"
114
+ if local_file.exists():
115
+ with open(local_file, 'r', encoding='utf-8') as f:
116
+ content = f.read()
117
+
118
+ # Extract version from file content
119
+ for line in content.split('\n'):
120
+ if line.strip().startswith('__version__'):
121
+ return line.split('=')[1].strip().strip('"\'')
122
+ except Exception:
123
+ pass
124
+
125
+ return None
126
+
127
+ def _update_local_catalog(self, command_name: str, command_catalog: CommandCatalog) -> None:
128
+ """
129
+ Update local catalog with command information.
130
+
131
+ Args:
132
+ command_name: Name of the command
133
+ command_catalog: Command catalog entry
134
+ """
135
+ try:
136
+ catalog_file = self.catalog_dir / "catalog.json"
137
+ if catalog_file.exists():
138
+ with open(catalog_file, 'r', encoding='utf-8') as f:
139
+ catalog_data = json.load(f)
140
+ else:
141
+ catalog_data = {}
142
+
143
+ catalog_data[command_name] = command_catalog.to_dict()
144
+
145
+ with open(catalog_file, 'w', encoding='utf-8') as f:
146
+ json.dump(catalog_data, f, indent=2, ensure_ascii=False)
147
+
148
+ except Exception as e:
149
+ self.logger.error(f"Failed to update local catalog for {command_name}: {e}")
@@ -0,0 +1,43 @@
1
+ """
2
+ Author: Vasiliy Zdanovskiy
3
+ email: vasilyvz@gmail.com
4
+
5
+ Command catalog data model for MCP Proxy Adapter.
6
+ """
7
+
8
+ from typing import Dict, List, Optional, Any
9
+
10
+
11
+ class CommandCatalog:
12
+ """
13
+ Represents a command in the catalog with metadata.
14
+ """
15
+
16
+ def __init__(
17
+ self, name: str, version: str, source_url: str, file_path: Optional[str] = None
18
+ ):
19
+ """
20
+ Initialize command catalog entry.
21
+
22
+ Args:
23
+ name: Command name
24
+ version: Command version
25
+ source_url: Source URL for the command
26
+ file_path: Local file path (optional)
27
+ """
28
+ self.name = name
29
+ self.version = version
30
+ self.source_url = source_url
31
+ self.file_path = file_path
32
+ self.metadata: Dict[str, Any] = {}
33
+
34
+ # Standard metadata fields
35
+ self.plugin: Optional[str] = None
36
+ self.descr: Optional[str] = None
37
+ self.category: Optional[str] = None
38
+ self.author: Optional[str] = None
39
+ self.email: Optional[str] = None
40
+ self.depends: Optional[List[str]] = None # New field for dependencies
41
+
42
+
43
+ @classmethod
@@ -0,0 +1,37 @@
1
+ """
2
+ Author: Vasiliy Zdanovskiy
3
+ email: vasilyvz@gmail.com
4
+
5
+ Dependency management for command catalogs.
6
+ """
7
+
8
+ import subprocess
9
+ import sys
10
+
11
+ from mcp_proxy_adapter.core.logging import get_global_logger
12
+
13
+
14
+ class DependencyManager:
15
+ """Manager for command dependencies."""
16
+
17
+ def __init__(self):
18
+ """Initialize dependency manager."""
19
+ self.logger = get_global_logger()
20
+
21
+
22
+
23
+ def _is_package_installed(self, package_name: str) -> bool:
24
+ """
25
+ Check if a package is installed.
26
+
27
+ Args:
28
+ package_name: Name of the package to check
29
+
30
+ Returns:
31
+ True if package is installed, False otherwise
32
+ """
33
+ try:
34
+ __import__(package_name)
35
+ return True
36
+ except ImportError:
37
+ return False
@@ -0,0 +1,97 @@
1
+ """
2
+ Command catalog management system.
3
+
4
+ This module handles the command catalog, including:
5
+ - Loading commands from remote plugin servers
6
+ - Version comparison and updates
7
+ - Local command storage and management
8
+ - Automatic dependency installation
9
+
10
+ Author: Vasiliy Zdanovskiy
11
+ email: vasilyvz@gmail.com
12
+ """
13
+
14
+ from typing import Dict, List, Optional, Any
15
+
16
+ from .catalog import CommandCatalog, CatalogManager
17
+
18
+
19
+ # Global catalog manager instance
20
+ _catalog_manager: Optional[CatalogManager] = None
21
+
22
+
23
+ def get_catalog_manager() -> CatalogManager:
24
+ """
25
+ Get the global catalog manager instance.
26
+
27
+ Returns:
28
+ Catalog manager instance
29
+ """
30
+ global _catalog_manager
31
+ if _catalog_manager is None:
32
+ from mcp_proxy_adapter.config import config
33
+ catalog_dir = config.get("catalog", {}).get("directory", "catalog")
34
+ _catalog_manager = CatalogManager(catalog_dir)
35
+ return _catalog_manager
36
+
37
+
38
+ def get_catalog_from_server(server_url: str) -> Dict[str, CommandCatalog]:
39
+ """
40
+ Get catalog from remote server.
41
+
42
+ Args:
43
+ server_url: Server URL to load catalog from
44
+
45
+ Returns:
46
+ Dictionary of command catalogs
47
+ """
48
+ return get_catalog_manager().get_catalog_from_server(server_url)
49
+
50
+
51
+ def sync_with_servers(server_urls: List[str]) -> Dict[str, Any]:
52
+ """
53
+ Synchronize catalog with remote servers.
54
+
55
+ Args:
56
+ server_urls: List of server URLs to sync with
57
+
58
+ Returns:
59
+ Dictionary with sync results
60
+ """
61
+ return get_catalog_manager().sync_with_servers(server_urls)
62
+
63
+
64
+ def get_local_commands() -> List[str]:
65
+ """
66
+ Get list of locally available commands.
67
+
68
+ Returns:
69
+ List of command names
70
+ """
71
+ return get_catalog_manager().get_local_commands()
72
+
73
+
74
+ def get_command_info(command_name: str) -> Optional[CommandCatalog]:
75
+ """
76
+ Get information about a specific command.
77
+
78
+ Args:
79
+ command_name: Name of the command
80
+
81
+ Returns:
82
+ Command catalog entry or None if not found
83
+ """
84
+ return get_catalog_manager().get_command_info(command_name)
85
+
86
+
87
+ def remove_command(command_name: str) -> bool:
88
+ """
89
+ Remove command from catalog.
90
+
91
+ Args:
92
+ command_name: Name of the command to remove
93
+
94
+ Returns:
95
+ True if successful, False otherwise
96
+ """
97
+ return get_catalog_manager().remove_command(command_name)