mcp-proxy-adapter 6.3.27__py3-none-any.whl → 6.3.29__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.
- mcp_proxy_adapter/api/app.py +118 -37
- mcp_proxy_adapter/commands/command_registry.py +24 -1
- mcp_proxy_adapter/core/config_validator.py +172 -234
- mcp_proxy_adapter/core/proxy_client.py +163 -640
- mcp_proxy_adapter/core/proxy_registration.py +143 -41
- mcp_proxy_adapter/main.py +58 -18
- mcp_proxy_adapter/version.py +1 -1
- {mcp_proxy_adapter-6.3.27.dist-info → mcp_proxy_adapter-6.3.29.dist-info}/METADATA +1 -1
- {mcp_proxy_adapter-6.3.27.dist-info → mcp_proxy_adapter-6.3.29.dist-info}/RECORD +12 -12
- {mcp_proxy_adapter-6.3.27.dist-info → mcp_proxy_adapter-6.3.29.dist-info}/WHEEL +0 -0
- {mcp_proxy_adapter-6.3.27.dist-info → mcp_proxy_adapter-6.3.29.dist-info}/entry_points.txt +0 -0
- {mcp_proxy_adapter-6.3.27.dist-info → mcp_proxy_adapter-6.3.29.dist-info}/top_level.txt +0 -0
@@ -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
|
-
|
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
|
-
#
|
211
|
-
|
212
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
573
|
-
|
574
|
-
|
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
|
-
|
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(
|
31
|
-
|
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
|
-
|
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
|
-
|
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(
|
78
|
+
print("🚀 Starting MCP Proxy Adapter")
|
72
79
|
print(f"🌐 Server: {host}:{port}")
|
73
80
|
if ssl_enabled:
|
74
|
-
print(
|
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:
|
@@ -88,20 +95,53 @@ def main():
|
|
88
95
|
config_hypercorn.keyfile = ssl_key_file
|
89
96
|
|
90
97
|
if ssl_ca_cert:
|
91
|
-
config_hypercorn.
|
98
|
+
config_hypercorn.ca_certs = ssl_ca_cert
|
92
99
|
|
93
100
|
if verify_client:
|
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
104
|
else:
|
98
|
-
|
99
|
-
|
100
|
-
|
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)
|
101
140
|
|
102
|
-
|
141
|
+
if ssl_enabled:
|
142
|
+
print("🔐 Starting HTTPS server with hypercorn...")
|
103
143
|
else:
|
104
|
-
print(
|
144
|
+
print("🌐 Starting HTTP server with hypercorn...")
|
105
145
|
|
106
146
|
# Run the server
|
107
147
|
asyncio.run(hypercorn.asyncio.serve(app, config_hypercorn))
|
mcp_proxy_adapter/version.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: mcp-proxy-adapter
|
3
|
-
Version: 6.3.
|
3
|
+
Version: 6.3.29
|
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
|
@@ -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=
|
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
|
7
|
+
mcp_proxy_adapter/version.py,sha256=-ovt_O-oGtB7PGYmXBTw9F3gQ0hY2m0CQXDOLYzG6So,75
|
8
8
|
mcp_proxy_adapter/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
9
|
-
mcp_proxy_adapter/api/app.py,sha256=
|
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=
|
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=
|
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=
|
72
|
-
mcp_proxy_adapter/core/proxy_registration.py,sha256=
|
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.
|
141
|
-
mcp_proxy_adapter-6.3.
|
142
|
-
mcp_proxy_adapter-6.3.
|
143
|
-
mcp_proxy_adapter-6.3.
|
144
|
-
mcp_proxy_adapter-6.3.
|
140
|
+
mcp_proxy_adapter-6.3.29.dist-info/METADATA,sha256=bZZCMwuivX69iTp2icdrC62BOcoi6lurr6v_qnD5WGs,22266
|
141
|
+
mcp_proxy_adapter-6.3.29.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
142
|
+
mcp_proxy_adapter-6.3.29.dist-info/entry_points.txt,sha256=J3eV6ID0lt_VSp4lIdIgBFTqLCThgObNNxRCbyfiMHw,70
|
143
|
+
mcp_proxy_adapter-6.3.29.dist-info/top_level.txt,sha256=CHk-Mc-AxjO-tRheegA2qLiQnU4vZRnxuTF81So6SAc,50
|
144
|
+
mcp_proxy_adapter-6.3.29.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|