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.
Files changed (259) hide show
  1. mcp_proxy_adapter/api/app.py +174 -80
  2. mcp_proxy_adapter/api/handlers.py +16 -5
  3. mcp_proxy_adapter/api/middleware/__init__.py +7 -2
  4. mcp_proxy_adapter/api/middleware/command_permission_middleware.py +148 -0
  5. mcp_proxy_adapter/api/middleware/factory.py +36 -12
  6. mcp_proxy_adapter/api/middleware/unified_security.py +152 -0
  7. mcp_proxy_adapter/api/middleware/user_info_middleware.py +83 -0
  8. mcp_proxy_adapter/commands/__init__.py +7 -1
  9. mcp_proxy_adapter/commands/base.py +7 -4
  10. mcp_proxy_adapter/commands/builtin_commands.py +8 -2
  11. mcp_proxy_adapter/commands/command_registry.py +8 -0
  12. mcp_proxy_adapter/commands/echo_command.py +81 -0
  13. mcp_proxy_adapter/commands/help_command.py +21 -14
  14. mcp_proxy_adapter/commands/proxy_registration_command.py +326 -185
  15. mcp_proxy_adapter/commands/role_test_command.py +141 -0
  16. mcp_proxy_adapter/commands/security_command.py +488 -0
  17. mcp_proxy_adapter/commands/ssl_setup_command.py +2 -2
  18. mcp_proxy_adapter/commands/token_management_command.py +1 -1
  19. mcp_proxy_adapter/config.py +81 -21
  20. mcp_proxy_adapter/core/app_factory.py +326 -0
  21. mcp_proxy_adapter/core/client_security.py +384 -0
  22. mcp_proxy_adapter/core/logging.py +8 -3
  23. mcp_proxy_adapter/core/mtls_asgi.py +156 -0
  24. mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
  25. mcp_proxy_adapter/core/protocol_manager.py +9 -0
  26. mcp_proxy_adapter/core/proxy_client.py +602 -0
  27. mcp_proxy_adapter/core/proxy_registration.py +299 -47
  28. mcp_proxy_adapter/core/security_adapter.py +12 -15
  29. mcp_proxy_adapter/core/security_integration.py +277 -0
  30. mcp_proxy_adapter/core/server_adapter.py +345 -0
  31. mcp_proxy_adapter/core/server_engine.py +364 -0
  32. mcp_proxy_adapter/core/unified_config_adapter.py +579 -0
  33. mcp_proxy_adapter/examples/README.md +230 -97
  34. mcp_proxy_adapter/examples/README_EN.md +258 -0
  35. mcp_proxy_adapter/examples/SECURITY_TESTING.md +455 -0
  36. mcp_proxy_adapter/examples/__pycache__/security_configurations.cpython-312.pyc +0 -0
  37. mcp_proxy_adapter/examples/__pycache__/security_test_client.cpython-312.pyc +0 -0
  38. mcp_proxy_adapter/examples/basic_framework/configs/http_auth.json +37 -0
  39. mcp_proxy_adapter/examples/basic_framework/configs/http_simple.json +23 -0
  40. mcp_proxy_adapter/examples/basic_framework/configs/https_auth.json +39 -0
  41. mcp_proxy_adapter/examples/basic_framework/configs/https_simple.json +25 -0
  42. mcp_proxy_adapter/examples/basic_framework/configs/mtls_no_roles.json +39 -0
  43. mcp_proxy_adapter/examples/basic_framework/configs/mtls_with_roles.json +45 -0
  44. mcp_proxy_adapter/examples/basic_framework/main.py +63 -0
  45. mcp_proxy_adapter/examples/basic_framework/roles.json +21 -0
  46. mcp_proxy_adapter/examples/cert_config.json +9 -0
  47. mcp_proxy_adapter/examples/certs/admin.crt +32 -0
  48. mcp_proxy_adapter/examples/certs/admin.key +52 -0
  49. mcp_proxy_adapter/examples/certs/admin_cert.pem +21 -0
  50. mcp_proxy_adapter/examples/certs/admin_key.pem +28 -0
  51. mcp_proxy_adapter/examples/certs/ca_cert.pem +23 -0
  52. mcp_proxy_adapter/examples/certs/ca_cert.srl +1 -0
  53. mcp_proxy_adapter/examples/certs/ca_key.pem +28 -0
  54. mcp_proxy_adapter/examples/certs/cert_config.json +9 -0
  55. mcp_proxy_adapter/examples/certs/client.crt +32 -0
  56. mcp_proxy_adapter/examples/certs/client.key +52 -0
  57. mcp_proxy_adapter/examples/certs/client_admin.crt +32 -0
  58. mcp_proxy_adapter/examples/certs/client_admin.key +52 -0
  59. mcp_proxy_adapter/examples/certs/client_user.crt +32 -0
  60. mcp_proxy_adapter/examples/certs/client_user.key +52 -0
  61. mcp_proxy_adapter/examples/certs/guest_cert.pem +21 -0
  62. mcp_proxy_adapter/examples/certs/guest_key.pem +28 -0
  63. mcp_proxy_adapter/examples/certs/mcp_proxy_adapter_ca_ca.crt +23 -0
  64. mcp_proxy_adapter/examples/certs/proxy_cert.pem +21 -0
  65. mcp_proxy_adapter/examples/certs/proxy_key.pem +28 -0
  66. mcp_proxy_adapter/examples/certs/readonly.crt +32 -0
  67. mcp_proxy_adapter/examples/certs/readonly.key +52 -0
  68. mcp_proxy_adapter/examples/certs/readonly_cert.pem +21 -0
  69. mcp_proxy_adapter/examples/certs/readonly_key.pem +28 -0
  70. mcp_proxy_adapter/examples/certs/server.crt +32 -0
  71. mcp_proxy_adapter/examples/certs/server.key +52 -0
  72. mcp_proxy_adapter/examples/certs/server_cert.pem +32 -0
  73. mcp_proxy_adapter/examples/certs/server_key.pem +52 -0
  74. mcp_proxy_adapter/examples/certs/test_ca_ca.crt +20 -0
  75. mcp_proxy_adapter/examples/certs/user.crt +32 -0
  76. mcp_proxy_adapter/examples/certs/user.key +52 -0
  77. mcp_proxy_adapter/examples/certs/user_cert.pem +21 -0
  78. mcp_proxy_adapter/examples/certs/user_key.pem +28 -0
  79. mcp_proxy_adapter/examples/client_configs/api_key_client.json +13 -0
  80. mcp_proxy_adapter/examples/client_configs/basic_auth_client.json +13 -0
  81. mcp_proxy_adapter/examples/client_configs/certificate_client.json +22 -0
  82. mcp_proxy_adapter/examples/client_configs/jwt_client.json +15 -0
  83. mcp_proxy_adapter/examples/client_configs/no_auth_client.json +9 -0
  84. mcp_proxy_adapter/examples/commands/__init__.py +1 -0
  85. mcp_proxy_adapter/examples/create_certificates_simple.py +307 -0
  86. mcp_proxy_adapter/examples/debug_request_state.py +144 -0
  87. mcp_proxy_adapter/examples/debug_role_chain.py +205 -0
  88. mcp_proxy_adapter/examples/demo_client.py +341 -0
  89. mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +99 -0
  90. mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +106 -0
  91. mcp_proxy_adapter/examples/full_application/configs/http_auth.json +37 -0
  92. mcp_proxy_adapter/examples/full_application/configs/http_simple.json +23 -0
  93. mcp_proxy_adapter/examples/full_application/configs/https_auth.json +39 -0
  94. mcp_proxy_adapter/examples/full_application/configs/https_simple.json +25 -0
  95. mcp_proxy_adapter/examples/full_application/configs/mtls_no_roles.json +39 -0
  96. mcp_proxy_adapter/examples/full_application/configs/mtls_with_roles.json +45 -0
  97. mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +97 -0
  98. mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +95 -0
  99. mcp_proxy_adapter/examples/full_application/main.py +138 -0
  100. mcp_proxy_adapter/examples/full_application/roles.json +21 -0
  101. mcp_proxy_adapter/examples/generate_all_certificates.py +429 -0
  102. mcp_proxy_adapter/examples/generate_certificates.py +121 -0
  103. mcp_proxy_adapter/examples/keys/ca_key.pem +28 -0
  104. mcp_proxy_adapter/examples/keys/mcp_proxy_adapter_ca_ca.key +28 -0
  105. mcp_proxy_adapter/examples/keys/test_ca_ca.key +28 -0
  106. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log +220 -0
  107. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.1 +1 -0
  108. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.2 +1 -0
  109. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.3 +1 -0
  110. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.4 +1 -0
  111. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.5 +1 -0
  112. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log +220 -0
  113. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.1 +1 -0
  114. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.2 +1 -0
  115. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.3 +1 -0
  116. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.4 +1 -0
  117. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.5 +1 -0
  118. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log +2 -0
  119. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.1 +1 -0
  120. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.2 +1 -0
  121. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.3 +1 -0
  122. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.4 +1 -0
  123. mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.5 +1 -0
  124. mcp_proxy_adapter/examples/proxy_registration_example.py +401 -0
  125. mcp_proxy_adapter/examples/roles.json +38 -0
  126. mcp_proxy_adapter/examples/run_example.py +81 -0
  127. mcp_proxy_adapter/examples/run_security_tests.py +326 -0
  128. mcp_proxy_adapter/examples/run_security_tests_fixed.py +300 -0
  129. mcp_proxy_adapter/examples/security_test_client.py +743 -0
  130. mcp_proxy_adapter/examples/server_configs/config_basic_http.json +204 -0
  131. mcp_proxy_adapter/examples/server_configs/config_http_token.json +238 -0
  132. mcp_proxy_adapter/examples/server_configs/config_https.json +215 -0
  133. mcp_proxy_adapter/examples/server_configs/config_https_token.json +231 -0
  134. mcp_proxy_adapter/examples/server_configs/config_mtls.json +215 -0
  135. mcp_proxy_adapter/examples/server_configs/config_proxy_registration.json +250 -0
  136. mcp_proxy_adapter/examples/server_configs/config_simple.json +46 -0
  137. mcp_proxy_adapter/examples/server_configs/roles.json +38 -0
  138. mcp_proxy_adapter/examples/test_examples.py +344 -0
  139. mcp_proxy_adapter/examples/universal_client.py +628 -0
  140. mcp_proxy_adapter/main.py +21 -10
  141. mcp_proxy_adapter/utils/config_generator.py +639 -0
  142. mcp_proxy_adapter/version.py +2 -1
  143. mcp_proxy_adapter-6.1.0.dist-info/METADATA +205 -0
  144. mcp_proxy_adapter-6.1.0.dist-info/RECORD +193 -0
  145. mcp_proxy_adapter-6.1.0.dist-info/entry_points.txt +2 -0
  146. {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.1.0.dist-info}/licenses/LICENSE +2 -2
  147. mcp_proxy_adapter/api/middleware/auth.py +0 -146
  148. mcp_proxy_adapter/api/middleware/auth_adapter.py +0 -235
  149. mcp_proxy_adapter/api/middleware/mtls_adapter.py +0 -305
  150. mcp_proxy_adapter/api/middleware/mtls_middleware.py +0 -296
  151. mcp_proxy_adapter/api/middleware/rate_limit.py +0 -152
  152. mcp_proxy_adapter/api/middleware/rate_limit_adapter.py +0 -241
  153. mcp_proxy_adapter/api/middleware/roles_adapter.py +0 -365
  154. mcp_proxy_adapter/api/middleware/roles_middleware.py +0 -381
  155. mcp_proxy_adapter/api/middleware/security.py +0 -376
  156. mcp_proxy_adapter/api/middleware/token_auth_middleware.py +0 -261
  157. mcp_proxy_adapter/examples/__init__.py +0 -7
  158. mcp_proxy_adapter/examples/basic_server/README.md +0 -60
  159. mcp_proxy_adapter/examples/basic_server/__init__.py +0 -7
  160. mcp_proxy_adapter/examples/basic_server/basic_custom_settings.json +0 -39
  161. mcp_proxy_adapter/examples/basic_server/config.json +0 -70
  162. mcp_proxy_adapter/examples/basic_server/config_all_protocols.json +0 -54
  163. mcp_proxy_adapter/examples/basic_server/config_http.json +0 -70
  164. mcp_proxy_adapter/examples/basic_server/config_http_only.json +0 -52
  165. mcp_proxy_adapter/examples/basic_server/config_https.json +0 -58
  166. mcp_proxy_adapter/examples/basic_server/config_mtls.json +0 -58
  167. mcp_proxy_adapter/examples/basic_server/config_ssl.json +0 -46
  168. mcp_proxy_adapter/examples/basic_server/custom_settings_example.py +0 -238
  169. mcp_proxy_adapter/examples/basic_server/server.py +0 -114
  170. mcp_proxy_adapter/examples/custom_commands/README.md +0 -127
  171. mcp_proxy_adapter/examples/custom_commands/__init__.py +0 -27
  172. mcp_proxy_adapter/examples/custom_commands/advanced_hooks.py +0 -566
  173. mcp_proxy_adapter/examples/custom_commands/auto_commands/__init__.py +0 -6
  174. mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_echo_command.py +0 -103
  175. mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_info_command.py +0 -111
  176. mcp_proxy_adapter/examples/custom_commands/auto_commands/test_command.py +0 -105
  177. mcp_proxy_adapter/examples/custom_commands/catalog/commands/test_command.py +0 -129
  178. mcp_proxy_adapter/examples/custom_commands/config.json +0 -118
  179. mcp_proxy_adapter/examples/custom_commands/config_all_protocols.json +0 -46
  180. mcp_proxy_adapter/examples/custom_commands/config_https_only.json +0 -46
  181. mcp_proxy_adapter/examples/custom_commands/config_https_transport.json +0 -33
  182. mcp_proxy_adapter/examples/custom_commands/config_mtls_only.json +0 -46
  183. mcp_proxy_adapter/examples/custom_commands/config_mtls_transport.json +0 -33
  184. mcp_proxy_adapter/examples/custom_commands/config_single_transport.json +0 -33
  185. mcp_proxy_adapter/examples/custom_commands/custom_health_command.py +0 -169
  186. mcp_proxy_adapter/examples/custom_commands/custom_help_command.py +0 -215
  187. mcp_proxy_adapter/examples/custom_commands/custom_openapi_generator.py +0 -76
  188. mcp_proxy_adapter/examples/custom_commands/custom_settings.json +0 -96
  189. mcp_proxy_adapter/examples/custom_commands/custom_settings_manager.py +0 -241
  190. mcp_proxy_adapter/examples/custom_commands/data_transform_command.py +0 -135
  191. mcp_proxy_adapter/examples/custom_commands/echo_command.py +0 -122
  192. mcp_proxy_adapter/examples/custom_commands/full_help_response.json +0 -1
  193. mcp_proxy_adapter/examples/custom_commands/generated_openapi.json +0 -629
  194. mcp_proxy_adapter/examples/custom_commands/get_openapi.py +0 -103
  195. mcp_proxy_adapter/examples/custom_commands/hooks.py +0 -230
  196. mcp_proxy_adapter/examples/custom_commands/intercept_command.py +0 -123
  197. mcp_proxy_adapter/examples/custom_commands/loadable_commands/test_ignored.py +0 -129
  198. mcp_proxy_adapter/examples/custom_commands/manual_echo_command.py +0 -103
  199. mcp_proxy_adapter/examples/custom_commands/proxy_connection_manager.py +0 -278
  200. mcp_proxy_adapter/examples/custom_commands/server.py +0 -252
  201. mcp_proxy_adapter/examples/custom_commands/simple_openapi_server.py +0 -75
  202. mcp_proxy_adapter/examples/custom_commands/start_server_with_proxy_manager.py +0 -299
  203. mcp_proxy_adapter/examples/custom_commands/start_server_with_registration.py +0 -278
  204. mcp_proxy_adapter/examples/custom_commands/test_hooks.py +0 -176
  205. mcp_proxy_adapter/examples/custom_commands/test_openapi.py +0 -27
  206. mcp_proxy_adapter/examples/custom_commands/test_registry.py +0 -23
  207. mcp_proxy_adapter/examples/custom_commands/test_simple.py +0 -19
  208. mcp_proxy_adapter/examples/custom_project_example/README.md +0 -103
  209. mcp_proxy_adapter/examples/custom_project_example/README_EN.md +0 -103
  210. mcp_proxy_adapter/examples/deployment/README.md +0 -49
  211. mcp_proxy_adapter/examples/deployment/__init__.py +0 -7
  212. mcp_proxy_adapter/examples/deployment/config.development.json +0 -8
  213. mcp_proxy_adapter/examples/deployment/config.json +0 -29
  214. mcp_proxy_adapter/examples/deployment/config.production.json +0 -12
  215. mcp_proxy_adapter/examples/deployment/config.staging.json +0 -11
  216. mcp_proxy_adapter/examples/deployment/docker-compose.yml +0 -31
  217. mcp_proxy_adapter/examples/deployment/run.sh +0 -43
  218. mcp_proxy_adapter/examples/deployment/run_docker.sh +0 -84
  219. mcp_proxy_adapter/examples/simple_custom_commands/README.md +0 -149
  220. mcp_proxy_adapter/examples/simple_custom_commands/README_EN.md +0 -149
  221. mcp_proxy_adapter/schemas/base_schema.json +0 -114
  222. mcp_proxy_adapter/schemas/openapi_schema.json +0 -314
  223. mcp_proxy_adapter/schemas/roles_schema.json +0 -162
  224. mcp_proxy_adapter/tests/__init__.py +0 -0
  225. mcp_proxy_adapter/tests/api/__init__.py +0 -3
  226. mcp_proxy_adapter/tests/api/test_cmd_endpoint.py +0 -115
  227. mcp_proxy_adapter/tests/api/test_custom_openapi.py +0 -617
  228. mcp_proxy_adapter/tests/api/test_handlers.py +0 -522
  229. mcp_proxy_adapter/tests/api/test_middleware.py +0 -340
  230. mcp_proxy_adapter/tests/api/test_schemas.py +0 -546
  231. mcp_proxy_adapter/tests/api/test_tool_integration.py +0 -531
  232. mcp_proxy_adapter/tests/commands/__init__.py +0 -3
  233. mcp_proxy_adapter/tests/commands/test_config_command.py +0 -211
  234. mcp_proxy_adapter/tests/commands/test_echo_command.py +0 -127
  235. mcp_proxy_adapter/tests/commands/test_help_command.py +0 -136
  236. mcp_proxy_adapter/tests/conftest.py +0 -131
  237. mcp_proxy_adapter/tests/functional/__init__.py +0 -3
  238. mcp_proxy_adapter/tests/functional/test_api.py +0 -253
  239. mcp_proxy_adapter/tests/integration/__init__.py +0 -3
  240. mcp_proxy_adapter/tests/integration/test_cmd_integration.py +0 -129
  241. mcp_proxy_adapter/tests/integration/test_integration.py +0 -255
  242. mcp_proxy_adapter/tests/performance/__init__.py +0 -3
  243. mcp_proxy_adapter/tests/performance/test_performance.py +0 -189
  244. mcp_proxy_adapter/tests/stubs/__init__.py +0 -10
  245. mcp_proxy_adapter/tests/stubs/echo_command.py +0 -104
  246. mcp_proxy_adapter/tests/test_api_endpoints.py +0 -271
  247. mcp_proxy_adapter/tests/test_api_handlers.py +0 -289
  248. mcp_proxy_adapter/tests/test_base_command.py +0 -123
  249. mcp_proxy_adapter/tests/test_batch_requests.py +0 -117
  250. mcp_proxy_adapter/tests/test_command_registry.py +0 -281
  251. mcp_proxy_adapter/tests/test_config.py +0 -127
  252. mcp_proxy_adapter/tests/test_utils.py +0 -65
  253. mcp_proxy_adapter/tests/unit/__init__.py +0 -3
  254. mcp_proxy_adapter/tests/unit/test_base_command.py +0 -436
  255. mcp_proxy_adapter/tests/unit/test_config.py +0 -270
  256. mcp_proxy_adapter-6.0.0.dist-info/METADATA +0 -201
  257. mcp_proxy_adapter-6.0.0.dist-info/RECORD +0 -179
  258. {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.1.0.dist-info}/WHEEL +0 -0
  259. {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,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"