mcp-proxy-adapter 6.6.1__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.
- mcp_proxy_adapter/api/app.py +61 -55
- mcp_proxy_adapter/commands/command_registry.py +27 -13
- mcp_proxy_adapter/config.py +1 -8
- mcp_proxy_adapter/core/proxy_registration.py +80 -7
- mcp_proxy_adapter/core/server_adapter.py +1 -1
- mcp_proxy_adapter/examples/check_config.py +1 -1
- mcp_proxy_adapter/examples/config_builder.py +13 -19
- mcp_proxy_adapter/examples/{generate_certificates_bugfix.py → generate_certificates.py} +11 -0
- mcp_proxy_adapter/examples/generate_config.py +3 -3
- mcp_proxy_adapter/examples/run_full_test_suite.py +3 -3
- mcp_proxy_adapter/examples/security_test_client.py +6 -5
- mcp_proxy_adapter/examples/test_chk_hostname_automated.py +7 -10
- mcp_proxy_adapter/examples/test_framework_complete.py +269 -0
- mcp_proxy_adapter/examples/test_mcp_server.py +188 -0
- mcp_proxy_adapter/main.py +19 -18
- mcp_proxy_adapter/version.py +1 -1
- {mcp_proxy_adapter-6.6.1.dist-info → mcp_proxy_adapter-6.6.4.dist-info}/METADATA +1 -1
- {mcp_proxy_adapter-6.6.1.dist-info → mcp_proxy_adapter-6.6.4.dist-info}/RECORD +21 -25
- mcp_proxy_adapter/examples/config_builder_simple.py +0 -271
- mcp_proxy_adapter/examples/generate_all_certificates.py +0 -487
- mcp_proxy_adapter/examples/generate_certificates_cli.py +0 -406
- mcp_proxy_adapter/examples/generate_certificates_fixed.py +0 -313
- mcp_proxy_adapter/examples/generate_certificates_framework.py +0 -366
- mcp_proxy_adapter/examples/generate_certificates_openssl.py +0 -391
- {mcp_proxy_adapter-6.6.1.dist-info → mcp_proxy_adapter-6.6.4.dist-info}/WHEEL +0 -0
- {mcp_proxy_adapter-6.6.1.dist-info → mcp_proxy_adapter-6.6.4.dist-info}/entry_points.txt +0 -0
- {mcp_proxy_adapter-6.6.1.dist-info → mcp_proxy_adapter-6.6.4.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,31 @@ def main():
|
|
61
61
|
|
62
62
|
# Get protocol and SSL configuration
|
63
63
|
protocol = config.get("server.protocol", "http")
|
64
|
-
|
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
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
ssl_ca_cert = "../../certs/localhost_server.crt"
|
87
|
-
verify_client = False # Disable client cert verification for testing
|
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
|
82
|
+
project_root = Path(__file__).parent.parent
|
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)
|
88
89
|
|
89
90
|
print("🔍 Debug config:")
|
90
91
|
print(f" protocol: {protocol}")
|
@@ -116,7 +117,7 @@ def main():
|
|
116
117
|
"key_file": ssl_key_file,
|
117
118
|
"ca_cert": ssl_ca_cert,
|
118
119
|
"verify_client": verify_client,
|
119
|
-
"chk_hostname":
|
120
|
+
"chk_hostname": chk_hostname
|
120
121
|
}
|
121
122
|
|
122
123
|
hypercorn_ssl = ServerConfigAdapter.convert_ssl_config_for_engine(ssl_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.6.
|
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=
|
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=
|
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=
|
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=
|
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=
|
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,12 +70,12 @@ 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=
|
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
|
77
77
|
mcp_proxy_adapter/core/security_integration.py,sha256=-5I4i9so_yMjc-zuGO-7zzIsMXemLvrch1q8WFVbIfg,14167
|
78
|
-
mcp_proxy_adapter/core/server_adapter.py,sha256
|
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,34 +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/check_config.py,sha256=
|
89
|
-
mcp_proxy_adapter/examples/config_builder.py,sha256=
|
90
|
-
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=Bd4Opggi9Nut4yQ5Mo_qETMcWRTls3BwwnNZd33Mvjs,9652
|
91
90
|
mcp_proxy_adapter/examples/config_cli.py,sha256=ZhVG6XEpTFe5-MzELByVsUh0AD4bHPBZeoXnGWbqifs,11059
|
92
91
|
mcp_proxy_adapter/examples/create_test_configs.py,sha256=9TrvLa4-bWLPu0SB1JXwWuCsjj-4Vz3yAdowcHtCSSA,8228
|
93
92
|
mcp_proxy_adapter/examples/debug_request_state.py,sha256=Z3Gy2-fWtu7KIV9OkzGDLVz7TpL_h9V_99ica40uQBU,4489
|
94
93
|
mcp_proxy_adapter/examples/debug_role_chain.py,sha256=GLVXC2fJUwP8UJnXHchd1t-H53cjWLJI3RqTPrKmaak,8750
|
95
94
|
mcp_proxy_adapter/examples/demo_client.py,sha256=en2Rtb70B1sQmhL-vdQ4PDpKNNl_mfll2YCFT_jFCAg,10191
|
96
|
-
mcp_proxy_adapter/examples/
|
97
|
-
mcp_proxy_adapter/examples/
|
98
|
-
mcp_proxy_adapter/examples/generate_certificates_cli.py,sha256=jb5bdNhoODL6qTWBdx4bNR9BVKo_lbzfWK91u5XuWXA,16986
|
99
|
-
mcp_proxy_adapter/examples/generate_certificates_fixed.py,sha256=6zJj9xdEuwj-ZO2clMoB7pNj5hW4IgwK-qsLPzuq8VQ,12566
|
100
|
-
mcp_proxy_adapter/examples/generate_certificates_framework.py,sha256=TGLyy4AJNI0w-Dd2FUQyX2sOXt05o_q4zkjoapzG1Wc,15017
|
101
|
-
mcp_proxy_adapter/examples/generate_certificates_openssl.py,sha256=5V4B8Ys_-FZsDh-CH7BNf1XXkMtpidkm4iecY0XCFuE,16891
|
102
|
-
mcp_proxy_adapter/examples/generate_config.py,sha256=4WcyCMuQKqr5qtGekoqy-jrQ-71F-ZYdDYftwLrjJNg,11461
|
95
|
+
mcp_proxy_adapter/examples/generate_certificates.py,sha256=cIfTHBziGiOTy9vldAmaULD6bXBpl2a5KfB8MLIRSww,16391
|
96
|
+
mcp_proxy_adapter/examples/generate_config.py,sha256=hkjfCY7OdgMcqAJZH6I3JSKWI1VB64IEyT7RaokTb48,11461
|
103
97
|
mcp_proxy_adapter/examples/proxy_registration_example.py,sha256=vemRhftnjbiOBCJkmtDGqlWQ8syTG0a8755GCOnaQsg,12503
|
104
98
|
mcp_proxy_adapter/examples/required_certificates.py,sha256=YW9-V78oFiZ-FmHlGP-8FQFS569VdDVyq9hfvCv31pk,7133
|
105
99
|
mcp_proxy_adapter/examples/run_example.py,sha256=yp-a6HIrSk3ddQmbn0KkuKwErId0aNfj028TE6U-zmY,2626
|
106
|
-
mcp_proxy_adapter/examples/run_full_test_suite.py,sha256=
|
100
|
+
mcp_proxy_adapter/examples/run_full_test_suite.py,sha256=AovcAWbaVsx1eMLAgIPZXRqv_Lz77pbvMq0huak4G78,25703
|
107
101
|
mcp_proxy_adapter/examples/run_proxy_server.py,sha256=SBLSSY2F_VEBQD3MsCE_Pa9xFE6Sszr3vHdE9QOEN4Y,5242
|
108
102
|
mcp_proxy_adapter/examples/run_security_tests_fixed.py,sha256=aIf57LcAlNUEoroRueZ9hRrnVkg0cRgr58vP2T-ZEXM,18328
|
109
|
-
mcp_proxy_adapter/examples/security_test_client.py,sha256=
|
103
|
+
mcp_proxy_adapter/examples/security_test_client.py,sha256=ukrzMSJz6AhXp-ZKSMfS53u2SfGQnopvJDh7lj7cxLk,48815
|
110
104
|
mcp_proxy_adapter/examples/setup_test_environment.py,sha256=JkMqLpH5ZmkNKE7-WT52_kYMxEKLFOyQWbtip29TeiU,51629
|
111
105
|
mcp_proxy_adapter/examples/simple_protocol_test.py,sha256=BzFUZvK9Fih3aG4IFLQTZPyPe_s6YjpZfB6uZmQ76rw,3969
|
112
|
-
mcp_proxy_adapter/examples/test_chk_hostname_automated.py,sha256=
|
106
|
+
mcp_proxy_adapter/examples/test_chk_hostname_automated.py,sha256=nN0FEevzP6UP3q40zq4lw_GiT050FYomu7rWFPOMF2U,7002
|
113
107
|
mcp_proxy_adapter/examples/test_config.py,sha256=ekEoUZe9q484vU_0IxOVhQdNMVJXG3IpmQpP--VmuDI,6491
|
114
108
|
mcp_proxy_adapter/examples/test_config_builder.py,sha256=SAcWIC54vzO0mrb1L9xZKK2IhNkZuSx7_cMEkC1Lm60,21607
|
115
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
|
116
112
|
mcp_proxy_adapter/examples/test_protocol_examples.py,sha256=yCZzZrJ9ICXMkF1bAMozpin2QeTMI653bggPAZTRAUE,12138
|
117
113
|
mcp_proxy_adapter/examples/universal_client.py,sha256=n1-cBPOiCipA86Zcc_mI_jMywDMZS1p3u5JT3AqTsrQ,27577
|
118
114
|
mcp_proxy_adapter/examples/update_config_certificates.py,sha256=ObGF5oNQ9OStryUvFDXxrN-olRMKdSOrl5KSwARF7EY,4608
|
@@ -134,8 +130,8 @@ mcp_proxy_adapter/schemas/base_schema.json,sha256=v9G9cGMd4dRhCZsOQ_FMqOi5VFyVbI
|
|
134
130
|
mcp_proxy_adapter/schemas/openapi_schema.json,sha256=C3yLkwmDsvnLW9B5gnKKdBGl4zxkeU-rEmjTrNVsQU0,8405
|
135
131
|
mcp_proxy_adapter/schemas/roles.json,sha256=pgf_ZyqKyXbfGUxvobpiLiSJz9zzxrMuoVWEkEpz3N8,764
|
136
132
|
mcp_proxy_adapter/schemas/roles_schema.json,sha256=deHgI7L6GwfBXacOlNtDgDJelDThppClC3Ti4Eh8rJY,5659
|
137
|
-
mcp_proxy_adapter-6.6.
|
138
|
-
mcp_proxy_adapter-6.6.
|
139
|
-
mcp_proxy_adapter-6.6.
|
140
|
-
mcp_proxy_adapter-6.6.
|
141
|
-
mcp_proxy_adapter-6.6.
|
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,,
|