mcp-proxy-adapter 3.1.3__tar.gz → 3.1.6__tar.gz
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-3.1.3/mcp_proxy_adapter.egg-info → mcp_proxy_adapter-3.1.6}/PKG-INFO +1 -1
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/development/DEPENDENCY_INJECTION.md +1 -1
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/development/DEPENDENCY_INJECTION.md +1 -1
- mcp_proxy_adapter-3.1.6/examples/check_vstl_schema.py +106 -0
- mcp_proxy_adapter-3.1.6/examples/fix_vstl_help.py +123 -0
- mcp_proxy_adapter-3.1.6/examples/patch_vstl_service.py +105 -0
- mcp_proxy_adapter-3.1.6/examples/patch_vstl_service_mcp.py +108 -0
- mcp_proxy_adapter-3.1.6/examples/test_package_3.1.4.py +177 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/api/app.py +21 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/commands/base.py +4 -3
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/commands/command_registry.py +15 -0
- mcp_proxy_adapter-3.1.6/mcp_proxy_adapter/commands/help_command.py +290 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/commands/test_help_command.py +8 -5
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/integration/test_cmd_integration.py +4 -5
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/test_command_registry.py +37 -1
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/version.py +1 -1
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6/mcp_proxy_adapter.egg-info}/PKG-INFO +1 -1
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter.egg-info/SOURCES.txt +5 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/pyproject.toml +1 -1
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/setup.py +1 -1
- mcp_proxy_adapter-3.1.3/mcp_proxy_adapter/commands/help_command.py +0 -195
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/LICENSE +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/MANIFEST.in +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/README.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/API_SCHEMA.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/AUTOMATED_PUBLISHING.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/BASIC_ARCHITECTURE.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/COMMAND_CHECKLIST.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/COMMAND_RESULTS.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/COMMAND_TEMPLATE.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/CONFIGURATION_PRINCIPLES.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/DOCUMENTATION_MAP.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/DOCUMENTATION_STANDARDS.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/ERROR_HANDLING.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/EXAMPLES_COMMAND_CLASSES.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/GLOSSARY.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/LOGGING_SYSTEM.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/NAMING_STANDARDS.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/OPENAPI_SCHEMA.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/PROJECT_EXTENSION_GUIDE.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/PROJECT_IDEOLOGY.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/PROJECT_RULES.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/PROJECT_STRUCTURE.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/PUBLISHING_TO_PYPI.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/README.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/api/cmd_endpoint.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/api/errors.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/api/intro.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/api/requests.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/api/responses.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/commands/get_date_command.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/commands/help_command.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/commands/index.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/commands/new_uuid4_command.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/development/COMMAND_METADATA_ENHANCEMENT.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/development/METADATA_COMMANDS.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/development/OPENAPI_CUSTOMIZATION.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/development/REMOVE_COMMAND_GUIDE.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/development/TOOL_INTEGRATION.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/development/architecture.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/examples/README.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/examples/anti_patterns.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/examples/basic_example.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/examples/complete_example.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/examples/minimal_example.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/testing/README.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/user/basic_usage.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/user/configuration.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/user/deployment.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/user/examples.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/user/installation.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/API_SCHEMA.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/AUTOMATED_PUBLISHING.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/BASIC_ARCHITECTURE.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/COMMAND_CHECKLIST.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/COMMAND_RESULTS.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/COMMAND_TEMPLATE.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/CONFIGURATION_PRINCIPLES.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/DOCUMENTATION_MAP.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/DOCUMENTATION_STANDARDS.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/ERROR_HANDLING.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/EXAMPLES_COMMAND_CLASSES.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/GLOSSARY.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/LOGGING_SYSTEM.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/NAMING_STANDARDS.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/OPENAPI_SCHEMA.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/PROJECT_EXTENSION_GUIDE.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/PROJECT_IDEOLOGY.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/PROJECT_RULES.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/PROJECT_STRUCTURE.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/PUBLISHING_TO_PYPI.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/README.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/api/cmd_endpoint.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/api/errors.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/api/intro.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/api/requests.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/api/responses.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/commands/get_date_command.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/commands/help_command.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/commands/index.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/commands/new_uuid4_command.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/development/COMMAND_METADATA_ENHANCEMENT.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/development/METADATA_COMMANDS.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/development/OPENAPI_CUSTOMIZATION.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/development/PLAN_REALIZACII_METADATA.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/development/REMOVE_COMMAND_GUIDE.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/development/TOOL_INTEGRATION.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/development/architecture.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/examples/README.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/examples/anti_patterns.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/examples/basic_example.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/examples/complete_example.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/examples/minimal_example.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/testing/README.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/user/basic_usage.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/user/configuration.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/user/deployment.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/user/examples.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/user/installation.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/anti_patterns/README.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/anti_patterns/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/anti_patterns/bad_design/README.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/anti_patterns/bad_design/global_state.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/anti_patterns/bad_design/monolithic_command.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/basic_example/README.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/basic_example/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/basic_example/commands/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/basic_example/commands/echo_command.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/basic_example/commands/math_command.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/basic_example/commands/time_command.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/basic_example/config.json +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/basic_example/docs/EN/README.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/basic_example/docs/RU/README.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/basic_example/server.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/basic_example/tests/conftest.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/commands/echo_command.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/commands/echo_command_di.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/commands/echo_result.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/commands/get_date_command.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/commands/new_uuid4_command.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/complete_example/Dockerfile +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/complete_example/README.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/complete_example/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/complete_example/commands/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/complete_example/commands/system_command.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/complete_example/config.json +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/complete_example/configs/config.dev.yaml +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/complete_example/configs/config.docker.yaml +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/complete_example/docker-compose.yml +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/complete_example/requirements.txt +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/complete_example/server.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/di_example/.pytest_cache/README.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/di_example/server.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/minimal_example/README.md +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/minimal_example/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/minimal_example/config.json +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/minimal_example/main.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/minimal_example/simple_server.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/minimal_example/tests/conftest.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/minimal_example/tests/test_hello_command.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/minimal_example/tests/test_integration.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/server.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/simple_server.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/test_server.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/examples/tool_description_example.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/api/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/api/handlers.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/api/middleware/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/api/middleware/auth.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/api/middleware/base.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/api/middleware/error_handling.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/api/middleware/logging.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/api/middleware/performance.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/api/middleware/rate_limit.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/api/schemas.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/api/tool_integration.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/api/tools.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/commands/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/commands/config_command.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/commands/dependency_container.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/commands/health_command.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/commands/result.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/config.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/core/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/core/errors.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/core/logging.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/core/utils.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/custom_openapi.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/openapi.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/py.typed +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/schemas/base_schema.json +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/schemas/openapi_schema.json +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/api/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/api/test_cmd_endpoint.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/api/test_middleware.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/commands/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/commands/test_config_command.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/commands/test_echo_command.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/conftest.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/functional/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/functional/test_api.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/integration/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/integration/test_integration.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/performance/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/performance/test_performance.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/stubs/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/stubs/echo_command.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/test_api_endpoints.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/test_api_handlers.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/test_base_command.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/test_batch_requests.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/test_config.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/test_utils.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/unit/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/unit/test_base_command.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter/tests/unit/test_config.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter.egg-info/dependency_links.txt +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter.egg-info/requires.txt +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/mcp_proxy_adapter.egg-info/top_level.txt +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/requirements.txt +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/setup.cfg +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/tests/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/tests/api/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/tests/api/test_handler_dependency_injection.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/tests/api/test_tool_description.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/tests/commands/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/tests/commands/test_command_di.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/tests/commands/test_command_metadata.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/tests/commands/test_dependency_container.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/tests/commands/test_echo_command_di.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/tests/commands/test_help_command.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/tests/conftest.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/tests/integration/__init__.py +0 -0
- {mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/tests/integration/test_di_integration.py +0 -0
{mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/EN/development/DEPENDENCY_INJECTION.md
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Dependency Injection
|
2
2
|
|
3
|
-
MCP Proxy Adapter version 3.1.
|
3
|
+
MCP Proxy Adapter version 3.1.6 introduces support for Dependency Injection (DI).
|
4
4
|
This feature allows creating more flexible and testable commands that can
|
5
5
|
use shared services and resources.
|
6
6
|
|
{mcp_proxy_adapter-3.1.3 → mcp_proxy_adapter-3.1.6}/docs/RU/development/DEPENDENCY_INJECTION.md
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Внедрение зависимостей (Dependency Injection)
|
2
2
|
|
3
|
-
В версии 3.1.
|
3
|
+
В версии 3.1.6 библиотеки MCP Proxy Adapter добавлена поддержка внедрения зависимостей (DI).
|
4
4
|
Эта функциональность позволяет создавать более гибкие и тестируемые команды, которые
|
5
5
|
могут использовать общие сервисы и ресурсы.
|
6
6
|
|
@@ -0,0 +1,106 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
"""
|
3
|
+
Скрипт для проверки схемы команды help в сервисе VSTL
|
4
|
+
"""
|
5
|
+
|
6
|
+
import json
|
7
|
+
import requests
|
8
|
+
from typing import Dict, Any, Optional
|
9
|
+
|
10
|
+
# URL и заголовки для VSTL сервиса
|
11
|
+
VSTL_URL = "http://localhost:8007/cmd"
|
12
|
+
HEADERS = {"Content-Type": "application/json"}
|
13
|
+
|
14
|
+
def send_json_rpc(method: str, params: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
|
15
|
+
"""
|
16
|
+
Отправляет JSON-RPC запрос и возвращает ответ
|
17
|
+
|
18
|
+
Args:
|
19
|
+
method: Имя метода
|
20
|
+
params: Параметры запроса
|
21
|
+
|
22
|
+
Returns:
|
23
|
+
Dict[str, Any]: Ответ сервера
|
24
|
+
"""
|
25
|
+
# Формируем JSON-RPC запрос
|
26
|
+
payload = {
|
27
|
+
"jsonrpc": "2.0",
|
28
|
+
"method": method,
|
29
|
+
"id": 1
|
30
|
+
}
|
31
|
+
|
32
|
+
# Добавляем параметры, если они есть
|
33
|
+
if params is not None:
|
34
|
+
payload["params"] = params
|
35
|
+
|
36
|
+
print(f"Отправляем запрос: {json.dumps(payload, indent=2)}")
|
37
|
+
|
38
|
+
# Отправляем запрос
|
39
|
+
response = requests.post(VSTL_URL, json=payload, headers=HEADERS)
|
40
|
+
|
41
|
+
# Возвращаем ответ
|
42
|
+
return response.json()
|
43
|
+
|
44
|
+
def test_help_command():
|
45
|
+
"""
|
46
|
+
Проверяет команду help в различных вариантах
|
47
|
+
"""
|
48
|
+
print("\n=== Проверка команды help без параметров ===")
|
49
|
+
response = send_json_rpc("help")
|
50
|
+
print(f"Ответ: {json.dumps(response, indent=2)}")
|
51
|
+
|
52
|
+
print("\n=== Проверка команды help с пустыми параметрами ===")
|
53
|
+
response = send_json_rpc("help", {})
|
54
|
+
print(f"Ответ: {json.dumps(response, indent=2)}")
|
55
|
+
|
56
|
+
print("\n=== Проверка команды help с параметром cmdname=null ===")
|
57
|
+
response = send_json_rpc("help", {"cmdname": None})
|
58
|
+
print(f"Ответ: {json.dumps(response, indent=2)}")
|
59
|
+
|
60
|
+
print("\n=== Проверка команды help с параметром cmdname=\"config\" ===")
|
61
|
+
response = send_json_rpc("help", {"cmdname": "config"})
|
62
|
+
print(f"Ответ: {json.dumps(response, indent=2)}")
|
63
|
+
|
64
|
+
# Проверяем workaround с передачей строки "null"
|
65
|
+
print("\n=== Проверка команды help с параметром cmdname=\"null\" ===")
|
66
|
+
response = send_json_rpc("help", {"cmdname": "null"})
|
67
|
+
print(f"Ответ: {json.dumps(response, indent=2)}")
|
68
|
+
|
69
|
+
def check_schema():
|
70
|
+
"""
|
71
|
+
Проверяет схему команд и ищет обязательные параметры
|
72
|
+
"""
|
73
|
+
print("\n=== Проверка схемы команд ===")
|
74
|
+
|
75
|
+
# Запрашиваем список всех доступных команд
|
76
|
+
health_response = send_json_rpc("health")
|
77
|
+
print(f"Здоровье сервиса: {json.dumps(health_response, indent=2)}")
|
78
|
+
|
79
|
+
# Проверяем команду config для получения схемы
|
80
|
+
config_response = send_json_rpc("config", {"operation": "get"})
|
81
|
+
print(f"Конфигурация: {json.dumps(config_response, indent=2)}")
|
82
|
+
|
83
|
+
# Пробуем с явным указанием строки вместо null
|
84
|
+
print("\n=== Проверка команды help с cmdname=\"\" (пустая строка) ===")
|
85
|
+
response = send_json_rpc("help", {"cmdname": ""})
|
86
|
+
print(f"Ответ: {json.dumps(response, indent=2)}")
|
87
|
+
|
88
|
+
# Создаем свой вариант с переопределением параметров
|
89
|
+
print("\n=== Проверка специального запроса с kwargs=null ===")
|
90
|
+
# Прямая отправка JSON с null значением для kwargs
|
91
|
+
special_payload = {
|
92
|
+
"jsonrpc": "2.0",
|
93
|
+
"method": "help",
|
94
|
+
"params": {"kwargs": None},
|
95
|
+
"id": 1
|
96
|
+
}
|
97
|
+
response = requests.post(VSTL_URL, json=special_payload, headers=HEADERS)
|
98
|
+
print(f"Ответ: {json.dumps(response.json(), indent=2)}")
|
99
|
+
|
100
|
+
if __name__ == "__main__":
|
101
|
+
print("=== Диагностика проблемы с командой help в сервисе VSTL ===")
|
102
|
+
try:
|
103
|
+
test_help_command()
|
104
|
+
check_schema()
|
105
|
+
except Exception as e:
|
106
|
+
print(f"Ошибка при выполнении: {e}")
|
@@ -0,0 +1,123 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
"""
|
3
|
+
Скрипт для исправления проблемы с обработкой JavaScript null в сервисе VSTL.
|
4
|
+
|
5
|
+
Этот скрипт демонстрирует проблему с обработкой null значений в VSTL
|
6
|
+
и способ её решения с помощью обновленной реализации метода validate_params.
|
7
|
+
"""
|
8
|
+
|
9
|
+
import sys
|
10
|
+
import json
|
11
|
+
import requests
|
12
|
+
from typing import Dict, Any, Optional
|
13
|
+
|
14
|
+
# URL и заголовки для VSTL сервиса
|
15
|
+
VSTL_URL = "http://localhost:8000/cmd"
|
16
|
+
HEADERS = {"Content-Type": "application/json"}
|
17
|
+
|
18
|
+
def call_vstl_help(params: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
|
19
|
+
"""
|
20
|
+
Вызывает команду help в сервисе VSTL.
|
21
|
+
|
22
|
+
Args:
|
23
|
+
params: Параметры для команды help
|
24
|
+
|
25
|
+
Returns:
|
26
|
+
Dict[str, Any]: Ответ от сервиса
|
27
|
+
"""
|
28
|
+
payload = {
|
29
|
+
"jsonrpc": "2.0",
|
30
|
+
"method": "help",
|
31
|
+
"params": params or {},
|
32
|
+
"id": 1
|
33
|
+
}
|
34
|
+
|
35
|
+
response = requests.post(VSTL_URL, json=payload, headers=HEADERS)
|
36
|
+
return response.json()
|
37
|
+
|
38
|
+
def test_validate_params_fix():
|
39
|
+
"""
|
40
|
+
Демонстрирует проблему с обработкой null и решение с помощью
|
41
|
+
улучшенной реализации метода validate_params.
|
42
|
+
"""
|
43
|
+
# Оригинальная реализация метода validate_params
|
44
|
+
def original_validate_params(params: Dict[str, Any]) -> Dict[str, Any]:
|
45
|
+
if params is None:
|
46
|
+
params = {}
|
47
|
+
|
48
|
+
validated_params = params.copy()
|
49
|
+
|
50
|
+
for key, value in list(validated_params.items()):
|
51
|
+
if value is None or (isinstance(value, str) and value == ""):
|
52
|
+
if key in ["cmdname"]:
|
53
|
+
pass
|
54
|
+
else:
|
55
|
+
del validated_params[key]
|
56
|
+
|
57
|
+
return validated_params
|
58
|
+
|
59
|
+
# Улучшенная реализация метода validate_params
|
60
|
+
def improved_validate_params(params: Dict[str, Any]) -> Dict[str, Any]:
|
61
|
+
if params is None:
|
62
|
+
params = {}
|
63
|
+
|
64
|
+
validated_params = params.copy()
|
65
|
+
|
66
|
+
for key, value in list(validated_params.items()):
|
67
|
+
if value is None or (isinstance(value, str) and value.lower() in ["null", "none", ""]):
|
68
|
+
if key in ["cmdname"]:
|
69
|
+
validated_params[key] = None
|
70
|
+
else:
|
71
|
+
del validated_params[key]
|
72
|
+
|
73
|
+
return validated_params
|
74
|
+
|
75
|
+
# Тестирование оригинальной реализации
|
76
|
+
original_params = {"unknown_param": "null"}
|
77
|
+
|
78
|
+
print("\n=== Оригинальные параметры ===")
|
79
|
+
print(f"Параметры: {original_params}")
|
80
|
+
print("Результат validate_params (оригинальный):")
|
81
|
+
try:
|
82
|
+
print(original_validate_params(original_params))
|
83
|
+
except Exception as e:
|
84
|
+
print(f"ОШИБКА: {e}")
|
85
|
+
|
86
|
+
# Тестирование улучшенной реализации
|
87
|
+
print("\n=== Улучшенная обработка 'null' ===")
|
88
|
+
print(f"Параметры: {original_params}")
|
89
|
+
print("Результат validate_params (улучшенный):")
|
90
|
+
try:
|
91
|
+
print(improved_validate_params(original_params))
|
92
|
+
except Exception as e:
|
93
|
+
print(f"ОШИБКА: {e}")
|
94
|
+
|
95
|
+
# Проверка запроса к VSTL с null в параметрах
|
96
|
+
print("\n=== Тестирование запроса к VSTL ===")
|
97
|
+
|
98
|
+
# Тест с null в параметрах
|
99
|
+
print("\nТест 1: Запрос с null в параметрах")
|
100
|
+
response = call_vstl_help({"unknown_param": None})
|
101
|
+
print(f"Ответ: {json.dumps(response, indent=2)}")
|
102
|
+
|
103
|
+
# Тест с строковым "null" в параметрах
|
104
|
+
print("\nТест 2: Запрос со строковым 'null' в параметрах")
|
105
|
+
response = call_vstl_help({"unknown_param": "null"})
|
106
|
+
print(f"Ответ: {json.dumps(response, indent=2)}")
|
107
|
+
|
108
|
+
# Рекомендации по исправлению
|
109
|
+
print("\n=== Рекомендации по исправлению ===")
|
110
|
+
print("""
|
111
|
+
1. Обновите метод validate_params в файле commands/base.py на улучшенную версию:
|
112
|
+
- Добавьте проверку на строки "null" и "none" (в любом регистре)
|
113
|
+
- Для параметров, которые могут быть None, преобразуйте их в Python None
|
114
|
+
|
115
|
+
2. Обновите метод execute команды help, чтобы игнорировать неизвестные параметры:
|
116
|
+
- Добавьте аргумент **kwargs в сигнатуру метода
|
117
|
+
|
118
|
+
Эти изменения улучшат совместимость с клиентами, отправляющими JavaScript null
|
119
|
+
и сделают API более устойчивым к различным форматам входных данных.
|
120
|
+
""")
|
121
|
+
|
122
|
+
if __name__ == "__main__":
|
123
|
+
test_validate_params_fix()
|
@@ -0,0 +1,105 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
"""
|
3
|
+
Скрипт для исправления ошибки 'name null is not defined' в сервисе VSTL.
|
4
|
+
|
5
|
+
Этот скрипт обходит проблему с обработкой null в сервисе vstl
|
6
|
+
при помощи модификации JSON-RPC запросов, чтобы заменять null на None.
|
7
|
+
|
8
|
+
Использование:
|
9
|
+
python patch_vstl_service.py
|
10
|
+
"""
|
11
|
+
|
12
|
+
import sys
|
13
|
+
import json
|
14
|
+
import requests
|
15
|
+
from typing import Dict, Any, Optional
|
16
|
+
|
17
|
+
# URL и заголовки для VSTL сервиса
|
18
|
+
VSTL_URL = "http://localhost:8000/cmd"
|
19
|
+
HEADERS = {"Content-Type": "application/json"}
|
20
|
+
|
21
|
+
def safe_call_vstl(command: str, params: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
|
22
|
+
"""
|
23
|
+
Безопасно вызывает команду в сервисе VSTL, обрабатывая null значения.
|
24
|
+
|
25
|
+
Args:
|
26
|
+
command: Имя команды
|
27
|
+
params: Параметры для команды
|
28
|
+
|
29
|
+
Returns:
|
30
|
+
Dict[str, Any]: Ответ от сервиса
|
31
|
+
"""
|
32
|
+
# Обработка null значений - заменяем null на None для Python
|
33
|
+
safe_params = {}
|
34
|
+
if params:
|
35
|
+
for key, value in params.items():
|
36
|
+
if value == "null" or value == "none":
|
37
|
+
safe_params[key] = None
|
38
|
+
else:
|
39
|
+
safe_params[key] = value
|
40
|
+
|
41
|
+
# Безопасно сериализуем параметры, чтобы null значения были корректно обработаны
|
42
|
+
payload = {
|
43
|
+
"jsonrpc": "2.0",
|
44
|
+
"method": command,
|
45
|
+
"params": safe_params or {},
|
46
|
+
"id": 1
|
47
|
+
}
|
48
|
+
|
49
|
+
# Отправляем запрос
|
50
|
+
response = requests.post(VSTL_URL, json=payload, headers=HEADERS)
|
51
|
+
return response.json()
|
52
|
+
|
53
|
+
def test_vstl_commands():
|
54
|
+
"""
|
55
|
+
Тестирует различные команды в сервисе VSTL с безопасной обработкой null.
|
56
|
+
"""
|
57
|
+
print("=== Тестирование команд VSTL с патчем для обработки null ===\n")
|
58
|
+
|
59
|
+
# Проверяем команду health
|
60
|
+
print("1. Команда health:")
|
61
|
+
response = safe_call_vstl("health", {})
|
62
|
+
print(f"Ответ: {json.dumps(response, indent=2)}\n")
|
63
|
+
|
64
|
+
# Проверяем команду help без параметров
|
65
|
+
print("2. Команда help без параметров:")
|
66
|
+
response = safe_call_vstl("help", {})
|
67
|
+
print(f"Ответ: {json.dumps(response, indent=2)}")
|
68
|
+
|
69
|
+
# Если команда help сработала, выведем список всех доступных команд
|
70
|
+
if response.get("result") and not response.get("error"):
|
71
|
+
commands_info = response["result"].get("commands", {})
|
72
|
+
print(f"\nДоступные команды ({len(commands_info)}):")
|
73
|
+
for cmd_name, cmd_info in commands_info.items():
|
74
|
+
print(f" - {cmd_name}: {cmd_info.get('summary', 'Нет описания')}")
|
75
|
+
|
76
|
+
# Проверяем команду help с параметром cmdname
|
77
|
+
print("\n3. Команда help с параметром cmdname:")
|
78
|
+
response = safe_call_vstl("help", {"cmdname": "health"})
|
79
|
+
print(f"Ответ: {json.dumps(response, indent=2)}\n")
|
80
|
+
|
81
|
+
# Проверяем команду config
|
82
|
+
print("4. Команда config:")
|
83
|
+
response = safe_call_vstl("config", {"operation": "get"})
|
84
|
+
print(f"Ответ: {json.dumps(response, indent=2)}\n")
|
85
|
+
|
86
|
+
# Выводим рекомендации по полному исправлению
|
87
|
+
print("\n=== Рекомендации по полному исправлению проблемы с null в VSTL ===")
|
88
|
+
print("""
|
89
|
+
1. Проверьте исходный код сервиса VSTL на наличие использования переменной 'null'
|
90
|
+
без её объявления (обратите внимание на файл help_command.py)
|
91
|
+
|
92
|
+
2. Замените все использования JavaScript-стиля null на Python None:
|
93
|
+
- Поиск: if value == null
|
94
|
+
- Замена: if value is None
|
95
|
+
|
96
|
+
3. Обновите сервис до последней версии mcp_proxy_adapter 3.1.6 и перезапустите
|
97
|
+
|
98
|
+
4. Если это невозможно, используйте этот скрипт как промежуточное решение,
|
99
|
+
чтобы безопасно вызывать команды VSTL с корректной обработкой null.
|
100
|
+
|
101
|
+
5. Внесите исправления в метод validate_params, как показано в fix_vstl_help.py
|
102
|
+
""")
|
103
|
+
|
104
|
+
if __name__ == "__main__":
|
105
|
+
test_vstl_commands()
|
@@ -0,0 +1,108 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
"""
|
3
|
+
Скрипт для исправления ошибки 'name null is not defined' в сервисе VSTL через MCP Proxy API.
|
4
|
+
|
5
|
+
Этот скрипт демонстрирует как обойти проблему с null в сервисе vstl,
|
6
|
+
используя стандартные средства MCP Proxy API.
|
7
|
+
"""
|
8
|
+
|
9
|
+
import os
|
10
|
+
import sys
|
11
|
+
import json
|
12
|
+
import subprocess
|
13
|
+
from typing import Dict, Any, Optional
|
14
|
+
|
15
|
+
def call_vstl_command(command: str, params: Optional[Dict[str, Any]] = None):
|
16
|
+
"""
|
17
|
+
Вызывает команду vstl через MCP Proxy API.
|
18
|
+
|
19
|
+
Args:
|
20
|
+
command: Название команды
|
21
|
+
params: Параметры команды
|
22
|
+
|
23
|
+
Returns:
|
24
|
+
Результат выполнения команды
|
25
|
+
"""
|
26
|
+
# Формируем параметры для команды mcp_MCP-Proxy_vstl
|
27
|
+
if params is None:
|
28
|
+
params = {}
|
29
|
+
|
30
|
+
# Сериализуем параметры в JSON
|
31
|
+
params_json = json.dumps(params)
|
32
|
+
|
33
|
+
# Формируем команду для вызова MCP Proxy API
|
34
|
+
cmd = [
|
35
|
+
"curl", "-s",
|
36
|
+
"-X", "POST",
|
37
|
+
"-H", "Content-Type: application/json",
|
38
|
+
"-d", f'{{"jsonrpc":"2.0","method":"{command}","params":{params_json},"id":1}}',
|
39
|
+
"http://localhost:8000/api/vstl"
|
40
|
+
]
|
41
|
+
|
42
|
+
# Выполняем команду
|
43
|
+
try:
|
44
|
+
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
|
45
|
+
# Парсим результат как JSON
|
46
|
+
return json.loads(result.stdout)
|
47
|
+
except subprocess.CalledProcessError as e:
|
48
|
+
print(f"Ошибка выполнения команды: {e}")
|
49
|
+
print(f"STDOUT: {e.stdout}")
|
50
|
+
print(f"STDERR: {e.stderr}")
|
51
|
+
return {"error": str(e)}
|
52
|
+
except json.JSONDecodeError as e:
|
53
|
+
print(f"Ошибка декодирования JSON: {e}")
|
54
|
+
print(f"Ответ: {result.stdout}")
|
55
|
+
return {"error": "Неверный формат JSON в ответе"}
|
56
|
+
|
57
|
+
def test_vstl_commands():
|
58
|
+
"""
|
59
|
+
Тестирует различные команды vstl с обходом проблемы null.
|
60
|
+
"""
|
61
|
+
print("=== Тестирование команд VSTL через MCP Proxy API ===\n")
|
62
|
+
|
63
|
+
# Проверяем команду health
|
64
|
+
print("1. Команда health:")
|
65
|
+
response = call_vstl_command("health", {})
|
66
|
+
print(f"Ответ: {json.dumps(response, indent=2)}\n")
|
67
|
+
|
68
|
+
# Проверяем команду help без параметров
|
69
|
+
print("2. Команда help без параметров:")
|
70
|
+
response = call_vstl_command("help", {})
|
71
|
+
print(f"Ответ: {json.dumps(response, indent=2)}")
|
72
|
+
|
73
|
+
# Если есть ошибка в команде help без параметров, попробуем еще несколько вариантов
|
74
|
+
if "error" in response:
|
75
|
+
print("\n2.1. Попытка обойти ошибку - вызов help с корректными параметрами:")
|
76
|
+
response = call_vstl_command("help", {"cmdname": None})
|
77
|
+
print(f"Ответ: {json.dumps(response, indent=2)}")
|
78
|
+
|
79
|
+
# Проверяем команду help с параметром cmdname
|
80
|
+
print("\n3. Команда help с параметром cmdname:")
|
81
|
+
response = call_vstl_command("help", {"cmdname": "health"})
|
82
|
+
print(f"Ответ: {json.dumps(response, indent=2)}\n")
|
83
|
+
|
84
|
+
# Проверяем команду config
|
85
|
+
print("4. Команда config:")
|
86
|
+
response = call_vstl_command("config", {"operation": "get"})
|
87
|
+
print(f"Ответ: {json.dumps(response, indent=2)}\n")
|
88
|
+
|
89
|
+
# Выводим рекомендации по исправлению
|
90
|
+
print("\n=== Рекомендации по исправлению проблемы с null в VSTL ===")
|
91
|
+
print("""
|
92
|
+
1. Проблема с обработкой null в JavaScript-совместимых API - это распространенная ошибка.
|
93
|
+
В JavaScript null - это ключевое слово, а в Python - это None.
|
94
|
+
|
95
|
+
2. Для полного решения проблемы необходимо исправить реализацию сервиса VSTL:
|
96
|
+
- Найти в коде места, где используется 'null' как переменная
|
97
|
+
- Заменить на корректное использование None
|
98
|
+
- Добавить к аргументам метода execute в help_command.py параметр **kwargs
|
99
|
+
- Обновить метод validate_params для обработки строковых представлений null
|
100
|
+
|
101
|
+
3. До исправления сервера можно использовать следующие обходные пути:
|
102
|
+
- Использовать MCP Proxy API с корректными значениями параметров (None вместо null)
|
103
|
+
- Использовать промежуточный слой, который будет преобразовывать запросы
|
104
|
+
- Избегать отправки параметров null/None в командах, где это возможно
|
105
|
+
""")
|
106
|
+
|
107
|
+
if __name__ == "__main__":
|
108
|
+
test_vstl_commands()
|
@@ -0,0 +1,177 @@
|
|
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)
|
@@ -200,6 +200,27 @@ def create_app() -> FastAPI:
|
|
200
200
|
"error": e.to_dict()
|
201
201
|
}
|
202
202
|
)
|
203
|
+
except NotFoundError as e:
|
204
|
+
# Специальная обработка для help-команды: возвращаем result с пустым commands и error
|
205
|
+
if command_name == "help":
|
206
|
+
return {
|
207
|
+
"result": {
|
208
|
+
"success": False,
|
209
|
+
"commands": {},
|
210
|
+
"error": str(e),
|
211
|
+
"note": "To get detailed information about a specific command, call help with parameter: POST /cmd {\"command\": \"help\", \"params\": {\"cmdname\": \"<command_name>\"}}"
|
212
|
+
}
|
213
|
+
}
|
214
|
+
# Для остальных команд — стандартная ошибка
|
215
|
+
return JSONResponse(
|
216
|
+
status_code=200,
|
217
|
+
content={
|
218
|
+
"error": {
|
219
|
+
"code": e.code,
|
220
|
+
"message": str(e)
|
221
|
+
}
|
222
|
+
}
|
223
|
+
)
|
203
224
|
|
204
225
|
except json.JSONDecodeError:
|
205
226
|
req_logger.error("JSON decode error")
|