mcp-proxy-adapter 3.1.6__py3-none-any.whl → 4.0.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.
- mcp_proxy_adapter/api/app.py +65 -27
- mcp_proxy_adapter/api/handlers.py +1 -1
- mcp_proxy_adapter/api/middleware/error_handling.py +11 -10
- mcp_proxy_adapter/api/tool_integration.py +5 -2
- mcp_proxy_adapter/api/tools.py +3 -3
- mcp_proxy_adapter/commands/base.py +19 -1
- mcp_proxy_adapter/commands/command_registry.py +243 -6
- mcp_proxy_adapter/commands/hooks.py +260 -0
- mcp_proxy_adapter/commands/reload_command.py +211 -0
- mcp_proxy_adapter/commands/reload_settings_command.py +125 -0
- mcp_proxy_adapter/commands/settings_command.py +189 -0
- mcp_proxy_adapter/config.py +16 -1
- mcp_proxy_adapter/core/__init__.py +44 -0
- mcp_proxy_adapter/core/logging.py +87 -34
- mcp_proxy_adapter/core/settings.py +376 -0
- mcp_proxy_adapter/core/utils.py +2 -2
- mcp_proxy_adapter/custom_openapi.py +81 -2
- mcp_proxy_adapter/examples/README.md +124 -0
- mcp_proxy_adapter/examples/__init__.py +7 -0
- mcp_proxy_adapter/examples/basic_server/README.md +60 -0
- mcp_proxy_adapter/examples/basic_server/__init__.py +7 -0
- mcp_proxy_adapter/examples/basic_server/basic_custom_settings.json +39 -0
- mcp_proxy_adapter/examples/basic_server/config.json +35 -0
- mcp_proxy_adapter/examples/basic_server/custom_settings_example.py +238 -0
- mcp_proxy_adapter/examples/basic_server/server.py +98 -0
- mcp_proxy_adapter/examples/custom_commands/README.md +127 -0
- mcp_proxy_adapter/examples/custom_commands/__init__.py +27 -0
- mcp_proxy_adapter/examples/custom_commands/advanced_hooks.py +250 -0
- mcp_proxy_adapter/examples/custom_commands/auto_commands/__init__.py +6 -0
- mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_echo_command.py +103 -0
- mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_info_command.py +111 -0
- mcp_proxy_adapter/examples/custom_commands/config.json +62 -0
- mcp_proxy_adapter/examples/custom_commands/custom_health_command.py +169 -0
- mcp_proxy_adapter/examples/custom_commands/custom_help_command.py +215 -0
- mcp_proxy_adapter/examples/custom_commands/custom_openapi_generator.py +76 -0
- mcp_proxy_adapter/examples/custom_commands/custom_settings.json +96 -0
- mcp_proxy_adapter/examples/custom_commands/custom_settings_manager.py +241 -0
- mcp_proxy_adapter/examples/custom_commands/data_transform_command.py +135 -0
- mcp_proxy_adapter/examples/custom_commands/echo_command.py +122 -0
- mcp_proxy_adapter/examples/custom_commands/hooks.py +230 -0
- mcp_proxy_adapter/examples/custom_commands/intercept_command.py +123 -0
- mcp_proxy_adapter/examples/custom_commands/manual_echo_command.py +103 -0
- mcp_proxy_adapter/examples/custom_commands/server.py +223 -0
- mcp_proxy_adapter/examples/custom_commands/test_hooks.py +176 -0
- mcp_proxy_adapter/examples/deployment/README.md +49 -0
- mcp_proxy_adapter/examples/deployment/__init__.py +7 -0
- mcp_proxy_adapter/examples/deployment/config.development.json +8 -0
- {examples/basic_example → mcp_proxy_adapter/examples/deployment}/config.json +11 -7
- mcp_proxy_adapter/examples/deployment/config.production.json +12 -0
- mcp_proxy_adapter/examples/deployment/config.staging.json +11 -0
- mcp_proxy_adapter/examples/deployment/docker-compose.yml +31 -0
- mcp_proxy_adapter/examples/deployment/run.sh +43 -0
- mcp_proxy_adapter/examples/deployment/run_docker.sh +84 -0
- mcp_proxy_adapter/openapi.py +3 -2
- mcp_proxy_adapter/tests/api/test_custom_openapi.py +617 -0
- mcp_proxy_adapter/tests/api/test_handlers.py +522 -0
- mcp_proxy_adapter/tests/api/test_schemas.py +546 -0
- mcp_proxy_adapter/tests/api/test_tool_integration.py +531 -0
- mcp_proxy_adapter/tests/unit/test_base_command.py +391 -85
- mcp_proxy_adapter/version.py +1 -1
- {mcp_proxy_adapter-3.1.6.dist-info → mcp_proxy_adapter-4.0.0.dist-info}/METADATA +1 -1
- mcp_proxy_adapter-4.0.0.dist-info/RECORD +110 -0
- {mcp_proxy_adapter-3.1.6.dist-info → mcp_proxy_adapter-4.0.0.dist-info}/WHEEL +1 -1
- {mcp_proxy_adapter-3.1.6.dist-info → mcp_proxy_adapter-4.0.0.dist-info}/top_level.txt +0 -1
- examples/__init__.py +0 -19
- examples/anti_patterns/README.md +0 -51
- examples/anti_patterns/__init__.py +0 -9
- examples/anti_patterns/bad_design/README.md +0 -72
- examples/anti_patterns/bad_design/global_state.py +0 -170
- examples/anti_patterns/bad_design/monolithic_command.py +0 -272
- examples/basic_example/README.md +0 -245
- examples/basic_example/__init__.py +0 -8
- examples/basic_example/commands/__init__.py +0 -5
- examples/basic_example/commands/echo_command.py +0 -95
- examples/basic_example/commands/math_command.py +0 -151
- examples/basic_example/commands/time_command.py +0 -152
- examples/basic_example/docs/EN/README.md +0 -177
- examples/basic_example/docs/RU/README.md +0 -177
- examples/basic_example/server.py +0 -151
- examples/basic_example/tests/conftest.py +0 -243
- examples/check_vstl_schema.py +0 -106
- examples/commands/echo_command.py +0 -52
- examples/commands/echo_command_di.py +0 -152
- examples/commands/echo_result.py +0 -65
- examples/commands/get_date_command.py +0 -98
- examples/commands/new_uuid4_command.py +0 -91
- examples/complete_example/Dockerfile +0 -24
- examples/complete_example/README.md +0 -92
- examples/complete_example/__init__.py +0 -8
- examples/complete_example/commands/__init__.py +0 -5
- examples/complete_example/commands/system_command.py +0 -328
- examples/complete_example/config.json +0 -41
- examples/complete_example/configs/config.dev.yaml +0 -40
- examples/complete_example/configs/config.docker.yaml +0 -40
- examples/complete_example/docker-compose.yml +0 -35
- examples/complete_example/requirements.txt +0 -20
- examples/complete_example/server.py +0 -113
- examples/di_example/.pytest_cache/README.md +0 -8
- examples/di_example/server.py +0 -249
- examples/fix_vstl_help.py +0 -123
- examples/minimal_example/README.md +0 -65
- examples/minimal_example/__init__.py +0 -8
- examples/minimal_example/config.json +0 -14
- examples/minimal_example/main.py +0 -136
- examples/minimal_example/simple_server.py +0 -163
- examples/minimal_example/tests/conftest.py +0 -171
- examples/minimal_example/tests/test_hello_command.py +0 -111
- examples/minimal_example/tests/test_integration.py +0 -181
- examples/patch_vstl_service.py +0 -105
- examples/patch_vstl_service_mcp.py +0 -108
- examples/server.py +0 -69
- examples/simple_server.py +0 -128
- examples/test_package_3.1.4.py +0 -177
- examples/test_server.py +0 -134
- examples/tool_description_example.py +0 -82
- mcp_proxy_adapter/py.typed +0 -0
- mcp_proxy_adapter-3.1.6.dist-info/RECORD +0 -118
- {mcp_proxy_adapter-3.1.6.dist-info → mcp_proxy_adapter-4.0.0.dist-info}/licenses/LICENSE +0 -0
examples/test_package_3.1.4.py
DELETED
@@ -1,177 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
Скрипт для проверки работы улучшенной обработки null в версии 3.1.6.
|
4
|
-
|
5
|
-
Этот скрипт:
|
6
|
-
1. Проверяет, что версия пакета 3.1.6
|
7
|
-
2. Тестирует улучшенный метод validate_params
|
8
|
-
3. Проверяет, что команда help правильно обрабатывает null значения
|
9
|
-
"""
|
10
|
-
|
11
|
-
import inspect
|
12
|
-
import sys
|
13
|
-
from typing import Dict, Any, Optional
|
14
|
-
|
15
|
-
try:
|
16
|
-
# Импортируем необходимые модули из пакета
|
17
|
-
from mcp_proxy_adapter import __version__
|
18
|
-
from mcp_proxy_adapter.commands.base import Command
|
19
|
-
from mcp_proxy_adapter.commands.help_command import HelpCommand, HelpResult
|
20
|
-
except ImportError:
|
21
|
-
print("ОШИБКА: Не удалось импортировать mcp_proxy_adapter. Убедитесь, что пакет установлен.")
|
22
|
-
sys.exit(1)
|
23
|
-
|
24
|
-
|
25
|
-
def check_version():
|
26
|
-
"""
|
27
|
-
Проверяет версию установленного пакета mcp_proxy_adapter.
|
28
|
-
"""
|
29
|
-
expected_version = "3.1.6"
|
30
|
-
|
31
|
-
print(f"\n=== Проверка версии ===")
|
32
|
-
print(f"Установленная версия: {__version__}")
|
33
|
-
print(f"Ожидаемая версия: {expected_version}")
|
34
|
-
|
35
|
-
if __version__ != expected_version:
|
36
|
-
print(f"ОШИБКА: Версия пакета ({__version__}) не соответствует ожидаемой ({expected_version}).")
|
37
|
-
return False
|
38
|
-
|
39
|
-
print("OK: Версия соответствует ожидаемой.")
|
40
|
-
return True
|
41
|
-
|
42
|
-
|
43
|
-
def test_validate_params():
|
44
|
-
"""
|
45
|
-
Тестирует метод validate_params класса Command для обработки различных вариантов null.
|
46
|
-
"""
|
47
|
-
print(f"\n=== Тестирование validate_params ===")
|
48
|
-
|
49
|
-
# Получаем исходный код метода validate_params
|
50
|
-
validate_params_source = inspect.getsource(Command.validate_params)
|
51
|
-
print(f"Исходный код метода validate_params:")
|
52
|
-
print(validate_params_source)
|
53
|
-
|
54
|
-
# Проверяем, содержит ли код улучшения для обработки null
|
55
|
-
required_improvements = [
|
56
|
-
"value.lower() in",
|
57
|
-
"null",
|
58
|
-
"none",
|
59
|
-
"validated_params[key] = None"
|
60
|
-
]
|
61
|
-
|
62
|
-
for improvement in required_improvements:
|
63
|
-
if improvement not in validate_params_source:
|
64
|
-
print(f"ОШИБКА: Не найдено улучшение: {improvement}")
|
65
|
-
return False
|
66
|
-
|
67
|
-
# Тестируем различные значения null
|
68
|
-
test_cases = [
|
69
|
-
{"unknown_param": None},
|
70
|
-
{"unknown_param": "null"},
|
71
|
-
{"unknown_param": "NULL"},
|
72
|
-
{"unknown_param": "Null"},
|
73
|
-
{"unknown_param": "none"},
|
74
|
-
{"unknown_param": "NONE"},
|
75
|
-
{"cmdname": None},
|
76
|
-
{"cmdname": "null"},
|
77
|
-
{"cmdname": "none"},
|
78
|
-
{"cmdname": ""}
|
79
|
-
]
|
80
|
-
|
81
|
-
print("\nРезультаты тестирования:")
|
82
|
-
for case in test_cases:
|
83
|
-
result = Command.validate_params(case)
|
84
|
-
print(f"Входные данные: {case}")
|
85
|
-
print(f"Результат: {result}")
|
86
|
-
|
87
|
-
# Проверяем специальный случай с параметром cmdname
|
88
|
-
if "cmdname" in case and (case["cmdname"] is None or case["cmdname"].lower() in ["null", "none", ""]):
|
89
|
-
if "cmdname" not in result or result["cmdname"] is not None:
|
90
|
-
print(f"ОШИБКА: Неверная обработка cmdname. Ожидалось: {{'cmdname': None}}, Получено: {result}")
|
91
|
-
return False
|
92
|
-
|
93
|
-
# Проверяем, что unknown_param был удален
|
94
|
-
if "unknown_param" in case and "unknown_param" in result:
|
95
|
-
print(f"ОШИБКА: Параметр unknown_param не был удален: {result}")
|
96
|
-
return False
|
97
|
-
|
98
|
-
print("OK: Все тесты validate_params пройдены успешно.")
|
99
|
-
return True
|
100
|
-
|
101
|
-
|
102
|
-
def test_help_command():
|
103
|
-
"""
|
104
|
-
Тестирует работу команды help с различными вариантами null.
|
105
|
-
"""
|
106
|
-
print(f"\n=== Тестирование команды help ===")
|
107
|
-
|
108
|
-
# Получаем исходный код метода execute команды help
|
109
|
-
help_execute_source = inspect.getsource(HelpCommand.execute)
|
110
|
-
print(f"Исходный код метода execute в HelpCommand:")
|
111
|
-
print(help_execute_source)
|
112
|
-
|
113
|
-
# Проверяем, содержит ли код поддержку **kwargs
|
114
|
-
if "**kwargs" not in help_execute_source:
|
115
|
-
print("ОШИБКА: Метод execute в HelpCommand не поддерживает **kwargs.")
|
116
|
-
return False
|
117
|
-
|
118
|
-
# Создаем экземпляр команды
|
119
|
-
help_cmd = HelpCommand()
|
120
|
-
|
121
|
-
# Тестируем с разными вариантами null в параметрах
|
122
|
-
test_cases = [
|
123
|
-
{"cmdname": None, "unknown_param": None},
|
124
|
-
{"cmdname": "null", "unknown_param": "null"},
|
125
|
-
{"cmdname": "none", "unknown_param": "none"},
|
126
|
-
{"cmdname": "", "unknown_param": ""},
|
127
|
-
{"unknown_param": "whatever"}
|
128
|
-
]
|
129
|
-
|
130
|
-
print("\nРезультаты тестирования:")
|
131
|
-
for i, case in enumerate(test_cases):
|
132
|
-
print(f"\nТест {i+1}: {case}")
|
133
|
-
try:
|
134
|
-
# Используем execute напрямую, так как run преобразует параметры
|
135
|
-
result = help_cmd.execute(**case)
|
136
|
-
print(f"Тест пройден успешно, команда вернула результат типа: {type(result)}")
|
137
|
-
except Exception as e:
|
138
|
-
print(f"ОШИБКА: Тест не пройден: {e}")
|
139
|
-
return False
|
140
|
-
|
141
|
-
print("OK: Все тесты команды help пройдены успешно.")
|
142
|
-
return True
|
143
|
-
|
144
|
-
|
145
|
-
def main():
|
146
|
-
"""
|
147
|
-
Основная функция для запуска тестов.
|
148
|
-
"""
|
149
|
-
print("=== Проверка MCP Proxy Adapter 3.1.6 ===")
|
150
|
-
|
151
|
-
# Проверяем версию пакета
|
152
|
-
version_ok = check_version()
|
153
|
-
|
154
|
-
# Если версия не соответствует ожидаемой, прекращаем выполнение
|
155
|
-
if not version_ok:
|
156
|
-
print("ОШИБКА: Версия пакета не соответствует требуемой.")
|
157
|
-
return False
|
158
|
-
|
159
|
-
# Тестируем validate_params
|
160
|
-
validate_params_ok = test_validate_params()
|
161
|
-
|
162
|
-
# Тестируем команду help
|
163
|
-
help_command_ok = test_help_command()
|
164
|
-
|
165
|
-
# Выводим общий результат
|
166
|
-
print("\n=== Итоговый результат ===")
|
167
|
-
if version_ok and validate_params_ok and help_command_ok:
|
168
|
-
print("УСПЕХ: Все тесты пройдены успешно!")
|
169
|
-
return True
|
170
|
-
else:
|
171
|
-
print("ОШИБКА: Не все тесты пройдены.")
|
172
|
-
return False
|
173
|
-
|
174
|
-
|
175
|
-
if __name__ == "__main__":
|
176
|
-
success = main()
|
177
|
-
sys.exit(0 if success else 1)
|
examples/test_server.py
DELETED
@@ -1,134 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
"""
|
3
|
-
Тестовый скрипт для запуска сервера JSON-RPC с использованием MCP Proxy Adapter.
|
4
|
-
Использует только базовую команду для тестирования установки пакета.
|
5
|
-
"""
|
6
|
-
|
7
|
-
import os
|
8
|
-
import argparse
|
9
|
-
import sys
|
10
|
-
import uvicorn
|
11
|
-
from pathlib import Path
|
12
|
-
from typing import Dict, Any, Optional
|
13
|
-
|
14
|
-
# Добавляем родительскую директорию в PYTHONPATH для импорта mcp_proxy_adapter
|
15
|
-
sys.path.insert(0, str(Path(__file__).parent.parent))
|
16
|
-
|
17
|
-
from mcp_proxy_adapter import Command, SuccessResult, create_app, registry
|
18
|
-
from mcp_proxy_adapter.core.logging import setup_logging
|
19
|
-
from mcp_proxy_adapter.config import config
|
20
|
-
|
21
|
-
|
22
|
-
class HelloResult(SuccessResult):
|
23
|
-
"""Result of hello command."""
|
24
|
-
|
25
|
-
def __init__(self, message: str):
|
26
|
-
"""
|
27
|
-
Initialize result.
|
28
|
-
|
29
|
-
Args:
|
30
|
-
message: Hello message
|
31
|
-
"""
|
32
|
-
self.message = message
|
33
|
-
|
34
|
-
def to_dict(self) -> Dict[str, Any]:
|
35
|
-
"""
|
36
|
-
Convert result to dictionary.
|
37
|
-
|
38
|
-
Returns:
|
39
|
-
Dictionary representation
|
40
|
-
"""
|
41
|
-
return {"message": self.message}
|
42
|
-
|
43
|
-
@classmethod
|
44
|
-
def get_schema(cls) -> Dict[str, Any]:
|
45
|
-
"""
|
46
|
-
Get JSON schema for result.
|
47
|
-
|
48
|
-
Returns:
|
49
|
-
JSON schema
|
50
|
-
"""
|
51
|
-
return {
|
52
|
-
"type": "object",
|
53
|
-
"properties": {
|
54
|
-
"message": {"type": "string"}
|
55
|
-
},
|
56
|
-
"required": ["message"]
|
57
|
-
}
|
58
|
-
|
59
|
-
|
60
|
-
class HelloCommand(Command):
|
61
|
-
"""Command that returns hello message."""
|
62
|
-
|
63
|
-
name = "hello"
|
64
|
-
result_class = HelloResult
|
65
|
-
|
66
|
-
async def execute(self, name: str = "World") -> HelloResult:
|
67
|
-
"""
|
68
|
-
Execute command.
|
69
|
-
|
70
|
-
Args:
|
71
|
-
name: Name to greet
|
72
|
-
|
73
|
-
Returns:
|
74
|
-
Hello result
|
75
|
-
"""
|
76
|
-
return HelloResult(f"Hello, {name}!")
|
77
|
-
|
78
|
-
@classmethod
|
79
|
-
def get_schema(cls) -> Dict[str, Any]:
|
80
|
-
"""
|
81
|
-
Get JSON schema for command parameters.
|
82
|
-
|
83
|
-
Returns:
|
84
|
-
JSON schema
|
85
|
-
"""
|
86
|
-
return {
|
87
|
-
"type": "object",
|
88
|
-
"properties": {
|
89
|
-
"name": {"type": "string"}
|
90
|
-
},
|
91
|
-
"additionalProperties": False
|
92
|
-
}
|
93
|
-
|
94
|
-
|
95
|
-
def main():
|
96
|
-
"""
|
97
|
-
Основная функция для запуска сервера.
|
98
|
-
"""
|
99
|
-
parser = argparse.ArgumentParser(description="Test JSON-RPC Microservice Server")
|
100
|
-
parser.add_argument("--host", default="0.0.0.0", help="Host to bind server")
|
101
|
-
parser.add_argument("--port", type=int, default=8000, help="Port to bind server")
|
102
|
-
parser.add_argument("--reload", action="store_true", help="Enable auto-reload")
|
103
|
-
parser.add_argument("--config", help="Path to config file")
|
104
|
-
|
105
|
-
args = parser.parse_args()
|
106
|
-
|
107
|
-
# Инициализируем конфигурацию
|
108
|
-
if args.config and os.path.exists(args.config):
|
109
|
-
config.load_from_file(args.config)
|
110
|
-
|
111
|
-
# Настраиваем логирование
|
112
|
-
setup_logging("INFO")
|
113
|
-
|
114
|
-
# Создаем приложение FastAPI
|
115
|
-
app = create_app()
|
116
|
-
app.title = "Test Microservice"
|
117
|
-
app.description = "Test microservice for package installation verification"
|
118
|
-
app.version = "1.0.0"
|
119
|
-
|
120
|
-
# Регистрируем только одну команду для тестирования
|
121
|
-
registry.register(HelloCommand)
|
122
|
-
|
123
|
-
# Запускаем сервер
|
124
|
-
uvicorn.run(
|
125
|
-
app,
|
126
|
-
host=args.host,
|
127
|
-
port=args.port,
|
128
|
-
reload=args.reload,
|
129
|
-
log_level="info"
|
130
|
-
)
|
131
|
-
|
132
|
-
|
133
|
-
if __name__ == "__main__":
|
134
|
-
main()
|
@@ -1,82 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python
|
2
|
-
"""
|
3
|
-
Example of using the API tool description functionality.
|
4
|
-
|
5
|
-
This script demonstrates how to use the API tool description functionality
|
6
|
-
to generate rich and informative descriptions for API tools.
|
7
|
-
"""
|
8
|
-
|
9
|
-
import json
|
10
|
-
import asyncio
|
11
|
-
import sys
|
12
|
-
from pathlib import Path
|
13
|
-
|
14
|
-
# Add the project root to the Python path
|
15
|
-
sys.path.insert(0, str(Path(__file__).parent.parent))
|
16
|
-
|
17
|
-
from mcp_proxy_adapter.commands.command_registry import registry
|
18
|
-
from mcp_proxy_adapter.api.schemas import APIToolDescription
|
19
|
-
from mcp_proxy_adapter.api.tools import get_tool_description, TSTCommandExecutor
|
20
|
-
from mcp_proxy_adapter.commands.help_command import HelpCommand
|
21
|
-
|
22
|
-
|
23
|
-
async def main():
|
24
|
-
"""Main function to demonstrate API tool description functionality."""
|
25
|
-
|
26
|
-
# Register the help command so we have at least one command registered
|
27
|
-
if not registry.command_exists("help"):
|
28
|
-
registry.register(HelpCommand)
|
29
|
-
|
30
|
-
# Generate description using the APIToolDescription class directly
|
31
|
-
print("Generating tool description using APIToolDescription:")
|
32
|
-
description = APIToolDescription.generate_tool_description("tst_execute_command", registry)
|
33
|
-
print(json.dumps(description, indent=2, ensure_ascii=False))
|
34
|
-
print("\n" + "-" * 80 + "\n")
|
35
|
-
|
36
|
-
# Generate text description using the APIToolDescription class
|
37
|
-
print("Generating tool description text using APIToolDescription:")
|
38
|
-
description_text = APIToolDescription.generate_tool_description_text("tst_execute_command", registry)
|
39
|
-
print(description_text)
|
40
|
-
print("\n" + "-" * 80 + "\n")
|
41
|
-
|
42
|
-
# Get tool description using the tools module
|
43
|
-
print("Getting tool description using the tools module:")
|
44
|
-
tool_description = get_tool_description("tst_execute_command")
|
45
|
-
print(json.dumps(tool_description, indent=2, ensure_ascii=False))
|
46
|
-
print("\n" + "-" * 80 + "\n")
|
47
|
-
|
48
|
-
# Get tool description in markdown format using the tools module
|
49
|
-
print("Getting tool description in markdown format using the tools module:")
|
50
|
-
tool_description_md = get_tool_description("tst_execute_command", "markdown")
|
51
|
-
print(tool_description_md)
|
52
|
-
print("\n" + "-" * 80 + "\n")
|
53
|
-
|
54
|
-
# Get tool schema directly from the tool class
|
55
|
-
print("Getting tool schema directly from the tool class:")
|
56
|
-
tool_schema = TSTCommandExecutor.get_schema()
|
57
|
-
print(json.dumps(tool_schema, indent=2, ensure_ascii=False))
|
58
|
-
print("\n" + "-" * 80 + "\n")
|
59
|
-
|
60
|
-
# Get tool description directly from the tool class
|
61
|
-
print("Getting tool description directly from the tool class:")
|
62
|
-
tool_desc = TSTCommandExecutor.get_description("json")
|
63
|
-
print(json.dumps(tool_desc, indent=2, ensure_ascii=False))
|
64
|
-
print("\n" + "-" * 80 + "\n")
|
65
|
-
|
66
|
-
# Show how this can be used to create informative command-line help
|
67
|
-
print("Example command-line help based on tool description:")
|
68
|
-
help_text = f"""
|
69
|
-
{TSTCommandExecutor.name} - {TSTCommandExecutor.description}
|
70
|
-
|
71
|
-
Available commands:
|
72
|
-
"""
|
73
|
-
|
74
|
-
for cmd_name in tool_schema["parameters"]["properties"]["command"]["enum"]:
|
75
|
-
cmd_info = description["supported_commands"].get(cmd_name, {})
|
76
|
-
help_text += f" {cmd_name} - {cmd_info.get('summary', '')}\n"
|
77
|
-
|
78
|
-
print(help_text)
|
79
|
-
|
80
|
-
|
81
|
-
if __name__ == "__main__":
|
82
|
-
asyncio.run(main())
|
mcp_proxy_adapter/py.typed
DELETED
File without changes
|
@@ -1,118 +0,0 @@
|
|
1
|
-
examples/__init__.py,sha256=sLYNpeoiE-X5q7fmJb7NFMmhiIn0543mgJj16q1qmk0,593
|
2
|
-
examples/check_vstl_schema.py,sha256=s-VVoY8ysuvVr64JAX6uvxuwjEB7FjbJf0ek7XYc1Nc,4320
|
3
|
-
examples/fix_vstl_help.py,sha256=GvFepKbCD-a2O2LEflMGeXnsgNMUNfNezPFU6QB_7tI,5208
|
4
|
-
examples/patch_vstl_service.py,sha256=MU-PxZ9gAQx-gT0tyxoWIswDbdV4cYd-r-T9gq4aziw,4715
|
5
|
-
examples/patch_vstl_service_mcp.py,sha256=jiMKzx8hANFVtM0Yv-DJbThwM4r81z9dslF_v9tkAf4,5254
|
6
|
-
examples/server.py,sha256=gnRTE_k7C0A255dLyaJWyA4YU0H6Elc7osr_JQvsQhQ,2286
|
7
|
-
examples/simple_server.py,sha256=Bkczmz5Qs473xJ0_AJjBpqWT-oWctwED98A067z05zQ,3768
|
8
|
-
examples/test_package_3.1.4.py,sha256=GZZANEIrZkw0gfsFK-PKi4lGZ6Fen25RFHSHrOOhR4w,7180
|
9
|
-
examples/test_server.py,sha256=cKWJ4tlHqZsRKyeuXbZ1dQ7TU9riJWcDan__wK7YH_Y,3729
|
10
|
-
examples/tool_description_example.py,sha256=blamrx_1oHCG4NnvIiYnQxphAEDqb7-TALPALJFj51s,3280
|
11
|
-
examples/anti_patterns/README.md,sha256=1-Hby6Wf3kAC0XOV_jOvuHL-kmTypWOUfE_rEU3Knu8,2045
|
12
|
-
examples/anti_patterns/__init__.py,sha256=xbgoTIMM2LNt4P8h0jTaenUxXkA_l9I7JL_9d4BhoDU,261
|
13
|
-
examples/anti_patterns/bad_design/README.md,sha256=SJDMXZfvNMajN0JyvPBm5GtzxyiZZdtMfHslW3-LOII,2422
|
14
|
-
examples/anti_patterns/bad_design/global_state.py,sha256=UnpMCWDfl-DaZSPhWl8C9fGifXkG_sYKhjx3_HvTiSI,5161
|
15
|
-
examples/anti_patterns/bad_design/monolithic_command.py,sha256=gdp1Ok4h4dKto7nfJmhjoWTtjdCfwI-MtcKpn6il7Yo,8815
|
16
|
-
examples/basic_example/README.md,sha256=H2Q5D8XcINpHZoX9fS0UDBFZyd3shNa5PEd6EOckHQQ,8274
|
17
|
-
examples/basic_example/__init__.py,sha256=SXYCM5mPlVpEMdahhukXSYVepNiPNddhgypwAlhJjDU,191
|
18
|
-
examples/basic_example/config.json,sha256=xln79S29iS-borOL61lR3Hw4V5vg83FMs-Ke3j4YqZQ,425
|
19
|
-
examples/basic_example/server.py,sha256=0qoV59ofWBwCGxQX3jefr5WSyvZsEY0X18USh7x-s2s,4900
|
20
|
-
examples/basic_example/commands/__init__.py,sha256=jD5tBWpkxH1Yk9kBHS_V3bBIMxwqqY4skr7RGuRru9s,115
|
21
|
-
examples/basic_example/commands/echo_command.py,sha256=EoXMHEf5ouKjvxvZAEiNH6hqyD6ktyyEDWYP-6Oa2D4,2128
|
22
|
-
examples/basic_example/commands/math_command.py,sha256=apJuU5EXlR965rGmAd2h8zcPWgLUSROtPeZ7Ml0H6nw,4423
|
23
|
-
examples/basic_example/commands/time_command.py,sha256=REw-8RCgq9iVUdQxnIFPmeYO_9_6-7QVLzLKLGq0Lb0,4345
|
24
|
-
examples/basic_example/docs/EN/README.md,sha256=grOp0Adr3h9m-XZLCgLO6haBdUOjc4_VosirNaLl7dU,4637
|
25
|
-
examples/basic_example/docs/RU/README.md,sha256=8jBObIj_3-eDmFt35ufIRw6mm41FyUXJD7olHmKS2QM,6736
|
26
|
-
examples/basic_example/tests/conftest.py,sha256=6e85QRE50P9PMV1RXXVgtBQxy49hVLbevZ6dHFBrxRU,5917
|
27
|
-
examples/commands/echo_command.py,sha256=7RuUZfP0YlKl9gks02NiuiYEiiNPa_8lk9CAZmzijyo,1569
|
28
|
-
examples/commands/echo_command_di.py,sha256=RMumhS6uKFjbvyjlW8IG24HB8UdOEVk-8WLD3xLfCS8,4307
|
29
|
-
examples/commands/echo_result.py,sha256=q5IUEeFoi4PunzOhYD0zju2ZwETdGl35yj4DVXZfX68,1635
|
30
|
-
examples/commands/get_date_command.py,sha256=ePQzZCV-n3tLf4IYv6Gn75t0AXXplXtikCDmrIMD2Q4,2537
|
31
|
-
examples/commands/new_uuid4_command.py,sha256=lJQiPuVHtKCnOEUQukji6dwe0VOkddJ7sZXZ7XUsY6Y,2240
|
32
|
-
examples/complete_example/Dockerfile,sha256=MpwyUpA2wMeLtEVQ2ay98z-l8EX5aEFvwUSxZCCxg64,499
|
33
|
-
examples/complete_example/README.md,sha256=EupIC8DhC7dVsObbXjuERpwheVzfLR2i0y3LzCRHLYs,2784
|
34
|
-
examples/complete_example/__init__.py,sha256=JQDNMNOrQAvbQyEV7tV3XrVKBxZRYy3ODMCVyOxU404,216
|
35
|
-
examples/complete_example/config.json,sha256=KbfZnu4SMYH6B7ENQaZ_sZXrWdkmCdMcWgy47nAHh_Q,814
|
36
|
-
examples/complete_example/docker-compose.yml,sha256=kBXjXFeswZCZ4-UhI0vC0OMR_nMRRoDt3PltCi-RGb8,924
|
37
|
-
examples/complete_example/requirements.txt,sha256=QHeMbXMHgkISmFoXfO09kiaXAMkg0nNBdCfwThKiHDc,403
|
38
|
-
examples/complete_example/server.py,sha256=t-GTqSP0yatjs67O1OFHzf-Yg7tU0aCw6r2eUdYtjpM,3565
|
39
|
-
examples/complete_example/commands/__init__.py,sha256=cZDiwz3nLaeSCwR4oK7xlGgVsXt2WyAlIEMWCxSJPAE,121
|
40
|
-
examples/complete_example/commands/system_command.py,sha256=CwcBRWMODG7Ynr9Syaildu3APuuUdJ_yvQOggAAidg8,10717
|
41
|
-
examples/complete_example/configs/config.dev.yaml,sha256=ASIwU8xzB-kinAsLGghv8-LCER1SUC1ed6K8BktOYPQ,1282
|
42
|
-
examples/complete_example/configs/config.docker.yaml,sha256=DZWxauz5fcaiVFaphvf7zpvLI3oXjUUiXdX_bGlcBds,1389
|
43
|
-
examples/di_example/server.py,sha256=SRcKa_50L6Es7nDYSyTY3zzKQjlCdkAMAEjbwRe8esQ,7144
|
44
|
-
examples/di_example/.pytest_cache/README.md,sha256=c_1vzN2ALEGaay2YPWwxc7fal1WKxLWJ7ewt_kQ9ua0,302
|
45
|
-
examples/minimal_example/README.md,sha256=VFKjDgpNjFowYNLD3sHHGsc1CVhCm30BWPGBqpLFKAc,2569
|
46
|
-
examples/minimal_example/__init__.py,sha256=EloOqdgVLp7YA2DJOWMw0ZxFbVUCH2LqvZVq5RSfSbg,165
|
47
|
-
examples/minimal_example/config.json,sha256=FSL0q_dAyGHJXp37bLesUvvNgrCiFXkQ8_P7nuUhIcQ,250
|
48
|
-
examples/minimal_example/main.py,sha256=5JAoUz_Gy56kcRTxlpuj27PThU6o6R-lKiySIpwsR7s,4770
|
49
|
-
examples/minimal_example/simple_server.py,sha256=IrS32z5G3Z8Ck7pcqwPmrMMA157sFtHM7brP465q54Y,5372
|
50
|
-
examples/minimal_example/tests/conftest.py,sha256=8kRuZws9twR6D4WX9OoSjtK4NwSCAvENPgp9uX3Dg58,4165
|
51
|
-
examples/minimal_example/tests/test_hello_command.py,sha256=C48o7Hh_gy2NlLqb2KKm2HX37df8eIop0IQfOxWPVS0,3485
|
52
|
-
examples/minimal_example/tests/test_integration.py,sha256=mW9LEXX5yOCxP3uIpGMiTEMci7DE8PDDCiE8rKJn4ds,6213
|
53
|
-
mcp_proxy_adapter/__init__.py,sha256=B7m1YWyv_Wb87-Q-JqVpHQgwajnfIgDyZ_iIxzdTbBY,1021
|
54
|
-
mcp_proxy_adapter/config.py,sha256=MjgZAld6TiD0F5oCyEaJhYhfEXVZxc5G5ke2SLKCV9A,5748
|
55
|
-
mcp_proxy_adapter/custom_openapi.py,sha256=tAE289B76nUdd2tjbiyow2Jftj0Yd-A8I2ndTD6R-5c,11706
|
56
|
-
mcp_proxy_adapter/openapi.py,sha256=jyl5EPXcFhzFKEEMXxHeqF1U-SsYvtdlaKGU2QrekpU,13889
|
57
|
-
mcp_proxy_adapter/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
58
|
-
mcp_proxy_adapter/version.py,sha256=VRQ07cLW2F_OHDoYAsBuYZHDoj1M-ztVO8Joii9m1Iw,71
|
59
|
-
mcp_proxy_adapter/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
60
|
-
mcp_proxy_adapter/api/app.py,sha256=TdsZjAwdMr_tYGjmmH3D2voVmQOU_Lw9raKbbYhXkk0,15424
|
61
|
-
mcp_proxy_adapter/api/handlers.py,sha256=lc_4eakQgQVlnGjnVkOY-mIMkfyLk4iRfwdrWTyvuvM,7194
|
62
|
-
mcp_proxy_adapter/api/schemas.py,sha256=xOmiSwHaapY6myEFnLu7o-LWVPM7vwmLYZXFo2c6NfE,12381
|
63
|
-
mcp_proxy_adapter/api/tool_integration.py,sha256=mQNFiCkd4plY_A3fkG6auaM8D_1XiC9Jxp4Zrm1ngYE,10161
|
64
|
-
mcp_proxy_adapter/api/tools.py,sha256=nSDXD4rGlFV_NlB91Y0x3N8WeWvWZ76B32-s-VAFARw,8084
|
65
|
-
mcp_proxy_adapter/api/middleware/__init__.py,sha256=RpaA5hbZ7XIjKaQK0PJpZNqc9tFISe5w7ZmqNgwC6FE,1556
|
66
|
-
mcp_proxy_adapter/api/middleware/auth.py,sha256=bic-ez4o4xh74ZczLXSNafrk_m2qk82GF9MHmfDpf9w,4891
|
67
|
-
mcp_proxy_adapter/api/middleware/base.py,sha256=aMV9YPLHkUnJECuQWYbnlEGaj6xUJFHZR_hJb0OKvu8,2282
|
68
|
-
mcp_proxy_adapter/api/middleware/error_handling.py,sha256=ShguFRn9GBBprevKO7n77ENw4PwYhvBNFu4ptLyjxYQ,6876
|
69
|
-
mcp_proxy_adapter/api/middleware/logging.py,sha256=wGtw4BqKMLgn5zqYd84DnVPtO3evfx2X-TxOCyAmysM,3679
|
70
|
-
mcp_proxy_adapter/api/middleware/performance.py,sha256=dHBxTF43LEGXMKHMH3A8ybKmwAWURd_zswqq_oC4xbw,2454
|
71
|
-
mcp_proxy_adapter/api/middleware/rate_limit.py,sha256=DIv_-ZUVmL-jEo_A5BlfnasZf25zT84AiIJDUUnXkpM,5041
|
72
|
-
mcp_proxy_adapter/commands/__init__.py,sha256=bHZZcVYkXVL9g-YZOnWkHOxSP2WzT-I4_OleYycQhbw,610
|
73
|
-
mcp_proxy_adapter/commands/base.py,sha256=lKKoN_9tJYIeOFKgQRGwWZHy_EvWP8bVB1EhIouTbi0,13740
|
74
|
-
mcp_proxy_adapter/commands/command_registry.py,sha256=3KNmG1Blg1UrThZNU3vGj_2I4ZTFBjUgYZmk7QBOb4w,10998
|
75
|
-
mcp_proxy_adapter/commands/config_command.py,sha256=-Z6BGaEQTf859l56zZpHYBeZFeIVdpMYybDrd7LOPIg,3553
|
76
|
-
mcp_proxy_adapter/commands/dependency_container.py,sha256=Uz9OPRAUZN7tsVrMVgXgPQcsRD2N-e2Ixg9XarPOlnY,3410
|
77
|
-
mcp_proxy_adapter/commands/health_command.py,sha256=_tzxHwB_8vo53VBC6HnBv5fSfZL1pEuwlbrCcy_K78c,4087
|
78
|
-
mcp_proxy_adapter/commands/help_command.py,sha256=dfqNt1h2H6vQJ9rLySWa_-0-QzesnN-Mgx0cz-uFlIo,13051
|
79
|
-
mcp_proxy_adapter/commands/result.py,sha256=2WjftiAuhlyzOKmPJlQHo_b08ZCzWoK7cquUHFLVE-E,5534
|
80
|
-
mcp_proxy_adapter/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
81
|
-
mcp_proxy_adapter/core/errors.py,sha256=s34OxiIR4NCJu_pYSigKXqrIvRjUUK2OWw0X4dpDjIA,5151
|
82
|
-
mcp_proxy_adapter/core/logging.py,sha256=bvvT1ouSyyT1B9za506W-ASW4AoxYnyU_OeGgSgOFsQ,7102
|
83
|
-
mcp_proxy_adapter/core/utils.py,sha256=WJZYNxOXLCPhTF0OH0bzMFYWW6SWwo6XaWG-S5za7u0,3249
|
84
|
-
mcp_proxy_adapter/schemas/base_schema.json,sha256=v9G9cGMd4dRhCZsOQ_FMqOi5VFyVbI6Cf3fyIvOT9dc,2881
|
85
|
-
mcp_proxy_adapter/schemas/openapi_schema.json,sha256=C3yLkwmDsvnLW9B5gnKKdBGl4zxkeU-rEmjTrNVsQU0,8405
|
86
|
-
mcp_proxy_adapter/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
87
|
-
mcp_proxy_adapter/tests/conftest.py,sha256=VBA2wLeYfp9XAGSq4c489PVBIqMGAJiQPrT0k3kyzXw,2999
|
88
|
-
mcp_proxy_adapter/tests/test_api_endpoints.py,sha256=ePtWCf0szD1JeY9WdHAhcKnuOzoSCpUcqZ_2DVhlC-A,10280
|
89
|
-
mcp_proxy_adapter/tests/test_api_handlers.py,sha256=LeHO0o6eCxan6mt_8ZkUwSbeY7qYfoYMJ-bT_sSgdxc,11011
|
90
|
-
mcp_proxy_adapter/tests/test_base_command.py,sha256=nSIi_mfjux8TL--65pMBfyg91EiLjJhI2P_ASWqyW-U,3779
|
91
|
-
mcp_proxy_adapter/tests/test_batch_requests.py,sha256=9-gvhPq48AcEwGlhwgn3DWNhpleLA0f4luZNYMrqlXY,4103
|
92
|
-
mcp_proxy_adapter/tests/test_command_registry.py,sha256=ywi5gM7D7NHcNOkdwXOgpJqHjwGADZEaB3ueM3nR0gM,7683
|
93
|
-
mcp_proxy_adapter/tests/test_config.py,sha256=i4YbFhB3WI1wWKCxkG6l-UpFv2LAbhh4hmGipmYG1d0,3928
|
94
|
-
mcp_proxy_adapter/tests/test_utils.py,sha256=K8DqdWDAV-cXjjeykehHpG5phfq5ydu2HLJzaAL282Y,1653
|
95
|
-
mcp_proxy_adapter/tests/api/__init__.py,sha256=QzjeBIhrRLqfUKYmxVSCbMOoni5MAXgyAx9HxxB6JRs,27
|
96
|
-
mcp_proxy_adapter/tests/api/test_cmd_endpoint.py,sha256=RFg_N7Ut1l_pncUPMaqVg85XV4KTpVe03yI_VA0Z47o,3843
|
97
|
-
mcp_proxy_adapter/tests/api/test_middleware.py,sha256=3Rgc09VJ7JG6_06oIgAVq6u7qJsaiuhW0KpfDjxk8Ac,12285
|
98
|
-
mcp_proxy_adapter/tests/commands/__init__.py,sha256=DZxhtyr__AleyXN1s8Ef887tK5nsoHKfW4QXyzLaP0E,36
|
99
|
-
mcp_proxy_adapter/tests/commands/test_config_command.py,sha256=ud0Y57xUhFiyrUKDyA0eBZ8IOKiGDpioijtwY-detC4,6522
|
100
|
-
mcp_proxy_adapter/tests/commands/test_echo_command.py,sha256=c2dmqfx3ZfvDedy5vuxArFv7iHsReepMmD2Lchg4l3E,3437
|
101
|
-
mcp_proxy_adapter/tests/commands/test_help_command.py,sha256=0kylFDGSYV-YStVCf_j7_4EF8VDaClIZbJz3V2V2-DI,4272
|
102
|
-
mcp_proxy_adapter/tests/functional/__init__.py,sha256=muVNR6LD5o7DsDaLrbLTFsavUNcnyM608-mr-dqzgDU,59
|
103
|
-
mcp_proxy_adapter/tests/functional/test_api.py,sha256=OaGB-WAWVyX4b0b-mCdXBNhwwYABYeBPO3IDnA3I00c,7114
|
104
|
-
mcp_proxy_adapter/tests/integration/__init__.py,sha256=JZpeNG1PBRZ3k5zfq6NH3GyzDc1Yx1ZUgwi6eLBxs1o,60
|
105
|
-
mcp_proxy_adapter/tests/integration/test_cmd_integration.py,sha256=BS3lA6ayveMckHcy1WJjyqR7l7WTcjmGiCYSnMjVfO0,3415
|
106
|
-
mcp_proxy_adapter/tests/integration/test_integration.py,sha256=Rf8GTxdZOvZzrtgqWN2fp-36qUU5rpHdV9zhN1JxNw8,6619
|
107
|
-
mcp_proxy_adapter/tests/performance/__init__.py,sha256=2kHf6g4LmYnFuV4EALXzo7Qk9vHGA9DXZFt7nORRFjM,60
|
108
|
-
mcp_proxy_adapter/tests/performance/test_performance.py,sha256=Djrnu-SsXRrc_Prj1Aw8OoPzPUwHJds-Itk3aX6o01w,5730
|
109
|
-
mcp_proxy_adapter/tests/stubs/__init__.py,sha256=qJ_gqvLdt68rAfLOeJpjVcLWyWdhEg6RkKheyV2yjJs,178
|
110
|
-
mcp_proxy_adapter/tests/stubs/echo_command.py,sha256=Y7SA4IB5Lo_ncn78SDm9iRZvJSKy2pXi2nBQjIUPrvg,2620
|
111
|
-
mcp_proxy_adapter/tests/unit/__init__.py,sha256=RS-5UoSCcLKtr2jrAaZw_NG9MquA6BZmxq-P6cTw9ok,53
|
112
|
-
mcp_proxy_adapter/tests/unit/test_base_command.py,sha256=ldDXQYk2eijbTgZioSBAhHzSAa_SuBKYqCutCEzUYTE,3924
|
113
|
-
mcp_proxy_adapter/tests/unit/test_config.py,sha256=SZ62LXFOv_fsV0fmSIBdHWvapEyexKrioFRQo0I4pkg,5900
|
114
|
-
mcp_proxy_adapter-3.1.6.dist-info/licenses/LICENSE,sha256=OkApFEwdgMCt_mbvUI-eIwKMSTe38K3XnU2DT5ub-wI,1072
|
115
|
-
mcp_proxy_adapter-3.1.6.dist-info/METADATA,sha256=RbYESwlltxLaJLm8rVosrLljcIEkI1IT9VAVpWave9g,7537
|
116
|
-
mcp_proxy_adapter-3.1.6.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
|
117
|
-
mcp_proxy_adapter-3.1.6.dist-info/top_level.txt,sha256=kxq3OC7vBtsFdy9dDVse4cOl-SV_QlvcTeSkuw_jw3I,27
|
118
|
-
mcp_proxy_adapter-3.1.6.dist-info/RECORD,,
|
File without changes
|