mcp-proxy-adapter 6.6.0__py3-none-any.whl → 6.6.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. mcp_proxy_adapter/api/app.py +28 -26
  2. mcp_proxy_adapter/config.py +2 -9
  3. mcp_proxy_adapter/core/server_adapter.py +1 -1
  4. mcp_proxy_adapter/examples/check_config.py +415 -0
  5. mcp_proxy_adapter/examples/config_builder.py +11 -17
  6. mcp_proxy_adapter/examples/{generate_certificates_bugfix.py → generate_certificates.py} +11 -0
  7. mcp_proxy_adapter/examples/generate_config.py +343 -0
  8. mcp_proxy_adapter/examples/run_full_test_suite.py +3 -3
  9. mcp_proxy_adapter/examples/security_test_client.py +6 -5
  10. mcp_proxy_adapter/examples/test_chk_hostname_automated.py +211 -0
  11. mcp_proxy_adapter/examples/test_framework_complete.py +269 -0
  12. mcp_proxy_adapter/examples/test_mcp_server.py +188 -0
  13. mcp_proxy_adapter/main.py +11 -18
  14. mcp_proxy_adapter/version.py +1 -1
  15. {mcp_proxy_adapter-6.6.0.dist-info → mcp_proxy_adapter-6.6.3.dist-info}/METADATA +1 -1
  16. {mcp_proxy_adapter-6.6.0.dist-info → mcp_proxy_adapter-6.6.3.dist-info}/RECORD +19 -20
  17. mcp_proxy_adapter/examples/config_builder_simple.py +0 -271
  18. mcp_proxy_adapter/examples/generate_all_certificates.py +0 -487
  19. mcp_proxy_adapter/examples/generate_certificates_cli.py +0 -406
  20. mcp_proxy_adapter/examples/generate_certificates_fixed.py +0 -313
  21. mcp_proxy_adapter/examples/generate_certificates_framework.py +0 -366
  22. mcp_proxy_adapter/examples/generate_certificates_openssl.py +0 -391
  23. {mcp_proxy_adapter-6.6.0.dist-info → mcp_proxy_adapter-6.6.3.dist-info}/WHEEL +0 -0
  24. {mcp_proxy_adapter-6.6.0.dist-info → mcp_proxy_adapter-6.6.3.dist-info}/entry_points.txt +0 -0
  25. {mcp_proxy_adapter-6.6.0.dist-info → mcp_proxy_adapter-6.6.3.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,269 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Complete framework testing with real MCP servers.
4
+
5
+ Author: Vasiliy Zdanovskiy
6
+ email: vasilyvz@gmail.com
7
+ """
8
+
9
+ import asyncio
10
+ import json
11
+ import subprocess
12
+ import time
13
+ import requests
14
+ import ssl
15
+ from pathlib import Path
16
+ from typing import Dict, List, Optional, Tuple
17
+ import logging
18
+
19
+ # Configure logging
20
+ logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
21
+ logger = logging.getLogger(__name__)
22
+
23
+ class FrameworkTester:
24
+ """Complete framework testing with real MCP servers."""
25
+
26
+ def __init__(self):
27
+ self.project_root = Path(__file__).parent.parent.parent
28
+ self.configs_dir = self.project_root / "configs"
29
+ self.examples_dir = Path(__file__).parent
30
+ self.test_results = []
31
+ self.server_processes = []
32
+
33
+ async def test_all_protocols(self):
34
+ """Test all protocols with real MCP server registration."""
35
+ logger.info("🧪 Starting Complete Framework Testing")
36
+ logger.info("=" * 60)
37
+
38
+ # Test configurations
39
+ test_configs = [
40
+ ("http.json", "HTTP", 20000),
41
+ ("https.json", "HTTPS", 20003),
42
+ ("mtls.json", "mTLS", 20006)
43
+ ]
44
+
45
+ for config_file, protocol, port in test_configs:
46
+ logger.info(f"\n🔧 Testing {protocol} (port {port})")
47
+ logger.info("-" * 40)
48
+
49
+ try:
50
+ # Start proxy adapter server
51
+ proxy_process = await self._start_proxy_server(config_file, port)
52
+ if not proxy_process:
53
+ continue
54
+
55
+ # Wait for server to start
56
+ await asyncio.sleep(2)
57
+
58
+ # Test server registration
59
+ await self._test_server_registration(protocol, port)
60
+
61
+ # Test MCP communication
62
+ await self._test_mcp_communication(protocol, port)
63
+
64
+ # Test security features
65
+ await self._test_security_features(protocol, port)
66
+
67
+ # Stop server
68
+ proxy_process.terminate()
69
+ await asyncio.sleep(1)
70
+
71
+ logger.info(f"✅ {protocol} testing completed successfully")
72
+
73
+ except Exception as e:
74
+ logger.error(f"❌ {protocol} testing failed: {e}")
75
+ self.test_results.append({
76
+ "protocol": protocol,
77
+ "status": "failed",
78
+ "error": str(e)
79
+ })
80
+
81
+ # Print summary
82
+ self._print_summary()
83
+
84
+ async def _start_proxy_server(self, config_file: str, port: int) -> Optional[subprocess.Popen]:
85
+ """Start proxy adapter server."""
86
+ config_path = self.configs_dir / config_file
87
+
88
+ if not config_path.exists():
89
+ logger.error(f"❌ Config file not found: {config_path}")
90
+ return None
91
+
92
+ logger.info(f"🚀 Starting proxy server with {config_file}")
93
+
94
+ try:
95
+ # Start server in background
96
+ process = subprocess.Popen([
97
+ "python", str(self.examples_dir / "main.py"),
98
+ "--config", str(config_path)
99
+ ], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
100
+
101
+ self.server_processes.append(process)
102
+ return process
103
+
104
+ except Exception as e:
105
+ logger.error(f"❌ Failed to start server: {e}")
106
+ return None
107
+
108
+ async def _test_server_registration(self, protocol: str, port: int):
109
+ """Test MCP server registration."""
110
+ logger.info(f"📝 Testing server registration for {protocol}")
111
+
112
+ base_url = f"http://localhost:{port}" if protocol == "HTTP" else f"https://localhost:{port}"
113
+
114
+ # Test registration endpoint
115
+ registration_data = {
116
+ "server_id": "test-mcp-server",
117
+ "server_url": "stdio://test-server",
118
+ "server_name": "Test MCP Server",
119
+ "description": "Test server for framework validation"
120
+ }
121
+
122
+ try:
123
+ # Create SSL context for HTTPS/mTLS
124
+ ssl_context = None
125
+ if protocol in ["HTTPS", "mTLS"]:
126
+ ssl_context = ssl.create_default_context()
127
+ ssl_context.check_hostname = False
128
+ ssl_context.verify_mode = ssl.CERT_NONE
129
+
130
+ response = requests.post(
131
+ f"{base_url}/register",
132
+ json=registration_data,
133
+ verify=False,
134
+ timeout=10
135
+ )
136
+
137
+ if response.status_code == 200:
138
+ logger.info("✅ Server registration successful")
139
+ else:
140
+ logger.warning(f"⚠️ Registration returned status {response.status_code}")
141
+
142
+ except Exception as e:
143
+ logger.error(f"❌ Registration failed: {e}")
144
+ raise
145
+
146
+ async def _test_mcp_communication(self, protocol: str, port: int):
147
+ """Test MCP communication through proxy."""
148
+ logger.info(f"🔗 Testing MCP communication for {protocol}")
149
+
150
+ base_url = f"http://localhost:{port}" if protocol == "HTTP" else f"https://localhost:{port}"
151
+
152
+ # Test MCP JSON-RPC call
153
+ mcp_request = {
154
+ "jsonrpc": "2.0",
155
+ "id": 1,
156
+ "method": "tools/list",
157
+ "params": {}
158
+ }
159
+
160
+ try:
161
+ ssl_context = None
162
+ if protocol in ["HTTPS", "mTLS"]:
163
+ ssl_context = ssl.create_default_context()
164
+ ssl_context.check_hostname = False
165
+ ssl_context.verify_mode = ssl.CERT_NONE
166
+
167
+ response = requests.post(
168
+ f"{base_url}/mcp",
169
+ json=mcp_request,
170
+ headers={"Content-Type": "application/json"},
171
+ verify=False,
172
+ timeout=10
173
+ )
174
+
175
+ if response.status_code == 200:
176
+ result = response.json()
177
+ if "result" in result:
178
+ logger.info("✅ MCP communication successful")
179
+ else:
180
+ logger.warning(f"⚠️ MCP response: {result}")
181
+ else:
182
+ logger.warning(f"⚠️ MCP call returned status {response.status_code}")
183
+
184
+ except Exception as e:
185
+ logger.error(f"❌ MCP communication failed: {e}")
186
+ raise
187
+
188
+ async def _test_security_features(self, protocol: str, port: int):
189
+ """Test security features."""
190
+ logger.info(f"🔒 Testing security features for {protocol}")
191
+
192
+ base_url = f"http://localhost:{port}" if protocol == "HTTP" else f"https://localhost:{port}"
193
+
194
+ # Test without authentication
195
+ try:
196
+ ssl_context = None
197
+ if protocol in ["HTTPS", "mTLS"]:
198
+ ssl_context = ssl.create_default_context()
199
+ ssl_context.check_hostname = False
200
+ ssl_context.verify_mode = ssl.CERT_NONE
201
+
202
+ response = requests.get(
203
+ f"{base_url}/health",
204
+ verify=False,
205
+ timeout=10
206
+ )
207
+
208
+ if response.status_code == 200:
209
+ logger.info("✅ Health check successful")
210
+ else:
211
+ logger.warning(f"⚠️ Health check returned status {response.status_code}")
212
+
213
+ except Exception as e:
214
+ logger.error(f"❌ Security test failed: {e}")
215
+ raise
216
+
217
+ def _print_summary(self):
218
+ """Print test summary."""
219
+ logger.info("\n" + "=" * 60)
220
+ logger.info("📊 FRAMEWORK TESTING SUMMARY")
221
+ logger.info("=" * 60)
222
+
223
+ total_tests = len(self.test_results)
224
+ successful_tests = len([r for r in self.test_results if r["status"] == "success"])
225
+
226
+ logger.info(f"Total tests: {total_tests}")
227
+ logger.info(f"Successful: {successful_tests}")
228
+ logger.info(f"Failed: {total_tests - successful_tests}")
229
+
230
+ if total_tests > 0:
231
+ success_rate = (successful_tests / total_tests) * 100
232
+ logger.info(f"Success rate: {success_rate:.1f}%")
233
+
234
+ if success_rate == 100:
235
+ logger.info("🎉 All tests passed! Framework is working correctly.")
236
+ elif success_rate >= 80:
237
+ logger.info("✅ Most tests passed. Framework is mostly functional.")
238
+ else:
239
+ logger.info("⚠️ Many tests failed. Framework needs attention.")
240
+
241
+ logger.info("=" * 60)
242
+
243
+ async def cleanup(self):
244
+ """Cleanup server processes."""
245
+ logger.info("🧹 Cleaning up server processes...")
246
+
247
+ for process in self.server_processes:
248
+ try:
249
+ if process.poll() is None: # Process is still running
250
+ process.terminate()
251
+ process.wait(timeout=5)
252
+ except subprocess.TimeoutExpired:
253
+ process.kill()
254
+ except Exception as e:
255
+ logger.warning(f"Warning: Failed to cleanup process: {e}")
256
+
257
+ self.server_processes.clear()
258
+
259
+ async def main():
260
+ """Main testing function."""
261
+ tester = FrameworkTester()
262
+
263
+ try:
264
+ await tester.test_all_protocols()
265
+ finally:
266
+ await tester.cleanup()
267
+
268
+ if __name__ == "__main__":
269
+ asyncio.run(main())
@@ -0,0 +1,188 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Test MCP Server for framework validation.
4
+
5
+ Author: Vasiliy Zdanovskiy
6
+ email: vasilyvz@gmail.com
7
+ """
8
+
9
+ import asyncio
10
+ import json
11
+ import logging
12
+ from typing import Any, Dict, List, Optional
13
+ from mcp import types
14
+ from mcp.server import Server
15
+ from mcp.server.stdio import stdio_server
16
+
17
+ # Configure logging
18
+ logging.basicConfig(level=logging.INFO)
19
+ logger = logging.getLogger(__name__)
20
+
21
+ class TestMCPServer:
22
+ """Test MCP Server for framework validation."""
23
+
24
+ def __init__(self):
25
+ self.server = Server("test-mcp-server")
26
+ self._setup_handlers()
27
+
28
+ def _setup_handlers(self):
29
+ """Setup MCP server handlers."""
30
+
31
+ @self.server.list_tools()
32
+ async def list_tools() -> List[types.Tool]:
33
+ """List available tools."""
34
+ return [
35
+ types.Tool(
36
+ name="echo",
37
+ description="Echo back the input message",
38
+ inputSchema={
39
+ "type": "object",
40
+ "properties": {
41
+ "message": {
42
+ "type": "string",
43
+ "description": "Message to echo back"
44
+ }
45
+ },
46
+ "required": ["message"]
47
+ }
48
+ ),
49
+ types.Tool(
50
+ name="add",
51
+ description="Add two numbers",
52
+ inputSchema={
53
+ "type": "object",
54
+ "properties": {
55
+ "a": {
56
+ "type": "number",
57
+ "description": "First number"
58
+ },
59
+ "b": {
60
+ "type": "number",
61
+ "description": "Second number"
62
+ }
63
+ },
64
+ "required": ["a", "b"]
65
+ }
66
+ ),
67
+ types.Tool(
68
+ name="get_info",
69
+ description="Get server information",
70
+ inputSchema={
71
+ "type": "object",
72
+ "properties": {}
73
+ }
74
+ )
75
+ ]
76
+
77
+ @self.server.call_tool()
78
+ async def call_tool(name: str, arguments: Dict[str, Any]) -> List[types.TextContent]:
79
+ """Handle tool calls."""
80
+ logger.info(f"Tool called: {name} with args: {arguments}")
81
+
82
+ if name == "echo":
83
+ message = arguments.get("message", "")
84
+ return [types.TextContent(type="text", text=f"Echo: {message}")]
85
+
86
+ elif name == "add":
87
+ a = arguments.get("a", 0)
88
+ b = arguments.get("b", 0)
89
+ result = a + b
90
+ return [types.TextContent(type="text", text=f"Result: {a} + {b} = {result}")]
91
+
92
+ elif name == "get_info":
93
+ info = {
94
+ "server_name": "test-mcp-server",
95
+ "version": "1.0.0",
96
+ "status": "running",
97
+ "tools_count": 3
98
+ }
99
+ return [types.TextContent(type="text", text=json.dumps(info, indent=2))]
100
+
101
+ else:
102
+ return [types.TextContent(type="text", text=f"Unknown tool: {name}")]
103
+
104
+ @self.server.list_resources()
105
+ async def list_resources() -> List[types.Resource]:
106
+ """List available resources."""
107
+ return [
108
+ types.Resource(
109
+ uri="test://config",
110
+ name="Server Configuration",
111
+ description="Current server configuration",
112
+ mimeType="application/json"
113
+ ),
114
+ types.Resource(
115
+ uri="test://status",
116
+ name="Server Status",
117
+ description="Current server status",
118
+ mimeType="application/json"
119
+ )
120
+ ]
121
+
122
+ @self.server.read_resource()
123
+ async def read_resource(uri: str) -> str:
124
+ """Read resource content."""
125
+ if uri == "test://config":
126
+ config = {
127
+ "server_name": "test-mcp-server",
128
+ "port": 3001,
129
+ "protocol": "stdio",
130
+ "features": ["tools", "resources"]
131
+ }
132
+ return json.dumps(config, indent=2)
133
+
134
+ elif uri == "test://status":
135
+ status = {
136
+ "status": "running",
137
+ "uptime": "0s",
138
+ "requests_handled": 0,
139
+ "last_request": None
140
+ }
141
+ return json.dumps(status, indent=2)
142
+
143
+ else:
144
+ raise ValueError(f"Unknown resource: {uri}")
145
+
146
+ @self.server.list_prompts()
147
+ async def list_prompts() -> List[types.Prompt]:
148
+ """List available prompts."""
149
+ return [
150
+ types.Prompt(
151
+ name="greeting",
152
+ description="Generate a greeting message",
153
+ arguments=[
154
+ types.PromptArgument(
155
+ name="name",
156
+ description="Name to greet",
157
+ required=True
158
+ )
159
+ ]
160
+ )
161
+ ]
162
+
163
+ @self.server.get_prompt()
164
+ async def get_prompt(name: str, arguments: Dict[str, str]) -> List[types.TextContent]:
165
+ """Get prompt content."""
166
+ if name == "greeting":
167
+ user_name = arguments.get("name", "User")
168
+ greeting = f"Hello, {user_name}! Welcome to the test MCP server."
169
+ return [types.TextContent(type="text", text=greeting)]
170
+
171
+ else:
172
+ raise ValueError(f"Unknown prompt: {name}")
173
+
174
+ async def main():
175
+ """Main server function."""
176
+ logger.info("Starting Test MCP Server...")
177
+
178
+ server_instance = TestMCPServer()
179
+
180
+ async with stdio_server() as (read_stream, write_stream):
181
+ await server_instance.server.run(
182
+ read_stream,
183
+ write_stream,
184
+ server_instance.server.create_initialization_options()
185
+ )
186
+
187
+ if __name__ == "__main__":
188
+ asyncio.run(main())
mcp_proxy_adapter/main.py CHANGED
@@ -61,30 +61,23 @@ def main():
61
61
 
62
62
  # Get protocol and SSL configuration
63
63
  protocol = config.get("server.protocol", "http")
64
- ssl_enabled = protocol in ["https", "mtls"]
64
+ verify_client = config.get("transport.verify_client", False)
65
+ chk_hostname = config.get("transport.chk_hostname", False)
66
+
67
+ # SSL enabled if protocol is HTTPS or mTLS (verify_client=True)
68
+ ssl_enabled = protocol in ["https", "mtls"] or verify_client
65
69
 
66
70
  # SSL configuration based on protocol
67
71
  ssl_cert_file = None
68
72
  ssl_key_file = None
69
73
  ssl_ca_cert = None
70
- verify_client = False
71
74
 
72
75
  if ssl_enabled:
73
- # Configure SSL based on protocol
74
- if protocol == "https":
75
- # HTTPS - server SSL only
76
- ssl_cert_file = "../../certs/server.crt"
77
- ssl_key_file = "../../certs/server.key"
78
- ssl_ca_cert = "../../certs/localhost_server.crt"
79
- verify_client = False
80
-
81
- elif protocol == "mtls":
82
- # mTLS - server SSL + client certificate verification
83
- # Use server.crt and server.key for server, and localhost_server.crt as CA
84
- ssl_cert_file = "../../certs/server.crt"
85
- ssl_key_file = "../../certs/server.key"
86
- ssl_ca_cert = "../../certs/localhost_server.crt"
87
- verify_client = False # Disable client cert verification for testing
76
+ # Configure SSL certificates - use absolute paths
77
+ 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")
88
81
 
89
82
  print("🔍 Debug config:")
90
83
  print(f" protocol: {protocol}")
@@ -116,7 +109,7 @@ def main():
116
109
  "key_file": ssl_key_file,
117
110
  "ca_cert": ssl_ca_cert,
118
111
  "verify_client": verify_client,
119
- "chk_hostname": config.get("transport.ssl.chk_hostname", True)
112
+ "chk_hostname": chk_hostname
120
113
  }
121
114
 
122
115
  hypercorn_ssl = ServerConfigAdapter.convert_ssl_config_for_engine(ssl_config, "hypercorn")
@@ -2,4 +2,4 @@
2
2
  Version information for MCP Proxy Adapter.
3
3
  """
4
4
 
5
- __version__ = "6.6.0"
5
+ __version__ = "6.6.3"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-proxy-adapter
3
- Version: 6.6.0
3
+ Version: 6.6.3
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=NmwYJPfnAFWmGsOlyYkMDfuqA-SeduuvTSjZKJbzbKc,20424
3
+ mcp_proxy_adapter/config.py,sha256=sYyqmWGCWSiFy4q0zdlkJKxz2IbNIbjCfEhqxdVvjbI,20157
4
4
  mcp_proxy_adapter/custom_openapi.py,sha256=XRviX-C-ZkSKdBhORhDTdeN_1FWyEfXZADiASft3t9I,28149
5
- mcp_proxy_adapter/main.py,sha256=I9fYgMD8_RNYuSHn-paeTSr9coAuVlEkfLaWeYbZors,5724
5
+ mcp_proxy_adapter/main.py,sha256=E3K2vDnnZ44ODdSWDqAdaIG-55NIyYbcpxNGEQLQlPg,5461
6
6
  mcp_proxy_adapter/openapi.py,sha256=2UZOI09ZDRJuBYBjKbMyb2U4uASszoCMD5o_4ktRpvg,13480
7
- mcp_proxy_adapter/version.py,sha256=3wn4ixEY89A5pJaACrT6Pg-UKLFQTHKOi6F0jL-TyDo,74
7
+ mcp_proxy_adapter/version.py,sha256=2s9mmkrnxOAjp6hsHf5RXfk463sH55FUntKrzYuyXJY,74
8
8
  mcp_proxy_adapter/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- mcp_proxy_adapter/api/app.py,sha256=cxjavhNTtaYg2ea-UeHSDnKh8edKVNQ2NbXUDYbufFU,34183
9
+ mcp_proxy_adapter/api/app.py,sha256=chGxUMfWQXqn4wRC7Ar4X9uMF7JxI5EmQNVPEr0TQZI,34573
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
@@ -75,7 +75,7 @@ mcp_proxy_adapter/core/role_utils.py,sha256=YwRenGoXI5YrHVbFjKFAH2DJs2miyqhcr9LW
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
77
77
  mcp_proxy_adapter/core/security_integration.py,sha256=-5I4i9so_yMjc-zuGO-7zzIsMXemLvrch1q8WFVbIfg,14167
78
- mcp_proxy_adapter/core/server_adapter.py,sha256=-Tta9BzFCNO2TtdNmA8rd6ubzSGKiIoICpit_fczg1c,9748
78
+ mcp_proxy_adapter/core/server_adapter.py,sha256=jz8ztIfe82N5DE3XHRYpD6CwNcJy7ksh0l8l-towHBE,9755
79
79
  mcp_proxy_adapter/core/server_engine.py,sha256=qmxdkBv-YsQsvxVVQ-_xiAyDshxtnrKBquPJoUjo2fw,9471
80
80
  mcp_proxy_adapter/core/settings.py,sha256=D6cF4R_5gJ0XFGxzXUIzeqe-_muu6HL561TAei9wwZ0,10521
81
81
  mcp_proxy_adapter/core/ssl_utils.py,sha256=Rjl79d5LdhDzxiMtaIRd9OFh0hTeRANItYFXk-7c5pA,9498
@@ -85,31 +85,30 @@ mcp_proxy_adapter/core/utils.py,sha256=wBdDYBDWQ6zbwrnl9tykHjo0FjJVsLT_x8Bjk1lZX
85
85
  mcp_proxy_adapter/examples/__init__.py,sha256=k1F-EotAFbJ3JvK_rNgiH4bUztmxIWtYn0AfbAZ1ZGs,450
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
- mcp_proxy_adapter/examples/config_builder.py,sha256=kd3-donlGuDgZwJYsy_rjzrydBg_A1GaaJuJ8jj4VDc,9696
89
- mcp_proxy_adapter/examples/config_builder_simple.py,sha256=qTG3tIIu8eUW8gb06snaWHOTp0BFRRim38VqKrP2Ezo,9109
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
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
93
93
  mcp_proxy_adapter/examples/debug_role_chain.py,sha256=GLVXC2fJUwP8UJnXHchd1t-H53cjWLJI3RqTPrKmaak,8750
94
94
  mcp_proxy_adapter/examples/demo_client.py,sha256=en2Rtb70B1sQmhL-vdQ4PDpKNNl_mfll2YCFT_jFCAg,10191
95
- mcp_proxy_adapter/examples/generate_all_certificates.py,sha256=lLP5RKmJwpSyprvrxQXFt_xcN4aiUzlIxk5WVdXx2Fk,19024
96
- mcp_proxy_adapter/examples/generate_certificates_bugfix.py,sha256=LskoIezj67PZqqrB8WgCO9bFPqPLRuNwUAt8I3bDT4o,15768
97
- mcp_proxy_adapter/examples/generate_certificates_cli.py,sha256=jb5bdNhoODL6qTWBdx4bNR9BVKo_lbzfWK91u5XuWXA,16986
98
- mcp_proxy_adapter/examples/generate_certificates_fixed.py,sha256=6zJj9xdEuwj-ZO2clMoB7pNj5hW4IgwK-qsLPzuq8VQ,12566
99
- mcp_proxy_adapter/examples/generate_certificates_framework.py,sha256=TGLyy4AJNI0w-Dd2FUQyX2sOXt05o_q4zkjoapzG1Wc,15017
100
- mcp_proxy_adapter/examples/generate_certificates_openssl.py,sha256=5V4B8Ys_-FZsDh-CH7BNf1XXkMtpidkm4iecY0XCFuE,16891
95
+ mcp_proxy_adapter/examples/generate_certificates.py,sha256=cIfTHBziGiOTy9vldAmaULD6bXBpl2a5KfB8MLIRSww,16391
96
+ mcp_proxy_adapter/examples/generate_config.py,sha256=hkjfCY7OdgMcqAJZH6I3JSKWI1VB64IEyT7RaokTb48,11461
101
97
  mcp_proxy_adapter/examples/proxy_registration_example.py,sha256=vemRhftnjbiOBCJkmtDGqlWQ8syTG0a8755GCOnaQsg,12503
102
98
  mcp_proxy_adapter/examples/required_certificates.py,sha256=YW9-V78oFiZ-FmHlGP-8FQFS569VdDVyq9hfvCv31pk,7133
103
99
  mcp_proxy_adapter/examples/run_example.py,sha256=yp-a6HIrSk3ddQmbn0KkuKwErId0aNfj028TE6U-zmY,2626
104
- mcp_proxy_adapter/examples/run_full_test_suite.py,sha256=Zd7SINqi4UdiwDWaZrerh4e35XTqAUVApulEYtZx39M,25613
100
+ mcp_proxy_adapter/examples/run_full_test_suite.py,sha256=AovcAWbaVsx1eMLAgIPZXRqv_Lz77pbvMq0huak4G78,25703
105
101
  mcp_proxy_adapter/examples/run_proxy_server.py,sha256=SBLSSY2F_VEBQD3MsCE_Pa9xFE6Sszr3vHdE9QOEN4Y,5242
106
102
  mcp_proxy_adapter/examples/run_security_tests_fixed.py,sha256=aIf57LcAlNUEoroRueZ9hRrnVkg0cRgr58vP2T-ZEXM,18328
107
- mcp_proxy_adapter/examples/security_test_client.py,sha256=HL0AhmmHZ9SHlUx6aJ32jTHJonjKmGil74ifLbsGkZA,48660
103
+ mcp_proxy_adapter/examples/security_test_client.py,sha256=ukrzMSJz6AhXp-ZKSMfS53u2SfGQnopvJDh7lj7cxLk,48815
108
104
  mcp_proxy_adapter/examples/setup_test_environment.py,sha256=JkMqLpH5ZmkNKE7-WT52_kYMxEKLFOyQWbtip29TeiU,51629
109
105
  mcp_proxy_adapter/examples/simple_protocol_test.py,sha256=BzFUZvK9Fih3aG4IFLQTZPyPe_s6YjpZfB6uZmQ76rw,3969
106
+ mcp_proxy_adapter/examples/test_chk_hostname_automated.py,sha256=nN0FEevzP6UP3q40zq4lw_GiT050FYomu7rWFPOMF2U,7002
110
107
  mcp_proxy_adapter/examples/test_config.py,sha256=ekEoUZe9q484vU_0IxOVhQdNMVJXG3IpmQpP--VmuDI,6491
111
108
  mcp_proxy_adapter/examples/test_config_builder.py,sha256=SAcWIC54vzO0mrb1L9xZKK2IhNkZuSx7_cMEkC1Lm60,21607
112
109
  mcp_proxy_adapter/examples/test_examples.py,sha256=CYlVatdHUVC_rwv4NsvxFG3GXiKIyxPDUH43BOJHjrU,12330
110
+ mcp_proxy_adapter/examples/test_framework_complete.py,sha256=9EvJL9hgjYddzGTavjp7M7xlcO8SJvDvbobOHDxRHs8,9622
111
+ mcp_proxy_adapter/examples/test_mcp_server.py,sha256=K4wol6H7gfviYuc8ygH4vhzc8mWsf-0xHyG6OJNaecU,6585
113
112
  mcp_proxy_adapter/examples/test_protocol_examples.py,sha256=yCZzZrJ9ICXMkF1bAMozpin2QeTMI653bggPAZTRAUE,12138
114
113
  mcp_proxy_adapter/examples/universal_client.py,sha256=n1-cBPOiCipA86Zcc_mI_jMywDMZS1p3u5JT3AqTsrQ,27577
115
114
  mcp_proxy_adapter/examples/update_config_certificates.py,sha256=ObGF5oNQ9OStryUvFDXxrN-olRMKdSOrl5KSwARF7EY,4608
@@ -131,8 +130,8 @@ mcp_proxy_adapter/schemas/base_schema.json,sha256=v9G9cGMd4dRhCZsOQ_FMqOi5VFyVbI
131
130
  mcp_proxy_adapter/schemas/openapi_schema.json,sha256=C3yLkwmDsvnLW9B5gnKKdBGl4zxkeU-rEmjTrNVsQU0,8405
132
131
  mcp_proxy_adapter/schemas/roles.json,sha256=pgf_ZyqKyXbfGUxvobpiLiSJz9zzxrMuoVWEkEpz3N8,764
133
132
  mcp_proxy_adapter/schemas/roles_schema.json,sha256=deHgI7L6GwfBXacOlNtDgDJelDThppClC3Ti4Eh8rJY,5659
134
- mcp_proxy_adapter-6.6.0.dist-info/METADATA,sha256=WSvtaCv_mkqE20kqYWmmJSt_UkCUqmKi4w7vVSLweeo,8510
135
- mcp_proxy_adapter-6.6.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
136
- mcp_proxy_adapter-6.6.0.dist-info/entry_points.txt,sha256=Bf-O5Aq80n22Ayu9fI9BgidzWqwzIVaqextAddTuHZw,563
137
- mcp_proxy_adapter-6.6.0.dist-info/top_level.txt,sha256=JZT7vPLBYrtroX-ij68JBhJYbjDdghcV-DFySRy-Nnw,18
138
- mcp_proxy_adapter-6.6.0.dist-info/RECORD,,
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,,