mcp-proxy-adapter 6.0.0__py3-none-any.whl → 6.1.0__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 +174 -80
- mcp_proxy_adapter/api/handlers.py +16 -5
- mcp_proxy_adapter/api/middleware/__init__.py +7 -2
- mcp_proxy_adapter/api/middleware/command_permission_middleware.py +148 -0
- mcp_proxy_adapter/api/middleware/factory.py +36 -12
- mcp_proxy_adapter/api/middleware/unified_security.py +152 -0
- mcp_proxy_adapter/api/middleware/user_info_middleware.py +83 -0
- mcp_proxy_adapter/commands/__init__.py +7 -1
- mcp_proxy_adapter/commands/base.py +7 -4
- mcp_proxy_adapter/commands/builtin_commands.py +8 -2
- mcp_proxy_adapter/commands/command_registry.py +8 -0
- mcp_proxy_adapter/commands/echo_command.py +81 -0
- mcp_proxy_adapter/commands/help_command.py +21 -14
- mcp_proxy_adapter/commands/proxy_registration_command.py +326 -185
- mcp_proxy_adapter/commands/role_test_command.py +141 -0
- mcp_proxy_adapter/commands/security_command.py +488 -0
- mcp_proxy_adapter/commands/ssl_setup_command.py +2 -2
- mcp_proxy_adapter/commands/token_management_command.py +1 -1
- mcp_proxy_adapter/config.py +81 -21
- mcp_proxy_adapter/core/app_factory.py +326 -0
- mcp_proxy_adapter/core/client_security.py +384 -0
- mcp_proxy_adapter/core/logging.py +8 -3
- mcp_proxy_adapter/core/mtls_asgi.py +156 -0
- mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
- mcp_proxy_adapter/core/protocol_manager.py +9 -0
- mcp_proxy_adapter/core/proxy_client.py +602 -0
- mcp_proxy_adapter/core/proxy_registration.py +299 -47
- mcp_proxy_adapter/core/security_adapter.py +12 -15
- mcp_proxy_adapter/core/security_integration.py +277 -0
- mcp_proxy_adapter/core/server_adapter.py +345 -0
- mcp_proxy_adapter/core/server_engine.py +364 -0
- mcp_proxy_adapter/core/unified_config_adapter.py +579 -0
- mcp_proxy_adapter/examples/README.md +230 -97
- mcp_proxy_adapter/examples/README_EN.md +258 -0
- mcp_proxy_adapter/examples/SECURITY_TESTING.md +455 -0
- mcp_proxy_adapter/examples/__pycache__/security_configurations.cpython-312.pyc +0 -0
- mcp_proxy_adapter/examples/__pycache__/security_test_client.cpython-312.pyc +0 -0
- mcp_proxy_adapter/examples/basic_framework/configs/http_auth.json +37 -0
- mcp_proxy_adapter/examples/basic_framework/configs/http_simple.json +23 -0
- mcp_proxy_adapter/examples/basic_framework/configs/https_auth.json +39 -0
- mcp_proxy_adapter/examples/basic_framework/configs/https_simple.json +25 -0
- mcp_proxy_adapter/examples/basic_framework/configs/mtls_no_roles.json +39 -0
- mcp_proxy_adapter/examples/basic_framework/configs/mtls_with_roles.json +45 -0
- mcp_proxy_adapter/examples/basic_framework/main.py +63 -0
- mcp_proxy_adapter/examples/basic_framework/roles.json +21 -0
- mcp_proxy_adapter/examples/cert_config.json +9 -0
- mcp_proxy_adapter/examples/certs/admin.crt +32 -0
- mcp_proxy_adapter/examples/certs/admin.key +52 -0
- mcp_proxy_adapter/examples/certs/admin_cert.pem +21 -0
- mcp_proxy_adapter/examples/certs/admin_key.pem +28 -0
- mcp_proxy_adapter/examples/certs/ca_cert.pem +23 -0
- mcp_proxy_adapter/examples/certs/ca_cert.srl +1 -0
- mcp_proxy_adapter/examples/certs/ca_key.pem +28 -0
- mcp_proxy_adapter/examples/certs/cert_config.json +9 -0
- mcp_proxy_adapter/examples/certs/client.crt +32 -0
- mcp_proxy_adapter/examples/certs/client.key +52 -0
- mcp_proxy_adapter/examples/certs/client_admin.crt +32 -0
- mcp_proxy_adapter/examples/certs/client_admin.key +52 -0
- mcp_proxy_adapter/examples/certs/client_user.crt +32 -0
- mcp_proxy_adapter/examples/certs/client_user.key +52 -0
- mcp_proxy_adapter/examples/certs/guest_cert.pem +21 -0
- mcp_proxy_adapter/examples/certs/guest_key.pem +28 -0
- mcp_proxy_adapter/examples/certs/mcp_proxy_adapter_ca_ca.crt +23 -0
- mcp_proxy_adapter/examples/certs/proxy_cert.pem +21 -0
- mcp_proxy_adapter/examples/certs/proxy_key.pem +28 -0
- mcp_proxy_adapter/examples/certs/readonly.crt +32 -0
- mcp_proxy_adapter/examples/certs/readonly.key +52 -0
- mcp_proxy_adapter/examples/certs/readonly_cert.pem +21 -0
- mcp_proxy_adapter/examples/certs/readonly_key.pem +28 -0
- mcp_proxy_adapter/examples/certs/server.crt +32 -0
- mcp_proxy_adapter/examples/certs/server.key +52 -0
- mcp_proxy_adapter/examples/certs/server_cert.pem +32 -0
- mcp_proxy_adapter/examples/certs/server_key.pem +52 -0
- mcp_proxy_adapter/examples/certs/test_ca_ca.crt +20 -0
- mcp_proxy_adapter/examples/certs/user.crt +32 -0
- mcp_proxy_adapter/examples/certs/user.key +52 -0
- mcp_proxy_adapter/examples/certs/user_cert.pem +21 -0
- mcp_proxy_adapter/examples/certs/user_key.pem +28 -0
- mcp_proxy_adapter/examples/client_configs/api_key_client.json +13 -0
- mcp_proxy_adapter/examples/client_configs/basic_auth_client.json +13 -0
- mcp_proxy_adapter/examples/client_configs/certificate_client.json +22 -0
- mcp_proxy_adapter/examples/client_configs/jwt_client.json +15 -0
- mcp_proxy_adapter/examples/client_configs/no_auth_client.json +9 -0
- mcp_proxy_adapter/examples/commands/__init__.py +1 -0
- mcp_proxy_adapter/examples/create_certificates_simple.py +307 -0
- mcp_proxy_adapter/examples/debug_request_state.py +144 -0
- mcp_proxy_adapter/examples/debug_role_chain.py +205 -0
- mcp_proxy_adapter/examples/demo_client.py +341 -0
- mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +99 -0
- mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +106 -0
- mcp_proxy_adapter/examples/full_application/configs/http_auth.json +37 -0
- mcp_proxy_adapter/examples/full_application/configs/http_simple.json +23 -0
- mcp_proxy_adapter/examples/full_application/configs/https_auth.json +39 -0
- mcp_proxy_adapter/examples/full_application/configs/https_simple.json +25 -0
- mcp_proxy_adapter/examples/full_application/configs/mtls_no_roles.json +39 -0
- mcp_proxy_adapter/examples/full_application/configs/mtls_with_roles.json +45 -0
- mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +97 -0
- mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +95 -0
- mcp_proxy_adapter/examples/full_application/main.py +138 -0
- mcp_proxy_adapter/examples/full_application/roles.json +21 -0
- mcp_proxy_adapter/examples/generate_all_certificates.py +429 -0
- mcp_proxy_adapter/examples/generate_certificates.py +121 -0
- mcp_proxy_adapter/examples/keys/ca_key.pem +28 -0
- mcp_proxy_adapter/examples/keys/mcp_proxy_adapter_ca_ca.key +28 -0
- mcp_proxy_adapter/examples/keys/test_ca_ca.key +28 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log +220 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.1 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.2 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.3 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.4 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.5 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log +220 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.1 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.2 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.3 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.4 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.5 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log +2 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.1 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.2 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.3 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.4 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.5 +1 -0
- mcp_proxy_adapter/examples/proxy_registration_example.py +401 -0
- mcp_proxy_adapter/examples/roles.json +38 -0
- mcp_proxy_adapter/examples/run_example.py +81 -0
- mcp_proxy_adapter/examples/run_security_tests.py +326 -0
- mcp_proxy_adapter/examples/run_security_tests_fixed.py +300 -0
- mcp_proxy_adapter/examples/security_test_client.py +743 -0
- mcp_proxy_adapter/examples/server_configs/config_basic_http.json +204 -0
- mcp_proxy_adapter/examples/server_configs/config_http_token.json +238 -0
- mcp_proxy_adapter/examples/server_configs/config_https.json +215 -0
- mcp_proxy_adapter/examples/server_configs/config_https_token.json +231 -0
- mcp_proxy_adapter/examples/server_configs/config_mtls.json +215 -0
- mcp_proxy_adapter/examples/server_configs/config_proxy_registration.json +250 -0
- mcp_proxy_adapter/examples/server_configs/config_simple.json +46 -0
- mcp_proxy_adapter/examples/server_configs/roles.json +38 -0
- mcp_proxy_adapter/examples/test_examples.py +344 -0
- mcp_proxy_adapter/examples/universal_client.py +628 -0
- mcp_proxy_adapter/main.py +21 -10
- mcp_proxy_adapter/utils/config_generator.py +639 -0
- mcp_proxy_adapter/version.py +2 -1
- mcp_proxy_adapter-6.1.0.dist-info/METADATA +205 -0
- mcp_proxy_adapter-6.1.0.dist-info/RECORD +193 -0
- mcp_proxy_adapter-6.1.0.dist-info/entry_points.txt +2 -0
- {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.1.0.dist-info}/licenses/LICENSE +2 -2
- mcp_proxy_adapter/api/middleware/auth.py +0 -146
- mcp_proxy_adapter/api/middleware/auth_adapter.py +0 -235
- mcp_proxy_adapter/api/middleware/mtls_adapter.py +0 -305
- mcp_proxy_adapter/api/middleware/mtls_middleware.py +0 -296
- mcp_proxy_adapter/api/middleware/rate_limit.py +0 -152
- mcp_proxy_adapter/api/middleware/rate_limit_adapter.py +0 -241
- mcp_proxy_adapter/api/middleware/roles_adapter.py +0 -365
- mcp_proxy_adapter/api/middleware/roles_middleware.py +0 -381
- mcp_proxy_adapter/api/middleware/security.py +0 -376
- mcp_proxy_adapter/api/middleware/token_auth_middleware.py +0 -261
- mcp_proxy_adapter/examples/__init__.py +0 -7
- mcp_proxy_adapter/examples/basic_server/README.md +0 -60
- mcp_proxy_adapter/examples/basic_server/__init__.py +0 -7
- mcp_proxy_adapter/examples/basic_server/basic_custom_settings.json +0 -39
- mcp_proxy_adapter/examples/basic_server/config.json +0 -70
- mcp_proxy_adapter/examples/basic_server/config_all_protocols.json +0 -54
- mcp_proxy_adapter/examples/basic_server/config_http.json +0 -70
- mcp_proxy_adapter/examples/basic_server/config_http_only.json +0 -52
- mcp_proxy_adapter/examples/basic_server/config_https.json +0 -58
- mcp_proxy_adapter/examples/basic_server/config_mtls.json +0 -58
- mcp_proxy_adapter/examples/basic_server/config_ssl.json +0 -46
- mcp_proxy_adapter/examples/basic_server/custom_settings_example.py +0 -238
- mcp_proxy_adapter/examples/basic_server/server.py +0 -114
- mcp_proxy_adapter/examples/custom_commands/README.md +0 -127
- mcp_proxy_adapter/examples/custom_commands/__init__.py +0 -27
- mcp_proxy_adapter/examples/custom_commands/advanced_hooks.py +0 -566
- mcp_proxy_adapter/examples/custom_commands/auto_commands/__init__.py +0 -6
- mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_echo_command.py +0 -103
- mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_info_command.py +0 -111
- mcp_proxy_adapter/examples/custom_commands/auto_commands/test_command.py +0 -105
- mcp_proxy_adapter/examples/custom_commands/catalog/commands/test_command.py +0 -129
- mcp_proxy_adapter/examples/custom_commands/config.json +0 -118
- mcp_proxy_adapter/examples/custom_commands/config_all_protocols.json +0 -46
- mcp_proxy_adapter/examples/custom_commands/config_https_only.json +0 -46
- mcp_proxy_adapter/examples/custom_commands/config_https_transport.json +0 -33
- mcp_proxy_adapter/examples/custom_commands/config_mtls_only.json +0 -46
- mcp_proxy_adapter/examples/custom_commands/config_mtls_transport.json +0 -33
- mcp_proxy_adapter/examples/custom_commands/config_single_transport.json +0 -33
- mcp_proxy_adapter/examples/custom_commands/custom_health_command.py +0 -169
- mcp_proxy_adapter/examples/custom_commands/custom_help_command.py +0 -215
- mcp_proxy_adapter/examples/custom_commands/custom_openapi_generator.py +0 -76
- mcp_proxy_adapter/examples/custom_commands/custom_settings.json +0 -96
- mcp_proxy_adapter/examples/custom_commands/custom_settings_manager.py +0 -241
- mcp_proxy_adapter/examples/custom_commands/data_transform_command.py +0 -135
- mcp_proxy_adapter/examples/custom_commands/echo_command.py +0 -122
- mcp_proxy_adapter/examples/custom_commands/full_help_response.json +0 -1
- mcp_proxy_adapter/examples/custom_commands/generated_openapi.json +0 -629
- mcp_proxy_adapter/examples/custom_commands/get_openapi.py +0 -103
- mcp_proxy_adapter/examples/custom_commands/hooks.py +0 -230
- mcp_proxy_adapter/examples/custom_commands/intercept_command.py +0 -123
- mcp_proxy_adapter/examples/custom_commands/loadable_commands/test_ignored.py +0 -129
- mcp_proxy_adapter/examples/custom_commands/manual_echo_command.py +0 -103
- mcp_proxy_adapter/examples/custom_commands/proxy_connection_manager.py +0 -278
- mcp_proxy_adapter/examples/custom_commands/server.py +0 -252
- mcp_proxy_adapter/examples/custom_commands/simple_openapi_server.py +0 -75
- mcp_proxy_adapter/examples/custom_commands/start_server_with_proxy_manager.py +0 -299
- mcp_proxy_adapter/examples/custom_commands/start_server_with_registration.py +0 -278
- mcp_proxy_adapter/examples/custom_commands/test_hooks.py +0 -176
- mcp_proxy_adapter/examples/custom_commands/test_openapi.py +0 -27
- mcp_proxy_adapter/examples/custom_commands/test_registry.py +0 -23
- mcp_proxy_adapter/examples/custom_commands/test_simple.py +0 -19
- mcp_proxy_adapter/examples/custom_project_example/README.md +0 -103
- mcp_proxy_adapter/examples/custom_project_example/README_EN.md +0 -103
- mcp_proxy_adapter/examples/deployment/README.md +0 -49
- mcp_proxy_adapter/examples/deployment/__init__.py +0 -7
- mcp_proxy_adapter/examples/deployment/config.development.json +0 -8
- mcp_proxy_adapter/examples/deployment/config.json +0 -29
- mcp_proxy_adapter/examples/deployment/config.production.json +0 -12
- mcp_proxy_adapter/examples/deployment/config.staging.json +0 -11
- mcp_proxy_adapter/examples/deployment/docker-compose.yml +0 -31
- mcp_proxy_adapter/examples/deployment/run.sh +0 -43
- mcp_proxy_adapter/examples/deployment/run_docker.sh +0 -84
- mcp_proxy_adapter/examples/simple_custom_commands/README.md +0 -149
- mcp_proxy_adapter/examples/simple_custom_commands/README_EN.md +0 -149
- mcp_proxy_adapter/schemas/base_schema.json +0 -114
- mcp_proxy_adapter/schemas/openapi_schema.json +0 -314
- mcp_proxy_adapter/schemas/roles_schema.json +0 -162
- mcp_proxy_adapter/tests/__init__.py +0 -0
- mcp_proxy_adapter/tests/api/__init__.py +0 -3
- mcp_proxy_adapter/tests/api/test_cmd_endpoint.py +0 -115
- mcp_proxy_adapter/tests/api/test_custom_openapi.py +0 -617
- mcp_proxy_adapter/tests/api/test_handlers.py +0 -522
- mcp_proxy_adapter/tests/api/test_middleware.py +0 -340
- mcp_proxy_adapter/tests/api/test_schemas.py +0 -546
- mcp_proxy_adapter/tests/api/test_tool_integration.py +0 -531
- mcp_proxy_adapter/tests/commands/__init__.py +0 -3
- mcp_proxy_adapter/tests/commands/test_config_command.py +0 -211
- mcp_proxy_adapter/tests/commands/test_echo_command.py +0 -127
- mcp_proxy_adapter/tests/commands/test_help_command.py +0 -136
- mcp_proxy_adapter/tests/conftest.py +0 -131
- mcp_proxy_adapter/tests/functional/__init__.py +0 -3
- mcp_proxy_adapter/tests/functional/test_api.py +0 -253
- mcp_proxy_adapter/tests/integration/__init__.py +0 -3
- mcp_proxy_adapter/tests/integration/test_cmd_integration.py +0 -129
- mcp_proxy_adapter/tests/integration/test_integration.py +0 -255
- mcp_proxy_adapter/tests/performance/__init__.py +0 -3
- mcp_proxy_adapter/tests/performance/test_performance.py +0 -189
- mcp_proxy_adapter/tests/stubs/__init__.py +0 -10
- mcp_proxy_adapter/tests/stubs/echo_command.py +0 -104
- mcp_proxy_adapter/tests/test_api_endpoints.py +0 -271
- mcp_proxy_adapter/tests/test_api_handlers.py +0 -289
- mcp_proxy_adapter/tests/test_base_command.py +0 -123
- mcp_proxy_adapter/tests/test_batch_requests.py +0 -117
- mcp_proxy_adapter/tests/test_command_registry.py +0 -281
- mcp_proxy_adapter/tests/test_config.py +0 -127
- mcp_proxy_adapter/tests/test_utils.py +0 -65
- mcp_proxy_adapter/tests/unit/__init__.py +0 -3
- mcp_proxy_adapter/tests/unit/test_base_command.py +0 -436
- mcp_proxy_adapter/tests/unit/test_config.py +0 -270
- mcp_proxy_adapter-6.0.0.dist-info/METADATA +0 -201
- mcp_proxy_adapter-6.0.0.dist-info/RECORD +0 -179
- {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.1.0.dist-info}/WHEEL +0 -0
- {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.1.0.dist-info}/top_level.txt +0 -0
@@ -1,176 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Test Hooks Example
|
3
|
-
|
4
|
-
This script demonstrates the hooks system by making requests to the server
|
5
|
-
and showing how hooks process the commands.
|
6
|
-
"""
|
7
|
-
|
8
|
-
import requests
|
9
|
-
import json
|
10
|
-
import time
|
11
|
-
|
12
|
-
|
13
|
-
def test_echo_hooks():
|
14
|
-
"""Test echo command with hooks."""
|
15
|
-
print("\n🔔 Testing Echo Command with Hooks")
|
16
|
-
print("=" * 50)
|
17
|
-
|
18
|
-
# Test basic echo
|
19
|
-
response = requests.post(
|
20
|
-
"http://localhost:8000/cmd",
|
21
|
-
json={
|
22
|
-
"command": "echo",
|
23
|
-
"params": {"message": "Hello from hooks!"}
|
24
|
-
}
|
25
|
-
)
|
26
|
-
|
27
|
-
if response.status_code == 200:
|
28
|
-
result = response.json()
|
29
|
-
print("✅ Echo command executed successfully")
|
30
|
-
print(f"📤 Result: {json.dumps(result, indent=2)}")
|
31
|
-
else:
|
32
|
-
print(f"❌ Error: {response.status_code} - {response.text}")
|
33
|
-
|
34
|
-
|
35
|
-
def test_help_hooks():
|
36
|
-
"""Test help command with hooks."""
|
37
|
-
print("\n📖 Testing Help Command with Hooks")
|
38
|
-
print("=" * 50)
|
39
|
-
|
40
|
-
# Test help for all commands
|
41
|
-
response = requests.post(
|
42
|
-
"http://localhost:8000/cmd",
|
43
|
-
json={"command": "help"}
|
44
|
-
)
|
45
|
-
|
46
|
-
if response.status_code == 200:
|
47
|
-
result = response.json()
|
48
|
-
print("✅ Help command executed successfully")
|
49
|
-
print(f"📚 Total commands: {result.get('total', 0)}")
|
50
|
-
print(f"🔧 Custom features: {result.get('custom_features', {})}")
|
51
|
-
else:
|
52
|
-
print(f"❌ Error: {response.status_code} - {response.text}")
|
53
|
-
|
54
|
-
# Test help for specific command
|
55
|
-
response = requests.post(
|
56
|
-
"http://localhost:8000/cmd",
|
57
|
-
json={
|
58
|
-
"command": "help",
|
59
|
-
"params": {"cmdname": "echo"}
|
60
|
-
}
|
61
|
-
)
|
62
|
-
|
63
|
-
if response.status_code == 200:
|
64
|
-
result = response.json()
|
65
|
-
print("✅ Help for echo command executed successfully")
|
66
|
-
print(f"📖 Command info: {result.get('info', {}).get('description', 'N/A')}")
|
67
|
-
else:
|
68
|
-
print(f"❌ Error: {response.status_code} - {response.text}")
|
69
|
-
|
70
|
-
|
71
|
-
def test_health_hooks():
|
72
|
-
"""Test health command with hooks."""
|
73
|
-
print("\n🏥 Testing Health Command with Hooks")
|
74
|
-
print("=" * 50)
|
75
|
-
|
76
|
-
response = requests.post(
|
77
|
-
"http://localhost:8000/cmd",
|
78
|
-
json={"command": "health"}
|
79
|
-
)
|
80
|
-
|
81
|
-
if response.status_code == 200:
|
82
|
-
result = response.json()
|
83
|
-
print("✅ Health command executed successfully")
|
84
|
-
|
85
|
-
data = result.get("data", {})
|
86
|
-
print(f"🏥 Status: {data.get('status', 'unknown')}")
|
87
|
-
print(f"⏱️ Uptime: {data.get('uptime', 0):.2f}s")
|
88
|
-
|
89
|
-
custom_metrics = data.get("custom_metrics", {})
|
90
|
-
print(f"🔧 Hook enhanced: {custom_metrics.get('hook_enhanced', False)}")
|
91
|
-
print(f"🆔 Health check ID: {custom_metrics.get('health_check_id', 'N/A')}")
|
92
|
-
else:
|
93
|
-
print(f"❌ Error: {response.status_code} - {response.text}")
|
94
|
-
|
95
|
-
|
96
|
-
def test_security_hooks():
|
97
|
-
"""Test security hooks with sensitive data."""
|
98
|
-
print("\n🔒 Testing Security Hooks")
|
99
|
-
print("=" * 50)
|
100
|
-
|
101
|
-
# Test with sensitive parameter
|
102
|
-
response = requests.post(
|
103
|
-
"http://localhost:8000/cmd",
|
104
|
-
json={
|
105
|
-
"command": "echo",
|
106
|
-
"params": {
|
107
|
-
"message": "Test message",
|
108
|
-
"password": "secret123",
|
109
|
-
"api_token": "sensitive_data"
|
110
|
-
}
|
111
|
-
}
|
112
|
-
)
|
113
|
-
|
114
|
-
if response.status_code == 200:
|
115
|
-
result = response.json()
|
116
|
-
print("✅ Echo command with sensitive data executed")
|
117
|
-
print("🔒 Security hooks should have logged warnings")
|
118
|
-
else:
|
119
|
-
print(f"❌ Error: {response.status_code} - {response.text}")
|
120
|
-
|
121
|
-
|
122
|
-
def test_performance_hooks():
|
123
|
-
"""Test performance hooks with slow operation simulation."""
|
124
|
-
print("\n⏱️ Testing Performance Hooks")
|
125
|
-
print("=" * 50)
|
126
|
-
|
127
|
-
# Test with a command that might be slow
|
128
|
-
response = requests.post(
|
129
|
-
"http://localhost:8000/cmd",
|
130
|
-
json={
|
131
|
-
"command": "health",
|
132
|
-
"params": {}
|
133
|
-
}
|
134
|
-
)
|
135
|
-
|
136
|
-
if response.status_code == 200:
|
137
|
-
result = response.json()
|
138
|
-
print("✅ Health command executed")
|
139
|
-
print("⏱️ Performance hooks should have logged execution time")
|
140
|
-
else:
|
141
|
-
print(f"❌ Error: {response.status_code} - {response.text}")
|
142
|
-
|
143
|
-
|
144
|
-
def main():
|
145
|
-
"""Run all hook tests."""
|
146
|
-
print("🧪 Testing Custom Commands with Hooks")
|
147
|
-
print("=" * 60)
|
148
|
-
print("Make sure the server is running on http://localhost:8000")
|
149
|
-
print("Check the server logs to see hook activity")
|
150
|
-
print("=" * 60)
|
151
|
-
|
152
|
-
# Wait a moment for server to be ready
|
153
|
-
time.sleep(1)
|
154
|
-
|
155
|
-
try:
|
156
|
-
test_echo_hooks()
|
157
|
-
test_help_hooks()
|
158
|
-
test_health_hooks()
|
159
|
-
test_security_hooks()
|
160
|
-
test_performance_hooks()
|
161
|
-
|
162
|
-
print("\n✅ All tests completed!")
|
163
|
-
print("📋 Check the server logs to see hook activity:")
|
164
|
-
print(" - Command-specific hooks")
|
165
|
-
print(" - Global hooks")
|
166
|
-
print(" - Performance monitoring")
|
167
|
-
print(" - Security monitoring")
|
168
|
-
|
169
|
-
except requests.exceptions.ConnectionError:
|
170
|
-
print("❌ Could not connect to server. Make sure it's running on http://localhost:8000")
|
171
|
-
except Exception as e:
|
172
|
-
print(f"❌ Error during testing: {e}")
|
173
|
-
|
174
|
-
|
175
|
-
if __name__ == "__main__":
|
176
|
-
main()
|
@@ -1,27 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
Simple test server to get OpenAPI schema.
|
4
|
-
"""
|
5
|
-
|
6
|
-
import uvicorn
|
7
|
-
from fastapi import FastAPI
|
8
|
-
from mcp_proxy_adapter.custom_openapi import custom_openapi_with_fallback
|
9
|
-
|
10
|
-
# Create FastAPI app
|
11
|
-
app = FastAPI(
|
12
|
-
title="Test MCP Proxy Server",
|
13
|
-
description="Test server for OpenAPI schema",
|
14
|
-
version="1.0.0"
|
15
|
-
)
|
16
|
-
|
17
|
-
# Set custom OpenAPI generator
|
18
|
-
app.openapi = lambda: custom_openapi_with_fallback(app)
|
19
|
-
|
20
|
-
# Add OpenAPI endpoint
|
21
|
-
@app.get("/openapi.json")
|
22
|
-
async def get_openapi_schema():
|
23
|
-
"""Returns OpenAPI schema."""
|
24
|
-
return custom_openapi_with_fallback(app)
|
25
|
-
|
26
|
-
if __name__ == "__main__":
|
27
|
-
uvicorn.run(app, host="0.0.0.0", port=8001)
|
@@ -1,23 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
Test script to understand registry issues.
|
4
|
-
"""
|
5
|
-
|
6
|
-
import sys
|
7
|
-
import os
|
8
|
-
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..'))
|
9
|
-
|
10
|
-
print("1. Importing registry directly...")
|
11
|
-
from mcp_proxy_adapter.commands.command_registry import registry
|
12
|
-
print(f" Registry type: {type(registry)}")
|
13
|
-
print(f" Registry has reload_system: {hasattr(registry, 'reload_system')}")
|
14
|
-
print(f" Registry methods: {[m for m in dir(registry) if not m.startswith('_')]}")
|
15
|
-
|
16
|
-
print("2. Testing reload_system...")
|
17
|
-
try:
|
18
|
-
result = registry.reload_system()
|
19
|
-
print(f" ✅ reload_system worked: {result}")
|
20
|
-
except Exception as e:
|
21
|
-
print(f" ❌ reload_system failed: {e}")
|
22
|
-
import traceback
|
23
|
-
traceback.print_exc()
|
@@ -1,19 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
Simple test in custom_commands directory.
|
4
|
-
"""
|
5
|
-
|
6
|
-
import sys
|
7
|
-
import os
|
8
|
-
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..'))
|
9
|
-
|
10
|
-
print("1. Importing registry directly...")
|
11
|
-
from mcp_proxy_adapter.commands.command_registry import registry
|
12
|
-
print(f" Registry has reload_system: {hasattr(registry, 'reload_system')}")
|
13
|
-
|
14
|
-
print("2. Testing reload_system...")
|
15
|
-
try:
|
16
|
-
result = registry.reload_system()
|
17
|
-
print(f" ✅ reload_system worked: {result}")
|
18
|
-
except Exception as e:
|
19
|
-
print(f" ❌ reload_system failed: {e}")
|
@@ -1,103 +0,0 @@
|
|
1
|
-
# Пример пользовательского проекта с командами
|
2
|
-
|
3
|
-
Этот пример показывает, как создать свой проект с командами и настроить `discovery_path` для их автоматического обнаружения.
|
4
|
-
|
5
|
-
## Структура проекта
|
6
|
-
|
7
|
-
```
|
8
|
-
myproject/
|
9
|
-
├── config.json
|
10
|
-
├── main.py
|
11
|
-
├── myproject/
|
12
|
-
│ ├── __init__.py
|
13
|
-
│ └── commands/
|
14
|
-
│ ├── __init__.py
|
15
|
-
│ ├── echo_command.py
|
16
|
-
│ └── info_command.py
|
17
|
-
└── README.md
|
18
|
-
```
|
19
|
-
|
20
|
-
## Конфигурация
|
21
|
-
|
22
|
-
В файле `config.json` указываем путь к нашим командам:
|
23
|
-
|
24
|
-
```json
|
25
|
-
{
|
26
|
-
"server": {
|
27
|
-
"host": "127.0.0.1",
|
28
|
-
"port": 8001,
|
29
|
-
"debug": true,
|
30
|
-
"log_level": "DEBUG"
|
31
|
-
},
|
32
|
-
"logging": {
|
33
|
-
"level": "DEBUG",
|
34
|
-
"log_dir": "./logs",
|
35
|
-
"log_file": "myproject.log"
|
36
|
-
},
|
37
|
-
"commands": {
|
38
|
-
"auto_discovery": true,
|
39
|
-
"discovery_path": "myproject.commands"
|
40
|
-
}
|
41
|
-
}
|
42
|
-
```
|
43
|
-
|
44
|
-
## Команды
|
45
|
-
|
46
|
-
### echo_command.py
|
47
|
-
|
48
|
-
```python
|
49
|
-
from mcp_proxy_adapter.commands.base import Command
|
50
|
-
from mcp_proxy_adapter.commands.result import CommandResult
|
51
|
-
|
52
|
-
class EchoCommand(Command):
|
53
|
-
"""Echo command that returns the input text."""
|
54
|
-
|
55
|
-
name = "echo"
|
56
|
-
|
57
|
-
def execute(self, text: str) -> CommandResult:
|
58
|
-
return CommandResult(success=True, data={"echo": text})
|
59
|
-
|
60
|
-
@classmethod
|
61
|
-
def get_param_info(cls) -> dict:
|
62
|
-
return {
|
63
|
-
"text": {
|
64
|
-
"type": "string",
|
65
|
-
"description": "Text to echo",
|
66
|
-
"required": True
|
67
|
-
}
|
68
|
-
}
|
69
|
-
```
|
70
|
-
|
71
|
-
### info_command.py
|
72
|
-
|
73
|
-
```python
|
74
|
-
from mcp_proxy_adapter.commands.base import Command
|
75
|
-
from mcp_proxy_adapter.commands.result import CommandResult
|
76
|
-
|
77
|
-
class InfoCommand(Command):
|
78
|
-
"""Info command that returns project information."""
|
79
|
-
|
80
|
-
name = "info"
|
81
|
-
|
82
|
-
def execute(self) -> CommandResult:
|
83
|
-
return CommandResult(
|
84
|
-
success=True,
|
85
|
-
data={
|
86
|
-
"project": "myproject",
|
87
|
-
"version": "1.0.0",
|
88
|
-
"description": "Example project with custom commands"
|
89
|
-
}
|
90
|
-
)
|
91
|
-
|
92
|
-
@classmethod
|
93
|
-
def get_param_info(cls) -> dict:
|
94
|
-
return {}
|
95
|
-
```
|
96
|
-
|
97
|
-
## Запуск
|
98
|
-
|
99
|
-
```bash
|
100
|
-
python main.py
|
101
|
-
```
|
102
|
-
|
103
|
-
При запуске сервис автоматически обнаружит команды из пакета `myproject.commands` благодаря настройке `discovery_path` в конфигурации.
|
@@ -1,103 +0,0 @@
|
|
1
|
-
# Custom Project Example with Commands
|
2
|
-
|
3
|
-
This example shows how to create your own project with commands and configure `discovery_path` for their automatic discovery.
|
4
|
-
|
5
|
-
## Project Structure
|
6
|
-
|
7
|
-
```
|
8
|
-
myproject/
|
9
|
-
├── config.json
|
10
|
-
├── main.py
|
11
|
-
├── myproject/
|
12
|
-
│ ├── __init__.py
|
13
|
-
│ └── commands/
|
14
|
-
│ ├── __init__.py
|
15
|
-
│ ├── echo_command.py
|
16
|
-
│ └── info_command.py
|
17
|
-
└── README.md
|
18
|
-
```
|
19
|
-
|
20
|
-
## Configuration
|
21
|
-
|
22
|
-
In the `config.json` file, specify the path to our commands:
|
23
|
-
|
24
|
-
```json
|
25
|
-
{
|
26
|
-
"server": {
|
27
|
-
"host": "127.0.0.1",
|
28
|
-
"port": 8001,
|
29
|
-
"debug": true,
|
30
|
-
"log_level": "DEBUG"
|
31
|
-
},
|
32
|
-
"logging": {
|
33
|
-
"level": "DEBUG",
|
34
|
-
"log_dir": "./logs",
|
35
|
-
"log_file": "myproject.log"
|
36
|
-
},
|
37
|
-
"commands": {
|
38
|
-
"auto_discovery": true,
|
39
|
-
"discovery_path": "myproject.commands"
|
40
|
-
}
|
41
|
-
}
|
42
|
-
```
|
43
|
-
|
44
|
-
## Commands
|
45
|
-
|
46
|
-
### echo_command.py
|
47
|
-
|
48
|
-
```python
|
49
|
-
from mcp_proxy_adapter.commands.base import Command
|
50
|
-
from mcp_proxy_adapter.commands.result import CommandResult
|
51
|
-
|
52
|
-
class EchoCommand(Command):
|
53
|
-
"""Echo command that returns the input text."""
|
54
|
-
|
55
|
-
name = "echo"
|
56
|
-
|
57
|
-
def execute(self, text: str) -> CommandResult:
|
58
|
-
return CommandResult(success=True, data={"echo": text})
|
59
|
-
|
60
|
-
@classmethod
|
61
|
-
def get_param_info(cls) -> dict:
|
62
|
-
return {
|
63
|
-
"text": {
|
64
|
-
"type": "string",
|
65
|
-
"description": "Text to echo",
|
66
|
-
"required": True
|
67
|
-
}
|
68
|
-
}
|
69
|
-
```
|
70
|
-
|
71
|
-
### info_command.py
|
72
|
-
|
73
|
-
```python
|
74
|
-
from mcp_proxy_adapter.commands.base import Command
|
75
|
-
from mcp_proxy_adapter.commands.result import CommandResult
|
76
|
-
|
77
|
-
class InfoCommand(Command):
|
78
|
-
"""Info command that returns project information."""
|
79
|
-
|
80
|
-
name = "info"
|
81
|
-
|
82
|
-
def execute(self) -> CommandResult:
|
83
|
-
return CommandResult(
|
84
|
-
success=True,
|
85
|
-
data={
|
86
|
-
"project": "myproject",
|
87
|
-
"version": "1.0.0",
|
88
|
-
"description": "Example project with custom commands"
|
89
|
-
}
|
90
|
-
)
|
91
|
-
|
92
|
-
@classmethod
|
93
|
-
def get_param_info(cls) -> dict:
|
94
|
-
return {}
|
95
|
-
```
|
96
|
-
|
97
|
-
## Running
|
98
|
-
|
99
|
-
```bash
|
100
|
-
python main.py
|
101
|
-
```
|
102
|
-
|
103
|
-
When starting, the service will automatically discover commands from the `myproject.commands` package thanks to the `discovery_path` configuration setting.
|
@@ -1,49 +0,0 @@
|
|
1
|
-
# Deployment Examples
|
2
|
-
|
3
|
-
This directory contains deployment examples for the MCP Proxy Adapter framework.
|
4
|
-
|
5
|
-
## Files
|
6
|
-
|
7
|
-
### Docker Deployment
|
8
|
-
- `Dockerfile` - Docker image configuration for the framework
|
9
|
-
- `docker-compose.yml` - Docker Compose configuration for easy deployment
|
10
|
-
- `run_docker.sh` - Script to run the application in Docker
|
11
|
-
|
12
|
-
### Local Deployment
|
13
|
-
- `run.sh` - Script to run the application locally
|
14
|
-
|
15
|
-
### Configuration Files
|
16
|
-
- `config.json` - Default configuration file
|
17
|
-
- `config.development.json` - Development environment configuration
|
18
|
-
- `config.staging.json` - Staging environment configuration
|
19
|
-
- `config.production.json` - Production environment configuration
|
20
|
-
|
21
|
-
## Usage
|
22
|
-
|
23
|
-
### Local Development
|
24
|
-
```bash
|
25
|
-
./run.sh
|
26
|
-
```
|
27
|
-
|
28
|
-
### Docker Deployment
|
29
|
-
```bash
|
30
|
-
./run_docker.sh
|
31
|
-
```
|
32
|
-
|
33
|
-
### Docker Compose
|
34
|
-
```bash
|
35
|
-
docker-compose up -d
|
36
|
-
```
|
37
|
-
|
38
|
-
## Configuration
|
39
|
-
|
40
|
-
Copy the appropriate configuration file to your project root:
|
41
|
-
```bash
|
42
|
-
cp config.development.json config.json
|
43
|
-
```
|
44
|
-
|
45
|
-
## Notes
|
46
|
-
|
47
|
-
- These are example configurations and should be customized for your specific use case
|
48
|
-
- The framework itself is designed to be used as a library, not as a standalone application
|
49
|
-
- Modify the configuration files according to your deployment requirements
|
@@ -1,29 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"server": {
|
3
|
-
"host": "0.0.0.0",
|
4
|
-
"port": 8000,
|
5
|
-
"debug": false,
|
6
|
-
"log_level": "info"
|
7
|
-
},
|
8
|
-
"logging": {
|
9
|
-
"level": "INFO",
|
10
|
-
"file": "adapter.log",
|
11
|
-
"rotation": {
|
12
|
-
"type": "size",
|
13
|
-
"max_bytes": 10485760,
|
14
|
-
"backup_count": 5
|
15
|
-
}
|
16
|
-
},
|
17
|
-
"service": {
|
18
|
-
"name": "MCP Proxy Adapter",
|
19
|
-
"version": "1.0.0"
|
20
|
-
},
|
21
|
-
"discovery": {
|
22
|
-
"enabled": true,
|
23
|
-
"package": "commands"
|
24
|
-
},
|
25
|
-
"docker": {
|
26
|
-
"container_name": "mcp-proxy-adapter",
|
27
|
-
"network": "default"
|
28
|
-
}
|
29
|
-
}
|
@@ -1,12 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"host": "0.0.0.0",
|
3
|
-
"port": 8000,
|
4
|
-
"log_level": "WARNING",
|
5
|
-
"log_file": "logs/mcp_proxy.log",
|
6
|
-
"log_rotation_type": "time",
|
7
|
-
"log_rotation_when": "D",
|
8
|
-
"log_rotation_interval": 1,
|
9
|
-
"log_rotation_backup_count": 30,
|
10
|
-
"cors_origins": ["https://example.com"],
|
11
|
-
"api_keys": ["${API_KEY}"]
|
12
|
-
}
|
@@ -1,11 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"host": "0.0.0.0",
|
3
|
-
"port": 8000,
|
4
|
-
"log_level": "INFO",
|
5
|
-
"log_file": "logs/mcp_proxy.log",
|
6
|
-
"log_rotation_type": "size",
|
7
|
-
"log_max_bytes": 10485760,
|
8
|
-
"log_backup_count": 5,
|
9
|
-
"cors_origins": ["https://staging.example.com"],
|
10
|
-
"api_keys": ["staging-api-key"]
|
11
|
-
}
|
@@ -1,31 +0,0 @@
|
|
1
|
-
version: '3.8'
|
2
|
-
|
3
|
-
# Variables for docker-compose
|
4
|
-
x-environment: &default-env
|
5
|
-
- CONFIG_PATH=/app/config.json
|
6
|
-
- LOG_LEVEL=INFO
|
7
|
-
|
8
|
-
x-volume-mounts: &default-mounts
|
9
|
-
- ./config.json:/app/config.json:ro
|
10
|
-
- ./logs:/app/logs:rw
|
11
|
-
- ./data:/app/data:rw
|
12
|
-
- ./cache:/app/cache:rw
|
13
|
-
|
14
|
-
services:
|
15
|
-
mcp-proxy-adapter:
|
16
|
-
container_name: ${CONTAINER_NAME:-mcp-proxy-adapter}
|
17
|
-
build:
|
18
|
-
context: ../../
|
19
|
-
dockerfile: mcp_proxy_adapter/examples/deployment/Dockerfile
|
20
|
-
ports:
|
21
|
-
- "127.0.0.1:${HOST_PORT:-8000}:${SERVICE_PORT:-8000}"
|
22
|
-
volumes: *default-mounts
|
23
|
-
environment: *default-env
|
24
|
-
restart: unless-stopped
|
25
|
-
user: "${USER_ID:-1000}:${GROUP_ID:-1000}"
|
26
|
-
networks:
|
27
|
-
- default
|
28
|
-
|
29
|
-
networks:
|
30
|
-
default:
|
31
|
-
driver: bridge
|
@@ -1,43 +0,0 @@
|
|
1
|
-
#!/bin/bash
|
2
|
-
|
3
|
-
# MCP Proxy Adapter - Local Development Script
|
4
|
-
# This script runs the framework locally for development
|
5
|
-
|
6
|
-
# Variables
|
7
|
-
HOST_PORT=${HOST_PORT:-8000}
|
8
|
-
CONFIG_PATH=${CONFIG_PATH:-"config.json"}
|
9
|
-
LOG_LEVEL=${LOG_LEVEL:-"INFO"}
|
10
|
-
|
11
|
-
# Get the project root directory (3 levels up from this script)
|
12
|
-
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
|
13
|
-
|
14
|
-
echo "Starting MCP Proxy Adapter locally..."
|
15
|
-
echo "Project root: $PROJECT_ROOT"
|
16
|
-
echo "Config path: $CONFIG_PATH"
|
17
|
-
echo "Port: $HOST_PORT"
|
18
|
-
|
19
|
-
# Activate virtual environment if it exists
|
20
|
-
if [ -d "$PROJECT_ROOT/.venv" ]; then
|
21
|
-
echo "Activating virtual environment..."
|
22
|
-
source "$PROJECT_ROOT/.venv/bin/activate"
|
23
|
-
fi
|
24
|
-
|
25
|
-
# Install dependencies if needed
|
26
|
-
if [ ! -d "$PROJECT_ROOT/.venv" ]; then
|
27
|
-
echo "Creating virtual environment..."
|
28
|
-
python3 -m venv "$PROJECT_ROOT/.venv"
|
29
|
-
source "$PROJECT_ROOT/.venv/bin/activate"
|
30
|
-
pip install -r "$PROJECT_ROOT/requirements.txt"
|
31
|
-
fi
|
32
|
-
|
33
|
-
# Copy config file if it doesn't exist
|
34
|
-
if [ ! -f "$PROJECT_ROOT/config.json" ]; then
|
35
|
-
echo "Copying default config..."
|
36
|
-
cp "$(dirname "${BASH_SOURCE[0]}")/config.json" "$PROJECT_ROOT/config.json"
|
37
|
-
fi
|
38
|
-
|
39
|
-
# Run the application
|
40
|
-
cd "$PROJECT_ROOT"
|
41
|
-
python -m uvicorn mcp_proxy_adapter.api.app:create_app --host 0.0.0.0 --port $HOST_PORT --reload
|
42
|
-
|
43
|
-
echo "MCP Proxy Adapter started on http://localhost:$HOST_PORT"
|