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.
- mcp_proxy_adapter/__main__.py +27 -7
- mcp_proxy_adapter/api/app.py +209 -79
- mcp_proxy_adapter/api/handlers.py +16 -5
- mcp_proxy_adapter/api/middleware/__init__.py +14 -9
- mcp_proxy_adapter/api/middleware/command_permission_middleware.py +148 -0
- mcp_proxy_adapter/api/middleware/factory.py +36 -12
- mcp_proxy_adapter/api/middleware/protocol_middleware.py +84 -18
- mcp_proxy_adapter/api/middleware/unified_security.py +197 -0
- mcp_proxy_adapter/api/middleware/user_info_middleware.py +158 -0
- mcp_proxy_adapter/commands/__init__.py +7 -1
- mcp_proxy_adapter/commands/base.py +7 -4
- mcp_proxy_adapter/commands/builtin_commands.py +8 -2
- mcp_proxy_adapter/commands/command_registry.py +8 -0
- mcp_proxy_adapter/commands/echo_command.py +81 -0
- mcp_proxy_adapter/commands/health_command.py +1 -1
- mcp_proxy_adapter/commands/help_command.py +21 -14
- mcp_proxy_adapter/commands/proxy_registration_command.py +326 -185
- mcp_proxy_adapter/commands/role_test_command.py +141 -0
- mcp_proxy_adapter/commands/security_command.py +488 -0
- mcp_proxy_adapter/commands/ssl_setup_command.py +234 -351
- mcp_proxy_adapter/commands/token_management_command.py +1 -1
- mcp_proxy_adapter/config.py +323 -40
- mcp_proxy_adapter/core/app_factory.py +410 -0
- mcp_proxy_adapter/core/app_runner.py +272 -0
- mcp_proxy_adapter/core/certificate_utils.py +291 -73
- mcp_proxy_adapter/core/client.py +574 -0
- mcp_proxy_adapter/core/client_manager.py +284 -0
- mcp_proxy_adapter/core/client_security.py +384 -0
- mcp_proxy_adapter/core/logging.py +8 -3
- mcp_proxy_adapter/core/mtls_asgi.py +156 -0
- mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
- mcp_proxy_adapter/core/protocol_manager.py +169 -10
- mcp_proxy_adapter/core/proxy_client.py +602 -0
- mcp_proxy_adapter/core/proxy_registration.py +299 -47
- mcp_proxy_adapter/core/security_adapter.py +12 -15
- mcp_proxy_adapter/core/security_integration.py +286 -0
- mcp_proxy_adapter/core/server_adapter.py +282 -0
- mcp_proxy_adapter/core/server_engine.py +270 -0
- mcp_proxy_adapter/core/ssl_utils.py +13 -12
- mcp_proxy_adapter/core/transport_manager.py +5 -5
- mcp_proxy_adapter/core/unified_config_adapter.py +579 -0
- mcp_proxy_adapter/examples/__init__.py +13 -4
- mcp_proxy_adapter/examples/basic_framework/__init__.py +9 -0
- mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +4 -0
- mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +4 -0
- mcp_proxy_adapter/examples/basic_framework/main.py +44 -0
- mcp_proxy_adapter/examples/commands/__init__.py +5 -0
- mcp_proxy_adapter/examples/create_certificates_simple.py +550 -0
- mcp_proxy_adapter/examples/debug_request_state.py +112 -0
- mcp_proxy_adapter/examples/debug_role_chain.py +158 -0
- mcp_proxy_adapter/examples/demo_client.py +275 -0
- mcp_proxy_adapter/examples/examples/basic_framework/__init__.py +9 -0
- mcp_proxy_adapter/examples/examples/basic_framework/commands/__init__.py +4 -0
- mcp_proxy_adapter/examples/examples/basic_framework/hooks/__init__.py +4 -0
- mcp_proxy_adapter/examples/examples/basic_framework/main.py +44 -0
- mcp_proxy_adapter/examples/examples/full_application/__init__.py +12 -0
- mcp_proxy_adapter/examples/examples/full_application/commands/__init__.py +7 -0
- mcp_proxy_adapter/examples/examples/full_application/commands/custom_echo_command.py +80 -0
- mcp_proxy_adapter/examples/examples/full_application/commands/dynamic_calculator_command.py +90 -0
- mcp_proxy_adapter/examples/examples/full_application/hooks/__init__.py +7 -0
- mcp_proxy_adapter/examples/examples/full_application/hooks/application_hooks.py +75 -0
- mcp_proxy_adapter/examples/examples/full_application/hooks/builtin_command_hooks.py +71 -0
- mcp_proxy_adapter/examples/examples/full_application/main.py +173 -0
- mcp_proxy_adapter/examples/examples/full_application/proxy_endpoints.py +154 -0
- mcp_proxy_adapter/examples/full_application/__init__.py +12 -0
- mcp_proxy_adapter/examples/full_application/commands/__init__.py +7 -0
- mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +80 -0
- mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +90 -0
- mcp_proxy_adapter/examples/full_application/hooks/__init__.py +7 -0
- mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +75 -0
- mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +71 -0
- mcp_proxy_adapter/examples/full_application/main.py +173 -0
- mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +154 -0
- mcp_proxy_adapter/examples/generate_all_certificates.py +362 -0
- mcp_proxy_adapter/examples/generate_certificates.py +177 -0
- mcp_proxy_adapter/examples/generate_certificates_and_tokens.py +369 -0
- mcp_proxy_adapter/examples/generate_test_configs.py +331 -0
- mcp_proxy_adapter/examples/proxy_registration_example.py +334 -0
- mcp_proxy_adapter/examples/run_example.py +59 -0
- mcp_proxy_adapter/examples/run_full_test_suite.py +318 -0
- mcp_proxy_adapter/examples/run_proxy_server.py +146 -0
- mcp_proxy_adapter/examples/run_security_tests.py +544 -0
- mcp_proxy_adapter/examples/run_security_tests_fixed.py +247 -0
- mcp_proxy_adapter/examples/scripts/config_generator.py +740 -0
- mcp_proxy_adapter/examples/scripts/create_certificates_simple.py +560 -0
- mcp_proxy_adapter/examples/scripts/generate_certificates_and_tokens.py +369 -0
- mcp_proxy_adapter/examples/security_test_client.py +782 -0
- mcp_proxy_adapter/examples/setup_test_environment.py +328 -0
- mcp_proxy_adapter/examples/test_config.py +148 -0
- mcp_proxy_adapter/examples/test_config_generator.py +86 -0
- mcp_proxy_adapter/examples/test_examples.py +281 -0
- mcp_proxy_adapter/examples/universal_client.py +620 -0
- mcp_proxy_adapter/main.py +66 -148
- mcp_proxy_adapter/utils/config_generator.py +1008 -0
- mcp_proxy_adapter/version.py +5 -2
- mcp_proxy_adapter-6.0.1.dist-info/METADATA +679 -0
- mcp_proxy_adapter-6.0.1.dist-info/RECORD +140 -0
- mcp_proxy_adapter-6.0.1.dist-info/entry_points.txt +2 -0
- {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.0.1.dist-info}/licenses/LICENSE +2 -2
- mcp_proxy_adapter/api/middleware/auth.py +0 -146
- mcp_proxy_adapter/api/middleware/auth_adapter.py +0 -235
- mcp_proxy_adapter/api/middleware/mtls_adapter.py +0 -305
- mcp_proxy_adapter/api/middleware/mtls_middleware.py +0 -296
- mcp_proxy_adapter/api/middleware/rate_limit.py +0 -152
- mcp_proxy_adapter/api/middleware/rate_limit_adapter.py +0 -241
- mcp_proxy_adapter/api/middleware/roles_adapter.py +0 -365
- mcp_proxy_adapter/api/middleware/roles_middleware.py +0 -381
- mcp_proxy_adapter/api/middleware/security.py +0 -376
- mcp_proxy_adapter/api/middleware/token_auth_middleware.py +0 -261
- mcp_proxy_adapter/examples/README.md +0 -124
- mcp_proxy_adapter/examples/basic_server/README.md +0 -60
- mcp_proxy_adapter/examples/basic_server/__init__.py +0 -7
- mcp_proxy_adapter/examples/basic_server/basic_custom_settings.json +0 -39
- mcp_proxy_adapter/examples/basic_server/config.json +0 -70
- mcp_proxy_adapter/examples/basic_server/config_all_protocols.json +0 -54
- mcp_proxy_adapter/examples/basic_server/config_http.json +0 -70
- mcp_proxy_adapter/examples/basic_server/config_http_only.json +0 -52
- mcp_proxy_adapter/examples/basic_server/config_https.json +0 -58
- mcp_proxy_adapter/examples/basic_server/config_mtls.json +0 -58
- mcp_proxy_adapter/examples/basic_server/config_ssl.json +0 -46
- mcp_proxy_adapter/examples/basic_server/custom_settings_example.py +0 -238
- mcp_proxy_adapter/examples/basic_server/server.py +0 -114
- mcp_proxy_adapter/examples/custom_commands/README.md +0 -127
- mcp_proxy_adapter/examples/custom_commands/__init__.py +0 -27
- mcp_proxy_adapter/examples/custom_commands/advanced_hooks.py +0 -566
- mcp_proxy_adapter/examples/custom_commands/auto_commands/__init__.py +0 -6
- mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_echo_command.py +0 -103
- mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_info_command.py +0 -111
- mcp_proxy_adapter/examples/custom_commands/auto_commands/test_command.py +0 -105
- mcp_proxy_adapter/examples/custom_commands/catalog/commands/test_command.py +0 -129
- mcp_proxy_adapter/examples/custom_commands/config.json +0 -118
- mcp_proxy_adapter/examples/custom_commands/config_all_protocols.json +0 -46
- mcp_proxy_adapter/examples/custom_commands/config_https_only.json +0 -46
- mcp_proxy_adapter/examples/custom_commands/config_https_transport.json +0 -33
- mcp_proxy_adapter/examples/custom_commands/config_mtls_only.json +0 -46
- mcp_proxy_adapter/examples/custom_commands/config_mtls_transport.json +0 -33
- mcp_proxy_adapter/examples/custom_commands/config_single_transport.json +0 -33
- mcp_proxy_adapter/examples/custom_commands/custom_health_command.py +0 -169
- mcp_proxy_adapter/examples/custom_commands/custom_help_command.py +0 -215
- mcp_proxy_adapter/examples/custom_commands/custom_openapi_generator.py +0 -76
- mcp_proxy_adapter/examples/custom_commands/custom_settings.json +0 -96
- mcp_proxy_adapter/examples/custom_commands/custom_settings_manager.py +0 -241
- mcp_proxy_adapter/examples/custom_commands/data_transform_command.py +0 -135
- mcp_proxy_adapter/examples/custom_commands/echo_command.py +0 -122
- mcp_proxy_adapter/examples/custom_commands/full_help_response.json +0 -1
- mcp_proxy_adapter/examples/custom_commands/generated_openapi.json +0 -629
- mcp_proxy_adapter/examples/custom_commands/get_openapi.py +0 -103
- mcp_proxy_adapter/examples/custom_commands/hooks.py +0 -230
- mcp_proxy_adapter/examples/custom_commands/intercept_command.py +0 -123
- mcp_proxy_adapter/examples/custom_commands/loadable_commands/test_ignored.py +0 -129
- mcp_proxy_adapter/examples/custom_commands/manual_echo_command.py +0 -103
- mcp_proxy_adapter/examples/custom_commands/proxy_connection_manager.py +0 -278
- mcp_proxy_adapter/examples/custom_commands/server.py +0 -252
- mcp_proxy_adapter/examples/custom_commands/simple_openapi_server.py +0 -75
- mcp_proxy_adapter/examples/custom_commands/start_server_with_proxy_manager.py +0 -299
- mcp_proxy_adapter/examples/custom_commands/start_server_with_registration.py +0 -278
- mcp_proxy_adapter/examples/custom_commands/test_hooks.py +0 -176
- mcp_proxy_adapter/examples/custom_commands/test_openapi.py +0 -27
- mcp_proxy_adapter/examples/custom_commands/test_registry.py +0 -23
- mcp_proxy_adapter/examples/custom_commands/test_simple.py +0 -19
- mcp_proxy_adapter/examples/custom_project_example/README.md +0 -103
- mcp_proxy_adapter/examples/custom_project_example/README_EN.md +0 -103
- mcp_proxy_adapter/examples/deployment/README.md +0 -49
- mcp_proxy_adapter/examples/deployment/__init__.py +0 -7
- mcp_proxy_adapter/examples/deployment/config.development.json +0 -8
- mcp_proxy_adapter/examples/deployment/config.json +0 -29
- mcp_proxy_adapter/examples/deployment/config.production.json +0 -12
- mcp_proxy_adapter/examples/deployment/config.staging.json +0 -11
- mcp_proxy_adapter/examples/deployment/docker-compose.yml +0 -31
- mcp_proxy_adapter/examples/deployment/run.sh +0 -43
- mcp_proxy_adapter/examples/deployment/run_docker.sh +0 -84
- mcp_proxy_adapter/examples/simple_custom_commands/README.md +0 -149
- mcp_proxy_adapter/examples/simple_custom_commands/README_EN.md +0 -149
- mcp_proxy_adapter/schemas/base_schema.json +0 -114
- mcp_proxy_adapter/schemas/openapi_schema.json +0 -314
- mcp_proxy_adapter/schemas/roles_schema.json +0 -162
- mcp_proxy_adapter/tests/__init__.py +0 -0
- mcp_proxy_adapter/tests/api/__init__.py +0 -3
- mcp_proxy_adapter/tests/api/test_cmd_endpoint.py +0 -115
- mcp_proxy_adapter/tests/api/test_custom_openapi.py +0 -617
- mcp_proxy_adapter/tests/api/test_handlers.py +0 -522
- mcp_proxy_adapter/tests/api/test_middleware.py +0 -340
- mcp_proxy_adapter/tests/api/test_schemas.py +0 -546
- mcp_proxy_adapter/tests/api/test_tool_integration.py +0 -531
- mcp_proxy_adapter/tests/commands/__init__.py +0 -3
- mcp_proxy_adapter/tests/commands/test_config_command.py +0 -211
- mcp_proxy_adapter/tests/commands/test_echo_command.py +0 -127
- mcp_proxy_adapter/tests/commands/test_help_command.py +0 -136
- mcp_proxy_adapter/tests/conftest.py +0 -131
- mcp_proxy_adapter/tests/functional/__init__.py +0 -3
- mcp_proxy_adapter/tests/functional/test_api.py +0 -253
- mcp_proxy_adapter/tests/integration/__init__.py +0 -3
- mcp_proxy_adapter/tests/integration/test_cmd_integration.py +0 -129
- mcp_proxy_adapter/tests/integration/test_integration.py +0 -255
- mcp_proxy_adapter/tests/performance/__init__.py +0 -3
- mcp_proxy_adapter/tests/performance/test_performance.py +0 -189
- mcp_proxy_adapter/tests/stubs/__init__.py +0 -10
- mcp_proxy_adapter/tests/stubs/echo_command.py +0 -104
- mcp_proxy_adapter/tests/test_api_endpoints.py +0 -271
- mcp_proxy_adapter/tests/test_api_handlers.py +0 -289
- mcp_proxy_adapter/tests/test_base_command.py +0 -123
- mcp_proxy_adapter/tests/test_batch_requests.py +0 -117
- mcp_proxy_adapter/tests/test_command_registry.py +0 -281
- mcp_proxy_adapter/tests/test_config.py +0 -127
- mcp_proxy_adapter/tests/test_utils.py +0 -65
- mcp_proxy_adapter/tests/unit/__init__.py +0 -3
- mcp_proxy_adapter/tests/unit/test_base_command.py +0 -436
- mcp_proxy_adapter/tests/unit/test_config.py +0 -270
- mcp_proxy_adapter-6.0.0.dist-info/METADATA +0 -201
- mcp_proxy_adapter-6.0.0.dist-info/RECORD +0 -179
- {mcp_proxy_adapter-6.0.0.dist-info → mcp_proxy_adapter-6.0.1.dist-info}/WHEEL +0 -0
- {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
|
-
}
|