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,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,149 +0,0 @@
1
- # Простой пример с пользовательскими командами
2
-
3
- Этот пример показывает, как настроить `discovery_path` в конфигурации для автоматического обнаружения команд из вашего проекта.
4
-
5
- ## Структура проекта
6
-
7
- ```
8
- simple_custom_commands/
9
- ├── config.json # Конфигурация с discovery_path
10
- ├── main.py # Точка входа
11
- ├── my_commands/ # Пакет с командами
12
- │ ├── __init__.py
13
- │ ├── hello_command.py
14
- │ └── calc_command.py
15
- └── README.md
16
- ```
17
-
18
- ## Конфигурация (config.json)
19
-
20
- ```json
21
- {
22
- "server": {
23
- "host": "127.0.0.1",
24
- "port": 8001,
25
- "debug": true,
26
- "log_level": "DEBUG"
27
- },
28
- "logging": {
29
- "level": "DEBUG",
30
- "log_dir": "./logs",
31
- "log_file": "simple_commands.log"
32
- },
33
- "commands": {
34
- "auto_discovery": true,
35
- "discovery_path": "my_commands"
36
- }
37
- }
38
- ```
39
-
40
- **Ключевой момент**: В `discovery_path` указан путь `"my_commands"` - это пакет, где находятся команды.
41
-
42
- ## Команды
43
-
44
- ### hello_command.py
45
-
46
- ```python
47
- from mcp_proxy_adapter.commands.base import Command
48
- from mcp_proxy_adapter.commands.result import CommandResult
49
-
50
- class HelloCommand(Command):
51
- """Простая команда приветствия."""
52
-
53
- name = "hello"
54
-
55
- def execute(self, name: str = "World") -> CommandResult:
56
- return CommandResult(
57
- success=True,
58
- data={"message": f"Hello, {name}!"}
59
- )
60
-
61
- @classmethod
62
- def get_param_info(cls) -> dict:
63
- return {
64
- "name": {
65
- "type": "string",
66
- "description": "Имя для приветствия",
67
- "required": False,
68
- "default": "World"
69
- }
70
- }
71
- ```
72
-
73
- ### calc_command.py
74
-
75
- ```python
76
- from mcp_proxy_adapter.commands.base import Command
77
- from mcp_proxy_adapter.commands.result import CommandResult
78
-
79
- class CalcCommand(Command):
80
- """Простая команда калькулятора."""
81
-
82
- name = "calc"
83
-
84
- def execute(self, a: float, b: float, operation: str = "add") -> CommandResult:
85
- if operation == "add":
86
- result = a + b
87
- elif operation == "sub":
88
- result = a - b
89
- elif operation == "mul":
90
- result = a * b
91
- elif operation == "div":
92
- if b == 0:
93
- return CommandResult(success=False, error="Division by zero")
94
- result = a / b
95
- else:
96
- return CommandResult(success=False, error=f"Unknown operation: {operation}")
97
-
98
- return CommandResult(
99
- success=True,
100
- data={"result": result, "operation": operation}
101
- )
102
-
103
- @classmethod
104
- def get_param_info(cls) -> dict:
105
- return {
106
- "a": {
107
- "type": "number",
108
- "description": "Первое число",
109
- "required": True
110
- },
111
- "b": {
112
- "type": "number",
113
- "description": "Второе число",
114
- "required": True
115
- },
116
- "operation": {
117
- "type": "string",
118
- "description": "Операция (add, sub, mul, div)",
119
- "required": False,
120
- "default": "add"
121
- }
122
- }
123
- ```
124
-
125
- ## Запуск
126
-
127
- ```bash
128
- python main.py
129
- ```
130
-
131
- При запуске сервис автоматически обнаружит команды из пакета `my_commands` благодаря настройке `discovery_path` в конфигурации.
132
-
133
- ## Тестирование
134
-
135
- ```bash
136
- # Приветствие
137
- curl -X POST http://127.0.0.1:8001/cmd \
138
- -H "Content-Type: application/json" \
139
- -d '{"command": "hello", "params": {"name": "Alice"}}'
140
-
141
- # Калькулятор
142
- curl -X POST http://127.0.0.1:8001/cmd \
143
- -H "Content-Type: application/json" \
144
- -d '{"command": "calc", "params": {"a": 10, "b": 5, "operation": "add"}}'
145
- ```
146
-
147
- ## Результат
148
-
149
- Сервис автоматически обнаружит и зарегистрирует команды `hello` и `calc` из пакета `my_commands`, указанного в `discovery_path`.
@@ -1,149 +0,0 @@
1
- # Simple Custom Commands Example
2
-
3
- This example shows how to configure `discovery_path` in the configuration for automatic discovery of commands from your project.
4
-
5
- ## Project Structure
6
-
7
- ```
8
- simple_custom_commands/
9
- ├── config.json # Configuration with discovery_path
10
- ├── main.py # Entry point
11
- ├── my_commands/ # Package with commands
12
- │ ├── __init__.py
13
- │ ├── hello_command.py
14
- │ └── calc_command.py
15
- └── README.md
16
- ```
17
-
18
- ## Configuration (config.json)
19
-
20
- ```json
21
- {
22
- "server": {
23
- "host": "127.0.0.1",
24
- "port": 8001,
25
- "debug": true,
26
- "log_level": "DEBUG"
27
- },
28
- "logging": {
29
- "level": "DEBUG",
30
- "log_dir": "./logs",
31
- "log_file": "simple_commands.log"
32
- },
33
- "commands": {
34
- "auto_discovery": true,
35
- "discovery_path": "my_commands"
36
- }
37
- }
38
- ```
39
-
40
- **Key point**: In `discovery_path` we specify `"my_commands"` - this is the package where commands are located.
41
-
42
- ## Commands
43
-
44
- ### hello_command.py
45
-
46
- ```python
47
- from mcp_proxy_adapter.commands.base import Command
48
- from mcp_proxy_adapter.commands.result import CommandResult
49
-
50
- class HelloCommand(Command):
51
- """Simple greeting command."""
52
-
53
- name = "hello"
54
-
55
- def execute(self, name: str = "World") -> CommandResult:
56
- return CommandResult(
57
- success=True,
58
- data={"message": f"Hello, {name}!"}
59
- )
60
-
61
- @classmethod
62
- def get_param_info(cls) -> dict:
63
- return {
64
- "name": {
65
- "type": "string",
66
- "description": "Name for greeting",
67
- "required": False,
68
- "default": "World"
69
- }
70
- }
71
- ```
72
-
73
- ### calc_command.py
74
-
75
- ```python
76
- from mcp_proxy_adapter.commands.base import Command
77
- from mcp_proxy_adapter.commands.result import CommandResult
78
-
79
- class CalcCommand(Command):
80
- """Simple calculator command."""
81
-
82
- name = "calc"
83
-
84
- def execute(self, a: float, b: float, operation: str = "add") -> CommandResult:
85
- if operation == "add":
86
- result = a + b
87
- elif operation == "sub":
88
- result = a - b
89
- elif operation == "mul":
90
- result = a * b
91
- elif operation == "div":
92
- if b == 0:
93
- return CommandResult(success=False, error="Division by zero")
94
- result = a / b
95
- else:
96
- return CommandResult(success=False, error=f"Unknown operation: {operation}")
97
-
98
- return CommandResult(
99
- success=True,
100
- data={"result": result, "operation": operation}
101
- )
102
-
103
- @classmethod
104
- def get_param_info(cls) -> dict:
105
- return {
106
- "a": {
107
- "type": "number",
108
- "description": "First number",
109
- "required": True
110
- },
111
- "b": {
112
- "type": "number",
113
- "description": "Second number",
114
- "required": True
115
- },
116
- "operation": {
117
- "type": "string",
118
- "description": "Operation (add, sub, mul, div)",
119
- "required": False,
120
- "default": "add"
121
- }
122
- }
123
- ```
124
-
125
- ## Running
126
-
127
- ```bash
128
- python main.py
129
- ```
130
-
131
- When starting, the service will automatically discover commands from the `my_commands` package thanks to the `discovery_path` configuration setting.
132
-
133
- ## Testing
134
-
135
- ```bash
136
- # Greeting
137
- curl -X POST http://127.0.0.1:8001/cmd \
138
- -H "Content-Type: application/json" \
139
- -d '{"command": "hello", "params": {"name": "Alice"}}'
140
-
141
- # Calculator
142
- curl -X POST http://127.0.0.1:8001/cmd \
143
- -H "Content-Type: application/json" \
144
- -d '{"command": "calc", "params": {"a": 10, "b": 5, "operation": "add"}}'
145
- ```
146
-
147
- ## Result
148
-
149
- The service will automatically discover and register the `hello` and `calc` commands from the `my_commands` package specified in `discovery_path`.
@@ -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
- }