mcp-proxy-adapter 6.0.0__py3-none-any.whl → 6.1.1__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.
Files changed (264) hide show
  1. mcp_proxy_adapter/api/app.py +174 -80
  2. mcp_proxy_adapter/api/handlers.py +16 -5
  3. mcp_proxy_adapter/api/middleware/__init__.py +9 -4
  4. mcp_proxy_adapter/api/middleware/command_permission_middleware.py +148 -0
  5. mcp_proxy_adapter/api/middleware/factory.py +36 -12
  6. mcp_proxy_adapter/api/middleware/protocol_middleware.py +32 -13
  7. mcp_proxy_adapter/api/middleware/unified_security.py +160 -0
  8. mcp_proxy_adapter/api/middleware/user_info_middleware.py +83 -0
  9. mcp_proxy_adapter/commands/__init__.py +7 -1
  10. mcp_proxy_adapter/commands/base.py +7 -4
  11. mcp_proxy_adapter/commands/builtin_commands.py +8 -2
  12. mcp_proxy_adapter/commands/command_registry.py +8 -0
  13. mcp_proxy_adapter/commands/echo_command.py +81 -0
  14. mcp_proxy_adapter/commands/help_command.py +21 -14
  15. mcp_proxy_adapter/commands/proxy_registration_command.py +326 -185
  16. mcp_proxy_adapter/commands/role_test_command.py +141 -0
  17. mcp_proxy_adapter/commands/security_command.py +488 -0
  18. mcp_proxy_adapter/commands/ssl_setup_command.py +2 -2
  19. mcp_proxy_adapter/commands/token_management_command.py +1 -1
  20. mcp_proxy_adapter/config.py +81 -21
  21. mcp_proxy_adapter/core/app_factory.py +326 -0
  22. mcp_proxy_adapter/core/client_security.py +384 -0
  23. mcp_proxy_adapter/core/logging.py +8 -3
  24. mcp_proxy_adapter/core/mtls_asgi.py +156 -0
  25. mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
  26. mcp_proxy_adapter/core/protocol_manager.py +139 -8
  27. mcp_proxy_adapter/core/proxy_client.py +602 -0
  28. mcp_proxy_adapter/core/proxy_registration.py +299 -47
  29. mcp_proxy_adapter/core/security_adapter.py +12 -15
  30. mcp_proxy_adapter/core/security_integration.py +285 -0
  31. mcp_proxy_adapter/core/server_adapter.py +345 -0
  32. mcp_proxy_adapter/core/server_engine.py +364 -0
  33. mcp_proxy_adapter/core/unified_config_adapter.py +579 -0
  34. mcp_proxy_adapter/docs/EN/TROUBLESHOOTING.md +285 -0
  35. mcp_proxy_adapter/docs/RU/TROUBLESHOOTING.md +285 -0
  36. mcp_proxy_adapter/examples/README.md +230 -97
  37. mcp_proxy_adapter/examples/README_EN.md +258 -0
  38. mcp_proxy_adapter/examples/SECURITY_TESTING.md +455 -0
  39. mcp_proxy_adapter/examples/basic_framework/configs/http_auth.json +37 -0
  40. mcp_proxy_adapter/examples/basic_framework/configs/http_simple.json +23 -0
  41. mcp_proxy_adapter/examples/basic_framework/configs/https_auth.json +43 -0
  42. mcp_proxy_adapter/examples/basic_framework/configs/https_no_protocol_middleware.json +36 -0
  43. mcp_proxy_adapter/examples/basic_framework/configs/https_simple.json +29 -0
  44. mcp_proxy_adapter/examples/basic_framework/configs/mtls_no_protocol_middleware.json +34 -0
  45. mcp_proxy_adapter/examples/basic_framework/configs/mtls_no_roles.json +39 -0
  46. mcp_proxy_adapter/examples/basic_framework/configs/mtls_simple.json +35 -0
  47. mcp_proxy_adapter/examples/basic_framework/configs/mtls_with_roles.json +45 -0
  48. mcp_proxy_adapter/examples/basic_framework/main.py +63 -0
  49. mcp_proxy_adapter/examples/basic_framework/roles.json +21 -0
  50. mcp_proxy_adapter/examples/cert_config.json +9 -0
  51. mcp_proxy_adapter/examples/certs/admin.crt +32 -0
  52. mcp_proxy_adapter/examples/certs/admin.key +52 -0
  53. mcp_proxy_adapter/examples/certs/admin_cert.pem +21 -0
  54. mcp_proxy_adapter/examples/certs/admin_key.pem +28 -0
  55. mcp_proxy_adapter/examples/certs/ca_cert.pem +23 -0
  56. mcp_proxy_adapter/examples/certs/ca_cert.srl +1 -0
  57. mcp_proxy_adapter/examples/certs/ca_key.pem +28 -0
  58. mcp_proxy_adapter/examples/certs/cert_config.json +9 -0
  59. mcp_proxy_adapter/examples/certs/client.crt +32 -0
  60. mcp_proxy_adapter/examples/certs/client.key +52 -0
  61. mcp_proxy_adapter/examples/certs/client_admin.crt +32 -0
  62. mcp_proxy_adapter/examples/certs/client_admin.key +52 -0
  63. mcp_proxy_adapter/examples/certs/client_user.crt +32 -0
  64. mcp_proxy_adapter/examples/certs/client_user.key +52 -0
  65. mcp_proxy_adapter/examples/certs/guest_cert.pem +21 -0
  66. mcp_proxy_adapter/examples/certs/guest_key.pem +28 -0
  67. mcp_proxy_adapter/examples/certs/mcp_proxy_adapter_ca_ca.crt +23 -0
  68. mcp_proxy_adapter/examples/certs/proxy_cert.pem +21 -0
  69. mcp_proxy_adapter/examples/certs/proxy_key.pem +28 -0
  70. mcp_proxy_adapter/examples/certs/readonly.crt +32 -0
  71. mcp_proxy_adapter/examples/certs/readonly.key +52 -0
  72. mcp_proxy_adapter/examples/certs/readonly_cert.pem +21 -0
  73. mcp_proxy_adapter/examples/certs/readonly_key.pem +28 -0
  74. mcp_proxy_adapter/examples/certs/server.crt +32 -0
  75. mcp_proxy_adapter/examples/certs/server.key +52 -0
  76. mcp_proxy_adapter/examples/certs/server_cert.pem +32 -0
  77. mcp_proxy_adapter/examples/certs/server_key.pem +52 -0
  78. mcp_proxy_adapter/examples/certs/test_ca_ca.crt +20 -0
  79. mcp_proxy_adapter/examples/certs/user.crt +32 -0
  80. mcp_proxy_adapter/examples/certs/user.key +52 -0
  81. mcp_proxy_adapter/examples/certs/user_cert.pem +21 -0
  82. mcp_proxy_adapter/examples/certs/user_key.pem +28 -0
  83. mcp_proxy_adapter/examples/client_configs/api_key_client.json +13 -0
  84. mcp_proxy_adapter/examples/client_configs/basic_auth_client.json +13 -0
  85. mcp_proxy_adapter/examples/client_configs/certificate_client.json +22 -0
  86. mcp_proxy_adapter/examples/client_configs/jwt_client.json +15 -0
  87. mcp_proxy_adapter/examples/client_configs/no_auth_client.json +9 -0
  88. mcp_proxy_adapter/examples/commands/__init__.py +1 -0
  89. mcp_proxy_adapter/examples/create_certificates_simple.py +307 -0
  90. mcp_proxy_adapter/examples/debug_request_state.py +144 -0
  91. mcp_proxy_adapter/examples/debug_role_chain.py +205 -0
  92. mcp_proxy_adapter/examples/demo_client.py +341 -0
  93. mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +99 -0
  94. mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +106 -0
  95. mcp_proxy_adapter/examples/full_application/configs/http_auth.json +37 -0
  96. mcp_proxy_adapter/examples/full_application/configs/http_simple.json +23 -0
  97. mcp_proxy_adapter/examples/full_application/configs/https_auth.json +39 -0
  98. mcp_proxy_adapter/examples/full_application/configs/https_simple.json +25 -0
  99. mcp_proxy_adapter/examples/full_application/configs/mtls_no_roles.json +39 -0
  100. mcp_proxy_adapter/examples/full_application/configs/mtls_with_roles.json +45 -0
  101. mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +97 -0
  102. mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +95 -0
  103. mcp_proxy_adapter/examples/full_application/main.py +138 -0
  104. mcp_proxy_adapter/examples/full_application/roles.json +21 -0
  105. mcp_proxy_adapter/examples/generate_all_certificates.py +429 -0
  106. mcp_proxy_adapter/examples/generate_certificates.py +121 -0
  107. mcp_proxy_adapter/examples/keys/ca_key.pem +28 -0
  108. mcp_proxy_adapter/examples/keys/mcp_proxy_adapter_ca_ca.key +28 -0
  109. mcp_proxy_adapter/examples/keys/test_ca_ca.key +28 -0
  110. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log +220 -0
  111. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.1 +1 -0
  112. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.2 +1 -0
  113. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.3 +1 -0
  114. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.4 +1 -0
  115. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.5 +1 -0
  116. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log +220 -0
  117. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.1 +1 -0
  118. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.2 +1 -0
  119. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.3 +1 -0
  120. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.4 +1 -0
  121. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.5 +1 -0
  122. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log +2 -0
  123. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.1 +1 -0
  124. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.2 +1 -0
  125. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.3 +1 -0
  126. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.4 +1 -0
  127. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.5 +1 -0
  128. mcp_proxy_adapter/examples/proxy_registration_example.py +401 -0
  129. mcp_proxy_adapter/examples/roles.json +38 -0
  130. mcp_proxy_adapter/examples/run_example.py +81 -0
  131. mcp_proxy_adapter/examples/run_security_tests.py +326 -0
  132. mcp_proxy_adapter/examples/run_security_tests_fixed.py +300 -0
  133. mcp_proxy_adapter/examples/security_test_client.py +743 -0
  134. mcp_proxy_adapter/examples/server_configs/config_basic_http.json +204 -0
  135. mcp_proxy_adapter/examples/server_configs/config_http_token.json +238 -0
  136. mcp_proxy_adapter/examples/server_configs/config_https.json +215 -0
  137. mcp_proxy_adapter/examples/server_configs/config_https_token.json +231 -0
  138. mcp_proxy_adapter/examples/server_configs/config_mtls.json +215 -0
  139. mcp_proxy_adapter/examples/server_configs/config_proxy_registration.json +250 -0
  140. mcp_proxy_adapter/examples/server_configs/config_simple.json +46 -0
  141. mcp_proxy_adapter/examples/server_configs/roles.json +38 -0
  142. mcp_proxy_adapter/examples/test_config_generator.py +110 -0
  143. mcp_proxy_adapter/examples/test_examples.py +344 -0
  144. mcp_proxy_adapter/examples/universal_client.py +628 -0
  145. mcp_proxy_adapter/main.py +21 -10
  146. mcp_proxy_adapter/utils/config_generator.py +727 -0
  147. mcp_proxy_adapter/version.py +5 -2
  148. mcp_proxy_adapter-6.1.1.dist-info/METADATA +205 -0
  149. mcp_proxy_adapter-6.1.1.dist-info/RECORD +197 -0
  150. mcp_proxy_adapter-6.1.1.dist-info/entry_points.txt +2 -0
  151. {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.1.1.dist-info}/licenses/LICENSE +2 -2
  152. mcp_proxy_adapter/api/middleware/auth.py +0 -146
  153. mcp_proxy_adapter/api/middleware/auth_adapter.py +0 -235
  154. mcp_proxy_adapter/api/middleware/mtls_adapter.py +0 -305
  155. mcp_proxy_adapter/api/middleware/mtls_middleware.py +0 -296
  156. mcp_proxy_adapter/api/middleware/rate_limit.py +0 -152
  157. mcp_proxy_adapter/api/middleware/rate_limit_adapter.py +0 -241
  158. mcp_proxy_adapter/api/middleware/roles_adapter.py +0 -365
  159. mcp_proxy_adapter/api/middleware/roles_middleware.py +0 -381
  160. mcp_proxy_adapter/api/middleware/security.py +0 -376
  161. mcp_proxy_adapter/api/middleware/token_auth_middleware.py +0 -261
  162. mcp_proxy_adapter/examples/__init__.py +0 -7
  163. mcp_proxy_adapter/examples/basic_server/README.md +0 -60
  164. mcp_proxy_adapter/examples/basic_server/__init__.py +0 -7
  165. mcp_proxy_adapter/examples/basic_server/basic_custom_settings.json +0 -39
  166. mcp_proxy_adapter/examples/basic_server/config.json +0 -70
  167. mcp_proxy_adapter/examples/basic_server/config_all_protocols.json +0 -54
  168. mcp_proxy_adapter/examples/basic_server/config_http.json +0 -70
  169. mcp_proxy_adapter/examples/basic_server/config_http_only.json +0 -52
  170. mcp_proxy_adapter/examples/basic_server/config_https.json +0 -58
  171. mcp_proxy_adapter/examples/basic_server/config_mtls.json +0 -58
  172. mcp_proxy_adapter/examples/basic_server/config_ssl.json +0 -46
  173. mcp_proxy_adapter/examples/basic_server/custom_settings_example.py +0 -238
  174. mcp_proxy_adapter/examples/basic_server/server.py +0 -114
  175. mcp_proxy_adapter/examples/custom_commands/README.md +0 -127
  176. mcp_proxy_adapter/examples/custom_commands/__init__.py +0 -27
  177. mcp_proxy_adapter/examples/custom_commands/advanced_hooks.py +0 -566
  178. mcp_proxy_adapter/examples/custom_commands/auto_commands/__init__.py +0 -6
  179. mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_echo_command.py +0 -103
  180. mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_info_command.py +0 -111
  181. mcp_proxy_adapter/examples/custom_commands/auto_commands/test_command.py +0 -105
  182. mcp_proxy_adapter/examples/custom_commands/catalog/commands/test_command.py +0 -129
  183. mcp_proxy_adapter/examples/custom_commands/config.json +0 -118
  184. mcp_proxy_adapter/examples/custom_commands/config_all_protocols.json +0 -46
  185. mcp_proxy_adapter/examples/custom_commands/config_https_only.json +0 -46
  186. mcp_proxy_adapter/examples/custom_commands/config_https_transport.json +0 -33
  187. mcp_proxy_adapter/examples/custom_commands/config_mtls_only.json +0 -46
  188. mcp_proxy_adapter/examples/custom_commands/config_mtls_transport.json +0 -33
  189. mcp_proxy_adapter/examples/custom_commands/config_single_transport.json +0 -33
  190. mcp_proxy_adapter/examples/custom_commands/custom_health_command.py +0 -169
  191. mcp_proxy_adapter/examples/custom_commands/custom_help_command.py +0 -215
  192. mcp_proxy_adapter/examples/custom_commands/custom_openapi_generator.py +0 -76
  193. mcp_proxy_adapter/examples/custom_commands/custom_settings.json +0 -96
  194. mcp_proxy_adapter/examples/custom_commands/custom_settings_manager.py +0 -241
  195. mcp_proxy_adapter/examples/custom_commands/data_transform_command.py +0 -135
  196. mcp_proxy_adapter/examples/custom_commands/echo_command.py +0 -122
  197. mcp_proxy_adapter/examples/custom_commands/full_help_response.json +0 -1
  198. mcp_proxy_adapter/examples/custom_commands/generated_openapi.json +0 -629
  199. mcp_proxy_adapter/examples/custom_commands/get_openapi.py +0 -103
  200. mcp_proxy_adapter/examples/custom_commands/hooks.py +0 -230
  201. mcp_proxy_adapter/examples/custom_commands/intercept_command.py +0 -123
  202. mcp_proxy_adapter/examples/custom_commands/loadable_commands/test_ignored.py +0 -129
  203. mcp_proxy_adapter/examples/custom_commands/manual_echo_command.py +0 -103
  204. mcp_proxy_adapter/examples/custom_commands/proxy_connection_manager.py +0 -278
  205. mcp_proxy_adapter/examples/custom_commands/server.py +0 -252
  206. mcp_proxy_adapter/examples/custom_commands/simple_openapi_server.py +0 -75
  207. mcp_proxy_adapter/examples/custom_commands/start_server_with_proxy_manager.py +0 -299
  208. mcp_proxy_adapter/examples/custom_commands/start_server_with_registration.py +0 -278
  209. mcp_proxy_adapter/examples/custom_commands/test_hooks.py +0 -176
  210. mcp_proxy_adapter/examples/custom_commands/test_openapi.py +0 -27
  211. mcp_proxy_adapter/examples/custom_commands/test_registry.py +0 -23
  212. mcp_proxy_adapter/examples/custom_commands/test_simple.py +0 -19
  213. mcp_proxy_adapter/examples/custom_project_example/README.md +0 -103
  214. mcp_proxy_adapter/examples/custom_project_example/README_EN.md +0 -103
  215. mcp_proxy_adapter/examples/deployment/README.md +0 -49
  216. mcp_proxy_adapter/examples/deployment/__init__.py +0 -7
  217. mcp_proxy_adapter/examples/deployment/config.development.json +0 -8
  218. mcp_proxy_adapter/examples/deployment/config.json +0 -29
  219. mcp_proxy_adapter/examples/deployment/config.production.json +0 -12
  220. mcp_proxy_adapter/examples/deployment/config.staging.json +0 -11
  221. mcp_proxy_adapter/examples/deployment/docker-compose.yml +0 -31
  222. mcp_proxy_adapter/examples/deployment/run.sh +0 -43
  223. mcp_proxy_adapter/examples/deployment/run_docker.sh +0 -84
  224. mcp_proxy_adapter/examples/simple_custom_commands/README.md +0 -149
  225. mcp_proxy_adapter/examples/simple_custom_commands/README_EN.md +0 -149
  226. mcp_proxy_adapter/schemas/base_schema.json +0 -114
  227. mcp_proxy_adapter/schemas/openapi_schema.json +0 -314
  228. mcp_proxy_adapter/schemas/roles_schema.json +0 -162
  229. mcp_proxy_adapter/tests/__init__.py +0 -0
  230. mcp_proxy_adapter/tests/api/__init__.py +0 -3
  231. mcp_proxy_adapter/tests/api/test_cmd_endpoint.py +0 -115
  232. mcp_proxy_adapter/tests/api/test_custom_openapi.py +0 -617
  233. mcp_proxy_adapter/tests/api/test_handlers.py +0 -522
  234. mcp_proxy_adapter/tests/api/test_middleware.py +0 -340
  235. mcp_proxy_adapter/tests/api/test_schemas.py +0 -546
  236. mcp_proxy_adapter/tests/api/test_tool_integration.py +0 -531
  237. mcp_proxy_adapter/tests/commands/__init__.py +0 -3
  238. mcp_proxy_adapter/tests/commands/test_config_command.py +0 -211
  239. mcp_proxy_adapter/tests/commands/test_echo_command.py +0 -127
  240. mcp_proxy_adapter/tests/commands/test_help_command.py +0 -136
  241. mcp_proxy_adapter/tests/conftest.py +0 -131
  242. mcp_proxy_adapter/tests/functional/__init__.py +0 -3
  243. mcp_proxy_adapter/tests/functional/test_api.py +0 -253
  244. mcp_proxy_adapter/tests/integration/__init__.py +0 -3
  245. mcp_proxy_adapter/tests/integration/test_cmd_integration.py +0 -129
  246. mcp_proxy_adapter/tests/integration/test_integration.py +0 -255
  247. mcp_proxy_adapter/tests/performance/__init__.py +0 -3
  248. mcp_proxy_adapter/tests/performance/test_performance.py +0 -189
  249. mcp_proxy_adapter/tests/stubs/__init__.py +0 -10
  250. mcp_proxy_adapter/tests/stubs/echo_command.py +0 -104
  251. mcp_proxy_adapter/tests/test_api_endpoints.py +0 -271
  252. mcp_proxy_adapter/tests/test_api_handlers.py +0 -289
  253. mcp_proxy_adapter/tests/test_base_command.py +0 -123
  254. mcp_proxy_adapter/tests/test_batch_requests.py +0 -117
  255. mcp_proxy_adapter/tests/test_command_registry.py +0 -281
  256. mcp_proxy_adapter/tests/test_config.py +0 -127
  257. mcp_proxy_adapter/tests/test_utils.py +0 -65
  258. mcp_proxy_adapter/tests/unit/__init__.py +0 -3
  259. mcp_proxy_adapter/tests/unit/test_base_command.py +0 -436
  260. mcp_proxy_adapter/tests/unit/test_config.py +0 -270
  261. mcp_proxy_adapter-6.0.0.dist-info/METADATA +0 -201
  262. mcp_proxy_adapter-6.0.0.dist-info/RECORD +0 -179
  263. {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.1.1.dist-info}/WHEEL +0 -0
  264. {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.1.1.dist-info}/top_level.txt +0 -0
@@ -1,314 +0,0 @@
1
- {
2
- "openapi": "3.0.2",
3
- "info": {
4
- "title": "MCP Microservice API",
5
- "description": "API для выполнения команд микросервиса",
6
- "version": "1.0.0"
7
- },
8
- "paths": {
9
- "/cmd": {
10
- "post": {
11
- "summary": "Execute Command",
12
- "description": "Executes a command via JSON-RPC protocol.",
13
- "operationId": "execute_command",
14
- "requestBody": {
15
- "content": {
16
- "application/json": {
17
- "schema": {
18
- "oneOf": [
19
- { "$ref": "#/components/schemas/CommandRequest" },
20
- { "$ref": "#/components/schemas/JsonRpcRequest" }
21
- ]
22
- }
23
- }
24
- },
25
- "required": true
26
- },
27
- "responses": {
28
- "200": {
29
- "description": "Successful Response",
30
- "content": {
31
- "application/json": {
32
- "schema": {
33
- "oneOf": [
34
- { "$ref": "#/components/schemas/CommandResponse" },
35
- { "$ref": "#/components/schemas/JsonRpcResponse" }
36
- ]
37
- }
38
- }
39
- }
40
- },
41
- "422": {
42
- "description": "Validation Error",
43
- "content": {
44
- "application/json": {
45
- "schema": {
46
- "$ref": "#/components/schemas/HTTPValidationError"
47
- }
48
- }
49
- }
50
- }
51
- }
52
- }
53
- },
54
- "/health": {
55
- "get": {
56
- "summary": "Проверить работоспособность сервиса",
57
- "description": "Возвращает информацию о состоянии сервиса",
58
- "operationId": "health_check",
59
- "responses": {
60
- "200": {
61
- "description": "Информация о состоянии сервиса",
62
- "content": {
63
- "application/json": {
64
- "schema": {
65
- "$ref": "#/components/schemas/HealthResponse"
66
- }
67
- }
68
- }
69
- }
70
- }
71
- }
72
- },
73
- "/openapi.json": {
74
- "get": {
75
- "summary": "Get Openapi Schema",
76
- "description": "Returns OpenAPI schema.",
77
- "operationId": "get_openapi_schema_openapi_json_get",
78
- "responses": {
79
- "200": {
80
- "description": "Successful Response",
81
- "content": {
82
- "application/json": {
83
- "schema": {}
84
- }
85
- }
86
- }
87
- }
88
- }
89
- },
90
- "/api/commands": {
91
- "get": {
92
- "summary": "Get Commands",
93
- "description": "Returns list of available commands with their descriptions.",
94
- "operationId": "get_commands_api_commands_get",
95
- "responses": {
96
- "200": {
97
- "description": "Successful Response",
98
- "content": {
99
- "application/json": {
100
- "schema": {}
101
- }
102
- }
103
- }
104
- }
105
- }
106
- }
107
- },
108
- "components": {
109
- "schemas": {
110
- "CommandRequest": {
111
- "title": "CommandRequest",
112
- "description": "Запрос на выполнение команды",
113
- "type": "object",
114
- "required": [
115
- "command"
116
- ],
117
- "properties": {
118
- "command": {
119
- "title": "Command",
120
- "description": "Команда для выполнения",
121
- "type": "string"
122
- },
123
- "params": {
124
- "title": "Parameters",
125
- "description": "Параметры команды, зависят от типа команды",
126
- "type": "object",
127
- "additionalProperties": true
128
- }
129
- }
130
- },
131
- "CommandResponse": {
132
- "title": "CommandResponse",
133
- "description": "Ответ на выполнение команды",
134
- "type": "object",
135
- "required": [
136
- "result"
137
- ],
138
- "properties": {
139
- "result": {
140
- "title": "Result",
141
- "description": "Результат выполнения команды"
142
- }
143
- }
144
- },
145
- "JsonRpcRequest": {
146
- "properties": {
147
- "jsonrpc": {
148
- "type": "string",
149
- "title": "Jsonrpc",
150
- "description": "JSON-RPC version",
151
- "default": "2.0"
152
- },
153
- "method": {
154
- "type": "string",
155
- "title": "Method",
156
- "description": "Method name to call"
157
- },
158
- "params": {
159
- "additionalProperties": true,
160
- "type": "object",
161
- "title": "Params",
162
- "description": "Method parameters",
163
- "default": {}
164
- },
165
- "id": {
166
- "anyOf": [
167
- {
168
- "type": "string"
169
- },
170
- {
171
- "type": "integer"
172
- },
173
- {
174
- "type": "null"
175
- }
176
- ],
177
- "title": "Id",
178
- "description": "Request identifier"
179
- }
180
- },
181
- "type": "object",
182
- "required": [
183
- "method"
184
- ],
185
- "title": "JsonRpcRequest",
186
- "description": "Base model for JSON-RPC requests."
187
- },
188
- "JsonRpcResponse": {
189
- "properties": {
190
- "jsonrpc": {
191
- "type": "string",
192
- "title": "Jsonrpc",
193
- "description": "JSON-RPC version",
194
- "default": "2.0"
195
- },
196
- "result": {
197
- "anyOf": [
198
- {},
199
- {
200
- "type": "null"
201
- }
202
- ],
203
- "title": "Result",
204
- "description": "Method execution result"
205
- },
206
- "error": {
207
- "anyOf": [
208
- {
209
- "additionalProperties": true,
210
- "type": "object"
211
- },
212
- {
213
- "type": "null"
214
- }
215
- ],
216
- "title": "Error",
217
- "description": "Error information"
218
- },
219
- "id": {
220
- "anyOf": [
221
- {
222
- "type": "string"
223
- },
224
- {
225
- "type": "integer"
226
- },
227
- {
228
- "type": "null"
229
- }
230
- ],
231
- "title": "Id",
232
- "description": "Request identifier"
233
- }
234
- },
235
- "type": "object",
236
- "title": "JsonRpcResponse",
237
- "description": "Base model for JSON-RPC responses."
238
- },
239
- "HealthResponse": {
240
- "title": "HealthResponse",
241
- "description": "Информация о состоянии сервиса",
242
- "type": "object",
243
- "required": [
244
- "status",
245
- "model",
246
- "version"
247
- ],
248
- "properties": {
249
- "status": {
250
- "title": "Status",
251
- "description": "Статус сервиса (ok/error)",
252
- "type": "string"
253
- },
254
- "model": {
255
- "title": "Model",
256
- "description": "Текущая активная модель",
257
- "type": "string"
258
- },
259
- "version": {
260
- "title": "Version",
261
- "description": "Версия сервиса",
262
- "type": "string"
263
- }
264
- }
265
- },
266
- "HTTPValidationError": {
267
- "properties": {
268
- "detail": {
269
- "items": {
270
- "$ref": "#/components/schemas/ValidationError"
271
- },
272
- "type": "array",
273
- "title": "Detail"
274
- }
275
- },
276
- "type": "object",
277
- "title": "HTTPValidationError"
278
- },
279
- "ValidationError": {
280
- "properties": {
281
- "loc": {
282
- "items": {
283
- "anyOf": [
284
- {
285
- "type": "string"
286
- },
287
- {
288
- "type": "integer"
289
- }
290
- ]
291
- },
292
- "type": "array",
293
- "title": "Location"
294
- },
295
- "msg": {
296
- "type": "string",
297
- "title": "Message"
298
- },
299
- "type": {
300
- "type": "string",
301
- "title": "Error Type"
302
- }
303
- },
304
- "type": "object",
305
- "required": [
306
- "loc",
307
- "msg",
308
- "type"
309
- ],
310
- "title": "ValidationError"
311
- }
312
- }
313
- }
314
- }
@@ -1,162 +0,0 @@
1
- {
2
- "roles": {
3
- "admin": {
4
- "description": "Administrator with full access",
5
- "allowed_servers": ["*"],
6
- "allowed_clients": ["*"],
7
- "permissions": ["read", "write", "delete", "admin"],
8
- "priority": 100
9
- },
10
- "super-admin": {
11
- "description": "Super administrator with system-level access",
12
- "allowed_servers": ["*"],
13
- "allowed_clients": ["*"],
14
- "permissions": ["read", "write", "delete", "admin", "system"],
15
- "priority": 200
16
- },
17
- "kubernetes_service": {
18
- "description": "Kubernetes service with cluster management access",
19
- "allowed_servers": ["kubernetes_manager", "kubernetes_api", "cluster_monitor", "k8s_operator"],
20
- "allowed_clients": ["admin", "super-admin", "kubernetes_service", "ca_root", "ca_intermediate"],
21
- "permissions": ["read", "write", "system"],
22
- "priority": 120
23
- },
24
- "ca_root": {
25
- "description": "Root Certificate Authority with full certificate management",
26
- "allowed_servers": ["*"],
27
- "allowed_clients": ["admin", "super-admin", "ca_root", "ca_intermediate"],
28
- "permissions": ["read", "write", "delete", "admin", "system"],
29
- "priority": 180
30
- },
31
- "ca_intermediate": {
32
- "description": "Intermediate Certificate Authority with delegated certificate management",
33
- "allowed_servers": ["certificate_manager", "ssl_manager", "tls_manager"],
34
- "allowed_clients": ["admin", "super-admin", "ca_root", "ca_intermediate", "kubernetes_service"],
35
- "permissions": ["read", "write", "admin"],
36
- "priority": 140
37
- },
38
- "operator": {
39
- "description": "Operator with limited access",
40
- "allowed_servers": ["kubernetes_manager", "docker_manager", "monitor", "aiadm"],
41
- "allowed_clients": ["admin", "super-admin", "operator"],
42
- "permissions": ["read", "write"],
43
- "priority": 50
44
- },
45
- "user": {
46
- "description": "Regular user with basic access",
47
- "allowed_servers": ["basic_commands", "info_commands"],
48
- "allowed_clients": ["admin", "super-admin", "operator", "user"],
49
- "permissions": ["read"],
50
- "priority": 10
51
- },
52
- "guest": {
53
- "description": "Guest user with minimal access",
54
- "allowed_servers": ["help", "info"],
55
- "allowed_clients": ["admin", "super-admin", "operator", "user", "guest"],
56
- "permissions": ["read"],
57
- "priority": 1
58
- },
59
- "system": {
60
- "description": "System service with internal access",
61
- "allowed_servers": ["*"],
62
- "allowed_clients": ["admin", "super-admin", "system"],
63
- "permissions": ["read", "write", "system"],
64
- "priority": 150
65
- }
66
- },
67
- "default_policy": {
68
- "deny_by_default": true,
69
- "require_role_match": true,
70
- "case_sensitive": false,
71
- "allow_wildcard": true
72
- },
73
- "role_hierarchy": {
74
- "super-admin": ["admin", "user"],
75
- "admin": ["operator", "user"],
76
- "kubernetes_service": ["operator", "user"],
77
- "ca_root": ["admin", "ca_intermediate", "kubernetes_service"],
78
- "ca_intermediate": ["operator", "user"],
79
- "operator": ["user"],
80
- "user": ["guest"],
81
- "system": ["admin", "user"]
82
- },
83
- "permissions": {
84
- "read": {
85
- "description": "Read access to data and commands",
86
- "level": 1
87
- },
88
- "write": {
89
- "description": "Write access to data and commands",
90
- "level": 2
91
- },
92
- "delete": {
93
- "description": "Delete access to data and commands",
94
- "level": 3
95
- },
96
- "admin": {
97
- "description": "Administrative access",
98
- "level": 4
99
- },
100
- "system": {
101
- "description": "System-level access",
102
- "level": 5
103
- }
104
- },
105
- "server_roles": {
106
- "kubernetes_manager": {
107
- "description": "Kubernetes management server",
108
- "required_roles": ["admin", "operator", "kubernetes_service"],
109
- "allowed_commands": ["k8s_*", "system_monitor"]
110
- },
111
- "kubernetes_api": {
112
- "description": "Kubernetes API server",
113
- "required_roles": ["kubernetes_service", "admin"],
114
- "allowed_commands": ["k8s_api_*", "cluster_*"]
115
- },
116
- "cluster_monitor": {
117
- "description": "Kubernetes cluster monitoring server",
118
- "required_roles": ["kubernetes_service", "admin"],
119
- "allowed_commands": ["monitor_*", "metrics_*"]
120
- },
121
- "k8s_operator": {
122
- "description": "Kubernetes operator server",
123
- "required_roles": ["kubernetes_service", "admin"],
124
- "allowed_commands": ["operator_*", "crd_*"]
125
- },
126
- "certificate_manager": {
127
- "description": "Certificate management server",
128
- "required_roles": ["ca_root", "ca_intermediate", "admin"],
129
- "allowed_commands": ["cert_*", "ca_*", "ssl_*"]
130
- },
131
- "ssl_manager": {
132
- "description": "SSL/TLS management server",
133
- "required_roles": ["ca_intermediate", "admin"],
134
- "allowed_commands": ["ssl_*", "tls_*", "cert_*"]
135
- },
136
- "tls_manager": {
137
- "description": "TLS management server",
138
- "required_roles": ["ca_intermediate", "admin"],
139
- "allowed_commands": ["tls_*", "mtls_*", "cert_*"]
140
- },
141
- "docker_manager": {
142
- "description": "Docker management server",
143
- "required_roles": ["admin", "operator"],
144
- "allowed_commands": ["docker_*", "system_monitor"]
145
- },
146
- "aiadm": {
147
- "description": "AI Admin server",
148
- "required_roles": ["admin", "operator"],
149
- "allowed_commands": ["*"]
150
- },
151
- "basic_commands": {
152
- "description": "Basic command server",
153
- "required_roles": ["user", "admin", "operator"],
154
- "allowed_commands": ["help", "config", "health", "info"]
155
- },
156
- "help": {
157
- "description": "Help server",
158
- "required_roles": ["guest", "user", "admin", "operator"],
159
- "allowed_commands": ["help"]
160
- }
161
- }
162
- }
File without changes
@@ -1,3 +0,0 @@
1
- """
2
- API tests package.
3
- """
@@ -1,115 +0,0 @@
1
- """
2
- Tests for the /cmd endpoint.
3
- """
4
-
5
- import pytest
6
- from unittest.mock import patch, MagicMock, ANY
7
- from fastapi.testclient import TestClient
8
-
9
- from mcp_proxy_adapter.api.app import app
10
- from mcp_proxy_adapter.commands.command_registry import registry
11
- from mcp_proxy_adapter.core.errors import MicroserviceError
12
-
13
-
14
- @pytest.fixture
15
- def client():
16
- """Test client for FastAPI app."""
17
- return TestClient(app)
18
-
19
-
20
- @pytest.fixture
21
- def mock_registry():
22
- """Mock for command registry."""
23
- with patch("mcp_proxy_adapter.api.app.registry") as mock_reg:
24
- yield mock_reg
25
-
26
-
27
- @pytest.fixture
28
- def mock_execute_command():
29
- """Mock for execute_command function."""
30
- with patch("mcp_proxy_adapter.api.app.execute_command") as mock_exec:
31
- yield mock_exec
32
-
33
-
34
- def test_cmd_endpoint_basic(client, mock_registry, mock_execute_command):
35
- """Test basic execution of /cmd endpoint."""
36
- # Setup mocks
37
- mock_registry.command_exists.return_value = True
38
- mock_execute_command.return_value = {"key": "value"}
39
-
40
- # Send request
41
- response = client.post(
42
- "/cmd",
43
- json={"command": "test_command", "params": {"param1": "value1"}}
44
- )
45
-
46
- # Check result
47
- assert response.status_code == 200
48
- assert response.json() == {"result": {"key": "value"}}
49
-
50
- # Verify mock calls with ANY for request_id since it can be dynamic
51
- mock_registry.command_exists.assert_called_once_with("test_command")
52
- mock_execute_command.assert_called_once_with(
53
- "test_command", {"param1": "value1"}, ANY
54
- )
55
-
56
-
57
- def test_cmd_endpoint_missing_command(client):
58
- """Test /cmd endpoint with missing 'command' field."""
59
- response = client.post("/cmd", json={})
60
-
61
- assert response.status_code == 200
62
- assert "error" in response.json()
63
- assert response.json()["error"]["code"] == -32600
64
- assert "Отсутствует обязательное поле 'command'" in response.json()["error"]["message"]
65
-
66
-
67
- def test_cmd_endpoint_command_not_found(client, mock_registry):
68
- """Test /cmd endpoint with non-existent command."""
69
- # Setup mocks
70
- mock_registry.command_exists.return_value = False
71
-
72
- # Send request
73
- response = client.post("/cmd", json={"command": "non_existent"})
74
-
75
- # Check result
76
- assert response.status_code == 200
77
- assert "error" in response.json()
78
- assert response.json()["error"]["code"] == -32601
79
- assert "не найдена" in response.json()["error"]["message"]
80
-
81
-
82
- def test_cmd_endpoint_error_handling(client, mock_registry, mock_execute_command):
83
- """Test error handling in /cmd endpoint."""
84
- # Setup mocks
85
- mock_registry.command_exists.return_value = True
86
-
87
- error = MicroserviceError("Test error", code=-32000)
88
- error.to_dict = MagicMock(return_value={"code": -32000, "message": "Test error"})
89
- mock_execute_command.side_effect = error
90
-
91
- # Send request
92
- response = client.post("/cmd", json={"command": "test_command"})
93
-
94
- # Check result
95
- assert response.status_code == 200
96
- assert "error" in response.json()
97
- assert response.json()["error"]["code"] == -32000
98
- assert response.json()["error"]["message"] == "Test error"
99
-
100
-
101
- def test_cmd_endpoint_internal_error(client, mock_registry, mock_execute_command):
102
- """Test internal error handling in /cmd endpoint."""
103
- # Setup mocks
104
- mock_registry.command_exists.return_value = True
105
- mock_execute_command.side_effect = Exception("Unexpected error")
106
-
107
- # Send request
108
- response = client.post("/cmd", json={"command": "test_command"})
109
-
110
- # Check result
111
- assert response.status_code == 200
112
- assert "error" in response.json()
113
- assert response.json()["error"]["code"] == -32603
114
- assert "Internal error" in response.json()["error"]["message"]
115
- assert "Unexpected error" in response.json()["error"]["data"]["details"]