mcp-proxy-adapter 2.0.1__py3-none-any.whl → 6.9.50__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mcp-proxy-adapter might be problematic. Click here for more details.

Files changed (269) hide show
  1. mcp_proxy_adapter/__init__.py +47 -0
  2. mcp_proxy_adapter/__main__.py +13 -0
  3. mcp_proxy_adapter/api/__init__.py +0 -0
  4. mcp_proxy_adapter/api/app.py +66 -0
  5. mcp_proxy_adapter/api/core/__init__.py +18 -0
  6. mcp_proxy_adapter/api/core/app_factory.py +400 -0
  7. mcp_proxy_adapter/api/core/lifespan_manager.py +55 -0
  8. mcp_proxy_adapter/api/core/registration_context.py +356 -0
  9. mcp_proxy_adapter/api/core/registration_manager.py +307 -0
  10. mcp_proxy_adapter/api/core/registration_tasks.py +84 -0
  11. mcp_proxy_adapter/api/core/ssl_context_factory.py +88 -0
  12. mcp_proxy_adapter/api/handlers.py +181 -0
  13. mcp_proxy_adapter/api/middleware/__init__.py +21 -0
  14. mcp_proxy_adapter/api/middleware/base.py +54 -0
  15. mcp_proxy_adapter/api/middleware/command_permission_middleware.py +73 -0
  16. mcp_proxy_adapter/api/middleware/error_handling.py +76 -0
  17. mcp_proxy_adapter/api/middleware/factory.py +147 -0
  18. mcp_proxy_adapter/api/middleware/logging.py +31 -0
  19. mcp_proxy_adapter/api/middleware/performance.py +51 -0
  20. mcp_proxy_adapter/api/middleware/protocol_middleware.py +140 -0
  21. mcp_proxy_adapter/api/middleware/transport_middleware.py +87 -0
  22. mcp_proxy_adapter/api/middleware/unified_security.py +223 -0
  23. mcp_proxy_adapter/api/middleware/user_info_middleware.py +132 -0
  24. mcp_proxy_adapter/api/openapi/__init__.py +21 -0
  25. mcp_proxy_adapter/api/openapi/command_integration.py +105 -0
  26. mcp_proxy_adapter/api/openapi/openapi_generator.py +40 -0
  27. mcp_proxy_adapter/api/openapi/openapi_registry.py +62 -0
  28. mcp_proxy_adapter/api/openapi/schema_loader.py +116 -0
  29. mcp_proxy_adapter/api/schemas.py +270 -0
  30. mcp_proxy_adapter/api/tool_integration.py +131 -0
  31. mcp_proxy_adapter/api/tools.py +163 -0
  32. mcp_proxy_adapter/cli/__init__.py +12 -0
  33. mcp_proxy_adapter/cli/commands/__init__.py +15 -0
  34. mcp_proxy_adapter/cli/commands/client.py +100 -0
  35. mcp_proxy_adapter/cli/commands/config_generate.py +105 -0
  36. mcp_proxy_adapter/cli/commands/config_validate.py +94 -0
  37. mcp_proxy_adapter/cli/commands/generate.py +259 -0
  38. mcp_proxy_adapter/cli/commands/server.py +174 -0
  39. mcp_proxy_adapter/cli/commands/sets.py +132 -0
  40. mcp_proxy_adapter/cli/commands/testconfig.py +177 -0
  41. mcp_proxy_adapter/cli/examples/__init__.py +8 -0
  42. mcp_proxy_adapter/cli/examples/http_basic.py +82 -0
  43. mcp_proxy_adapter/cli/examples/https_token.py +96 -0
  44. mcp_proxy_adapter/cli/examples/mtls_roles.py +103 -0
  45. mcp_proxy_adapter/cli/main.py +63 -0
  46. mcp_proxy_adapter/cli/parser.py +338 -0
  47. mcp_proxy_adapter/cli/validators.py +231 -0
  48. mcp_proxy_adapter/client/jsonrpc_client/__init__.py +9 -0
  49. mcp_proxy_adapter/client/jsonrpc_client/client.py +42 -0
  50. mcp_proxy_adapter/client/jsonrpc_client/command_api.py +45 -0
  51. mcp_proxy_adapter/client/jsonrpc_client/proxy_api.py +224 -0
  52. mcp_proxy_adapter/client/jsonrpc_client/queue_api.py +60 -0
  53. mcp_proxy_adapter/client/jsonrpc_client/transport.py +108 -0
  54. mcp_proxy_adapter/client/proxy.py +123 -0
  55. mcp_proxy_adapter/commands/__init__.py +66 -0
  56. mcp_proxy_adapter/commands/auth_validation_command.py +69 -0
  57. mcp_proxy_adapter/commands/base.py +389 -0
  58. mcp_proxy_adapter/commands/builtin_commands.py +30 -0
  59. mcp_proxy_adapter/commands/catalog/__init__.py +20 -0
  60. mcp_proxy_adapter/commands/catalog/catalog_loader.py +34 -0
  61. mcp_proxy_adapter/commands/catalog/catalog_manager.py +122 -0
  62. mcp_proxy_adapter/commands/catalog/catalog_syncer.py +149 -0
  63. mcp_proxy_adapter/commands/catalog/command_catalog.py +43 -0
  64. mcp_proxy_adapter/commands/catalog/dependency_manager.py +37 -0
  65. mcp_proxy_adapter/commands/catalog_manager.py +97 -0
  66. mcp_proxy_adapter/commands/cert_monitor_command.py +552 -0
  67. mcp_proxy_adapter/commands/certificate_management_command.py +562 -0
  68. mcp_proxy_adapter/commands/command_registry.py +298 -0
  69. mcp_proxy_adapter/commands/config_command.py +102 -0
  70. mcp_proxy_adapter/commands/dependency_container.py +40 -0
  71. mcp_proxy_adapter/commands/dependency_manager.py +143 -0
  72. mcp_proxy_adapter/commands/echo_command.py +48 -0
  73. mcp_proxy_adapter/commands/health_command.py +142 -0
  74. mcp_proxy_adapter/commands/help_command.py +175 -0
  75. mcp_proxy_adapter/commands/hooks.py +172 -0
  76. mcp_proxy_adapter/commands/key_management_command.py +484 -0
  77. mcp_proxy_adapter/commands/load_command.py +123 -0
  78. mcp_proxy_adapter/commands/plugins_command.py +246 -0
  79. mcp_proxy_adapter/commands/protocol_management_command.py +216 -0
  80. mcp_proxy_adapter/commands/proxy_registration_command.py +319 -0
  81. mcp_proxy_adapter/commands/queue_commands.py +750 -0
  82. mcp_proxy_adapter/commands/registration_status_command.py +76 -0
  83. mcp_proxy_adapter/commands/registry/__init__.py +18 -0
  84. mcp_proxy_adapter/commands/registry/command_info.py +103 -0
  85. mcp_proxy_adapter/commands/registry/command_loader.py +207 -0
  86. mcp_proxy_adapter/commands/registry/command_manager.py +119 -0
  87. mcp_proxy_adapter/commands/registry/command_registry.py +217 -0
  88. mcp_proxy_adapter/commands/reload_command.py +136 -0
  89. mcp_proxy_adapter/commands/result.py +157 -0
  90. mcp_proxy_adapter/commands/role_test_command.py +99 -0
  91. mcp_proxy_adapter/commands/roles_management_command.py +502 -0
  92. mcp_proxy_adapter/commands/security_command.py +472 -0
  93. mcp_proxy_adapter/commands/settings_command.py +113 -0
  94. mcp_proxy_adapter/commands/ssl_setup_command.py +306 -0
  95. mcp_proxy_adapter/commands/token_management_command.py +500 -0
  96. mcp_proxy_adapter/commands/transport_management_command.py +129 -0
  97. mcp_proxy_adapter/commands/unload_command.py +92 -0
  98. mcp_proxy_adapter/config.py +32 -0
  99. mcp_proxy_adapter/core/__init__.py +8 -0
  100. mcp_proxy_adapter/core/app_factory.py +560 -0
  101. mcp_proxy_adapter/core/app_runner.py +318 -0
  102. mcp_proxy_adapter/core/auth_validator.py +508 -0
  103. mcp_proxy_adapter/core/certificate/__init__.py +20 -0
  104. mcp_proxy_adapter/core/certificate/certificate_creator.py +372 -0
  105. mcp_proxy_adapter/core/certificate/certificate_extractor.py +185 -0
  106. mcp_proxy_adapter/core/certificate/certificate_utils.py +249 -0
  107. mcp_proxy_adapter/core/certificate/certificate_validator.py +481 -0
  108. mcp_proxy_adapter/core/certificate/ssl_context_manager.py +65 -0
  109. mcp_proxy_adapter/core/certificate_utils.py +249 -0
  110. mcp_proxy_adapter/core/client.py +608 -0
  111. mcp_proxy_adapter/core/client_manager.py +271 -0
  112. mcp_proxy_adapter/core/client_security.py +411 -0
  113. mcp_proxy_adapter/core/config/__init__.py +18 -0
  114. mcp_proxy_adapter/core/config/config.py +237 -0
  115. mcp_proxy_adapter/core/config/config_factory.py +22 -0
  116. mcp_proxy_adapter/core/config/config_loader.py +66 -0
  117. mcp_proxy_adapter/core/config/feature_manager.py +31 -0
  118. mcp_proxy_adapter/core/config/simple_config.py +204 -0
  119. mcp_proxy_adapter/core/config/simple_config_generator.py +131 -0
  120. mcp_proxy_adapter/core/config/simple_config_validator.py +476 -0
  121. mcp_proxy_adapter/core/config_converter.py +252 -0
  122. mcp_proxy_adapter/core/config_validator.py +211 -0
  123. mcp_proxy_adapter/core/crl_utils.py +362 -0
  124. mcp_proxy_adapter/core/errors.py +276 -0
  125. mcp_proxy_adapter/core/job_manager.py +54 -0
  126. mcp_proxy_adapter/core/logging.py +250 -0
  127. mcp_proxy_adapter/core/mtls_asgi.py +140 -0
  128. mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
  129. mcp_proxy_adapter/core/mtls_proxy.py +229 -0
  130. mcp_proxy_adapter/core/mtls_server.py +154 -0
  131. mcp_proxy_adapter/core/protocol_manager.py +232 -0
  132. mcp_proxy_adapter/core/proxy/__init__.py +19 -0
  133. mcp_proxy_adapter/core/proxy/auth_manager.py +26 -0
  134. mcp_proxy_adapter/core/proxy/proxy_registration_manager.py +160 -0
  135. mcp_proxy_adapter/core/proxy/registration_client.py +186 -0
  136. mcp_proxy_adapter/core/proxy/ssl_manager.py +101 -0
  137. mcp_proxy_adapter/core/proxy_client.py +184 -0
  138. mcp_proxy_adapter/core/proxy_registration.py +80 -0
  139. mcp_proxy_adapter/core/role_utils.py +103 -0
  140. mcp_proxy_adapter/core/security_adapter.py +343 -0
  141. mcp_proxy_adapter/core/security_factory.py +96 -0
  142. mcp_proxy_adapter/core/security_integration.py +342 -0
  143. mcp_proxy_adapter/core/server_adapter.py +251 -0
  144. mcp_proxy_adapter/core/server_engine.py +217 -0
  145. mcp_proxy_adapter/core/settings.py +260 -0
  146. mcp_proxy_adapter/core/signal_handler.py +107 -0
  147. mcp_proxy_adapter/core/ssl_utils.py +161 -0
  148. mcp_proxy_adapter/core/transport_manager.py +153 -0
  149. mcp_proxy_adapter/core/unified_config_adapter.py +471 -0
  150. mcp_proxy_adapter/core/utils.py +101 -0
  151. mcp_proxy_adapter/core/validation/__init__.py +21 -0
  152. mcp_proxy_adapter/core/validation/config_validator.py +219 -0
  153. mcp_proxy_adapter/core/validation/file_validator.py +131 -0
  154. mcp_proxy_adapter/core/validation/protocol_validator.py +205 -0
  155. mcp_proxy_adapter/core/validation/security_validator.py +140 -0
  156. mcp_proxy_adapter/core/validation/validation_result.py +27 -0
  157. mcp_proxy_adapter/custom_openapi.py +58 -0
  158. mcp_proxy_adapter/examples/__init__.py +16 -0
  159. mcp_proxy_adapter/examples/basic_framework/__init__.py +9 -0
  160. mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +4 -0
  161. mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +4 -0
  162. mcp_proxy_adapter/examples/basic_framework/main.py +52 -0
  163. mcp_proxy_adapter/examples/bugfix_certificate_config.py +261 -0
  164. mcp_proxy_adapter/examples/cert_manager_bugfix.py +203 -0
  165. mcp_proxy_adapter/examples/check_config.py +413 -0
  166. mcp_proxy_adapter/examples/client_usage_example.py +164 -0
  167. mcp_proxy_adapter/examples/commands/__init__.py +5 -0
  168. mcp_proxy_adapter/examples/config_builder.py +234 -0
  169. mcp_proxy_adapter/examples/config_cli.py +282 -0
  170. mcp_proxy_adapter/examples/create_test_configs.py +174 -0
  171. mcp_proxy_adapter/examples/debug_request_state.py +130 -0
  172. mcp_proxy_adapter/examples/debug_role_chain.py +191 -0
  173. mcp_proxy_adapter/examples/demo_client.py +287 -0
  174. mcp_proxy_adapter/examples/full_application/__init__.py +12 -0
  175. mcp_proxy_adapter/examples/full_application/commands/__init__.py +8 -0
  176. mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +45 -0
  177. mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +52 -0
  178. mcp_proxy_adapter/examples/full_application/commands/echo_command.py +32 -0
  179. mcp_proxy_adapter/examples/full_application/commands/help_command.py +54 -0
  180. mcp_proxy_adapter/examples/full_application/commands/list_command.py +57 -0
  181. mcp_proxy_adapter/examples/full_application/hooks/__init__.py +5 -0
  182. mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +29 -0
  183. mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +27 -0
  184. mcp_proxy_adapter/examples/full_application/main.py +311 -0
  185. mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +161 -0
  186. mcp_proxy_adapter/examples/full_application/run_mtls.py +252 -0
  187. mcp_proxy_adapter/examples/full_application/run_simple.py +152 -0
  188. mcp_proxy_adapter/examples/full_application/test_minimal_server.py +45 -0
  189. mcp_proxy_adapter/examples/full_application/test_server.py +163 -0
  190. mcp_proxy_adapter/examples/full_application/test_simple_server.py +62 -0
  191. mcp_proxy_adapter/examples/generate_config.py +502 -0
  192. mcp_proxy_adapter/examples/proxy_registration_example.py +335 -0
  193. mcp_proxy_adapter/examples/queue_demo_simple.py +632 -0
  194. mcp_proxy_adapter/examples/queue_integration_example.py +578 -0
  195. mcp_proxy_adapter/examples/queue_server_demo.py +82 -0
  196. mcp_proxy_adapter/examples/queue_server_example.py +85 -0
  197. mcp_proxy_adapter/examples/queue_server_simple.py +173 -0
  198. mcp_proxy_adapter/examples/required_certificates.py +208 -0
  199. mcp_proxy_adapter/examples/run_example.py +77 -0
  200. mcp_proxy_adapter/examples/run_full_test_suite.py +619 -0
  201. mcp_proxy_adapter/examples/run_proxy_server.py +153 -0
  202. mcp_proxy_adapter/examples/run_security_tests_fixed.py +435 -0
  203. mcp_proxy_adapter/examples/security_test/__init__.py +18 -0
  204. mcp_proxy_adapter/examples/security_test/auth_manager.py +14 -0
  205. mcp_proxy_adapter/examples/security_test/ssl_context_manager.py +28 -0
  206. mcp_proxy_adapter/examples/security_test/test_client.py +159 -0
  207. mcp_proxy_adapter/examples/security_test/test_result.py +22 -0
  208. mcp_proxy_adapter/examples/security_test_client.py +72 -0
  209. mcp_proxy_adapter/examples/setup/__init__.py +24 -0
  210. mcp_proxy_adapter/examples/setup/certificate_manager.py +215 -0
  211. mcp_proxy_adapter/examples/setup/config_generator.py +12 -0
  212. mcp_proxy_adapter/examples/setup/config_validator.py +118 -0
  213. mcp_proxy_adapter/examples/setup/environment_setup.py +62 -0
  214. mcp_proxy_adapter/examples/setup/test_files_generator.py +10 -0
  215. mcp_proxy_adapter/examples/setup/test_runner.py +89 -0
  216. mcp_proxy_adapter/examples/setup_test_environment.py +235 -0
  217. mcp_proxy_adapter/examples/simple_protocol_test.py +125 -0
  218. mcp_proxy_adapter/examples/test_chk_hostname_automated.py +211 -0
  219. mcp_proxy_adapter/examples/test_config.py +205 -0
  220. mcp_proxy_adapter/examples/test_config_builder.py +110 -0
  221. mcp_proxy_adapter/examples/test_examples.py +308 -0
  222. mcp_proxy_adapter/examples/test_framework_complete.py +267 -0
  223. mcp_proxy_adapter/examples/test_mcp_server.py +187 -0
  224. mcp_proxy_adapter/examples/test_protocol_examples.py +337 -0
  225. mcp_proxy_adapter/examples/universal_client.py +674 -0
  226. mcp_proxy_adapter/examples/update_config_certificates.py +135 -0
  227. mcp_proxy_adapter/examples/validate_generator_compatibility.py +385 -0
  228. mcp_proxy_adapter/examples/validate_generator_compatibility_simple.py +61 -0
  229. mcp_proxy_adapter/integrations/__init__.py +25 -0
  230. mcp_proxy_adapter/integrations/queuemgr_integration.py +462 -0
  231. mcp_proxy_adapter/main.py +311 -0
  232. mcp_proxy_adapter/openapi.py +375 -0
  233. mcp_proxy_adapter/schemas/base_schema.json +114 -0
  234. mcp_proxy_adapter/schemas/openapi_schema.json +314 -0
  235. mcp_proxy_adapter/schemas/roles.json +37 -0
  236. mcp_proxy_adapter/schemas/roles_schema.json +162 -0
  237. mcp_proxy_adapter/version.py +5 -0
  238. mcp_proxy_adapter-6.9.50.dist-info/METADATA +1088 -0
  239. mcp_proxy_adapter-6.9.50.dist-info/RECORD +242 -0
  240. {mcp_proxy_adapter-2.0.1.dist-info → mcp_proxy_adapter-6.9.50.dist-info}/WHEEL +1 -1
  241. mcp_proxy_adapter-6.9.50.dist-info/entry_points.txt +14 -0
  242. mcp_proxy_adapter-6.9.50.dist-info/top_level.txt +1 -0
  243. adapters/__init__.py +0 -16
  244. analyzers/__init__.py +0 -14
  245. analyzers/docstring_analyzer.py +0 -199
  246. analyzers/type_analyzer.py +0 -151
  247. cli/__init__.py +0 -12
  248. cli/__main__.py +0 -79
  249. cli/command_runner.py +0 -233
  250. dispatchers/__init__.py +0 -14
  251. dispatchers/base_dispatcher.py +0 -85
  252. dispatchers/json_rpc_dispatcher.py +0 -198
  253. generators/__init__.py +0 -14
  254. generators/endpoint_generator.py +0 -172
  255. generators/openapi_generator.py +0 -254
  256. generators/rest_api_generator.py +0 -207
  257. mcp_proxy_adapter-2.0.1.dist-info/METADATA +0 -272
  258. mcp_proxy_adapter-2.0.1.dist-info/RECORD +0 -28
  259. mcp_proxy_adapter-2.0.1.dist-info/licenses/LICENSE +0 -21
  260. mcp_proxy_adapter-2.0.1.dist-info/top_level.txt +0 -7
  261. openapi_schema/__init__.py +0 -38
  262. openapi_schema/command_registry.py +0 -312
  263. openapi_schema/rest_schema.py +0 -510
  264. openapi_schema/rpc_generator.py +0 -307
  265. openapi_schema/rpc_schema.py +0 -416
  266. validators/__init__.py +0 -14
  267. validators/base_validator.py +0 -23
  268. validators/docstring_validator.py +0 -75
  269. validators/metadata_validator.py +0 -76
@@ -0,0 +1,132 @@
1
+ """
2
+ Sets Command
3
+
4
+ This module implements the sets command for generating configurations using predefined sets.
5
+
6
+ Author: Vasiliy Zdanovskiy
7
+ email: vasilyvz@gmail.com
8
+ """
9
+
10
+ import json
11
+ from pathlib import Path
12
+ from typing import Dict, Any
13
+
14
+ from mcp_proxy_adapter.core.config.simple_config import (
15
+ SimpleConfig,
16
+ SimpleConfigModel,
17
+ ServerConfig,
18
+ ClientConfig,
19
+ RegistrationConfig,
20
+ AuthConfig,
21
+ )
22
+
23
+
24
+ class SetsCommand:
25
+ """Command for generating configurations using predefined sets."""
26
+
27
+ def __init__(self):
28
+ """Initialize the sets command."""
29
+ pass
30
+
31
+ def execute(self, args: Dict[str, Any]) -> int:
32
+ """
33
+ Execute the sets command.
34
+
35
+ Args:
36
+ args: Parsed command arguments
37
+
38
+ Returns:
39
+ Exit code (0 for success, 1 for error)
40
+ """
41
+ set_name = args.get('set_name')
42
+
43
+ if not set_name:
44
+ print("❌ No set specified. Use: sets {http,https,mtls}")
45
+ return 1
46
+
47
+ try:
48
+ # Generate configuration based on set
49
+ config_path = self._create_config_from_set(set_name, args)
50
+
51
+ print(f"✅ {set_name.upper()} configuration saved to: {config_path}")
52
+ return 0
53
+
54
+ except Exception as e:
55
+ print(f"❌ Error generating {set_name} configuration: {e}")
56
+ return 1
57
+
58
+ def _create_config_from_set(self, set_name: str, args: Dict[str, Any]) -> Path:
59
+ """
60
+ Create configuration based on the specified set.
61
+
62
+ Args:
63
+ set_name: Name of the configuration set
64
+ args: Command arguments
65
+
66
+ Returns:
67
+ Path to saved configuration file
68
+ """
69
+ host = args.get('host', '127.0.0.1')
70
+ port = int(args.get('port', 8000))
71
+ protocol = set_name
72
+
73
+ # Build server config compatible with SimpleConfig
74
+ server = ServerConfig(host=host, port=port, protocol=protocol)
75
+ cert_dir = Path(args.get('cert_dir') or './certs')
76
+ key_dir = Path(args.get('key_dir') or './keys')
77
+ if protocol in ('https', 'mtls'):
78
+ # Prefer test-server.* filenames if present, otherwise fallback to server.*
79
+ cert_file = cert_dir / 'test-server.crt'
80
+ key_file = key_dir / 'test-server.key'
81
+ if not cert_file.exists():
82
+ cert_file = cert_dir / 'server.crt'
83
+ if not key_file.exists():
84
+ key_file = key_dir / 'server.key'
85
+ server.cert_file = str(cert_file)
86
+ server.key_file = str(key_file)
87
+ if protocol == 'mtls':
88
+ # CA file path is expected by validator; try ca/ca.crt relative to provided cert_dir
89
+ ca_candidate = cert_dir.parent / 'ca' / 'ca.crt'
90
+ if not ca_candidate.exists():
91
+ ca_candidate = cert_dir / 'ca.crt'
92
+ server.ca_cert_file = str(ca_candidate)
93
+
94
+ # Client config (disabled by default)
95
+ client = ClientConfig(enabled=False)
96
+
97
+ # Registration config (disabled by default)
98
+ registration = RegistrationConfig(enabled=False)
99
+
100
+ # Auth config based on modifiers
101
+ use_token = 'token' in (args.get('modifiers') or []) or bool(args.get('token'))
102
+ use_roles = 'roles' in (args.get('modifiers') or []) or bool(args.get('roles'))
103
+ # If roles are requested, token must be enabled to satisfy validator
104
+ if use_roles and not use_token:
105
+ use_token = True
106
+ tokens = {
107
+ 'admin': ['read', 'write', 'delete', 'admin'],
108
+ } if use_token else {}
109
+ roles = {
110
+ 'admin': ['read', 'write', 'delete', 'admin'],
111
+ 'user': ['read', 'write'],
112
+ } if use_roles else {}
113
+ auth = AuthConfig(use_token=use_token, use_roles=use_roles, tokens=tokens, roles=roles)
114
+
115
+ # Save using SimpleConfig
116
+ model = SimpleConfigModel(server=server, client=client, registration=registration, auth=auth)
117
+ out_dir = Path(args.get('output_dir', './configs'))
118
+ out_dir.mkdir(parents=True, exist_ok=True)
119
+ name_parts = [set_name]
120
+ if use_token and set_name in ['http', 'https']:
121
+ name_parts.append('token')
122
+ if use_roles:
123
+ name_parts.append('roles')
124
+ filename = args.get('output') or "_".join(name_parts)
125
+ out_path = out_dir / f"{filename}.json"
126
+
127
+ cfg = SimpleConfig(str(out_path))
128
+ cfg.model = model
129
+ cfg.save()
130
+ return out_path
131
+
132
+
@@ -0,0 +1,177 @@
1
+ """
2
+ TestConfig Command
3
+
4
+ This module implements the testconfig command for validating configuration files.
5
+
6
+ Author: Vasiliy Zdanovskiy
7
+ email: vasilyvz@gmail.com
8
+ """
9
+
10
+ import json
11
+ from typing import Dict, Any
12
+
13
+ try:
14
+ from mcp_proxy_adapter.core.config_validator import ConfigValidator
15
+ VALIDATION_AVAILABLE = True
16
+ except ImportError:
17
+ VALIDATION_AVAILABLE = False
18
+
19
+
20
+ class TestConfigCommand:
21
+ """Command for testing and validating configuration files."""
22
+
23
+ def __init__(self):
24
+ """Initialize the testconfig command."""
25
+ pass
26
+
27
+ def execute(self, args: Dict[str, Any]) -> int:
28
+ """
29
+ Execute the testconfig command.
30
+
31
+ Args:
32
+ args: Parsed command arguments
33
+
34
+ Returns:
35
+ Exit code (0 for success, 1 for error)
36
+ """
37
+ if not VALIDATION_AVAILABLE:
38
+ print("❌ Configuration validation not available. Install the package to enable validation.")
39
+ return 1
40
+
41
+ config_file = args['config']
42
+ verbose = args.get('verbose', False)
43
+ fix_suggestions = args.get('fix_suggestions', False)
44
+ json_output = args.get('json', False)
45
+
46
+ try:
47
+ # Load and validate configuration
48
+ validator = ConfigValidator(config_file)
49
+ validator.load_config()
50
+ results = validator.validate_config()
51
+
52
+ # Get validation summary
53
+ summary = validator.get_validation_summary()
54
+
55
+ if json_output:
56
+ # Output results in JSON format
57
+ self._output_json_results(summary, results, config_file)
58
+ else:
59
+ # Output human-readable results
60
+ self._output_human_results(summary, results, config_file, verbose, fix_suggestions)
61
+
62
+ # Return appropriate exit code
63
+ return 0 if summary['is_valid'] else 1
64
+
65
+ except Exception as e:
66
+ print(f"❌ Error testing configuration: {e}")
67
+ return 1
68
+
69
+ def _output_json_results(self, summary: Dict[str, Any], results: list, config_file: str) -> None:
70
+ """Output validation results in JSON format."""
71
+ output = {
72
+ "config_file": config_file,
73
+ "summary": summary,
74
+ "issues": []
75
+ }
76
+
77
+ for result in results:
78
+ issue = {
79
+ "level": result.level,
80
+ "message": result.message,
81
+ "section": result.section,
82
+ "key": result.key if hasattr(result, 'key') else None,
83
+ "suggestion": result.suggestion if hasattr(result, 'suggestion') else None
84
+ }
85
+ output["issues"].append(issue)
86
+
87
+ print(json.dumps(output, indent=2, ensure_ascii=False))
88
+
89
+ def _output_human_results(self, summary: Dict[str, Any], results: list, config_file: str,
90
+ verbose: bool, fix_suggestions: bool) -> None:
91
+ """Output validation results in human-readable format."""
92
+ print("=" * 60)
93
+ print("CONFIGURATION VALIDATION REPORT")
94
+ print("=" * 60)
95
+ print(f"Configuration file: {config_file}")
96
+ print(f"Total issues: {summary['total_issues']}")
97
+ print(f"Errors: {summary['errors']}")
98
+ print(f"Warnings: {summary['warnings']}")
99
+ print(f"Info: {summary['info']}")
100
+ print(f"Configuration is valid: {'✅ YES' if summary['is_valid'] else '❌ NO'}")
101
+ print("=" * 60)
102
+
103
+ if results:
104
+ print("\n📋 DETAILED ISSUES:")
105
+ print("-" * 40)
106
+
107
+ for i, result in enumerate(results, 1):
108
+ level_symbol = {
109
+ "error": "❌",
110
+ "warning": "⚠️",
111
+ "info": "ℹ️"
112
+ }.get(result.level, "❓")
113
+
114
+ print(f"\n{i}. {level_symbol} [{result.level.upper()}]")
115
+ print(f" Message: {result.message}")
116
+
117
+ if hasattr(result, 'section') and result.section:
118
+ location = f"{result.section}"
119
+ if hasattr(result, 'key') and result.key:
120
+ location += f".{result.key}"
121
+ print(f" Location: {location}")
122
+
123
+ if hasattr(result, 'suggestion') and result.suggestion:
124
+ print(f" Suggestion: {result.suggestion}")
125
+
126
+ if verbose:
127
+ print(f" Full details: {result}")
128
+ else:
129
+ print("\n✅ No issues found in configuration!")
130
+
131
+ if fix_suggestions and results:
132
+ self._print_fix_suggestions(results)
133
+
134
+ def _print_fix_suggestions(self, results: list) -> None:
135
+ """Print suggestions for fixing configuration issues."""
136
+ print("\n🔧 FIX SUGGESTIONS:")
137
+ print("-" * 40)
138
+
139
+ # Group suggestions by type
140
+ suggestions = {
141
+ "missing_files": [],
142
+ "invalid_values": [],
143
+ "missing_sections": [],
144
+ "dependency_issues": [],
145
+ "other": []
146
+ }
147
+
148
+ for result in results:
149
+ if result.level == "error":
150
+ message = result.message.lower()
151
+ if "does not exist" in message or "not found" in message:
152
+ suggestions["missing_files"].append(result)
153
+ elif "missing" in message and "section" in message:
154
+ suggestions["missing_sections"].append(result)
155
+ elif "invalid" in message or "wrong type" in message:
156
+ suggestions["invalid_values"].append(result)
157
+ elif "dependency" in message or "requires" in message:
158
+ suggestions["dependency_issues"].append(result)
159
+ else:
160
+ suggestions["other"].append(result)
161
+
162
+ # Print suggestions by category
163
+ for category, issues in suggestions.items():
164
+ if issues:
165
+ print(f"\n📁 {category.replace('_', ' ').title()}:")
166
+ for issue in issues:
167
+ print(f" • {issue.message}")
168
+ if hasattr(issue, 'suggestion') and issue.suggestion:
169
+ print(f" → {issue.suggestion}")
170
+
171
+ print("\n💡 GENERAL RECOMMENDATIONS:")
172
+ print(" • Use the configuration generator: mcp-proxy-adapter generate --help")
173
+ print(" • Check the documentation: docs/EN/ALL_CONFIG_SETTINGS.md")
174
+ print(" • Validate certificates and file paths")
175
+ print(" • Ensure all required sections are present")
176
+
177
+
@@ -0,0 +1,8 @@
1
+ """
2
+ CLI Examples Module
3
+
4
+ This module contains example scripts demonstrating CLI usage.
5
+
6
+ Author: Vasiliy Zdanovskiy
7
+ email: vasilyvz@gmail.com
8
+ """
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ HTTP Basic Configuration Example
4
+
5
+ This example demonstrates how to generate and use a basic HTTP configuration.
6
+
7
+ Author: Vasiliy Zdanovskiy
8
+ email: vasilyvz@gmail.com
9
+ """
10
+
11
+ import subprocess
12
+ import sys
13
+ import json
14
+ from pathlib import Path
15
+
16
+
17
+ def main():
18
+ """Generate and test HTTP basic configuration."""
19
+ print("🔧 HTTP Basic Configuration Example")
20
+ print("=" * 50)
21
+
22
+ # Generate HTTP configuration
23
+ print("1. Generating HTTP configuration...")
24
+ result = subprocess.run([
25
+ sys.executable, "-m", "mcp_proxy_adapter.cli.main",
26
+ "sets", "http",
27
+ "--port", "8080",
28
+ "--output-dir", "./examples_configs"
29
+ ], capture_output=True, text=True)
30
+
31
+ if result.returncode != 0:
32
+ print(f"❌ Error generating configuration: {result.stderr}")
33
+ return 1
34
+
35
+ print("✅ HTTP configuration generated")
36
+
37
+ # Find the generated config file
38
+ config_dir = Path("./examples_configs")
39
+ config_files = list(config_dir.glob("http*.json"))
40
+
41
+ if not config_files:
42
+ print("❌ No configuration files found")
43
+ return 1
44
+
45
+ config_file = config_files[0]
46
+ print(f"📁 Configuration file: {config_file}")
47
+
48
+ # Test the configuration
49
+ print("\n2. Testing configuration...")
50
+ result = subprocess.run([
51
+ sys.executable, "-m", "mcp_proxy_adapter.cli.main",
52
+ "testconfig",
53
+ "--config", str(config_file),
54
+ "--verbose"
55
+ ], capture_output=True, text=True)
56
+
57
+ if result.returncode != 0:
58
+ print(f"❌ Configuration validation failed: {result.stderr}")
59
+ return 1
60
+
61
+ print("✅ Configuration validation passed")
62
+
63
+ # Show configuration content
64
+ print("\n3. Configuration content:")
65
+ with open(config_file, 'r') as f:
66
+ config = json.load(f)
67
+
68
+ print(f" Protocol: {config['server']['protocol']}")
69
+ print(f" Host: {config['server']['host']}")
70
+ print(f" Port: {config['server']['port']}")
71
+ print(f" Security: {'Enabled' if config.get('security', {}).get('enabled') else 'Disabled'}")
72
+
73
+ print("\n🎉 HTTP basic configuration example completed!")
74
+ print(f"📁 Configuration saved to: {config_file}")
75
+ print("\n💡 To start the server:")
76
+ print(f" mcp-proxy-adapter server --config {config_file}")
77
+
78
+ return 0
79
+
80
+
81
+ if __name__ == "__main__":
82
+ sys.exit(main())
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ HTTPS Token Configuration Example
4
+
5
+ This example demonstrates how to generate and use an HTTPS configuration with token authentication.
6
+
7
+ Author: Vasiliy Zdanovskiy
8
+ email: vasilyvz@gmail.com
9
+ """
10
+
11
+ import subprocess
12
+ import sys
13
+ import json
14
+ from pathlib import Path
15
+
16
+
17
+ def main():
18
+ """Generate and test HTTPS token configuration."""
19
+ print("🔧 HTTPS Token Configuration Example")
20
+ print("=" * 50)
21
+
22
+ # Generate HTTPS configuration with token authentication
23
+ print("1. Generating HTTPS configuration with token authentication...")
24
+ result = subprocess.run([
25
+ sys.executable, "-m", "mcp_proxy_adapter.cli.main",
26
+ "sets", "https",
27
+ "--token",
28
+ "--roles",
29
+ "--port", "8443",
30
+ "--output-dir", "./examples_configs"
31
+ ], capture_output=True, text=True)
32
+
33
+ if result.returncode != 0:
34
+ print(f"❌ Error generating configuration: {result.stderr}")
35
+ return 1
36
+
37
+ print("✅ HTTPS configuration with token authentication generated")
38
+
39
+ # Find the generated config file
40
+ config_dir = Path("./examples_configs")
41
+ config_files = list(config_dir.glob("https_token_roles*.json"))
42
+
43
+ if not config_files:
44
+ print("❌ No configuration files found")
45
+ return 1
46
+
47
+ config_file = config_files[0]
48
+ print(f"📁 Configuration file: {config_file}")
49
+
50
+ # Test the configuration
51
+ print("\n2. Testing configuration...")
52
+ result = subprocess.run([
53
+ sys.executable, "-m", "mcp_proxy_adapter.cli.main",
54
+ "testconfig",
55
+ "--config", str(config_file),
56
+ "--verbose"
57
+ ], capture_output=True, text=True)
58
+
59
+ if result.returncode != 0:
60
+ print(f"❌ Configuration validation failed: {result.stderr}")
61
+ return 1
62
+
63
+ print("✅ Configuration validation passed")
64
+
65
+ # Show configuration content
66
+ print("\n3. Configuration content:")
67
+ with open(config_file, 'r') as f:
68
+ config = json.load(f)
69
+
70
+ print(f" Protocol: {config['server']['protocol']}")
71
+ print(f" Host: {config['server']['host']}")
72
+ print(f" Port: {config['server']['port']}")
73
+ print(f" SSL: {'Enabled' if config.get('ssl', {}).get('enabled') else 'Disabled'}")
74
+ print(f" Security: {'Enabled' if config.get('security', {}).get('enabled') else 'Disabled'}")
75
+ print(f" Token Auth: {'Enabled' if config.get('security', {}).get('tokens') else 'Disabled'}")
76
+ print(f" Roles: {'Enabled' if config.get('roles', {}).get('enabled') else 'Disabled'}")
77
+
78
+ # Show available tokens
79
+ if config.get('security', {}).get('tokens'):
80
+ print("\n4. Available authentication tokens:")
81
+ for role, token in config['security']['tokens'].items():
82
+ print(f" {role}: {token}")
83
+
84
+ print("\n🎉 HTTPS token configuration example completed!")
85
+ print(f"📁 Configuration saved to: {config_file}")
86
+ print("\n💡 To start the server:")
87
+ print(f" mcp-proxy-adapter server --config {config_file}")
88
+ print("\n💡 To test with curl:")
89
+ print(f" curl -k https://localhost:8443/health")
90
+ print(f" curl -k -H 'X-API-Key: admin-secret-key' https://localhost:8443/api/jsonrpc -d '{{\"jsonrpc\":\"2.0\",\"method\":\"echo\",\"params\":{{\"message\":\"Hello\"}},\"id\":1}}'")
91
+
92
+ return 0
93
+
94
+
95
+ if __name__ == "__main__":
96
+ sys.exit(main())
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ mTLS Roles Configuration Example
4
+
5
+ This example demonstrates how to generate and use an mTLS configuration with role-based access control.
6
+
7
+ Author: Vasiliy Zdanovskiy
8
+ email: vasilyvz@gmail.com
9
+ """
10
+
11
+ import subprocess
12
+ import sys
13
+ import json
14
+ from pathlib import Path
15
+
16
+
17
+ def main():
18
+ """Generate and test mTLS roles configuration."""
19
+ print("🔧 mTLS Roles Configuration Example")
20
+ print("=" * 50)
21
+
22
+ # Generate mTLS configuration with roles
23
+ print("1. Generating mTLS configuration with roles...")
24
+ result = subprocess.run([
25
+ sys.executable, "-m", "mcp_proxy_adapter.cli.main",
26
+ "sets", "mtls",
27
+ "--roles",
28
+ "--port", "8443",
29
+ "--output-dir", "./examples_configs"
30
+ ], capture_output=True, text=True)
31
+
32
+ if result.returncode != 0:
33
+ print(f"❌ Error generating configuration: {result.stderr}")
34
+ return 1
35
+
36
+ print("✅ mTLS configuration with roles generated")
37
+
38
+ # Find the generated config file
39
+ config_dir = Path("./examples_configs")
40
+ config_files = list(config_dir.glob("mtls_roles*.json"))
41
+
42
+ if not config_files:
43
+ print("❌ No configuration files found")
44
+ return 1
45
+
46
+ config_file = config_files[0]
47
+ print(f"📁 Configuration file: {config_file}")
48
+
49
+ # Test the configuration
50
+ print("\n2. Testing configuration...")
51
+ result = subprocess.run([
52
+ sys.executable, "-m", "mcp_proxy_adapter.cli.main",
53
+ "testconfig",
54
+ "--config", str(config_file),
55
+ "--verbose"
56
+ ], capture_output=True, text=True)
57
+
58
+ if result.returncode != 0:
59
+ print(f"❌ Configuration validation failed: {result.stderr}")
60
+ return 1
61
+
62
+ print("✅ Configuration validation passed")
63
+
64
+ # Show configuration content
65
+ print("\n3. Configuration content:")
66
+ with open(config_file, 'r') as f:
67
+ config = json.load(f)
68
+
69
+ print(f" Protocol: {config['server']['protocol']}")
70
+ print(f" Host: {config['server']['host']}")
71
+ print(f" Port: {config['server']['port']}")
72
+ print(f" SSL: {'Enabled' if config.get('ssl', {}).get('enabled') else 'Disabled'}")
73
+ print(f" Client Verification: {'Enabled' if config.get('transport', {}).get('verify_client') else 'Disabled'}")
74
+ print(f" Roles: {'Enabled' if config.get('roles', {}).get('enabled') else 'Disabled'}")
75
+
76
+ # Show SSL configuration
77
+ if config.get('ssl'):
78
+ ssl_config = config['ssl']
79
+ print(f"\n4. SSL Configuration:")
80
+ print(f" Certificate: {ssl_config.get('cert_file', 'Not set')}")
81
+ print(f" Private Key: {ssl_config.get('key_file', 'Not set')}")
82
+ print(f" CA Certificate: {ssl_config.get('ca_cert', 'Not set')}")
83
+
84
+ # Show roles configuration
85
+ if config.get('roles', {}).get('enabled'):
86
+ print(f"\n5. Roles Configuration:")
87
+ print(f" Config File: {config['roles'].get('config_file', 'Not set')}")
88
+ print(f" Auto Load: {config['roles'].get('auto_load', False)}")
89
+ print(f" Validation: {'Enabled' if config['roles'].get('validation_enabled') else 'Disabled'}")
90
+
91
+ print("\n🎉 mTLS roles configuration example completed!")
92
+ print(f"📁 Configuration saved to: {config_file}")
93
+ print("\n💡 To start the server:")
94
+ print(f" mcp-proxy-adapter server --config {config_file}")
95
+ print("\n💡 To test with curl (requires client certificates):")
96
+ print(f" curl -k --cert client.crt --key client.key https://localhost:8443/health")
97
+ print(f" curl -k --cert client.crt --key client.key https://localhost:8443/api/jsonrpc -d '{{\"jsonrpc\":\"2.0\",\"method\":\"echo\",\"params\":{{\"message\":\"Hello mTLS\"}},\"id\":1}}'")
98
+
99
+ return 0
100
+
101
+
102
+ if __name__ == "__main__":
103
+ sys.exit(main())
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ MCP Proxy Adapter CLI Application
4
+ Comprehensive command-line interface with multi-level help and configuration management
5
+
6
+ Author: Vasiliy Zdanovskiy
7
+ email: vasilyvz@gmail.com
8
+ """
9
+
10
+ import sys
11
+ from pathlib import Path
12
+
13
+ # Add project root to path
14
+ project_root = Path(__file__).parent.parent.parent
15
+ sys.path.insert(0, str(project_root))
16
+
17
+ from mcp_proxy_adapter.cli.parser import create_main_parser # noqa: E402
18
+
19
+
20
+ def main():
21
+ """Main CLI entry point"""
22
+ parser = create_main_parser()
23
+ args = parser.parse_args()
24
+
25
+ try:
26
+ if args.command == 'generate':
27
+ from mcp_proxy_adapter.cli.commands.generate import GenerateCommand
28
+ return GenerateCommand().execute(vars(args))
29
+ elif args.command == 'testconfig':
30
+ from mcp_proxy_adapter.cli.commands.testconfig import TestConfigCommand
31
+ return TestConfigCommand().execute(vars(args))
32
+ elif args.command == 'sets':
33
+ from mcp_proxy_adapter.cli.commands.sets import SetsCommand
34
+ return SetsCommand().execute(vars(args))
35
+ elif args.command == 'server':
36
+ from mcp_proxy_adapter.cli.commands.server import ServerCommand
37
+ return ServerCommand().execute(vars(args))
38
+ elif args.command == 'config':
39
+ if args.config_command == 'generate':
40
+ from mcp_proxy_adapter.cli.commands.config_generate import config_generate_command
41
+ return config_generate_command(args)
42
+ if args.config_command == 'validate':
43
+ from mcp_proxy_adapter.cli.commands.config_validate import config_validate_command
44
+ return config_validate_command(args)
45
+ print('Available: config generate|validate')
46
+ return 1
47
+ elif args.command == 'client':
48
+ from mcp_proxy_adapter.cli.commands.client import client_command
49
+ return client_command(args)
50
+ else:
51
+ parser.print_help()
52
+ return 1
53
+
54
+ except KeyboardInterrupt:
55
+ print("\n❌ Operation cancelled by user")
56
+ return 1
57
+ except Exception as e:
58
+ print(f"❌ Error: {e}")
59
+ return 1
60
+
61
+
62
+ if __name__ == "__main__":
63
+ sys.exit(main())