mcp-proxy-adapter 6.6.3__py3-none-any.whl → 6.6.4__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.
@@ -65,11 +65,8 @@ def create_lifespan(config_path: Optional[str] = None):
65
65
  initialize_proxy_registration,
66
66
  )
67
67
 
68
- # Initialize proxy registration manager early
69
- try:
70
- initialize_proxy_registration(config.get_all())
71
- except Exception as e:
72
- logger.error(f"Failed to initialize proxy registration: {e}")
68
+ # Proxy registration manager will be initialized in registry.reload_system()
69
+ # after all commands are loaded to ensure complete command schema
73
70
 
74
71
  # Compute server_url EARLY and inject into registration manager so
75
72
  # that reload_system (which may perform registration) uses the correct
@@ -124,11 +121,7 @@ def create_lifespan(config_path: Optional[str] = None):
124
121
  )
125
122
  logger.info(f"System initialization result: {init_result}")
126
123
 
127
- # Initialize proxy registration manager with current config
128
- try:
129
- initialize_proxy_registration(config.get_all())
130
- except Exception as e:
131
- logger.error(f"Failed to initialize proxy registration: {e}")
124
+ # Proxy registration manager is already initialized in registry.reload_system()
132
125
 
133
126
  # Recompute registration URL AFTER config reload using final config
134
127
  try:
@@ -141,11 +134,11 @@ def create_lifespan(config_path: Optional[str] = None):
141
134
  public_host = reg_cfg.get("public_host")
142
135
  public_port = reg_cfg.get("public_port")
143
136
 
144
- security_config = final_config.get("security", {})
145
- ssl_cfg = security_config.get("ssl", {})
146
- if not ssl_cfg.get("enabled", False):
147
- ssl_cfg = final_config.get("ssl", {})
148
- protocol = "https" if ssl_cfg.get("enabled", False) else "http"
137
+ # Determine protocol using the new configuration structure
138
+ protocol_cfg = final_config.get("server", {}).get("protocol", "http")
139
+ verify_client_cfg = final_config.get("transport", {}).get("verify_client", False)
140
+ ssl_enabled_final = protocol_cfg in ["https", "mtls"] or verify_client_cfg
141
+ protocol = "https" if ssl_enabled_final else "http"
149
142
 
150
143
  import os
151
144
  docker_host_addr = os.getenv("DOCKER_HOST_ADDR", "172.17.0.1")
@@ -184,19 +177,26 @@ def create_lifespan(config_path: Optional[str] = None):
184
177
  logger.error(f"Failed to recompute registration URL: {e}")
185
178
  server_url = early_server_url
186
179
 
187
- # Attempt proxy registration in background with small delay
188
- async def _delayed_register():
180
+ # Proxy registration is now handled in registry.reload_system()
181
+ # after all commands are loaded, ensuring complete command schema
182
+ logger.info("ℹ️ Proxy registration will be handled after command loading completes")
183
+
184
+ # Add delayed registration task to allow server to fully start
185
+ async def delayed_registration():
186
+ """Delayed registration to ensure server is fully started."""
187
+ await asyncio.sleep(2) # Wait for server to start listening
188
+ logger.info("🔄 Attempting delayed proxy registration after server startup")
189
189
  try:
190
- await asyncio.sleep(0.5)
190
+ from mcp_proxy_adapter.core.proxy_registration import register_with_proxy
191
191
  success = await register_with_proxy(server_url)
192
192
  if success:
193
- logger.info("✅ Proxy registration completed successfully")
193
+ logger.info("✅ Delayed proxy registration successful")
194
194
  else:
195
- logger.info("ℹ️ Proxy registration is disabled or failed")
195
+ logger.warning("⚠️ Delayed proxy registration failed")
196
196
  except Exception as e:
197
- logger.error(f"Proxy registration failed: {e}")
198
-
199
- asyncio.create_task(_delayed_register())
197
+ logger.error(f" Delayed proxy registration error: {e}")
198
+
199
+ asyncio.create_task(delayed_registration())
200
200
 
201
201
  yield # Application is running
202
202
 
@@ -237,16 +237,20 @@ def create_ssl_context(
237
237
  return None
238
238
 
239
239
  # Get certificate paths from configuration
240
- cert_file = current_config.get("ssl", {}).get("cert_file")
241
- key_file = current_config.get("ssl", {}).get("key_file")
240
+ cert_file = current_config.get("transport", {}).get("cert_file")
241
+ key_file = current_config.get("transport", {}).get("key_file")
242
+ ca_cert = current_config.get("transport", {}).get("ca_cert")
242
243
 
243
- # If not found in ssl section, use default paths
244
- if not cert_file:
244
+ # Convert relative paths to absolute paths
245
+ if cert_file and not Path(cert_file).is_absolute():
246
+ project_root = Path(__file__).parent.parent.parent
247
+ cert_file = str(project_root / cert_file)
248
+ if key_file and not Path(key_file).is_absolute():
245
249
  project_root = Path(__file__).parent.parent.parent
246
- cert_file = str(project_root / "certs" / "server.crt")
247
- if not key_file:
250
+ key_file = str(project_root / key_file)
251
+ if ca_cert and not Path(ca_cert).is_absolute():
248
252
  project_root = Path(__file__).parent.parent.parent
249
- key_file = str(project_root / "certs" / "server.key")
253
+ ca_cert = str(project_root / ca_cert)
250
254
 
251
255
  if not cert_file or not key_file:
252
256
  logger.warning("SSL enabled but certificate or key file not specified")
@@ -257,15 +261,15 @@ def create_ssl_context(
257
261
  ssl_context = SSLUtils.create_ssl_context(
258
262
  cert_file=cert_file,
259
263
  key_file=key_file,
260
- ca_cert=ssl_config.get("ca_cert"),
261
- verify_client=ssl_config.get("verify_client", False),
262
- cipher_suites=ssl_config.get("cipher_suites", []),
263
- min_tls_version=ssl_config.get("min_tls_version", "1.2"),
264
- max_tls_version=ssl_config.get("max_tls_version", "1.3"),
264
+ ca_cert=ca_cert,
265
+ verify_client=current_config.get("transport", {}).get("verify_client", False),
266
+ cipher_suites=[],
267
+ min_tls_version="1.2",
268
+ max_tls_version="1.3",
265
269
  )
266
270
 
267
271
  logger.info(
268
- f"SSL context created successfully for mode: {ssl_config.get('mode', 'https_only')}"
272
+ f"SSL context created successfully for mode: https_only"
269
273
  )
270
274
  return ssl_context
271
275
 
@@ -786,23 +786,37 @@ class CommandRegistry:
786
786
  # Initialize proxy registration manager with current config
787
787
  initialize_proxy_registration(config.get_all())
788
788
 
789
- # Get server configuration
789
+ # Get server configuration with proper URL resolution logic
790
790
  server_config = config.get("server", {})
791
791
  server_host = server_config.get("host", "0.0.0.0")
792
792
  server_port = server_config.get("port", 8000)
793
793
 
794
- # Determine server URL based on SSL configuration
795
- ssl_config = config.get("ssl", {})
796
- if ssl_config.get("enabled", False):
797
- protocol = "https"
798
- else:
799
- protocol = "http"
800
-
801
- # Use localhost for external access if host is 0.0.0.0
802
- if server_host == "0.0.0.0":
803
- server_host = "localhost"
804
-
805
- server_url = f"{protocol}://{server_host}:{server_port}"
794
+ # Get registration configuration for public host/port overrides
795
+ # First check server config, then registration config
796
+ public_host = config.get("server.public_host")
797
+ public_port = config.get("server.public_port")
798
+
799
+ # Fallback to registration config if not found in server
800
+ if not public_host or not public_port:
801
+ reg_cfg = config.get("registration", config.get("proxy_registration", {}))
802
+ public_host = public_host or reg_cfg.get("public_host")
803
+ public_port = public_port or reg_cfg.get("public_port")
804
+
805
+ # Determine protocol based on new configuration structure
806
+ protocol = config.get("server.protocol", "http")
807
+ verify_client = config.get("transport.verify_client", False)
808
+ ssl_enabled = protocol in ["https", "mtls"] or verify_client
809
+ protocol = "https" if ssl_enabled else "http"
810
+
811
+ # Resolve host and port (same logic as in app.py)
812
+ import os
813
+ docker_host_addr = os.getenv("DOCKER_HOST_ADDR", "172.17.0.1")
814
+ resolved_host = public_host or (docker_host_addr if server_host == "0.0.0.0" else server_host)
815
+ resolved_port = public_port or server_port
816
+
817
+ server_url = f"{protocol}://{resolved_host}:{resolved_port}"
818
+
819
+ logger.info(f"🔍 Proxy registration URL resolved: {server_url}")
806
820
 
807
821
  # Attempt proxy registration
808
822
  proxy_registration_success = await register_with_proxy(server_url)
@@ -84,7 +84,7 @@ class Config:
84
84
  "transport": {
85
85
  "type": "http",
86
86
  "port": None,
87
- "verify_client": False,
87
+ "verify_client": False,
88
88
  "chk_hostname": False, # Default to False for HTTP
89
89
  },
90
90
  "proxy_registration": {
@@ -13,6 +13,7 @@ email: vasilyvz@gmail.com
13
13
  import asyncio
14
14
  import time
15
15
  import ssl
16
+ import traceback
16
17
  from typing import Dict, Any, Optional, Tuple
17
18
  from pathlib import Path
18
19
  from urllib.parse import urljoin
@@ -248,10 +249,15 @@ class ProxyRegistrationManager:
248
249
  """
249
250
  logger.debug("_create_ssl_context called")
250
251
 
251
- # Check if we're in HTTP mode - if so, don't create SSL context
252
- server_config = self.config.get("server", {})
253
- if server_config.get("protocol", "http").lower() == "http":
254
- logger.debug("HTTP mode detected, skipping SSL context creation")
252
+ # Decide SSL strictly by proxy URL scheme: use SSL only for https proxy URLs
253
+ try:
254
+ from urllib.parse import urlparse as _urlparse
255
+ scheme = _urlparse(self.proxy_url).scheme if self.proxy_url else "http"
256
+ if scheme.lower() != "https":
257
+ logger.debug("Proxy URL is HTTP, skipping SSL context creation for registration")
258
+ return None
259
+ except Exception:
260
+ logger.debug("Failed to parse proxy_url, assuming HTTP and skipping SSL context")
255
261
  return None
256
262
 
257
263
  if not self.client_security:
@@ -440,7 +446,11 @@ class ProxyRegistrationManager:
440
446
 
441
447
  if success:
442
448
  self.registered = True
443
- self.server_key = result.get("server_key")
449
+ # Safely extract server_key from result
450
+ if isinstance(result, dict):
451
+ self.server_key = result.get("server_key")
452
+ else:
453
+ self.server_key = None
444
454
  logger.info(
445
455
  f"✅ Successfully registered with proxy. Server key: {self.server_key}"
446
456
  )
@@ -455,8 +465,65 @@ class ProxyRegistrationManager:
455
465
  else:
456
466
  # Be robust if result is not a dict
457
467
  error_msg = None
468
+ logger.error(f"DEBUG: result type = {type(result)}, result = {result}")
458
469
  if isinstance(result, dict):
459
- error_msg = result.get("error", {}).get("message", "Unknown error")
470
+ logger.error(f"DEBUG: result is dict, getting error field")
471
+ error_field = result.get("error", {})
472
+ logger.error(f"DEBUG: error_field type = {type(error_field)}, error_field = {error_field}")
473
+ if isinstance(error_field, dict):
474
+ error_msg = error_field.get("message", "Unknown error")
475
+ elif isinstance(error_field, str):
476
+ error_msg = error_field
477
+ else:
478
+ error_msg = str(error_field)
479
+
480
+ # Auto-recovery: already registered case → force unregistration then retry once
481
+ error_code = result.get("error_code") or (result.get("error", {}).get("code") if isinstance(result.get("error"), dict) else None)
482
+ already_registered = False
483
+ existing_server_key = None
484
+ # Prefer structured detail if provided
485
+ if isinstance(result.get("details"), dict):
486
+ existing_server_key = result.get("details", {}).get("existing_server_key")
487
+ # Fallback: parse from error message text
488
+ if not existing_server_key and isinstance(error_msg, str) and "already registered as" in error_msg:
489
+ try:
490
+ # Expecting: "... already registered as <server_id>_<copy_number>"
491
+ tail = error_msg.split("already registered as", 1)[1].strip()
492
+ existing_server_key = tail.split()[0]
493
+ except Exception:
494
+ existing_server_key = None
495
+
496
+ if (error_code in ("DUPLICATE_SERVER_URL", "REGISTRATION_ERROR") or already_registered) and existing_server_key:
497
+ try:
498
+ logger.info(f"Attempting auto-unregistration of existing instance: {existing_server_key}")
499
+ # Build unregistration payload using parsed server_key
500
+ try:
501
+ copy_number = int(existing_server_key.split("_")[-1])
502
+ except Exception:
503
+ copy_number = 1
504
+ unregistration_data = {"server_id": self.server_id, "copy_number": copy_number}
505
+ # Reuse secure unregistration request directly
506
+ unreg_success, _unreg_result = await self._make_secure_unregistration_request(unregistration_data)
507
+ if unreg_success:
508
+ logger.info("Auto-unregistration succeeded, retrying registration once...")
509
+ # Retry registration once immediately
510
+ retry_success, retry_result = await self._make_secure_registration_request(registration_data)
511
+ if retry_success:
512
+ self.registered = True
513
+ if isinstance(retry_result, dict):
514
+ self.server_key = retry_result.get("server_key")
515
+ else:
516
+ self.server_key = None
517
+ logger.info(f"✅ Successfully registered after auto-unregistration. Server key: {self.server_key}")
518
+ if self.registration_config.get("heartbeat", {}).get("enabled", True):
519
+ await self._start_heartbeat()
520
+ return True
521
+ else:
522
+ logger.warning(f"Retry registration failed after auto-unregistration: {retry_result}")
523
+ else:
524
+ logger.warning(f"Auto-unregistration failed: {_unreg_result}")
525
+ except Exception as _auto_e:
526
+ logger.warning(f"Auto-unregistration/registration flow error: {_auto_e}")
460
527
  else:
461
528
  error_msg = str(result)
462
529
  logger.warning(
@@ -467,6 +534,7 @@ class ProxyRegistrationManager:
467
534
  logger.error(
468
535
  f"❌ Registration attempt {attempt + 1} failed with exception: {e}"
469
536
  )
537
+ logger.error(f"Full traceback: {traceback.format_exc()}")
470
538
 
471
539
  logger.error(
472
540
  f"❌ Failed to register with proxy after {self.retry_attempts} attempts"
@@ -562,8 +630,10 @@ class ProxyRegistrationManager:
562
630
  ) as response:
563
631
  try:
564
632
  result = await response.json()
565
- except Exception:
633
+ logger.debug(f"Response JSON parsed successfully: {type(result)} - {result}")
634
+ except Exception as e:
566
635
  text_body = await response.text()
636
+ logger.debug(f"JSON parsing failed: {e}, text_body: {text_body}")
567
637
  result = {"success": False, "error": {"code": "NON_JSON_RESPONSE", "message": text_body}}
568
638
 
569
639
  # Validate response headers if security framework available
@@ -604,6 +674,9 @@ class ProxyRegistrationManager:
604
674
  logger.warning(
605
675
  f"Registration failed with HTTP status: {response.status}"
606
676
  )
677
+ # Ensure result is a dict for consistent error handling
678
+ if isinstance(result, str):
679
+ result = {"success": False, "error": {"code": "HTTP_ERROR", "message": result}}
607
680
  return False, result
608
681
  finally:
609
682
  if connector:
@@ -76,7 +76,7 @@ class ConfigBuilder:
76
76
  },
77
77
  "transport": {
78
78
  "type": "http",
79
- "port": None,
79
+ "port": None,
80
80
  "verify_client": False,
81
81
  "chk_hostname": False
82
82
  }
@@ -231,7 +231,7 @@ class ConfigFactory:
231
231
  .set_auth(AuthMethod.TOKEN)
232
232
  .set_server(port=port)
233
233
  .build())
234
-
234
+
235
235
  @staticmethod
236
236
  def create_mtls_token_roles_config(port: int = 8008) -> Dict[str, Any]:
237
237
  """Create mTLS with token and roles configuration."""
mcp_proxy_adapter/main.py CHANGED
@@ -73,11 +73,19 @@ def main():
73
73
  ssl_ca_cert = None
74
74
 
75
75
  if ssl_enabled:
76
- # Configure SSL certificates - use absolute paths
76
+ # Configure SSL certificates from configuration
77
+ ssl_cert_file = config.get("transport.cert_file")
78
+ ssl_key_file = config.get("transport.key_file")
79
+ ssl_ca_cert = config.get("transport.ca_cert")
80
+
81
+ # Convert relative paths to absolute paths
77
82
  project_root = Path(__file__).parent.parent
78
- ssl_cert_file = str(project_root / "certs" / "server_cert.pem")
79
- ssl_key_file = str(project_root / "keys" / "server_key.pem")
80
- ssl_ca_cert = str(project_root / "certs" / "localhost_server.crt")
83
+ if ssl_cert_file and not Path(ssl_cert_file).is_absolute():
84
+ ssl_cert_file = str(project_root / ssl_cert_file)
85
+ if ssl_key_file and not Path(ssl_key_file).is_absolute():
86
+ ssl_key_file = str(project_root / ssl_key_file)
87
+ if ssl_ca_cert and not Path(ssl_ca_cert).is_absolute():
88
+ ssl_ca_cert = str(project_root / ssl_ca_cert)
81
89
 
82
90
  print("🔍 Debug config:")
83
91
  print(f" protocol: {protocol}")
@@ -2,4 +2,4 @@
2
2
  Version information for MCP Proxy Adapter.
3
3
  """
4
4
 
5
- __version__ = "6.6.3"
5
+ __version__ = "6.6.4"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-proxy-adapter
3
- Version: 6.6.3
3
+ Version: 6.6.4
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
@@ -1,12 +1,12 @@
1
1
  mcp_proxy_adapter/__init__.py,sha256=iH0EBBsRj_cfZJpAIsgN_8tTdfefhnl6uUKHjLHhWDQ,1037
2
2
  mcp_proxy_adapter/__main__.py,sha256=sq3tANRuTd18euamt0Bmn1sJeAyzXENZ5VvsMwbrDFA,579
3
- mcp_proxy_adapter/config.py,sha256=sYyqmWGCWSiFy4q0zdlkJKxz2IbNIbjCfEhqxdVvjbI,20157
3
+ mcp_proxy_adapter/config.py,sha256=QpoPaUKcWJ-eu6HYphhIZmkc2M-p1JgpLFAgolf_l5s,20161
4
4
  mcp_proxy_adapter/custom_openapi.py,sha256=XRviX-C-ZkSKdBhORhDTdeN_1FWyEfXZADiASft3t9I,28149
5
- mcp_proxy_adapter/main.py,sha256=E3K2vDnnZ44ODdSWDqAdaIG-55NIyYbcpxNGEQLQlPg,5461
5
+ mcp_proxy_adapter/main.py,sha256=eXIRMLgDgCox9p2WDcOS9D6tiZjcFit8ePbFCfGbs3Q,5849
6
6
  mcp_proxy_adapter/openapi.py,sha256=2UZOI09ZDRJuBYBjKbMyb2U4uASszoCMD5o_4ktRpvg,13480
7
- mcp_proxy_adapter/version.py,sha256=2s9mmkrnxOAjp6hsHf5RXfk463sH55FUntKrzYuyXJY,74
7
+ mcp_proxy_adapter/version.py,sha256=iHKhx47r6lqg0YU6oEtF4CqcNCHws1gitETKpsxxgRs,74
8
8
  mcp_proxy_adapter/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- mcp_proxy_adapter/api/app.py,sha256=chGxUMfWQXqn4wRC7Ar4X9uMF7JxI5EmQNVPEr0TQZI,34573
9
+ mcp_proxy_adapter/api/app.py,sha256=c6QgiKBYC4YlPW-a8ZnsQ05CJqjtGEMfEnbvdp19ylE,35148
10
10
  mcp_proxy_adapter/api/handlers.py,sha256=X-hcMNVeTAu4yVkKJEChEsj2bFptUS6sLNN-Wysjkow,10011
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=RFGZw-0A29P6ZQMZ2qi5wQe3K89hCNOqRTdhtYYDGDg,36498
32
+ mcp_proxy_adapter/commands/command_registry.py,sha256=jsvGu50nwQdBCBAZ4i2Kn88RO0eETYT4WY1wwQlJGNw,37517
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=lXgtrhCiQhy9Y-QpU_RWRg2d0VYy5msoNQPUjPOcOc8,8245
@@ -70,7 +70,7 @@ mcp_proxy_adapter/core/mtls_asgi_app.py,sha256=DT_fTUH1RkvBa3ThbyCyNb-XUHyCb4Dqa
70
70
  mcp_proxy_adapter/core/mtls_server.py,sha256=_hj6QWuExKX2LRohYvjPGFC2qTutS7ObegpEc09QijM,10117
71
71
  mcp_proxy_adapter/core/protocol_manager.py,sha256=iaXWsfm1XSfemz5QQBesMluc4cwf-LtuZVi9bm1uj28,14680
72
72
  mcp_proxy_adapter/core/proxy_client.py,sha256=CB6KBhV3vH2GU5nZ27VZ_xlNbYTAU_tnYFrkuK5He58,6094
73
- mcp_proxy_adapter/core/proxy_registration.py,sha256=m58w9iQd5zwXFIpuaDRXKPQ3fhQDBJPkD4w7m742ciY,35200
73
+ mcp_proxy_adapter/core/proxy_registration.py,sha256=QKjRDbrKRVDcsZl66CRdmr-IoymJjF9cbyp6CLSW090,40504
74
74
  mcp_proxy_adapter/core/role_utils.py,sha256=YwRenGoXI5YrHVbFjKFAH2DJs2miyqhcr9LWF7mxieg,12284
75
75
  mcp_proxy_adapter/core/security_adapter.py,sha256=MAtNthsp7Qj4-oLFzSi7Pr3vWQbWS_uelqa5LGgrXIE,12957
76
76
  mcp_proxy_adapter/core/security_factory.py,sha256=M-1McwUOmuV7Eo-m_P2undtJVNK_KIjDx8o_uRY8rLo,8005
@@ -86,7 +86,7 @@ mcp_proxy_adapter/examples/__init__.py,sha256=k1F-EotAFbJ3JvK_rNgiH4bUztmxIWtYn0
86
86
  mcp_proxy_adapter/examples/bugfix_certificate_config.py,sha256=YGBE_SI6wYZUJLWl7-fP1OWXiSH4mHJAZHApgQWvG7s,10529
87
87
  mcp_proxy_adapter/examples/cert_manager_bugfix.py,sha256=UWUwItjqHqSnOMHocsz40_3deoZE8-vdROLW9y2fEns,7259
88
88
  mcp_proxy_adapter/examples/check_config.py,sha256=oDP3cymq76TqEpPztPihH-_sBktiEb2cG0MdVrY1Sj8,14104
89
- mcp_proxy_adapter/examples/config_builder.py,sha256=eIn_kxoM_Q7oNrqV2lpn4a_jrJrJxfhCfpFHdzibHvs,9648
89
+ mcp_proxy_adapter/examples/config_builder.py,sha256=Bd4Opggi9Nut4yQ5Mo_qETMcWRTls3BwwnNZd33Mvjs,9652
90
90
  mcp_proxy_adapter/examples/config_cli.py,sha256=ZhVG6XEpTFe5-MzELByVsUh0AD4bHPBZeoXnGWbqifs,11059
91
91
  mcp_proxy_adapter/examples/create_test_configs.py,sha256=9TrvLa4-bWLPu0SB1JXwWuCsjj-4Vz3yAdowcHtCSSA,8228
92
92
  mcp_proxy_adapter/examples/debug_request_state.py,sha256=Z3Gy2-fWtu7KIV9OkzGDLVz7TpL_h9V_99ica40uQBU,4489
@@ -130,8 +130,8 @@ mcp_proxy_adapter/schemas/base_schema.json,sha256=v9G9cGMd4dRhCZsOQ_FMqOi5VFyVbI
130
130
  mcp_proxy_adapter/schemas/openapi_schema.json,sha256=C3yLkwmDsvnLW9B5gnKKdBGl4zxkeU-rEmjTrNVsQU0,8405
131
131
  mcp_proxy_adapter/schemas/roles.json,sha256=pgf_ZyqKyXbfGUxvobpiLiSJz9zzxrMuoVWEkEpz3N8,764
132
132
  mcp_proxy_adapter/schemas/roles_schema.json,sha256=deHgI7L6GwfBXacOlNtDgDJelDThppClC3Ti4Eh8rJY,5659
133
- mcp_proxy_adapter-6.6.3.dist-info/METADATA,sha256=lLweBJ6i0eno3-C5RYfQCTuzycn0Q0k0NJSwCxFl0m4,8510
134
- mcp_proxy_adapter-6.6.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
135
- mcp_proxy_adapter-6.6.3.dist-info/entry_points.txt,sha256=Bf-O5Aq80n22Ayu9fI9BgidzWqwzIVaqextAddTuHZw,563
136
- mcp_proxy_adapter-6.6.3.dist-info/top_level.txt,sha256=JZT7vPLBYrtroX-ij68JBhJYbjDdghcV-DFySRy-Nnw,18
137
- mcp_proxy_adapter-6.6.3.dist-info/RECORD,,
133
+ mcp_proxy_adapter-6.6.4.dist-info/METADATA,sha256=EEJhXaGOOOhiN-esLAqkguvXi_XGuyEDexIW1WqXSE0,8510
134
+ mcp_proxy_adapter-6.6.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
135
+ mcp_proxy_adapter-6.6.4.dist-info/entry_points.txt,sha256=Bf-O5Aq80n22Ayu9fI9BgidzWqwzIVaqextAddTuHZw,563
136
+ mcp_proxy_adapter-6.6.4.dist-info/top_level.txt,sha256=JZT7vPLBYrtroX-ij68JBhJYbjDdghcV-DFySRy-Nnw,18
137
+ mcp_proxy_adapter-6.6.4.dist-info/RECORD,,