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,502 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Configuration Generator CLI for MCP Proxy Adapter
|
|
4
|
+
Generates configurations based on command line flags with validation.
|
|
5
|
+
|
|
6
|
+
Author: Vasiliy Zdanovskiy
|
|
7
|
+
email: vasilyvz@gmail.com
|
|
8
|
+
"""
|
|
9
|
+
import argparse
|
|
10
|
+
import json
|
|
11
|
+
import os
|
|
12
|
+
import sys
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
# Add the current directory to the path to import config_builder
|
|
16
|
+
sys.path.insert(0, str(Path(__file__).parent))
|
|
17
|
+
|
|
18
|
+
from config_builder import generate_complete_config
|
|
19
|
+
|
|
20
|
+
# Import validation modules
|
|
21
|
+
try:
|
|
22
|
+
from mcp_proxy_adapter.core.config_validator import ConfigValidator
|
|
23
|
+
VALIDATION_AVAILABLE = True
|
|
24
|
+
except ImportError:
|
|
25
|
+
VALIDATION_AVAILABLE = False
|
|
26
|
+
print("Warning: Configuration validation not available. Install the package to enable validation.")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def create_config_from_flags(
|
|
30
|
+
protocol: str,
|
|
31
|
+
token: bool = False,
|
|
32
|
+
roles: bool = False,
|
|
33
|
+
host: str = "127.0.0.1",
|
|
34
|
+
port: int = 8000,
|
|
35
|
+
cert_dir: str = "./certs",
|
|
36
|
+
key_dir: str = "./keys",
|
|
37
|
+
output_dir: str = "./configs",
|
|
38
|
+
proxy_registration: bool = False,
|
|
39
|
+
proxy_url: str = None,
|
|
40
|
+
auto_registration: bool = False,
|
|
41
|
+
server_id: str = "mcp_proxy_adapter"
|
|
42
|
+
) -> Dict[str, Any]:
|
|
43
|
+
"""
|
|
44
|
+
Create configuration based on command line flags.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
protocol: Protocol type (http, https, mtls)
|
|
48
|
+
token: Enable token authentication
|
|
49
|
+
roles: Enable role-based access control
|
|
50
|
+
host: Server host
|
|
51
|
+
port: Server port
|
|
52
|
+
cert_dir: Certificate directory
|
|
53
|
+
key_dir: Key directory
|
|
54
|
+
output_dir: Output directory for configs
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
Configuration dictionary
|
|
58
|
+
"""
|
|
59
|
+
# Start with basic configuration
|
|
60
|
+
config = generate_complete_config(host, port)
|
|
61
|
+
|
|
62
|
+
# Set protocol
|
|
63
|
+
config["server"]["protocol"] = protocol
|
|
64
|
+
|
|
65
|
+
# Configure SSL based on protocol
|
|
66
|
+
if protocol == "https":
|
|
67
|
+
config["ssl"]["enabled"] = True
|
|
68
|
+
config["ssl"]["cert_file"] = f"{cert_dir}/mcp-proxy.crt"
|
|
69
|
+
config["ssl"]["key_file"] = f"{key_dir}/mcp-proxy.key"
|
|
70
|
+
# Update transport for HTTPS
|
|
71
|
+
config["transport"]["type"] = "https"
|
|
72
|
+
config["transport"]["chk_hostname"] = True
|
|
73
|
+
elif protocol == "mtls":
|
|
74
|
+
config["ssl"]["enabled"] = True
|
|
75
|
+
config["ssl"]["cert_file"] = f"{cert_dir}/mcp-proxy.crt"
|
|
76
|
+
config["ssl"]["key_file"] = f"{key_dir}/mcp-proxy.key"
|
|
77
|
+
config["ssl"]["ca_cert"] = f"{cert_dir}/../ca/ca.crt"
|
|
78
|
+
# Update transport for mTLS
|
|
79
|
+
config["transport"]["type"] = "https"
|
|
80
|
+
config["transport"]["chk_hostname"] = False # Disable hostname check for mTLS
|
|
81
|
+
config["transport"]["verify_client"] = True
|
|
82
|
+
# Add SSL section to transport for mTLS
|
|
83
|
+
config["transport"]["ssl"] = {
|
|
84
|
+
"verify_client": True,
|
|
85
|
+
"ca_cert": f"{cert_dir}/../ca/ca.crt"
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
# Configure security if token authentication is enabled
|
|
89
|
+
if token:
|
|
90
|
+
config["security"]["enabled"] = True
|
|
91
|
+
config["security"]["tokens"] = {
|
|
92
|
+
"admin": "admin-secret-key",
|
|
93
|
+
"user": "user-secret-key",
|
|
94
|
+
"readonly": "readonly-secret-key"
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if roles:
|
|
98
|
+
config["security"]["roles"] = {
|
|
99
|
+
"admin": ["read", "write", "delete", "admin"],
|
|
100
|
+
"user": ["read", "write"],
|
|
101
|
+
"readonly": ["read"]
|
|
102
|
+
}
|
|
103
|
+
config["security"]["roles_file"] = f"{output_dir}/roles.json"
|
|
104
|
+
config["roles"]["enabled"] = True
|
|
105
|
+
config["roles"]["config_file"] = f"{output_dir}/roles.json"
|
|
106
|
+
|
|
107
|
+
# Configure proxy registration if enabled
|
|
108
|
+
if proxy_registration or auto_registration:
|
|
109
|
+
if not proxy_url:
|
|
110
|
+
raise ValueError("proxy_url is required when proxy registration is enabled")
|
|
111
|
+
|
|
112
|
+
config["proxy_registration"]["enabled"] = True
|
|
113
|
+
config["proxy_registration"]["protocol"] = protocol
|
|
114
|
+
config["proxy_registration"]["proxy_url"] = proxy_url
|
|
115
|
+
config["proxy_registration"]["server_id"] = server_id
|
|
116
|
+
|
|
117
|
+
# Update server URL based on protocol
|
|
118
|
+
if protocol == "https" or protocol == "mtls":
|
|
119
|
+
config["proxy_registration"]["proxy_url"] = proxy_url.replace("http://", "https://")
|
|
120
|
+
|
|
121
|
+
# For mTLS, disable DNS verification but keep SSL verification
|
|
122
|
+
if protocol == "mtls":
|
|
123
|
+
config["proxy_registration"]["verify_ssl"] = True
|
|
124
|
+
config["proxy_registration"]["verify_hostname"] = False # Disable DNS verification only
|
|
125
|
+
|
|
126
|
+
return config
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def save_config(config: Dict[str, Any], filename: str, output_dir: str, validate: bool = True) -> Path:
|
|
130
|
+
"""Save configuration to file with optional validation."""
|
|
131
|
+
output_path = Path(output_dir)
|
|
132
|
+
output_path.mkdir(parents=True, exist_ok=True)
|
|
133
|
+
|
|
134
|
+
config_file = output_path / f"{filename}.json"
|
|
135
|
+
with open(config_file, 'w', encoding='utf-8') as f:
|
|
136
|
+
json.dump(config, f, indent=2, ensure_ascii=False)
|
|
137
|
+
|
|
138
|
+
# Validate configuration if requested and validation is available
|
|
139
|
+
if validate and VALIDATION_AVAILABLE:
|
|
140
|
+
print(f"🔍 Validating configuration: {config_file}")
|
|
141
|
+
validator = ConfigValidator()
|
|
142
|
+
validator.config_data = config
|
|
143
|
+
results = validator.validate_config()
|
|
144
|
+
|
|
145
|
+
if results:
|
|
146
|
+
print("⚠️ Validation issues found:")
|
|
147
|
+
for result in results:
|
|
148
|
+
level_symbol = "❌" if result.level == "error" else "⚠️" if result.level == "warning" else "ℹ️"
|
|
149
|
+
print(f" {level_symbol} {result.message}")
|
|
150
|
+
if hasattr(result, 'suggestion') and result.suggestion:
|
|
151
|
+
print(f" Suggestion: {result.suggestion}")
|
|
152
|
+
else:
|
|
153
|
+
print("✅ Configuration validation passed!")
|
|
154
|
+
|
|
155
|
+
return config_file
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def create_full_config_with_all_options(host: str = "127.0.0.1", port: int = 20000) -> Dict[str, Any]:
|
|
159
|
+
"""
|
|
160
|
+
Create a full configuration with all options enabled but set to HTTP base.
|
|
161
|
+
This allows testing all features by enabling different sections.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
host: Server host
|
|
165
|
+
port: Server port
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
Full configuration dictionary with all options
|
|
169
|
+
"""
|
|
170
|
+
# Start with basic configuration
|
|
171
|
+
config = generate_complete_config(host, port)
|
|
172
|
+
|
|
173
|
+
# Add protocol variants for easy switching
|
|
174
|
+
config["protocol_variants"] = {
|
|
175
|
+
"http": {"server": {"protocol": "http"}},
|
|
176
|
+
"https": {"server": {"protocol": "https"}},
|
|
177
|
+
"mtls": {"server": {"protocol": "mtls"}}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
# Add authentication configurations for easy switching
|
|
181
|
+
api_keys = {
|
|
182
|
+
"admin": "admin-secret-key",
|
|
183
|
+
"user": "user-secret-key",
|
|
184
|
+
"readonly": "readonly-secret-key"
|
|
185
|
+
}
|
|
186
|
+
roles = {
|
|
187
|
+
"admin": ["read", "write", "delete", "admin"],
|
|
188
|
+
"user": ["read", "write"],
|
|
189
|
+
"readonly": ["read"]
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
config["auth_variants"] = {
|
|
193
|
+
"none": {"security": {"enabled": False}},
|
|
194
|
+
"token": {
|
|
195
|
+
"security": {
|
|
196
|
+
"enabled": True,
|
|
197
|
+
"tokens": api_keys,
|
|
198
|
+
"roles": roles,
|
|
199
|
+
"roles_file": None
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
"token_roles": {
|
|
203
|
+
"security": {
|
|
204
|
+
"enabled": True,
|
|
205
|
+
"tokens": api_keys,
|
|
206
|
+
"roles": roles,
|
|
207
|
+
"roles_file": "configs/roles.json"
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return config
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def generate_all_configs(output_dir: str = "./configs", host: str = "127.0.0.1", validate: bool = True) -> None:
|
|
216
|
+
"""Generate all standard configurations."""
|
|
217
|
+
configs = [
|
|
218
|
+
# HTTP configurations
|
|
219
|
+
("http", False, False, 20000),
|
|
220
|
+
("http", True, True, 20001), # token=True always includes roles
|
|
221
|
+
("http", True, True, 20002), # token_roles is same as token now
|
|
222
|
+
|
|
223
|
+
# HTTPS configurations
|
|
224
|
+
("https", False, False, 20003),
|
|
225
|
+
("https", True, True, 20004), # token=True always includes roles
|
|
226
|
+
("https", True, True, 20005), # token_roles is same as token now
|
|
227
|
+
|
|
228
|
+
# mTLS configurations
|
|
229
|
+
("mtls", False, False, 20006),
|
|
230
|
+
("mtls", True, True, 20007), # token=True always includes roles
|
|
231
|
+
("mtls", True, True, 20008), # token_roles is same as token now
|
|
232
|
+
]
|
|
233
|
+
|
|
234
|
+
print("🔧 Generating MCP Proxy Adapter configurations...")
|
|
235
|
+
print("=" * 60)
|
|
236
|
+
|
|
237
|
+
generated_files = []
|
|
238
|
+
|
|
239
|
+
for protocol, token, roles, port in configs:
|
|
240
|
+
# Create configuration name
|
|
241
|
+
name_parts = [protocol]
|
|
242
|
+
if token:
|
|
243
|
+
name_parts.append("token")
|
|
244
|
+
if roles:
|
|
245
|
+
name_parts.append("roles")
|
|
246
|
+
|
|
247
|
+
config_name = "_".join(name_parts)
|
|
248
|
+
|
|
249
|
+
# Generate configuration
|
|
250
|
+
config = create_config_from_flags(
|
|
251
|
+
protocol=protocol,
|
|
252
|
+
token=token,
|
|
253
|
+
roles=roles,
|
|
254
|
+
host=host,
|
|
255
|
+
port=port,
|
|
256
|
+
output_dir=output_dir
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
# Save configuration with validation
|
|
260
|
+
config_file = save_config(config, config_name, output_dir, validate=validate)
|
|
261
|
+
generated_files.append(config_file)
|
|
262
|
+
|
|
263
|
+
print(f"✅ Created {config_name}.json (port {port})")
|
|
264
|
+
|
|
265
|
+
# Create roles.json file if any role-based configs were generated
|
|
266
|
+
roles_config = {
|
|
267
|
+
"enabled": True,
|
|
268
|
+
"default_policy": {
|
|
269
|
+
"deny_by_default": False,
|
|
270
|
+
"require_role_match": False,
|
|
271
|
+
"case_sensitive": False,
|
|
272
|
+
"allow_wildcard": False
|
|
273
|
+
},
|
|
274
|
+
"roles": {
|
|
275
|
+
"admin": ["read", "write", "delete", "admin"],
|
|
276
|
+
"user": ["read", "write"],
|
|
277
|
+
"readonly": ["read"],
|
|
278
|
+
"guest": ["read"],
|
|
279
|
+
"proxy": ["read", "write"]
|
|
280
|
+
},
|
|
281
|
+
"permissions": {
|
|
282
|
+
"read": ["GET"],
|
|
283
|
+
"write": ["POST", "PUT", "PATCH"],
|
|
284
|
+
"delete": ["DELETE"],
|
|
285
|
+
"admin": ["*"]
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
roles_file = Path(output_dir) / "roles.json"
|
|
290
|
+
with open(roles_file, 'w', encoding='utf-8') as f:
|
|
291
|
+
json.dump(roles_config, f, indent=2, ensure_ascii=False)
|
|
292
|
+
print(f"✅ Created roles.json")
|
|
293
|
+
|
|
294
|
+
print(f"\n🎉 Generated {len(generated_files)} configurations in {output_dir}/")
|
|
295
|
+
print("\n📋 Generated configurations:")
|
|
296
|
+
for config_file in generated_files:
|
|
297
|
+
print(f" - {config_file.name}")
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def main():
|
|
301
|
+
"""Main CLI function."""
|
|
302
|
+
parser = argparse.ArgumentParser(
|
|
303
|
+
description="MCP Proxy Adapter Configuration Generator",
|
|
304
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
305
|
+
epilog="""
|
|
306
|
+
Examples:
|
|
307
|
+
# Generate all standard configurations
|
|
308
|
+
python generate_config.py --all
|
|
309
|
+
|
|
310
|
+
# Generate full config with all options (HTTP base)
|
|
311
|
+
python generate_config.py --full-config
|
|
312
|
+
|
|
313
|
+
# Generate specific configuration
|
|
314
|
+
python generate_config.py --protocol https --token --roles --port 8080
|
|
315
|
+
|
|
316
|
+
# Generate HTTP configuration with token auth
|
|
317
|
+
python generate_config.py --protocol http --token
|
|
318
|
+
|
|
319
|
+
# Generate mTLS configuration with roles
|
|
320
|
+
python generate_config.py --protocol mtls --roles
|
|
321
|
+
|
|
322
|
+
# Generate mTLS configuration with automatic proxy registration
|
|
323
|
+
python generate_config.py --protocol mtls --auto-registration --proxy-url https://172.28.0.10:3004
|
|
324
|
+
|
|
325
|
+
# Generate HTTP configuration with automatic proxy registration
|
|
326
|
+
python generate_config.py --protocol http --proxy-registration --proxy-url http://172.28.0.10:3004
|
|
327
|
+
"""
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
# Configuration options
|
|
331
|
+
parser.add_argument("--protocol", choices=["http", "https", "mtls"],
|
|
332
|
+
help="Protocol type (http, https, mtls)")
|
|
333
|
+
parser.add_argument("--token", action="store_true",
|
|
334
|
+
help="Enable token authentication")
|
|
335
|
+
parser.add_argument("--roles", action="store_true",
|
|
336
|
+
help="Enable role-based access control")
|
|
337
|
+
parser.add_argument("--proxy-registration", action="store_true",
|
|
338
|
+
help="Enable proxy registration with auto-determined parameters")
|
|
339
|
+
parser.add_argument("--proxy-url",
|
|
340
|
+
help="Proxy URL for registration (required when --proxy-registration is enabled)")
|
|
341
|
+
parser.add_argument("--auto-registration", action="store_true",
|
|
342
|
+
help="Enable automatic proxy registration (same as --proxy-registration)")
|
|
343
|
+
parser.add_argument("--server-id", default="mcp_proxy_adapter",
|
|
344
|
+
help="Server ID for registration (default: mcp_proxy_adapter)")
|
|
345
|
+
parser.add_argument("--all", action="store_true",
|
|
346
|
+
help="Generate all standard configurations")
|
|
347
|
+
parser.add_argument("--full-config", action="store_true",
|
|
348
|
+
help="Generate full config with all options (HTTP base)")
|
|
349
|
+
|
|
350
|
+
# Server configuration
|
|
351
|
+
parser.add_argument("--host", default="127.0.0.1",
|
|
352
|
+
help="Server host (default: 127.0.0.1)")
|
|
353
|
+
parser.add_argument("--port", type=int, default=8000,
|
|
354
|
+
help="Server port (default: 8000)")
|
|
355
|
+
|
|
356
|
+
# Paths
|
|
357
|
+
parser.add_argument("--cert-dir", default="./certs",
|
|
358
|
+
help="Certificate directory (default: ./certs)")
|
|
359
|
+
parser.add_argument("--key-dir", default="./keys",
|
|
360
|
+
help="Key directory (default: ./keys)")
|
|
361
|
+
parser.add_argument("--output-dir", default="./configs",
|
|
362
|
+
help="Output directory (default: ./configs)")
|
|
363
|
+
|
|
364
|
+
# Output options
|
|
365
|
+
parser.add_argument("--output", "-o",
|
|
366
|
+
help="Output filename (without extension)")
|
|
367
|
+
parser.add_argument("--stdout", action="store_true",
|
|
368
|
+
help="Output to stdout instead of file")
|
|
369
|
+
parser.add_argument("--no-validate", action="store_true",
|
|
370
|
+
help="Skip configuration validation")
|
|
371
|
+
parser.add_argument("--validate-only", action="store_true",
|
|
372
|
+
help="Only validate existing configuration file")
|
|
373
|
+
|
|
374
|
+
args = parser.parse_args()
|
|
375
|
+
|
|
376
|
+
# Validate required arguments
|
|
377
|
+
if not args.validate_only and not args.all and not args.full_config:
|
|
378
|
+
if not args.protocol:
|
|
379
|
+
parser.error("--protocol is required")
|
|
380
|
+
|
|
381
|
+
if (args.proxy_registration or args.auto_registration) and not args.proxy_url:
|
|
382
|
+
parser.error("--proxy-url is required when --proxy-registration or --auto-registration is enabled")
|
|
383
|
+
|
|
384
|
+
# Validate port range
|
|
385
|
+
if not (1 <= args.port <= 65535):
|
|
386
|
+
parser.error("Port must be between 1 and 65535")
|
|
387
|
+
|
|
388
|
+
# Validate certificate directories for HTTPS/mTLS
|
|
389
|
+
if args.protocol in ['https', 'mtls']:
|
|
390
|
+
if not os.path.exists(args.cert_dir):
|
|
391
|
+
parser.error(f"Certificate directory does not exist: {args.cert_dir}")
|
|
392
|
+
if not os.path.exists(args.key_dir):
|
|
393
|
+
parser.error(f"Key directory does not exist: {args.key_dir}")
|
|
394
|
+
|
|
395
|
+
# Validate output directory
|
|
396
|
+
if not os.path.exists(args.output_dir):
|
|
397
|
+
try:
|
|
398
|
+
os.makedirs(args.output_dir, exist_ok=True)
|
|
399
|
+
except OSError as e:
|
|
400
|
+
parser.error(f"Cannot create output directory {args.output_dir}: {e}")
|
|
401
|
+
|
|
402
|
+
try:
|
|
403
|
+
if args.validate_only:
|
|
404
|
+
# Validate existing configuration file
|
|
405
|
+
if not VALIDATION_AVAILABLE:
|
|
406
|
+
print("❌ Validation not available. Install the package to enable validation.")
|
|
407
|
+
return 1
|
|
408
|
+
|
|
409
|
+
config_file = args.output or "config.json"
|
|
410
|
+
if not os.path.exists(config_file):
|
|
411
|
+
print(f"❌ Configuration file not found: {config_file}")
|
|
412
|
+
return 1
|
|
413
|
+
|
|
414
|
+
print(f"🔍 Validating configuration file: {config_file}")
|
|
415
|
+
validator = ConfigValidator()
|
|
416
|
+
validator.load_config(config_file)
|
|
417
|
+
results = validator.validate_config()
|
|
418
|
+
|
|
419
|
+
if results:
|
|
420
|
+
print("⚠️ Validation issues found:")
|
|
421
|
+
for result in results:
|
|
422
|
+
level_symbol = "❌" if result.level == "error" else "⚠️" if result.level == "warning" else "ℹ️"
|
|
423
|
+
print(f" {level_symbol} {result.message}")
|
|
424
|
+
if hasattr(result, 'suggestion') and result.suggestion:
|
|
425
|
+
print(f" Suggestion: {result.suggestion}")
|
|
426
|
+
else:
|
|
427
|
+
print("✅ Configuration validation passed!")
|
|
428
|
+
|
|
429
|
+
# Check if there are any errors
|
|
430
|
+
errors = [r for r in results if r.level == "error"] if results else []
|
|
431
|
+
return 0 if not errors else 1
|
|
432
|
+
|
|
433
|
+
elif args.all:
|
|
434
|
+
# Generate all configurations
|
|
435
|
+
generate_all_configs(
|
|
436
|
+
output_dir=args.output_dir,
|
|
437
|
+
host=args.host,
|
|
438
|
+
validate=not args.no_validate
|
|
439
|
+
)
|
|
440
|
+
elif args.full_config:
|
|
441
|
+
# Generate full config with all options
|
|
442
|
+
config = create_full_config_with_all_options(
|
|
443
|
+
host=args.host,
|
|
444
|
+
port=args.port
|
|
445
|
+
)
|
|
446
|
+
|
|
447
|
+
if args.stdout:
|
|
448
|
+
# Output to stdout
|
|
449
|
+
print(json.dumps(config, indent=2, ensure_ascii=False))
|
|
450
|
+
else:
|
|
451
|
+
# Save to file
|
|
452
|
+
filename = args.output or "full_config"
|
|
453
|
+
config_file = save_config(config, filename, args.output_dir, validate=not args.no_validate)
|
|
454
|
+
print(f"✅ Full configuration saved to: {config_file}")
|
|
455
|
+
elif args.protocol:
|
|
456
|
+
|
|
457
|
+
# Generate specific configuration
|
|
458
|
+
config = create_config_from_flags(
|
|
459
|
+
protocol=args.protocol,
|
|
460
|
+
token=args.token,
|
|
461
|
+
roles=args.roles,
|
|
462
|
+
port=args.port,
|
|
463
|
+
cert_dir=args.cert_dir,
|
|
464
|
+
key_dir=args.key_dir,
|
|
465
|
+
output_dir=args.output_dir,
|
|
466
|
+
proxy_registration=args.proxy_registration,
|
|
467
|
+
proxy_url=args.proxy_url,
|
|
468
|
+
auto_registration=args.auto_registration,
|
|
469
|
+
server_id=args.server_id
|
|
470
|
+
)
|
|
471
|
+
|
|
472
|
+
if args.stdout:
|
|
473
|
+
# Output to stdout
|
|
474
|
+
print(json.dumps(config, indent=2, ensure_ascii=False))
|
|
475
|
+
else:
|
|
476
|
+
# Save to file
|
|
477
|
+
if args.output:
|
|
478
|
+
filename = args.output
|
|
479
|
+
else:
|
|
480
|
+
# Generate filename from flags
|
|
481
|
+
name_parts = [args.protocol]
|
|
482
|
+
if args.token:
|
|
483
|
+
name_parts.append("token")
|
|
484
|
+
if args.roles:
|
|
485
|
+
name_parts.append("roles")
|
|
486
|
+
filename = "_".join(name_parts)
|
|
487
|
+
|
|
488
|
+
config_file = save_config(config, filename, args.output_dir, validate=not args.no_validate)
|
|
489
|
+
print(f"✅ Configuration saved to: {config_file}")
|
|
490
|
+
else:
|
|
491
|
+
parser.print_help()
|
|
492
|
+
return 1
|
|
493
|
+
|
|
494
|
+
return 0
|
|
495
|
+
|
|
496
|
+
except Exception as e:
|
|
497
|
+
print(f"❌ Error: {e}", file=sys.stderr)
|
|
498
|
+
return 1
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
if __name__ == "__main__":
|
|
502
|
+
sys.exit(main())
|