mcp-proxy-adapter 6.4.44__py3-none-any.whl → 6.4.45__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.
Files changed (24) hide show
  1. mcp_proxy_adapter/core/proxy_registration.py +100 -68
  2. mcp_proxy_adapter/examples/bugfix_certificate_config.py +284 -0
  3. mcp_proxy_adapter/examples/cert_manager_bugfix.py +203 -0
  4. mcp_proxy_adapter/examples/config_builder.py +574 -0
  5. mcp_proxy_adapter/examples/config_cli.py +283 -0
  6. mcp_proxy_adapter/examples/create_test_configs.py +169 -266
  7. mcp_proxy_adapter/examples/generate_certificates_bugfix.py +374 -0
  8. mcp_proxy_adapter/examples/generate_certificates_cli.py +406 -0
  9. mcp_proxy_adapter/examples/generate_certificates_fixed.py +313 -0
  10. mcp_proxy_adapter/examples/generate_certificates_framework.py +366 -0
  11. mcp_proxy_adapter/examples/generate_certificates_openssl.py +391 -0
  12. mcp_proxy_adapter/examples/required_certificates.py +210 -0
  13. mcp_proxy_adapter/examples/run_full_test_suite.py +117 -13
  14. mcp_proxy_adapter/examples/run_security_tests_fixed.py +42 -26
  15. mcp_proxy_adapter/examples/security_test_client.py +332 -85
  16. mcp_proxy_adapter/examples/test_config_builder.py +450 -0
  17. mcp_proxy_adapter/examples/update_config_certificates.py +136 -0
  18. mcp_proxy_adapter/version.py +1 -1
  19. {mcp_proxy_adapter-6.4.44.dist-info → mcp_proxy_adapter-6.4.45.dist-info}/METADATA +81 -1
  20. {mcp_proxy_adapter-6.4.44.dist-info → mcp_proxy_adapter-6.4.45.dist-info}/RECORD +23 -11
  21. mcp_proxy_adapter-6.4.45.dist-info/entry_points.txt +12 -0
  22. mcp_proxy_adapter-6.4.44.dist-info/entry_points.txt +0 -2
  23. {mcp_proxy_adapter-6.4.44.dist-info → mcp_proxy_adapter-6.4.45.dist-info}/WHEEL +0 -0
  24. {mcp_proxy_adapter-6.4.44.dist-info → mcp_proxy_adapter-6.4.45.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,374 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Generate Certificates Using mcp_security_framework with Bugfix
4
+ This script generates all necessary SSL certificates using the mcp_security_framework
5
+ with the CertificateConfig bugfix applied.
6
+
7
+ Author: Vasiliy Zdanovskiy
8
+ email: vasilyvz@gmail.com
9
+ """
10
+ import json
11
+ import os
12
+ import sys
13
+ from pathlib import Path
14
+ from typing import Dict, List, Optional
15
+
16
+ # Import mcp_security_framework components
17
+ from mcp_security_framework.core.cert_manager import CertificateManager
18
+ from mcp_security_framework.schemas.config import CAConfig, ServerCertConfig, ClientCertConfig, CertificateConfig
19
+ from mcp_security_framework.utils.cert_utils import validate_certificate_format
20
+
21
+ # Import required certificates configuration
22
+ from required_certificates import REQUIRED_CERTIFICATES, get_all_required_certificates
23
+
24
+
25
+ class BugfixCertificateGenerator:
26
+ """Certificate generator using mcp_security_framework with bugfix."""
27
+
28
+ def __init__(self):
29
+ """Initialize the certificate generator."""
30
+ self.working_dir = Path.cwd()
31
+ self.certs_dir = self.working_dir / "certs"
32
+ self.keys_dir = self.working_dir / "keys"
33
+
34
+ # Ensure directories exist
35
+ self.certs_dir.mkdir(exist_ok=True)
36
+ self.keys_dir.mkdir(exist_ok=True)
37
+
38
+ # Certificate manager will be initialized after CA is created
39
+ self.cert_manager = None
40
+
41
+ def print_step(self, step: str, description: str):
42
+ """Print a formatted step header."""
43
+ print(f"\n{'=' * 60}")
44
+ print(f"🔧 STEP {step}: {description}")
45
+ print(f"{'=' * 60}")
46
+
47
+ def print_success(self, message: str):
48
+ """Print a success message."""
49
+ print(f"✅ {message}")
50
+
51
+ def print_error(self, message: str):
52
+ """Print an error message."""
53
+ print(f"❌ {message}")
54
+
55
+ def print_info(self, message: str):
56
+ """Print an info message."""
57
+ print(f"ℹ️ {message}")
58
+
59
+ def check_framework(self) -> bool:
60
+ """Check if mcp_security_framework is available."""
61
+ try:
62
+ from mcp_security_framework import __version__
63
+ self.print_success(f"mcp_security_framework v{__version__} is available")
64
+ return True
65
+ except ImportError as e:
66
+ self.print_error(f"mcp_security_framework is not available: {e}")
67
+ return False
68
+
69
+ def _initialize_cert_manager(self, ca_creation_mode: bool = False):
70
+ """Initialize certificate manager with configuration."""
71
+ cert_config = CertificateConfig(
72
+ enabled=True,
73
+ ca_creation_mode=ca_creation_mode,
74
+ ca_cert_path=str(self.certs_dir / "ca_cert.pem") if not ca_creation_mode else None,
75
+ ca_key_path=str(self.keys_dir / "ca_key.pem") if not ca_creation_mode else None,
76
+ cert_storage_path=str(self.certs_dir),
77
+ key_storage_path=str(self.keys_dir),
78
+ default_validity_days=365,
79
+ key_size=2048,
80
+ hash_algorithm="sha256"
81
+ )
82
+ self.cert_manager = CertificateManager(cert_config)
83
+
84
+ def generate_ca_certificate(self) -> bool:
85
+ """Generate CA certificate using mcp_security_framework with bugfix."""
86
+ self.print_step("1", "Generating CA Certificate with Bugfix")
87
+
88
+ ca_info = REQUIRED_CERTIFICATES["ca_cert"]
89
+
90
+ try:
91
+ # Check if CA certificate already exists
92
+ if ca_info["output_cert"].exists() and ca_info["output_key"].exists():
93
+ self.print_info(f"CA certificate already exists: {ca_info['output_cert']}")
94
+ return True
95
+
96
+ # Create CA configuration
97
+ ca_config = CAConfig(
98
+ common_name=ca_info["common_name"],
99
+ organization=ca_info["organization"],
100
+ country=ca_info["country"],
101
+ state=ca_info["state"],
102
+ locality=ca_info["city"],
103
+ validity_years=ca_info["validity_days"] // 365,
104
+ key_size=2048,
105
+ hash_algorithm="sha256"
106
+ )
107
+
108
+ self.print_info(f"Generating CA certificate: {ca_info['common_name']}")
109
+
110
+ # Initialize certificate manager in CA creation mode
111
+ self._initialize_cert_manager(ca_creation_mode=True)
112
+
113
+ # Generate CA certificate using framework
114
+ result = self.cert_manager.create_root_ca(ca_config=ca_config)
115
+
116
+ if result:
117
+ # Save the generated certificate and key to expected locations
118
+ with open(ca_info["output_cert"], 'w') as f:
119
+ f.write(result.certificate_pem)
120
+ with open(ca_info["output_key"], 'w') as f:
121
+ f.write(result.private_key_pem)
122
+
123
+ self.print_success(f"CA certificate generated: {ca_info['output_cert']}")
124
+ # Reinitialize certificate manager in normal mode
125
+ self._initialize_cert_manager(ca_creation_mode=False)
126
+ return True
127
+ else:
128
+ self.print_error("Failed to generate CA certificate")
129
+ return False
130
+
131
+ except Exception as e:
132
+ self.print_error(f"Exception during CA certificate generation: {e}")
133
+ return False
134
+
135
+ def generate_server_certificate(self) -> bool:
136
+ """Generate server certificate using mcp_security_framework."""
137
+ self.print_step("2", "Generating Server Certificate")
138
+
139
+ server_info = REQUIRED_CERTIFICATES["server_cert"]
140
+
141
+ try:
142
+ # Check if server certificate already exists
143
+ if server_info["output_cert"].exists() and server_info["output_key"].exists():
144
+ self.print_info(f"Server certificate already exists: {server_info['output_cert']}")
145
+ return True
146
+
147
+ # Ensure certificate manager is initialized in normal mode
148
+ if self.cert_manager is None:
149
+ self._initialize_cert_manager(ca_creation_mode=False)
150
+
151
+ # Create server certificate configuration
152
+ server_config = ServerCertConfig(
153
+ common_name=server_info["common_name"],
154
+ organization=server_info["organization"],
155
+ country=server_info["country"],
156
+ state=server_info["state"],
157
+ locality=server_info["city"],
158
+ validity_days=server_info["validity_days"],
159
+ key_size=2048,
160
+ hash_algorithm="sha256",
161
+ ca_cert_path=str(server_info["ca_cert_path"]),
162
+ ca_key_path=str(server_info["ca_key_path"]),
163
+ san=server_info.get("san", [])
164
+ )
165
+
166
+ self.print_info(f"Generating server certificate: {server_info['common_name']}")
167
+
168
+ # Generate server certificate using framework
169
+ result = self.cert_manager.create_server_certificate(server_config=server_config)
170
+
171
+ if result:
172
+ # Save the generated certificate and key to expected locations
173
+ with open(server_info["output_cert"], 'w') as f:
174
+ f.write(result.certificate_pem)
175
+ with open(server_info["output_key"], 'w') as f:
176
+ f.write(result.private_key_pem)
177
+
178
+ self.print_success(f"Server certificate generated: {server_info['output_cert']}")
179
+ return True
180
+ else:
181
+ self.print_error("Failed to generate server certificate")
182
+ return False
183
+
184
+ except Exception as e:
185
+ self.print_error(f"Exception during server certificate generation: {e}")
186
+ return False
187
+
188
+ def generate_client_certificate(self, cert_name: str) -> bool:
189
+ """Generate client certificate using mcp_security_framework."""
190
+ self.print_step(f"3.{cert_name}", f"Generating {cert_name.title()} Client Certificate")
191
+
192
+ client_info = REQUIRED_CERTIFICATES[cert_name]
193
+
194
+ try:
195
+ # Check if client certificate already exists
196
+ if client_info["output_cert"].exists() and client_info["output_key"].exists():
197
+ self.print_info(f"{cert_name} certificate already exists: {client_info['output_cert']}")
198
+ return True
199
+
200
+ # Ensure certificate manager is initialized in normal mode
201
+ if self.cert_manager is None:
202
+ self._initialize_cert_manager(ca_creation_mode=False)
203
+
204
+ # Create client certificate configuration
205
+ client_config = ClientCertConfig(
206
+ common_name=client_info["common_name"],
207
+ organization=client_info["organization"],
208
+ country=client_info["country"],
209
+ state=client_info["state"],
210
+ locality=client_info["city"],
211
+ validity_days=client_info["validity_days"],
212
+ key_size=2048,
213
+ hash_algorithm="sha256",
214
+ ca_cert_path=str(client_info["ca_cert_path"]),
215
+ ca_key_path=str(client_info["ca_key_path"]),
216
+ roles=client_info.get("roles", []),
217
+ permissions=client_info.get("permissions", [])
218
+ )
219
+
220
+ self.print_info(f"Generating {cert_name} certificate: {client_info['common_name']}")
221
+
222
+ # Generate client certificate using framework
223
+ result = self.cert_manager.create_client_certificate(client_config=client_config)
224
+
225
+ if result:
226
+ # Save the generated certificate and key to expected locations
227
+ with open(client_info["output_cert"], 'w') as f:
228
+ f.write(result.certificate_pem)
229
+ with open(client_info["output_key"], 'w') as f:
230
+ f.write(result.private_key_pem)
231
+
232
+ self.print_success(f"{cert_name} certificate generated: {client_info['output_cert']}")
233
+ return True
234
+ else:
235
+ self.print_error(f"Failed to generate {cert_name} certificate")
236
+ return False
237
+
238
+ except Exception as e:
239
+ self.print_error(f"Exception during {cert_name} certificate generation: {e}")
240
+ return False
241
+
242
+ def create_certificate_aliases(self) -> bool:
243
+ """Create certificate aliases for different configurations."""
244
+ self.print_step("4", "Creating Certificate Aliases")
245
+
246
+ try:
247
+ # Create aliases for HTTPS configurations
248
+ if (self.certs_dir / "server_cert.pem").exists():
249
+ # HTTPS aliases
250
+ (self.certs_dir / "mcp_proxy_adapter_server.crt").unlink(missing_ok=True)
251
+ (self.certs_dir / "mcp_proxy_adapter_server.crt").symlink_to("server_cert.pem")
252
+
253
+ (self.certs_dir / "mcp_proxy_adapter_server.key").unlink(missing_ok=True)
254
+ (self.certs_dir / "mcp_proxy_adapter_server.key").symlink_to(self.keys_dir / "server_key.pem")
255
+
256
+ # mTLS aliases
257
+ (self.certs_dir / "localhost_server.crt").unlink(missing_ok=True)
258
+ (self.certs_dir / "localhost_server.crt").symlink_to("server_cert.pem")
259
+
260
+ self.print_success("Certificate aliases created")
261
+
262
+ # Create CA alias
263
+ if (self.certs_dir / "ca_cert.pem").exists():
264
+ (self.certs_dir / "mcp_proxy_adapter_ca_ca.crt").unlink(missing_ok=True)
265
+ (self.certs_dir / "mcp_proxy_adapter_ca_ca.crt").symlink_to("ca_cert.pem")
266
+
267
+ self.print_success("CA certificate alias created")
268
+
269
+ return True
270
+
271
+ except Exception as e:
272
+ self.print_error(f"Failed to create certificate aliases: {e}")
273
+ return False
274
+
275
+ def validate_certificates(self) -> bool:
276
+ """Validate generated certificates using framework."""
277
+ self.print_step("5", "Validating Certificates")
278
+
279
+ all_required = get_all_required_certificates()
280
+ validation_results = []
281
+
282
+ for cert_name in all_required:
283
+ cert_info = REQUIRED_CERTIFICATES[cert_name]
284
+ cert_file = cert_info["output_cert"]
285
+ key_file = cert_info["output_key"]
286
+
287
+ if cert_file.exists() and key_file.exists():
288
+ try:
289
+ # Validate certificate format using framework
290
+ format_valid = validate_certificate_format(str(cert_file))
291
+
292
+ if format_valid:
293
+ self.print_success(f"{cert_name}: Valid format")
294
+ validation_results.append(True)
295
+ else:
296
+ self.print_error(f"{cert_name}: Invalid format")
297
+ validation_results.append(False)
298
+
299
+ except Exception as e:
300
+ self.print_error(f"{cert_name}: Validation failed - {e}")
301
+ validation_results.append(False)
302
+ else:
303
+ self.print_error(f"{cert_name}: Missing files")
304
+ validation_results.append(False)
305
+
306
+ success_count = sum(validation_results)
307
+ total_count = len(validation_results)
308
+
309
+ self.print_info(f"Validation results: {success_count}/{total_count} certificates valid")
310
+
311
+ return success_count == total_count
312
+
313
+ def generate_all_certificates(self) -> bool:
314
+ """Generate all required certificates."""
315
+ print("🔐 Generating All Certificates Using mcp_security_framework with Bugfix")
316
+ print("=" * 60)
317
+
318
+ try:
319
+ # Check framework availability
320
+ if not self.check_framework():
321
+ return False
322
+
323
+ # Generate CA certificate first
324
+ if not self.generate_ca_certificate():
325
+ return False
326
+
327
+ # Generate server certificate
328
+ if not self.generate_server_certificate():
329
+ return False
330
+
331
+ # Generate client certificates
332
+ client_certs = ["admin_cert", "user_cert", "proxy_cert"]
333
+ for cert_name in client_certs:
334
+ if cert_name in REQUIRED_CERTIFICATES:
335
+ if not self.generate_client_certificate(cert_name):
336
+ return False
337
+
338
+ # Create aliases
339
+ if not self.create_certificate_aliases():
340
+ return False
341
+
342
+ # Validate certificates
343
+ if not self.validate_certificates():
344
+ return False
345
+
346
+ # Print summary
347
+ print(f"\n{'=' * 60}")
348
+ print("📊 CERTIFICATE GENERATION SUMMARY")
349
+ print(f"{'=' * 60}")
350
+ print("✅ All certificates generated successfully!")
351
+ print(f"📁 Certificates directory: {self.certs_dir}")
352
+ print(f"📁 Keys directory: {self.keys_dir}")
353
+
354
+ return True
355
+
356
+ except Exception as e:
357
+ self.print_error(f"Certificate generation failed: {e}")
358
+ return False
359
+
360
+
361
+ def main():
362
+ """Main entry point."""
363
+ generator = BugfixCertificateGenerator()
364
+
365
+ try:
366
+ success = generator.generate_all_certificates()
367
+ sys.exit(0 if success else 1)
368
+ except Exception as e:
369
+ print(f"❌ Fatal error: {e}")
370
+ sys.exit(1)
371
+
372
+
373
+ if __name__ == "__main__":
374
+ main()