mcp-proxy-adapter 2.0.1__py3-none-any.whl ā 6.9.50__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.
Potentially problematic release.
This version of mcp-proxy-adapter might be problematic. Click here for more details.
- mcp_proxy_adapter/__init__.py +47 -0
- mcp_proxy_adapter/__main__.py +13 -0
- mcp_proxy_adapter/api/__init__.py +0 -0
- mcp_proxy_adapter/api/app.py +66 -0
- mcp_proxy_adapter/api/core/__init__.py +18 -0
- mcp_proxy_adapter/api/core/app_factory.py +400 -0
- mcp_proxy_adapter/api/core/lifespan_manager.py +55 -0
- mcp_proxy_adapter/api/core/registration_context.py +356 -0
- mcp_proxy_adapter/api/core/registration_manager.py +307 -0
- mcp_proxy_adapter/api/core/registration_tasks.py +84 -0
- mcp_proxy_adapter/api/core/ssl_context_factory.py +88 -0
- mcp_proxy_adapter/api/handlers.py +181 -0
- mcp_proxy_adapter/api/middleware/__init__.py +21 -0
- mcp_proxy_adapter/api/middleware/base.py +54 -0
- mcp_proxy_adapter/api/middleware/command_permission_middleware.py +73 -0
- mcp_proxy_adapter/api/middleware/error_handling.py +76 -0
- mcp_proxy_adapter/api/middleware/factory.py +147 -0
- mcp_proxy_adapter/api/middleware/logging.py +31 -0
- mcp_proxy_adapter/api/middleware/performance.py +51 -0
- mcp_proxy_adapter/api/middleware/protocol_middleware.py +140 -0
- mcp_proxy_adapter/api/middleware/transport_middleware.py +87 -0
- mcp_proxy_adapter/api/middleware/unified_security.py +223 -0
- mcp_proxy_adapter/api/middleware/user_info_middleware.py +132 -0
- mcp_proxy_adapter/api/openapi/__init__.py +21 -0
- mcp_proxy_adapter/api/openapi/command_integration.py +105 -0
- mcp_proxy_adapter/api/openapi/openapi_generator.py +40 -0
- mcp_proxy_adapter/api/openapi/openapi_registry.py +62 -0
- mcp_proxy_adapter/api/openapi/schema_loader.py +116 -0
- mcp_proxy_adapter/api/schemas.py +270 -0
- mcp_proxy_adapter/api/tool_integration.py +131 -0
- mcp_proxy_adapter/api/tools.py +163 -0
- mcp_proxy_adapter/cli/__init__.py +12 -0
- mcp_proxy_adapter/cli/commands/__init__.py +15 -0
- mcp_proxy_adapter/cli/commands/client.py +100 -0
- mcp_proxy_adapter/cli/commands/config_generate.py +105 -0
- mcp_proxy_adapter/cli/commands/config_validate.py +94 -0
- mcp_proxy_adapter/cli/commands/generate.py +259 -0
- mcp_proxy_adapter/cli/commands/server.py +174 -0
- mcp_proxy_adapter/cli/commands/sets.py +132 -0
- mcp_proxy_adapter/cli/commands/testconfig.py +177 -0
- mcp_proxy_adapter/cli/examples/__init__.py +8 -0
- mcp_proxy_adapter/cli/examples/http_basic.py +82 -0
- mcp_proxy_adapter/cli/examples/https_token.py +96 -0
- mcp_proxy_adapter/cli/examples/mtls_roles.py +103 -0
- mcp_proxy_adapter/cli/main.py +63 -0
- mcp_proxy_adapter/cli/parser.py +338 -0
- mcp_proxy_adapter/cli/validators.py +231 -0
- mcp_proxy_adapter/client/jsonrpc_client/__init__.py +9 -0
- mcp_proxy_adapter/client/jsonrpc_client/client.py +42 -0
- mcp_proxy_adapter/client/jsonrpc_client/command_api.py +45 -0
- mcp_proxy_adapter/client/jsonrpc_client/proxy_api.py +224 -0
- mcp_proxy_adapter/client/jsonrpc_client/queue_api.py +60 -0
- mcp_proxy_adapter/client/jsonrpc_client/transport.py +108 -0
- mcp_proxy_adapter/client/proxy.py +123 -0
- mcp_proxy_adapter/commands/__init__.py +66 -0
- mcp_proxy_adapter/commands/auth_validation_command.py +69 -0
- mcp_proxy_adapter/commands/base.py +389 -0
- mcp_proxy_adapter/commands/builtin_commands.py +30 -0
- mcp_proxy_adapter/commands/catalog/__init__.py +20 -0
- mcp_proxy_adapter/commands/catalog/catalog_loader.py +34 -0
- mcp_proxy_adapter/commands/catalog/catalog_manager.py +122 -0
- mcp_proxy_adapter/commands/catalog/catalog_syncer.py +149 -0
- mcp_proxy_adapter/commands/catalog/command_catalog.py +43 -0
- mcp_proxy_adapter/commands/catalog/dependency_manager.py +37 -0
- mcp_proxy_adapter/commands/catalog_manager.py +97 -0
- mcp_proxy_adapter/commands/cert_monitor_command.py +552 -0
- mcp_proxy_adapter/commands/certificate_management_command.py +562 -0
- mcp_proxy_adapter/commands/command_registry.py +298 -0
- mcp_proxy_adapter/commands/config_command.py +102 -0
- mcp_proxy_adapter/commands/dependency_container.py +40 -0
- mcp_proxy_adapter/commands/dependency_manager.py +143 -0
- mcp_proxy_adapter/commands/echo_command.py +48 -0
- mcp_proxy_adapter/commands/health_command.py +142 -0
- mcp_proxy_adapter/commands/help_command.py +175 -0
- mcp_proxy_adapter/commands/hooks.py +172 -0
- mcp_proxy_adapter/commands/key_management_command.py +484 -0
- mcp_proxy_adapter/commands/load_command.py +123 -0
- mcp_proxy_adapter/commands/plugins_command.py +246 -0
- mcp_proxy_adapter/commands/protocol_management_command.py +216 -0
- mcp_proxy_adapter/commands/proxy_registration_command.py +319 -0
- mcp_proxy_adapter/commands/queue_commands.py +750 -0
- mcp_proxy_adapter/commands/registration_status_command.py +76 -0
- mcp_proxy_adapter/commands/registry/__init__.py +18 -0
- mcp_proxy_adapter/commands/registry/command_info.py +103 -0
- mcp_proxy_adapter/commands/registry/command_loader.py +207 -0
- mcp_proxy_adapter/commands/registry/command_manager.py +119 -0
- mcp_proxy_adapter/commands/registry/command_registry.py +217 -0
- mcp_proxy_adapter/commands/reload_command.py +136 -0
- mcp_proxy_adapter/commands/result.py +157 -0
- mcp_proxy_adapter/commands/role_test_command.py +99 -0
- mcp_proxy_adapter/commands/roles_management_command.py +502 -0
- mcp_proxy_adapter/commands/security_command.py +472 -0
- mcp_proxy_adapter/commands/settings_command.py +113 -0
- mcp_proxy_adapter/commands/ssl_setup_command.py +306 -0
- mcp_proxy_adapter/commands/token_management_command.py +500 -0
- mcp_proxy_adapter/commands/transport_management_command.py +129 -0
- mcp_proxy_adapter/commands/unload_command.py +92 -0
- mcp_proxy_adapter/config.py +32 -0
- mcp_proxy_adapter/core/__init__.py +8 -0
- mcp_proxy_adapter/core/app_factory.py +560 -0
- mcp_proxy_adapter/core/app_runner.py +318 -0
- mcp_proxy_adapter/core/auth_validator.py +508 -0
- mcp_proxy_adapter/core/certificate/__init__.py +20 -0
- mcp_proxy_adapter/core/certificate/certificate_creator.py +372 -0
- mcp_proxy_adapter/core/certificate/certificate_extractor.py +185 -0
- mcp_proxy_adapter/core/certificate/certificate_utils.py +249 -0
- mcp_proxy_adapter/core/certificate/certificate_validator.py +481 -0
- mcp_proxy_adapter/core/certificate/ssl_context_manager.py +65 -0
- mcp_proxy_adapter/core/certificate_utils.py +249 -0
- mcp_proxy_adapter/core/client.py +608 -0
- mcp_proxy_adapter/core/client_manager.py +271 -0
- mcp_proxy_adapter/core/client_security.py +411 -0
- mcp_proxy_adapter/core/config/__init__.py +18 -0
- mcp_proxy_adapter/core/config/config.py +237 -0
- mcp_proxy_adapter/core/config/config_factory.py +22 -0
- mcp_proxy_adapter/core/config/config_loader.py +66 -0
- mcp_proxy_adapter/core/config/feature_manager.py +31 -0
- mcp_proxy_adapter/core/config/simple_config.py +204 -0
- mcp_proxy_adapter/core/config/simple_config_generator.py +131 -0
- mcp_proxy_adapter/core/config/simple_config_validator.py +476 -0
- mcp_proxy_adapter/core/config_converter.py +252 -0
- mcp_proxy_adapter/core/config_validator.py +211 -0
- mcp_proxy_adapter/core/crl_utils.py +362 -0
- mcp_proxy_adapter/core/errors.py +276 -0
- mcp_proxy_adapter/core/job_manager.py +54 -0
- mcp_proxy_adapter/core/logging.py +250 -0
- mcp_proxy_adapter/core/mtls_asgi.py +140 -0
- mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
- mcp_proxy_adapter/core/mtls_proxy.py +229 -0
- mcp_proxy_adapter/core/mtls_server.py +154 -0
- mcp_proxy_adapter/core/protocol_manager.py +232 -0
- mcp_proxy_adapter/core/proxy/__init__.py +19 -0
- mcp_proxy_adapter/core/proxy/auth_manager.py +26 -0
- mcp_proxy_adapter/core/proxy/proxy_registration_manager.py +160 -0
- mcp_proxy_adapter/core/proxy/registration_client.py +186 -0
- mcp_proxy_adapter/core/proxy/ssl_manager.py +101 -0
- mcp_proxy_adapter/core/proxy_client.py +184 -0
- mcp_proxy_adapter/core/proxy_registration.py +80 -0
- mcp_proxy_adapter/core/role_utils.py +103 -0
- mcp_proxy_adapter/core/security_adapter.py +343 -0
- mcp_proxy_adapter/core/security_factory.py +96 -0
- mcp_proxy_adapter/core/security_integration.py +342 -0
- mcp_proxy_adapter/core/server_adapter.py +251 -0
- mcp_proxy_adapter/core/server_engine.py +217 -0
- mcp_proxy_adapter/core/settings.py +260 -0
- mcp_proxy_adapter/core/signal_handler.py +107 -0
- mcp_proxy_adapter/core/ssl_utils.py +161 -0
- mcp_proxy_adapter/core/transport_manager.py +153 -0
- mcp_proxy_adapter/core/unified_config_adapter.py +471 -0
- mcp_proxy_adapter/core/utils.py +101 -0
- mcp_proxy_adapter/core/validation/__init__.py +21 -0
- mcp_proxy_adapter/core/validation/config_validator.py +219 -0
- mcp_proxy_adapter/core/validation/file_validator.py +131 -0
- mcp_proxy_adapter/core/validation/protocol_validator.py +205 -0
- mcp_proxy_adapter/core/validation/security_validator.py +140 -0
- mcp_proxy_adapter/core/validation/validation_result.py +27 -0
- mcp_proxy_adapter/custom_openapi.py +58 -0
- mcp_proxy_adapter/examples/__init__.py +16 -0
- mcp_proxy_adapter/examples/basic_framework/__init__.py +9 -0
- mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +4 -0
- mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +4 -0
- mcp_proxy_adapter/examples/basic_framework/main.py +52 -0
- mcp_proxy_adapter/examples/bugfix_certificate_config.py +261 -0
- mcp_proxy_adapter/examples/cert_manager_bugfix.py +203 -0
- mcp_proxy_adapter/examples/check_config.py +413 -0
- mcp_proxy_adapter/examples/client_usage_example.py +164 -0
- mcp_proxy_adapter/examples/commands/__init__.py +5 -0
- mcp_proxy_adapter/examples/config_builder.py +234 -0
- mcp_proxy_adapter/examples/config_cli.py +282 -0
- mcp_proxy_adapter/examples/create_test_configs.py +174 -0
- mcp_proxy_adapter/examples/debug_request_state.py +130 -0
- mcp_proxy_adapter/examples/debug_role_chain.py +191 -0
- mcp_proxy_adapter/examples/demo_client.py +287 -0
- mcp_proxy_adapter/examples/full_application/__init__.py +12 -0
- mcp_proxy_adapter/examples/full_application/commands/__init__.py +8 -0
- mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +45 -0
- mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +52 -0
- mcp_proxy_adapter/examples/full_application/commands/echo_command.py +32 -0
- mcp_proxy_adapter/examples/full_application/commands/help_command.py +54 -0
- mcp_proxy_adapter/examples/full_application/commands/list_command.py +57 -0
- mcp_proxy_adapter/examples/full_application/hooks/__init__.py +5 -0
- mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +29 -0
- mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +27 -0
- mcp_proxy_adapter/examples/full_application/main.py +311 -0
- mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +161 -0
- mcp_proxy_adapter/examples/full_application/run_mtls.py +252 -0
- mcp_proxy_adapter/examples/full_application/run_simple.py +152 -0
- mcp_proxy_adapter/examples/full_application/test_minimal_server.py +45 -0
- mcp_proxy_adapter/examples/full_application/test_server.py +163 -0
- mcp_proxy_adapter/examples/full_application/test_simple_server.py +62 -0
- mcp_proxy_adapter/examples/generate_config.py +502 -0
- mcp_proxy_adapter/examples/proxy_registration_example.py +335 -0
- mcp_proxy_adapter/examples/queue_demo_simple.py +632 -0
- mcp_proxy_adapter/examples/queue_integration_example.py +578 -0
- mcp_proxy_adapter/examples/queue_server_demo.py +82 -0
- mcp_proxy_adapter/examples/queue_server_example.py +85 -0
- mcp_proxy_adapter/examples/queue_server_simple.py +173 -0
- mcp_proxy_adapter/examples/required_certificates.py +208 -0
- mcp_proxy_adapter/examples/run_example.py +77 -0
- mcp_proxy_adapter/examples/run_full_test_suite.py +619 -0
- mcp_proxy_adapter/examples/run_proxy_server.py +153 -0
- mcp_proxy_adapter/examples/run_security_tests_fixed.py +435 -0
- mcp_proxy_adapter/examples/security_test/__init__.py +18 -0
- mcp_proxy_adapter/examples/security_test/auth_manager.py +14 -0
- mcp_proxy_adapter/examples/security_test/ssl_context_manager.py +28 -0
- mcp_proxy_adapter/examples/security_test/test_client.py +159 -0
- mcp_proxy_adapter/examples/security_test/test_result.py +22 -0
- mcp_proxy_adapter/examples/security_test_client.py +72 -0
- mcp_proxy_adapter/examples/setup/__init__.py +24 -0
- mcp_proxy_adapter/examples/setup/certificate_manager.py +215 -0
- mcp_proxy_adapter/examples/setup/config_generator.py +12 -0
- mcp_proxy_adapter/examples/setup/config_validator.py +118 -0
- mcp_proxy_adapter/examples/setup/environment_setup.py +62 -0
- mcp_proxy_adapter/examples/setup/test_files_generator.py +10 -0
- mcp_proxy_adapter/examples/setup/test_runner.py +89 -0
- mcp_proxy_adapter/examples/setup_test_environment.py +235 -0
- mcp_proxy_adapter/examples/simple_protocol_test.py +125 -0
- mcp_proxy_adapter/examples/test_chk_hostname_automated.py +211 -0
- mcp_proxy_adapter/examples/test_config.py +205 -0
- mcp_proxy_adapter/examples/test_config_builder.py +110 -0
- mcp_proxy_adapter/examples/test_examples.py +308 -0
- mcp_proxy_adapter/examples/test_framework_complete.py +267 -0
- mcp_proxy_adapter/examples/test_mcp_server.py +187 -0
- mcp_proxy_adapter/examples/test_protocol_examples.py +337 -0
- mcp_proxy_adapter/examples/universal_client.py +674 -0
- mcp_proxy_adapter/examples/update_config_certificates.py +135 -0
- mcp_proxy_adapter/examples/validate_generator_compatibility.py +385 -0
- mcp_proxy_adapter/examples/validate_generator_compatibility_simple.py +61 -0
- mcp_proxy_adapter/integrations/__init__.py +25 -0
- mcp_proxy_adapter/integrations/queuemgr_integration.py +462 -0
- mcp_proxy_adapter/main.py +311 -0
- mcp_proxy_adapter/openapi.py +375 -0
- mcp_proxy_adapter/schemas/base_schema.json +114 -0
- mcp_proxy_adapter/schemas/openapi_schema.json +314 -0
- mcp_proxy_adapter/schemas/roles.json +37 -0
- mcp_proxy_adapter/schemas/roles_schema.json +162 -0
- mcp_proxy_adapter/version.py +5 -0
- mcp_proxy_adapter-6.9.50.dist-info/METADATA +1088 -0
- mcp_proxy_adapter-6.9.50.dist-info/RECORD +242 -0
- {mcp_proxy_adapter-2.0.1.dist-info ā mcp_proxy_adapter-6.9.50.dist-info}/WHEEL +1 -1
- mcp_proxy_adapter-6.9.50.dist-info/entry_points.txt +14 -0
- mcp_proxy_adapter-6.9.50.dist-info/top_level.txt +1 -0
- adapters/__init__.py +0 -16
- analyzers/__init__.py +0 -14
- analyzers/docstring_analyzer.py +0 -199
- analyzers/type_analyzer.py +0 -151
- cli/__init__.py +0 -12
- cli/__main__.py +0 -79
- cli/command_runner.py +0 -233
- dispatchers/__init__.py +0 -14
- dispatchers/base_dispatcher.py +0 -85
- dispatchers/json_rpc_dispatcher.py +0 -198
- generators/__init__.py +0 -14
- generators/endpoint_generator.py +0 -172
- generators/openapi_generator.py +0 -254
- generators/rest_api_generator.py +0 -207
- mcp_proxy_adapter-2.0.1.dist-info/METADATA +0 -272
- mcp_proxy_adapter-2.0.1.dist-info/RECORD +0 -28
- mcp_proxy_adapter-2.0.1.dist-info/licenses/LICENSE +0 -21
- mcp_proxy_adapter-2.0.1.dist-info/top_level.txt +0 -7
- openapi_schema/__init__.py +0 -38
- openapi_schema/command_registry.py +0 -312
- openapi_schema/rest_schema.py +0 -510
- openapi_schema/rpc_generator.py +0 -307
- openapi_schema/rpc_schema.py +0 -416
- validators/__init__.py +0 -14
- validators/base_validator.py +0 -23
- validators/docstring_validator.py +0 -75
- validators/metadata_validator.py +0 -76
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Proxy Registration Example
|
|
3
|
+
This example demonstrates how to use the MCP Proxy Adapter framework
|
|
4
|
+
for proxy registration with different authentication methods.
|
|
5
|
+
Author: Vasiliy Zdanovskiy
|
|
6
|
+
email: vasilyvz@gmail.com
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import asyncio
|
|
10
|
+
import json
|
|
11
|
+
import sys
|
|
12
|
+
import os
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Dict, Any, Optional
|
|
15
|
+
|
|
16
|
+
# Add project root to path
|
|
17
|
+
project_root = Path(__file__).parent.parent.parent
|
|
18
|
+
sys.path.insert(0, str(project_root))
|
|
19
|
+
import aiohttp
|
|
20
|
+
from aiohttp import ClientTimeout, TCPConnector
|
|
21
|
+
import ssl
|
|
22
|
+
from mcp_proxy_adapter.core.logging import get_global_logger
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ProxyRegistrationExample:
|
|
26
|
+
"""Example client for testing proxy registration functionality."""
|
|
27
|
+
|
|
28
|
+
def __init__(self, server_url: str, auth_token: Optional[str] = None):
|
|
29
|
+
"""
|
|
30
|
+
Initialize example client.
|
|
31
|
+
Args:
|
|
32
|
+
server_url: Server URL
|
|
33
|
+
auth_token: Authentication token
|
|
34
|
+
"""
|
|
35
|
+
self.server_url = server_url
|
|
36
|
+
self.auth_token = auth_token
|
|
37
|
+
self.session: Optional[aiohttp.ClientSession] = None
|
|
38
|
+
# Test data
|
|
39
|
+
self.test_servers = [
|
|
40
|
+
{
|
|
41
|
+
"server_id": "example-server-1",
|
|
42
|
+
"server_url": "http://localhost:8001",
|
|
43
|
+
"server_name": "Example Server 1",
|
|
44
|
+
"description": "Example server for registration testing",
|
|
45
|
+
"version": "1.0.0",
|
|
46
|
+
"capabilities": ["jsonrpc", "rest"],
|
|
47
|
+
"endpoints": {
|
|
48
|
+
"jsonrpc": "/api/jsonrpc",
|
|
49
|
+
"rest": "/cmd",
|
|
50
|
+
"health": "/health",
|
|
51
|
+
},
|
|
52
|
+
"auth_method": "api_key",
|
|
53
|
+
"security_enabled": True,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"server_id": "example-server-2",
|
|
57
|
+
"server_url": "http://localhost:8002",
|
|
58
|
+
"server_name": "Example Server 2",
|
|
59
|
+
"description": "Another example server",
|
|
60
|
+
"version": "1.0.0",
|
|
61
|
+
"capabilities": ["jsonrpc", "rest", "security"],
|
|
62
|
+
"endpoints": {
|
|
63
|
+
"jsonrpc": "/api/jsonrpc",
|
|
64
|
+
"rest": "/cmd",
|
|
65
|
+
"health": "/health",
|
|
66
|
+
},
|
|
67
|
+
"auth_method": "certificate",
|
|
68
|
+
"security_enabled": True,
|
|
69
|
+
},
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
async def __aenter__(self):
|
|
73
|
+
"""Async context manager entry."""
|
|
74
|
+
# Create SSL context for HTTPS
|
|
75
|
+
ssl_context = None
|
|
76
|
+
if self.server_url.startswith("https"):
|
|
77
|
+
ssl_context = ssl.create_default_context()
|
|
78
|
+
ssl_context.check_hostname = False
|
|
79
|
+
ssl_context.verify_mode = ssl.CERT_NONE
|
|
80
|
+
# Create connector
|
|
81
|
+
connector = TCPConnector(ssl=ssl_context) if ssl_context else None
|
|
82
|
+
# Create session
|
|
83
|
+
timeout = ClientTimeout(total=30)
|
|
84
|
+
self.session = aiohttp.ClientSession(connector=connector, timeout=timeout)
|
|
85
|
+
return self
|
|
86
|
+
|
|
87
|
+
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
|
88
|
+
"""Async context manager exit."""
|
|
89
|
+
if self.session:
|
|
90
|
+
await self.session.close()
|
|
91
|
+
|
|
92
|
+
def _get_headers(self) -> Dict[str, str]:
|
|
93
|
+
"""Get request headers with authentication."""
|
|
94
|
+
headers = {"Content-Type": "application/json"}
|
|
95
|
+
if self.auth_token:
|
|
96
|
+
headers["X-API-Key"] = self.auth_token
|
|
97
|
+
return headers
|
|
98
|
+
|
|
99
|
+
async def test_registration(self, server_data: Dict[str, Any]) -> Dict[str, Any]:
|
|
100
|
+
"""
|
|
101
|
+
Test registration with authentication.
|
|
102
|
+
Args:
|
|
103
|
+
server_data: Server registration data
|
|
104
|
+
Returns:
|
|
105
|
+
Test result
|
|
106
|
+
"""
|
|
107
|
+
try:
|
|
108
|
+
# Prepare JSON-RPC request
|
|
109
|
+
request_data = {
|
|
110
|
+
"jsonrpc": "2.0",
|
|
111
|
+
"id": 1,
|
|
112
|
+
"method": "proxy_registration",
|
|
113
|
+
"params": {"operation": "register", **server_data},
|
|
114
|
+
}
|
|
115
|
+
get_global_logger().info(f"Testing registration for server: {server_data['server_id']}")
|
|
116
|
+
get_global_logger().debug(f"Request data: {json.dumps(request_data, indent=2)}")
|
|
117
|
+
# Make request
|
|
118
|
+
async with self.session.post(
|
|
119
|
+
f"{self.server_url}/cmd", json=request_data, headers=self._get_headers()
|
|
120
|
+
) as response:
|
|
121
|
+
result = await response.json()
|
|
122
|
+
get_global_logger().info(f"Response status: {response.status}")
|
|
123
|
+
get_global_logger().debug(f"Response: {json.dumps(result, indent=2)}")
|
|
124
|
+
return {
|
|
125
|
+
"success": response.status == 200,
|
|
126
|
+
"status_code": response.status,
|
|
127
|
+
"result": result,
|
|
128
|
+
"server_id": server_data["server_id"],
|
|
129
|
+
}
|
|
130
|
+
except Exception as e:
|
|
131
|
+
get_global_logger().error(f"Registration test failed: {e}")
|
|
132
|
+
return {
|
|
133
|
+
"success": False,
|
|
134
|
+
"error": str(e),
|
|
135
|
+
"server_id": server_data["server_id"],
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
async def test_discovery(self) -> Dict[str, Any]:
|
|
139
|
+
"""
|
|
140
|
+
Test discovery operation.
|
|
141
|
+
Returns:
|
|
142
|
+
Test result
|
|
143
|
+
"""
|
|
144
|
+
try:
|
|
145
|
+
# Prepare JSON-RPC request
|
|
146
|
+
request_data = {
|
|
147
|
+
"jsonrpc": "2.0",
|
|
148
|
+
"id": 1,
|
|
149
|
+
"method": "proxy_registration",
|
|
150
|
+
"params": {"operation": "discover"},
|
|
151
|
+
}
|
|
152
|
+
get_global_logger().info("Testing discovery operation")
|
|
153
|
+
# Make request
|
|
154
|
+
async with self.session.post(
|
|
155
|
+
f"{self.server_url}/cmd", json=request_data, headers=self._get_headers()
|
|
156
|
+
) as response:
|
|
157
|
+
result = await response.json()
|
|
158
|
+
get_global_logger().info(f"Response status: {response.status}")
|
|
159
|
+
get_global_logger().debug(f"Response: {json.dumps(result, indent=2)}")
|
|
160
|
+
return {
|
|
161
|
+
"success": response.status == 200,
|
|
162
|
+
"status_code": response.status,
|
|
163
|
+
"result": result,
|
|
164
|
+
}
|
|
165
|
+
except Exception as e:
|
|
166
|
+
get_global_logger().error(f"Discovery test failed: {e}")
|
|
167
|
+
return {"success": False, "error": str(e)}
|
|
168
|
+
|
|
169
|
+
async def test_heartbeat(self, server_key: str) -> Dict[str, Any]:
|
|
170
|
+
"""
|
|
171
|
+
Test heartbeat operation.
|
|
172
|
+
Args:
|
|
173
|
+
server_key: Server key for heartbeat
|
|
174
|
+
Returns:
|
|
175
|
+
Test result
|
|
176
|
+
"""
|
|
177
|
+
try:
|
|
178
|
+
# Prepare JSON-RPC request
|
|
179
|
+
request_data = {
|
|
180
|
+
"jsonrpc": "2.0",
|
|
181
|
+
"id": 1,
|
|
182
|
+
"method": "proxy_registration",
|
|
183
|
+
"params": {
|
|
184
|
+
"operation": "heartbeat",
|
|
185
|
+
"server_key": server_key,
|
|
186
|
+
"timestamp": 1234567890,
|
|
187
|
+
"status": "healthy",
|
|
188
|
+
},
|
|
189
|
+
}
|
|
190
|
+
get_global_logger().info(f"Testing heartbeat for server: {server_key}")
|
|
191
|
+
# Make request
|
|
192
|
+
async with self.session.post(
|
|
193
|
+
f"{self.server_url}/cmd", json=request_data, headers=self._get_headers()
|
|
194
|
+
) as response:
|
|
195
|
+
result = await response.json()
|
|
196
|
+
get_global_logger().info(f"Response status: {response.status}")
|
|
197
|
+
get_global_logger().debug(f"Response: {json.dumps(result, indent=2)}")
|
|
198
|
+
return {
|
|
199
|
+
"success": response.status == 200,
|
|
200
|
+
"status_code": response.status,
|
|
201
|
+
"result": result,
|
|
202
|
+
"server_key": server_key,
|
|
203
|
+
}
|
|
204
|
+
except Exception as e:
|
|
205
|
+
get_global_logger().error(f"Heartbeat test failed: {e}")
|
|
206
|
+
return {"success": False, "error": str(e), "server_key": server_key}
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
async def run_proxy_registration_example():
|
|
210
|
+
"""Run proxy registration example."""
|
|
211
|
+
get_global_logger().info("š Starting proxy registration example")
|
|
212
|
+
# Test configurations
|
|
213
|
+
test_configs = [
|
|
214
|
+
{
|
|
215
|
+
"name": "Admin Token",
|
|
216
|
+
"server_url": "http://localhost:8002",
|
|
217
|
+
"auth_token": "test-token-123",
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
"name": "User Token",
|
|
221
|
+
"server_url": "http://localhost:8002",
|
|
222
|
+
"auth_token": "user-token-456",
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
"name": "Readonly Token",
|
|
226
|
+
"server_url": "http://localhost:8002",
|
|
227
|
+
"auth_token": "readonly-token-123",
|
|
228
|
+
},
|
|
229
|
+
]
|
|
230
|
+
results = []
|
|
231
|
+
for config in test_configs:
|
|
232
|
+
get_global_logger().info(f"\nš Testing: {config['name']}")
|
|
233
|
+
get_global_logger().info(f"Server URL: {config['server_url']}")
|
|
234
|
+
get_global_logger().info(f"Auth Token: {config['auth_token']}")
|
|
235
|
+
async with ProxyRegistrationExample(
|
|
236
|
+
config["server_url"], config["auth_token"]
|
|
237
|
+
) as client:
|
|
238
|
+
# Test registration
|
|
239
|
+
for server_data in client.test_servers:
|
|
240
|
+
result = await client.test_registration(server_data)
|
|
241
|
+
results.append(
|
|
242
|
+
{
|
|
243
|
+
"test": f"{config['name']} - Registration",
|
|
244
|
+
"server_id": server_data["server_id"],
|
|
245
|
+
**result,
|
|
246
|
+
}
|
|
247
|
+
)
|
|
248
|
+
# If registration successful, test heartbeat
|
|
249
|
+
if result["success"] and "result" in result:
|
|
250
|
+
server_key = result["result"].get("result", {}).get("server_key")
|
|
251
|
+
if server_key:
|
|
252
|
+
heartbeat_result = await client.test_heartbeat(server_key)
|
|
253
|
+
results.append(
|
|
254
|
+
{
|
|
255
|
+
"test": f"{config['name']} - Heartbeat",
|
|
256
|
+
"server_key": server_key,
|
|
257
|
+
**heartbeat_result,
|
|
258
|
+
}
|
|
259
|
+
)
|
|
260
|
+
# Test discovery
|
|
261
|
+
discovery_result = await client.test_discovery()
|
|
262
|
+
results.append(
|
|
263
|
+
{"test": f"{config['name']} - Discovery", **discovery_result}
|
|
264
|
+
)
|
|
265
|
+
# Test without authentication
|
|
266
|
+
get_global_logger().info(f"\nš Testing: No Authentication")
|
|
267
|
+
async with ProxyRegistrationExample("http://localhost:8002") as client:
|
|
268
|
+
for server_data in client.test_servers:
|
|
269
|
+
result = await client.test_registration(server_data)
|
|
270
|
+
results.append(
|
|
271
|
+
{
|
|
272
|
+
"test": "No Auth - Registration",
|
|
273
|
+
"server_id": server_data["server_id"],
|
|
274
|
+
**result,
|
|
275
|
+
}
|
|
276
|
+
)
|
|
277
|
+
# Print results
|
|
278
|
+
get_global_logger().info("\n" + "=" * 80)
|
|
279
|
+
get_global_logger().info("š EXAMPLE RESULTS")
|
|
280
|
+
get_global_logger().info("=" * 80)
|
|
281
|
+
passed = 0
|
|
282
|
+
failed = 0
|
|
283
|
+
for result in results:
|
|
284
|
+
status = "ā
PASS" if result["success"] else "ā FAIL"
|
|
285
|
+
get_global_logger().info(f"{status} {result['test']}")
|
|
286
|
+
if result["success"]:
|
|
287
|
+
passed += 1
|
|
288
|
+
else:
|
|
289
|
+
failed += 1
|
|
290
|
+
if "error" in result:
|
|
291
|
+
get_global_logger().error(f" Error: {result['error']}")
|
|
292
|
+
elif "result" in result:
|
|
293
|
+
result_data = result["result"]
|
|
294
|
+
if "error" in result_data:
|
|
295
|
+
get_global_logger().error(f" API Error: {result_data['error']}")
|
|
296
|
+
elif "result" in result_data:
|
|
297
|
+
api_result = result_data["result"]
|
|
298
|
+
if "server_key" in api_result:
|
|
299
|
+
get_global_logger().info(f" Server Key: {api_result['server_key']}")
|
|
300
|
+
if "message" in api_result:
|
|
301
|
+
get_global_logger().info(f" Message: {api_result['message']}")
|
|
302
|
+
get_global_logger().info("\n" + "=" * 80)
|
|
303
|
+
get_global_logger().info(f"š SUMMARY: {passed} passed, {failed} failed")
|
|
304
|
+
get_global_logger().info("=" * 80)
|
|
305
|
+
return passed, failed
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
def main():
|
|
309
|
+
"""Main function for the example."""
|
|
310
|
+
get_global_logger().info("š§ MCP Proxy Adapter - Proxy Registration Example")
|
|
311
|
+
get_global_logger().info("=" * 60)
|
|
312
|
+
# Check if server is running
|
|
313
|
+
import socket
|
|
314
|
+
|
|
315
|
+
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
316
|
+
result = sock.connect_ex(("localhost", 8002))
|
|
317
|
+
sock.close()
|
|
318
|
+
if result != 0:
|
|
319
|
+
get_global_logger().error("ā Server is not running on localhost:8002")
|
|
320
|
+
get_global_logger().info("š” Please start the server first:")
|
|
321
|
+
get_global_logger().info(" cd mcp_proxy_adapter/examples")
|
|
322
|
+
get_global_logger().info(
|
|
323
|
+
" python -m mcp_proxy_adapter.main --config server_configs/config_proxy_registration.json"
|
|
324
|
+
)
|
|
325
|
+
sys.exit(1)
|
|
326
|
+
get_global_logger().info("ā
Server is running on localhost:8002")
|
|
327
|
+
get_global_logger().info("š Starting proxy registration example...")
|
|
328
|
+
# Run example
|
|
329
|
+
passed, failed = asyncio.run(run_proxy_registration_example())
|
|
330
|
+
# Exit with appropriate code
|
|
331
|
+
sys.exit(0 if failed == 0 else 1)
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
if __name__ == "__main__":
|
|
335
|
+
main()
|