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