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,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())