mcp-proxy-adapter 6.0.0__py3-none-any.whl → 6.0.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.
- mcp_proxy_adapter/__main__.py +27 -7
- mcp_proxy_adapter/api/app.py +209 -79
- mcp_proxy_adapter/api/handlers.py +16 -5
- mcp_proxy_adapter/api/middleware/__init__.py +14 -9
- mcp_proxy_adapter/api/middleware/command_permission_middleware.py +148 -0
- mcp_proxy_adapter/api/middleware/factory.py +36 -12
- mcp_proxy_adapter/api/middleware/protocol_middleware.py +84 -18
- mcp_proxy_adapter/api/middleware/unified_security.py +197 -0
- mcp_proxy_adapter/api/middleware/user_info_middleware.py +158 -0
- mcp_proxy_adapter/commands/__init__.py +7 -1
- mcp_proxy_adapter/commands/base.py +7 -4
- mcp_proxy_adapter/commands/builtin_commands.py +8 -2
- mcp_proxy_adapter/commands/command_registry.py +8 -0
- mcp_proxy_adapter/commands/echo_command.py +81 -0
- mcp_proxy_adapter/commands/health_command.py +1 -1
- mcp_proxy_adapter/commands/help_command.py +21 -14
- mcp_proxy_adapter/commands/proxy_registration_command.py +326 -185
- mcp_proxy_adapter/commands/role_test_command.py +141 -0
- mcp_proxy_adapter/commands/security_command.py +488 -0
- mcp_proxy_adapter/commands/ssl_setup_command.py +234 -351
- mcp_proxy_adapter/commands/token_management_command.py +1 -1
- mcp_proxy_adapter/config.py +323 -40
- mcp_proxy_adapter/core/app_factory.py +410 -0
- mcp_proxy_adapter/core/app_runner.py +272 -0
- mcp_proxy_adapter/core/certificate_utils.py +291 -73
- mcp_proxy_adapter/core/client.py +574 -0
- mcp_proxy_adapter/core/client_manager.py +284 -0
- mcp_proxy_adapter/core/client_security.py +384 -0
- mcp_proxy_adapter/core/logging.py +8 -3
- mcp_proxy_adapter/core/mtls_asgi.py +156 -0
- mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
- mcp_proxy_adapter/core/protocol_manager.py +169 -10
- mcp_proxy_adapter/core/proxy_client.py +602 -0
- mcp_proxy_adapter/core/proxy_registration.py +299 -47
- mcp_proxy_adapter/core/security_adapter.py +12 -15
- mcp_proxy_adapter/core/security_integration.py +286 -0
- mcp_proxy_adapter/core/server_adapter.py +282 -0
- mcp_proxy_adapter/core/server_engine.py +270 -0
- mcp_proxy_adapter/core/ssl_utils.py +13 -12
- mcp_proxy_adapter/core/transport_manager.py +5 -5
- mcp_proxy_adapter/core/unified_config_adapter.py +579 -0
- mcp_proxy_adapter/examples/__init__.py +13 -4
- 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 +44 -0
- mcp_proxy_adapter/examples/commands/__init__.py +5 -0
- mcp_proxy_adapter/examples/create_certificates_simple.py +550 -0
- mcp_proxy_adapter/examples/debug_request_state.py +112 -0
- mcp_proxy_adapter/examples/debug_role_chain.py +158 -0
- mcp_proxy_adapter/examples/demo_client.py +275 -0
- mcp_proxy_adapter/examples/examples/basic_framework/__init__.py +9 -0
- mcp_proxy_adapter/examples/examples/basic_framework/commands/__init__.py +4 -0
- mcp_proxy_adapter/examples/examples/basic_framework/hooks/__init__.py +4 -0
- mcp_proxy_adapter/examples/examples/basic_framework/main.py +44 -0
- mcp_proxy_adapter/examples/examples/full_application/__init__.py +12 -0
- mcp_proxy_adapter/examples/examples/full_application/commands/__init__.py +7 -0
- mcp_proxy_adapter/examples/examples/full_application/commands/custom_echo_command.py +80 -0
- mcp_proxy_adapter/examples/examples/full_application/commands/dynamic_calculator_command.py +90 -0
- mcp_proxy_adapter/examples/examples/full_application/hooks/__init__.py +7 -0
- mcp_proxy_adapter/examples/examples/full_application/hooks/application_hooks.py +75 -0
- mcp_proxy_adapter/examples/examples/full_application/hooks/builtin_command_hooks.py +71 -0
- mcp_proxy_adapter/examples/examples/full_application/main.py +173 -0
- mcp_proxy_adapter/examples/examples/full_application/proxy_endpoints.py +154 -0
- mcp_proxy_adapter/examples/full_application/__init__.py +12 -0
- mcp_proxy_adapter/examples/full_application/commands/__init__.py +7 -0
- mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +80 -0
- mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +90 -0
- mcp_proxy_adapter/examples/full_application/hooks/__init__.py +7 -0
- mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +75 -0
- mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +71 -0
- mcp_proxy_adapter/examples/full_application/main.py +173 -0
- mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +154 -0
- mcp_proxy_adapter/examples/generate_all_certificates.py +362 -0
- mcp_proxy_adapter/examples/generate_certificates.py +177 -0
- mcp_proxy_adapter/examples/generate_certificates_and_tokens.py +369 -0
- mcp_proxy_adapter/examples/generate_test_configs.py +331 -0
- mcp_proxy_adapter/examples/proxy_registration_example.py +334 -0
- mcp_proxy_adapter/examples/run_example.py +59 -0
- mcp_proxy_adapter/examples/run_full_test_suite.py +318 -0
- mcp_proxy_adapter/examples/run_proxy_server.py +146 -0
- mcp_proxy_adapter/examples/run_security_tests.py +544 -0
- mcp_proxy_adapter/examples/run_security_tests_fixed.py +247 -0
- mcp_proxy_adapter/examples/scripts/config_generator.py +740 -0
- mcp_proxy_adapter/examples/scripts/create_certificates_simple.py +560 -0
- mcp_proxy_adapter/examples/scripts/generate_certificates_and_tokens.py +369 -0
- mcp_proxy_adapter/examples/security_test_client.py +782 -0
- mcp_proxy_adapter/examples/setup_test_environment.py +328 -0
- mcp_proxy_adapter/examples/test_config.py +148 -0
- mcp_proxy_adapter/examples/test_config_generator.py +86 -0
- mcp_proxy_adapter/examples/test_examples.py +281 -0
- mcp_proxy_adapter/examples/universal_client.py +620 -0
- mcp_proxy_adapter/main.py +66 -148
- mcp_proxy_adapter/utils/config_generator.py +1008 -0
- mcp_proxy_adapter/version.py +5 -2
- mcp_proxy_adapter-6.0.1.dist-info/METADATA +679 -0
- mcp_proxy_adapter-6.0.1.dist-info/RECORD +140 -0
- mcp_proxy_adapter-6.0.1.dist-info/entry_points.txt +2 -0
- {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.0.1.dist-info}/licenses/LICENSE +2 -2
- mcp_proxy_adapter/api/middleware/auth.py +0 -146
- mcp_proxy_adapter/api/middleware/auth_adapter.py +0 -235
- mcp_proxy_adapter/api/middleware/mtls_adapter.py +0 -305
- mcp_proxy_adapter/api/middleware/mtls_middleware.py +0 -296
- mcp_proxy_adapter/api/middleware/rate_limit.py +0 -152
- mcp_proxy_adapter/api/middleware/rate_limit_adapter.py +0 -241
- mcp_proxy_adapter/api/middleware/roles_adapter.py +0 -365
- mcp_proxy_adapter/api/middleware/roles_middleware.py +0 -381
- mcp_proxy_adapter/api/middleware/security.py +0 -376
- mcp_proxy_adapter/api/middleware/token_auth_middleware.py +0 -261
- mcp_proxy_adapter/examples/README.md +0 -124
- mcp_proxy_adapter/examples/basic_server/README.md +0 -60
- mcp_proxy_adapter/examples/basic_server/__init__.py +0 -7
- mcp_proxy_adapter/examples/basic_server/basic_custom_settings.json +0 -39
- mcp_proxy_adapter/examples/basic_server/config.json +0 -70
- mcp_proxy_adapter/examples/basic_server/config_all_protocols.json +0 -54
- mcp_proxy_adapter/examples/basic_server/config_http.json +0 -70
- mcp_proxy_adapter/examples/basic_server/config_http_only.json +0 -52
- mcp_proxy_adapter/examples/basic_server/config_https.json +0 -58
- mcp_proxy_adapter/examples/basic_server/config_mtls.json +0 -58
- mcp_proxy_adapter/examples/basic_server/config_ssl.json +0 -46
- mcp_proxy_adapter/examples/basic_server/custom_settings_example.py +0 -238
- mcp_proxy_adapter/examples/basic_server/server.py +0 -114
- mcp_proxy_adapter/examples/custom_commands/README.md +0 -127
- mcp_proxy_adapter/examples/custom_commands/__init__.py +0 -27
- mcp_proxy_adapter/examples/custom_commands/advanced_hooks.py +0 -566
- mcp_proxy_adapter/examples/custom_commands/auto_commands/__init__.py +0 -6
- mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_echo_command.py +0 -103
- mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_info_command.py +0 -111
- mcp_proxy_adapter/examples/custom_commands/auto_commands/test_command.py +0 -105
- mcp_proxy_adapter/examples/custom_commands/catalog/commands/test_command.py +0 -129
- mcp_proxy_adapter/examples/custom_commands/config.json +0 -118
- mcp_proxy_adapter/examples/custom_commands/config_all_protocols.json +0 -46
- mcp_proxy_adapter/examples/custom_commands/config_https_only.json +0 -46
- mcp_proxy_adapter/examples/custom_commands/config_https_transport.json +0 -33
- mcp_proxy_adapter/examples/custom_commands/config_mtls_only.json +0 -46
- mcp_proxy_adapter/examples/custom_commands/config_mtls_transport.json +0 -33
- mcp_proxy_adapter/examples/custom_commands/config_single_transport.json +0 -33
- mcp_proxy_adapter/examples/custom_commands/custom_health_command.py +0 -169
- mcp_proxy_adapter/examples/custom_commands/custom_help_command.py +0 -215
- mcp_proxy_adapter/examples/custom_commands/custom_openapi_generator.py +0 -76
- mcp_proxy_adapter/examples/custom_commands/custom_settings.json +0 -96
- mcp_proxy_adapter/examples/custom_commands/custom_settings_manager.py +0 -241
- mcp_proxy_adapter/examples/custom_commands/data_transform_command.py +0 -135
- mcp_proxy_adapter/examples/custom_commands/echo_command.py +0 -122
- mcp_proxy_adapter/examples/custom_commands/full_help_response.json +0 -1
- mcp_proxy_adapter/examples/custom_commands/generated_openapi.json +0 -629
- mcp_proxy_adapter/examples/custom_commands/get_openapi.py +0 -103
- mcp_proxy_adapter/examples/custom_commands/hooks.py +0 -230
- mcp_proxy_adapter/examples/custom_commands/intercept_command.py +0 -123
- mcp_proxy_adapter/examples/custom_commands/loadable_commands/test_ignored.py +0 -129
- mcp_proxy_adapter/examples/custom_commands/manual_echo_command.py +0 -103
- mcp_proxy_adapter/examples/custom_commands/proxy_connection_manager.py +0 -278
- mcp_proxy_adapter/examples/custom_commands/server.py +0 -252
- mcp_proxy_adapter/examples/custom_commands/simple_openapi_server.py +0 -75
- mcp_proxy_adapter/examples/custom_commands/start_server_with_proxy_manager.py +0 -299
- mcp_proxy_adapter/examples/custom_commands/start_server_with_registration.py +0 -278
- mcp_proxy_adapter/examples/custom_commands/test_hooks.py +0 -176
- mcp_proxy_adapter/examples/custom_commands/test_openapi.py +0 -27
- mcp_proxy_adapter/examples/custom_commands/test_registry.py +0 -23
- mcp_proxy_adapter/examples/custom_commands/test_simple.py +0 -19
- mcp_proxy_adapter/examples/custom_project_example/README.md +0 -103
- mcp_proxy_adapter/examples/custom_project_example/README_EN.md +0 -103
- mcp_proxy_adapter/examples/deployment/README.md +0 -49
- mcp_proxy_adapter/examples/deployment/__init__.py +0 -7
- mcp_proxy_adapter/examples/deployment/config.development.json +0 -8
- mcp_proxy_adapter/examples/deployment/config.json +0 -29
- mcp_proxy_adapter/examples/deployment/config.production.json +0 -12
- mcp_proxy_adapter/examples/deployment/config.staging.json +0 -11
- mcp_proxy_adapter/examples/deployment/docker-compose.yml +0 -31
- mcp_proxy_adapter/examples/deployment/run.sh +0 -43
- mcp_proxy_adapter/examples/deployment/run_docker.sh +0 -84
- mcp_proxy_adapter/examples/simple_custom_commands/README.md +0 -149
- mcp_proxy_adapter/examples/simple_custom_commands/README_EN.md +0 -149
- mcp_proxy_adapter/schemas/base_schema.json +0 -114
- mcp_proxy_adapter/schemas/openapi_schema.json +0 -314
- mcp_proxy_adapter/schemas/roles_schema.json +0 -162
- mcp_proxy_adapter/tests/__init__.py +0 -0
- mcp_proxy_adapter/tests/api/__init__.py +0 -3
- mcp_proxy_adapter/tests/api/test_cmd_endpoint.py +0 -115
- mcp_proxy_adapter/tests/api/test_custom_openapi.py +0 -617
- mcp_proxy_adapter/tests/api/test_handlers.py +0 -522
- mcp_proxy_adapter/tests/api/test_middleware.py +0 -340
- mcp_proxy_adapter/tests/api/test_schemas.py +0 -546
- mcp_proxy_adapter/tests/api/test_tool_integration.py +0 -531
- mcp_proxy_adapter/tests/commands/__init__.py +0 -3
- mcp_proxy_adapter/tests/commands/test_config_command.py +0 -211
- mcp_proxy_adapter/tests/commands/test_echo_command.py +0 -127
- mcp_proxy_adapter/tests/commands/test_help_command.py +0 -136
- mcp_proxy_adapter/tests/conftest.py +0 -131
- mcp_proxy_adapter/tests/functional/__init__.py +0 -3
- mcp_proxy_adapter/tests/functional/test_api.py +0 -253
- mcp_proxy_adapter/tests/integration/__init__.py +0 -3
- mcp_proxy_adapter/tests/integration/test_cmd_integration.py +0 -129
- mcp_proxy_adapter/tests/integration/test_integration.py +0 -255
- mcp_proxy_adapter/tests/performance/__init__.py +0 -3
- mcp_proxy_adapter/tests/performance/test_performance.py +0 -189
- mcp_proxy_adapter/tests/stubs/__init__.py +0 -10
- mcp_proxy_adapter/tests/stubs/echo_command.py +0 -104
- mcp_proxy_adapter/tests/test_api_endpoints.py +0 -271
- mcp_proxy_adapter/tests/test_api_handlers.py +0 -289
- mcp_proxy_adapter/tests/test_base_command.py +0 -123
- mcp_proxy_adapter/tests/test_batch_requests.py +0 -117
- mcp_proxy_adapter/tests/test_command_registry.py +0 -281
- mcp_proxy_adapter/tests/test_config.py +0 -127
- mcp_proxy_adapter/tests/test_utils.py +0 -65
- mcp_proxy_adapter/tests/unit/__init__.py +0 -3
- mcp_proxy_adapter/tests/unit/test_base_command.py +0 -436
- mcp_proxy_adapter/tests/unit/test_config.py +0 -270
- mcp_proxy_adapter-6.0.0.dist-info/METADATA +0 -201
- mcp_proxy_adapter-6.0.0.dist-info/RECORD +0 -179
- {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.0.1.dist-info}/WHEEL +0 -0
- {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.0.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,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"]
|