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.
- mcp_proxy_adapter/__init__.py +47 -0
- mcp_proxy_adapter/__main__.py +13 -0
- mcp_proxy_adapter/api/__init__.py +0 -0
- mcp_proxy_adapter/api/app.py +66 -0
- mcp_proxy_adapter/api/core/__init__.py +18 -0
- mcp_proxy_adapter/api/core/app_factory.py +400 -0
- mcp_proxy_adapter/api/core/lifespan_manager.py +55 -0
- mcp_proxy_adapter/api/core/registration_context.py +356 -0
- mcp_proxy_adapter/api/core/registration_manager.py +307 -0
- mcp_proxy_adapter/api/core/registration_tasks.py +84 -0
- mcp_proxy_adapter/api/core/ssl_context_factory.py +88 -0
- mcp_proxy_adapter/api/handlers.py +181 -0
- mcp_proxy_adapter/api/middleware/__init__.py +21 -0
- mcp_proxy_adapter/api/middleware/base.py +54 -0
- mcp_proxy_adapter/api/middleware/command_permission_middleware.py +73 -0
- mcp_proxy_adapter/api/middleware/error_handling.py +76 -0
- mcp_proxy_adapter/api/middleware/factory.py +147 -0
- mcp_proxy_adapter/api/middleware/logging.py +31 -0
- mcp_proxy_adapter/api/middleware/performance.py +51 -0
- mcp_proxy_adapter/api/middleware/protocol_middleware.py +140 -0
- mcp_proxy_adapter/api/middleware/transport_middleware.py +87 -0
- mcp_proxy_adapter/api/middleware/unified_security.py +223 -0
- mcp_proxy_adapter/api/middleware/user_info_middleware.py +132 -0
- mcp_proxy_adapter/api/openapi/__init__.py +21 -0
- mcp_proxy_adapter/api/openapi/command_integration.py +105 -0
- mcp_proxy_adapter/api/openapi/openapi_generator.py +40 -0
- mcp_proxy_adapter/api/openapi/openapi_registry.py +62 -0
- mcp_proxy_adapter/api/openapi/schema_loader.py +116 -0
- mcp_proxy_adapter/api/schemas.py +270 -0
- mcp_proxy_adapter/api/tool_integration.py +131 -0
- mcp_proxy_adapter/api/tools.py +163 -0
- mcp_proxy_adapter/cli/__init__.py +12 -0
- mcp_proxy_adapter/cli/commands/__init__.py +15 -0
- mcp_proxy_adapter/cli/commands/client.py +100 -0
- mcp_proxy_adapter/cli/commands/config_generate.py +105 -0
- mcp_proxy_adapter/cli/commands/config_validate.py +94 -0
- mcp_proxy_adapter/cli/commands/generate.py +259 -0
- mcp_proxy_adapter/cli/commands/server.py +174 -0
- mcp_proxy_adapter/cli/commands/sets.py +132 -0
- mcp_proxy_adapter/cli/commands/testconfig.py +177 -0
- mcp_proxy_adapter/cli/examples/__init__.py +8 -0
- mcp_proxy_adapter/cli/examples/http_basic.py +82 -0
- mcp_proxy_adapter/cli/examples/https_token.py +96 -0
- mcp_proxy_adapter/cli/examples/mtls_roles.py +103 -0
- mcp_proxy_adapter/cli/main.py +63 -0
- mcp_proxy_adapter/cli/parser.py +338 -0
- mcp_proxy_adapter/cli/validators.py +231 -0
- mcp_proxy_adapter/client/jsonrpc_client/__init__.py +9 -0
- mcp_proxy_adapter/client/jsonrpc_client/client.py +42 -0
- mcp_proxy_adapter/client/jsonrpc_client/command_api.py +45 -0
- mcp_proxy_adapter/client/jsonrpc_client/proxy_api.py +224 -0
- mcp_proxy_adapter/client/jsonrpc_client/queue_api.py +60 -0
- mcp_proxy_adapter/client/jsonrpc_client/transport.py +108 -0
- mcp_proxy_adapter/client/proxy.py +123 -0
- mcp_proxy_adapter/commands/__init__.py +66 -0
- mcp_proxy_adapter/commands/auth_validation_command.py +69 -0
- mcp_proxy_adapter/commands/base.py +389 -0
- mcp_proxy_adapter/commands/builtin_commands.py +30 -0
- mcp_proxy_adapter/commands/catalog/__init__.py +20 -0
- mcp_proxy_adapter/commands/catalog/catalog_loader.py +34 -0
- mcp_proxy_adapter/commands/catalog/catalog_manager.py +122 -0
- mcp_proxy_adapter/commands/catalog/catalog_syncer.py +149 -0
- mcp_proxy_adapter/commands/catalog/command_catalog.py +43 -0
- mcp_proxy_adapter/commands/catalog/dependency_manager.py +37 -0
- mcp_proxy_adapter/commands/catalog_manager.py +97 -0
- mcp_proxy_adapter/commands/cert_monitor_command.py +552 -0
- mcp_proxy_adapter/commands/certificate_management_command.py +562 -0
- mcp_proxy_adapter/commands/command_registry.py +298 -0
- mcp_proxy_adapter/commands/config_command.py +102 -0
- mcp_proxy_adapter/commands/dependency_container.py +40 -0
- mcp_proxy_adapter/commands/dependency_manager.py +143 -0
- mcp_proxy_adapter/commands/echo_command.py +48 -0
- mcp_proxy_adapter/commands/health_command.py +142 -0
- mcp_proxy_adapter/commands/help_command.py +175 -0
- mcp_proxy_adapter/commands/hooks.py +172 -0
- mcp_proxy_adapter/commands/key_management_command.py +484 -0
- mcp_proxy_adapter/commands/load_command.py +123 -0
- mcp_proxy_adapter/commands/plugins_command.py +246 -0
- mcp_proxy_adapter/commands/protocol_management_command.py +216 -0
- mcp_proxy_adapter/commands/proxy_registration_command.py +319 -0
- mcp_proxy_adapter/commands/queue_commands.py +750 -0
- mcp_proxy_adapter/commands/registration_status_command.py +76 -0
- mcp_proxy_adapter/commands/registry/__init__.py +18 -0
- mcp_proxy_adapter/commands/registry/command_info.py +103 -0
- mcp_proxy_adapter/commands/registry/command_loader.py +207 -0
- mcp_proxy_adapter/commands/registry/command_manager.py +119 -0
- mcp_proxy_adapter/commands/registry/command_registry.py +217 -0
- mcp_proxy_adapter/commands/reload_command.py +136 -0
- mcp_proxy_adapter/commands/result.py +157 -0
- mcp_proxy_adapter/commands/role_test_command.py +99 -0
- mcp_proxy_adapter/commands/roles_management_command.py +502 -0
- mcp_proxy_adapter/commands/security_command.py +472 -0
- mcp_proxy_adapter/commands/settings_command.py +113 -0
- mcp_proxy_adapter/commands/ssl_setup_command.py +306 -0
- mcp_proxy_adapter/commands/token_management_command.py +500 -0
- mcp_proxy_adapter/commands/transport_management_command.py +129 -0
- mcp_proxy_adapter/commands/unload_command.py +92 -0
- mcp_proxy_adapter/config.py +32 -0
- mcp_proxy_adapter/core/__init__.py +8 -0
- mcp_proxy_adapter/core/app_factory.py +560 -0
- mcp_proxy_adapter/core/app_runner.py +318 -0
- mcp_proxy_adapter/core/auth_validator.py +508 -0
- mcp_proxy_adapter/core/certificate/__init__.py +20 -0
- mcp_proxy_adapter/core/certificate/certificate_creator.py +372 -0
- mcp_proxy_adapter/core/certificate/certificate_extractor.py +185 -0
- mcp_proxy_adapter/core/certificate/certificate_utils.py +249 -0
- mcp_proxy_adapter/core/certificate/certificate_validator.py +481 -0
- mcp_proxy_adapter/core/certificate/ssl_context_manager.py +65 -0
- mcp_proxy_adapter/core/certificate_utils.py +249 -0
- mcp_proxy_adapter/core/client.py +608 -0
- mcp_proxy_adapter/core/client_manager.py +271 -0
- mcp_proxy_adapter/core/client_security.py +411 -0
- mcp_proxy_adapter/core/config/__init__.py +18 -0
- mcp_proxy_adapter/core/config/config.py +237 -0
- mcp_proxy_adapter/core/config/config_factory.py +22 -0
- mcp_proxy_adapter/core/config/config_loader.py +66 -0
- mcp_proxy_adapter/core/config/feature_manager.py +31 -0
- mcp_proxy_adapter/core/config/simple_config.py +204 -0
- mcp_proxy_adapter/core/config/simple_config_generator.py +131 -0
- mcp_proxy_adapter/core/config/simple_config_validator.py +476 -0
- mcp_proxy_adapter/core/config_converter.py +252 -0
- mcp_proxy_adapter/core/config_validator.py +211 -0
- mcp_proxy_adapter/core/crl_utils.py +362 -0
- mcp_proxy_adapter/core/errors.py +276 -0
- mcp_proxy_adapter/core/job_manager.py +54 -0
- mcp_proxy_adapter/core/logging.py +250 -0
- mcp_proxy_adapter/core/mtls_asgi.py +140 -0
- mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
- mcp_proxy_adapter/core/mtls_proxy.py +229 -0
- mcp_proxy_adapter/core/mtls_server.py +154 -0
- mcp_proxy_adapter/core/protocol_manager.py +232 -0
- mcp_proxy_adapter/core/proxy/__init__.py +19 -0
- mcp_proxy_adapter/core/proxy/auth_manager.py +26 -0
- mcp_proxy_adapter/core/proxy/proxy_registration_manager.py +160 -0
- mcp_proxy_adapter/core/proxy/registration_client.py +186 -0
- mcp_proxy_adapter/core/proxy/ssl_manager.py +101 -0
- mcp_proxy_adapter/core/proxy_client.py +184 -0
- mcp_proxy_adapter/core/proxy_registration.py +80 -0
- mcp_proxy_adapter/core/role_utils.py +103 -0
- mcp_proxy_adapter/core/security_adapter.py +343 -0
- mcp_proxy_adapter/core/security_factory.py +96 -0
- mcp_proxy_adapter/core/security_integration.py +342 -0
- mcp_proxy_adapter/core/server_adapter.py +251 -0
- mcp_proxy_adapter/core/server_engine.py +217 -0
- mcp_proxy_adapter/core/settings.py +260 -0
- mcp_proxy_adapter/core/signal_handler.py +107 -0
- mcp_proxy_adapter/core/ssl_utils.py +161 -0
- mcp_proxy_adapter/core/transport_manager.py +153 -0
- mcp_proxy_adapter/core/unified_config_adapter.py +471 -0
- mcp_proxy_adapter/core/utils.py +101 -0
- mcp_proxy_adapter/core/validation/__init__.py +21 -0
- mcp_proxy_adapter/core/validation/config_validator.py +219 -0
- mcp_proxy_adapter/core/validation/file_validator.py +131 -0
- mcp_proxy_adapter/core/validation/protocol_validator.py +205 -0
- mcp_proxy_adapter/core/validation/security_validator.py +140 -0
- mcp_proxy_adapter/core/validation/validation_result.py +27 -0
- mcp_proxy_adapter/custom_openapi.py +58 -0
- mcp_proxy_adapter/examples/__init__.py +16 -0
- mcp_proxy_adapter/examples/basic_framework/__init__.py +9 -0
- mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +4 -0
- mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +4 -0
- mcp_proxy_adapter/examples/basic_framework/main.py +52 -0
- mcp_proxy_adapter/examples/bugfix_certificate_config.py +261 -0
- mcp_proxy_adapter/examples/cert_manager_bugfix.py +203 -0
- mcp_proxy_adapter/examples/check_config.py +413 -0
- mcp_proxy_adapter/examples/client_usage_example.py +164 -0
- mcp_proxy_adapter/examples/commands/__init__.py +5 -0
- mcp_proxy_adapter/examples/config_builder.py +234 -0
- mcp_proxy_adapter/examples/config_cli.py +282 -0
- mcp_proxy_adapter/examples/create_test_configs.py +174 -0
- mcp_proxy_adapter/examples/debug_request_state.py +130 -0
- mcp_proxy_adapter/examples/debug_role_chain.py +191 -0
- mcp_proxy_adapter/examples/demo_client.py +287 -0
- mcp_proxy_adapter/examples/full_application/__init__.py +12 -0
- mcp_proxy_adapter/examples/full_application/commands/__init__.py +8 -0
- mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +45 -0
- mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +52 -0
- mcp_proxy_adapter/examples/full_application/commands/echo_command.py +32 -0
- mcp_proxy_adapter/examples/full_application/commands/help_command.py +54 -0
- mcp_proxy_adapter/examples/full_application/commands/list_command.py +57 -0
- mcp_proxy_adapter/examples/full_application/hooks/__init__.py +5 -0
- mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +29 -0
- mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +27 -0
- mcp_proxy_adapter/examples/full_application/main.py +311 -0
- mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +161 -0
- mcp_proxy_adapter/examples/full_application/run_mtls.py +252 -0
- mcp_proxy_adapter/examples/full_application/run_simple.py +152 -0
- mcp_proxy_adapter/examples/full_application/test_minimal_server.py +45 -0
- mcp_proxy_adapter/examples/full_application/test_server.py +163 -0
- mcp_proxy_adapter/examples/full_application/test_simple_server.py +62 -0
- mcp_proxy_adapter/examples/generate_config.py +502 -0
- mcp_proxy_adapter/examples/proxy_registration_example.py +335 -0
- mcp_proxy_adapter/examples/queue_demo_simple.py +632 -0
- mcp_proxy_adapter/examples/queue_integration_example.py +578 -0
- mcp_proxy_adapter/examples/queue_server_demo.py +82 -0
- mcp_proxy_adapter/examples/queue_server_example.py +85 -0
- mcp_proxy_adapter/examples/queue_server_simple.py +173 -0
- mcp_proxy_adapter/examples/required_certificates.py +208 -0
- mcp_proxy_adapter/examples/run_example.py +77 -0
- mcp_proxy_adapter/examples/run_full_test_suite.py +619 -0
- mcp_proxy_adapter/examples/run_proxy_server.py +153 -0
- mcp_proxy_adapter/examples/run_security_tests_fixed.py +435 -0
- mcp_proxy_adapter/examples/security_test/__init__.py +18 -0
- mcp_proxy_adapter/examples/security_test/auth_manager.py +14 -0
- mcp_proxy_adapter/examples/security_test/ssl_context_manager.py +28 -0
- mcp_proxy_adapter/examples/security_test/test_client.py +159 -0
- mcp_proxy_adapter/examples/security_test/test_result.py +22 -0
- mcp_proxy_adapter/examples/security_test_client.py +72 -0
- mcp_proxy_adapter/examples/setup/__init__.py +24 -0
- mcp_proxy_adapter/examples/setup/certificate_manager.py +215 -0
- mcp_proxy_adapter/examples/setup/config_generator.py +12 -0
- mcp_proxy_adapter/examples/setup/config_validator.py +118 -0
- mcp_proxy_adapter/examples/setup/environment_setup.py +62 -0
- mcp_proxy_adapter/examples/setup/test_files_generator.py +10 -0
- mcp_proxy_adapter/examples/setup/test_runner.py +89 -0
- mcp_proxy_adapter/examples/setup_test_environment.py +235 -0
- mcp_proxy_adapter/examples/simple_protocol_test.py +125 -0
- mcp_proxy_adapter/examples/test_chk_hostname_automated.py +211 -0
- mcp_proxy_adapter/examples/test_config.py +205 -0
- mcp_proxy_adapter/examples/test_config_builder.py +110 -0
- mcp_proxy_adapter/examples/test_examples.py +308 -0
- mcp_proxy_adapter/examples/test_framework_complete.py +267 -0
- mcp_proxy_adapter/examples/test_mcp_server.py +187 -0
- mcp_proxy_adapter/examples/test_protocol_examples.py +337 -0
- mcp_proxy_adapter/examples/universal_client.py +674 -0
- mcp_proxy_adapter/examples/update_config_certificates.py +135 -0
- mcp_proxy_adapter/examples/validate_generator_compatibility.py +385 -0
- mcp_proxy_adapter/examples/validate_generator_compatibility_simple.py +61 -0
- mcp_proxy_adapter/integrations/__init__.py +25 -0
- mcp_proxy_adapter/integrations/queuemgr_integration.py +462 -0
- mcp_proxy_adapter/main.py +311 -0
- mcp_proxy_adapter/openapi.py +375 -0
- mcp_proxy_adapter/schemas/base_schema.json +114 -0
- mcp_proxy_adapter/schemas/openapi_schema.json +314 -0
- mcp_proxy_adapter/schemas/roles.json +37 -0
- mcp_proxy_adapter/schemas/roles_schema.json +162 -0
- mcp_proxy_adapter/version.py +5 -0
- mcp_proxy_adapter-6.9.50.dist-info/METADATA +1088 -0
- mcp_proxy_adapter-6.9.50.dist-info/RECORD +242 -0
- {mcp_proxy_adapter-2.0.1.dist-info → mcp_proxy_adapter-6.9.50.dist-info}/WHEEL +1 -1
- mcp_proxy_adapter-6.9.50.dist-info/entry_points.txt +14 -0
- mcp_proxy_adapter-6.9.50.dist-info/top_level.txt +1 -0
- adapters/__init__.py +0 -16
- analyzers/__init__.py +0 -14
- analyzers/docstring_analyzer.py +0 -199
- analyzers/type_analyzer.py +0 -151
- cli/__init__.py +0 -12
- cli/__main__.py +0 -79
- cli/command_runner.py +0 -233
- dispatchers/__init__.py +0 -14
- dispatchers/base_dispatcher.py +0 -85
- dispatchers/json_rpc_dispatcher.py +0 -198
- generators/__init__.py +0 -14
- generators/endpoint_generator.py +0 -172
- generators/openapi_generator.py +0 -254
- generators/rest_api_generator.py +0 -207
- mcp_proxy_adapter-2.0.1.dist-info/METADATA +0 -272
- mcp_proxy_adapter-2.0.1.dist-info/RECORD +0 -28
- mcp_proxy_adapter-2.0.1.dist-info/licenses/LICENSE +0 -21
- mcp_proxy_adapter-2.0.1.dist-info/top_level.txt +0 -7
- openapi_schema/__init__.py +0 -38
- openapi_schema/command_registry.py +0 -312
- openapi_schema/rest_schema.py +0 -510
- openapi_schema/rpc_generator.py +0 -307
- openapi_schema/rpc_schema.py +0 -416
- validators/__init__.py +0 -14
- validators/base_validator.py +0 -23
- validators/docstring_validator.py +0 -75
- 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)
|