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,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
- }