mcp-proxy-adapter 6.3.28__py3-none-any.whl → 6.3.30__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.
@@ -1,3 +1,4 @@
1
+ # flake8: noqa: E501
1
2
  """
2
3
  Module for proxy registration functionality with security framework integration.
3
4
 
@@ -13,9 +14,12 @@ import asyncio
13
14
  import time
14
15
  import ssl
15
16
  from typing import Dict, Any, Optional, Tuple
17
+ from pathlib import Path
16
18
  from urllib.parse import urljoin
17
19
 
18
20
  import aiohttp
21
+ import os
22
+ import glob
19
23
 
20
24
  from mcp_proxy_adapter.core.logging import logger
21
25
  from mcp_proxy_adapter.core.client_security import create_client_security_manager
@@ -47,6 +51,22 @@ class ProxyRegistrationManager:
47
51
  self.registration_config = config.get(
48
52
  "registration", config.get("proxy_registration", {})
49
53
  )
54
+ # Auto-fill minimal TLS settings from global SSL if missing to support minimal config
55
+ try:
56
+ reg_ssl = self.registration_config.get("ssl", {})
57
+ if not isinstance(reg_ssl, dict):
58
+ reg_ssl = {}
59
+ global_ssl = config.get("security", {}).get("ssl", {}) or config.get("ssl", {})
60
+ if isinstance(global_ssl, dict):
61
+ if not reg_ssl.get("ca_cert") and global_ssl.get("ca_cert"):
62
+ reg_ssl["ca_cert"] = global_ssl.get("ca_cert")
63
+ # Keep verify_mode if already set; default to CERT_REQUIRED if global verify_client true
64
+ if not reg_ssl.get("verify_mode") and isinstance(global_ssl.get("verify_client"), bool):
65
+ reg_ssl["verify_mode"] = "CERT_REQUIRED" if global_ssl.get("verify_client") else "CERT_NONE"
66
+ if reg_ssl:
67
+ self.registration_config["ssl"] = reg_ssl
68
+ except Exception:
69
+ pass
50
70
 
51
71
  # Basic registration settings
52
72
  self.proxy_url = self.registration_config.get(
@@ -155,6 +175,15 @@ class ProxyRegistrationManager:
155
175
  logger.debug("_create_ssl_context called")
156
176
  if not self.client_security:
157
177
  logger.debug("SSL context creation failed: client_security is None")
178
+ # Try best-effort default CA if available
179
+ try:
180
+ default_ca = "/home/vasilyvz/projects/mcp_proxy_adapter/mtls_certificates/ca/ca.crt"
181
+ if Path(default_ca).exists():
182
+ ctx = ssl.create_default_context(cafile=default_ca)
183
+ logger.debug("Using default CA bundle for SSL verification")
184
+ return ctx
185
+ except Exception:
186
+ pass
158
187
  return None
159
188
 
160
189
  try:
@@ -162,6 +191,42 @@ class ProxyRegistrationManager:
162
191
  cert_config = self.registration_config.get("certificate", {})
163
192
  ssl_config = self.registration_config.get("ssl", {})
164
193
 
194
+ # FALLBACK: if no explicit registration SSL/certs provided, reuse global SSL config
195
+ if not cert_config and not ssl_config:
196
+ global_ssl = self.config.get("security", {}).get("ssl", {}) or self.config.get("ssl", {})
197
+ if global_ssl:
198
+ # Map global ssl to registration-style configs
199
+ mapped_cert = {}
200
+ if global_ssl.get("cert_file") and global_ssl.get("key_file"):
201
+ mapped_cert = {
202
+ "cert_file": global_ssl.get("cert_file"),
203
+ "key_file": global_ssl.get("key_file"),
204
+ }
205
+ mapped_ssl = {}
206
+ if global_ssl.get("ca_cert"):
207
+ mapped_ssl["ca_cert"] = global_ssl.get("ca_cert")
208
+ if global_ssl.get("verify_client") is not None:
209
+ mapped_ssl["verify_mode"] = (
210
+ "CERT_REQUIRED" if global_ssl.get("verify_client") else "CERT_NONE"
211
+ )
212
+ cert_config = mapped_cert
213
+ ssl_config = mapped_ssl
214
+
215
+ # If still no client certificate specified, try default client certs from project
216
+ if not cert_config or not cert_config.get("cert_file") or not cert_config.get("key_file"):
217
+ try:
218
+ base_dir = "/home/vasilyvz/projects/mcp_proxy_adapter/mtls_certificates/client"
219
+ if os.path.isdir(base_dir):
220
+ crt_candidates = sorted(glob.glob(os.path.join(base_dir, "*.crt")))
221
+ key_candidates = sorted(glob.glob(os.path.join(base_dir, "*.key")))
222
+ if crt_candidates and key_candidates:
223
+ cert_config = {
224
+ "cert_file": crt_candidates[0],
225
+ "key_file": key_candidates[0],
226
+ }
227
+ except Exception:
228
+ pass
229
+
165
230
  logger.debug(
166
231
  f"SSL context creation: cert_config={cert_config}, ssl_config={ssl_config}"
167
232
  )
@@ -169,7 +234,13 @@ class ProxyRegistrationManager:
169
234
  # SSL is enabled if certificate config exists or SSL config exists
170
235
  if cert_config or ssl_config:
171
236
  # Create a custom SSL context based on registration configuration
172
- context = ssl.create_default_context()
237
+ ca_file = ssl_config.get("ca_cert") if isinstance(ssl_config, dict) else None
238
+ if ca_file and Path(ca_file).exists():
239
+ context = ssl.create_default_context(cafile=ca_file)
240
+ else:
241
+ # Try default project CA
242
+ default_ca = "/home/vasilyvz/projects/mcp_proxy_adapter/mtls_certificates/ca/ca.crt"
243
+ context = ssl.create_default_context(cafile=default_ca) if Path(default_ca).exists() else ssl.create_default_context()
173
244
 
174
245
  # Load client certificates if provided
175
246
  if cert_config:
@@ -179,7 +250,7 @@ class ProxyRegistrationManager:
179
250
  if cert_file and key_file:
180
251
  context.load_cert_chain(cert_file, key_file)
181
252
  logger.debug(
182
- f"Loaded client certificates: {cert_file}, {key_file}"
253
+ f"Loaded client certificates for mTLS: cert={cert_file}, key={key_file}"
183
254
  )
184
255
 
185
256
  # Configure SSL verification based on registration settings
@@ -207,17 +278,15 @@ class ProxyRegistrationManager:
207
278
  context.verify_mode = ssl.CERT_REQUIRED
208
279
  logger.debug("SSL verification enabled (default)")
209
280
  else:
210
- # Check certificate config for verify_server setting
211
- verify_server = cert_config.get("verify_server", True)
212
- if not verify_server:
213
- context.check_hostname = False
214
- context.verify_mode = ssl.CERT_NONE
215
- logger.debug("SSL verification disabled (verify_server: false)")
216
- else:
217
- # Default SSL context if no specific SSL config
281
+ # No specific ssl_config, default to secure verification if CA is known
282
+ if cert_config:
283
+ # Keep hostname check and CERT_REQUIRED by default
218
284
  context.check_hostname = True
219
285
  context.verify_mode = ssl.CERT_REQUIRED
220
- logger.debug("Using default SSL verification")
286
+ logger.debug("Using default SSL verification with provided client certs")
287
+ else:
288
+ # Last resort: use system defaults
289
+ logger.debug("Using system default SSL verification")
221
290
 
222
291
  logger.info("Created custom SSL context for proxy registration")
223
292
  return context
@@ -246,6 +315,27 @@ class ProxyRegistrationManager:
246
315
  logger.error("Server URL not set, cannot register with proxy")
247
316
  return False
248
317
 
318
+ # Normalize server_url for docker host if needed
319
+ try:
320
+ if self.server_url:
321
+ from urllib.parse import urlparse, urlunparse
322
+ import os as _os
323
+ parsed = urlparse(self.server_url)
324
+ if parsed.hostname in ("localhost", "127.0.0.1"):
325
+ docker_addr = _os.getenv("DOCKER_HOST_ADDR", "172.17.0.1")
326
+ port = parsed.port
327
+ if not port:
328
+ port = 443 if parsed.scheme == "https" else 80
329
+ new_netloc = f"{docker_addr}:{port}"
330
+ normalized = urlunparse(parsed._replace(netloc=new_netloc))
331
+ if normalized != self.server_url:
332
+ self.server_url = normalized
333
+ logger.info(
334
+ f"Normalized server_url for docker host: {self.server_url}"
335
+ )
336
+ except Exception as _e:
337
+ logger.debug(f"server_url normalization skipped: {_e}")
338
+
249
339
  # Prepare registration data with proxy info
250
340
  proxy_info = self.registration_config.get("proxy_info", {})
251
341
  registration_data = {
@@ -264,7 +354,8 @@ class ProxyRegistrationManager:
264
354
  logger.info(f"Attempting to register server with proxy at {self.proxy_url}")
265
355
  logger.debug(f"Registration data: {registration_data}")
266
356
 
267
- for attempt in range(self.retry_attempts):
357
+ # Do not block application startup: single attempt, no sleeps here
358
+ for attempt in range(1):
268
359
  try:
269
360
  success, result = await self._make_secure_registration_request(
270
361
  registration_data
@@ -285,24 +376,21 @@ class ProxyRegistrationManager:
285
376
 
286
377
  return True
287
378
  else:
288
- error_msg = result.get("error", {}).get("message", "Unknown error")
379
+ # Be robust if result is not a dict
380
+ error_msg = None
381
+ if isinstance(result, dict):
382
+ error_msg = result.get("error", {}).get("message", "Unknown error")
383
+ else:
384
+ error_msg = str(result)
289
385
  logger.warning(
290
386
  f"❌ Registration attempt {attempt + 1} failed: {error_msg}"
291
387
  )
292
388
 
293
- if attempt < self.retry_attempts - 1:
294
- logger.info(f"Retrying in {self.retry_delay} seconds...")
295
- await asyncio.sleep(self.retry_delay)
296
-
297
389
  except Exception as e:
298
390
  logger.error(
299
391
  f"❌ Registration attempt {attempt + 1} failed with exception: {e}"
300
392
  )
301
393
 
302
- if attempt < self.retry_attempts - 1:
303
- logger.info(f"Retrying in {self.retry_delay} seconds...")
304
- await asyncio.sleep(self.retry_delay)
305
-
306
394
  logger.error(
307
395
  f"❌ Failed to register with proxy after {self.retry_attempts} attempts"
308
396
  )
@@ -395,7 +483,11 @@ class ProxyRegistrationManager:
395
483
  headers=headers,
396
484
  timeout=aiohttp.ClientTimeout(total=self.timeout),
397
485
  ) as response:
398
- result = await response.json()
486
+ try:
487
+ result = await response.json()
488
+ except Exception:
489
+ text_body = await response.text()
490
+ result = {"success": False, "error": {"code": "NON_JSON_RESPONSE", "message": text_body}}
399
491
 
400
492
  # Validate response headers if security framework available
401
493
  if self.client_security:
@@ -545,40 +637,50 @@ class ProxyRegistrationManager:
545
637
  if not self.server_key:
546
638
  return False
547
639
 
548
- heartbeat_data = {
549
- "server_id": self.server_id,
550
- "server_key": self.server_key,
551
- "timestamp": int(time.time()),
552
- }
553
-
554
640
  url = urljoin(self.proxy_url, "/heartbeat")
555
641
 
556
642
  # Get authentication headers
557
643
  headers = self._get_auth_headers()
558
- headers["Content-Type"] = "application/json"
559
644
 
560
645
  # Create SSL context if needed
561
646
  ssl_context = self._create_ssl_context()
562
647
 
563
648
  # Create connector with SSL context
564
- connector = None
565
- if ssl_context:
566
- connector = aiohttp.TCPConnector(ssl=ssl_context)
649
+ connector = aiohttp.TCPConnector(ssl=ssl_context) if ssl_context else None
567
650
 
568
651
  try:
652
+ timeout = aiohttp.ClientTimeout(total=self.timeout)
569
653
  async with aiohttp.ClientSession(connector=connector) as session:
654
+ # Prefer GET heartbeat (container exposes GET /heartbeat)
655
+ try:
656
+ async with session.get(url, headers=headers, timeout=timeout) as resp:
657
+ if resp.status == 200:
658
+ logger.debug("Heartbeat (GET) succeeded")
659
+ return True
660
+ # If method not allowed, fall back to POST
661
+ if resp.status != 405:
662
+ logger.warning(
663
+ f"Heartbeat (GET) failed with status: {resp.status}"
664
+ )
665
+ except Exception as ge:
666
+ logger.debug(f"Heartbeat (GET) error: {ge}")
667
+
668
+ # Fallback to POST if GET not supported
669
+ heartbeat_data = {
670
+ "server_id": self.server_id,
671
+ "server_key": self.server_key,
672
+ "timestamp": int(time.time()),
673
+ }
674
+ post_headers = dict(headers)
675
+ post_headers["Content-Type"] = "application/json"
570
676
  async with session.post(
571
- url,
572
- json=heartbeat_data,
573
- headers=headers,
574
- timeout=aiohttp.ClientTimeout(total=self.timeout),
575
- ) as response:
576
- if response.status == 200:
577
- logger.debug("Heartbeat sent successfully")
677
+ url, json=heartbeat_data, headers=post_headers, timeout=timeout
678
+ ) as resp:
679
+ if resp.status == 200:
680
+ logger.debug("Heartbeat (POST) succeeded")
578
681
  return True
579
- else:
580
682
  logger.warning(
581
- f"Heartbeat failed with status: {response.status}"
683
+ f"Heartbeat (POST) failed with status: {resp.status}"
582
684
  )
583
685
  return False
584
686
  except Exception as e:
mcp_proxy_adapter/main.py CHANGED
@@ -5,7 +5,6 @@ MCP Proxy Adapter - Main Entry Point
5
5
  Author: Vasiliy Zdanovskiy
6
6
  email: vasilyvz@gmail.com
7
7
  """
8
-
9
8
  import sys
10
9
  import ssl
11
10
  import hypercorn.asyncio
@@ -27,8 +26,15 @@ from mcp_proxy_adapter.core.config_validator import ConfigValidator
27
26
  def main():
28
27
  """Main entry point for the MCP Proxy Adapter."""
29
28
  # Parse command line arguments
30
- parser = argparse.ArgumentParser(description="MCP Proxy Adapter Server")
31
- parser.add_argument("--config", "-c", type=str, help="Path to configuration file")
29
+ parser = argparse.ArgumentParser(
30
+ description="MCP Proxy Adapter Server",
31
+ )
32
+ parser.add_argument(
33
+ "--config",
34
+ "-c",
35
+ type=str,
36
+ help="Path to configuration file",
37
+ )
32
38
  args = parser.parse_args()
33
39
 
34
40
  # Load configuration
@@ -46,32 +52,33 @@ def main():
46
52
  sys.exit(1)
47
53
  print("✅ Configuration validation passed")
48
54
 
49
- # Create application
50
- app = create_app(app_config=config.get_all())
55
+ # Create application (pass config_path so reload uses same file)
56
+ app = create_app(app_config=config.get_all(), config_path=args.config)
51
57
 
52
58
  # Get server configuration
53
59
  host = config.get("server.host", "0.0.0.0")
54
60
  port = config.get("server.port", 8000)
55
61
 
56
- # Get SSL configuration
62
+ # Get SSL configuration strictly from config (no hardcode)
57
63
  ssl_enabled = config.get("ssl.enabled", False)
58
64
  ssl_cert_file = config.get("ssl.cert_file")
59
65
  ssl_key_file = config.get("ssl.key_file")
60
- ssl_ca_cert = config.get("ssl.ca_cert_file")
66
+ # Support both keys: ssl.ca_cert_file (security framework style) and ssl.ca_cert (legacy)
67
+ ssl_ca_cert = config.get("ssl.ca_cert_file", config.get("ssl.ca_cert"))
61
68
  verify_client = config.get("ssl.verify_client", False)
62
-
63
- # Debug SSL configuration
64
- print(f"🔍 Debug SSL config:")
69
+
70
+ print("🔍 Debug SSL config:")
65
71
  print(f" ssl_enabled: {ssl_enabled}")
66
72
  print(f" ssl_cert_file: {ssl_cert_file}")
67
73
  print(f" ssl_key_file: {ssl_key_file}")
68
74
  print(f" ssl_ca_cert: {ssl_ca_cert}")
69
75
  print(f" verify_client: {verify_client}")
76
+ print("🔍 Source: configuration (hardcode disabled)")
70
77
 
71
- print(f"🚀 Starting MCP Proxy Adapter")
78
+ print("🚀 Starting MCP Proxy Adapter")
72
79
  print(f"🌐 Server: {host}:{port}")
73
80
  if ssl_enabled:
74
- print(f"🔐 SSL: Enabled")
81
+ print("🔐 SSL: Enabled")
75
82
  print(f" Certificate: {ssl_cert_file}")
76
83
  print(f" Key: {ssl_key_file}")
77
84
  if ssl_ca_cert:
@@ -94,19 +101,47 @@ def main():
94
101
  # For mTLS, require client certificates
95
102
  config_hypercorn.verify_mode = ssl.CERT_REQUIRED
96
103
  print("🔐 mTLS: Client certificate verification enabled")
97
-
98
- print(f"🔍 HYPERCORN CONFIG: certfile={config_hypercorn.certfile}")
99
- print(f"🔍 HYPERCORN CONFIG: keyfile={config_hypercorn.keyfile}")
100
- print(f"🔍 HYPERCORN CONFIG: ca_certs={config_hypercorn.ca_certs}")
101
- print(f"🔍 HYPERCORN CONFIG: verify_mode={config_hypercorn.verify_mode}")
102
104
  else:
103
- # For regular HTTPS without client verification
104
- # Don't set verify_mode for regular HTTPS - let hypercorn handle it
105
- print("🔐 HTTPS: Regular HTTPS without client certificate verification")
105
+ print(
106
+ "🔐 HTTPS: Regular HTTPS without client certificate",
107
+ )
108
+ print("verification")
109
+
110
+ # Prefer modern protocols
111
+ try:
112
+ config_hypercorn.alpn_protocols = ["h2", "http/1.1"]
113
+ except Exception:
114
+ pass
115
+
116
+ # Log hypercorn configuration
117
+ print("=" * 50)
118
+ print("🔍 HYPERCORN CONFIGURATION:")
119
+ print(
120
+ "🔍 certfile="
121
+ f"{getattr(config_hypercorn, 'certfile', None)}",
122
+ )
123
+ print(
124
+ "🔍 keyfile="
125
+ f"{getattr(config_hypercorn, 'keyfile', None)}",
126
+ )
127
+ print(
128
+ "🔍 ca_certs="
129
+ f"{getattr(config_hypercorn, 'ca_certs', None)}",
130
+ )
131
+ print(
132
+ "🔍 verify_mode="
133
+ f"{getattr(config_hypercorn, 'verify_mode', None)}",
134
+ )
135
+ print(
136
+ "🔍 alpn_protocols="
137
+ f"{getattr(config_hypercorn, 'alpn_protocols', None)}",
138
+ )
139
+ print("=" * 50)
106
140
 
107
- print(f"🔐 Starting HTTPS server with hypercorn...")
141
+ if ssl_enabled:
142
+ print("🔐 Starting HTTPS server with hypercorn...")
108
143
  else:
109
- print(f"🌐 Starting HTTP server with hypercorn...")
144
+ print("🌐 Starting HTTP server with hypercorn...")
110
145
 
111
146
  # Run the server
112
147
  asyncio.run(hypercorn.asyncio.serve(app, config_hypercorn))
@@ -2,4 +2,4 @@
2
2
  Version information for MCP Proxy Adapter.
3
3
  """
4
4
 
5
- __version__ = "6.3.28"
5
+ __version__ = "6.3.30"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-proxy-adapter
3
- Version: 6.3.28
3
+ Version: 6.3.30
4
4
  Summary: Powerful JSON-RPC microservices framework with built-in security, authentication, and proxy registration
5
5
  Home-page: https://github.com/maverikod/mcp-proxy-adapter
6
6
  Author: Vasiliy Zdanovskiy
@@ -44,12 +44,15 @@ Requires-Dist: pytest-asyncio>=0.20.0; extra == "dev"
44
44
  Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
45
45
  Requires-Dist: black>=23.0.0; extra == "dev"
46
46
  Requires-Dist: isort>=5.12.0; extra == "dev"
47
+ Requires-Dist: uvicorn<1.0.0,>=0.22.0; extra == "dev"
47
48
  Provides-Extra: test
48
49
  Requires-Dist: pytest>=7.0.0; extra == "test"
49
50
  Requires-Dist: pytest-asyncio>=0.21.0; extra == "test"
50
51
  Requires-Dist: pytest-cov>=4.0.0; extra == "test"
51
52
  Requires-Dist: httpx>=0.24.0; extra == "test"
52
53
  Requires-Dist: pytest-mock>=3.10.0; extra == "test"
54
+ Provides-Extra: examples
55
+ Requires-Dist: uvicorn<1.0.0,>=0.22.0; extra == "examples"
53
56
  Dynamic: author
54
57
  Dynamic: home-page
55
58
  Dynamic: requires-python
@@ -2,11 +2,11 @@ mcp_proxy_adapter/__init__.py,sha256=iH0EBBsRj_cfZJpAIsgN_8tTdfefhnl6uUKHjLHhWDQ
2
2
  mcp_proxy_adapter/__main__.py,sha256=sq3tANRuTd18euamt0Bmn1sJeAyzXENZ5VvsMwbrDFA,579
3
3
  mcp_proxy_adapter/config.py,sha256=-7iVS0mUWWKNeao7nqTAFlUD6FcMwRlDkchN7OwYsr0,21662
4
4
  mcp_proxy_adapter/custom_openapi.py,sha256=yLle4CntYK9wpivgn9NflZyJhy-YNrmWjJzt0ai5nP0,14672
5
- mcp_proxy_adapter/main.py,sha256=YbDH157owPgP6AQJ4DL6bx2jeGYRh0ox1fCx4qVnF1s,3985
5
+ mcp_proxy_adapter/main.py,sha256=idp3KUR7CT7kTXLVPvvclJlNnt8d_HYl8_jY98uknmo,4677
6
6
  mcp_proxy_adapter/openapi.py,sha256=2UZOI09ZDRJuBYBjKbMyb2U4uASszoCMD5o_4ktRpvg,13480
7
- mcp_proxy_adapter/version.py,sha256=-ovt_O-oGtB7PGYmXBTw9F3gQ0hY2m0CQXDOLYzG6So,75
7
+ mcp_proxy_adapter/version.py,sha256=P9yxGAMLjCfxwoZms2TyoWvVR_JhmPQJrS3y9M1gBlw,75
8
8
  mcp_proxy_adapter/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- mcp_proxy_adapter/api/app.py,sha256=UBCiMPHaZYx_3G8EdEkT1yKtPEnKnLJplDjX5sQcQlM,29757
9
+ mcp_proxy_adapter/api/app.py,sha256=dIsAWbQFWMa8zxhPro9hxUnUuqnLWlqutWAKrqJIHGE,33386
10
10
  mcp_proxy_adapter/api/handlers.py,sha256=iyFGoEuUS1wxbV1ELA0zmaxIyQR7j4zw-4MrD-uIO6E,8294
11
11
  mcp_proxy_adapter/api/schemas.py,sha256=mevUvQnYgWQfkJAs3-vq3HalBzh6-Saa-Au1VVf0peE,12377
12
12
  mcp_proxy_adapter/api/tool_integration.py,sha256=AeUyvJVN-c3FrX5fHdagHL51saRH5d1ZKqc2YEx0rTE,10147
@@ -29,7 +29,7 @@ mcp_proxy_adapter/commands/builtin_commands.py,sha256=8kYLWIr4JvhZtqaVM9Jhqr_-yS
29
29
  mcp_proxy_adapter/commands/catalog_manager.py,sha256=1DLvjt9RVMmeNZyynd-frk8gYkdgGJYyBXg6uWTJ16k,34873
30
30
  mcp_proxy_adapter/commands/cert_monitor_command.py,sha256=phSms8EYOn1RqSp7na6jw0S1bLRrilmYZIFXVepVFyU,23687
31
31
  mcp_proxy_adapter/commands/certificate_management_command.py,sha256=TDoGV2mnEz1HaJiHsxAO_IvtSinVwp0s_av5oIgmRqk,23225
32
- mcp_proxy_adapter/commands/command_registry.py,sha256=abQPOAzS_zIj4SPsOxsZeQS9pjLxyzlMUt9kI_AYT7E,35288
32
+ mcp_proxy_adapter/commands/command_registry.py,sha256=RFGZw-0A29P6ZQMZ2qi5wQe3K89hCNOqRTdhtYYDGDg,36498
33
33
  mcp_proxy_adapter/commands/config_command.py,sha256=PWX1OhKAmjlc8CSy4-sImdvGeSNgDNyv30Y-P5iZp9g,3767
34
34
  mcp_proxy_adapter/commands/dependency_container.py,sha256=mvPob62lQ-mKRbAA9aL3L5gOT9_4V2Vy2cGoup2S840,3239
35
35
  mcp_proxy_adapter/commands/dependency_manager.py,sha256=JWdmQ0de6rQAv8GYDToFIlpomBBXqT61XMygWcggYSQ,7366
@@ -61,15 +61,15 @@ mcp_proxy_adapter/core/client.py,sha256=qIbPl8prEwK2U65kl-vGJW2_imo1E4i6HxG_VpPe
61
61
  mcp_proxy_adapter/core/client_manager.py,sha256=yD8HZJlOwmDbVU49YfzSbh1XZ-Vib8qfcLVAaH03Jdg,8832
62
62
  mcp_proxy_adapter/core/client_security.py,sha256=siUaYorcDbpZsEIKgLfg-jBKkp7z_Er8wsO63mDD3Is,13127
63
63
  mcp_proxy_adapter/core/config_converter.py,sha256=Wnnsrbw7DxtgDfLG-IyyzK-hkKu0_1yp7-7dW87tu_4,17422
64
- mcp_proxy_adapter/core/config_validator.py,sha256=M_iQqskKk5VfziNkXTJwjU97vEBLNSsXIqtpTQKHAcA,9644
64
+ mcp_proxy_adapter/core/config_validator.py,sha256=7Xs4T85Xwc3sQaaG1ZHnp6MUT4ZU3Zmlp0HNCYVa43A,8755
65
65
  mcp_proxy_adapter/core/crl_utils.py,sha256=Jnwq2UN52IoCDZCwByRP3XNMOJexftb-mVaH6zes6Fc,11706
66
66
  mcp_proxy_adapter/core/errors.py,sha256=UNEfdmK0zPGJrWH1zUMRjHIJMcoVDcBO4w8xxKHBv4w,5356
67
67
  mcp_proxy_adapter/core/logging.py,sha256=gNI6vfPQC7jrUtVu6NeDsmU72JPlrRRBhtJipL1eVrI,9560
68
68
  mcp_proxy_adapter/core/mtls_asgi.py,sha256=tvk0P9024s18dcCHY9AaQIecT4ojOTv21EuQWXwooU0,5200
69
69
  mcp_proxy_adapter/core/mtls_asgi_app.py,sha256=DT_fTUH1RkvBa3ThbyCyNb-XUHyCb4DqaKA1gcZC6z4,6538
70
70
  mcp_proxy_adapter/core/protocol_manager.py,sha256=3sWOAiMniQY5nu9CHkitIOGN4CXH28hOTwY92D0yasM,15268
71
- mcp_proxy_adapter/core/proxy_client.py,sha256=XweRXBNbntJ5UYdSxUDcOYmJY0jbsKbfdWC0Jw72wdQ,23039
72
- mcp_proxy_adapter/core/proxy_registration.py,sha256=HzcYay7V0lPgHdmHa980e9HiRGNvFpwPaure1fULiGk,25610
71
+ mcp_proxy_adapter/core/proxy_client.py,sha256=CB6KBhV3vH2GU5nZ27VZ_xlNbYTAU_tnYFrkuK5He58,6094
72
+ mcp_proxy_adapter/core/proxy_registration.py,sha256=qgNtdYPXZ6F1oXRXIXCICCL9NYkOteGrTVPQAI8P5mg,31483
73
73
  mcp_proxy_adapter/core/role_utils.py,sha256=YwRenGoXI5YrHVbFjKFAH2DJs2miyqhcr9LWF7mxieg,12284
74
74
  mcp_proxy_adapter/core/security_adapter.py,sha256=MAtNthsp7Qj4-oLFzSi7Pr3vWQbWS_uelqa5LGgrXIE,12957
75
75
  mcp_proxy_adapter/core/security_factory.py,sha256=M-1McwUOmuV7Eo-m_P2undtJVNK_KIjDx8o_uRY8rLo,8005
@@ -137,8 +137,8 @@ mcp_proxy_adapter/schemas/base_schema.json,sha256=v9G9cGMd4dRhCZsOQ_FMqOi5VFyVbI
137
137
  mcp_proxy_adapter/schemas/openapi_schema.json,sha256=C3yLkwmDsvnLW9B5gnKKdBGl4zxkeU-rEmjTrNVsQU0,8405
138
138
  mcp_proxy_adapter/utils/config_generator.py,sha256=UXxuxxAyKTesAS3DOofQ26e20v771inA7EfBV8PZD1c,47543
139
139
  mcp_proxy_adapter_issue_package/demonstrate_issue.py,sha256=O54fwWQvUAjEGiHhQGm1JLnARkhVCwAqjBk_89HyRbY,7894
140
- mcp_proxy_adapter-6.3.28.dist-info/METADATA,sha256=0SkstOUr-pwQ0JgZHJJT2mpOarqSz7lhI0hH3jxhOUY,22266
141
- mcp_proxy_adapter-6.3.28.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
142
- mcp_proxy_adapter-6.3.28.dist-info/entry_points.txt,sha256=J3eV6ID0lt_VSp4lIdIgBFTqLCThgObNNxRCbyfiMHw,70
143
- mcp_proxy_adapter-6.3.28.dist-info/top_level.txt,sha256=CHk-Mc-AxjO-tRheegA2qLiQnU4vZRnxuTF81So6SAc,50
144
- mcp_proxy_adapter-6.3.28.dist-info/RECORD,,
140
+ mcp_proxy_adapter-6.3.30.dist-info/METADATA,sha256=BxBZhz8TcLcDZt3bdhdYHTcpddyQ8dnmizdSnv53fzQ,22404
141
+ mcp_proxy_adapter-6.3.30.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
142
+ mcp_proxy_adapter-6.3.30.dist-info/entry_points.txt,sha256=J3eV6ID0lt_VSp4lIdIgBFTqLCThgObNNxRCbyfiMHw,70
143
+ mcp_proxy_adapter-6.3.30.dist-info/top_level.txt,sha256=CHk-Mc-AxjO-tRheegA2qLiQnU4vZRnxuTF81So6SAc,50
144
+ mcp_proxy_adapter-6.3.30.dist-info/RECORD,,