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
@@ -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.
@@ -1,7 +0,0 @@
1
- adapters
2
- analyzers
3
- cli
4
- dispatchers
5
- generators
6
- openapi_schema
7
- validators
@@ -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