mcp-proxy-adapter 4.1.1__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.
Files changed (253) hide show
  1. mcp_proxy_adapter/__main__.py +12 -0
  2. mcp_proxy_adapter/api/app.py +254 -33
  3. mcp_proxy_adapter/api/handlers.py +32 -6
  4. mcp_proxy_adapter/api/middleware/__init__.py +36 -30
  5. mcp_proxy_adapter/api/middleware/command_permission_middleware.py +148 -0
  6. mcp_proxy_adapter/api/middleware/error_handling.py +9 -0
  7. mcp_proxy_adapter/api/middleware/factory.py +243 -0
  8. mcp_proxy_adapter/api/middleware/logging.py +32 -6
  9. mcp_proxy_adapter/api/middleware/protocol_middleware.py +135 -0
  10. mcp_proxy_adapter/api/middleware/transport_middleware.py +122 -0
  11. mcp_proxy_adapter/api/middleware/unified_security.py +152 -0
  12. mcp_proxy_adapter/api/middleware/user_info_middleware.py +83 -0
  13. mcp_proxy_adapter/commands/__init__.py +19 -4
  14. mcp_proxy_adapter/commands/auth_validation_command.py +408 -0
  15. mcp_proxy_adapter/commands/base.py +66 -32
  16. mcp_proxy_adapter/commands/builtin_commands.py +95 -0
  17. mcp_proxy_adapter/commands/catalog_manager.py +838 -0
  18. mcp_proxy_adapter/commands/cert_monitor_command.py +620 -0
  19. mcp_proxy_adapter/commands/certificate_management_command.py +608 -0
  20. mcp_proxy_adapter/commands/command_registry.py +711 -354
  21. mcp_proxy_adapter/commands/dependency_manager.py +245 -0
  22. mcp_proxy_adapter/commands/echo_command.py +81 -0
  23. mcp_proxy_adapter/commands/health_command.py +7 -0
  24. mcp_proxy_adapter/commands/help_command.py +21 -14
  25. mcp_proxy_adapter/commands/hooks.py +200 -167
  26. mcp_proxy_adapter/commands/key_management_command.py +506 -0
  27. mcp_proxy_adapter/commands/load_command.py +176 -0
  28. mcp_proxy_adapter/commands/plugins_command.py +235 -0
  29. mcp_proxy_adapter/commands/protocol_management_command.py +232 -0
  30. mcp_proxy_adapter/commands/proxy_registration_command.py +409 -0
  31. mcp_proxy_adapter/commands/reload_command.py +48 -50
  32. mcp_proxy_adapter/commands/result.py +1 -0
  33. mcp_proxy_adapter/commands/role_test_command.py +141 -0
  34. mcp_proxy_adapter/commands/roles_management_command.py +697 -0
  35. mcp_proxy_adapter/commands/security_command.py +488 -0
  36. mcp_proxy_adapter/commands/ssl_setup_command.py +483 -0
  37. mcp_proxy_adapter/commands/token_management_command.py +529 -0
  38. mcp_proxy_adapter/commands/transport_management_command.py +144 -0
  39. mcp_proxy_adapter/commands/unload_command.py +158 -0
  40. mcp_proxy_adapter/config.py +159 -2
  41. mcp_proxy_adapter/core/app_factory.py +326 -0
  42. mcp_proxy_adapter/core/auth_validator.py +606 -0
  43. mcp_proxy_adapter/core/certificate_utils.py +827 -0
  44. mcp_proxy_adapter/core/client_security.py +384 -0
  45. mcp_proxy_adapter/core/config_converter.py +405 -0
  46. mcp_proxy_adapter/core/config_validator.py +218 -0
  47. mcp_proxy_adapter/core/logging.py +19 -3
  48. mcp_proxy_adapter/core/mtls_asgi.py +156 -0
  49. mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
  50. mcp_proxy_adapter/core/protocol_manager.py +235 -0
  51. mcp_proxy_adapter/core/proxy_client.py +602 -0
  52. mcp_proxy_adapter/core/proxy_registration.py +522 -0
  53. mcp_proxy_adapter/core/role_utils.py +426 -0
  54. mcp_proxy_adapter/core/security_adapter.py +370 -0
  55. mcp_proxy_adapter/core/security_factory.py +239 -0
  56. mcp_proxy_adapter/core/security_integration.py +277 -0
  57. mcp_proxy_adapter/core/server_adapter.py +345 -0
  58. mcp_proxy_adapter/core/server_engine.py +364 -0
  59. mcp_proxy_adapter/core/settings.py +1 -0
  60. mcp_proxy_adapter/core/ssl_utils.py +233 -0
  61. mcp_proxy_adapter/core/transport_manager.py +292 -0
  62. mcp_proxy_adapter/core/unified_config_adapter.py +579 -0
  63. mcp_proxy_adapter/custom_openapi.py +22 -11
  64. mcp_proxy_adapter/examples/README.md +230 -97
  65. mcp_proxy_adapter/examples/README_EN.md +258 -0
  66. mcp_proxy_adapter/examples/SECURITY_TESTING.md +455 -0
  67. mcp_proxy_adapter/examples/__pycache__/security_configurations.cpython-312.pyc +0 -0
  68. mcp_proxy_adapter/examples/__pycache__/security_test_client.cpython-312.pyc +0 -0
  69. mcp_proxy_adapter/examples/basic_framework/configs/http_auth.json +37 -0
  70. mcp_proxy_adapter/examples/basic_framework/configs/http_simple.json +23 -0
  71. mcp_proxy_adapter/examples/basic_framework/configs/https_auth.json +39 -0
  72. mcp_proxy_adapter/examples/basic_framework/configs/https_simple.json +25 -0
  73. mcp_proxy_adapter/examples/basic_framework/configs/mtls_no_roles.json +39 -0
  74. mcp_proxy_adapter/examples/basic_framework/configs/mtls_with_roles.json +45 -0
  75. mcp_proxy_adapter/examples/basic_framework/main.py +63 -0
  76. mcp_proxy_adapter/examples/basic_framework/roles.json +21 -0
  77. mcp_proxy_adapter/examples/cert_config.json +9 -0
  78. mcp_proxy_adapter/examples/certs/admin.crt +32 -0
  79. mcp_proxy_adapter/examples/certs/admin.key +52 -0
  80. mcp_proxy_adapter/examples/certs/admin_cert.pem +21 -0
  81. mcp_proxy_adapter/examples/certs/admin_key.pem +28 -0
  82. mcp_proxy_adapter/examples/certs/ca_cert.pem +23 -0
  83. mcp_proxy_adapter/examples/certs/ca_cert.srl +1 -0
  84. mcp_proxy_adapter/examples/certs/ca_key.pem +28 -0
  85. mcp_proxy_adapter/examples/certs/cert_config.json +9 -0
  86. mcp_proxy_adapter/examples/certs/client.crt +32 -0
  87. mcp_proxy_adapter/examples/certs/client.key +52 -0
  88. mcp_proxy_adapter/examples/certs/client_admin.crt +32 -0
  89. mcp_proxy_adapter/examples/certs/client_admin.key +52 -0
  90. mcp_proxy_adapter/examples/certs/client_user.crt +32 -0
  91. mcp_proxy_adapter/examples/certs/client_user.key +52 -0
  92. mcp_proxy_adapter/examples/certs/guest_cert.pem +21 -0
  93. mcp_proxy_adapter/examples/certs/guest_key.pem +28 -0
  94. mcp_proxy_adapter/examples/certs/mcp_proxy_adapter_ca_ca.crt +23 -0
  95. mcp_proxy_adapter/examples/certs/proxy_cert.pem +21 -0
  96. mcp_proxy_adapter/examples/certs/proxy_key.pem +28 -0
  97. mcp_proxy_adapter/examples/certs/readonly.crt +32 -0
  98. mcp_proxy_adapter/examples/certs/readonly.key +52 -0
  99. mcp_proxy_adapter/examples/certs/readonly_cert.pem +21 -0
  100. mcp_proxy_adapter/examples/certs/readonly_key.pem +28 -0
  101. mcp_proxy_adapter/examples/certs/server.crt +32 -0
  102. mcp_proxy_adapter/examples/certs/server.key +52 -0
  103. mcp_proxy_adapter/examples/certs/server_cert.pem +32 -0
  104. mcp_proxy_adapter/examples/certs/server_key.pem +52 -0
  105. mcp_proxy_adapter/examples/certs/test_ca_ca.crt +20 -0
  106. mcp_proxy_adapter/examples/certs/user.crt +32 -0
  107. mcp_proxy_adapter/examples/certs/user.key +52 -0
  108. mcp_proxy_adapter/examples/certs/user_cert.pem +21 -0
  109. mcp_proxy_adapter/examples/certs/user_key.pem +28 -0
  110. mcp_proxy_adapter/examples/client_configs/api_key_client.json +13 -0
  111. mcp_proxy_adapter/examples/client_configs/basic_auth_client.json +13 -0
  112. mcp_proxy_adapter/examples/client_configs/certificate_client.json +22 -0
  113. mcp_proxy_adapter/examples/client_configs/jwt_client.json +15 -0
  114. mcp_proxy_adapter/examples/client_configs/no_auth_client.json +9 -0
  115. mcp_proxy_adapter/examples/commands/__init__.py +1 -0
  116. mcp_proxy_adapter/examples/create_certificates_simple.py +307 -0
  117. mcp_proxy_adapter/examples/debug_request_state.py +144 -0
  118. mcp_proxy_adapter/examples/debug_role_chain.py +205 -0
  119. mcp_proxy_adapter/examples/demo_client.py +341 -0
  120. mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +99 -0
  121. mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +106 -0
  122. mcp_proxy_adapter/examples/full_application/configs/http_auth.json +37 -0
  123. mcp_proxy_adapter/examples/full_application/configs/http_simple.json +23 -0
  124. mcp_proxy_adapter/examples/full_application/configs/https_auth.json +39 -0
  125. mcp_proxy_adapter/examples/full_application/configs/https_simple.json +25 -0
  126. mcp_proxy_adapter/examples/full_application/configs/mtls_no_roles.json +39 -0
  127. mcp_proxy_adapter/examples/full_application/configs/mtls_with_roles.json +45 -0
  128. mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +97 -0
  129. mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +95 -0
  130. mcp_proxy_adapter/examples/full_application/main.py +138 -0
  131. mcp_proxy_adapter/examples/full_application/roles.json +21 -0
  132. mcp_proxy_adapter/examples/generate_all_certificates.py +429 -0
  133. mcp_proxy_adapter/examples/generate_certificates.py +121 -0
  134. mcp_proxy_adapter/examples/keys/ca_key.pem +28 -0
  135. mcp_proxy_adapter/examples/keys/mcp_proxy_adapter_ca_ca.key +28 -0
  136. mcp_proxy_adapter/examples/keys/test_ca_ca.key +28 -0
  137. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log +220 -0
  138. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.1 +1 -0
  139. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.2 +1 -0
  140. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.3 +1 -0
  141. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.4 +1 -0
  142. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.5 +1 -0
  143. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log +220 -0
  144. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.1 +1 -0
  145. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.2 +1 -0
  146. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.3 +1 -0
  147. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.4 +1 -0
  148. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.5 +1 -0
  149. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log +2 -0
  150. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.1 +1 -0
  151. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.2 +1 -0
  152. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.3 +1 -0
  153. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.4 +1 -0
  154. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.5 +1 -0
  155. mcp_proxy_adapter/examples/proxy_registration_example.py +401 -0
  156. mcp_proxy_adapter/examples/roles.json +38 -0
  157. mcp_proxy_adapter/examples/run_example.py +81 -0
  158. mcp_proxy_adapter/examples/run_security_tests.py +326 -0
  159. mcp_proxy_adapter/examples/run_security_tests_fixed.py +300 -0
  160. mcp_proxy_adapter/examples/security_test_client.py +743 -0
  161. mcp_proxy_adapter/examples/server_configs/config_basic_http.json +204 -0
  162. mcp_proxy_adapter/examples/server_configs/config_http_token.json +238 -0
  163. mcp_proxy_adapter/examples/server_configs/config_https.json +215 -0
  164. mcp_proxy_adapter/examples/server_configs/config_https_token.json +231 -0
  165. mcp_proxy_adapter/examples/server_configs/config_mtls.json +215 -0
  166. mcp_proxy_adapter/examples/server_configs/config_proxy_registration.json +250 -0
  167. mcp_proxy_adapter/examples/server_configs/config_simple.json +46 -0
  168. mcp_proxy_adapter/examples/server_configs/roles.json +38 -0
  169. mcp_proxy_adapter/examples/test_examples.py +344 -0
  170. mcp_proxy_adapter/examples/universal_client.py +628 -0
  171. mcp_proxy_adapter/main.py +186 -0
  172. mcp_proxy_adapter/utils/config_generator.py +639 -0
  173. mcp_proxy_adapter/version.py +2 -1
  174. mcp_proxy_adapter-6.1.0.dist-info/METADATA +205 -0
  175. mcp_proxy_adapter-6.1.0.dist-info/RECORD +193 -0
  176. mcp_proxy_adapter-6.1.0.dist-info/entry_points.txt +2 -0
  177. {mcp_proxy_adapter-4.1.1.dist-info → mcp_proxy_adapter-6.1.0.dist-info}/licenses/LICENSE +2 -2
  178. mcp_proxy_adapter/api/middleware/auth.py +0 -146
  179. mcp_proxy_adapter/api/middleware/rate_limit.py +0 -152
  180. mcp_proxy_adapter/commands/reload_settings_command.py +0 -125
  181. mcp_proxy_adapter/examples/__init__.py +0 -7
  182. mcp_proxy_adapter/examples/basic_server/README.md +0 -60
  183. mcp_proxy_adapter/examples/basic_server/__init__.py +0 -7
  184. mcp_proxy_adapter/examples/basic_server/basic_custom_settings.json +0 -39
  185. mcp_proxy_adapter/examples/basic_server/config.json +0 -35
  186. mcp_proxy_adapter/examples/basic_server/custom_settings_example.py +0 -238
  187. mcp_proxy_adapter/examples/basic_server/server.py +0 -103
  188. mcp_proxy_adapter/examples/custom_commands/README.md +0 -127
  189. mcp_proxy_adapter/examples/custom_commands/__init__.py +0 -27
  190. mcp_proxy_adapter/examples/custom_commands/advanced_hooks.py +0 -250
  191. mcp_proxy_adapter/examples/custom_commands/auto_commands/__init__.py +0 -6
  192. mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_echo_command.py +0 -103
  193. mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_info_command.py +0 -111
  194. mcp_proxy_adapter/examples/custom_commands/config.json +0 -35
  195. mcp_proxy_adapter/examples/custom_commands/custom_health_command.py +0 -169
  196. mcp_proxy_adapter/examples/custom_commands/custom_help_command.py +0 -215
  197. mcp_proxy_adapter/examples/custom_commands/custom_openapi_generator.py +0 -76
  198. mcp_proxy_adapter/examples/custom_commands/custom_settings.json +0 -96
  199. mcp_proxy_adapter/examples/custom_commands/custom_settings_manager.py +0 -241
  200. mcp_proxy_adapter/examples/custom_commands/data_transform_command.py +0 -135
  201. mcp_proxy_adapter/examples/custom_commands/echo_command.py +0 -122
  202. mcp_proxy_adapter/examples/custom_commands/hooks.py +0 -230
  203. mcp_proxy_adapter/examples/custom_commands/intercept_command.py +0 -123
  204. mcp_proxy_adapter/examples/custom_commands/manual_echo_command.py +0 -103
  205. mcp_proxy_adapter/examples/custom_commands/server.py +0 -228
  206. mcp_proxy_adapter/examples/custom_commands/test_hooks.py +0 -176
  207. mcp_proxy_adapter/examples/deployment/README.md +0 -49
  208. mcp_proxy_adapter/examples/deployment/__init__.py +0 -7
  209. mcp_proxy_adapter/examples/deployment/config.development.json +0 -8
  210. mcp_proxy_adapter/examples/deployment/config.json +0 -29
  211. mcp_proxy_adapter/examples/deployment/config.production.json +0 -12
  212. mcp_proxy_adapter/examples/deployment/config.staging.json +0 -11
  213. mcp_proxy_adapter/examples/deployment/docker-compose.yml +0 -31
  214. mcp_proxy_adapter/examples/deployment/run.sh +0 -43
  215. mcp_proxy_adapter/examples/deployment/run_docker.sh +0 -84
  216. mcp_proxy_adapter/schemas/base_schema.json +0 -114
  217. mcp_proxy_adapter/schemas/openapi_schema.json +0 -314
  218. mcp_proxy_adapter/tests/__init__.py +0 -0
  219. mcp_proxy_adapter/tests/api/__init__.py +0 -3
  220. mcp_proxy_adapter/tests/api/test_cmd_endpoint.py +0 -115
  221. mcp_proxy_adapter/tests/api/test_custom_openapi.py +0 -617
  222. mcp_proxy_adapter/tests/api/test_handlers.py +0 -522
  223. mcp_proxy_adapter/tests/api/test_middleware.py +0 -340
  224. mcp_proxy_adapter/tests/api/test_schemas.py +0 -546
  225. mcp_proxy_adapter/tests/api/test_tool_integration.py +0 -531
  226. mcp_proxy_adapter/tests/commands/__init__.py +0 -3
  227. mcp_proxy_adapter/tests/commands/test_config_command.py +0 -211
  228. mcp_proxy_adapter/tests/commands/test_echo_command.py +0 -127
  229. mcp_proxy_adapter/tests/commands/test_help_command.py +0 -136
  230. mcp_proxy_adapter/tests/conftest.py +0 -131
  231. mcp_proxy_adapter/tests/functional/__init__.py +0 -3
  232. mcp_proxy_adapter/tests/functional/test_api.py +0 -253
  233. mcp_proxy_adapter/tests/integration/__init__.py +0 -3
  234. mcp_proxy_adapter/tests/integration/test_cmd_integration.py +0 -129
  235. mcp_proxy_adapter/tests/integration/test_integration.py +0 -255
  236. mcp_proxy_adapter/tests/performance/__init__.py +0 -3
  237. mcp_proxy_adapter/tests/performance/test_performance.py +0 -189
  238. mcp_proxy_adapter/tests/stubs/__init__.py +0 -10
  239. mcp_proxy_adapter/tests/stubs/echo_command.py +0 -104
  240. mcp_proxy_adapter/tests/test_api_endpoints.py +0 -271
  241. mcp_proxy_adapter/tests/test_api_handlers.py +0 -289
  242. mcp_proxy_adapter/tests/test_base_command.py +0 -123
  243. mcp_proxy_adapter/tests/test_batch_requests.py +0 -117
  244. mcp_proxy_adapter/tests/test_command_registry.py +0 -281
  245. mcp_proxy_adapter/tests/test_config.py +0 -127
  246. mcp_proxy_adapter/tests/test_utils.py +0 -65
  247. mcp_proxy_adapter/tests/unit/__init__.py +0 -3
  248. mcp_proxy_adapter/tests/unit/test_base_command.py +0 -436
  249. mcp_proxy_adapter/tests/unit/test_config.py +0 -217
  250. mcp_proxy_adapter-4.1.1.dist-info/METADATA +0 -200
  251. mcp_proxy_adapter-4.1.1.dist-info/RECORD +0 -110
  252. {mcp_proxy_adapter-4.1.1.dist-info → mcp_proxy_adapter-6.1.0.dist-info}/WHEEL +0 -0
  253. {mcp_proxy_adapter-4.1.1.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,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,7 +0,0 @@
1
- """
2
- Deployment Examples
3
-
4
- This package contains deployment examples for the MCP Proxy Adapter framework.
5
- """
6
-
7
- __version__ = "1.0.0"
@@ -1,8 +0,0 @@
1
- {
2
- "host": "0.0.0.0",
3
- "port": 8000,
4
- "log_level": "DEBUG",
5
- "log_file": "logs/mcp_proxy.log",
6
- "cors_origins": ["*"],
7
- "api_keys": ["dev-api-key"]
8
- }
@@ -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"
@@ -1,84 +0,0 @@
1
- #!/bin/bash
2
-
3
- # MCP Proxy Adapter - Docker Deployment Script
4
- # This script runs the framework in Docker
5
-
6
- # Function to extract value from JSON config
7
- function get_json_value {
8
- local json_file=$1
9
- local json_path=$2
10
-
11
- python3 -c "
12
- import json
13
- with open('$json_file', 'r') as f:
14
- config = json.load(f)
15
- path = '$json_path'.split('.')
16
- result = config
17
- for key in path:
18
- result = result.get(key, {})
19
- print(result)
20
- "
21
- }
22
-
23
- # Get project root directory
24
- PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
25
- CONFIG_FILE="$PROJECT_ROOT/config.json"
26
-
27
- # Check if config.json exists, copy from examples if not
28
- if [ ! -f "$CONFIG_FILE" ]; then
29
- echo "Config file not found, copying from examples..."
30
- cp "$(dirname "${BASH_SOURCE[0]}")/config.json" "$CONFIG_FILE"
31
- fi
32
-
33
- # Create necessary directories
34
- mkdir -p "$PROJECT_ROOT/logs" "$PROJECT_ROOT/data" "$PROJECT_ROOT/cache"
35
-
36
- # Extract values from configuration
37
- CONTAINER_NAME=$(get_json_value "$CONFIG_FILE" "docker.container_name")
38
- SERVICE_PORT=$(get_json_value "$CONFIG_FILE" "server.port")
39
- USER_ID=$(id -u)
40
- GROUP_ID=$(id -g)
41
-
42
- # Use default values if not defined in config
43
- CONTAINER_NAME=${CONTAINER_NAME:-mcp-proxy-adapter}
44
- SERVICE_PORT=${SERVICE_PORT:-8000}
45
- HOST_PORT=${SERVICE_PORT}
46
-
47
- echo "Using configuration:"
48
- echo " Container name: $CONTAINER_NAME"
49
- echo " Port mapping: 127.0.0.1:$HOST_PORT -> $SERVICE_PORT"
50
- echo " User/Group: $USER_ID:$GROUP_ID"
51
-
52
- # Export variables for docker-compose
53
- export CONTAINER_NAME=$CONTAINER_NAME
54
- export SERVICE_PORT=$SERVICE_PORT
55
- export HOST_PORT=$HOST_PORT
56
- export USER_ID=$USER_ID
57
- export GROUP_ID=$GROUP_ID
58
-
59
- # Stop container if it already exists
60
- docker-compose -f "$(dirname "${BASH_SOURCE[0]}")/docker-compose.yml" down
61
-
62
- # Start container
63
- docker-compose -f "$(dirname "${BASH_SOURCE[0]}")/docker-compose.yml" up -d
64
-
65
- # Check if we need to connect to additional network
66
- NETWORK=$(get_json_value "$CONFIG_FILE" "docker.network")
67
- if [ ! -z "$NETWORK" ] && [ "$NETWORK" != "{}" ]; then
68
- echo "Connecting to network: $NETWORK"
69
- # Check if network exists
70
- if docker network inspect "$NETWORK" &>/dev/null; then
71
- # Connect container to network if not already connected
72
- if ! docker network inspect "$NETWORK" | grep -q "$CONTAINER_NAME"; then
73
- docker network connect "$NETWORK" "$CONTAINER_NAME"
74
- echo "Container connected to network: $NETWORK"
75
- else
76
- echo "Container already connected to network: $NETWORK"
77
- fi
78
- else
79
- echo "Warning: Network $NETWORK does not exist"
80
- fi
81
- fi
82
-
83
- echo "Container started. Use the following command to check logs:"
84
- echo " docker logs $CONTAINER_NAME"
@@ -1,114 +0,0 @@
1
- {
2
- "$schema": "http://json-schema.org/draft-07/schema#",
3
- "title": "Base Schema",
4
- "description": "Basic schema for validating commands and results",
5
- "definitions": {
6
- "command": {
7
- "type": "object",
8
- "properties": {
9
- "jsonrpc": {
10
- "type": "string",
11
- "enum": ["2.0"],
12
- "description": "JSON-RPC version"
13
- },
14
- "method": {
15
- "type": "string",
16
- "description": "Command name"
17
- },
18
- "params": {
19
- "type": "object",
20
- "description": "Command parameters"
21
- },
22
- "id": {
23
- "oneOf": [
24
- {"type": "string"},
25
- {"type": "integer"},
26
- {"type": "null"}
27
- ],
28
- "description": "Request ID"
29
- }
30
- },
31
- "required": ["jsonrpc", "method"]
32
- },
33
- "success_response": {
34
- "type": "object",
35
- "properties": {
36
- "jsonrpc": {
37
- "type": "string",
38
- "enum": ["2.0"],
39
- "description": "JSON-RPC version"
40
- },
41
- "result": {
42
- "type": "object",
43
- "properties": {
44
- "success": {
45
- "type": "boolean",
46
- "enum": [true],
47
- "description": "Success flag"
48
- },
49
- "data": {
50
- "type": "object",
51
- "description": "Response data"
52
- },
53
- "message": {
54
- "type": "string",
55
- "description": "Response message"
56
- }
57
- },
58
- "required": ["success"]
59
- },
60
- "id": {
61
- "oneOf": [
62
- {"type": "string"},
63
- {"type": "integer"},
64
- {"type": "null"}
65
- ],
66
- "description": "Request ID"
67
- }
68
- },
69
- "required": ["jsonrpc", "result"]
70
- },
71
- "error_response": {
72
- "type": "object",
73
- "properties": {
74
- "jsonrpc": {
75
- "type": "string",
76
- "enum": ["2.0"],
77
- "description": "JSON-RPC version"
78
- },
79
- "error": {
80
- "type": "object",
81
- "properties": {
82
- "code": {
83
- "type": "integer",
84
- "description": "Error code"
85
- },
86
- "message": {
87
- "type": "string",
88
- "description": "Error message"
89
- },
90
- "details": {
91
- "type": "object",
92
- "description": "Detailed error information"
93
- }
94
- },
95
- "required": ["code", "message"]
96
- },
97
- "id": {
98
- "oneOf": [
99
- {"type": "string"},
100
- {"type": "integer"},
101
- {"type": "null"}
102
- ],
103
- "description": "Request ID"
104
- }
105
- },
106
- "required": ["jsonrpc", "error"]
107
- }
108
- },
109
- "oneOf": [
110
- {"$ref": "#/definitions/command"},
111
- {"$ref": "#/definitions/success_response"},
112
- {"$ref": "#/definitions/error_response"}
113
- ]
114
- }