mcp-proxy-adapter 6.0.0__py3-none-any.whl → 6.0.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 (212) hide show
  1. mcp_proxy_adapter/__main__.py +27 -7
  2. mcp_proxy_adapter/api/app.py +209 -79
  3. mcp_proxy_adapter/api/handlers.py +16 -5
  4. mcp_proxy_adapter/api/middleware/__init__.py +14 -9
  5. mcp_proxy_adapter/api/middleware/command_permission_middleware.py +148 -0
  6. mcp_proxy_adapter/api/middleware/factory.py +36 -12
  7. mcp_proxy_adapter/api/middleware/protocol_middleware.py +84 -18
  8. mcp_proxy_adapter/api/middleware/unified_security.py +197 -0
  9. mcp_proxy_adapter/api/middleware/user_info_middleware.py +158 -0
  10. mcp_proxy_adapter/commands/__init__.py +7 -1
  11. mcp_proxy_adapter/commands/base.py +7 -4
  12. mcp_proxy_adapter/commands/builtin_commands.py +8 -2
  13. mcp_proxy_adapter/commands/command_registry.py +8 -0
  14. mcp_proxy_adapter/commands/echo_command.py +81 -0
  15. mcp_proxy_adapter/commands/health_command.py +1 -1
  16. mcp_proxy_adapter/commands/help_command.py +21 -14
  17. mcp_proxy_adapter/commands/proxy_registration_command.py +326 -185
  18. mcp_proxy_adapter/commands/role_test_command.py +141 -0
  19. mcp_proxy_adapter/commands/security_command.py +488 -0
  20. mcp_proxy_adapter/commands/ssl_setup_command.py +234 -351
  21. mcp_proxy_adapter/commands/token_management_command.py +1 -1
  22. mcp_proxy_adapter/config.py +323 -40
  23. mcp_proxy_adapter/core/app_factory.py +410 -0
  24. mcp_proxy_adapter/core/app_runner.py +272 -0
  25. mcp_proxy_adapter/core/certificate_utils.py +291 -73
  26. mcp_proxy_adapter/core/client.py +574 -0
  27. mcp_proxy_adapter/core/client_manager.py +284 -0
  28. mcp_proxy_adapter/core/client_security.py +384 -0
  29. mcp_proxy_adapter/core/logging.py +8 -3
  30. mcp_proxy_adapter/core/mtls_asgi.py +156 -0
  31. mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
  32. mcp_proxy_adapter/core/protocol_manager.py +169 -10
  33. mcp_proxy_adapter/core/proxy_client.py +602 -0
  34. mcp_proxy_adapter/core/proxy_registration.py +299 -47
  35. mcp_proxy_adapter/core/security_adapter.py +12 -15
  36. mcp_proxy_adapter/core/security_integration.py +286 -0
  37. mcp_proxy_adapter/core/server_adapter.py +282 -0
  38. mcp_proxy_adapter/core/server_engine.py +270 -0
  39. mcp_proxy_adapter/core/ssl_utils.py +13 -12
  40. mcp_proxy_adapter/core/transport_manager.py +5 -5
  41. mcp_proxy_adapter/core/unified_config_adapter.py +579 -0
  42. mcp_proxy_adapter/examples/__init__.py +13 -4
  43. mcp_proxy_adapter/examples/basic_framework/__init__.py +9 -0
  44. mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +4 -0
  45. mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +4 -0
  46. mcp_proxy_adapter/examples/basic_framework/main.py +44 -0
  47. mcp_proxy_adapter/examples/commands/__init__.py +5 -0
  48. mcp_proxy_adapter/examples/create_certificates_simple.py +550 -0
  49. mcp_proxy_adapter/examples/debug_request_state.py +112 -0
  50. mcp_proxy_adapter/examples/debug_role_chain.py +158 -0
  51. mcp_proxy_adapter/examples/demo_client.py +275 -0
  52. mcp_proxy_adapter/examples/examples/basic_framework/__init__.py +9 -0
  53. mcp_proxy_adapter/examples/examples/basic_framework/commands/__init__.py +4 -0
  54. mcp_proxy_adapter/examples/examples/basic_framework/hooks/__init__.py +4 -0
  55. mcp_proxy_adapter/examples/examples/basic_framework/main.py +44 -0
  56. mcp_proxy_adapter/examples/examples/full_application/__init__.py +12 -0
  57. mcp_proxy_adapter/examples/examples/full_application/commands/__init__.py +7 -0
  58. mcp_proxy_adapter/examples/examples/full_application/commands/custom_echo_command.py +80 -0
  59. mcp_proxy_adapter/examples/examples/full_application/commands/dynamic_calculator_command.py +90 -0
  60. mcp_proxy_adapter/examples/examples/full_application/hooks/__init__.py +7 -0
  61. mcp_proxy_adapter/examples/examples/full_application/hooks/application_hooks.py +75 -0
  62. mcp_proxy_adapter/examples/examples/full_application/hooks/builtin_command_hooks.py +71 -0
  63. mcp_proxy_adapter/examples/examples/full_application/main.py +173 -0
  64. mcp_proxy_adapter/examples/examples/full_application/proxy_endpoints.py +154 -0
  65. mcp_proxy_adapter/examples/full_application/__init__.py +12 -0
  66. mcp_proxy_adapter/examples/full_application/commands/__init__.py +7 -0
  67. mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +80 -0
  68. mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +90 -0
  69. mcp_proxy_adapter/examples/full_application/hooks/__init__.py +7 -0
  70. mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +75 -0
  71. mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +71 -0
  72. mcp_proxy_adapter/examples/full_application/main.py +173 -0
  73. mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +154 -0
  74. mcp_proxy_adapter/examples/generate_all_certificates.py +362 -0
  75. mcp_proxy_adapter/examples/generate_certificates.py +177 -0
  76. mcp_proxy_adapter/examples/generate_certificates_and_tokens.py +369 -0
  77. mcp_proxy_adapter/examples/generate_test_configs.py +331 -0
  78. mcp_proxy_adapter/examples/proxy_registration_example.py +334 -0
  79. mcp_proxy_adapter/examples/run_example.py +59 -0
  80. mcp_proxy_adapter/examples/run_full_test_suite.py +318 -0
  81. mcp_proxy_adapter/examples/run_proxy_server.py +146 -0
  82. mcp_proxy_adapter/examples/run_security_tests.py +544 -0
  83. mcp_proxy_adapter/examples/run_security_tests_fixed.py +247 -0
  84. mcp_proxy_adapter/examples/scripts/config_generator.py +740 -0
  85. mcp_proxy_adapter/examples/scripts/create_certificates_simple.py +560 -0
  86. mcp_proxy_adapter/examples/scripts/generate_certificates_and_tokens.py +369 -0
  87. mcp_proxy_adapter/examples/security_test_client.py +782 -0
  88. mcp_proxy_adapter/examples/setup_test_environment.py +328 -0
  89. mcp_proxy_adapter/examples/test_config.py +148 -0
  90. mcp_proxy_adapter/examples/test_config_generator.py +86 -0
  91. mcp_proxy_adapter/examples/test_examples.py +281 -0
  92. mcp_proxy_adapter/examples/universal_client.py +620 -0
  93. mcp_proxy_adapter/main.py +66 -148
  94. mcp_proxy_adapter/utils/config_generator.py +1008 -0
  95. mcp_proxy_adapter/version.py +5 -2
  96. mcp_proxy_adapter-6.0.1.dist-info/METADATA +679 -0
  97. mcp_proxy_adapter-6.0.1.dist-info/RECORD +140 -0
  98. mcp_proxy_adapter-6.0.1.dist-info/entry_points.txt +2 -0
  99. {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.0.1.dist-info}/licenses/LICENSE +2 -2
  100. mcp_proxy_adapter/api/middleware/auth.py +0 -146
  101. mcp_proxy_adapter/api/middleware/auth_adapter.py +0 -235
  102. mcp_proxy_adapter/api/middleware/mtls_adapter.py +0 -305
  103. mcp_proxy_adapter/api/middleware/mtls_middleware.py +0 -296
  104. mcp_proxy_adapter/api/middleware/rate_limit.py +0 -152
  105. mcp_proxy_adapter/api/middleware/rate_limit_adapter.py +0 -241
  106. mcp_proxy_adapter/api/middleware/roles_adapter.py +0 -365
  107. mcp_proxy_adapter/api/middleware/roles_middleware.py +0 -381
  108. mcp_proxy_adapter/api/middleware/security.py +0 -376
  109. mcp_proxy_adapter/api/middleware/token_auth_middleware.py +0 -261
  110. mcp_proxy_adapter/examples/README.md +0 -124
  111. mcp_proxy_adapter/examples/basic_server/README.md +0 -60
  112. mcp_proxy_adapter/examples/basic_server/__init__.py +0 -7
  113. mcp_proxy_adapter/examples/basic_server/basic_custom_settings.json +0 -39
  114. mcp_proxy_adapter/examples/basic_server/config.json +0 -70
  115. mcp_proxy_adapter/examples/basic_server/config_all_protocols.json +0 -54
  116. mcp_proxy_adapter/examples/basic_server/config_http.json +0 -70
  117. mcp_proxy_adapter/examples/basic_server/config_http_only.json +0 -52
  118. mcp_proxy_adapter/examples/basic_server/config_https.json +0 -58
  119. mcp_proxy_adapter/examples/basic_server/config_mtls.json +0 -58
  120. mcp_proxy_adapter/examples/basic_server/config_ssl.json +0 -46
  121. mcp_proxy_adapter/examples/basic_server/custom_settings_example.py +0 -238
  122. mcp_proxy_adapter/examples/basic_server/server.py +0 -114
  123. mcp_proxy_adapter/examples/custom_commands/README.md +0 -127
  124. mcp_proxy_adapter/examples/custom_commands/__init__.py +0 -27
  125. mcp_proxy_adapter/examples/custom_commands/advanced_hooks.py +0 -566
  126. mcp_proxy_adapter/examples/custom_commands/auto_commands/__init__.py +0 -6
  127. mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_echo_command.py +0 -103
  128. mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_info_command.py +0 -111
  129. mcp_proxy_adapter/examples/custom_commands/auto_commands/test_command.py +0 -105
  130. mcp_proxy_adapter/examples/custom_commands/catalog/commands/test_command.py +0 -129
  131. mcp_proxy_adapter/examples/custom_commands/config.json +0 -118
  132. mcp_proxy_adapter/examples/custom_commands/config_all_protocols.json +0 -46
  133. mcp_proxy_adapter/examples/custom_commands/config_https_only.json +0 -46
  134. mcp_proxy_adapter/examples/custom_commands/config_https_transport.json +0 -33
  135. mcp_proxy_adapter/examples/custom_commands/config_mtls_only.json +0 -46
  136. mcp_proxy_adapter/examples/custom_commands/config_mtls_transport.json +0 -33
  137. mcp_proxy_adapter/examples/custom_commands/config_single_transport.json +0 -33
  138. mcp_proxy_adapter/examples/custom_commands/custom_health_command.py +0 -169
  139. mcp_proxy_adapter/examples/custom_commands/custom_help_command.py +0 -215
  140. mcp_proxy_adapter/examples/custom_commands/custom_openapi_generator.py +0 -76
  141. mcp_proxy_adapter/examples/custom_commands/custom_settings.json +0 -96
  142. mcp_proxy_adapter/examples/custom_commands/custom_settings_manager.py +0 -241
  143. mcp_proxy_adapter/examples/custom_commands/data_transform_command.py +0 -135
  144. mcp_proxy_adapter/examples/custom_commands/echo_command.py +0 -122
  145. mcp_proxy_adapter/examples/custom_commands/full_help_response.json +0 -1
  146. mcp_proxy_adapter/examples/custom_commands/generated_openapi.json +0 -629
  147. mcp_proxy_adapter/examples/custom_commands/get_openapi.py +0 -103
  148. mcp_proxy_adapter/examples/custom_commands/hooks.py +0 -230
  149. mcp_proxy_adapter/examples/custom_commands/intercept_command.py +0 -123
  150. mcp_proxy_adapter/examples/custom_commands/loadable_commands/test_ignored.py +0 -129
  151. mcp_proxy_adapter/examples/custom_commands/manual_echo_command.py +0 -103
  152. mcp_proxy_adapter/examples/custom_commands/proxy_connection_manager.py +0 -278
  153. mcp_proxy_adapter/examples/custom_commands/server.py +0 -252
  154. mcp_proxy_adapter/examples/custom_commands/simple_openapi_server.py +0 -75
  155. mcp_proxy_adapter/examples/custom_commands/start_server_with_proxy_manager.py +0 -299
  156. mcp_proxy_adapter/examples/custom_commands/start_server_with_registration.py +0 -278
  157. mcp_proxy_adapter/examples/custom_commands/test_hooks.py +0 -176
  158. mcp_proxy_adapter/examples/custom_commands/test_openapi.py +0 -27
  159. mcp_proxy_adapter/examples/custom_commands/test_registry.py +0 -23
  160. mcp_proxy_adapter/examples/custom_commands/test_simple.py +0 -19
  161. mcp_proxy_adapter/examples/custom_project_example/README.md +0 -103
  162. mcp_proxy_adapter/examples/custom_project_example/README_EN.md +0 -103
  163. mcp_proxy_adapter/examples/deployment/README.md +0 -49
  164. mcp_proxy_adapter/examples/deployment/__init__.py +0 -7
  165. mcp_proxy_adapter/examples/deployment/config.development.json +0 -8
  166. mcp_proxy_adapter/examples/deployment/config.json +0 -29
  167. mcp_proxy_adapter/examples/deployment/config.production.json +0 -12
  168. mcp_proxy_adapter/examples/deployment/config.staging.json +0 -11
  169. mcp_proxy_adapter/examples/deployment/docker-compose.yml +0 -31
  170. mcp_proxy_adapter/examples/deployment/run.sh +0 -43
  171. mcp_proxy_adapter/examples/deployment/run_docker.sh +0 -84
  172. mcp_proxy_adapter/examples/simple_custom_commands/README.md +0 -149
  173. mcp_proxy_adapter/examples/simple_custom_commands/README_EN.md +0 -149
  174. mcp_proxy_adapter/schemas/base_schema.json +0 -114
  175. mcp_proxy_adapter/schemas/openapi_schema.json +0 -314
  176. mcp_proxy_adapter/schemas/roles_schema.json +0 -162
  177. mcp_proxy_adapter/tests/__init__.py +0 -0
  178. mcp_proxy_adapter/tests/api/__init__.py +0 -3
  179. mcp_proxy_adapter/tests/api/test_cmd_endpoint.py +0 -115
  180. mcp_proxy_adapter/tests/api/test_custom_openapi.py +0 -617
  181. mcp_proxy_adapter/tests/api/test_handlers.py +0 -522
  182. mcp_proxy_adapter/tests/api/test_middleware.py +0 -340
  183. mcp_proxy_adapter/tests/api/test_schemas.py +0 -546
  184. mcp_proxy_adapter/tests/api/test_tool_integration.py +0 -531
  185. mcp_proxy_adapter/tests/commands/__init__.py +0 -3
  186. mcp_proxy_adapter/tests/commands/test_config_command.py +0 -211
  187. mcp_proxy_adapter/tests/commands/test_echo_command.py +0 -127
  188. mcp_proxy_adapter/tests/commands/test_help_command.py +0 -136
  189. mcp_proxy_adapter/tests/conftest.py +0 -131
  190. mcp_proxy_adapter/tests/functional/__init__.py +0 -3
  191. mcp_proxy_adapter/tests/functional/test_api.py +0 -253
  192. mcp_proxy_adapter/tests/integration/__init__.py +0 -3
  193. mcp_proxy_adapter/tests/integration/test_cmd_integration.py +0 -129
  194. mcp_proxy_adapter/tests/integration/test_integration.py +0 -255
  195. mcp_proxy_adapter/tests/performance/__init__.py +0 -3
  196. mcp_proxy_adapter/tests/performance/test_performance.py +0 -189
  197. mcp_proxy_adapter/tests/stubs/__init__.py +0 -10
  198. mcp_proxy_adapter/tests/stubs/echo_command.py +0 -104
  199. mcp_proxy_adapter/tests/test_api_endpoints.py +0 -271
  200. mcp_proxy_adapter/tests/test_api_handlers.py +0 -289
  201. mcp_proxy_adapter/tests/test_base_command.py +0 -123
  202. mcp_proxy_adapter/tests/test_batch_requests.py +0 -117
  203. mcp_proxy_adapter/tests/test_command_registry.py +0 -281
  204. mcp_proxy_adapter/tests/test_config.py +0 -127
  205. mcp_proxy_adapter/tests/test_utils.py +0 -65
  206. mcp_proxy_adapter/tests/unit/__init__.py +0 -3
  207. mcp_proxy_adapter/tests/unit/test_base_command.py +0 -436
  208. mcp_proxy_adapter/tests/unit/test_config.py +0 -270
  209. mcp_proxy_adapter-6.0.0.dist-info/METADATA +0 -201
  210. mcp_proxy_adapter-6.0.0.dist-info/RECORD +0 -179
  211. {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.0.1.dist-info}/WHEEL +0 -0
  212. {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.0.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
- }