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
generators/rest_api_generator.py
DELETED
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Генератор REST API на основе команд и их метаданных.
|
|
3
|
-
"""
|
|
4
|
-
from typing import Dict, Any, Optional, List, Callable
|
|
5
|
-
import inspect
|
|
6
|
-
import logging
|
|
7
|
-
from command_registry.dispatchers.base_dispatcher import BaseDispatcher
|
|
8
|
-
|
|
9
|
-
logger = logging.getLogger("command_registry")
|
|
10
|
-
|
|
11
|
-
class RestApiGenerator:
|
|
12
|
-
"""
|
|
13
|
-
Генератор REST API для FastAPI на основе команд.
|
|
14
|
-
|
|
15
|
-
Этот класс создает REST эндпоинты для FastAPI на основе
|
|
16
|
-
зарегистрированных команд и их метаданных.
|
|
17
|
-
"""
|
|
18
|
-
|
|
19
|
-
def __init__(self, app, dispatcher: Optional[BaseDispatcher] = None, prefix: str = ""):
|
|
20
|
-
"""
|
|
21
|
-
Инициализирует генератор REST API.
|
|
22
|
-
|
|
23
|
-
Args:
|
|
24
|
-
app: Экземпляр FastAPI приложения
|
|
25
|
-
dispatcher: Диспетчер команд для доступа к метаданным
|
|
26
|
-
prefix: Префикс для всех эндпоинтов (например, "/api")
|
|
27
|
-
"""
|
|
28
|
-
self.app = app
|
|
29
|
-
self.dispatcher = dispatcher
|
|
30
|
-
self.prefix = prefix.rstrip("/")
|
|
31
|
-
|
|
32
|
-
# Словарь для хранения соответствия между командами и эндпоинтами
|
|
33
|
-
self._endpoints = {}
|
|
34
|
-
|
|
35
|
-
def set_dispatcher(self, dispatcher: BaseDispatcher) -> None:
|
|
36
|
-
"""
|
|
37
|
-
Устанавливает диспетчер команд.
|
|
38
|
-
|
|
39
|
-
Args:
|
|
40
|
-
dispatcher: Диспетчер команд
|
|
41
|
-
"""
|
|
42
|
-
self.dispatcher = dispatcher
|
|
43
|
-
|
|
44
|
-
def generate_endpoints(self) -> None:
|
|
45
|
-
"""
|
|
46
|
-
Генерирует REST эндпоинты для всех команд.
|
|
47
|
-
|
|
48
|
-
Создает эндпоинты для всех команд, зарегистрированных в диспетчере,
|
|
49
|
-
включая автоматический хелп-эндпоинт.
|
|
50
|
-
"""
|
|
51
|
-
if not self.dispatcher:
|
|
52
|
-
logger.warning("Диспетчер команд не установлен, невозможно сгенерировать эндпоинты")
|
|
53
|
-
return
|
|
54
|
-
|
|
55
|
-
# Получаем информацию о всех командах
|
|
56
|
-
commands_info = self.dispatcher.get_commands_info()
|
|
57
|
-
|
|
58
|
-
# Генерируем эндпоинты для каждой команды
|
|
59
|
-
for command, info in commands_info.items():
|
|
60
|
-
# Генерируем путь для эндпоинта
|
|
61
|
-
path = f"{self.prefix}/{command.replace('_', '-')}"
|
|
62
|
-
|
|
63
|
-
# Генерируем обработчик для эндпоинта
|
|
64
|
-
endpoint = self._create_endpoint_handler(command, info)
|
|
65
|
-
|
|
66
|
-
# Регистрируем эндпоинт в FastAPI
|
|
67
|
-
self.app.post(
|
|
68
|
-
path,
|
|
69
|
-
summary=info.get("summary", command),
|
|
70
|
-
description=info.get("description", ""),
|
|
71
|
-
tags=self._get_tags_for_command(command)
|
|
72
|
-
)(endpoint)
|
|
73
|
-
|
|
74
|
-
# Сохраняем соответствие между командой и эндпоинтом
|
|
75
|
-
self._endpoints[command] = path
|
|
76
|
-
|
|
77
|
-
logger.debug(f"Сгенерирован REST эндпоинт для команды '{command}': {path}")
|
|
78
|
-
|
|
79
|
-
# Генерируем хелп-эндпоинт
|
|
80
|
-
self._generate_help_endpoint()
|
|
81
|
-
|
|
82
|
-
def _create_endpoint_handler(self, command: str, info: Dict[str, Any]) -> Callable:
|
|
83
|
-
"""
|
|
84
|
-
Создает функцию-обработчик для эндпоинта.
|
|
85
|
-
|
|
86
|
-
Args:
|
|
87
|
-
command: Имя команды
|
|
88
|
-
info: Метаданные команды
|
|
89
|
-
|
|
90
|
-
Returns:
|
|
91
|
-
Callable: Функция-обработчик для FastAPI
|
|
92
|
-
"""
|
|
93
|
-
dispatcher = self.dispatcher
|
|
94
|
-
|
|
95
|
-
# Создаем динамическую функцию-обработчик
|
|
96
|
-
async def endpoint(**kwargs):
|
|
97
|
-
try:
|
|
98
|
-
# Выполняем команду через диспетчер
|
|
99
|
-
result = dispatcher.execute(command, **kwargs)
|
|
100
|
-
|
|
101
|
-
# Если результат корутина, ожидаем его завершения
|
|
102
|
-
if inspect.iscoroutine(result):
|
|
103
|
-
result = await result
|
|
104
|
-
|
|
105
|
-
return result
|
|
106
|
-
except Exception as e:
|
|
107
|
-
# В случае ошибки возвращаем структурированный ответ с ошибкой
|
|
108
|
-
return {
|
|
109
|
-
"error": {
|
|
110
|
-
"message": str(e),
|
|
111
|
-
"code": 500
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
# Устанавливаем имя функции и докстринг
|
|
116
|
-
endpoint.__name__ = f"{command}_endpoint"
|
|
117
|
-
endpoint.__doc__ = info.get("description", "")
|
|
118
|
-
|
|
119
|
-
# Возвращаем функцию-обработчик
|
|
120
|
-
return endpoint
|
|
121
|
-
|
|
122
|
-
def _generate_help_endpoint(self) -> None:
|
|
123
|
-
"""
|
|
124
|
-
Генерирует хелп-эндпоинт для API.
|
|
125
|
-
|
|
126
|
-
Создает специальный эндпоинт /help, который возвращает информацию
|
|
127
|
-
о всех доступных командах и их эндпоинтах.
|
|
128
|
-
"""
|
|
129
|
-
app = self.app
|
|
130
|
-
dispatcher = self.dispatcher
|
|
131
|
-
endpoints = self._endpoints
|
|
132
|
-
|
|
133
|
-
# Путь для хелп-эндпоинта
|
|
134
|
-
help_path = f"{self.prefix}/help"
|
|
135
|
-
|
|
136
|
-
# Функция-обработчик для хелп-эндпоинта
|
|
137
|
-
async def help_endpoint(command: Optional[str] = None):
|
|
138
|
-
if command:
|
|
139
|
-
# Если указана конкретная команда, возвращаем информацию о ней
|
|
140
|
-
command_info = dispatcher.get_command_info(command)
|
|
141
|
-
if not command_info:
|
|
142
|
-
return {
|
|
143
|
-
"error": f"Команда '{command}' не найдена",
|
|
144
|
-
"available_commands": list(dispatcher.get_valid_commands())
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
# Добавляем URL эндпоинта
|
|
148
|
-
endpoint_url = endpoints.get(command)
|
|
149
|
-
if endpoint_url:
|
|
150
|
-
command_info["endpoint"] = endpoint_url
|
|
151
|
-
|
|
152
|
-
return {
|
|
153
|
-
"command": command,
|
|
154
|
-
"info": command_info
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
# Иначе возвращаем информацию о всех командах
|
|
158
|
-
commands_info = {}
|
|
159
|
-
for cmd, info in dispatcher.get_commands_info().items():
|
|
160
|
-
endpoint_url = endpoints.get(cmd)
|
|
161
|
-
commands_info[cmd] = {
|
|
162
|
-
"summary": info.get("summary", ""),
|
|
163
|
-
"description": info.get("description", ""),
|
|
164
|
-
"endpoint": endpoint_url,
|
|
165
|
-
"params_count": len(info.get("params", {}))
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
return {
|
|
169
|
-
"commands": commands_info,
|
|
170
|
-
"total": len(commands_info),
|
|
171
|
-
"base_url": self.prefix,
|
|
172
|
-
"note": "Для получения подробной информации о команде используйте параметр 'command'"
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
# Регистрируем хелп-эндпоинт в FastAPI
|
|
176
|
-
app.get(
|
|
177
|
-
help_path,
|
|
178
|
-
summary="API справка",
|
|
179
|
-
description="Возвращает информацию о доступных командах и эндпоинтах API",
|
|
180
|
-
tags=["help"]
|
|
181
|
-
)(help_endpoint)
|
|
182
|
-
|
|
183
|
-
logger.debug(f"Сгенерирован хелп-эндпоинт: {help_path}")
|
|
184
|
-
|
|
185
|
-
def _get_tags_for_command(self, command: str) -> List[str]:
|
|
186
|
-
"""
|
|
187
|
-
Определяет теги для команды.
|
|
188
|
-
|
|
189
|
-
Args:
|
|
190
|
-
command: Имя команды
|
|
191
|
-
|
|
192
|
-
Returns:
|
|
193
|
-
List[str]: Список тегов для документации OpenAPI
|
|
194
|
-
"""
|
|
195
|
-
# Простая эвристика для определения категории команды
|
|
196
|
-
if command.startswith(("get_", "search_", "find_", "list_")):
|
|
197
|
-
return ["query"]
|
|
198
|
-
elif command.startswith(("create_", "add_", "insert_")):
|
|
199
|
-
return ["mutation", "create"]
|
|
200
|
-
elif command.startswith(("update_", "change_", "modify_")):
|
|
201
|
-
return ["mutation", "update"]
|
|
202
|
-
elif command.startswith(("delete_", "remove_")):
|
|
203
|
-
return ["mutation", "delete"]
|
|
204
|
-
else:
|
|
205
|
-
# Используем первую часть имени команды в качестве тега
|
|
206
|
-
parts = command.split("_")
|
|
207
|
-
return [parts[0]] if parts else ["other"]
|
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: mcp-proxy-adapter
|
|
3
|
-
Version: 2.0.1
|
|
4
|
-
Summary: Adapter for exposing Command Registry commands as tools for AI models via MCP Proxy.
|
|
5
|
-
Home-page: https://github.com/vasilyvz/mcp-proxy-adapter
|
|
6
|
-
Author: Vasiliy VZ
|
|
7
|
-
Author-email: Vasiliy VZ <vasilyvz@example.com>
|
|
8
|
-
License: MIT
|
|
9
|
-
Project-URL: Homepage, https://github.com/vasilyvz/mcp-proxy-adapter
|
|
10
|
-
Project-URL: BugTracker, https://github.com/vasilyvz/mcp-proxy-adapter/issues
|
|
11
|
-
Project-URL: Documentation, https://github.com/vasilyvz/mcp_proxy_adapter#readme
|
|
12
|
-
Project-URL: Source, https://github.com/vasilyvz/mcp_proxy_adapter
|
|
13
|
-
Classifier: Development Status :: 4 - Beta
|
|
14
|
-
Classifier: Intended Audience :: Developers
|
|
15
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
-
Classifier: Programming Language :: Python :: 3
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
-
Requires-Python: >=3.9, <4
|
|
22
|
-
Description-Content-Type: text/markdown
|
|
23
|
-
License-File: LICENSE
|
|
24
|
-
Requires-Dist: fastapi<1.0.0,>=0.95.0
|
|
25
|
-
Requires-Dist: pydantic<3.0.0,>=2.0.0
|
|
26
|
-
Requires-Dist: uvicorn<1.0.0,>=0.22.0
|
|
27
|
-
Requires-Dist: docstring-parser<1.0.0,>=0.15
|
|
28
|
-
Requires-Dist: typing-extensions<5.0.0,>=4.5.0
|
|
29
|
-
Dynamic: author
|
|
30
|
-
Dynamic: home-page
|
|
31
|
-
Dynamic: license-file
|
|
32
|
-
Dynamic: requires-python
|
|
33
|
-
|
|
34
|
-
# MCP Proxy Adapter
|
|
35
|
-
|
|
36
|
-
Adapter for integrating [Command Registry](docs/README.md) with MCP Proxy, allowing you to use commands as tools for AI models.
|
|
37
|
-
|
|
38
|
-
## Overview
|
|
39
|
-
|
|
40
|
-
MCP Proxy Adapter transforms commands registered in the Command Registry into a format compatible with MCP Proxy. This enables:
|
|
41
|
-
|
|
42
|
-
1. Using existing commands as tools for AI models
|
|
43
|
-
2. Creating a hybrid REST/JSON-RPC API for command execution
|
|
44
|
-
3. Automatic generation of OpenAPI schemas optimized for MCP Proxy
|
|
45
|
-
4. Managing tool metadata for better AI system integration
|
|
46
|
-
|
|
47
|
-
## Installation
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
pip install mcp-proxy-adapter
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
## Quick Start
|
|
54
|
-
|
|
55
|
-
```python
|
|
56
|
-
from mcp_proxy_adapter import MCPProxyAdapter, CommandRegistry
|
|
57
|
-
from fastapi import FastAPI
|
|
58
|
-
|
|
59
|
-
# Create a command registry instance
|
|
60
|
-
registry = CommandRegistry()
|
|
61
|
-
|
|
62
|
-
# Register commands
|
|
63
|
-
@registry.command
|
|
64
|
-
def calculate_total(prices: list[float], discount: float = 0.0) -> float:
|
|
65
|
-
"""
|
|
66
|
-
Calculates the total price with discount.
|
|
67
|
-
Args:
|
|
68
|
-
prices: List of item prices
|
|
69
|
-
discount: Discount percentage (0-100)
|
|
70
|
-
Returns:
|
|
71
|
-
Total price with discount
|
|
72
|
-
"""
|
|
73
|
-
subtotal = sum(prices)
|
|
74
|
-
return subtotal * (1 - discount / 100)
|
|
75
|
-
|
|
76
|
-
# Create FastAPI app
|
|
77
|
-
app = FastAPI()
|
|
78
|
-
|
|
79
|
-
# Create and configure MCP Proxy adapter
|
|
80
|
-
adapter = MCPProxyAdapter(registry)
|
|
81
|
-
|
|
82
|
-
# Register endpoints in FastAPI app
|
|
83
|
-
adapter.register_endpoints(app)
|
|
84
|
-
|
|
85
|
-
# Generate and save MCP Proxy config
|
|
86
|
-
adapter.save_config_to_file("mcp_proxy_config.json")
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
## Supported Request Formats
|
|
90
|
-
|
|
91
|
-
The adapter supports three request formats for command execution:
|
|
92
|
-
|
|
93
|
-
### 1. JSON-RPC format
|
|
94
|
-
|
|
95
|
-
```json
|
|
96
|
-
{
|
|
97
|
-
"jsonrpc": "2.0",
|
|
98
|
-
"method": "command_name",
|
|
99
|
-
"params": {
|
|
100
|
-
"param1": "value1",
|
|
101
|
-
"param2": "value2"
|
|
102
|
-
},
|
|
103
|
-
"id": 1
|
|
104
|
-
}
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
Example request to `/cmd` endpoint:
|
|
108
|
-
|
|
109
|
-
```bash
|
|
110
|
-
curl -X POST -H "Content-Type: application/json" -d '{
|
|
111
|
-
"jsonrpc": "2.0",
|
|
112
|
-
"method": "calculate_total",
|
|
113
|
-
"params": {
|
|
114
|
-
"prices": [100, 200, 300],
|
|
115
|
-
"discount": 10
|
|
116
|
-
},
|
|
117
|
-
"id": 1
|
|
118
|
-
}' http://localhost:8000/cmd
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
Response:
|
|
122
|
-
|
|
123
|
-
```json
|
|
124
|
-
{
|
|
125
|
-
"jsonrpc": "2.0",
|
|
126
|
-
"result": 540.0,
|
|
127
|
-
"id": 1
|
|
128
|
-
}
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
### 2. MCP Proxy format
|
|
132
|
-
|
|
133
|
-
```json
|
|
134
|
-
{
|
|
135
|
-
"command": "command_name",
|
|
136
|
-
"params": {
|
|
137
|
-
"param1": "value1",
|
|
138
|
-
"param2": "value2"
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
Example request:
|
|
144
|
-
|
|
145
|
-
```bash
|
|
146
|
-
curl -X POST -H "Content-Type: application/json" -d '{
|
|
147
|
-
"command": "calculate_total",
|
|
148
|
-
"params": {
|
|
149
|
-
"prices": [100, 200, 300],
|
|
150
|
-
"discount": 10
|
|
151
|
-
}
|
|
152
|
-
}' http://localhost:8000/cmd
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
Response:
|
|
156
|
-
|
|
157
|
-
```json
|
|
158
|
-
{
|
|
159
|
-
"result": 540.0
|
|
160
|
-
}
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
### 3. Params-only format
|
|
164
|
-
|
|
165
|
-
```json
|
|
166
|
-
{
|
|
167
|
-
"params": {
|
|
168
|
-
"command": "command_name",
|
|
169
|
-
"param1": "value1",
|
|
170
|
-
"param2": "value2"
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
or
|
|
176
|
-
|
|
177
|
-
```json
|
|
178
|
-
{
|
|
179
|
-
"params": {
|
|
180
|
-
"query": "command_name",
|
|
181
|
-
"param1": "value1",
|
|
182
|
-
"param2": "value2"
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
Example request:
|
|
188
|
-
|
|
189
|
-
```bash
|
|
190
|
-
curl -X POST -H "Content-Type: application/json" -d '{
|
|
191
|
-
"params": {
|
|
192
|
-
"command": "calculate_total",
|
|
193
|
-
"prices": [100, 200, 300],
|
|
194
|
-
"discount": 10
|
|
195
|
-
}
|
|
196
|
-
}' http://localhost:8000/cmd
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
Response:
|
|
200
|
-
|
|
201
|
-
```json
|
|
202
|
-
{
|
|
203
|
-
"result": 540.0
|
|
204
|
-
}
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
## Full Example: Integration with FastAPI
|
|
208
|
-
|
|
209
|
-
```python
|
|
210
|
-
import logging
|
|
211
|
-
from fastapi import FastAPI, APIRouter
|
|
212
|
-
from mcp_proxy_adapter import CommandRegistry, MCPProxyAdapter, configure_logger
|
|
213
|
-
|
|
214
|
-
# Configure logging
|
|
215
|
-
logging.basicConfig(level=logging.INFO)
|
|
216
|
-
project_logger = logging.getLogger("my_project")
|
|
217
|
-
|
|
218
|
-
# Create FastAPI app
|
|
219
|
-
app = FastAPI(title="My API with MCP Proxy Integration")
|
|
220
|
-
|
|
221
|
-
# Create existing API router
|
|
222
|
-
router = APIRouter()
|
|
223
|
-
|
|
224
|
-
@router.get("/items")
|
|
225
|
-
async def get_items():
|
|
226
|
-
"""Returns a list of items."""
|
|
227
|
-
return [
|
|
228
|
-
{"id": 1, "name": "Smartphone X", "price": 999.99},
|
|
229
|
-
{"id": 2, "name": "Laptop Y", "price": 1499.99},
|
|
230
|
-
]
|
|
231
|
-
|
|
232
|
-
app.include_router(router)
|
|
233
|
-
|
|
234
|
-
# Register commands
|
|
235
|
-
registry = CommandRegistry()
|
|
236
|
-
|
|
237
|
-
@registry.command
|
|
238
|
-
def get_discounted_price(price: float, discount: float = 0.0) -> float:
|
|
239
|
-
"""
|
|
240
|
-
Returns the price after applying a discount.
|
|
241
|
-
"""
|
|
242
|
-
return price * (1 - discount / 100)
|
|
243
|
-
|
|
244
|
-
# Create and register MCP Proxy adapter
|
|
245
|
-
adapter = MCPProxyAdapter(registry)
|
|
246
|
-
adapter.register_endpoints(app)
|
|
247
|
-
|
|
248
|
-
# Save MCP Proxy config
|
|
249
|
-
adapter.save_config_to_file("mcp_proxy_config.json")
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
## Features
|
|
253
|
-
- Universal JSON-RPC endpoint for command execution
|
|
254
|
-
- Automatic OpenAPI schema generation and optimization for MCP Proxy
|
|
255
|
-
- Tool metadata for AI models
|
|
256
|
-
- Customizable endpoints and logging
|
|
257
|
-
- Full test coverage and examples
|
|
258
|
-
|
|
259
|
-
## License
|
|
260
|
-
MIT
|
|
261
|
-
|
|
262
|
-
## Documentation
|
|
263
|
-
See [docs/](docs/) for detailed guides, architecture, and examples.
|
|
264
|
-
|
|
265
|
-
## CI/CD & PyPI automation
|
|
266
|
-
|
|
267
|
-
This project uses GitHub Actions for continuous integration and automated publishing to PyPI.
|
|
268
|
-
|
|
269
|
-
- All tests are run on every push and pull request.
|
|
270
|
-
- On push of a new tag (vX.Y.Z), the package is built and published to PyPI automatically.
|
|
271
|
-
|
|
272
|
-
See `.github/workflows/publish.yml` for details.
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
adapters/__init__.py,sha256=7QraK1j5y29KFSRF4mVxTiWC2Y3IYZLd6GhxUCtjyhg,790
|
|
2
|
-
analyzers/__init__.py,sha256=2rcYZDP-bXq078MQpxP32lAwYYyRhOwAQGBcefBfBzY,368
|
|
3
|
-
analyzers/docstring_analyzer.py,sha256=T3FLJEo_uChShfiEKRl8GpVoHvh5HiudZkxnj4KixfA,7541
|
|
4
|
-
analyzers/type_analyzer.py,sha256=6Wac7osKwF03waFSwQ8ZM0Wqn_zAP2D-I4WMEpR0hQM,5230
|
|
5
|
-
cli/__init__.py,sha256=vJ0VTT7D4KRIOi9nQSgBLub7xywq68i2R1zYQkdA0Uk,416
|
|
6
|
-
cli/__main__.py,sha256=qtjEOB4vkeMASjTppyRFok4IFihRrVOqjk6vLx8OW1g,2400
|
|
7
|
-
cli/command_runner.py,sha256=4d0BZKRG9k4CLk3ZE26jfSxwwrls2e-KsflRoVimfyE,8328
|
|
8
|
-
dispatchers/__init__.py,sha256=FWgimgInGphIjCEnvA3-ZExiapUzYAVis2H9C5IWivU,365
|
|
9
|
-
dispatchers/base_dispatcher.py,sha256=S5_Xri058jAmOWeit1tedB_GMZQ9RLcNcYabA83ZF6k,2288
|
|
10
|
-
dispatchers/json_rpc_dispatcher.py,sha256=ffu1M32E1AdC7IB44mlbV2L56eJQMsp-7fYi_r4rmHc,6331
|
|
11
|
-
generators/__init__.py,sha256=KC8p2HcIBqdyCY1wHnN_c1EfbnPM39YhZLNBDcuv3vA,538
|
|
12
|
-
generators/endpoint_generator.py,sha256=fhEInY3JPwdc5EENesN9VrrONwVZMpsledVpubouJLA,6513
|
|
13
|
-
generators/openapi_generator.py,sha256=0Iqsn0fRr10sTWUK9-MU5MXOXKDHccxKYnmaiQPkKFw,9773
|
|
14
|
-
generators/rest_api_generator.py,sha256=Zg9HVeIuspowXd6aBlyho4UXz-te_Hd4egGzjjIVF48,9159
|
|
15
|
-
mcp_proxy_adapter-2.0.1.dist-info/licenses/LICENSE,sha256=OkApFEwdgMCt_mbvUI-eIwKMSTe38K3XnU2DT5ub-wI,1072
|
|
16
|
-
openapi_schema/__init__.py,sha256=S_lEg-VtlgDdhFxB_u9ZUM1dWKbzW_L_FM-6OCT4EXM,1334
|
|
17
|
-
openapi_schema/command_registry.py,sha256=VqqdsVCcd5neqZ-bsfeKTHeLBeputwUZHxvNxVuvqZs,12075
|
|
18
|
-
openapi_schema/rest_schema.py,sha256=nfF9axtmEA-B-Rw8TCnpmRf6Br3MfQ3TJVx-QHUHoy8,24103
|
|
19
|
-
openapi_schema/rpc_generator.py,sha256=5FGMqjMXcaW0Ej6oey5mgiIxtEKTtA87dc-_kWLWqb0,13640
|
|
20
|
-
openapi_schema/rpc_schema.py,sha256=pebSNt9rKyP2dyHpbjSllak6pQe5AnllReKHhR3UIaI,20162
|
|
21
|
-
validators/__init__.py,sha256=s6zd5oZ3V2pXtzONoH3CiZYLzSVtCoLXpETMFUQfwWY,403
|
|
22
|
-
validators/base_validator.py,sha256=qTEcXnfGqsgKKtc-lnttLiPTuq6vOHfDpZrQ5oP5Fi0,602
|
|
23
|
-
validators/docstring_validator.py,sha256=Onpq2iNJ1qF4ejkJJIlBkLROuSNIVALHVmXIgkCpaFI,2934
|
|
24
|
-
validators/metadata_validator.py,sha256=uCrn38-VYYn89l6f5CC_GoTAHAweaOW2Z6Esro1rtGw,3155
|
|
25
|
-
mcp_proxy_adapter-2.0.1.dist-info/METADATA,sha256=oP9RxZPEOhQdF_fPbj0t3gyN8u6lWRZBMETQ1gXno_k,6076
|
|
26
|
-
mcp_proxy_adapter-2.0.1.dist-info/WHEEL,sha256=ooBFpIzZCPdw3uqIQsOo4qqbA4ZRPxHnOH7peeONza0,91
|
|
27
|
-
mcp_proxy_adapter-2.0.1.dist-info/top_level.txt,sha256=SlVzE4ry_0xTgDmO2uiaI7ihb9MpR62izN4MH_t1BTU,72
|
|
28
|
-
mcp_proxy_adapter-2.0.1.dist-info/RECORD,,
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2023-2024 Vasiliy VZ
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
openapi_schema/__init__.py
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Combined OpenAPI schema for REST and RPC API.
|
|
3
|
-
Provides the get_openapi_schema function that returns the complete OpenAPI schema.
|
|
4
|
-
"""
|
|
5
|
-
from typing import Dict, Any
|
|
6
|
-
|
|
7
|
-
from .rest_schema import get_rest_schema
|
|
8
|
-
from .rpc_generator import generate_rpc_schema
|
|
9
|
-
|
|
10
|
-
__all__ = ["get_openapi_schema"]
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def get_openapi_schema() -> Dict[str, Any]:
|
|
14
|
-
"""
|
|
15
|
-
Gets the complete OpenAPI schema that includes both REST and RPC interfaces.
|
|
16
|
-
|
|
17
|
-
Returns:
|
|
18
|
-
Dict[str, Any]: Complete OpenAPI schema
|
|
19
|
-
"""
|
|
20
|
-
# Get the base REST schema
|
|
21
|
-
openapi_schema = get_rest_schema()
|
|
22
|
-
|
|
23
|
-
# Generate RPC schema based on REST schema
|
|
24
|
-
rpc_schema = generate_rpc_schema(openapi_schema)
|
|
25
|
-
|
|
26
|
-
# Add /cmd endpoint from RPC schema to the general schema
|
|
27
|
-
openapi_schema["paths"].update(rpc_schema["paths"])
|
|
28
|
-
|
|
29
|
-
# Merge schema components
|
|
30
|
-
for component_type, components in rpc_schema["components"].items():
|
|
31
|
-
if component_type not in openapi_schema["components"]:
|
|
32
|
-
openapi_schema["components"][component_type] = {}
|
|
33
|
-
for component_name, component in components.items():
|
|
34
|
-
# Avoid component duplication
|
|
35
|
-
if component_name not in openapi_schema["components"][component_type]:
|
|
36
|
-
openapi_schema["components"][component_type][component_name] = component
|
|
37
|
-
|
|
38
|
-
return openapi_schema
|