mcp-proxy-adapter 2.0.1__py3-none-any.whl → 6.9.50__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 (269) hide show
  1. mcp_proxy_adapter/__init__.py +47 -0
  2. mcp_proxy_adapter/__main__.py +13 -0
  3. mcp_proxy_adapter/api/__init__.py +0 -0
  4. mcp_proxy_adapter/api/app.py +66 -0
  5. mcp_proxy_adapter/api/core/__init__.py +18 -0
  6. mcp_proxy_adapter/api/core/app_factory.py +400 -0
  7. mcp_proxy_adapter/api/core/lifespan_manager.py +55 -0
  8. mcp_proxy_adapter/api/core/registration_context.py +356 -0
  9. mcp_proxy_adapter/api/core/registration_manager.py +307 -0
  10. mcp_proxy_adapter/api/core/registration_tasks.py +84 -0
  11. mcp_proxy_adapter/api/core/ssl_context_factory.py +88 -0
  12. mcp_proxy_adapter/api/handlers.py +181 -0
  13. mcp_proxy_adapter/api/middleware/__init__.py +21 -0
  14. mcp_proxy_adapter/api/middleware/base.py +54 -0
  15. mcp_proxy_adapter/api/middleware/command_permission_middleware.py +73 -0
  16. mcp_proxy_adapter/api/middleware/error_handling.py +76 -0
  17. mcp_proxy_adapter/api/middleware/factory.py +147 -0
  18. mcp_proxy_adapter/api/middleware/logging.py +31 -0
  19. mcp_proxy_adapter/api/middleware/performance.py +51 -0
  20. mcp_proxy_adapter/api/middleware/protocol_middleware.py +140 -0
  21. mcp_proxy_adapter/api/middleware/transport_middleware.py +87 -0
  22. mcp_proxy_adapter/api/middleware/unified_security.py +223 -0
  23. mcp_proxy_adapter/api/middleware/user_info_middleware.py +132 -0
  24. mcp_proxy_adapter/api/openapi/__init__.py +21 -0
  25. mcp_proxy_adapter/api/openapi/command_integration.py +105 -0
  26. mcp_proxy_adapter/api/openapi/openapi_generator.py +40 -0
  27. mcp_proxy_adapter/api/openapi/openapi_registry.py +62 -0
  28. mcp_proxy_adapter/api/openapi/schema_loader.py +116 -0
  29. mcp_proxy_adapter/api/schemas.py +270 -0
  30. mcp_proxy_adapter/api/tool_integration.py +131 -0
  31. mcp_proxy_adapter/api/tools.py +163 -0
  32. mcp_proxy_adapter/cli/__init__.py +12 -0
  33. mcp_proxy_adapter/cli/commands/__init__.py +15 -0
  34. mcp_proxy_adapter/cli/commands/client.py +100 -0
  35. mcp_proxy_adapter/cli/commands/config_generate.py +105 -0
  36. mcp_proxy_adapter/cli/commands/config_validate.py +94 -0
  37. mcp_proxy_adapter/cli/commands/generate.py +259 -0
  38. mcp_proxy_adapter/cli/commands/server.py +174 -0
  39. mcp_proxy_adapter/cli/commands/sets.py +132 -0
  40. mcp_proxy_adapter/cli/commands/testconfig.py +177 -0
  41. mcp_proxy_adapter/cli/examples/__init__.py +8 -0
  42. mcp_proxy_adapter/cli/examples/http_basic.py +82 -0
  43. mcp_proxy_adapter/cli/examples/https_token.py +96 -0
  44. mcp_proxy_adapter/cli/examples/mtls_roles.py +103 -0
  45. mcp_proxy_adapter/cli/main.py +63 -0
  46. mcp_proxy_adapter/cli/parser.py +338 -0
  47. mcp_proxy_adapter/cli/validators.py +231 -0
  48. mcp_proxy_adapter/client/jsonrpc_client/__init__.py +9 -0
  49. mcp_proxy_adapter/client/jsonrpc_client/client.py +42 -0
  50. mcp_proxy_adapter/client/jsonrpc_client/command_api.py +45 -0
  51. mcp_proxy_adapter/client/jsonrpc_client/proxy_api.py +224 -0
  52. mcp_proxy_adapter/client/jsonrpc_client/queue_api.py +60 -0
  53. mcp_proxy_adapter/client/jsonrpc_client/transport.py +108 -0
  54. mcp_proxy_adapter/client/proxy.py +123 -0
  55. mcp_proxy_adapter/commands/__init__.py +66 -0
  56. mcp_proxy_adapter/commands/auth_validation_command.py +69 -0
  57. mcp_proxy_adapter/commands/base.py +389 -0
  58. mcp_proxy_adapter/commands/builtin_commands.py +30 -0
  59. mcp_proxy_adapter/commands/catalog/__init__.py +20 -0
  60. mcp_proxy_adapter/commands/catalog/catalog_loader.py +34 -0
  61. mcp_proxy_adapter/commands/catalog/catalog_manager.py +122 -0
  62. mcp_proxy_adapter/commands/catalog/catalog_syncer.py +149 -0
  63. mcp_proxy_adapter/commands/catalog/command_catalog.py +43 -0
  64. mcp_proxy_adapter/commands/catalog/dependency_manager.py +37 -0
  65. mcp_proxy_adapter/commands/catalog_manager.py +97 -0
  66. mcp_proxy_adapter/commands/cert_monitor_command.py +552 -0
  67. mcp_proxy_adapter/commands/certificate_management_command.py +562 -0
  68. mcp_proxy_adapter/commands/command_registry.py +298 -0
  69. mcp_proxy_adapter/commands/config_command.py +102 -0
  70. mcp_proxy_adapter/commands/dependency_container.py +40 -0
  71. mcp_proxy_adapter/commands/dependency_manager.py +143 -0
  72. mcp_proxy_adapter/commands/echo_command.py +48 -0
  73. mcp_proxy_adapter/commands/health_command.py +142 -0
  74. mcp_proxy_adapter/commands/help_command.py +175 -0
  75. mcp_proxy_adapter/commands/hooks.py +172 -0
  76. mcp_proxy_adapter/commands/key_management_command.py +484 -0
  77. mcp_proxy_adapter/commands/load_command.py +123 -0
  78. mcp_proxy_adapter/commands/plugins_command.py +246 -0
  79. mcp_proxy_adapter/commands/protocol_management_command.py +216 -0
  80. mcp_proxy_adapter/commands/proxy_registration_command.py +319 -0
  81. mcp_proxy_adapter/commands/queue_commands.py +750 -0
  82. mcp_proxy_adapter/commands/registration_status_command.py +76 -0
  83. mcp_proxy_adapter/commands/registry/__init__.py +18 -0
  84. mcp_proxy_adapter/commands/registry/command_info.py +103 -0
  85. mcp_proxy_adapter/commands/registry/command_loader.py +207 -0
  86. mcp_proxy_adapter/commands/registry/command_manager.py +119 -0
  87. mcp_proxy_adapter/commands/registry/command_registry.py +217 -0
  88. mcp_proxy_adapter/commands/reload_command.py +136 -0
  89. mcp_proxy_adapter/commands/result.py +157 -0
  90. mcp_proxy_adapter/commands/role_test_command.py +99 -0
  91. mcp_proxy_adapter/commands/roles_management_command.py +502 -0
  92. mcp_proxy_adapter/commands/security_command.py +472 -0
  93. mcp_proxy_adapter/commands/settings_command.py +113 -0
  94. mcp_proxy_adapter/commands/ssl_setup_command.py +306 -0
  95. mcp_proxy_adapter/commands/token_management_command.py +500 -0
  96. mcp_proxy_adapter/commands/transport_management_command.py +129 -0
  97. mcp_proxy_adapter/commands/unload_command.py +92 -0
  98. mcp_proxy_adapter/config.py +32 -0
  99. mcp_proxy_adapter/core/__init__.py +8 -0
  100. mcp_proxy_adapter/core/app_factory.py +560 -0
  101. mcp_proxy_adapter/core/app_runner.py +318 -0
  102. mcp_proxy_adapter/core/auth_validator.py +508 -0
  103. mcp_proxy_adapter/core/certificate/__init__.py +20 -0
  104. mcp_proxy_adapter/core/certificate/certificate_creator.py +372 -0
  105. mcp_proxy_adapter/core/certificate/certificate_extractor.py +185 -0
  106. mcp_proxy_adapter/core/certificate/certificate_utils.py +249 -0
  107. mcp_proxy_adapter/core/certificate/certificate_validator.py +481 -0
  108. mcp_proxy_adapter/core/certificate/ssl_context_manager.py +65 -0
  109. mcp_proxy_adapter/core/certificate_utils.py +249 -0
  110. mcp_proxy_adapter/core/client.py +608 -0
  111. mcp_proxy_adapter/core/client_manager.py +271 -0
  112. mcp_proxy_adapter/core/client_security.py +411 -0
  113. mcp_proxy_adapter/core/config/__init__.py +18 -0
  114. mcp_proxy_adapter/core/config/config.py +237 -0
  115. mcp_proxy_adapter/core/config/config_factory.py +22 -0
  116. mcp_proxy_adapter/core/config/config_loader.py +66 -0
  117. mcp_proxy_adapter/core/config/feature_manager.py +31 -0
  118. mcp_proxy_adapter/core/config/simple_config.py +204 -0
  119. mcp_proxy_adapter/core/config/simple_config_generator.py +131 -0
  120. mcp_proxy_adapter/core/config/simple_config_validator.py +476 -0
  121. mcp_proxy_adapter/core/config_converter.py +252 -0
  122. mcp_proxy_adapter/core/config_validator.py +211 -0
  123. mcp_proxy_adapter/core/crl_utils.py +362 -0
  124. mcp_proxy_adapter/core/errors.py +276 -0
  125. mcp_proxy_adapter/core/job_manager.py +54 -0
  126. mcp_proxy_adapter/core/logging.py +250 -0
  127. mcp_proxy_adapter/core/mtls_asgi.py +140 -0
  128. mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
  129. mcp_proxy_adapter/core/mtls_proxy.py +229 -0
  130. mcp_proxy_adapter/core/mtls_server.py +154 -0
  131. mcp_proxy_adapter/core/protocol_manager.py +232 -0
  132. mcp_proxy_adapter/core/proxy/__init__.py +19 -0
  133. mcp_proxy_adapter/core/proxy/auth_manager.py +26 -0
  134. mcp_proxy_adapter/core/proxy/proxy_registration_manager.py +160 -0
  135. mcp_proxy_adapter/core/proxy/registration_client.py +186 -0
  136. mcp_proxy_adapter/core/proxy/ssl_manager.py +101 -0
  137. mcp_proxy_adapter/core/proxy_client.py +184 -0
  138. mcp_proxy_adapter/core/proxy_registration.py +80 -0
  139. mcp_proxy_adapter/core/role_utils.py +103 -0
  140. mcp_proxy_adapter/core/security_adapter.py +343 -0
  141. mcp_proxy_adapter/core/security_factory.py +96 -0
  142. mcp_proxy_adapter/core/security_integration.py +342 -0
  143. mcp_proxy_adapter/core/server_adapter.py +251 -0
  144. mcp_proxy_adapter/core/server_engine.py +217 -0
  145. mcp_proxy_adapter/core/settings.py +260 -0
  146. mcp_proxy_adapter/core/signal_handler.py +107 -0
  147. mcp_proxy_adapter/core/ssl_utils.py +161 -0
  148. mcp_proxy_adapter/core/transport_manager.py +153 -0
  149. mcp_proxy_adapter/core/unified_config_adapter.py +471 -0
  150. mcp_proxy_adapter/core/utils.py +101 -0
  151. mcp_proxy_adapter/core/validation/__init__.py +21 -0
  152. mcp_proxy_adapter/core/validation/config_validator.py +219 -0
  153. mcp_proxy_adapter/core/validation/file_validator.py +131 -0
  154. mcp_proxy_adapter/core/validation/protocol_validator.py +205 -0
  155. mcp_proxy_adapter/core/validation/security_validator.py +140 -0
  156. mcp_proxy_adapter/core/validation/validation_result.py +27 -0
  157. mcp_proxy_adapter/custom_openapi.py +58 -0
  158. mcp_proxy_adapter/examples/__init__.py +16 -0
  159. mcp_proxy_adapter/examples/basic_framework/__init__.py +9 -0
  160. mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +4 -0
  161. mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +4 -0
  162. mcp_proxy_adapter/examples/basic_framework/main.py +52 -0
  163. mcp_proxy_adapter/examples/bugfix_certificate_config.py +261 -0
  164. mcp_proxy_adapter/examples/cert_manager_bugfix.py +203 -0
  165. mcp_proxy_adapter/examples/check_config.py +413 -0
  166. mcp_proxy_adapter/examples/client_usage_example.py +164 -0
  167. mcp_proxy_adapter/examples/commands/__init__.py +5 -0
  168. mcp_proxy_adapter/examples/config_builder.py +234 -0
  169. mcp_proxy_adapter/examples/config_cli.py +282 -0
  170. mcp_proxy_adapter/examples/create_test_configs.py +174 -0
  171. mcp_proxy_adapter/examples/debug_request_state.py +130 -0
  172. mcp_proxy_adapter/examples/debug_role_chain.py +191 -0
  173. mcp_proxy_adapter/examples/demo_client.py +287 -0
  174. mcp_proxy_adapter/examples/full_application/__init__.py +12 -0
  175. mcp_proxy_adapter/examples/full_application/commands/__init__.py +8 -0
  176. mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +45 -0
  177. mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +52 -0
  178. mcp_proxy_adapter/examples/full_application/commands/echo_command.py +32 -0
  179. mcp_proxy_adapter/examples/full_application/commands/help_command.py +54 -0
  180. mcp_proxy_adapter/examples/full_application/commands/list_command.py +57 -0
  181. mcp_proxy_adapter/examples/full_application/hooks/__init__.py +5 -0
  182. mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +29 -0
  183. mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +27 -0
  184. mcp_proxy_adapter/examples/full_application/main.py +311 -0
  185. mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +161 -0
  186. mcp_proxy_adapter/examples/full_application/run_mtls.py +252 -0
  187. mcp_proxy_adapter/examples/full_application/run_simple.py +152 -0
  188. mcp_proxy_adapter/examples/full_application/test_minimal_server.py +45 -0
  189. mcp_proxy_adapter/examples/full_application/test_server.py +163 -0
  190. mcp_proxy_adapter/examples/full_application/test_simple_server.py +62 -0
  191. mcp_proxy_adapter/examples/generate_config.py +502 -0
  192. mcp_proxy_adapter/examples/proxy_registration_example.py +335 -0
  193. mcp_proxy_adapter/examples/queue_demo_simple.py +632 -0
  194. mcp_proxy_adapter/examples/queue_integration_example.py +578 -0
  195. mcp_proxy_adapter/examples/queue_server_demo.py +82 -0
  196. mcp_proxy_adapter/examples/queue_server_example.py +85 -0
  197. mcp_proxy_adapter/examples/queue_server_simple.py +173 -0
  198. mcp_proxy_adapter/examples/required_certificates.py +208 -0
  199. mcp_proxy_adapter/examples/run_example.py +77 -0
  200. mcp_proxy_adapter/examples/run_full_test_suite.py +619 -0
  201. mcp_proxy_adapter/examples/run_proxy_server.py +153 -0
  202. mcp_proxy_adapter/examples/run_security_tests_fixed.py +435 -0
  203. mcp_proxy_adapter/examples/security_test/__init__.py +18 -0
  204. mcp_proxy_adapter/examples/security_test/auth_manager.py +14 -0
  205. mcp_proxy_adapter/examples/security_test/ssl_context_manager.py +28 -0
  206. mcp_proxy_adapter/examples/security_test/test_client.py +159 -0
  207. mcp_proxy_adapter/examples/security_test/test_result.py +22 -0
  208. mcp_proxy_adapter/examples/security_test_client.py +72 -0
  209. mcp_proxy_adapter/examples/setup/__init__.py +24 -0
  210. mcp_proxy_adapter/examples/setup/certificate_manager.py +215 -0
  211. mcp_proxy_adapter/examples/setup/config_generator.py +12 -0
  212. mcp_proxy_adapter/examples/setup/config_validator.py +118 -0
  213. mcp_proxy_adapter/examples/setup/environment_setup.py +62 -0
  214. mcp_proxy_adapter/examples/setup/test_files_generator.py +10 -0
  215. mcp_proxy_adapter/examples/setup/test_runner.py +89 -0
  216. mcp_proxy_adapter/examples/setup_test_environment.py +235 -0
  217. mcp_proxy_adapter/examples/simple_protocol_test.py +125 -0
  218. mcp_proxy_adapter/examples/test_chk_hostname_automated.py +211 -0
  219. mcp_proxy_adapter/examples/test_config.py +205 -0
  220. mcp_proxy_adapter/examples/test_config_builder.py +110 -0
  221. mcp_proxy_adapter/examples/test_examples.py +308 -0
  222. mcp_proxy_adapter/examples/test_framework_complete.py +267 -0
  223. mcp_proxy_adapter/examples/test_mcp_server.py +187 -0
  224. mcp_proxy_adapter/examples/test_protocol_examples.py +337 -0
  225. mcp_proxy_adapter/examples/universal_client.py +674 -0
  226. mcp_proxy_adapter/examples/update_config_certificates.py +135 -0
  227. mcp_proxy_adapter/examples/validate_generator_compatibility.py +385 -0
  228. mcp_proxy_adapter/examples/validate_generator_compatibility_simple.py +61 -0
  229. mcp_proxy_adapter/integrations/__init__.py +25 -0
  230. mcp_proxy_adapter/integrations/queuemgr_integration.py +462 -0
  231. mcp_proxy_adapter/main.py +311 -0
  232. mcp_proxy_adapter/openapi.py +375 -0
  233. mcp_proxy_adapter/schemas/base_schema.json +114 -0
  234. mcp_proxy_adapter/schemas/openapi_schema.json +314 -0
  235. mcp_proxy_adapter/schemas/roles.json +37 -0
  236. mcp_proxy_adapter/schemas/roles_schema.json +162 -0
  237. mcp_proxy_adapter/version.py +5 -0
  238. mcp_proxy_adapter-6.9.50.dist-info/METADATA +1088 -0
  239. mcp_proxy_adapter-6.9.50.dist-info/RECORD +242 -0
  240. {mcp_proxy_adapter-2.0.1.dist-info → mcp_proxy_adapter-6.9.50.dist-info}/WHEEL +1 -1
  241. mcp_proxy_adapter-6.9.50.dist-info/entry_points.txt +14 -0
  242. mcp_proxy_adapter-6.9.50.dist-info/top_level.txt +1 -0
  243. adapters/__init__.py +0 -16
  244. analyzers/__init__.py +0 -14
  245. analyzers/docstring_analyzer.py +0 -199
  246. analyzers/type_analyzer.py +0 -151
  247. cli/__init__.py +0 -12
  248. cli/__main__.py +0 -79
  249. cli/command_runner.py +0 -233
  250. dispatchers/__init__.py +0 -14
  251. dispatchers/base_dispatcher.py +0 -85
  252. dispatchers/json_rpc_dispatcher.py +0 -198
  253. generators/__init__.py +0 -14
  254. generators/endpoint_generator.py +0 -172
  255. generators/openapi_generator.py +0 -254
  256. generators/rest_api_generator.py +0 -207
  257. mcp_proxy_adapter-2.0.1.dist-info/METADATA +0 -272
  258. mcp_proxy_adapter-2.0.1.dist-info/RECORD +0 -28
  259. mcp_proxy_adapter-2.0.1.dist-info/licenses/LICENSE +0 -21
  260. mcp_proxy_adapter-2.0.1.dist-info/top_level.txt +0 -7
  261. openapi_schema/__init__.py +0 -38
  262. openapi_schema/command_registry.py +0 -312
  263. openapi_schema/rest_schema.py +0 -510
  264. openapi_schema/rpc_generator.py +0 -307
  265. openapi_schema/rpc_schema.py +0 -416
  266. validators/__init__.py +0 -14
  267. validators/base_validator.py +0 -23
  268. validators/docstring_validator.py +0 -75
  269. validators/metadata_validator.py +0 -76
@@ -0,0 +1,472 @@
1
+ """
2
+ Security Command - Direct Framework Integration
3
+
4
+ This command provides direct access to mcp_security_framework functionality
5
+ through JSON-RPC interface.
6
+
7
+ Author: Vasiliy Zdanovskiy
8
+ email: vasilyvz@gmail.com
9
+ """
10
+
11
+ import logging
12
+
13
+ from .base import Command
14
+
15
+ from mcp_proxy_adapter.core.logging import get_global_logger
16
+ logger = logging.getLogger(__name__)
17
+
18
+
19
+ class SecurityResult(CommandResult):
20
+ """Result class for security operations."""
21
+
22
+ def __init__(
23
+ self,
24
+ operation: str,
25
+ success: bool,
26
+ data: Dict[str, Any] = None,
27
+ error: str = None,
28
+ ):
29
+ """
30
+ Initialize security result.
31
+
32
+ Args:
33
+ operation: Security operation performed
34
+ success: Whether operation was successful
35
+ data: Operation data
36
+ error: Error message if any
37
+ """
38
+ self.operation = operation
39
+ self.success = success
40
+ self.data = data or {}
41
+ self.error = error
42
+
43
+
44
+ @classmethod
45
+
46
+
47
+ class SecurityCommand(Command):
48
+ """
49
+ Security command using mcp_security_framework.
50
+
51
+ Provides direct access to security framework functionality:
52
+ - Authentication (API key, JWT, certificate)
53
+ - Certificate management
54
+ - Permission management
55
+ - Rate limiting
56
+ """
57
+
58
+ # Command metadata
59
+ name = "security"
60
+ version = "1.0.0"
61
+ descr = "Security operations using mcp_security_framework"
62
+ category = "security"
63
+ author = "MCP Proxy Adapter Team"
64
+ email = "team@mcp-proxy-adapter.com"
65
+ source_url = "https://github.com/mcp-proxy-adapter"
66
+ result_class = SecurityResult
67
+
68
+ def __init__(self, config: Dict[str, Any]):
69
+ """Initialize security command."""
70
+ super().__init__()
71
+ self.config = config
72
+ self.security_integration = create_security_integration(config)
73
+
74
+ if not self.security_integration:
75
+ get_global_logger().warning(
76
+ "Security framework not available, security command will fail"
77
+ )
78
+
79
+ async def execute(self, **kwargs) -> CommandResult:
80
+ """
81
+ Execute security command.
82
+
83
+ Args:
84
+ **kwargs: Command parameters including:
85
+ - action: Action to perform (auth, cert, permission, rate_limit, status)
86
+ - method: Authentication method (api_key, jwt, certificate)
87
+ - api_key: API key for authentication
88
+ - token: JWT token for authentication
89
+ - cert_path: Certificate path for operations
90
+ - common_name: Common name for certificate creation
91
+ - user_id: User ID for permission operations
92
+ - permission: Permission to check
93
+ - role: Role for operations
94
+ - identifier: Identifier for rate limiting
95
+
96
+ Returns:
97
+ CommandResult with security operation status
98
+ """
99
+ if not self.security_integration:
100
+ return SecurityResult(
101
+ operation="security",
102
+ success=False,
103
+ error="Security framework not available",
104
+ )
105
+
106
+ action = kwargs.get("action", "status")
107
+
108
+ try:
109
+ if action == "auth":
110
+ return await self._handle_auth(kwargs)
111
+ elif action == "cert":
112
+ return await self._handle_certificate(kwargs)
113
+ elif action == "permission":
114
+ return await self._handle_permission(kwargs)
115
+ elif action == "rate_limit":
116
+ return await self._handle_rate_limit(kwargs)
117
+ elif action == "status":
118
+ return await self._handle_status(kwargs)
119
+ else:
120
+ return SecurityResult(
121
+ operation=action, success=False, error=f"Unknown action: {action}"
122
+ )
123
+
124
+ except Exception as e:
125
+ get_global_logger().error(f"Security command error: {e}")
126
+ return SecurityResult(
127
+ operation=action,
128
+ success=False,
129
+ error=f"Security operation failed: {str(e)}",
130
+ )
131
+
132
+ async def _handle_auth(self, kwargs: Dict[str, Any]) -> SecurityResult:
133
+ """Handle authentication operations."""
134
+ method = kwargs.get("method", "api_key")
135
+
136
+ if method == "api_key":
137
+ api_key = kwargs.get("api_key")
138
+ if not api_key:
139
+ return SecurityResult(
140
+ operation="auth_api_key", success=False, error="API key required"
141
+ )
142
+
143
+ result = await self.security_integration.authenticate_api_key(api_key)
144
+ return SecurityResult(
145
+ operation="auth_api_key",
146
+ success=result.is_valid,
147
+ data={
148
+ "user_id": result.user_id,
149
+ "roles": result.roles,
150
+ "permissions": result.permissions,
151
+ },
152
+ error=result.error_message if not result.is_valid else None,
153
+ )
154
+
155
+ elif method == "jwt":
156
+ token = kwargs.get("token")
157
+ if not token:
158
+ return SecurityResult(
159
+ operation="auth_jwt", success=False, error="JWT token required"
160
+ )
161
+
162
+ result = await self.security_integration.authenticate_jwt(token)
163
+ return SecurityResult(
164
+ operation="auth_jwt",
165
+ success=result.is_valid,
166
+ data={
167
+ "user_id": result.user_id,
168
+ "roles": result.roles,
169
+ "permissions": result.permissions,
170
+ },
171
+ error=result.error_message if not result.is_valid else None,
172
+ )
173
+
174
+ elif method == "certificate":
175
+ cert_path = kwargs.get("cert_path")
176
+ if not cert_path:
177
+ return SecurityResult(
178
+ operation="auth_certificate",
179
+ success=False,
180
+ error="Certificate path required",
181
+ )
182
+
183
+ # Read certificate data
184
+ try:
185
+ with open(cert_path, "rb") as f:
186
+ cert_data = f.read()
187
+
188
+ result = await self.security_integration.authenticate_certificate(
189
+ cert_data
190
+ )
191
+ return SecurityResult(
192
+ operation="auth_certificate",
193
+ success=result.is_valid,
194
+ data={
195
+ "user_id": result.user_id,
196
+ "roles": result.roles,
197
+ "permissions": result.permissions,
198
+ },
199
+ error=result.error_message if not result.is_valid else None,
200
+ )
201
+ except Exception as e:
202
+ return SecurityResult(
203
+ operation="auth_certificate",
204
+ success=False,
205
+ error=f"Failed to read certificate: {str(e)}",
206
+ )
207
+
208
+ else:
209
+ return SecurityResult(
210
+ operation="auth",
211
+ success=False,
212
+ error=f"Unknown authentication method: {method}",
213
+ )
214
+
215
+ async def _handle_certificate(self, kwargs: Dict[str, Any]) -> SecurityResult:
216
+ """Handle certificate operations."""
217
+ cert_action = kwargs.get("cert_action", "validate")
218
+
219
+ if cert_action == "create_ca":
220
+ common_name = kwargs.get("common_name")
221
+ if not common_name:
222
+ return SecurityResult(
223
+ operation="cert_create_ca",
224
+ success=False,
225
+ error="Common name required",
226
+ )
227
+
228
+ try:
229
+ cert_pair = await self.security_integration.create_ca_certificate(
230
+ common_name
231
+ )
232
+ return SecurityResult(
233
+ operation="cert_create_ca",
234
+ success=True,
235
+ data={
236
+ "cert_path": str(cert_pair.cert_path),
237
+ "key_path": str(cert_pair.key_path),
238
+ "common_name": common_name,
239
+ },
240
+ )
241
+ except Exception as e:
242
+ return SecurityResult(
243
+ operation="cert_create_ca",
244
+ success=False,
245
+ error=f"Failed to create CA certificate: {str(e)}",
246
+ )
247
+
248
+ elif cert_action == "create_client":
249
+ common_name = kwargs.get("common_name")
250
+ if not common_name:
251
+ return SecurityResult(
252
+ operation="cert_create_client",
253
+ success=False,
254
+ error="Common name required",
255
+ )
256
+
257
+ try:
258
+ cert_pair = await self.security_integration.create_client_certificate(
259
+ common_name
260
+ )
261
+ return SecurityResult(
262
+ operation="cert_create_client",
263
+ success=True,
264
+ data={
265
+ "cert_path": str(cert_pair.cert_path),
266
+ "key_path": str(cert_pair.key_path),
267
+ "common_name": common_name,
268
+ },
269
+ )
270
+ except Exception as e:
271
+ return SecurityResult(
272
+ operation="cert_create_client",
273
+ success=False,
274
+ error=f"Failed to create client certificate: {str(e)}",
275
+ )
276
+
277
+ elif cert_action == "validate":
278
+ cert_path = kwargs.get("cert_path")
279
+ if not cert_path:
280
+ return SecurityResult(
281
+ operation="cert_validate",
282
+ success=False,
283
+ error="Certificate path required",
284
+ )
285
+
286
+ try:
287
+ is_valid = await self.security_integration.validate_certificate(
288
+ cert_path
289
+ )
290
+ return SecurityResult(
291
+ operation="cert_validate",
292
+ success=is_valid,
293
+ data={"cert_path": cert_path, "valid": is_valid},
294
+ )
295
+ except Exception as e:
296
+ return SecurityResult(
297
+ operation="cert_validate",
298
+ success=False,
299
+ error=f"Failed to validate certificate: {str(e)}",
300
+ )
301
+
302
+ elif cert_action == "extract_roles":
303
+ cert_path = kwargs.get("cert_path")
304
+ if not cert_path:
305
+ return SecurityResult(
306
+ operation="cert_extract_roles",
307
+ success=False,
308
+ error="Certificate path required",
309
+ )
310
+
311
+ try:
312
+ roles = await self.security_integration.extract_roles_from_certificate(
313
+ cert_path
314
+ )
315
+ return SecurityResult(
316
+ operation="cert_extract_roles",
317
+ success=True,
318
+ data={"cert_path": cert_path, "roles": roles},
319
+ )
320
+ except Exception as e:
321
+ return SecurityResult(
322
+ operation="cert_extract_roles",
323
+ success=False,
324
+ error=f"Failed to extract roles: {str(e)}",
325
+ )
326
+
327
+ else:
328
+ return SecurityResult(
329
+ operation="cert",
330
+ success=False,
331
+ error=f"Unknown certificate action: {cert_action}",
332
+ )
333
+
334
+ async def _handle_permission(self, kwargs: Dict[str, Any]) -> SecurityResult:
335
+ """Handle permission operations."""
336
+ perm_action = kwargs.get("perm_action", "check")
337
+ user_id = kwargs.get("user_id")
338
+
339
+ if not user_id:
340
+ return SecurityResult(
341
+ operation="permission", success=False, error="User ID required"
342
+ )
343
+
344
+ if perm_action == "check":
345
+ permission = kwargs.get("permission")
346
+ if not permission:
347
+ return SecurityResult(
348
+ operation="permission_check",
349
+ success=False,
350
+ error="Permission required",
351
+ )
352
+
353
+ try:
354
+ has_permission = await self.security_integration.check_permission(
355
+ user_id, permission
356
+ )
357
+ return SecurityResult(
358
+ operation="permission_check",
359
+ success=True,
360
+ data={
361
+ "user_id": user_id,
362
+ "permission": permission,
363
+ "has_permission": has_permission,
364
+ },
365
+ )
366
+ except Exception as e:
367
+ return SecurityResult(
368
+ operation="permission_check",
369
+ success=False,
370
+ error=f"Failed to check permission: {str(e)}",
371
+ )
372
+
373
+ elif perm_action == "get_roles":
374
+ try:
375
+ roles = await self.security_integration.get_user_roles(user_id)
376
+ return SecurityResult(
377
+ operation="permission_get_roles",
378
+ success=True,
379
+ data={"user_id": user_id, "roles": roles},
380
+ )
381
+ except Exception as e:
382
+ return SecurityResult(
383
+ operation="permission_get_roles",
384
+ success=False,
385
+ error=f"Failed to get user roles: {str(e)}",
386
+ )
387
+
388
+ elif perm_action == "add_role":
389
+ role = kwargs.get("role")
390
+ if not role:
391
+ return SecurityResult(
392
+ operation="permission_add_role",
393
+ success=False,
394
+ error="Role required",
395
+ )
396
+
397
+ try:
398
+ success = await self.security_integration.add_user_role(user_id, role)
399
+ return SecurityResult(
400
+ operation="permission_add_role",
401
+ success=success,
402
+ data={"user_id": user_id, "role": role, "added": success},
403
+ )
404
+ except Exception as e:
405
+ return SecurityResult(
406
+ operation="permission_add_role",
407
+ success=False,
408
+ error=f"Failed to add role: {str(e)}",
409
+ )
410
+
411
+ else:
412
+ return SecurityResult(
413
+ operation="permission",
414
+ success=False,
415
+ error=f"Unknown permission action: {perm_action}",
416
+ )
417
+
418
+ async def _handle_rate_limit(self, kwargs: Dict[str, Any]) -> SecurityResult:
419
+ """Handle rate limiting operations."""
420
+ identifier = kwargs.get("identifier")
421
+ if not identifier:
422
+ return SecurityResult(
423
+ operation="rate_limit", success=False, error="Identifier required"
424
+ )
425
+
426
+ try:
427
+ # Check rate limit
428
+ is_allowed = await self.security_integration.check_rate_limit(identifier)
429
+
430
+ if is_allowed:
431
+ # Increment counter
432
+ await self.security_integration.increment_rate_limit(identifier)
433
+
434
+ # Get rate limit info
435
+ info = await self.security_integration.get_rate_limit_info(identifier)
436
+
437
+ return SecurityResult(
438
+ operation="rate_limit_check",
439
+ success=True,
440
+ data={"identifier": identifier, "allowed": is_allowed, "info": info},
441
+ )
442
+ except Exception as e:
443
+ return SecurityResult(
444
+ operation="rate_limit_check",
445
+ success=False,
446
+ error=f"Failed to check rate limit: {str(e)}",
447
+ )
448
+
449
+ async def _handle_status(self, kwargs: Dict[str, Any]) -> SecurityResult:
450
+ """Handle status operations."""
451
+ try:
452
+ security_config = self.security_integration.get_security_config()
453
+
454
+ return SecurityResult(
455
+ operation="status",
456
+ success=True,
457
+ data={
458
+ "security_enabled": self.security_integration.is_security_enabled(),
459
+ "public_paths": self.security_integration.get_public_paths(),
460
+ "auth_enabled": security_config.auth.enabled,
461
+ "ssl_enabled": security_config.ssl.enabled,
462
+ "permissions_enabled": security_config.permissions.enabled,
463
+ "rate_limit_enabled": security_config.rate_limit.enabled,
464
+ "certificates_enabled": security_config.certificates.enabled,
465
+ },
466
+ )
467
+ except Exception as e:
468
+ return SecurityResult(
469
+ operation="status",
470
+ success=False,
471
+ error=f"Failed to get status: {str(e)}",
472
+ )
@@ -0,0 +1,113 @@
1
+ """
2
+ Settings command for demonstrating configuration management.
3
+ """
4
+
5
+ from typing import Dict, Any, Optional
6
+ from mcp_proxy_adapter.commands.base import Command
7
+ from mcp_proxy_adapter.core.settings import (
8
+ Settings,
9
+ get_setting,
10
+ set_setting,
11
+ reload_settings,
12
+ )
13
+
14
+
15
+ class SettingsResult:
16
+ """Result class for settings command."""
17
+
18
+ def __init__(
19
+ self,
20
+ success: bool,
21
+ operation: str,
22
+ key: Optional[str] = None,
23
+ value: Any = None,
24
+ all_settings: Optional[Dict[str, Any]] = None,
25
+ error_message: Optional[str] = None,
26
+ ):
27
+ self.success = success
28
+ self.operation = operation
29
+ self.key = key
30
+ self.value = value
31
+ self.all_settings = all_settings
32
+ self.error_message = error_message
33
+
34
+
35
+ @classmethod
36
+
37
+
38
+ class SettingsCommand(Command):
39
+ """Command for managing framework settings."""
40
+
41
+ name = "settings"
42
+ description = "Manage framework settings and configuration"
43
+
44
+ async def execute(self, **params) -> SettingsResult:
45
+ """
46
+ Execute settings command.
47
+
48
+ Args:
49
+ operation: Operation to perform (get, set, get_all, reload)
50
+ key: Configuration key (for get/set operations)
51
+ value: Configuration value (for set operation)
52
+
53
+ Returns:
54
+ SettingsResult with operation result
55
+ """
56
+ try:
57
+ operation = params.get("operation", "get_all")
58
+
59
+ if operation == "get":
60
+ key = params.get("key")
61
+ if not key:
62
+ return SettingsResult(
63
+ success=False,
64
+ operation=operation,
65
+ error_message="Key is required for 'get' operation",
66
+ )
67
+
68
+ value = get_setting(key)
69
+ return SettingsResult(
70
+ success=True, operation=operation, key=key, value=value
71
+ )
72
+
73
+ elif operation == "set":
74
+ key = params.get("key")
75
+ value = params.get("value")
76
+
77
+ if not key:
78
+ return SettingsResult(
79
+ success=False,
80
+ operation=operation,
81
+ error_message="Key is required for 'set' operation",
82
+ )
83
+
84
+ set_setting(key, value)
85
+ return SettingsResult(
86
+ success=True, operation=operation, key=key, value=value
87
+ )
88
+
89
+ elif operation == "get_all":
90
+ all_settings = Settings.get_all_settings()
91
+ return SettingsResult(
92
+ success=True, operation=operation, all_settings=all_settings
93
+ )
94
+
95
+ elif operation == "reload":
96
+ reload_settings()
97
+ return SettingsResult(success=True, operation=operation)
98
+
99
+ else:
100
+ return SettingsResult(
101
+ success=False,
102
+ operation=operation,
103
+ error_message=f"Unknown operation: {operation}. Supported operations: get, set, get_all, reload",
104
+ )
105
+
106
+ except Exception as e:
107
+ return SettingsResult(
108
+ success=False,
109
+ operation=params.get("operation", "unknown"),
110
+ error_message=str(e),
111
+ )
112
+
113
+ @classmethod