mcp-proxy-adapter 6.0.0__py3-none-any.whl → 6.1.0__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 (259) 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 +7 -2
  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/unified_security.py +152 -0
  7. mcp_proxy_adapter/api/middleware/user_info_middleware.py +83 -0
  8. mcp_proxy_adapter/commands/__init__.py +7 -1
  9. mcp_proxy_adapter/commands/base.py +7 -4
  10. mcp_proxy_adapter/commands/builtin_commands.py +8 -2
  11. mcp_proxy_adapter/commands/command_registry.py +8 -0
  12. mcp_proxy_adapter/commands/echo_command.py +81 -0
  13. mcp_proxy_adapter/commands/help_command.py +21 -14
  14. mcp_proxy_adapter/commands/proxy_registration_command.py +326 -185
  15. mcp_proxy_adapter/commands/role_test_command.py +141 -0
  16. mcp_proxy_adapter/commands/security_command.py +488 -0
  17. mcp_proxy_adapter/commands/ssl_setup_command.py +2 -2
  18. mcp_proxy_adapter/commands/token_management_command.py +1 -1
  19. mcp_proxy_adapter/config.py +81 -21
  20. mcp_proxy_adapter/core/app_factory.py +326 -0
  21. mcp_proxy_adapter/core/client_security.py +384 -0
  22. mcp_proxy_adapter/core/logging.py +8 -3
  23. mcp_proxy_adapter/core/mtls_asgi.py +156 -0
  24. mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
  25. mcp_proxy_adapter/core/protocol_manager.py +9 -0
  26. mcp_proxy_adapter/core/proxy_client.py +602 -0
  27. mcp_proxy_adapter/core/proxy_registration.py +299 -47
  28. mcp_proxy_adapter/core/security_adapter.py +12 -15
  29. mcp_proxy_adapter/core/security_integration.py +277 -0
  30. mcp_proxy_adapter/core/server_adapter.py +345 -0
  31. mcp_proxy_adapter/core/server_engine.py +364 -0
  32. mcp_proxy_adapter/core/unified_config_adapter.py +579 -0
  33. mcp_proxy_adapter/examples/README.md +230 -97
  34. mcp_proxy_adapter/examples/README_EN.md +258 -0
  35. mcp_proxy_adapter/examples/SECURITY_TESTING.md +455 -0
  36. mcp_proxy_adapter/examples/__pycache__/security_configurations.cpython-312.pyc +0 -0
  37. mcp_proxy_adapter/examples/__pycache__/security_test_client.cpython-312.pyc +0 -0
  38. mcp_proxy_adapter/examples/basic_framework/configs/http_auth.json +37 -0
  39. mcp_proxy_adapter/examples/basic_framework/configs/http_simple.json +23 -0
  40. mcp_proxy_adapter/examples/basic_framework/configs/https_auth.json +39 -0
  41. mcp_proxy_adapter/examples/basic_framework/configs/https_simple.json +25 -0
  42. mcp_proxy_adapter/examples/basic_framework/configs/mtls_no_roles.json +39 -0
  43. mcp_proxy_adapter/examples/basic_framework/configs/mtls_with_roles.json +45 -0
  44. mcp_proxy_adapter/examples/basic_framework/main.py +63 -0
  45. mcp_proxy_adapter/examples/basic_framework/roles.json +21 -0
  46. mcp_proxy_adapter/examples/cert_config.json +9 -0
  47. mcp_proxy_adapter/examples/certs/admin.crt +32 -0
  48. mcp_proxy_adapter/examples/certs/admin.key +52 -0
  49. mcp_proxy_adapter/examples/certs/admin_cert.pem +21 -0
  50. mcp_proxy_adapter/examples/certs/admin_key.pem +28 -0
  51. mcp_proxy_adapter/examples/certs/ca_cert.pem +23 -0
  52. mcp_proxy_adapter/examples/certs/ca_cert.srl +1 -0
  53. mcp_proxy_adapter/examples/certs/ca_key.pem +28 -0
  54. mcp_proxy_adapter/examples/certs/cert_config.json +9 -0
  55. mcp_proxy_adapter/examples/certs/client.crt +32 -0
  56. mcp_proxy_adapter/examples/certs/client.key +52 -0
  57. mcp_proxy_adapter/examples/certs/client_admin.crt +32 -0
  58. mcp_proxy_adapter/examples/certs/client_admin.key +52 -0
  59. mcp_proxy_adapter/examples/certs/client_user.crt +32 -0
  60. mcp_proxy_adapter/examples/certs/client_user.key +52 -0
  61. mcp_proxy_adapter/examples/certs/guest_cert.pem +21 -0
  62. mcp_proxy_adapter/examples/certs/guest_key.pem +28 -0
  63. mcp_proxy_adapter/examples/certs/mcp_proxy_adapter_ca_ca.crt +23 -0
  64. mcp_proxy_adapter/examples/certs/proxy_cert.pem +21 -0
  65. mcp_proxy_adapter/examples/certs/proxy_key.pem +28 -0
  66. mcp_proxy_adapter/examples/certs/readonly.crt +32 -0
  67. mcp_proxy_adapter/examples/certs/readonly.key +52 -0
  68. mcp_proxy_adapter/examples/certs/readonly_cert.pem +21 -0
  69. mcp_proxy_adapter/examples/certs/readonly_key.pem +28 -0
  70. mcp_proxy_adapter/examples/certs/server.crt +32 -0
  71. mcp_proxy_adapter/examples/certs/server.key +52 -0
  72. mcp_proxy_adapter/examples/certs/server_cert.pem +32 -0
  73. mcp_proxy_adapter/examples/certs/server_key.pem +52 -0
  74. mcp_proxy_adapter/examples/certs/test_ca_ca.crt +20 -0
  75. mcp_proxy_adapter/examples/certs/user.crt +32 -0
  76. mcp_proxy_adapter/examples/certs/user.key +52 -0
  77. mcp_proxy_adapter/examples/certs/user_cert.pem +21 -0
  78. mcp_proxy_adapter/examples/certs/user_key.pem +28 -0
  79. mcp_proxy_adapter/examples/client_configs/api_key_client.json +13 -0
  80. mcp_proxy_adapter/examples/client_configs/basic_auth_client.json +13 -0
  81. mcp_proxy_adapter/examples/client_configs/certificate_client.json +22 -0
  82. mcp_proxy_adapter/examples/client_configs/jwt_client.json +15 -0
  83. mcp_proxy_adapter/examples/client_configs/no_auth_client.json +9 -0
  84. mcp_proxy_adapter/examples/commands/__init__.py +1 -0
  85. mcp_proxy_adapter/examples/create_certificates_simple.py +307 -0
  86. mcp_proxy_adapter/examples/debug_request_state.py +144 -0
  87. mcp_proxy_adapter/examples/debug_role_chain.py +205 -0
  88. mcp_proxy_adapter/examples/demo_client.py +341 -0
  89. mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +99 -0
  90. mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +106 -0
  91. mcp_proxy_adapter/examples/full_application/configs/http_auth.json +37 -0
  92. mcp_proxy_adapter/examples/full_application/configs/http_simple.json +23 -0
  93. mcp_proxy_adapter/examples/full_application/configs/https_auth.json +39 -0
  94. mcp_proxy_adapter/examples/full_application/configs/https_simple.json +25 -0
  95. mcp_proxy_adapter/examples/full_application/configs/mtls_no_roles.json +39 -0
  96. mcp_proxy_adapter/examples/full_application/configs/mtls_with_roles.json +45 -0
  97. mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +97 -0
  98. mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +95 -0
  99. mcp_proxy_adapter/examples/full_application/main.py +138 -0
  100. mcp_proxy_adapter/examples/full_application/roles.json +21 -0
  101. mcp_proxy_adapter/examples/generate_all_certificates.py +429 -0
  102. mcp_proxy_adapter/examples/generate_certificates.py +121 -0
  103. mcp_proxy_adapter/examples/keys/ca_key.pem +28 -0
  104. mcp_proxy_adapter/examples/keys/mcp_proxy_adapter_ca_ca.key +28 -0
  105. mcp_proxy_adapter/examples/keys/test_ca_ca.key +28 -0
  106. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log +220 -0
  107. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.1 +1 -0
  108. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.2 +1 -0
  109. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.3 +1 -0
  110. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.4 +1 -0
  111. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.5 +1 -0
  112. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log +220 -0
  113. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.1 +1 -0
  114. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.2 +1 -0
  115. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.3 +1 -0
  116. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.4 +1 -0
  117. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.5 +1 -0
  118. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log +2 -0
  119. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.1 +1 -0
  120. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.2 +1 -0
  121. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.3 +1 -0
  122. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.4 +1 -0
  123. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.5 +1 -0
  124. mcp_proxy_adapter/examples/proxy_registration_example.py +401 -0
  125. mcp_proxy_adapter/examples/roles.json +38 -0
  126. mcp_proxy_adapter/examples/run_example.py +81 -0
  127. mcp_proxy_adapter/examples/run_security_tests.py +326 -0
  128. mcp_proxy_adapter/examples/run_security_tests_fixed.py +300 -0
  129. mcp_proxy_adapter/examples/security_test_client.py +743 -0
  130. mcp_proxy_adapter/examples/server_configs/config_basic_http.json +204 -0
  131. mcp_proxy_adapter/examples/server_configs/config_http_token.json +238 -0
  132. mcp_proxy_adapter/examples/server_configs/config_https.json +215 -0
  133. mcp_proxy_adapter/examples/server_configs/config_https_token.json +231 -0
  134. mcp_proxy_adapter/examples/server_configs/config_mtls.json +215 -0
  135. mcp_proxy_adapter/examples/server_configs/config_proxy_registration.json +250 -0
  136. mcp_proxy_adapter/examples/server_configs/config_simple.json +46 -0
  137. mcp_proxy_adapter/examples/server_configs/roles.json +38 -0
  138. mcp_proxy_adapter/examples/test_examples.py +344 -0
  139. mcp_proxy_adapter/examples/universal_client.py +628 -0
  140. mcp_proxy_adapter/main.py +21 -10
  141. mcp_proxy_adapter/utils/config_generator.py +639 -0
  142. mcp_proxy_adapter/version.py +2 -1
  143. mcp_proxy_adapter-6.1.0.dist-info/METADATA +205 -0
  144. mcp_proxy_adapter-6.1.0.dist-info/RECORD +193 -0
  145. mcp_proxy_adapter-6.1.0.dist-info/entry_points.txt +2 -0
  146. {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.1.0.dist-info}/licenses/LICENSE +2 -2
  147. mcp_proxy_adapter/api/middleware/auth.py +0 -146
  148. mcp_proxy_adapter/api/middleware/auth_adapter.py +0 -235
  149. mcp_proxy_adapter/api/middleware/mtls_adapter.py +0 -305
  150. mcp_proxy_adapter/api/middleware/mtls_middleware.py +0 -296
  151. mcp_proxy_adapter/api/middleware/rate_limit.py +0 -152
  152. mcp_proxy_adapter/api/middleware/rate_limit_adapter.py +0 -241
  153. mcp_proxy_adapter/api/middleware/roles_adapter.py +0 -365
  154. mcp_proxy_adapter/api/middleware/roles_middleware.py +0 -381
  155. mcp_proxy_adapter/api/middleware/security.py +0 -376
  156. mcp_proxy_adapter/api/middleware/token_auth_middleware.py +0 -261
  157. mcp_proxy_adapter/examples/__init__.py +0 -7
  158. mcp_proxy_adapter/examples/basic_server/README.md +0 -60
  159. mcp_proxy_adapter/examples/basic_server/__init__.py +0 -7
  160. mcp_proxy_adapter/examples/basic_server/basic_custom_settings.json +0 -39
  161. mcp_proxy_adapter/examples/basic_server/config.json +0 -70
  162. mcp_proxy_adapter/examples/basic_server/config_all_protocols.json +0 -54
  163. mcp_proxy_adapter/examples/basic_server/config_http.json +0 -70
  164. mcp_proxy_adapter/examples/basic_server/config_http_only.json +0 -52
  165. mcp_proxy_adapter/examples/basic_server/config_https.json +0 -58
  166. mcp_proxy_adapter/examples/basic_server/config_mtls.json +0 -58
  167. mcp_proxy_adapter/examples/basic_server/config_ssl.json +0 -46
  168. mcp_proxy_adapter/examples/basic_server/custom_settings_example.py +0 -238
  169. mcp_proxy_adapter/examples/basic_server/server.py +0 -114
  170. mcp_proxy_adapter/examples/custom_commands/README.md +0 -127
  171. mcp_proxy_adapter/examples/custom_commands/__init__.py +0 -27
  172. mcp_proxy_adapter/examples/custom_commands/advanced_hooks.py +0 -566
  173. mcp_proxy_adapter/examples/custom_commands/auto_commands/__init__.py +0 -6
  174. mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_echo_command.py +0 -103
  175. mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_info_command.py +0 -111
  176. mcp_proxy_adapter/examples/custom_commands/auto_commands/test_command.py +0 -105
  177. mcp_proxy_adapter/examples/custom_commands/catalog/commands/test_command.py +0 -129
  178. mcp_proxy_adapter/examples/custom_commands/config.json +0 -118
  179. mcp_proxy_adapter/examples/custom_commands/config_all_protocols.json +0 -46
  180. mcp_proxy_adapter/examples/custom_commands/config_https_only.json +0 -46
  181. mcp_proxy_adapter/examples/custom_commands/config_https_transport.json +0 -33
  182. mcp_proxy_adapter/examples/custom_commands/config_mtls_only.json +0 -46
  183. mcp_proxy_adapter/examples/custom_commands/config_mtls_transport.json +0 -33
  184. mcp_proxy_adapter/examples/custom_commands/config_single_transport.json +0 -33
  185. mcp_proxy_adapter/examples/custom_commands/custom_health_command.py +0 -169
  186. mcp_proxy_adapter/examples/custom_commands/custom_help_command.py +0 -215
  187. mcp_proxy_adapter/examples/custom_commands/custom_openapi_generator.py +0 -76
  188. mcp_proxy_adapter/examples/custom_commands/custom_settings.json +0 -96
  189. mcp_proxy_adapter/examples/custom_commands/custom_settings_manager.py +0 -241
  190. mcp_proxy_adapter/examples/custom_commands/data_transform_command.py +0 -135
  191. mcp_proxy_adapter/examples/custom_commands/echo_command.py +0 -122
  192. mcp_proxy_adapter/examples/custom_commands/full_help_response.json +0 -1
  193. mcp_proxy_adapter/examples/custom_commands/generated_openapi.json +0 -629
  194. mcp_proxy_adapter/examples/custom_commands/get_openapi.py +0 -103
  195. mcp_proxy_adapter/examples/custom_commands/hooks.py +0 -230
  196. mcp_proxy_adapter/examples/custom_commands/intercept_command.py +0 -123
  197. mcp_proxy_adapter/examples/custom_commands/loadable_commands/test_ignored.py +0 -129
  198. mcp_proxy_adapter/examples/custom_commands/manual_echo_command.py +0 -103
  199. mcp_proxy_adapter/examples/custom_commands/proxy_connection_manager.py +0 -278
  200. mcp_proxy_adapter/examples/custom_commands/server.py +0 -252
  201. mcp_proxy_adapter/examples/custom_commands/simple_openapi_server.py +0 -75
  202. mcp_proxy_adapter/examples/custom_commands/start_server_with_proxy_manager.py +0 -299
  203. mcp_proxy_adapter/examples/custom_commands/start_server_with_registration.py +0 -278
  204. mcp_proxy_adapter/examples/custom_commands/test_hooks.py +0 -176
  205. mcp_proxy_adapter/examples/custom_commands/test_openapi.py +0 -27
  206. mcp_proxy_adapter/examples/custom_commands/test_registry.py +0 -23
  207. mcp_proxy_adapter/examples/custom_commands/test_simple.py +0 -19
  208. mcp_proxy_adapter/examples/custom_project_example/README.md +0 -103
  209. mcp_proxy_adapter/examples/custom_project_example/README_EN.md +0 -103
  210. mcp_proxy_adapter/examples/deployment/README.md +0 -49
  211. mcp_proxy_adapter/examples/deployment/__init__.py +0 -7
  212. mcp_proxy_adapter/examples/deployment/config.development.json +0 -8
  213. mcp_proxy_adapter/examples/deployment/config.json +0 -29
  214. mcp_proxy_adapter/examples/deployment/config.production.json +0 -12
  215. mcp_proxy_adapter/examples/deployment/config.staging.json +0 -11
  216. mcp_proxy_adapter/examples/deployment/docker-compose.yml +0 -31
  217. mcp_proxy_adapter/examples/deployment/run.sh +0 -43
  218. mcp_proxy_adapter/examples/deployment/run_docker.sh +0 -84
  219. mcp_proxy_adapter/examples/simple_custom_commands/README.md +0 -149
  220. mcp_proxy_adapter/examples/simple_custom_commands/README_EN.md +0 -149
  221. mcp_proxy_adapter/schemas/base_schema.json +0 -114
  222. mcp_proxy_adapter/schemas/openapi_schema.json +0 -314
  223. mcp_proxy_adapter/schemas/roles_schema.json +0 -162
  224. mcp_proxy_adapter/tests/__init__.py +0 -0
  225. mcp_proxy_adapter/tests/api/__init__.py +0 -3
  226. mcp_proxy_adapter/tests/api/test_cmd_endpoint.py +0 -115
  227. mcp_proxy_adapter/tests/api/test_custom_openapi.py +0 -617
  228. mcp_proxy_adapter/tests/api/test_handlers.py +0 -522
  229. mcp_proxy_adapter/tests/api/test_middleware.py +0 -340
  230. mcp_proxy_adapter/tests/api/test_schemas.py +0 -546
  231. mcp_proxy_adapter/tests/api/test_tool_integration.py +0 -531
  232. mcp_proxy_adapter/tests/commands/__init__.py +0 -3
  233. mcp_proxy_adapter/tests/commands/test_config_command.py +0 -211
  234. mcp_proxy_adapter/tests/commands/test_echo_command.py +0 -127
  235. mcp_proxy_adapter/tests/commands/test_help_command.py +0 -136
  236. mcp_proxy_adapter/tests/conftest.py +0 -131
  237. mcp_proxy_adapter/tests/functional/__init__.py +0 -3
  238. mcp_proxy_adapter/tests/functional/test_api.py +0 -253
  239. mcp_proxy_adapter/tests/integration/__init__.py +0 -3
  240. mcp_proxy_adapter/tests/integration/test_cmd_integration.py +0 -129
  241. mcp_proxy_adapter/tests/integration/test_integration.py +0 -255
  242. mcp_proxy_adapter/tests/performance/__init__.py +0 -3
  243. mcp_proxy_adapter/tests/performance/test_performance.py +0 -189
  244. mcp_proxy_adapter/tests/stubs/__init__.py +0 -10
  245. mcp_proxy_adapter/tests/stubs/echo_command.py +0 -104
  246. mcp_proxy_adapter/tests/test_api_endpoints.py +0 -271
  247. mcp_proxy_adapter/tests/test_api_handlers.py +0 -289
  248. mcp_proxy_adapter/tests/test_base_command.py +0 -123
  249. mcp_proxy_adapter/tests/test_batch_requests.py +0 -117
  250. mcp_proxy_adapter/tests/test_command_registry.py +0 -281
  251. mcp_proxy_adapter/tests/test_config.py +0 -127
  252. mcp_proxy_adapter/tests/test_utils.py +0 -65
  253. mcp_proxy_adapter/tests/unit/__init__.py +0 -3
  254. mcp_proxy_adapter/tests/unit/test_base_command.py +0 -436
  255. mcp_proxy_adapter/tests/unit/test_config.py +0 -270
  256. mcp_proxy_adapter-6.0.0.dist-info/METADATA +0 -201
  257. mcp_proxy_adapter-6.0.0.dist-info/RECORD +0 -179
  258. {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.1.0.dist-info}/WHEEL +0 -0
  259. {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.1.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,455 @@
1
+ # Security Testing Framework
2
+
3
+ This directory contains a comprehensive security testing framework for MCP Proxy Adapter that validates various security configurations and scenarios.
4
+
5
+ **Author**: Vasiliy Zdanovskiy
6
+ **Email**: vasilyvz@gmail.com
7
+
8
+ ## Overview
9
+
10
+ The security testing framework provides:
11
+
12
+ - **Positive Tests**: Valid security configurations that should work
13
+ - **Negative Tests**: Invalid configurations that should be rejected
14
+ - **Certificate Tests**: mTLS and certificate-based authentication testing
15
+ - **Multiple Server Configurations**: HTTP, HTTPS, Token Auth, mTLS
16
+ - **Client Testing**: Using mcp_security_framework for comprehensive client testing
17
+
18
+ ## Directory Structure
19
+
20
+ ```
21
+ examples/
22
+ ├── security_test_client.py # Security test client using mcp_security_framework
23
+ ├── run_security_tests.py # Main test runner
24
+ ├── server_configs/ # Server configuration files
25
+ │ ├── config_basic_http.json # Basic HTTP without security
26
+ │ ├── config_http_token.json # HTTP with token authentication
27
+ │ ├── config_https.json # HTTPS without authentication
28
+ │ ├── config_https_token.json # HTTPS with token authentication
29
+ │ ├── config_mtls.json # mTLS with certificate authentication
30
+ │ └── roles.json # Role definitions for testing
31
+ └── SECURITY_TESTING.md # This file
32
+ ```
33
+
34
+ ## Server Configurations
35
+
36
+ ### 1. Basic HTTP (config_basic_http.json)
37
+ - **Port**: 8000
38
+ - **Security**: Disabled
39
+ - **Authentication**: None
40
+ - **SSL/TLS**: Disabled
41
+ - **Use Case**: Basic testing without security
42
+
43
+ ### 2. HTTP + Token (config_http_token.json)
44
+ - **Port**: 8001
45
+ - **Security**: Enabled
46
+ - **Authentication**: API Key
47
+ - **SSL/TLS**: Disabled
48
+ - **Use Case**: Token-based authentication over HTTP
49
+
50
+ ### 3. HTTPS (config_https.json)
51
+ - **Port**: 8443
52
+ - **Security**: Enabled
53
+ - **Authentication**: None
54
+ - **SSL/TLS**: Enabled
55
+ - **Use Case**: Secure communication without authentication
56
+
57
+ ### 4. HTTPS + Token (config_https_token.json)
58
+ - **Port**: 8444
59
+ - **Security**: Enabled
60
+ - **Authentication**: API Key
61
+ - **SSL/TLS**: Enabled
62
+ - **Use Case**: Secure communication with token authentication
63
+
64
+ ### 5. mTLS (config_mtls.json)
65
+ - **Port**: 9443
66
+ - **Security**: Enabled
67
+ - **Authentication**: Certificate-based
68
+ - **SSL/TLS**: Enabled with mutual authentication
69
+ - **Use Case**: Highest security with certificate validation
70
+
71
+ ## Test Scenarios
72
+
73
+ ### Positive Tests
74
+
75
+ These tests verify that valid configurations work correctly:
76
+
77
+ 1. **Basic HTTP Tests**
78
+ - Health endpoint access
79
+ - Echo command execution
80
+ - Security command access
81
+
82
+ 2. **HTTP + Token Tests**
83
+ - Authentication with valid API key
84
+ - Role-based access control
85
+ - Rate limiting validation
86
+
87
+ 3. **HTTPS Tests**
88
+ - SSL/TLS handshake
89
+ - Certificate validation
90
+ - Secure communication
91
+
92
+ 4. **HTTPS + Token Tests**
93
+ - Combined SSL and token authentication
94
+ - Security headers validation
95
+ - Mixed authentication methods
96
+
97
+ 5. **mTLS Tests**
98
+ - Mutual certificate authentication
99
+ - Certificate chain validation
100
+ - Role extraction from certificates
101
+
102
+ ### Negative Tests
103
+
104
+ These tests verify that invalid configurations are properly rejected:
105
+
106
+ 1. **Invalid API Key**
107
+ - Test with wrong API key
108
+ - Expected: Authentication failure
109
+
110
+ 2. **No Authentication on Auth Server**
111
+ - Test without credentials on auth-required server
112
+ - Expected: Access denied
113
+
114
+ 3. **Protocol Mismatch**
115
+ - HTTP client connecting to HTTPS server
116
+ - Expected: Connection failure
117
+
118
+ 4. **Invalid Certificates**
119
+ - Expired certificates
120
+ - Wrong organization certificates
121
+ - Expected: Certificate validation failure
122
+
123
+ ### Certificate Tests
124
+
125
+ Specific tests for certificate-based authentication:
126
+
127
+ 1. **Admin Certificate**
128
+ - Full administrative access
129
+ - Expected: All operations allowed
130
+
131
+ 2. **User Certificate**
132
+ - Standard user access
133
+ - Expected: Read/write operations allowed
134
+
135
+ 3. **Readonly Certificate**
136
+ - Read-only access
137
+ - Expected: Only read operations allowed
138
+
139
+ 4. **Expired Certificate**
140
+ - Certificate past expiration date
141
+ - Expected: Authentication failure
142
+
143
+ 5. **Wrong Organization Certificate**
144
+ - Certificate from unauthorized organization
145
+ - Expected: Authentication failure
146
+
147
+ ## Usage
148
+
149
+ ### Prerequisites
150
+
151
+ 1. Install dependencies:
152
+ ```bash
153
+ pip install mcp_security_framework aiohttp
154
+ ```
155
+
156
+ 2. Generate certificates (if not already present):
157
+ ```bash
158
+ python examples/generate_certificates.py
159
+ ```
160
+
161
+ ### Running Tests
162
+
163
+ #### Run All Tests
164
+ ```bash
165
+ python examples/run_security_tests.py
166
+ ```
167
+
168
+ #### Run Specific Test Types
169
+ ```bash
170
+ # Positive tests only
171
+ python examples/run_security_tests.py --positive-only
172
+
173
+ # Negative tests only
174
+ python examples/run_security_tests.py --negative-only
175
+
176
+ # Certificate tests only
177
+ python examples/run_security_tests.py --certificates-only
178
+ ```
179
+
180
+ #### Run with Custom Certificate Directory
181
+ ```bash
182
+ python examples/run_security_tests.py --cert-dir ./certs
183
+ ```
184
+
185
+ #### Save Results to File
186
+ ```bash
187
+ python examples/run_security_tests.py --output test_results.json
188
+ ```
189
+
190
+ ### Using the Security Test Client
191
+
192
+ The security test client can be used independently:
193
+
194
+ ```bash
195
+ # Test basic HTTP
196
+ python examples/security_test_client.py --server-url http://localhost:8000
197
+
198
+ # Test HTTPS with certificates
199
+ python examples/security_test_client.py --server-url https://localhost:8443 --cert-dir ./certs
200
+
201
+ # Test with specific API key
202
+ python examples/security_test_client.py --server-url http://localhost:8001 --api-key test-api-key
203
+ ```
204
+
205
+ ## Test Client Features
206
+
207
+ The `SecurityTestClient` provides:
208
+
209
+ ### Authentication Methods
210
+ - **None**: No authentication
211
+ - **API Key**: Token-based authentication
212
+ - **Certificate**: mTLS certificate authentication
213
+
214
+ ### SSL/TLS Support
215
+ - SSL context creation
216
+ - Certificate validation
217
+ - Hostname verification
218
+ - TLS version configuration
219
+
220
+ ### Test Endpoints
221
+ - **Health Check**: `/health`
222
+ - **Echo Command**: `/cmd` (JSON-RPC)
223
+ - **Security Command**: `/cmd` (JSON-RPC)
224
+
225
+ ### Error Handling
226
+ - Connection timeout handling
227
+ - SSL/TLS error detection
228
+ - Authentication failure detection
229
+ - Detailed error reporting
230
+
231
+ ## Security Features Tested
232
+
233
+ ### 1. SSL/TLS Security
234
+ - Certificate validation
235
+ - TLS version enforcement
236
+ - Cipher suite selection
237
+ - Hostname verification
238
+
239
+ ### 2. Authentication
240
+ - API key validation
241
+ - Certificate-based authentication
242
+ - Role extraction from certificates
243
+ - Permission checking
244
+
245
+ ### 3. Authorization
246
+ - Role-based access control
247
+ - Permission inheritance
248
+ - Resource-level permissions
249
+ - Admin privilege validation
250
+
251
+ ### 4. Rate Limiting
252
+ - Request rate enforcement
253
+ - Burst limit validation
254
+ - Role-based exemptions
255
+ - Time window management
256
+
257
+ ### 5. Security Headers
258
+ - Content-Type-Options
259
+ - Frame-Options
260
+ - XSS-Protection
261
+ - HSTS (HTTP Strict Transport Security)
262
+
263
+ ### 6. Certificate Management
264
+ - Certificate expiration checking
265
+ - Certificate revocation list (CRL)
266
+ - Certificate chain validation
267
+ - Organization validation
268
+
269
+ ## Expected Test Results
270
+
271
+ ### Positive Tests
272
+ All positive tests should:
273
+ - ✅ Successfully connect to server
274
+ - ✅ Authenticate properly
275
+ - ✅ Execute commands successfully
276
+ - ✅ Return expected responses
277
+ - ✅ Complete within reasonable time
278
+
279
+ ### Negative Tests
280
+ All negative tests should:
281
+ - ❌ Fail to authenticate
282
+ - ❌ Return appropriate error codes
283
+ - ❌ Log security violations
284
+ - ❌ Prevent unauthorized access
285
+ - ❌ Handle errors gracefully
286
+
287
+ ### Certificate Tests
288
+ Certificate tests should:
289
+ - ✅ Accept valid certificates
290
+ - ❌ Reject expired certificates
291
+ - ❌ Reject wrong organization certificates
292
+ - ✅ Extract roles correctly
293
+ - ✅ Enforce role-based permissions
294
+
295
+ ## Troubleshooting
296
+
297
+ ### Common Issues
298
+
299
+ 1. **Certificate Not Found**
300
+ ```
301
+ Error: Certificate files not found
302
+ Solution: Run generate_certificates.py first
303
+ ```
304
+
305
+ 2. **Port Already in Use**
306
+ ```
307
+ Error: Address already in use
308
+ Solution: Stop existing servers or change ports in config
309
+ ```
310
+
311
+ 3. **SSL Handshake Failed**
312
+ ```
313
+ Error: SSL handshake failed
314
+ Solution: Check certificate validity and CA certificate
315
+ ```
316
+
317
+ 4. **Authentication Failed**
318
+ ```
319
+ Error: Authentication failed
320
+ Solution: Verify API key or certificate configuration
321
+ ```
322
+
323
+ ### Debug Mode
324
+
325
+ Enable debug logging for detailed troubleshooting:
326
+
327
+ ```bash
328
+ # Set debug environment variable
329
+ export DEBUG=1
330
+
331
+ # Run tests with verbose output
332
+ python examples/run_security_tests.py --verbose
333
+ ```
334
+
335
+ ### Certificate Validation
336
+
337
+ To validate certificates manually:
338
+
339
+ ```bash
340
+ # Check certificate validity
341
+ openssl x509 -in certs/admin.crt -text -noout
342
+
343
+ # Verify certificate chain
344
+ openssl verify -CAfile certs/ca_cert.pem certs/admin.crt
345
+
346
+ # Check certificate expiration
347
+ openssl x509 -in certs/admin.crt -noout -dates
348
+ ```
349
+
350
+ ## Integration with CI/CD
351
+
352
+ The security testing framework can be integrated into CI/CD pipelines:
353
+
354
+ ```yaml
355
+ # Example GitHub Actions workflow
356
+ name: Security Tests
357
+ on: [push, pull_request]
358
+
359
+ jobs:
360
+ security-tests:
361
+ runs-on: ubuntu-latest
362
+ steps:
363
+ - uses: actions/checkout@v2
364
+ - name: Set up Python
365
+ uses: actions/setup-python@v2
366
+ with:
367
+ python-version: '3.12'
368
+ - name: Install dependencies
369
+ run: |
370
+ pip install -e .
371
+ pip install mcp_security_framework aiohttp
372
+ - name: Generate certificates
373
+ run: python examples/generate_certificates.py
374
+ - name: Run security tests
375
+ run: python examples/run_security_tests.py --output results.json
376
+ - name: Upload test results
377
+ uses: actions/upload-artifact@v2
378
+ with:
379
+ name: security-test-results
380
+ path: results.json
381
+ ```
382
+
383
+ ## Performance Considerations
384
+
385
+ ### Test Execution Time
386
+ - **Basic HTTP**: ~1-2 seconds per test
387
+ - **HTTPS**: ~2-3 seconds per test
388
+ - **mTLS**: ~3-5 seconds per test
389
+ - **Full Test Suite**: ~30-60 seconds
390
+
391
+ ### Resource Usage
392
+ - **Memory**: ~50-100 MB per server instance
393
+ - **CPU**: Low usage during normal operation
394
+ - **Network**: Minimal traffic for test scenarios
395
+
396
+ ### Optimization Tips
397
+ 1. Run tests in parallel (with different ports)
398
+ 2. Use connection pooling for multiple requests
399
+ 3. Implement test result caching
400
+ 4. Use lightweight certificates for testing
401
+
402
+ ## Security Best Practices
403
+
404
+ ### For Testing
405
+ 1. Use dedicated test certificates
406
+ 2. Never use production certificates in tests
407
+ 3. Implement proper cleanup after tests
408
+ 4. Validate all security headers
409
+ 5. Test both positive and negative scenarios
410
+
411
+ ### For Production
412
+ 1. Use strong certificate authorities
413
+ 2. Implement certificate rotation
414
+ 3. Monitor certificate expiration
415
+ 4. Use secure cipher suites
416
+ 5. Enable security headers
417
+ 6. Implement rate limiting
418
+ 7. Log security events
419
+
420
+ ## Contributing
421
+
422
+ When adding new security tests:
423
+
424
+ 1. **Follow Naming Convention**
425
+ - Test files: `test_<feature>_<scenario>.py`
426
+ - Config files: `config_<type>_<auth>.json`
427
+
428
+ 2. **Include Both Positive and Negative Tests**
429
+ - Test valid configurations
430
+ - Test invalid configurations
431
+ - Verify error handling
432
+
433
+ 3. **Document Test Scenarios**
434
+ - Describe expected behavior
435
+ - Document test prerequisites
436
+ - Include troubleshooting steps
437
+
438
+ 4. **Update This Documentation**
439
+ - Add new test scenarios
440
+ - Update usage examples
441
+ - Document new features
442
+
443
+ ## Support
444
+
445
+ For issues and questions:
446
+
447
+ 1. Check the troubleshooting section
448
+ 2. Review test logs for detailed error messages
449
+ 3. Verify certificate and configuration files
450
+ 4. Test with minimal configuration first
451
+ 5. Contact the development team
452
+
453
+ ## License
454
+
455
+ This security testing framework is part of the MCP Proxy Adapter project and follows the same license terms.
@@ -0,0 +1,37 @@
1
+ {
2
+ "server": {
3
+ "host": "0.0.0.0",
4
+ "port": 8001,
5
+ "debug": false,
6
+ "log_level": "INFO"
7
+ },
8
+ "ssl": {
9
+ "enabled": false
10
+ },
11
+ "security": {
12
+ "enabled": true,
13
+ "auth": {
14
+ "enabled": true,
15
+ "methods": ["api_key"],
16
+ "api_keys": {
17
+ "admin": "admin-secret-key-123",
18
+ "user": "user-secret-key-456"
19
+ }
20
+ },
21
+ "rate_limit": {
22
+ "enabled": true,
23
+ "requests_per_minute": 60,
24
+ "requests_per_hour": 1000,
25
+ "burst_limit": 10
26
+ }
27
+ },
28
+ "logging": {
29
+ "level": "INFO",
30
+ "console_output": true,
31
+ "file_output": false
32
+ },
33
+ "commands": {
34
+ "auto_discovery": true,
35
+ "commands_directory": "./commands"
36
+ }
37
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "server": {
3
+ "host": "0.0.0.0",
4
+ "port": 8000,
5
+ "debug": false,
6
+ "log_level": "INFO"
7
+ },
8
+ "ssl": {
9
+ "enabled": false
10
+ },
11
+ "security": {
12
+ "enabled": false
13
+ },
14
+ "logging": {
15
+ "level": "INFO",
16
+ "console_output": true,
17
+ "file_output": false
18
+ },
19
+ "commands": {
20
+ "auto_discovery": true,
21
+ "commands_directory": "./commands"
22
+ }
23
+ }
@@ -0,0 +1,39 @@
1
+ {
2
+ "server": {
3
+ "host": "0.0.0.0",
4
+ "port": 8444,
5
+ "debug": false,
6
+ "log_level": "INFO"
7
+ },
8
+ "ssl": {
9
+ "enabled": true,
10
+ "cert_file": "./certs/server.crt",
11
+ "key_file": "./certs/server.key"
12
+ },
13
+ "security": {
14
+ "enabled": true,
15
+ "auth": {
16
+ "enabled": true,
17
+ "methods": ["api_key"],
18
+ "api_keys": {
19
+ "admin": "admin-secret-key-123",
20
+ "user": "user-secret-key-456"
21
+ }
22
+ },
23
+ "rate_limit": {
24
+ "enabled": true,
25
+ "requests_per_minute": 60,
26
+ "requests_per_hour": 1000,
27
+ "burst_limit": 10
28
+ }
29
+ },
30
+ "logging": {
31
+ "level": "INFO",
32
+ "console_output": true,
33
+ "file_output": false
34
+ },
35
+ "commands": {
36
+ "auto_discovery": true,
37
+ "commands_directory": "./commands"
38
+ }
39
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "server": {
3
+ "host": "0.0.0.0",
4
+ "port": 8443,
5
+ "debug": false,
6
+ "log_level": "INFO"
7
+ },
8
+ "ssl": {
9
+ "enabled": true,
10
+ "cert_file": "./certs/server.crt",
11
+ "key_file": "./certs/server.key"
12
+ },
13
+ "security": {
14
+ "enabled": false
15
+ },
16
+ "logging": {
17
+ "level": "INFO",
18
+ "console_output": true,
19
+ "file_output": false
20
+ },
21
+ "commands": {
22
+ "auto_discovery": true,
23
+ "commands_directory": "./commands"
24
+ }
25
+ }
@@ -0,0 +1,39 @@
1
+ {
2
+ "server": {
3
+ "host": "0.0.0.0",
4
+ "port": 9443,
5
+ "debug": false,
6
+ "log_level": "INFO"
7
+ },
8
+ "ssl": {
9
+ "enabled": true,
10
+ "cert_file": "./certs/server.crt",
11
+ "key_file": "./certs/server.key",
12
+ "ca_cert": "./certs/ca.crt",
13
+ "verify_client": true,
14
+ "client_cert_required": true
15
+ },
16
+ "security": {
17
+ "enabled": true,
18
+ "auth": {
19
+ "enabled": true,
20
+ "methods": ["certificate"],
21
+ "certificate_auth": true
22
+ },
23
+ "rate_limit": {
24
+ "enabled": true,
25
+ "requests_per_minute": 60,
26
+ "requests_per_hour": 1000,
27
+ "burst_limit": 10
28
+ }
29
+ },
30
+ "logging": {
31
+ "level": "INFO",
32
+ "console_output": true,
33
+ "file_output": false
34
+ },
35
+ "commands": {
36
+ "auto_discovery": true,
37
+ "commands_directory": "./commands"
38
+ }
39
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "server": {
3
+ "host": "0.0.0.0",
4
+ "port": 9444,
5
+ "debug": false,
6
+ "log_level": "INFO"
7
+ },
8
+ "ssl": {
9
+ "enabled": true,
10
+ "cert_file": "./certs/server.crt",
11
+ "key_file": "./certs/server.key",
12
+ "ca_cert": "./certs/ca.crt",
13
+ "verify_client": true,
14
+ "client_cert_required": true
15
+ },
16
+ "security": {
17
+ "enabled": true,
18
+ "auth": {
19
+ "enabled": true,
20
+ "methods": ["certificate"],
21
+ "certificate_auth": true
22
+ },
23
+ "permissions": {
24
+ "enabled": true,
25
+ "roles_file": "./roles.json",
26
+ "default_role": "user",
27
+ "deny_by_default": true
28
+ },
29
+ "rate_limit": {
30
+ "enabled": true,
31
+ "requests_per_minute": 60,
32
+ "requests_per_hour": 1000,
33
+ "burst_limit": 10
34
+ }
35
+ },
36
+ "logging": {
37
+ "level": "INFO",
38
+ "console_output": true,
39
+ "file_output": false
40
+ },
41
+ "commands": {
42
+ "auto_discovery": true,
43
+ "commands_directory": "./commands"
44
+ }
45
+ }