mcp-proxy-adapter 6.9.27__py3-none-any.whl → 6.9.29__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mcp-proxy-adapter might be problematic. Click here for more details.

Files changed (212) hide show
  1. mcp_proxy_adapter/__init__.py +10 -0
  2. mcp_proxy_adapter/__main__.py +8 -21
  3. mcp_proxy_adapter/api/app.py +10 -913
  4. mcp_proxy_adapter/api/core/__init__.py +18 -0
  5. mcp_proxy_adapter/api/core/app_factory.py +243 -0
  6. mcp_proxy_adapter/api/core/lifespan_manager.py +55 -0
  7. mcp_proxy_adapter/api/core/registration_manager.py +166 -0
  8. mcp_proxy_adapter/api/core/ssl_context_factory.py +88 -0
  9. mcp_proxy_adapter/api/handlers.py +78 -199
  10. mcp_proxy_adapter/api/middleware/__init__.py +1 -44
  11. mcp_proxy_adapter/api/middleware/base.py +0 -42
  12. mcp_proxy_adapter/api/middleware/command_permission_middleware.py +0 -85
  13. mcp_proxy_adapter/api/middleware/error_handling.py +1 -127
  14. mcp_proxy_adapter/api/middleware/factory.py +0 -94
  15. mcp_proxy_adapter/api/middleware/logging.py +0 -112
  16. mcp_proxy_adapter/api/middleware/performance.py +0 -35
  17. mcp_proxy_adapter/api/middleware/protocol_middleware.py +2 -98
  18. mcp_proxy_adapter/api/middleware/transport_middleware.py +0 -37
  19. mcp_proxy_adapter/api/middleware/unified_security.py +10 -10
  20. mcp_proxy_adapter/api/middleware/user_info_middleware.py +0 -118
  21. mcp_proxy_adapter/api/openapi/__init__.py +21 -0
  22. mcp_proxy_adapter/api/openapi/command_integration.py +105 -0
  23. mcp_proxy_adapter/api/openapi/openapi_generator.py +40 -0
  24. mcp_proxy_adapter/api/openapi/openapi_registry.py +62 -0
  25. mcp_proxy_adapter/api/openapi/schema_loader.py +116 -0
  26. mcp_proxy_adapter/api/schemas.py +0 -61
  27. mcp_proxy_adapter/api/tool_integration.py +0 -117
  28. mcp_proxy_adapter/api/tools.py +0 -46
  29. mcp_proxy_adapter/cli/__init__.py +12 -0
  30. mcp_proxy_adapter/cli/commands/__init__.py +15 -0
  31. mcp_proxy_adapter/cli/commands/client.py +100 -0
  32. mcp_proxy_adapter/cli/commands/config_generate.py +21 -0
  33. mcp_proxy_adapter/cli/commands/config_validate.py +36 -0
  34. mcp_proxy_adapter/cli/commands/generate.py +259 -0
  35. mcp_proxy_adapter/cli/commands/server.py +174 -0
  36. mcp_proxy_adapter/cli/commands/sets.py +128 -0
  37. mcp_proxy_adapter/cli/commands/testconfig.py +177 -0
  38. mcp_proxy_adapter/cli/examples/__init__.py +8 -0
  39. mcp_proxy_adapter/cli/examples/http_basic.py +82 -0
  40. mcp_proxy_adapter/cli/examples/https_token.py +96 -0
  41. mcp_proxy_adapter/cli/examples/mtls_roles.py +103 -0
  42. mcp_proxy_adapter/cli/main.py +63 -0
  43. mcp_proxy_adapter/cli/parser.py +324 -0
  44. mcp_proxy_adapter/cli/validators.py +231 -0
  45. mcp_proxy_adapter/client/jsonrpc_client.py +406 -0
  46. mcp_proxy_adapter/client/proxy.py +45 -0
  47. mcp_proxy_adapter/commands/__init__.py +44 -28
  48. mcp_proxy_adapter/commands/auth_validation_command.py +7 -344
  49. mcp_proxy_adapter/commands/base.py +19 -43
  50. mcp_proxy_adapter/commands/builtin_commands.py +0 -75
  51. mcp_proxy_adapter/commands/catalog/__init__.py +20 -0
  52. mcp_proxy_adapter/commands/catalog/catalog_loader.py +34 -0
  53. mcp_proxy_adapter/commands/catalog/catalog_manager.py +122 -0
  54. mcp_proxy_adapter/commands/catalog/catalog_syncer.py +149 -0
  55. mcp_proxy_adapter/commands/catalog/command_catalog.py +43 -0
  56. mcp_proxy_adapter/commands/catalog/dependency_manager.py +37 -0
  57. mcp_proxy_adapter/commands/catalog_manager.py +58 -928
  58. mcp_proxy_adapter/commands/cert_monitor_command.py +0 -88
  59. mcp_proxy_adapter/commands/certificate_management_command.py +0 -45
  60. mcp_proxy_adapter/commands/command_registry.py +172 -904
  61. mcp_proxy_adapter/commands/config_command.py +0 -28
  62. mcp_proxy_adapter/commands/dependency_container.py +1 -70
  63. mcp_proxy_adapter/commands/dependency_manager.py +0 -128
  64. mcp_proxy_adapter/commands/echo_command.py +0 -34
  65. mcp_proxy_adapter/commands/health_command.py +0 -3
  66. mcp_proxy_adapter/commands/help_command.py +0 -159
  67. mcp_proxy_adapter/commands/hooks.py +0 -137
  68. mcp_proxy_adapter/commands/key_management_command.py +0 -25
  69. mcp_proxy_adapter/commands/load_command.py +7 -78
  70. mcp_proxy_adapter/commands/plugins_command.py +0 -16
  71. mcp_proxy_adapter/commands/protocol_management_command.py +0 -28
  72. mcp_proxy_adapter/commands/proxy_registration_command.py +0 -88
  73. mcp_proxy_adapter/commands/queue_commands.py +750 -0
  74. mcp_proxy_adapter/commands/registration_status_command.py +0 -43
  75. mcp_proxy_adapter/commands/registry/__init__.py +18 -0
  76. mcp_proxy_adapter/commands/registry/command_info.py +103 -0
  77. mcp_proxy_adapter/commands/registry/command_loader.py +207 -0
  78. mcp_proxy_adapter/commands/registry/command_manager.py +119 -0
  79. mcp_proxy_adapter/commands/registry/command_registry.py +217 -0
  80. mcp_proxy_adapter/commands/reload_command.py +0 -80
  81. mcp_proxy_adapter/commands/result.py +25 -77
  82. mcp_proxy_adapter/commands/role_test_command.py +0 -44
  83. mcp_proxy_adapter/commands/roles_management_command.py +0 -199
  84. mcp_proxy_adapter/commands/security_command.py +0 -30
  85. mcp_proxy_adapter/commands/settings_command.py +0 -68
  86. mcp_proxy_adapter/commands/ssl_setup_command.py +0 -42
  87. mcp_proxy_adapter/commands/token_management_command.py +0 -1
  88. mcp_proxy_adapter/commands/transport_management_command.py +0 -20
  89. mcp_proxy_adapter/commands/unload_command.py +0 -71
  90. mcp_proxy_adapter/config.py +15 -626
  91. mcp_proxy_adapter/core/__init__.py +5 -39
  92. mcp_proxy_adapter/core/app_factory.py +14 -36
  93. mcp_proxy_adapter/core/app_runner.py +0 -27
  94. mcp_proxy_adapter/core/auth_validator.py +1 -93
  95. mcp_proxy_adapter/core/certificate/__init__.py +20 -0
  96. mcp_proxy_adapter/core/certificate/certificate_creator.py +371 -0
  97. mcp_proxy_adapter/core/certificate/certificate_extractor.py +183 -0
  98. mcp_proxy_adapter/core/certificate/certificate_utils.py +249 -0
  99. mcp_proxy_adapter/core/certificate/certificate_validator.py +110 -0
  100. mcp_proxy_adapter/core/certificate/ssl_context_manager.py +70 -0
  101. mcp_proxy_adapter/core/certificate_utils.py +64 -903
  102. mcp_proxy_adapter/core/client.py +0 -6
  103. mcp_proxy_adapter/core/client_manager.py +0 -19
  104. mcp_proxy_adapter/core/client_security.py +0 -2
  105. mcp_proxy_adapter/core/config/__init__.py +18 -0
  106. mcp_proxy_adapter/core/config/config.py +195 -0
  107. mcp_proxy_adapter/core/config/config_factory.py +22 -0
  108. mcp_proxy_adapter/core/config/config_loader.py +66 -0
  109. mcp_proxy_adapter/core/config/feature_manager.py +31 -0
  110. mcp_proxy_adapter/core/config/simple_config.py +112 -0
  111. mcp_proxy_adapter/core/config/simple_config_generator.py +50 -0
  112. mcp_proxy_adapter/core/config/simple_config_validator.py +96 -0
  113. mcp_proxy_adapter/core/config_converter.py +0 -186
  114. mcp_proxy_adapter/core/config_validator.py +96 -1238
  115. mcp_proxy_adapter/core/errors.py +7 -42
  116. mcp_proxy_adapter/core/job_manager.py +54 -0
  117. mcp_proxy_adapter/core/logging.py +2 -22
  118. mcp_proxy_adapter/core/mtls_asgi.py +0 -20
  119. mcp_proxy_adapter/core/mtls_asgi_app.py +0 -12
  120. mcp_proxy_adapter/core/mtls_proxy.py +0 -80
  121. mcp_proxy_adapter/core/mtls_server.py +3 -173
  122. mcp_proxy_adapter/core/protocol_manager.py +1 -191
  123. mcp_proxy_adapter/core/proxy/__init__.py +22 -0
  124. mcp_proxy_adapter/core/proxy/auth_manager.py +27 -0
  125. mcp_proxy_adapter/core/proxy/proxy_registration_manager.py +137 -0
  126. mcp_proxy_adapter/core/proxy/registration_client.py +60 -0
  127. mcp_proxy_adapter/core/proxy/ssl_manager.py +101 -0
  128. mcp_proxy_adapter/core/proxy_client.py +0 -1
  129. mcp_proxy_adapter/core/proxy_registration.py +36 -912
  130. mcp_proxy_adapter/core/role_utils.py +0 -308
  131. mcp_proxy_adapter/core/security_adapter.py +1 -36
  132. mcp_proxy_adapter/core/security_factory.py +1 -150
  133. mcp_proxy_adapter/core/security_integration.py +0 -33
  134. mcp_proxy_adapter/core/server_adapter.py +1 -40
  135. mcp_proxy_adapter/core/server_engine.py +2 -173
  136. mcp_proxy_adapter/core/settings.py +0 -127
  137. mcp_proxy_adapter/core/signal_handler.py +0 -65
  138. mcp_proxy_adapter/core/ssl_utils.py +19 -137
  139. mcp_proxy_adapter/core/transport_manager.py +0 -151
  140. mcp_proxy_adapter/core/unified_config_adapter.py +1 -193
  141. mcp_proxy_adapter/core/utils.py +1 -182
  142. mcp_proxy_adapter/core/validation/__init__.py +21 -0
  143. mcp_proxy_adapter/core/validation/config_validator.py +211 -0
  144. mcp_proxy_adapter/core/validation/file_validator.py +73 -0
  145. mcp_proxy_adapter/core/validation/protocol_validator.py +191 -0
  146. mcp_proxy_adapter/core/validation/security_validator.py +58 -0
  147. mcp_proxy_adapter/core/validation/validation_result.py +27 -0
  148. mcp_proxy_adapter/custom_openapi.py +33 -652
  149. mcp_proxy_adapter/examples/bugfix_certificate_config.py +0 -23
  150. mcp_proxy_adapter/examples/check_config.py +0 -2
  151. mcp_proxy_adapter/examples/client_usage_example.py +164 -0
  152. mcp_proxy_adapter/examples/config_builder.py +13 -2
  153. mcp_proxy_adapter/examples/config_cli.py +0 -1
  154. mcp_proxy_adapter/examples/create_test_configs.py +0 -46
  155. mcp_proxy_adapter/examples/debug_request_state.py +0 -1
  156. mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +0 -47
  157. mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +0 -45
  158. mcp_proxy_adapter/examples/full_application/commands/echo_command.py +0 -12
  159. mcp_proxy_adapter/examples/full_application/commands/help_command.py +0 -12
  160. mcp_proxy_adapter/examples/full_application/commands/list_command.py +0 -7
  161. mcp_proxy_adapter/examples/full_application/hooks/__init__.py +0 -2
  162. mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +0 -59
  163. mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +0 -54
  164. mcp_proxy_adapter/examples/full_application/main.py +186 -150
  165. mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +0 -107
  166. mcp_proxy_adapter/examples/full_application/test_minimal_server.py +0 -24
  167. mcp_proxy_adapter/examples/full_application/test_server.py +0 -58
  168. mcp_proxy_adapter/examples/generate_config.py +65 -11
  169. mcp_proxy_adapter/examples/queue_demo_simple.py +632 -0
  170. mcp_proxy_adapter/examples/queue_integration_example.py +578 -0
  171. mcp_proxy_adapter/examples/queue_server_demo.py +82 -0
  172. mcp_proxy_adapter/examples/queue_server_example.py +85 -0
  173. mcp_proxy_adapter/examples/queue_server_simple.py +173 -0
  174. mcp_proxy_adapter/examples/required_certificates.py +0 -2
  175. mcp_proxy_adapter/examples/run_full_test_suite.py +0 -29
  176. mcp_proxy_adapter/examples/run_proxy_server.py +31 -71
  177. mcp_proxy_adapter/examples/run_security_tests_fixed.py +0 -27
  178. mcp_proxy_adapter/examples/security_test/__init__.py +18 -0
  179. mcp_proxy_adapter/examples/security_test/auth_manager.py +14 -0
  180. mcp_proxy_adapter/examples/security_test/ssl_context_manager.py +28 -0
  181. mcp_proxy_adapter/examples/security_test/test_client.py +159 -0
  182. mcp_proxy_adapter/examples/security_test/test_result.py +22 -0
  183. mcp_proxy_adapter/examples/security_test_client.py +24 -1075
  184. mcp_proxy_adapter/examples/setup/__init__.py +24 -0
  185. mcp_proxy_adapter/examples/setup/certificate_manager.py +215 -0
  186. mcp_proxy_adapter/examples/setup/config_generator.py +12 -0
  187. mcp_proxy_adapter/examples/setup/config_validator.py +118 -0
  188. mcp_proxy_adapter/examples/setup/environment_setup.py +62 -0
  189. mcp_proxy_adapter/examples/setup/test_files_generator.py +10 -0
  190. mcp_proxy_adapter/examples/setup/test_runner.py +89 -0
  191. mcp_proxy_adapter/examples/setup_test_environment.py +133 -1425
  192. mcp_proxy_adapter/examples/test_config.py +0 -3
  193. mcp_proxy_adapter/examples/test_config_builder.py +25 -405
  194. mcp_proxy_adapter/examples/test_examples.py +0 -1
  195. mcp_proxy_adapter/examples/test_framework_complete.py +0 -2
  196. mcp_proxy_adapter/examples/test_mcp_server.py +0 -1
  197. mcp_proxy_adapter/examples/test_protocol_examples.py +0 -1
  198. mcp_proxy_adapter/examples/universal_client.py +0 -6
  199. mcp_proxy_adapter/examples/update_config_certificates.py +0 -1
  200. mcp_proxy_adapter/examples/validate_generator_compatibility.py +0 -1
  201. mcp_proxy_adapter/examples/validate_generator_compatibility_simple.py +0 -187
  202. mcp_proxy_adapter/integrations/__init__.py +25 -0
  203. mcp_proxy_adapter/integrations/queuemgr_integration.py +462 -0
  204. mcp_proxy_adapter/main.py +70 -62
  205. mcp_proxy_adapter/openapi.py +0 -22
  206. mcp_proxy_adapter/version.py +1 -1
  207. {mcp_proxy_adapter-6.9.27.dist-info → mcp_proxy_adapter-6.9.29.dist-info}/METADATA +2 -1
  208. mcp_proxy_adapter-6.9.29.dist-info/RECORD +235 -0
  209. {mcp_proxy_adapter-6.9.27.dist-info → mcp_proxy_adapter-6.9.29.dist-info}/entry_points.txt +1 -1
  210. mcp_proxy_adapter-6.9.27.dist-info/RECORD +0 -149
  211. {mcp_proxy_adapter-6.9.27.dist-info → mcp_proxy_adapter-6.9.29.dist-info}/WHEEL +0 -0
  212. {mcp_proxy_adapter-6.9.27.dist-info → mcp_proxy_adapter-6.9.29.dist-info}/top_level.txt +0 -0
@@ -11,9 +11,7 @@ import os
11
11
  import sys
12
12
  import argparse
13
13
  import time
14
- import subprocess
15
14
  from pathlib import Path
16
- from typing import Dict, Any, Optional
17
15
 
18
16
  # Import mcp_security_framework
19
17
  try:
@@ -38,7 +36,6 @@ def validate_config_with_new_system(config: Dict[str, Any]) -> bool:
38
36
  """
39
37
  try:
40
38
  from mcp_proxy_adapter.core.config_validator import ConfigValidator
41
- from mcp_proxy_adapter.core.errors import ConfigError
42
39
 
43
40
  print("🔍 Validating configuration with new validation system...")
44
41
  validator = ConfigValidator()
@@ -9,7 +9,6 @@ email: vasilyvz@gmail.com
9
9
  import json
10
10
  import tempfile
11
11
  from pathlib import Path
12
- from typing import Dict, Any
13
12
 
14
13
  from config_builder import ConfigBuilder, ConfigFactory, Protocol, AuthMethod
15
14
 
@@ -17,421 +16,42 @@ from config_builder import ConfigBuilder, ConfigFactory, Protocol, AuthMethod
17
16
  class TestConfigBuilder:
18
17
  """Test cases for ConfigBuilder class."""
19
18
 
20
- def test_default_configuration(self):
21
- """Test default configuration structure."""
22
- builder = ConfigBuilder()
23
- config = builder.build()
24
-
25
- # Check required fields
26
- assert "uuid" in config
27
- assert "server" in config
28
- assert "ssl" in config
29
- assert "security" in config
30
- assert "protocols" in config
31
-
32
- # Check default values
33
- assert config["server"]["host"] == "0.0.0.0"
34
- assert config["server"]["port"] == 8000
35
- assert config["ssl"]["enabled"] is False
36
- assert config["security"]["enabled"] is False
37
-
38
- def test_set_server(self):
39
- """Test server configuration setting."""
40
- builder = ConfigBuilder()
41
- config = builder.set_server(host="127.0.0.1", port=9000, debug=True, log_level="DEBUG").build()
42
-
43
- assert config["server"]["host"] == "127.0.0.1"
44
- assert config["server"]["port"] == 9000
45
- assert config["server"]["debug"] is True
46
- assert config["server"]["log_level"] == "DEBUG"
47
-
48
- def test_set_logging(self):
49
- """Test logging configuration setting."""
50
- builder = ConfigBuilder()
51
- config = builder.set_logging(log_dir="/tmp/logs", level="WARNING", console_output=False).build()
52
-
53
- assert config["logging"]["log_dir"] == "/tmp/logs"
54
- assert config["logging"]["level"] == "WARNING"
55
- assert config["logging"]["console_output"] is False
56
-
57
- def test_set_protocol_http(self):
58
- """Test HTTP protocol configuration."""
59
- builder = ConfigBuilder()
60
- config = builder.set_protocol(Protocol.HTTP).build()
61
-
62
- assert config["ssl"]["enabled"] is False
63
- assert config["ssl"]["chk_hostname"] is False
64
- assert config["security"]["ssl"]["enabled"] is False
65
- assert config["security"]["ssl"]["chk_hostname"] is False
66
- assert config["protocols"]["allowed_protocols"] == ["http"]
67
- assert config["protocols"]["default_protocol"] == "http"
68
- assert config["protocols"]["protocol_handlers"]["http"]["enabled"] is True
69
- assert config["protocols"]["protocol_handlers"]["https"]["enabled"] is False
70
- assert config["protocols"]["protocol_handlers"]["mtls"]["enabled"] is False
71
-
72
- def test_set_protocol_https(self):
73
- """Test HTTPS protocol configuration."""
74
- builder = ConfigBuilder()
75
- config = builder.set_protocol(Protocol.HTTPS, cert_dir="/tmp/certs", key_dir="/tmp/keys").build()
76
-
77
- assert config["ssl"]["enabled"] is True
78
- assert config["ssl"]["chk_hostname"] is True
79
- assert config["ssl"]["cert_file"] == "/tmp/certs/server_cert.pem"
80
- assert config["ssl"]["key_file"] == "/tmp/keys/server_key.pem"
81
- assert config["ssl"]["ca_cert"] == "/tmp/certs/ca_cert.pem"
82
-
83
- assert config["security"]["ssl"]["enabled"] is True
84
- assert config["security"]["ssl"]["chk_hostname"] is True
85
- assert config["security"]["ssl"]["cert_file"] == "/tmp/certs/server_cert.pem"
86
- assert config["security"]["ssl"]["key_file"] == "/tmp/keys/server_key.pem"
87
- assert config["security"]["ssl"]["ca_cert_file"] == "/tmp/certs/ca_cert.pem"
88
-
89
- assert config["protocols"]["allowed_protocols"] == ["https"]
90
- assert config["protocols"]["default_protocol"] == "https"
91
- assert config["protocols"]["protocol_handlers"]["http"]["enabled"] is False
92
- assert config["protocols"]["protocol_handlers"]["https"]["enabled"] is True
93
- assert config["protocols"]["protocol_handlers"]["mtls"]["enabled"] is False
94
-
95
- def test_set_protocol_mtls(self):
96
- """Test mTLS protocol configuration."""
97
- builder = ConfigBuilder()
98
- config = builder.set_protocol(Protocol.MTLS, cert_dir="/tmp/certs", key_dir="/tmp/keys").build()
99
-
100
- assert config["ssl"]["enabled"] is True
101
- assert config["ssl"]["chk_hostname"] is True
102
- assert config["ssl"]["verify_client"] is True
103
- assert config["ssl"]["client_cert_required"] is True
104
-
105
- assert config["security"]["ssl"]["enabled"] is True
106
- assert config["security"]["ssl"]["chk_hostname"] is True
107
- assert config["security"]["ssl"]["client_cert_file"] == "/tmp/certs/admin_cert.pem"
108
- assert config["security"]["ssl"]["client_key_file"] == "/tmp/keys/admin_key.pem"
109
- assert config["security"]["ssl"]["verify_mode"] == "CERT_REQUIRED"
110
-
111
- assert config["protocols"]["allowed_protocols"] == ["mtls"]
112
- assert config["protocols"]["default_protocol"] == "mtls"
113
- assert config["protocols"]["protocol_handlers"]["http"]["enabled"] is False
114
- assert config["protocols"]["protocol_handlers"]["https"]["enabled"] is False
115
- assert config["protocols"]["protocol_handlers"]["mtls"]["enabled"] is True
116
- assert config["protocols"]["protocol_handlers"]["mtls"]["client_cert_required"] is True
117
-
118
- def test_set_auth_none(self):
119
- """Test no authentication configuration."""
120
- builder = ConfigBuilder()
121
- config = builder.set_auth(AuthMethod.NONE).build()
122
-
123
- assert config["security"]["enabled"] is False
124
- assert config["security"]["auth"]["enabled"] is False
125
-
126
- def test_set_auth_token(self):
127
- """Test token authentication configuration."""
128
- api_keys = {"admin": "admin-key", "user": "user-key"}
129
- builder = ConfigBuilder()
130
- config = builder.set_auth(AuthMethod.TOKEN, api_keys=api_keys).build()
131
-
132
- assert config["security"]["enabled"] is True
133
- assert config["security"]["auth"]["enabled"] is True
134
- assert config["security"]["auth"]["methods"] == ["api_key"]
135
- assert config["security"]["auth"]["api_keys"] == api_keys
136
-
137
- def test_set_auth_basic(self):
138
- """Test basic authentication configuration."""
139
- builder = ConfigBuilder()
140
- config = builder.set_auth(AuthMethod.BASIC).build()
141
-
142
- assert config["security"]["enabled"] is True
143
- assert config["security"]["auth"]["enabled"] is True
144
- assert config["security"]["auth"]["methods"] == ["basic_auth"]
145
- assert config["security"]["auth"]["basic_auth"] is True
146
-
147
- def test_set_auth_with_roles(self):
148
- """Test authentication with roles configuration."""
149
- roles = {"admin": ["read", "write"], "user": ["read"]}
150
- builder = ConfigBuilder()
151
- config = builder.set_auth(AuthMethod.TOKEN, roles=roles).build()
152
-
153
- assert config["security"]["auth"]["user_roles"] == roles
154
- assert config["roles"]["enabled"] is True
155
- assert config["security"]["permissions"]["enabled"] is True
156
-
157
- def test_set_proxy_registration(self):
158
- """Test proxy registration configuration."""
159
- builder = ConfigBuilder()
160
- config = builder.set_proxy_registration(
161
- enabled=True,
162
- proxy_url="https://proxy.example.com:8080",
163
- server_id="test_server",
164
- cert_dir="/tmp/certs"
165
- ).build()
166
-
167
- assert config["proxy_registration"]["enabled"] is True
168
- assert config["proxy_registration"]["server_url"] == "https://proxy.example.com:8080/register"
169
- assert config["proxy_registration"]["proxy_url"] == "https://proxy.example.com:8080"
170
- assert config["proxy_registration"]["fallback_proxy_url"] == "http://proxy.example.com:8080"
171
- assert config["proxy_registration"]["ssl"]["ca_cert"] == "/tmp/certs/ca_cert.pem"
172
- assert config["proxy_registration"]["server_id"] == "test_server"
173
- assert config["proxy_registration"]["server_name"] == "Test_Server Server"
174
- assert config["proxy_registration"]["description"] == "Test server for test_server"
175
-
176
- def test_set_debug(self):
177
- """Test debug configuration."""
178
- builder = ConfigBuilder()
179
- config = builder.set_debug(enabled=True, log_level="DEBUG").build()
180
-
181
- assert config["debug"]["enabled"] is True
182
- assert config["debug"]["log_level"] == "DEBUG"
183
- assert config["logging"]["level"] == "DEBUG"
184
-
185
- def test_set_commands(self):
186
- """Test commands configuration."""
187
- enabled = ["health", "echo", "test"]
188
- disabled = ["admin", "debug"]
189
- builder = ConfigBuilder()
190
- config = builder.set_commands(enabled_commands=enabled, disabled_commands=disabled).build()
191
-
192
- assert config["commands"]["enabled_commands"] == enabled
193
- assert config["commands"]["disabled_commands"] == disabled
194
19
 
195
- def test_set_hostname_check(self):
196
- """Test hostname check configuration."""
197
- builder = ConfigBuilder()
198
-
199
- # Test enabling hostname check
200
- config = builder.set_hostname_check(enabled=True).build()
201
- assert config["ssl"]["chk_hostname"] is True
202
- assert config["security"]["ssl"]["chk_hostname"] is True
203
-
204
- # Test disabling hostname check
205
- config = builder.set_hostname_check(enabled=False).build()
206
- assert config["ssl"]["chk_hostname"] is False
207
- assert config["security"]["ssl"]["chk_hostname"] is False
208
-
209
- def test_hostname_check_with_protocols(self):
210
- """Test hostname check behavior with different protocols."""
211
- # HTTP should have chk_hostname = False
212
- builder = ConfigBuilder()
213
- config = builder.set_protocol(Protocol.HTTP).build()
214
- assert config["ssl"]["chk_hostname"] is False
215
- assert config["security"]["ssl"]["chk_hostname"] is False
216
-
217
- # HTTPS should have chk_hostname = True
218
- builder = ConfigBuilder()
219
- config = builder.set_protocol(Protocol.HTTPS).build()
220
- assert config["ssl"]["chk_hostname"] is True
221
- assert config["security"]["ssl"]["chk_hostname"] is True
222
-
223
- # mTLS should have chk_hostname = True
224
- builder = ConfigBuilder()
225
- config = builder.set_protocol(Protocol.MTLS).build()
226
- assert config["ssl"]["chk_hostname"] is True
227
- assert config["security"]["ssl"]["chk_hostname"] is True
228
-
229
- def test_save_configuration(self):
230
- """Test saving configuration to file."""
231
- with tempfile.TemporaryDirectory() as temp_dir:
232
- builder = ConfigBuilder()
233
- builder.set_server(port=9000)
234
- config_path = builder.save(Path(temp_dir) / "test_config.json")
235
-
236
- assert config_path.exists()
237
-
238
- with open(config_path, 'r') as f:
239
- saved_config = json.load(f)
240
-
241
- assert saved_config["server"]["port"] == 9000
242
-
243
- def test_reset_configuration(self):
244
- """Test configuration reset."""
245
- builder = ConfigBuilder()
246
- builder.set_server(port=9000)
247
- builder.set_auth(AuthMethod.TOKEN)
248
-
249
- config1 = builder.build()
250
- assert config1["server"]["port"] == 9000
251
- assert config1["security"]["enabled"] is True
252
-
253
- builder.reset()
254
- config2 = builder.build()
255
- assert config2["server"]["port"] == 8000 # Default value
256
- assert config2["security"]["enabled"] is False # Default value
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
257
35
 
258
36
 
259
37
  class TestConfigFactory:
260
38
  """Test cases for ConfigFactory class."""
261
39
 
262
- def test_create_http_simple(self):
263
- """Test HTTP simple configuration creation."""
264
- config = ConfigFactory.create_http_simple(host="127.0.0.1", port=9000, log_dir="/tmp/logs")
265
-
266
- assert config["server"]["host"] == "127.0.0.1"
267
- assert config["server"]["port"] == 9000
268
- assert config["logging"]["log_dir"] == "/tmp/logs"
269
- assert config["ssl"]["enabled"] is False
270
- assert config["security"]["enabled"] is False
271
- assert config["protocols"]["allowed_protocols"] == ["http"]
272
- assert config["proxy_registration"]["enabled"] is False
273
-
274
- def test_create_http_token(self):
275
- """Test HTTP token configuration creation."""
276
- api_keys = {"admin": "admin-key", "user": "user-key"}
277
- config = ConfigFactory.create_http_token(api_keys=api_keys)
278
-
279
- assert config["ssl"]["enabled"] is False
280
- assert config["security"]["enabled"] is True
281
- assert config["security"]["auth"]["enabled"] is True
282
- assert config["security"]["auth"]["methods"] == ["api_key"]
283
- assert config["security"]["auth"]["api_keys"] == api_keys
284
-
285
- def test_create_https_simple(self):
286
- """Test HTTPS simple configuration creation."""
287
- config = ConfigFactory.create_https_simple(cert_dir="/tmp/certs", key_dir="/tmp/keys")
288
-
289
- assert config["ssl"]["enabled"] is True
290
- assert config["ssl"]["cert_file"] == "/tmp/certs/server_cert.pem"
291
- assert config["ssl"]["key_file"] == "/tmp/keys/server_key.pem"
292
- assert config["protocols"]["allowed_protocols"] == ["https"]
293
- assert config["security"]["ssl"]["enabled"] is True
294
-
295
- def test_create_https_token(self):
296
- """Test HTTPS token configuration creation."""
297
- api_keys = {"admin": "admin-key"}
298
- config = ConfigFactory.create_https_token(api_keys=api_keys)
299
-
300
- assert config["ssl"]["enabled"] is True
301
- assert config["security"]["enabled"] is True
302
- assert config["security"]["auth"]["enabled"] is True
303
- assert config["security"]["auth"]["api_keys"] == api_keys
304
- assert config["protocols"]["allowed_protocols"] == ["https"]
305
-
306
- def test_create_mtls_simple(self):
307
- """Test mTLS simple configuration creation."""
308
- config = ConfigFactory.create_mtls_simple()
309
-
310
- assert config["ssl"]["enabled"] is True
311
- assert config["ssl"]["verify_client"] is True
312
- assert config["ssl"]["client_cert_required"] is True
313
- assert config["protocols"]["allowed_protocols"] == ["mtls"]
314
- assert config["security"]["ssl"]["verify_mode"] == "CERT_REQUIRED"
315
-
316
- def test_create_mtls_with_roles(self):
317
- """Test mTLS with roles configuration creation."""
318
- roles = {"admin": ["read", "write"], "user": ["read"]}
319
- config = ConfigFactory.create_mtls_with_roles(roles=roles)
320
-
321
- assert config["ssl"]["enabled"] is True
322
- assert config["protocols"]["allowed_protocols"] == ["mtls"]
323
- assert config["security"]["auth"]["user_roles"] == roles
324
- assert config["roles"]["enabled"] is True
325
- assert config["security"]["permissions"]["enabled"] is True
326
-
327
- def test_create_mtls_with_proxy(self):
328
- """Test mTLS with proxy configuration creation."""
329
- config = ConfigFactory.create_mtls_with_proxy(
330
- proxy_url="https://proxy.example.com:8080",
331
- server_id="test_server"
332
- )
333
-
334
- assert config["ssl"]["enabled"] is True
335
- assert config["protocols"]["allowed_protocols"] == ["mtls"]
336
- assert config["proxy_registration"]["enabled"] is True
337
- assert config["proxy_registration"]["proxy_url"] == "https://proxy.example.com:8080"
338
- assert config["proxy_registration"]["server_id"] == "test_server"
339
-
340
- def test_create_full_featured(self):
341
- """Test full-featured configuration creation."""
342
- config = ConfigFactory.create_full_featured()
343
-
344
- assert config["ssl"]["enabled"] is True
345
- assert config["protocols"]["allowed_protocols"] == ["mtls"]
346
- assert config["security"]["enabled"] is True
347
- assert config["security"]["auth"]["enabled"] is True
348
- assert config["proxy_registration"]["enabled"] is True
349
- assert config["debug"]["enabled"] is True
350
- assert config["roles"]["enabled"] is True
351
- assert config["security"]["permissions"]["enabled"] is True
40
+
41
+
42
+
43
+
44
+
45
+
46
+
352
47
 
353
48
 
354
49
  class TestConfigurationCombinations:
355
50
  """Test all possible combinations of configuration parameters."""
356
51
 
357
- def test_all_protocol_auth_combinations(self):
358
- """Test all combinations of protocols and authentication methods."""
359
- protocols = [Protocol.HTTP, Protocol.HTTPS, Protocol.MTLS]
360
- auth_methods = [AuthMethod.NONE, AuthMethod.TOKEN, AuthMethod.BASIC]
361
-
362
- for protocol in protocols:
363
- for auth_method in auth_methods:
364
- builder = ConfigBuilder()
365
- config = (builder
366
- .set_protocol(protocol)
367
- .set_auth(auth_method)
368
- .build())
369
-
370
- # Verify protocol settings
371
- if protocol == Protocol.HTTP:
372
- assert config["ssl"]["enabled"] is False
373
- assert config["protocols"]["allowed_protocols"] == ["http"]
374
- elif protocol == Protocol.HTTPS:
375
- assert config["ssl"]["enabled"] is True
376
- assert config["protocols"]["allowed_protocols"] == ["https"]
377
- elif protocol == Protocol.MTLS:
378
- assert config["ssl"]["enabled"] is True
379
- assert config["ssl"]["verify_client"] is True
380
- assert config["protocols"]["allowed_protocols"] == ["mtls"]
381
-
382
- # Verify auth settings
383
- if auth_method == AuthMethod.NONE:
384
- assert config["security"]["enabled"] is False
385
- else:
386
- assert config["security"]["enabled"] is True
387
- assert config["security"]["auth"]["enabled"] is True
388
-
389
- def test_proxy_registration_with_all_protocols(self):
390
- """Test proxy registration with all protocols."""
391
- protocols = [Protocol.HTTP, Protocol.HTTPS, Protocol.MTLS]
392
-
393
- for protocol in protocols:
394
- builder = ConfigBuilder()
395
- config = (builder
396
- .set_protocol(protocol)
397
- .set_proxy_registration(enabled=True, proxy_url="https://proxy.test:8080")
398
- .build())
399
-
400
- assert config["proxy_registration"]["enabled"] is True
401
- assert config["proxy_registration"]["proxy_url"] == "https://proxy.test:8080"
402
- assert config["proxy_registration"]["server_url"] == "https://proxy.test:8080/register"
403
-
404
- def test_roles_with_all_auth_methods(self):
405
- """Test roles configuration with all authentication methods."""
406
- auth_methods = [AuthMethod.TOKEN, AuthMethod.BASIC]
407
- roles = {"admin": ["read", "write"], "user": ["read"]}
408
-
409
- for auth_method in auth_methods:
410
- builder = ConfigBuilder()
411
- config = (builder
412
- .set_auth(auth_method, roles=roles)
413
- .build())
414
-
415
- assert config["security"]["auth"]["user_roles"] == roles
416
- assert config["roles"]["enabled"] is True
417
- assert config["security"]["permissions"]["enabled"] is True
418
-
419
- def test_debug_with_all_combinations(self):
420
- """Test debug configuration with various combinations."""
421
- builder = ConfigBuilder()
422
- config = (builder
423
- .set_protocol(Protocol.HTTPS)
424
- .set_auth(AuthMethod.TOKEN)
425
- .set_proxy_registration(enabled=True)
426
- .set_debug(enabled=True)
427
- .build())
428
-
429
- assert config["debug"]["enabled"] is True
430
- assert config["debug"]["log_level"] == "DEBUG"
431
- assert config["logging"]["level"] == "DEBUG"
432
- assert config["ssl"]["enabled"] is True
433
- assert config["security"]["enabled"] is True
434
- assert config["proxy_registration"]["enabled"] is True
52
+
53
+
54
+
435
55
 
436
56
 
437
57
  def run_comprehensive_tests():
@@ -11,7 +11,6 @@ import subprocess
11
11
  import time
12
12
  import requests
13
13
  from pathlib import Path
14
- from typing import Dict, Any, List
15
14
 
16
15
  # Configuration for testing
17
16
  CONFIGS = {
@@ -13,8 +13,6 @@ import time
13
13
  import requests
14
14
  import ssl
15
15
  from pathlib import Path
16
- from typing import Dict, List, Optional, Tuple
17
- import logging
18
16
 
19
17
  # Configure logging
20
18
  logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
@@ -9,7 +9,6 @@ email: vasilyvz@gmail.com
9
9
  import asyncio
10
10
  import json
11
11
  import logging
12
- from typing import Any, Dict, List, Optional
13
12
  from mcp import types
14
13
  from mcp.server import Server
15
14
  from mcp.server.stdio import stdio_server
@@ -6,7 +6,6 @@ email: vasilyvz@gmail.com
6
6
  Test script for HTTP and HTTPS protocol examples with proxy registration.
7
7
  """
8
8
 
9
- import asyncio
10
9
  import json
11
10
  import os
12
11
  import subprocess
@@ -12,12 +12,9 @@ import json
12
12
  import os
13
13
  import ssl
14
14
  import time
15
- from typing import Dict, Any, Optional, List, Union
16
- from urllib.parse import urljoin
17
15
  from pathlib import Path
18
16
  import aiohttp
19
17
  import requests
20
- from requests.exceptions import RequestException
21
18
 
22
19
  # Import security framework components
23
20
  try:
@@ -27,16 +24,13 @@ try:
27
24
  CertificateManager,
28
25
  PermissionManager,
29
26
  )
30
- from mcp_security_framework.utils import (
31
27
  generate_api_key,
32
28
  create_jwt_token,
33
29
  validate_jwt_token,
34
30
  )
35
- from mcp_security_framework.utils import (
36
31
  extract_roles_from_cert,
37
32
  validate_certificate_chain,
38
33
  )
39
- from mcp_security_framework.utils import (
40
34
  create_ssl_context,
41
35
  validate_server_certificate,
42
36
  )
@@ -7,7 +7,6 @@ Author: Vasiliy Zdanovskiy
7
7
  email: vasilyvz@gmail.com
8
8
  """
9
9
  import json
10
- import os
11
10
  from pathlib import Path
12
11
  from typing import Dict, Any
13
12
 
@@ -11,7 +11,6 @@ import sys
11
11
  import tempfile
12
12
  import shutil
13
13
  from pathlib import Path
14
- from typing import Dict, Any, List
15
14
 
16
15
  # Add the project root to the path
17
16
  project_root = Path(__file__).parent.parent.parent