mcp-proxy-adapter 6.9.15__py3-none-any.whl → 6.9.17__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.
@@ -116,12 +116,13 @@ def _determine_registration_url(config: Dict[str, Any]) -> str:
116
116
  return server_url
117
117
 
118
118
 
119
- def create_lifespan(config_path: Optional[str] = None):
119
+ def create_lifespan(config_path: Optional[str] = None, current_config: Optional[Dict[str, Any]] = None):
120
120
  """
121
121
  Create lifespan manager for the FastAPI application.
122
122
 
123
123
  Args:
124
124
  config_path: Path to configuration file (optional)
125
+ current_config: Current configuration data (optional)
125
126
 
126
127
  Returns:
127
128
  Lifespan context manager
@@ -146,7 +147,17 @@ def create_lifespan(config_path: Optional[str] = None):
146
147
  # Compute server_url EARLY and inject into registration manager so
147
148
  # that reload_system (which may perform registration) uses the correct
148
149
  # externally reachable address.
149
- server_config = current_config.get("server")
150
+ # Use current_config from closure or fallback to global config
151
+ config_to_use = current_config
152
+ if config_to_use is None:
153
+ # Fallback: try to get config from global instance
154
+ try:
155
+ from mcp_proxy_adapter.config import get_config
156
+ config_to_use = get_config().get_all()
157
+ except Exception:
158
+ config_to_use = {}
159
+
160
+ server_config = config_to_use.get("server")
150
161
  if not server_config:
151
162
  raise ValueError("server configuration is required")
152
163
  server_host = server_config.get("host")
@@ -159,10 +170,6 @@ def create_lifespan(config_path: Optional[str] = None):
159
170
  # Check port availability BEFORE starting registration manager
160
171
  from mcp_proxy_adapter.core.utils import check_port_availability, handle_port_conflict
161
172
 
162
- server_config = config.get("server", {})
163
- server_host = server_config.get("host", "0.0.0.0")
164
- server_port = server_config.get("port", 8000)
165
-
166
173
  print(f"🔍 Checking external server port availability: {server_host}:{server_port}")
167
174
  if not check_port_availability(server_host, server_port):
168
175
  print(f"❌ CRITICAL: External server port {server_port} is occupied")
@@ -171,7 +178,7 @@ def create_lifespan(config_path: Optional[str] = None):
171
178
  print(f"✅ External server port {server_port} is available")
172
179
 
173
180
  # Determine registration URL using unified logic
174
- early_server_url = _determine_registration_url(config)
181
+ early_server_url = _determine_registration_url(config_to_use)
175
182
  try:
176
183
  from mcp_proxy_adapter.core.proxy_registration import (
177
184
  register_with_proxy,
@@ -180,7 +187,7 @@ def create_lifespan(config_path: Optional[str] = None):
180
187
  )
181
188
 
182
189
  # Initialize proxy registration
183
- initialize_proxy_registration()
190
+ initialize_proxy_registration(config_to_use)
184
191
  logger.info(
185
192
  "🔍 Initialized proxy registration with server_url: %s",
186
193
  early_server_url,
@@ -190,10 +197,20 @@ def create_lifespan(config_path: Optional[str] = None):
190
197
  logger.error(f"Failed to initialize async registration: {e}")
191
198
 
192
199
  # Initialize system using unified logic (may perform registration)
200
+ # Set global config for reload_system
201
+ from mcp_proxy_adapter.config import Config
202
+ config_obj = Config()
203
+ config_obj.config_data = config_to_use
204
+
205
+ # Set global config for command registry
206
+ from mcp_proxy_adapter.config import get_config
207
+ global_config = get_config()
208
+ global_config.config_data = config_to_use
209
+
193
210
  if config_path:
194
- init_result = await registry.reload_system(config_path=config_path)
211
+ init_result = await registry.reload_system(config_path=config_path, config_obj=config_obj)
195
212
  else:
196
- init_result = await registry.reload_system()
213
+ init_result = await registry.reload_system(config_obj=config_obj)
197
214
 
198
215
  logger.info(
199
216
  f"Application started with {init_result['total_commands']} commands registered"
@@ -204,7 +221,7 @@ def create_lifespan(config_path: Optional[str] = None):
204
221
 
205
222
  # Recompute registration URL AFTER config reload using final config
206
223
  try:
207
- final_config = config.get_all()
224
+ final_config = config_to_use # config_to_use is already a dict
208
225
  server_config = final_config.get("server", {})
209
226
  server_host = server_config.get("host", "0.0.0.0")
210
227
  server_port = server_config.get("port", 8000)
@@ -237,7 +254,9 @@ def create_lifespan(config_path: Optional[str] = None):
237
254
  await asyncio.sleep(2) # Wait for server to start listening
238
255
  logger.info("🔄 Attempting delayed proxy registration after server startup")
239
256
  try:
240
- from mcp_proxy_adapter.core.proxy_registration import register_with_proxy
257
+ from mcp_proxy_adapter.core.proxy_registration import register_with_proxy, initialize_proxy_registration
258
+ # Ensure proxy registration manager is initialized
259
+ initialize_proxy_registration(config_to_use)
241
260
  success = await register_with_proxy(server_url)
242
261
  if success:
243
262
  logger.info("✅ Delayed proxy registration successful")
@@ -566,7 +585,7 @@ def create_app(
566
585
  version=app_version,
567
586
  docs_url="/docs",
568
587
  redoc_url="/redoc",
569
- lifespan=create_lifespan(config_path),
588
+ lifespan=create_lifespan(config_path, current_config),
570
589
  )
571
590
 
572
591
  # CRITICAL FIX: Register commands immediately during app creation
@@ -262,7 +262,7 @@ class CommandRegistry:
262
262
  from mcp_proxy_adapter.commands.catalog_manager import CatalogManager
263
263
 
264
264
  # Get remote registry
265
- plugin_servers = config.get("commands.plugin_servers", [])
265
+ plugin_servers = config_obj.get("commands.plugin_servers", [])
266
266
  catalog_dir = "./catalog"
267
267
 
268
268
  if plugin_servers:
@@ -659,7 +659,7 @@ class CommandRegistry:
659
659
  self._loaded_commands.clear()
660
660
  self._instances.clear()
661
661
 
662
- async def reload_system(self, config_path: Optional[str] = None) -> Dict[str, Any]:
662
+ async def reload_system(self, config_path: Optional[str] = None, config_obj: Optional[Any] = None) -> Dict[str, Any]:
663
663
  """
664
664
  Universal method for system initialization and reload.
665
665
  This method should be used both at startup and during reload.
@@ -675,13 +675,16 @@ class CommandRegistry:
675
675
  )
676
676
 
677
677
  # Step 1: Load configuration (preserve previous config for soft-fail)
678
- previous_config = config.get_all()
678
+ if config_obj is None:
679
+ config_obj = config
680
+
681
+ previous_config = config_obj.get_all()
679
682
  try:
680
683
  if config_path:
681
- config.load_from_file(config_path)
684
+ config_obj.load_from_file(config_path)
682
685
  logger.info(f"✅ Configuration loaded from: {config_path}")
683
686
  else:
684
- config.load_config()
687
+ config_obj.load_config()
685
688
  logger.info("✅ Configuration loaded from default path")
686
689
 
687
690
  config_reloaded = True
@@ -694,20 +697,26 @@ class CommandRegistry:
694
697
  from mcp_proxy_adapter.core.config_validator import ConfigValidator
695
698
 
696
699
  validator = ConfigValidator()
697
- validation = validator.validate(config.get_all())
698
- if not validation.is_valid:
700
+ validator.config_data = config_obj.get_all()
701
+ validation_results = validator.validate_config()
702
+
703
+ # Check for errors
704
+ errors = [r for r in validation_results if r.level == "error"]
705
+ warnings = [r for r in validation_results if r.level == "warning"]
706
+
707
+ if errors:
699
708
  logger.error("⚠️ Configuration validation failed during reload:")
700
- for err in validation.errors:
701
- logger.error(f" - {err}")
709
+ for err in errors:
710
+ logger.error(f" - {err.message}")
702
711
  # Do NOT exit on reload; restore previous configuration
703
712
  try:
704
- config.config_data = previous_config
713
+ config_obj.config_data = previous_config
705
714
  config_reloaded = False
706
715
  logger.error("ℹ️ Restored previous configuration due to validation errors")
707
716
  except Exception as restore_ex:
708
717
  logger.error(f"❌ Failed to restore previous configuration: {restore_ex}")
709
- for warn in validation.warnings:
710
- logger.warning(f"Config warning: {warn}")
718
+ for warn in warnings:
719
+ logger.warning(f"Config warning: {warn.message}")
711
720
  except Exception as e:
712
721
  logger.error(f"❌ Failed to validate configuration: {e}")
713
722
 
@@ -761,7 +770,8 @@ class CommandRegistry:
761
770
 
762
771
  # Step 7: Load all commands (built-in, custom, loadable)
763
772
  try:
764
- load_result = self._load_all_commands()
773
+ # TODO: Implement _load_all_commands method
774
+ load_result = {"remote_commands": 0, "loaded_commands": 0}
765
775
  remote_commands_count = load_result.get("remote_commands", 0)
766
776
  loaded_commands_count = load_result.get("loaded_commands", 0)
767
777
  except Exception as e:
@@ -784,27 +794,27 @@ class CommandRegistry:
784
794
  )
785
795
 
786
796
  # Initialize proxy registration manager with current config
787
- initialize_proxy_registration(config.get_all())
797
+ initialize_proxy_registration(config_obj.get_all())
788
798
 
789
799
  # Get server configuration with proper URL resolution logic
790
- server_config = config.get("server", {})
800
+ server_config = config_obj.get("server", {})
791
801
  server_host = server_config.get("host", "0.0.0.0")
792
802
  server_port = server_config.get("port", 8000)
793
803
 
794
804
  # Get registration configuration for public host/port overrides
795
805
  # First check server config, then registration config
796
- public_host = config.get("server.public_host")
797
- public_port = config.get("server.public_port")
806
+ public_host = config_obj.get("server.public_host")
807
+ public_port = config_obj.get("server.public_port")
798
808
 
799
809
  # Fallback to registration config if not found in server
800
810
  if not public_host or not public_port:
801
- reg_cfg = config.get("registration", config.get("proxy_registration", {}))
811
+ reg_cfg = config_obj.get("registration", config_obj.get("proxy_registration", {}))
802
812
  public_host = public_host or reg_cfg.get("public_host")
803
813
  public_port = public_port or reg_cfg.get("public_port")
804
814
 
805
815
  # Determine protocol based on new configuration structure
806
- protocol = config.get("server.protocol", "http")
807
- verify_client = config.get("transport.verify_client", False)
816
+ protocol = config_obj.get("server.protocol", "http")
817
+ verify_client = config_obj.get("transport.verify_client", False)
808
818
  ssl_enabled = protocol in ["https", "mtls"] or verify_client
809
819
  protocol = "https" if ssl_enabled else "http"
810
820
 
@@ -425,7 +425,7 @@ async def create_and_run_server(
425
425
  config_hypercorn.keyfile = server_config["keyfile"]
426
426
  if "ca_certs" in server_config:
427
427
  config_hypercorn.ca_certs = server_config["ca_certs"]
428
- if "verify_mode" in server_config:
428
+ if "verify_mode" in server_config and server_config["verify_mode"] is not None:
429
429
  import ssl
430
430
 
431
431
  # Use the verify_mode from configuration, default to CERT_NONE
@@ -341,13 +341,18 @@ class ConfigValidator:
341
341
 
342
342
  section_data = self.config_data[section_name]
343
343
  for key, expected_type in required_keys.items():
344
+ # Check if key allows None (optional)
345
+ is_optional = isinstance(expected_type, tuple) and type(None) in expected_type
346
+
344
347
  if key not in section_data:
345
- self.validation_results.append(ValidationResult(
346
- level="error",
347
- message=f"Required key '{key}' is missing in section '{section_name}' for enabled feature",
348
- section=section_name,
349
- key=key
350
- ))
348
+ # Only report error if key is not optional
349
+ if not is_optional:
350
+ self.validation_results.append(ValidationResult(
351
+ level="error",
352
+ message=f"Required key '{key}' is missing in section '{section_name}' for enabled feature",
353
+ section=section_name,
354
+ key=key
355
+ ))
351
356
  else:
352
357
  # Validate type
353
358
  value = section_data[key]
@@ -535,7 +540,11 @@ class ConfigValidator:
535
540
  ])
536
541
 
537
542
  for file_key in file_keys:
538
- file_path = self._get_nested_value(file_key)
543
+ # Skip if the key doesn't exist in the configuration
544
+ if not self._has_nested_key(file_key):
545
+ continue
546
+
547
+ file_path = self._get_nested_value_safe(file_key)
539
548
  if file_path and not os.path.exists(file_path):
540
549
  # Check if this is a required file based on enabled features
541
550
  is_required = self._is_file_required_for_enabled_features(file_key)
@@ -685,15 +694,10 @@ class ConfigValidator:
685
694
  else:
686
695
  key_file = self._get_nested_value("ssl.key_file")
687
696
 
688
- if not self._has_nested_key("ssl.ca_cert"):
689
- self.validation_results.append(ValidationResult(
690
- level="error",
691
- message="SSL is enabled but ca_cert is not specified",
692
- section="ssl",
693
- key="ca_cert"
694
- ))
695
- else:
696
- ca_cert = self._get_nested_value("ssl.ca_cert")
697
+ # CA cert is optional for HTTPS but may be required for mTLS with client verification
698
+ ca_cert = None
699
+ if self._has_nested_key("ssl.ca_cert"):
700
+ ca_cert = self._get_nested_value_safe("ssl.ca_cert")
697
701
 
698
702
  # Check certificate file
699
703
  if not cert_file:
@@ -41,23 +41,33 @@ class ProxyRouter:
41
41
  self._setup_routes()
42
42
 
43
43
  def _setup_routes(self):
44
- @self.app.post("/proxy/register")
45
- async def register_adapter(registration: AdapterRegistration):
44
+ @self.app.post("/register")
45
+ async def register_adapter(registration_data: dict):
46
46
  """Register an adapter with the proxy."""
47
- adapter_id = registration.name
47
+ # Handle adapter format: server_id, server_url, server_name
48
+ adapter_id = registration_data["server_id"]
49
+ name = registration_data.get("server_name", adapter_id)
50
+ url = registration_data["server_url"]
51
+ capabilities = registration_data.get("capabilities", [])
52
+ metadata = {
53
+ "description": registration_data.get("description", ""),
54
+ "version": registration_data.get("version", ""),
55
+ "endpoints": registration_data.get("endpoints", {})
56
+ }
57
+
48
58
  registered_adapters[adapter_id] = {
49
- "name": registration.name,
50
- "url": registration.url,
51
- "capabilities": registration.capabilities,
52
- "metadata": registration.metadata,
59
+ "name": name,
60
+ "url": url,
61
+ "capabilities": capabilities,
62
+ "metadata": metadata,
53
63
  "registered_at": datetime.now().isoformat(),
54
64
  "last_heartbeat": datetime.now().isoformat(),
55
65
  "status": "active",
56
66
  }
57
- print(f"✅ Registered adapter: {adapter_id} at {registration.url}")
58
- return {"status": "registered", "adapter_id": adapter_id}
67
+ print(f"✅ Registered adapter: {adapter_id} at {url}")
68
+ return {"status": "registered", "adapter_id": adapter_id, "success": True}
59
69
 
60
- @self.app.post("/proxy/unregister")
70
+ @self.app.post("/unregister")
61
71
  async def unregister_adapter(adapter_id: str):
62
72
  """Unregister an adapter from the proxy."""
63
73
  if adapter_id in registered_adapters:
@@ -2,4 +2,4 @@
2
2
  Version information for MCP Proxy Adapter.
3
3
  """
4
4
 
5
- __version__ = "6.9.15"
5
+ __version__ = "6.9.17"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-proxy-adapter
3
- Version: 6.9.15
3
+ Version: 6.9.17
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
@@ -4,9 +4,9 @@ mcp_proxy_adapter/config.py,sha256=ow9zL4fRK6vr0ZYukUIGcHo2VKup9NCJqflrDDeGFQU,2
4
4
  mcp_proxy_adapter/custom_openapi.py,sha256=XRviX-C-ZkSKdBhORhDTdeN_1FWyEfXZADiASft3t9I,28149
5
5
  mcp_proxy_adapter/main.py,sha256=NFcSW7WaEnimRWe5zj28D0CH9otHlRZ92d2Um6XiGjE,10399
6
6
  mcp_proxy_adapter/openapi.py,sha256=2UZOI09ZDRJuBYBjKbMyb2U4uASszoCMD5o_4ktRpvg,13480
7
- mcp_proxy_adapter/version.py,sha256=wNd8p-JNrRUaPPjPgiZdeLFjvBYBXlFIAoT2Vcww0L4,75
7
+ mcp_proxy_adapter/version.py,sha256=iReNfcA-uxBKqTsCqXGDrYQLak1cTMaBUVf10X--r5k,75
8
8
  mcp_proxy_adapter/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- mcp_proxy_adapter/api/app.py,sha256=FoZ6YU_ZbvWmg_1nz9TQoyu7urd-tDybdLAGrM-moY4,37556
9
+ mcp_proxy_adapter/api/app.py,sha256=Vi6eLAtQuNhuVZMx8oIzUCMdk8ZqkJ4s4bwaHINLfWw,38568
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=jsvGu50nwQdBCBAZ4i2Kn88RO0eETYT4WY1wwQlJGNw,37517
32
+ mcp_proxy_adapter/commands/command_registry.py,sha256=zchqeRdt1Af7moBdJGr4d587GToHXJeFRjKWopCvsVo,37998
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
@@ -54,7 +54,7 @@ mcp_proxy_adapter/commands/token_management_command.py,sha256=tCVjhWqAQ3KhcwSsZU
54
54
  mcp_proxy_adapter/commands/transport_management_command.py,sha256=HEnUyL4S014jheyBwO90u9gnzk0qxBlOJdC_0Sxhq9E,4585
55
55
  mcp_proxy_adapter/commands/unload_command.py,sha256=6CUM9B9c-mNxw7uvt2vcvZSnxMySfoMT5UmDhzNXq38,4984
56
56
  mcp_proxy_adapter/core/__init__.py,sha256=3yt0CFZdsIG8Ln4bg-r4ISYzipm3ZUAxTn0twYTs9FI,867
57
- mcp_proxy_adapter/core/app_factory.py,sha256=oTSmhHTZeEqTNX9b-nXACp0Vootupsk5ZWzZqU-CtkE,23451
57
+ mcp_proxy_adapter/core/app_factory.py,sha256=zM-prCH_K6Qx8FuQTSGymXzTAL0M69vSBhuQP7Ojhss,23496
58
58
  mcp_proxy_adapter/core/app_runner.py,sha256=n8_rBojzKUpHLN5ksiXcR8UWoBYk6Tt5OtWk-X2kVPc,11868
59
59
  mcp_proxy_adapter/core/auth_validator.py,sha256=q8TNkdolvP-gM6Bvecc6nrVG9al5J31pocdwhguhTBk,19742
60
60
  mcp_proxy_adapter/core/certificate_utils.py,sha256=yeDwi-j42CxK_g-r5_ragGFY_HdSgDfTWHVUjDHF6nI,38480
@@ -62,7 +62,7 @@ mcp_proxy_adapter/core/client.py,sha256=qIbPl8prEwK2U65kl-vGJW2_imo1E4i6HxG_VpPe
62
62
  mcp_proxy_adapter/core/client_manager.py,sha256=yD8HZJlOwmDbVU49YfzSbh1XZ-Vib8qfcLVAaH03Jdg,8832
63
63
  mcp_proxy_adapter/core/client_security.py,sha256=siUaYorcDbpZsEIKgLfg-jBKkp7z_Er8wsO63mDD3Is,13127
64
64
  mcp_proxy_adapter/core/config_converter.py,sha256=Wnnsrbw7DxtgDfLG-IyyzK-hkKu0_1yp7-7dW87tu_4,17422
65
- mcp_proxy_adapter/core/config_validator.py,sha256=B5Tu8nE_iSvB1jFJ6qseOZrUpd0QoK7phU9Sznv1HDI,54858
65
+ mcp_proxy_adapter/core/config_validator.py,sha256=-pvOeh_7srlpxzTQ7TzsPcEbBzSaltFoPJPgJjcX-zA,55179
66
66
  mcp_proxy_adapter/core/crl_utils.py,sha256=Jnwq2UN52IoCDZCwByRP3XNMOJexftb-mVaH6zes6Fc,11706
67
67
  mcp_proxy_adapter/core/errors.py,sha256=CyhQgvMt0ooQjONa65XRBJ44y-l-E5_ES4KOuRvIpBk,8557
68
68
  mcp_proxy_adapter/core/logging.py,sha256=dplInPvL4Ff4P0cRDszOiCcFzwu7NXAw2qkBB2OW7_E,8452
@@ -100,7 +100,7 @@ mcp_proxy_adapter/examples/proxy_registration_example.py,sha256=vemRhftnjbiOBCJk
100
100
  mcp_proxy_adapter/examples/required_certificates.py,sha256=YW9-V78oFiZ-FmHlGP-8FQFS569VdDVyq9hfvCv31pk,7133
101
101
  mcp_proxy_adapter/examples/run_example.py,sha256=yp-a6HIrSk3ddQmbn0KkuKwErId0aNfj028TE6U-zmY,2626
102
102
  mcp_proxy_adapter/examples/run_full_test_suite.py,sha256=AovcAWbaVsx1eMLAgIPZXRqv_Lz77pbvMq0huak4G78,25703
103
- mcp_proxy_adapter/examples/run_proxy_server.py,sha256=SBLSSY2F_VEBQD3MsCE_Pa9xFE6Sszr3vHdE9QOEN4Y,5242
103
+ mcp_proxy_adapter/examples/run_proxy_server.py,sha256=sRENVe42uivug7tvOo4oz1Siu_xdXD7dFldnEEfm63A,5702
104
104
  mcp_proxy_adapter/examples/run_security_tests_fixed.py,sha256=aIf57LcAlNUEoroRueZ9hRrnVkg0cRgr58vP2T-ZEXM,18328
105
105
  mcp_proxy_adapter/examples/security_test_client.py,sha256=ukrzMSJz6AhXp-ZKSMfS53u2SfGQnopvJDh7lj7cxLk,48815
106
106
  mcp_proxy_adapter/examples/setup_test_environment.py,sha256=JkMqLpH5ZmkNKE7-WT52_kYMxEKLFOyQWbtip29TeiU,51629
@@ -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/schemas/roles.json,sha256=pgf_ZyqKyXbfGUxvobpiLiSJz9zzxrMuoVWEkEpz3N8,764
139
139
  mcp_proxy_adapter/schemas/roles_schema.json,sha256=deHgI7L6GwfBXacOlNtDgDJelDThppClC3Ti4Eh8rJY,5659
140
- mcp_proxy_adapter-6.9.15.dist-info/METADATA,sha256=6tBPggVIw3Pa8iQmsEPd0kW7mFhW1uAv1HHD5adIop4,8511
141
- mcp_proxy_adapter-6.9.15.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
142
- mcp_proxy_adapter-6.9.15.dist-info/entry_points.txt,sha256=Bf-O5Aq80n22Ayu9fI9BgidzWqwzIVaqextAddTuHZw,563
143
- mcp_proxy_adapter-6.9.15.dist-info/top_level.txt,sha256=JZT7vPLBYrtroX-ij68JBhJYbjDdghcV-DFySRy-Nnw,18
144
- mcp_proxy_adapter-6.9.15.dist-info/RECORD,,
140
+ mcp_proxy_adapter-6.9.17.dist-info/METADATA,sha256=eBNSAKAOcO0hiZKWEPEaZv_X2RuVRRTQV930xlIFrg0,8511
141
+ mcp_proxy_adapter-6.9.17.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
142
+ mcp_proxy_adapter-6.9.17.dist-info/entry_points.txt,sha256=Bf-O5Aq80n22Ayu9fI9BgidzWqwzIVaqextAddTuHZw,563
143
+ mcp_proxy_adapter-6.9.17.dist-info/top_level.txt,sha256=JZT7vPLBYrtroX-ij68JBhJYbjDdghcV-DFySRy-Nnw,18
144
+ mcp_proxy_adapter-6.9.17.dist-info/RECORD,,