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.
- mcp_proxy_adapter/api/app.py +174 -80
- mcp_proxy_adapter/api/handlers.py +16 -5
- mcp_proxy_adapter/api/middleware/__init__.py +9 -4
- 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 +32 -13
- mcp_proxy_adapter/api/middleware/unified_security.py +160 -0
- mcp_proxy_adapter/api/middleware/user_info_middleware.py +83 -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/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 +2 -2
- mcp_proxy_adapter/commands/token_management_command.py +1 -1
- mcp_proxy_adapter/config.py +81 -21
- mcp_proxy_adapter/core/app_factory.py +326 -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 +139 -8
- 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 +285 -0
- mcp_proxy_adapter/core/server_adapter.py +345 -0
- mcp_proxy_adapter/core/server_engine.py +364 -0
- mcp_proxy_adapter/core/unified_config_adapter.py +579 -0
- mcp_proxy_adapter/docs/EN/TROUBLESHOOTING.md +285 -0
- mcp_proxy_adapter/docs/RU/TROUBLESHOOTING.md +285 -0
- mcp_proxy_adapter/examples/README.md +230 -97
- mcp_proxy_adapter/examples/README_EN.md +258 -0
- mcp_proxy_adapter/examples/SECURITY_TESTING.md +455 -0
- mcp_proxy_adapter/examples/basic_framework/configs/http_auth.json +37 -0
- mcp_proxy_adapter/examples/basic_framework/configs/http_simple.json +23 -0
- mcp_proxy_adapter/examples/basic_framework/configs/https_auth.json +43 -0
- mcp_proxy_adapter/examples/basic_framework/configs/https_no_protocol_middleware.json +36 -0
- mcp_proxy_adapter/examples/basic_framework/configs/https_simple.json +29 -0
- mcp_proxy_adapter/examples/basic_framework/configs/mtls_no_protocol_middleware.json +34 -0
- mcp_proxy_adapter/examples/basic_framework/configs/mtls_no_roles.json +39 -0
- mcp_proxy_adapter/examples/basic_framework/configs/mtls_simple.json +35 -0
- mcp_proxy_adapter/examples/basic_framework/configs/mtls_with_roles.json +45 -0
- mcp_proxy_adapter/examples/basic_framework/main.py +63 -0
- mcp_proxy_adapter/examples/basic_framework/roles.json +21 -0
- mcp_proxy_adapter/examples/cert_config.json +9 -0
- mcp_proxy_adapter/examples/certs/admin.crt +32 -0
- mcp_proxy_adapter/examples/certs/admin.key +52 -0
- mcp_proxy_adapter/examples/certs/admin_cert.pem +21 -0
- mcp_proxy_adapter/examples/certs/admin_key.pem +28 -0
- mcp_proxy_adapter/examples/certs/ca_cert.pem +23 -0
- mcp_proxy_adapter/examples/certs/ca_cert.srl +1 -0
- mcp_proxy_adapter/examples/certs/ca_key.pem +28 -0
- mcp_proxy_adapter/examples/certs/cert_config.json +9 -0
- mcp_proxy_adapter/examples/certs/client.crt +32 -0
- mcp_proxy_adapter/examples/certs/client.key +52 -0
- mcp_proxy_adapter/examples/certs/client_admin.crt +32 -0
- mcp_proxy_adapter/examples/certs/client_admin.key +52 -0
- mcp_proxy_adapter/examples/certs/client_user.crt +32 -0
- mcp_proxy_adapter/examples/certs/client_user.key +52 -0
- mcp_proxy_adapter/examples/certs/guest_cert.pem +21 -0
- mcp_proxy_adapter/examples/certs/guest_key.pem +28 -0
- mcp_proxy_adapter/examples/certs/mcp_proxy_adapter_ca_ca.crt +23 -0
- mcp_proxy_adapter/examples/certs/proxy_cert.pem +21 -0
- mcp_proxy_adapter/examples/certs/proxy_key.pem +28 -0
- mcp_proxy_adapter/examples/certs/readonly.crt +32 -0
- mcp_proxy_adapter/examples/certs/readonly.key +52 -0
- mcp_proxy_adapter/examples/certs/readonly_cert.pem +21 -0
- mcp_proxy_adapter/examples/certs/readonly_key.pem +28 -0
- mcp_proxy_adapter/examples/certs/server.crt +32 -0
- mcp_proxy_adapter/examples/certs/server.key +52 -0
- mcp_proxy_adapter/examples/certs/server_cert.pem +32 -0
- mcp_proxy_adapter/examples/certs/server_key.pem +52 -0
- mcp_proxy_adapter/examples/certs/test_ca_ca.crt +20 -0
- mcp_proxy_adapter/examples/certs/user.crt +32 -0
- mcp_proxy_adapter/examples/certs/user.key +52 -0
- mcp_proxy_adapter/examples/certs/user_cert.pem +21 -0
- mcp_proxy_adapter/examples/certs/user_key.pem +28 -0
- mcp_proxy_adapter/examples/client_configs/api_key_client.json +13 -0
- mcp_proxy_adapter/examples/client_configs/basic_auth_client.json +13 -0
- mcp_proxy_adapter/examples/client_configs/certificate_client.json +22 -0
- mcp_proxy_adapter/examples/client_configs/jwt_client.json +15 -0
- mcp_proxy_adapter/examples/client_configs/no_auth_client.json +9 -0
- mcp_proxy_adapter/examples/commands/__init__.py +1 -0
- mcp_proxy_adapter/examples/create_certificates_simple.py +307 -0
- mcp_proxy_adapter/examples/debug_request_state.py +144 -0
- mcp_proxy_adapter/examples/debug_role_chain.py +205 -0
- mcp_proxy_adapter/examples/demo_client.py +341 -0
- mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +99 -0
- mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +106 -0
- mcp_proxy_adapter/examples/full_application/configs/http_auth.json +37 -0
- mcp_proxy_adapter/examples/full_application/configs/http_simple.json +23 -0
- mcp_proxy_adapter/examples/full_application/configs/https_auth.json +39 -0
- mcp_proxy_adapter/examples/full_application/configs/https_simple.json +25 -0
- mcp_proxy_adapter/examples/full_application/configs/mtls_no_roles.json +39 -0
- mcp_proxy_adapter/examples/full_application/configs/mtls_with_roles.json +45 -0
- mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +97 -0
- mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +95 -0
- mcp_proxy_adapter/examples/full_application/main.py +138 -0
- mcp_proxy_adapter/examples/full_application/roles.json +21 -0
- mcp_proxy_adapter/examples/generate_all_certificates.py +429 -0
- mcp_proxy_adapter/examples/generate_certificates.py +121 -0
- mcp_proxy_adapter/examples/keys/ca_key.pem +28 -0
- mcp_proxy_adapter/examples/keys/mcp_proxy_adapter_ca_ca.key +28 -0
- mcp_proxy_adapter/examples/keys/test_ca_ca.key +28 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log +220 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.1 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.2 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.3 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.4 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.5 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log +220 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.1 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.2 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.3 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.4 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.5 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log +2 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.1 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.2 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.3 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.4 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.5 +1 -0
- mcp_proxy_adapter/examples/proxy_registration_example.py +401 -0
- mcp_proxy_adapter/examples/roles.json +38 -0
- mcp_proxy_adapter/examples/run_example.py +81 -0
- mcp_proxy_adapter/examples/run_security_tests.py +326 -0
- mcp_proxy_adapter/examples/run_security_tests_fixed.py +300 -0
- mcp_proxy_adapter/examples/security_test_client.py +743 -0
- mcp_proxy_adapter/examples/server_configs/config_basic_http.json +204 -0
- mcp_proxy_adapter/examples/server_configs/config_http_token.json +238 -0
- mcp_proxy_adapter/examples/server_configs/config_https.json +215 -0
- mcp_proxy_adapter/examples/server_configs/config_https_token.json +231 -0
- mcp_proxy_adapter/examples/server_configs/config_mtls.json +215 -0
- mcp_proxy_adapter/examples/server_configs/config_proxy_registration.json +250 -0
- mcp_proxy_adapter/examples/server_configs/config_simple.json +46 -0
- mcp_proxy_adapter/examples/server_configs/roles.json +38 -0
- mcp_proxy_adapter/examples/test_config_generator.py +110 -0
- mcp_proxy_adapter/examples/test_examples.py +344 -0
- mcp_proxy_adapter/examples/universal_client.py +628 -0
- mcp_proxy_adapter/main.py +21 -10
- mcp_proxy_adapter/utils/config_generator.py +727 -0
- mcp_proxy_adapter/version.py +5 -2
- mcp_proxy_adapter-6.1.1.dist-info/METADATA +205 -0
- mcp_proxy_adapter-6.1.1.dist-info/RECORD +197 -0
- mcp_proxy_adapter-6.1.1.dist-info/entry_points.txt +2 -0
- {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.1.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/__init__.py +0 -7
- 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.1.1.dist-info}/WHEEL +0 -0
- {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.1.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,285 @@
|
|
1
|
+
# Troubleshooting Guide
|
2
|
+
|
3
|
+
This guide addresses common issues with MCP Proxy Adapter Framework, particularly related to ProtocolMiddleware and SSL/TLS configuration.
|
4
|
+
|
5
|
+
## Common Issues
|
6
|
+
|
7
|
+
### Issue 1: ProtocolMiddleware blocks HTTPS requests
|
8
|
+
|
9
|
+
**Problem:** ProtocolMiddleware is initialized with default settings and doesn't update when SSL configuration changes.
|
10
|
+
|
11
|
+
**Symptoms:**
|
12
|
+
```
|
13
|
+
Protocol 'https' not allowed for request to /health
|
14
|
+
INFO: 127.0.0.1:42038 - "GET /health HTTP/1.1" 403 Forbidden
|
15
|
+
```
|
16
|
+
|
17
|
+
**Root Cause:** ProtocolMiddleware was created as a global instance with default settings and didn't update when SSL was enabled.
|
18
|
+
|
19
|
+
**Solution:**
|
20
|
+
1. **Use updated ProtocolManager** (Fixed in v1.1.0):
|
21
|
+
- ProtocolManager now dynamically updates based on SSL configuration
|
22
|
+
- Automatically allows HTTPS when SSL is enabled
|
23
|
+
|
24
|
+
2. **Disable ProtocolMiddleware for HTTPS** (Temporary workaround):
|
25
|
+
```json
|
26
|
+
{
|
27
|
+
"server": {"host": "127.0.0.1", "port": 10004},
|
28
|
+
"ssl": {"enabled": true, "cert_file": "./certs/server.crt", "key_file": "./certs/server.key"},
|
29
|
+
"security": {"enabled": true, "auth": {"enabled": true, "methods": ["api_key"]}},
|
30
|
+
"protocols": {"enabled": false}
|
31
|
+
}
|
32
|
+
```
|
33
|
+
|
34
|
+
### Issue 2: SSL Configuration Conflicts
|
35
|
+
|
36
|
+
**Problem:** Framework reads SSL configuration from both `ssl` (legacy) and `security.ssl` sections, causing confusion.
|
37
|
+
|
38
|
+
**Symptoms:**
|
39
|
+
```
|
40
|
+
🔍 Debug: SSL config at start of validation: enabled=False
|
41
|
+
🔍 Debug: Root SSL section found: enabled=True
|
42
|
+
🔍 Debug: _get_ssl_config: security.ssl key_file=None
|
43
|
+
🔍 Debug: _get_ssl_config: legacy ssl key_file=./certs/server.key
|
44
|
+
```
|
45
|
+
|
46
|
+
**Solution:**
|
47
|
+
1. **Use unified SSL configuration** (Recommended):
|
48
|
+
```json
|
49
|
+
{
|
50
|
+
"security": {
|
51
|
+
"ssl": {
|
52
|
+
"enabled": true,
|
53
|
+
"cert_file": "./certs/server.crt",
|
54
|
+
"key_file": "./certs/server.key"
|
55
|
+
}
|
56
|
+
}
|
57
|
+
}
|
58
|
+
```
|
59
|
+
|
60
|
+
2. **Use legacy SSL configuration** (Backward compatible):
|
61
|
+
```json
|
62
|
+
{
|
63
|
+
"ssl": {
|
64
|
+
"enabled": true,
|
65
|
+
"cert_file": "./certs/server.crt",
|
66
|
+
"key_file": "./certs/server.key"
|
67
|
+
}
|
68
|
+
}
|
69
|
+
```
|
70
|
+
|
71
|
+
### Issue 3: Security Framework Initialization Errors
|
72
|
+
|
73
|
+
**Problem:** Security framework fails to initialize due to missing or null configuration values.
|
74
|
+
|
75
|
+
**Symptoms:**
|
76
|
+
```
|
77
|
+
Failed to initialize security components: Failed to load roles configuration: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'NoneType'
|
78
|
+
```
|
79
|
+
|
80
|
+
**Solution:**
|
81
|
+
1. **Provide roles file** (If using roles):
|
82
|
+
```json
|
83
|
+
{
|
84
|
+
"security": {
|
85
|
+
"permissions": {
|
86
|
+
"enabled": true,
|
87
|
+
"roles_file": "./roles.json"
|
88
|
+
}
|
89
|
+
}
|
90
|
+
}
|
91
|
+
```
|
92
|
+
|
93
|
+
2. **Disable permissions** (If not using roles):
|
94
|
+
```json
|
95
|
+
{
|
96
|
+
"security": {
|
97
|
+
"permissions": {
|
98
|
+
"enabled": false
|
99
|
+
}
|
100
|
+
}
|
101
|
+
}
|
102
|
+
```
|
103
|
+
|
104
|
+
3. **Use graceful fallback** (Fixed in v1.1.0):
|
105
|
+
- Security framework now continues without roles if roles_file is null
|
106
|
+
- Logs warning instead of crashing
|
107
|
+
|
108
|
+
## Configuration Examples
|
109
|
+
|
110
|
+
### HTTP Simple
|
111
|
+
```json
|
112
|
+
{
|
113
|
+
"server": {"host": "127.0.0.1", "port": 10001},
|
114
|
+
"ssl": {"enabled": false},
|
115
|
+
"security": {"enabled": false},
|
116
|
+
"protocols": {"enabled": true, "allowed_protocols": ["http"]}
|
117
|
+
}
|
118
|
+
```
|
119
|
+
|
120
|
+
### HTTPS Simple
|
121
|
+
```json
|
122
|
+
{
|
123
|
+
"server": {"host": "127.0.0.1", "port": 10002},
|
124
|
+
"ssl": {"enabled": true, "cert_file": "./certs/server.crt", "key_file": "./certs/server.key"},
|
125
|
+
"security": {"enabled": false},
|
126
|
+
"protocols": {"enabled": true, "allowed_protocols": ["http", "https"]}
|
127
|
+
}
|
128
|
+
```
|
129
|
+
|
130
|
+
### HTTPS with Token Auth
|
131
|
+
```json
|
132
|
+
{
|
133
|
+
"server": {"host": "127.0.0.1", "port": 10003},
|
134
|
+
"ssl": {"enabled": true, "cert_file": "./certs/server.crt", "key_file": "./certs/server.key"},
|
135
|
+
"security": {
|
136
|
+
"enabled": true,
|
137
|
+
"auth": {"enabled": true, "methods": ["api_key"]}
|
138
|
+
},
|
139
|
+
"protocols": {"enabled": true, "allowed_protocols": ["http", "https"]}
|
140
|
+
}
|
141
|
+
```
|
142
|
+
|
143
|
+
### HTTPS without ProtocolMiddleware
|
144
|
+
```json
|
145
|
+
{
|
146
|
+
"server": {"host": "127.0.0.1", "port": 10004},
|
147
|
+
"ssl": {"enabled": true, "cert_file": "./certs/server.crt", "key_file": "./certs/server.key"},
|
148
|
+
"security": {
|
149
|
+
"enabled": true,
|
150
|
+
"auth": {"enabled": true, "methods": ["api_key"]}
|
151
|
+
},
|
152
|
+
"protocols": {"enabled": false}
|
153
|
+
}
|
154
|
+
```
|
155
|
+
|
156
|
+
### mTLS Simple
|
157
|
+
```json
|
158
|
+
{
|
159
|
+
"server": {"host": "127.0.0.1", "port": 10005},
|
160
|
+
"ssl": {
|
161
|
+
"enabled": true,
|
162
|
+
"cert_file": "./certs/server.crt",
|
163
|
+
"key_file": "./certs/server.key",
|
164
|
+
"ca_cert": "./certs/ca.crt",
|
165
|
+
"verify_client": true
|
166
|
+
},
|
167
|
+
"security": {
|
168
|
+
"enabled": true,
|
169
|
+
"auth": {"enabled": true, "methods": ["certificate"]}
|
170
|
+
},
|
171
|
+
"protocols": {"enabled": true, "allowed_protocols": ["https", "mtls"]}
|
172
|
+
}
|
173
|
+
```
|
174
|
+
|
175
|
+
## Testing Your Configuration
|
176
|
+
|
177
|
+
### Test HTTP
|
178
|
+
```bash
|
179
|
+
curl http://127.0.0.1:10001/health
|
180
|
+
```
|
181
|
+
|
182
|
+
### Test HTTPS
|
183
|
+
```bash
|
184
|
+
curl -k https://127.0.0.1:10002/health
|
185
|
+
```
|
186
|
+
|
187
|
+
### Test HTTPS with Auth
|
188
|
+
```bash
|
189
|
+
curl -k -H "Authorization: Bearer your-api-key" https://127.0.0.1:10003/health
|
190
|
+
```
|
191
|
+
|
192
|
+
### Test mTLS
|
193
|
+
```bash
|
194
|
+
curl -k --cert ./certs/client.crt --key ./certs/client.key https://127.0.0.1:10005/health
|
195
|
+
```
|
196
|
+
|
197
|
+
## Debugging
|
198
|
+
|
199
|
+
### Enable Debug Logging
|
200
|
+
```json
|
201
|
+
{
|
202
|
+
"logging": {
|
203
|
+
"level": "DEBUG",
|
204
|
+
"console_output": true
|
205
|
+
}
|
206
|
+
}
|
207
|
+
```
|
208
|
+
|
209
|
+
### Check Protocol Manager Status
|
210
|
+
```python
|
211
|
+
from mcp_proxy_adapter.core.protocol_manager import get_protocol_manager
|
212
|
+
from mcp_proxy_adapter.config import config
|
213
|
+
|
214
|
+
pm = get_protocol_manager(config.get_all())
|
215
|
+
print(f"Allowed protocols: {pm.get_allowed_protocols()}")
|
216
|
+
print(f"Protocol info: {pm.get_protocol_info()}")
|
217
|
+
```
|
218
|
+
|
219
|
+
### Check SSL Configuration
|
220
|
+
```python
|
221
|
+
from mcp_proxy_adapter.config import config
|
222
|
+
|
223
|
+
ssl_config = config.get("ssl", {})
|
224
|
+
security_ssl = config.get("security", {}).get("ssl", {})
|
225
|
+
print(f"Legacy SSL: {ssl_config}")
|
226
|
+
print(f"Security SSL: {security_ssl}")
|
227
|
+
```
|
228
|
+
|
229
|
+
## Migration Guide
|
230
|
+
|
231
|
+
### From Legacy to New Configuration
|
232
|
+
|
233
|
+
**Old (Legacy):**
|
234
|
+
```json
|
235
|
+
{
|
236
|
+
"ssl": {"enabled": true, "cert_file": "./certs/server.crt", "key_file": "./certs/server.key"}
|
237
|
+
}
|
238
|
+
```
|
239
|
+
|
240
|
+
**New (Recommended):**
|
241
|
+
```json
|
242
|
+
{
|
243
|
+
"security": {
|
244
|
+
"ssl": {"enabled": true, "cert_file": "./certs/server.crt", "key_file": "./certs/server.key"}
|
245
|
+
}
|
246
|
+
}
|
247
|
+
```
|
248
|
+
|
249
|
+
### Adding Protocol Management
|
250
|
+
|
251
|
+
**Without Protocol Management:**
|
252
|
+
```json
|
253
|
+
{
|
254
|
+
"protocols": {"enabled": false}
|
255
|
+
}
|
256
|
+
```
|
257
|
+
|
258
|
+
**With Protocol Management:**
|
259
|
+
```json
|
260
|
+
{
|
261
|
+
"protocols": {
|
262
|
+
"enabled": true,
|
263
|
+
"allowed_protocols": ["http", "https"]
|
264
|
+
}
|
265
|
+
}
|
266
|
+
```
|
267
|
+
|
268
|
+
## Best Practices
|
269
|
+
|
270
|
+
1. **Use security.ssl instead of legacy ssl** for new configurations
|
271
|
+
2. **Disable ProtocolMiddleware** if you don't need protocol validation
|
272
|
+
3. **Provide roles_file** or disable permissions if using security framework
|
273
|
+
4. **Test configurations** before deploying to production
|
274
|
+
5. **Use debug logging** for troubleshooting
|
275
|
+
6. **Keep certificates and keys secure** and properly configured
|
276
|
+
|
277
|
+
## Support
|
278
|
+
|
279
|
+
If you encounter issues not covered in this guide:
|
280
|
+
|
281
|
+
1. Check the logs for detailed error messages
|
282
|
+
2. Enable debug logging for more information
|
283
|
+
3. Verify certificate files exist and are readable
|
284
|
+
4. Test with simple configurations first
|
285
|
+
5. Report issues with full configuration and error logs
|
@@ -0,0 +1,285 @@
|
|
1
|
+
# Руководство по устранению неполадок
|
2
|
+
|
3
|
+
Это руководство посвящено решению распространенных проблем с фреймворком MCP Proxy Adapter, особенно связанных с ProtocolMiddleware и конфигурацией SSL/TLS.
|
4
|
+
|
5
|
+
## Распространенные проблемы
|
6
|
+
|
7
|
+
### Проблема 1: ProtocolMiddleware блокирует HTTPS запросы
|
8
|
+
|
9
|
+
**Проблема:** ProtocolMiddleware инициализируется с дефолтными настройками и не обновляется при изменении конфигурации SSL.
|
10
|
+
|
11
|
+
**Симптомы:**
|
12
|
+
```
|
13
|
+
Protocol 'https' not allowed for request to /health
|
14
|
+
INFO: 127.0.0.1:42038 - "GET /health HTTP/1.1" 403 Forbidden
|
15
|
+
```
|
16
|
+
|
17
|
+
**Причина:** ProtocolMiddleware создавался как глобальный экземпляр с дефолтными настройками и не обновлялся при включении SSL.
|
18
|
+
|
19
|
+
**Решение:**
|
20
|
+
1. **Использовать обновленный ProtocolManager** (Исправлено в v1.1.0):
|
21
|
+
- ProtocolManager теперь динамически обновляется на основе конфигурации SSL
|
22
|
+
- Автоматически разрешает HTTPS при включении SSL
|
23
|
+
|
24
|
+
2. **Отключить ProtocolMiddleware для HTTPS** (Временное решение):
|
25
|
+
```json
|
26
|
+
{
|
27
|
+
"server": {"host": "127.0.0.1", "port": 10004},
|
28
|
+
"ssl": {"enabled": true, "cert_file": "./certs/server.crt", "key_file": "./certs/server.key"},
|
29
|
+
"security": {"enabled": true, "auth": {"enabled": true, "methods": ["api_key"]}},
|
30
|
+
"protocols": {"enabled": false}
|
31
|
+
}
|
32
|
+
```
|
33
|
+
|
34
|
+
### Проблема 2: Конфликты конфигурации SSL
|
35
|
+
|
36
|
+
**Проблема:** Фреймворк читает конфигурацию SSL из двух мест: `ssl` (legacy) и `security.ssl`, что приводит к путанице.
|
37
|
+
|
38
|
+
**Симптомы:**
|
39
|
+
```
|
40
|
+
🔍 Debug: SSL config at start of validation: enabled=False
|
41
|
+
🔍 Debug: Root SSL section found: enabled=True
|
42
|
+
🔍 Debug: _get_ssl_config: security.ssl key_file=None
|
43
|
+
🔍 Debug: _get_ssl_config: legacy ssl key_file=./certs/server.key
|
44
|
+
```
|
45
|
+
|
46
|
+
**Решение:**
|
47
|
+
1. **Использовать унифицированную конфигурацию SSL** (Рекомендуется):
|
48
|
+
```json
|
49
|
+
{
|
50
|
+
"security": {
|
51
|
+
"ssl": {
|
52
|
+
"enabled": true,
|
53
|
+
"cert_file": "./certs/server.crt",
|
54
|
+
"key_file": "./certs/server.key"
|
55
|
+
}
|
56
|
+
}
|
57
|
+
}
|
58
|
+
```
|
59
|
+
|
60
|
+
2. **Использовать legacy конфигурацию SSL** (Обратная совместимость):
|
61
|
+
```json
|
62
|
+
{
|
63
|
+
"ssl": {
|
64
|
+
"enabled": true,
|
65
|
+
"cert_file": "./certs/server.crt",
|
66
|
+
"key_file": "./certs/server.key"
|
67
|
+
}
|
68
|
+
}
|
69
|
+
```
|
70
|
+
|
71
|
+
### Проблема 3: Ошибки инициализации security framework
|
72
|
+
|
73
|
+
**Проблема:** Security framework падает при инициализации из-за отсутствующих или null значений конфигурации.
|
74
|
+
|
75
|
+
**Симптомы:**
|
76
|
+
```
|
77
|
+
Failed to initialize security components: Failed to load roles configuration: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'NoneType'
|
78
|
+
```
|
79
|
+
|
80
|
+
**Решение:**
|
81
|
+
1. **Предоставить файл ролей** (Если используются роли):
|
82
|
+
```json
|
83
|
+
{
|
84
|
+
"security": {
|
85
|
+
"permissions": {
|
86
|
+
"enabled": true,
|
87
|
+
"roles_file": "./roles.json"
|
88
|
+
}
|
89
|
+
}
|
90
|
+
}
|
91
|
+
```
|
92
|
+
|
93
|
+
2. **Отключить permissions** (Если роли не используются):
|
94
|
+
```json
|
95
|
+
{
|
96
|
+
"security": {
|
97
|
+
"permissions": {
|
98
|
+
"enabled": false
|
99
|
+
}
|
100
|
+
}
|
101
|
+
}
|
102
|
+
```
|
103
|
+
|
104
|
+
3. **Использовать graceful fallback** (Исправлено в v1.1.0):
|
105
|
+
- Security framework теперь продолжает работу без ролей, если roles_file равен null
|
106
|
+
- Логирует предупреждение вместо падения
|
107
|
+
|
108
|
+
## Примеры конфигураций
|
109
|
+
|
110
|
+
### HTTP Simple
|
111
|
+
```json
|
112
|
+
{
|
113
|
+
"server": {"host": "127.0.0.1", "port": 10001},
|
114
|
+
"ssl": {"enabled": false},
|
115
|
+
"security": {"enabled": false},
|
116
|
+
"protocols": {"enabled": true, "allowed_protocols": ["http"]}
|
117
|
+
}
|
118
|
+
```
|
119
|
+
|
120
|
+
### HTTPS Simple
|
121
|
+
```json
|
122
|
+
{
|
123
|
+
"server": {"host": "127.0.0.1", "port": 10002},
|
124
|
+
"ssl": {"enabled": true, "cert_file": "./certs/server.crt", "key_file": "./certs/server.key"},
|
125
|
+
"security": {"enabled": false},
|
126
|
+
"protocols": {"enabled": true, "allowed_protocols": ["http", "https"]}
|
127
|
+
}
|
128
|
+
```
|
129
|
+
|
130
|
+
### HTTPS с токен-аутентификацией
|
131
|
+
```json
|
132
|
+
{
|
133
|
+
"server": {"host": "127.0.0.1", "port": 10003},
|
134
|
+
"ssl": {"enabled": true, "cert_file": "./certs/server.crt", "key_file": "./certs/server.key"},
|
135
|
+
"security": {
|
136
|
+
"enabled": true,
|
137
|
+
"auth": {"enabled": true, "methods": ["api_key"]}
|
138
|
+
},
|
139
|
+
"protocols": {"enabled": true, "allowed_protocols": ["http", "https"]}
|
140
|
+
}
|
141
|
+
```
|
142
|
+
|
143
|
+
### HTTPS без ProtocolMiddleware
|
144
|
+
```json
|
145
|
+
{
|
146
|
+
"server": {"host": "127.0.0.1", "port": 10004},
|
147
|
+
"ssl": {"enabled": true, "cert_file": "./certs/server.crt", "key_file": "./certs/server.key"},
|
148
|
+
"security": {
|
149
|
+
"enabled": true,
|
150
|
+
"auth": {"enabled": true, "methods": ["api_key"]}
|
151
|
+
},
|
152
|
+
"protocols": {"enabled": false}
|
153
|
+
}
|
154
|
+
```
|
155
|
+
|
156
|
+
### mTLS Simple
|
157
|
+
```json
|
158
|
+
{
|
159
|
+
"server": {"host": "127.0.0.1", "port": 10005},
|
160
|
+
"ssl": {
|
161
|
+
"enabled": true,
|
162
|
+
"cert_file": "./certs/server.crt",
|
163
|
+
"key_file": "./certs/server.key",
|
164
|
+
"ca_cert": "./certs/ca.crt",
|
165
|
+
"verify_client": true
|
166
|
+
},
|
167
|
+
"security": {
|
168
|
+
"enabled": true,
|
169
|
+
"auth": {"enabled": true, "methods": ["certificate"]}
|
170
|
+
},
|
171
|
+
"protocols": {"enabled": true, "allowed_protocols": ["https", "mtls"]}
|
172
|
+
}
|
173
|
+
```
|
174
|
+
|
175
|
+
## Тестирование конфигурации
|
176
|
+
|
177
|
+
### Тест HTTP
|
178
|
+
```bash
|
179
|
+
curl http://127.0.0.1:10001/health
|
180
|
+
```
|
181
|
+
|
182
|
+
### Тест HTTPS
|
183
|
+
```bash
|
184
|
+
curl -k https://127.0.0.1:10002/health
|
185
|
+
```
|
186
|
+
|
187
|
+
### Тест HTTPS с аутентификацией
|
188
|
+
```bash
|
189
|
+
curl -k -H "Authorization: Bearer your-api-key" https://127.0.0.1:10003/health
|
190
|
+
```
|
191
|
+
|
192
|
+
### Тест mTLS
|
193
|
+
```bash
|
194
|
+
curl -k --cert ./certs/client.crt --key ./certs/client.key https://127.0.0.1:10005/health
|
195
|
+
```
|
196
|
+
|
197
|
+
## Отладка
|
198
|
+
|
199
|
+
### Включить debug логирование
|
200
|
+
```json
|
201
|
+
{
|
202
|
+
"logging": {
|
203
|
+
"level": "DEBUG",
|
204
|
+
"console_output": true
|
205
|
+
}
|
206
|
+
}
|
207
|
+
```
|
208
|
+
|
209
|
+
### Проверить статус Protocol Manager
|
210
|
+
```python
|
211
|
+
from mcp_proxy_adapter.core.protocol_manager import get_protocol_manager
|
212
|
+
from mcp_proxy_adapter.config import config
|
213
|
+
|
214
|
+
pm = get_protocol_manager(config.get_all())
|
215
|
+
print(f"Allowed protocols: {pm.get_allowed_protocols()}")
|
216
|
+
print(f"Protocol info: {pm.get_protocol_info()}")
|
217
|
+
```
|
218
|
+
|
219
|
+
### Проверить конфигурацию SSL
|
220
|
+
```python
|
221
|
+
from mcp_proxy_adapter.config import config
|
222
|
+
|
223
|
+
ssl_config = config.get("ssl", {})
|
224
|
+
security_ssl = config.get("security", {}).get("ssl", {})
|
225
|
+
print(f"Legacy SSL: {ssl_config}")
|
226
|
+
print(f"Security SSL: {security_ssl}")
|
227
|
+
```
|
228
|
+
|
229
|
+
## Руководство по миграции
|
230
|
+
|
231
|
+
### От legacy к новой конфигурации
|
232
|
+
|
233
|
+
**Старая (Legacy):**
|
234
|
+
```json
|
235
|
+
{
|
236
|
+
"ssl": {"enabled": true, "cert_file": "./certs/server.crt", "key_file": "./certs/server.key"}
|
237
|
+
}
|
238
|
+
```
|
239
|
+
|
240
|
+
**Новая (Рекомендуется):**
|
241
|
+
```json
|
242
|
+
{
|
243
|
+
"security": {
|
244
|
+
"ssl": {"enabled": true, "cert_file": "./certs/server.crt", "key_file": "./certs/server.key"}
|
245
|
+
}
|
246
|
+
}
|
247
|
+
```
|
248
|
+
|
249
|
+
### Добавление управления протоколами
|
250
|
+
|
251
|
+
**Без управления протоколами:**
|
252
|
+
```json
|
253
|
+
{
|
254
|
+
"protocols": {"enabled": false}
|
255
|
+
}
|
256
|
+
```
|
257
|
+
|
258
|
+
**С управлением протоколами:**
|
259
|
+
```json
|
260
|
+
{
|
261
|
+
"protocols": {
|
262
|
+
"enabled": true,
|
263
|
+
"allowed_protocols": ["http", "https"]
|
264
|
+
}
|
265
|
+
}
|
266
|
+
```
|
267
|
+
|
268
|
+
## Лучшие практики
|
269
|
+
|
270
|
+
1. **Используйте security.ssl вместо legacy ssl** для новых конфигураций
|
271
|
+
2. **Отключайте ProtocolMiddleware** если не нужна валидация протоколов
|
272
|
+
3. **Предоставляйте roles_file** или отключайте permissions при использовании security framework
|
273
|
+
4. **Тестируйте конфигурации** перед развертыванием в продакшене
|
274
|
+
5. **Используйте debug логирование** для отладки
|
275
|
+
6. **Храните сертификаты и ключи в безопасности** и правильно настраивайте
|
276
|
+
|
277
|
+
## Поддержка
|
278
|
+
|
279
|
+
Если вы столкнулись с проблемами, не описанными в этом руководстве:
|
280
|
+
|
281
|
+
1. Проверьте логи для получения подробных сообщений об ошибках
|
282
|
+
2. Включите debug логирование для получения дополнительной информации
|
283
|
+
3. Убедитесь, что файлы сертификатов существуют и доступны для чтения
|
284
|
+
4. Тестируйте с простыми конфигурациями сначала
|
285
|
+
5. Сообщайте о проблемах с полной конфигурацией и логами ошибок
|