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.
- mcp_proxy_adapter/__init__.py +47 -0
- mcp_proxy_adapter/__main__.py +13 -0
- mcp_proxy_adapter/api/__init__.py +0 -0
- mcp_proxy_adapter/api/app.py +66 -0
- mcp_proxy_adapter/api/core/__init__.py +18 -0
- mcp_proxy_adapter/api/core/app_factory.py +400 -0
- mcp_proxy_adapter/api/core/lifespan_manager.py +55 -0
- mcp_proxy_adapter/api/core/registration_context.py +356 -0
- mcp_proxy_adapter/api/core/registration_manager.py +307 -0
- mcp_proxy_adapter/api/core/registration_tasks.py +84 -0
- mcp_proxy_adapter/api/core/ssl_context_factory.py +88 -0
- mcp_proxy_adapter/api/handlers.py +181 -0
- mcp_proxy_adapter/api/middleware/__init__.py +21 -0
- mcp_proxy_adapter/api/middleware/base.py +54 -0
- mcp_proxy_adapter/api/middleware/command_permission_middleware.py +73 -0
- mcp_proxy_adapter/api/middleware/error_handling.py +76 -0
- mcp_proxy_adapter/api/middleware/factory.py +147 -0
- mcp_proxy_adapter/api/middleware/logging.py +31 -0
- mcp_proxy_adapter/api/middleware/performance.py +51 -0
- mcp_proxy_adapter/api/middleware/protocol_middleware.py +140 -0
- mcp_proxy_adapter/api/middleware/transport_middleware.py +87 -0
- mcp_proxy_adapter/api/middleware/unified_security.py +223 -0
- mcp_proxy_adapter/api/middleware/user_info_middleware.py +132 -0
- mcp_proxy_adapter/api/openapi/__init__.py +21 -0
- mcp_proxy_adapter/api/openapi/command_integration.py +105 -0
- mcp_proxy_adapter/api/openapi/openapi_generator.py +40 -0
- mcp_proxy_adapter/api/openapi/openapi_registry.py +62 -0
- mcp_proxy_adapter/api/openapi/schema_loader.py +116 -0
- mcp_proxy_adapter/api/schemas.py +270 -0
- mcp_proxy_adapter/api/tool_integration.py +131 -0
- mcp_proxy_adapter/api/tools.py +163 -0
- mcp_proxy_adapter/cli/__init__.py +12 -0
- mcp_proxy_adapter/cli/commands/__init__.py +15 -0
- mcp_proxy_adapter/cli/commands/client.py +100 -0
- mcp_proxy_adapter/cli/commands/config_generate.py +105 -0
- mcp_proxy_adapter/cli/commands/config_validate.py +94 -0
- mcp_proxy_adapter/cli/commands/generate.py +259 -0
- mcp_proxy_adapter/cli/commands/server.py +174 -0
- mcp_proxy_adapter/cli/commands/sets.py +132 -0
- mcp_proxy_adapter/cli/commands/testconfig.py +177 -0
- mcp_proxy_adapter/cli/examples/__init__.py +8 -0
- mcp_proxy_adapter/cli/examples/http_basic.py +82 -0
- mcp_proxy_adapter/cli/examples/https_token.py +96 -0
- mcp_proxy_adapter/cli/examples/mtls_roles.py +103 -0
- mcp_proxy_adapter/cli/main.py +63 -0
- mcp_proxy_adapter/cli/parser.py +338 -0
- mcp_proxy_adapter/cli/validators.py +231 -0
- mcp_proxy_adapter/client/jsonrpc_client/__init__.py +9 -0
- mcp_proxy_adapter/client/jsonrpc_client/client.py +42 -0
- mcp_proxy_adapter/client/jsonrpc_client/command_api.py +45 -0
- mcp_proxy_adapter/client/jsonrpc_client/proxy_api.py +224 -0
- mcp_proxy_adapter/client/jsonrpc_client/queue_api.py +60 -0
- mcp_proxy_adapter/client/jsonrpc_client/transport.py +108 -0
- mcp_proxy_adapter/client/proxy.py +123 -0
- mcp_proxy_adapter/commands/__init__.py +66 -0
- mcp_proxy_adapter/commands/auth_validation_command.py +69 -0
- mcp_proxy_adapter/commands/base.py +389 -0
- mcp_proxy_adapter/commands/builtin_commands.py +30 -0
- mcp_proxy_adapter/commands/catalog/__init__.py +20 -0
- mcp_proxy_adapter/commands/catalog/catalog_loader.py +34 -0
- mcp_proxy_adapter/commands/catalog/catalog_manager.py +122 -0
- mcp_proxy_adapter/commands/catalog/catalog_syncer.py +149 -0
- mcp_proxy_adapter/commands/catalog/command_catalog.py +43 -0
- mcp_proxy_adapter/commands/catalog/dependency_manager.py +37 -0
- mcp_proxy_adapter/commands/catalog_manager.py +97 -0
- mcp_proxy_adapter/commands/cert_monitor_command.py +552 -0
- mcp_proxy_adapter/commands/certificate_management_command.py +562 -0
- mcp_proxy_adapter/commands/command_registry.py +298 -0
- mcp_proxy_adapter/commands/config_command.py +102 -0
- mcp_proxy_adapter/commands/dependency_container.py +40 -0
- mcp_proxy_adapter/commands/dependency_manager.py +143 -0
- mcp_proxy_adapter/commands/echo_command.py +48 -0
- mcp_proxy_adapter/commands/health_command.py +142 -0
- mcp_proxy_adapter/commands/help_command.py +175 -0
- mcp_proxy_adapter/commands/hooks.py +172 -0
- mcp_proxy_adapter/commands/key_management_command.py +484 -0
- mcp_proxy_adapter/commands/load_command.py +123 -0
- mcp_proxy_adapter/commands/plugins_command.py +246 -0
- mcp_proxy_adapter/commands/protocol_management_command.py +216 -0
- mcp_proxy_adapter/commands/proxy_registration_command.py +319 -0
- mcp_proxy_adapter/commands/queue_commands.py +750 -0
- mcp_proxy_adapter/commands/registration_status_command.py +76 -0
- mcp_proxy_adapter/commands/registry/__init__.py +18 -0
- mcp_proxy_adapter/commands/registry/command_info.py +103 -0
- mcp_proxy_adapter/commands/registry/command_loader.py +207 -0
- mcp_proxy_adapter/commands/registry/command_manager.py +119 -0
- mcp_proxy_adapter/commands/registry/command_registry.py +217 -0
- mcp_proxy_adapter/commands/reload_command.py +136 -0
- mcp_proxy_adapter/commands/result.py +157 -0
- mcp_proxy_adapter/commands/role_test_command.py +99 -0
- mcp_proxy_adapter/commands/roles_management_command.py +502 -0
- mcp_proxy_adapter/commands/security_command.py +472 -0
- mcp_proxy_adapter/commands/settings_command.py +113 -0
- mcp_proxy_adapter/commands/ssl_setup_command.py +306 -0
- mcp_proxy_adapter/commands/token_management_command.py +500 -0
- mcp_proxy_adapter/commands/transport_management_command.py +129 -0
- mcp_proxy_adapter/commands/unload_command.py +92 -0
- mcp_proxy_adapter/config.py +32 -0
- mcp_proxy_adapter/core/__init__.py +8 -0
- mcp_proxy_adapter/core/app_factory.py +560 -0
- mcp_proxy_adapter/core/app_runner.py +318 -0
- mcp_proxy_adapter/core/auth_validator.py +508 -0
- mcp_proxy_adapter/core/certificate/__init__.py +20 -0
- mcp_proxy_adapter/core/certificate/certificate_creator.py +372 -0
- mcp_proxy_adapter/core/certificate/certificate_extractor.py +185 -0
- mcp_proxy_adapter/core/certificate/certificate_utils.py +249 -0
- mcp_proxy_adapter/core/certificate/certificate_validator.py +481 -0
- mcp_proxy_adapter/core/certificate/ssl_context_manager.py +65 -0
- mcp_proxy_adapter/core/certificate_utils.py +249 -0
- mcp_proxy_adapter/core/client.py +608 -0
- mcp_proxy_adapter/core/client_manager.py +271 -0
- mcp_proxy_adapter/core/client_security.py +411 -0
- mcp_proxy_adapter/core/config/__init__.py +18 -0
- mcp_proxy_adapter/core/config/config.py +237 -0
- mcp_proxy_adapter/core/config/config_factory.py +22 -0
- mcp_proxy_adapter/core/config/config_loader.py +66 -0
- mcp_proxy_adapter/core/config/feature_manager.py +31 -0
- mcp_proxy_adapter/core/config/simple_config.py +204 -0
- mcp_proxy_adapter/core/config/simple_config_generator.py +131 -0
- mcp_proxy_adapter/core/config/simple_config_validator.py +476 -0
- mcp_proxy_adapter/core/config_converter.py +252 -0
- mcp_proxy_adapter/core/config_validator.py +211 -0
- mcp_proxy_adapter/core/crl_utils.py +362 -0
- mcp_proxy_adapter/core/errors.py +276 -0
- mcp_proxy_adapter/core/job_manager.py +54 -0
- mcp_proxy_adapter/core/logging.py +250 -0
- mcp_proxy_adapter/core/mtls_asgi.py +140 -0
- mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
- mcp_proxy_adapter/core/mtls_proxy.py +229 -0
- mcp_proxy_adapter/core/mtls_server.py +154 -0
- mcp_proxy_adapter/core/protocol_manager.py +232 -0
- mcp_proxy_adapter/core/proxy/__init__.py +19 -0
- mcp_proxy_adapter/core/proxy/auth_manager.py +26 -0
- mcp_proxy_adapter/core/proxy/proxy_registration_manager.py +160 -0
- mcp_proxy_adapter/core/proxy/registration_client.py +186 -0
- mcp_proxy_adapter/core/proxy/ssl_manager.py +101 -0
- mcp_proxy_adapter/core/proxy_client.py +184 -0
- mcp_proxy_adapter/core/proxy_registration.py +80 -0
- mcp_proxy_adapter/core/role_utils.py +103 -0
- mcp_proxy_adapter/core/security_adapter.py +343 -0
- mcp_proxy_adapter/core/security_factory.py +96 -0
- mcp_proxy_adapter/core/security_integration.py +342 -0
- mcp_proxy_adapter/core/server_adapter.py +251 -0
- mcp_proxy_adapter/core/server_engine.py +217 -0
- mcp_proxy_adapter/core/settings.py +260 -0
- mcp_proxy_adapter/core/signal_handler.py +107 -0
- mcp_proxy_adapter/core/ssl_utils.py +161 -0
- mcp_proxy_adapter/core/transport_manager.py +153 -0
- mcp_proxy_adapter/core/unified_config_adapter.py +471 -0
- mcp_proxy_adapter/core/utils.py +101 -0
- mcp_proxy_adapter/core/validation/__init__.py +21 -0
- mcp_proxy_adapter/core/validation/config_validator.py +219 -0
- mcp_proxy_adapter/core/validation/file_validator.py +131 -0
- mcp_proxy_adapter/core/validation/protocol_validator.py +205 -0
- mcp_proxy_adapter/core/validation/security_validator.py +140 -0
- mcp_proxy_adapter/core/validation/validation_result.py +27 -0
- mcp_proxy_adapter/custom_openapi.py +58 -0
- mcp_proxy_adapter/examples/__init__.py +16 -0
- mcp_proxy_adapter/examples/basic_framework/__init__.py +9 -0
- mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +4 -0
- mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +4 -0
- mcp_proxy_adapter/examples/basic_framework/main.py +52 -0
- mcp_proxy_adapter/examples/bugfix_certificate_config.py +261 -0
- mcp_proxy_adapter/examples/cert_manager_bugfix.py +203 -0
- mcp_proxy_adapter/examples/check_config.py +413 -0
- mcp_proxy_adapter/examples/client_usage_example.py +164 -0
- mcp_proxy_adapter/examples/commands/__init__.py +5 -0
- mcp_proxy_adapter/examples/config_builder.py +234 -0
- mcp_proxy_adapter/examples/config_cli.py +282 -0
- mcp_proxy_adapter/examples/create_test_configs.py +174 -0
- mcp_proxy_adapter/examples/debug_request_state.py +130 -0
- mcp_proxy_adapter/examples/debug_role_chain.py +191 -0
- mcp_proxy_adapter/examples/demo_client.py +287 -0
- mcp_proxy_adapter/examples/full_application/__init__.py +12 -0
- mcp_proxy_adapter/examples/full_application/commands/__init__.py +8 -0
- mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +45 -0
- mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +52 -0
- mcp_proxy_adapter/examples/full_application/commands/echo_command.py +32 -0
- mcp_proxy_adapter/examples/full_application/commands/help_command.py +54 -0
- mcp_proxy_adapter/examples/full_application/commands/list_command.py +57 -0
- mcp_proxy_adapter/examples/full_application/hooks/__init__.py +5 -0
- mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +29 -0
- mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +27 -0
- mcp_proxy_adapter/examples/full_application/main.py +311 -0
- mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +161 -0
- mcp_proxy_adapter/examples/full_application/run_mtls.py +252 -0
- mcp_proxy_adapter/examples/full_application/run_simple.py +152 -0
- mcp_proxy_adapter/examples/full_application/test_minimal_server.py +45 -0
- mcp_proxy_adapter/examples/full_application/test_server.py +163 -0
- mcp_proxy_adapter/examples/full_application/test_simple_server.py +62 -0
- mcp_proxy_adapter/examples/generate_config.py +502 -0
- mcp_proxy_adapter/examples/proxy_registration_example.py +335 -0
- mcp_proxy_adapter/examples/queue_demo_simple.py +632 -0
- mcp_proxy_adapter/examples/queue_integration_example.py +578 -0
- mcp_proxy_adapter/examples/queue_server_demo.py +82 -0
- mcp_proxy_adapter/examples/queue_server_example.py +85 -0
- mcp_proxy_adapter/examples/queue_server_simple.py +173 -0
- mcp_proxy_adapter/examples/required_certificates.py +208 -0
- mcp_proxy_adapter/examples/run_example.py +77 -0
- mcp_proxy_adapter/examples/run_full_test_suite.py +619 -0
- mcp_proxy_adapter/examples/run_proxy_server.py +153 -0
- mcp_proxy_adapter/examples/run_security_tests_fixed.py +435 -0
- mcp_proxy_adapter/examples/security_test/__init__.py +18 -0
- mcp_proxy_adapter/examples/security_test/auth_manager.py +14 -0
- mcp_proxy_adapter/examples/security_test/ssl_context_manager.py +28 -0
- mcp_proxy_adapter/examples/security_test/test_client.py +159 -0
- mcp_proxy_adapter/examples/security_test/test_result.py +22 -0
- mcp_proxy_adapter/examples/security_test_client.py +72 -0
- mcp_proxy_adapter/examples/setup/__init__.py +24 -0
- mcp_proxy_adapter/examples/setup/certificate_manager.py +215 -0
- mcp_proxy_adapter/examples/setup/config_generator.py +12 -0
- mcp_proxy_adapter/examples/setup/config_validator.py +118 -0
- mcp_proxy_adapter/examples/setup/environment_setup.py +62 -0
- mcp_proxy_adapter/examples/setup/test_files_generator.py +10 -0
- mcp_proxy_adapter/examples/setup/test_runner.py +89 -0
- mcp_proxy_adapter/examples/setup_test_environment.py +235 -0
- mcp_proxy_adapter/examples/simple_protocol_test.py +125 -0
- mcp_proxy_adapter/examples/test_chk_hostname_automated.py +211 -0
- mcp_proxy_adapter/examples/test_config.py +205 -0
- mcp_proxy_adapter/examples/test_config_builder.py +110 -0
- mcp_proxy_adapter/examples/test_examples.py +308 -0
- mcp_proxy_adapter/examples/test_framework_complete.py +267 -0
- mcp_proxy_adapter/examples/test_mcp_server.py +187 -0
- mcp_proxy_adapter/examples/test_protocol_examples.py +337 -0
- mcp_proxy_adapter/examples/universal_client.py +674 -0
- mcp_proxy_adapter/examples/update_config_certificates.py +135 -0
- mcp_proxy_adapter/examples/validate_generator_compatibility.py +385 -0
- mcp_proxy_adapter/examples/validate_generator_compatibility_simple.py +61 -0
- mcp_proxy_adapter/integrations/__init__.py +25 -0
- mcp_proxy_adapter/integrations/queuemgr_integration.py +462 -0
- mcp_proxy_adapter/main.py +311 -0
- mcp_proxy_adapter/openapi.py +375 -0
- mcp_proxy_adapter/schemas/base_schema.json +114 -0
- mcp_proxy_adapter/schemas/openapi_schema.json +314 -0
- mcp_proxy_adapter/schemas/roles.json +37 -0
- mcp_proxy_adapter/schemas/roles_schema.json +162 -0
- mcp_proxy_adapter/version.py +5 -0
- mcp_proxy_adapter-6.9.50.dist-info/METADATA +1088 -0
- mcp_proxy_adapter-6.9.50.dist-info/RECORD +242 -0
- {mcp_proxy_adapter-2.0.1.dist-info → mcp_proxy_adapter-6.9.50.dist-info}/WHEEL +1 -1
- mcp_proxy_adapter-6.9.50.dist-info/entry_points.txt +14 -0
- mcp_proxy_adapter-6.9.50.dist-info/top_level.txt +1 -0
- adapters/__init__.py +0 -16
- analyzers/__init__.py +0 -14
- analyzers/docstring_analyzer.py +0 -199
- analyzers/type_analyzer.py +0 -151
- cli/__init__.py +0 -12
- cli/__main__.py +0 -79
- cli/command_runner.py +0 -233
- dispatchers/__init__.py +0 -14
- dispatchers/base_dispatcher.py +0 -85
- dispatchers/json_rpc_dispatcher.py +0 -198
- generators/__init__.py +0 -14
- generators/endpoint_generator.py +0 -172
- generators/openapi_generator.py +0 -254
- generators/rest_api_generator.py +0 -207
- mcp_proxy_adapter-2.0.1.dist-info/METADATA +0 -272
- mcp_proxy_adapter-2.0.1.dist-info/RECORD +0 -28
- mcp_proxy_adapter-2.0.1.dist-info/licenses/LICENSE +0 -21
- mcp_proxy_adapter-2.0.1.dist-info/top_level.txt +0 -7
- openapi_schema/__init__.py +0 -38
- openapi_schema/command_registry.py +0 -312
- openapi_schema/rest_schema.py +0 -510
- openapi_schema/rpc_generator.py +0 -307
- openapi_schema/rpc_schema.py +0 -416
- validators/__init__.py +0 -14
- validators/base_validator.py +0 -23
- validators/docstring_validator.py +0 -75
- 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
|
+
}
|