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,132 @@
1
+ """
2
+ User Info Middleware
3
+
4
+ This middleware extracts user information from authentication headers
5
+ and sets it in request.state for use by commands.
6
+
7
+ Author: Vasiliy Zdanovskiy
8
+ email: vasilyvz@gmail.com
9
+ """
10
+
11
+ from typing import Dict, Any, Callable, Awaitable
12
+ from fastapi import Request, Response
13
+ from starlette.middleware.base import BaseHTTPMiddleware
14
+
15
+ from mcp_proxy_adapter.core.logging import get_global_logger
16
+
17
+ # Import mcp_security_framework components
18
+ try:
19
+ from mcp_security_framework import AuthManager, PermissionManager
20
+ from mcp_security_framework.schemas.config import AuthConfig, PermissionConfig
21
+
22
+ _MCP_SECURITY_AVAILABLE = True
23
+ print("✅ mcp_security_framework available in middleware")
24
+ except ImportError:
25
+ _MCP_SECURITY_AVAILABLE = False
26
+ print("⚠️ mcp_security_framework not available in middleware, " "using basic auth")
27
+
28
+
29
+ class UserInfoMiddleware(BaseHTTPMiddleware):
30
+ """
31
+ Middleware for setting user information in request.state.
32
+
33
+ This middleware extracts user information from authentication headers
34
+ and sets it in request.state for use by commands.
35
+ """
36
+
37
+ def __init__(self, app, config: Dict[str, Any]):
38
+ """
39
+ Initialize user info middleware.
40
+
41
+ Args:
42
+ app: FastAPI application
43
+ config: Configuration dictionary
44
+ """
45
+ super().__init__(app)
46
+ self.config = config
47
+
48
+ # Initialize AuthManager if available
49
+ self.auth_manager = None
50
+ self._security_available = _MCP_SECURITY_AVAILABLE
51
+
52
+ if self._security_available:
53
+ try:
54
+ # Get API keys configuration
55
+ security_config = config.get("security", {})
56
+
57
+ # Check if security is enabled
58
+ security_enabled = security_config.get("enabled", False)
59
+ if not security_enabled:
60
+ get_global_logger().info("ℹ️ Security disabled in configuration, using basic auth")
61
+ self._security_available = False
62
+ else:
63
+ auth_config = security_config.get("auth", {})
64
+ permissions_config = security_config.get("permissions", {})
65
+
66
+ # Check if permissions are enabled
67
+ permissions_enabled = permissions_config.get("enabled", False)
68
+
69
+ # Only use mcp_security_framework if permissions are enabled
70
+ if permissions_enabled:
71
+ # Create AuthConfig for mcp_security_framework
72
+ mcp_auth_config = AuthConfig(
73
+ enabled=True,
74
+ methods=["api_key"],
75
+ api_keys=auth_config.get("api_keys", {}),
76
+ )
77
+
78
+ # Create PermissionConfig for mcp_security_framework
79
+ roles_file = permissions_config.get("roles_file")
80
+ if roles_file is None:
81
+ get_global_logger().warning("⚠️ Permissions enabled but no roles_file specified, using default configuration")
82
+ roles_file = None
83
+
84
+ mcp_permission_config = PermissionConfig(
85
+ roles_file=roles_file,
86
+ default_role=permissions_config.get("default_role", "guest"),
87
+ admin_role=permissions_config.get("admin_role", "admin"),
88
+ role_hierarchy=permissions_config.get("role_hierarchy", {}),
89
+ permission_cache_enabled=permissions_config.get(
90
+ "permission_cache_enabled", True
91
+ ),
92
+ permission_cache_ttl=permissions_config.get(
93
+ "permission_cache_ttl", 300
94
+ ),
95
+ wildcard_permissions=permissions_config.get(
96
+ "wildcard_permissions", False
97
+ ),
98
+ strict_mode=permissions_config.get("strict_mode", True),
99
+ roles=permissions_config.get("roles", {}),
100
+ )
101
+
102
+ # Initialize PermissionManager first
103
+ self.permission_manager = PermissionManager(mcp_permission_config)
104
+
105
+ # Initialize AuthManager with permission_manager
106
+ self.auth_manager = AuthManager(
107
+ mcp_auth_config, self.permission_manager
108
+ )
109
+ get_global_logger().info(
110
+ "✅ User info middleware initialized with " "mcp_security_framework"
111
+ )
112
+ else:
113
+ # When permissions are disabled, use basic auth without mcp_security_framework
114
+ get_global_logger().info("ℹ️ Permissions disabled, using basic token auth without mcp_security_framework")
115
+ self._security_available = False
116
+ # Initialize api_keys for basic auth
117
+ self.api_keys = auth_config.get("api_keys", {})
118
+ except Exception as e:
119
+ get_global_logger().warning(f"⚠️ Failed to initialize AuthManager: {e}")
120
+ self._security_available = False
121
+
122
+ # Always initialize api_keys for fallback
123
+ security_config = config.get("security", {})
124
+ auth_config = security_config.get("auth", {})
125
+ self.api_keys = auth_config.get("api_keys", {})
126
+
127
+ if not self._security_available:
128
+ # Fallback to basic API key handling
129
+ get_global_logger().info("ℹ️ User info middleware initialized with basic auth")
130
+ else:
131
+ get_global_logger().info("ℹ️ User info middleware initialized with mcp_security_framework (fallback enabled)")
132
+
@@ -0,0 +1,21 @@
1
+ """
2
+ Author: Vasiliy Zdanovskiy
3
+ email: vasilyvz@gmail.com
4
+
5
+ OpenAPI schema generation package for MCP Proxy Adapter.
6
+ """
7
+
8
+ from .openapi_generator import CustomOpenAPIGenerator
9
+ from .schema_loader import SchemaLoader
10
+ from .command_integration import CommandIntegrator
11
+ from .openapi_registry import OpenAPIRegistry
12
+ from .custom_openapi import custom_openapi, custom_openapi_with_fallback
13
+
14
+ __all__ = [
15
+ "CustomOpenAPIGenerator",
16
+ "SchemaLoader",
17
+ "CommandIntegrator",
18
+ "OpenAPIRegistry",
19
+ "custom_openapi",
20
+ "custom_openapi_with_fallback",
21
+ ]
@@ -0,0 +1,105 @@
1
+ """
2
+ Author: Vasiliy Zdanovskiy
3
+ email: vasilyvz@gmail.com
4
+
5
+ Command integration utilities for OpenAPI generation.
6
+ """
7
+
8
+ from typing import Dict, Any, Type
9
+
10
+ from mcp_proxy_adapter.commands.command_registry import registry
11
+ from mcp_proxy_adapter.commands.base import Command
12
+ from mcp_proxy_adapter.core.logging import get_global_logger
13
+
14
+
15
+ class CommandIntegrator:
16
+ """Integrator for adding commands to OpenAPI schema."""
17
+
18
+ def __init__(self):
19
+ """Initialize command integrator."""
20
+ self.logger = get_global_logger()
21
+
22
+
23
+ def _create_params_schema(self, cmd_class: Type[Command]) -> Dict[str, Any]:
24
+ """
25
+ Create a schema for command parameters.
26
+
27
+ Args:
28
+ cmd_class: The command class to create schema for.
29
+
30
+ Returns:
31
+ Dict containing the parameter schema.
32
+ """
33
+ try:
34
+ # Get the command schema
35
+ schema = cmd_class.get_schema()
36
+
37
+ if not schema or "properties" not in schema:
38
+ return {"type": "object", "properties": {}}
39
+
40
+ # Convert to OpenAPI format
41
+ openapi_schema = {
42
+ "type": "object",
43
+ "properties": {},
44
+ "required": schema.get("required", [])
45
+ }
46
+
47
+ # Convert properties
48
+ for prop_name, prop_schema in schema["properties"].items():
49
+ openapi_schema["properties"][prop_name] = self._convert_property_schema(prop_schema)
50
+
51
+ return openapi_schema
52
+
53
+ except Exception as e:
54
+ self.logger.warning(f"Failed to create params schema for {cmd_class.__name__}: {e}")
55
+ return {"type": "object", "properties": {}}
56
+
57
+ def _convert_property_schema(self, prop_schema: Dict[str, Any]) -> Dict[str, Any]:
58
+ """
59
+ Convert property schema to OpenAPI format.
60
+
61
+ Args:
62
+ prop_schema: Property schema to convert.
63
+
64
+ Returns:
65
+ OpenAPI property schema.
66
+ """
67
+ openapi_prop = {}
68
+
69
+ # Handle type
70
+ if "type" in prop_schema:
71
+ openapi_prop["type"] = prop_schema["type"]
72
+
73
+ # Handle description
74
+ if "description" in prop_schema:
75
+ openapi_prop["description"] = prop_schema["description"]
76
+
77
+ # Handle default
78
+ if "default" in prop_schema:
79
+ openapi_prop["default"] = prop_schema["default"]
80
+
81
+ # Handle enum
82
+ if "enum" in prop_schema:
83
+ openapi_prop["enum"] = prop_schema["enum"]
84
+
85
+ # Handle minimum/maximum
86
+ if "minimum" in prop_schema:
87
+ openapi_prop["minimum"] = prop_schema["minimum"]
88
+ if "maximum" in prop_schema:
89
+ openapi_prop["maximum"] = prop_schema["maximum"]
90
+
91
+ # Handle minLength/maxLength
92
+ if "minLength" in prop_schema:
93
+ openapi_prop["minLength"] = prop_schema["minLength"]
94
+ if "maxLength" in prop_schema:
95
+ openapi_prop["maxLength"] = prop_schema["maxLength"]
96
+
97
+ # Handle pattern
98
+ if "pattern" in prop_schema:
99
+ openapi_prop["pattern"] = prop_schema["pattern"]
100
+
101
+ # Handle items for arrays
102
+ if "items" in prop_schema:
103
+ openapi_prop["items"] = self._convert_property_schema(prop_schema["items"])
104
+
105
+ return openapi_prop
@@ -0,0 +1,40 @@
1
+ """
2
+ Author: Vasiliy Zdanovskiy
3
+ email: vasilyvz@gmail.com
4
+
5
+ Main OpenAPI generator for MCP Proxy Adapter.
6
+ """
7
+
8
+ from copy import deepcopy
9
+ from typing import Any, Dict, Optional
10
+
11
+ from fastapi import FastAPI
12
+
13
+ from mcp_proxy_adapter.core.logging import get_global_logger
14
+ from .schema_loader import SchemaLoader
15
+ from .command_integration import CommandIntegrator
16
+
17
+
18
+ class CustomOpenAPIGenerator:
19
+ """
20
+ Custom OpenAPI schema generator for compatibility with MCP-Proxy.
21
+
22
+ EN:
23
+ This generator creates an OpenAPI schema that matches the format expected by MCP-Proxy,
24
+ enabling dynamic command loading and proper tool representation in AI models.
25
+ Allows overriding title, description, and version for schema customization.
26
+
27
+ RU:
28
+ Кастомный генератор схемы OpenAPI для совместимости с MCP-Proxy.
29
+ Позволяет создавать схему OpenAPI в формате, ожидаемом MCP-Proxy,
30
+ с возможностью динамической подгрузки команд и корректного отображения инструментов для AI-моделей.
31
+ Поддерживает переопределение title, description и version для кастомизации схемы.
32
+ """
33
+
34
+ def __init__(self):
35
+ """Initialize the generator."""
36
+ self.logger = get_global_logger()
37
+ self.schema_loader = SchemaLoader()
38
+ self.command_integrator = CommandIntegrator()
39
+ self.base_schema = self.schema_loader.load_base_schema()
40
+
@@ -0,0 +1,62 @@
1
+ """
2
+ Author: Vasiliy Zdanovskiy
3
+ email: vasilyvz@gmail.com
4
+
5
+ Registry for OpenAPI generators.
6
+ """
7
+
8
+ from typing import Dict, Callable, Optional, List
9
+
10
+ from mcp_proxy_adapter.core.logging import get_global_logger
11
+
12
+
13
+ class OpenAPIRegistry:
14
+ """Registry for OpenAPI generators."""
15
+
16
+ def __init__(self):
17
+ """Initialize OpenAPI registry."""
18
+ self.logger = get_global_logger()
19
+ self._generators: Dict[str, Callable] = {}
20
+
21
+ def register_generator(self, name: str, generator: Callable) -> None:
22
+ """
23
+ Register an OpenAPI generator.
24
+
25
+ Args:
26
+ name: Generator name
27
+ generator: Generator function
28
+ """
29
+ self._generators[name] = generator
30
+ self.logger.debug(f"Registered OpenAPI generator: {name}")
31
+
32
+ def get_generator(self, name: str) -> Optional[Callable]:
33
+ """
34
+ Get an OpenAPI generator by name.
35
+
36
+ Args:
37
+ name: Generator name
38
+
39
+ Returns:
40
+ Generator function or None if not found
41
+ """
42
+ return self._generators.get(name)
43
+
44
+ def list_generators(self) -> List[str]:
45
+ """
46
+ List all registered generators.
47
+
48
+ Returns:
49
+ List of generator names
50
+ """
51
+ return list(self._generators.keys())
52
+
53
+
54
+
55
+ # Global registry instance
56
+ _registry = OpenAPIRegistry()
57
+
58
+
59
+
60
+
61
+
62
+
@@ -0,0 +1,116 @@
1
+ """
2
+ Author: Vasiliy Zdanovskiy
3
+ email: vasilyvz@gmail.com
4
+
5
+ Schema loading utilities for OpenAPI generation.
6
+ """
7
+
8
+ import json
9
+ from pathlib import Path
10
+ from typing import Dict, Any
11
+
12
+ from mcp_proxy_adapter.core.logging import get_global_logger
13
+
14
+
15
+ class SchemaLoader:
16
+ """Loader for OpenAPI base schemas."""
17
+
18
+ def __init__(self):
19
+ """Initialize schema loader."""
20
+ self.logger = get_global_logger()
21
+ self.base_schema_path = (
22
+ Path(__file__).parent.parent.parent / "schemas" / "openapi_schema.json"
23
+ )
24
+
25
+
26
+ def get_fallback_schema(self) -> Dict[str, Any]:
27
+ """
28
+ Get a fallback OpenAPI schema when the base schema file is not available.
29
+
30
+ Returns:
31
+ Dict containing a basic OpenAPI schema.
32
+ """
33
+ return {
34
+ "openapi": "3.0.2",
35
+ "info": {
36
+ "title": "MCP Microservice API",
37
+ "description": "API для выполнения команд микросервиса",
38
+ "version": "1.0.0"
39
+ },
40
+ "paths": {
41
+ "/cmd": {
42
+ "post": {
43
+ "summary": "Execute Command",
44
+ "description": "Executes a command via JSON-RPC protocol.",
45
+ "operationId": "execute_command",
46
+ "requestBody": {
47
+ "content": {
48
+ "application/json": {
49
+ "schema": {
50
+ "oneOf": [
51
+ { "$ref": "#/components/schemas/CommandRequest" },
52
+ { "$ref": "#/components/schemas/JsonRpcRequest" }
53
+ ]
54
+ }
55
+ }
56
+ },
57
+ "required": True
58
+ },
59
+ "responses": {
60
+ "200": {
61
+ "description": "Successful Response",
62
+ "content": {
63
+ "application/json": {
64
+ "schema": {
65
+ "oneOf": [
66
+ { "$ref": "#/components/schemas/CommandResponse" },
67
+ { "$ref": "#/components/schemas/JsonRpcResponse" }
68
+ ]
69
+ }
70
+ }
71
+ }
72
+ }
73
+ }
74
+ }
75
+ }
76
+ },
77
+ "components": {
78
+ "schemas": {
79
+ "CommandRequest": {
80
+ "type": "object",
81
+ "properties": {
82
+ "command": {"type": "string"},
83
+ "params": {"type": "object"}
84
+ },
85
+ "required": ["command"]
86
+ },
87
+ "CommandResponse": {
88
+ "type": "object",
89
+ "properties": {
90
+ "success": {"type": "boolean"},
91
+ "data": {"type": "object"},
92
+ "error": {"type": "string"}
93
+ }
94
+ },
95
+ "JsonRpcRequest": {
96
+ "type": "object",
97
+ "properties": {
98
+ "jsonrpc": {"type": "string", "enum": ["2.0"]},
99
+ "method": {"type": "string"},
100
+ "params": {"type": "object"},
101
+ "id": {"type": "string"}
102
+ },
103
+ "required": ["jsonrpc", "method", "id"]
104
+ },
105
+ "JsonRpcResponse": {
106
+ "type": "object",
107
+ "properties": {
108
+ "jsonrpc": {"type": "string", "enum": ["2.0"]},
109
+ "result": {"type": "object"},
110
+ "error": {"type": "object"},
111
+ "id": {"type": "string"}
112
+ }
113
+ }
114
+ }
115
+ }
116
+ }