mcp-dbutils 1.0.0__tar.gz → 1.0.2__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_dbutils-1.0.0 → mcp_dbutils-1.0.2}/CHANGELOG.md +14 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/PKG-INFO +1 -1
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/write-operations.md +22 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/configuration-write-operations.md +29 -6
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/pyproject.toml +1 -1
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/base.py +16 -15
- mcp_dbutils-1.0.2/tests/unit/test_base_extended.py +504 -0
- mcp_dbutils-1.0.2/tests/unit/test_init.py +141 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_write_permissions.py +27 -11
- mcp_dbutils-1.0.0/coverage.xml +0 -1928
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.coveragerc +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_ar.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_en.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_es.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_fr.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_ru.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_zh.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_ar.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_en.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_es.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_fr.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_ru.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_zh.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_ar.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_en.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_es.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_fr.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_ru.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_zh.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_ar.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_en.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_es.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_fr.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_ru.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_zh.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_ar.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_en.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_es.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_fr.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_ru.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_zh.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/workflows/code-style.yml +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/workflows/issue-translator.yml +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/workflows/quality-assurance.yml +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/workflows/release.yml +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.gitignore +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.pre-commit-config.yaml +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.releaserc.json +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/Dockerfile +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/LICENSE +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/README.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/README_AR.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/README_EN.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/README_ES.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/README_FR.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/README_RU.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/config.yaml.example +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/configuration.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/examples/README.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/examples/advanced-llm-interactions.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/examples/mysql-examples.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/examples/postgresql-examples.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/examples/sqlite-examples.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/installation-platform-specific.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/installation.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/technical/architecture.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/technical/development.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/technical/security.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/technical/sonarcloud-integration.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/technical/testing.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/usage.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/document-consistency-check.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/document-version-history.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/configuration.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/examples/advanced-llm-interactions.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/examples/mysql-examples.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/examples/postgresql-examples.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/examples/sqlite-examples.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/installation-platform-specific.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/installation.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/technical/architecture.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/technical/development.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/technical/security.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/technical/sonarcloud-integration.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/technical/testing.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/usage.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/configuration.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/examples/README.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/examples/advanced-llm-interactions.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/examples/mysql-examples.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/examples/postgresql-examples.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/examples/sqlite-examples.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/installation-platform-specific.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/installation.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/technical/architecture.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/technical/development.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/technical/security.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/technical/sonarcloud-integration.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/technical/testing.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/usage.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/configuration.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/examples/README.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/examples/advanced-llm-interactions.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/examples/mysql-examples.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/examples/postgresql-examples.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/examples/sqlite-examples.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/installation-platform-specific.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/installation.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/technical/architecture.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/technical/development.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/technical/security.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/technical/sonarcloud-integration.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/technical/testing.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/usage.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/index.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/configuration.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/examples/README.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/examples/advanced-llm-interactions.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/examples/mysql-examples.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/examples/postgresql-examples.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/examples/sqlite-examples.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/installation-platform-specific.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/installation.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/technical/architecture.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/technical/development.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/technical/security.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/technical/sonarcloud-integration.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/technical/testing.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/usage.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/configuration.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/examples/advanced-llm-interactions.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/examples/mysql-examples.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/examples/postgresql-examples.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/examples/sqlite-examples.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/installation-platform-specific.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/installation.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/security-best-practices.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/technical/architecture.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/technical/audit-logging.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/technical/development.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/technical/security.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/technical/sonarcloud-integration.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/technical/testing.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/technical/write-operations-design.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/usage-write-operations.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/usage.md +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/examples/config.yaml +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/scripts/check_docs_consistency.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/scripts/check_zh_docs.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/scripts/fix_en_nav_links.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/scripts/fix_imports.sh +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/scripts/fix_remaining_issues.sh +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/scripts/fix_zh_nav_links.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/scripts/run_sonar_analysis.sh +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/scripts/sonar-ai-fix.fish +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/smithery.yaml +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/sonar-project.properties +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/__init__.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/audit.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/config.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/log.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/mysql/__init__.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/mysql/config.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/mysql/handler.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/mysql/server.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/postgres/__init__.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/postgres/config.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/postgres/handler.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/postgres/server.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/sqlite/__init__.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/sqlite/config.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/sqlite/handler.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/sqlite/server.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/stats.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/conftest.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/__init__.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/conftest.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/fixtures.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_list_connections.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_logging.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_monitoring.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_monitoring_enhanced.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_mysql.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_mysql_config.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_mysql_config_helpers.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_mysql_handler_extended.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_postgres.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_postgres_config.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_prompts.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_sqlite.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_sqlite_config.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_sqlite_handler_extended.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_tools.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_tools_advanced.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/test_write_operations.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_audit.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_base.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_base_handlers.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_base_helpers.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_base_server.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_base_write_operations.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_log.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_mysql_handler.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_mysql_server.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_postgres_handler.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_postgres_server.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_sql_parsing.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_sqlite_handler.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_sqlite_server.py +0 -0
- {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_stats.py +0 -0
@@ -1,3 +1,17 @@
|
|
1
|
+
## [1.0.2](https://github.com/donghao1393/mcp-dbutils/compare/v1.0.1...v1.0.2) (2025-05-05)
|
2
|
+
|
3
|
+
|
4
|
+
### Bug Fixes
|
5
|
+
|
6
|
+
* 修复表名大小写敏感性问题 ([#95](https://github.com/donghao1393/mcp-dbutils/issues/95)) ([2986101](https://github.com/donghao1393/mcp-dbutils/commit/2986101656d3f6d8d70ee21c051e4d140c0c9eee)), closes [#92](https://github.com/donghao1393/mcp-dbutils/issues/92)
|
7
|
+
|
8
|
+
## [1.0.1](https://github.com/donghao1393/mcp-dbutils/compare/v1.0.0...v1.0.1) (2025-05-04)
|
9
|
+
|
10
|
+
|
11
|
+
### Bug Fixes
|
12
|
+
|
13
|
+
* 提高代码覆盖率以解决SonarCloud检查失败问题 ([#90](https://github.com/donghao1393/mcp-dbutils/issues/90)) ([adbc9f2](https://github.com/donghao1393/mcp-dbutils/commit/adbc9f2e6fb54ed446d96775c65edf67611637ed))
|
14
|
+
|
1
15
|
# [1.0.0](https://github.com/donghao1393/mcp-dbutils/compare/v0.23.1...v1.0.0) (2025-05-04)
|
2
16
|
|
3
17
|
|
@@ -41,6 +41,28 @@ connections:
|
|
41
41
|
- `default_policy`:默认策略,可选值为 `read_only`(只读)或 `allow_all`(允许所有写操作)。
|
42
42
|
- `tables`:表级权限配置,可以为每个表指定允许的操作类型。
|
43
43
|
|
44
|
+
### 表名大小写处理
|
45
|
+
|
46
|
+
MCP-DBUtils 在处理表名时采用大小写不敏感的比较策略:
|
47
|
+
|
48
|
+
- 在配置文件中,表名可以使用任意大小写(如 `users`、`Users` 或 `USERS`)。
|
49
|
+
- 在 SQL 语句中,表名同样可以使用任意大小写。
|
50
|
+
- 系统会自动将表名转换为小写进行比较,确保大小写不影响权限检查。
|
51
|
+
|
52
|
+
例如,以下配置和 SQL 语句都能正确匹配:
|
53
|
+
|
54
|
+
```yaml
|
55
|
+
# 配置文件中使用小写表名
|
56
|
+
tables:
|
57
|
+
users:
|
58
|
+
operations: ["INSERT", "UPDATE"]
|
59
|
+
```
|
60
|
+
|
61
|
+
```sql
|
62
|
+
-- SQL 语句中使用大写表名,仍然能正确匹配权限
|
63
|
+
INSERT INTO USERS (id, name) VALUES (1, 'test');
|
64
|
+
```
|
65
|
+
|
44
66
|
## 使用写操作工具
|
45
67
|
|
46
68
|
MCP-DBUtils 提供了 `dbutils-execute-write` 工具用于执行写操作:
|
@@ -92,6 +92,28 @@ tables:
|
|
92
92
|
|
93
93
|
如果未指定`operations`,则默认允许所有写操作(INSERT、UPDATE、DELETE)。
|
94
94
|
|
95
|
+
### 2.4 表名大小写处理
|
96
|
+
|
97
|
+
MCP-DBUtils 在处理表名时采用大小写不敏感的比较策略:
|
98
|
+
|
99
|
+
- 在配置文件中,表名可以使用任意大小写(如 `users`、`Users` 或 `USERS`)。
|
100
|
+
- 在 SQL 语句中,表名同样可以使用任意大小写。
|
101
|
+
- 系统会自动将表名转换为小写进行比较,确保大小写不影响权限检查。
|
102
|
+
|
103
|
+
例如,以下配置和 SQL 语句都能正确匹配:
|
104
|
+
|
105
|
+
```yaml
|
106
|
+
# 配置文件中使用小写表名
|
107
|
+
tables:
|
108
|
+
users:
|
109
|
+
operations: [INSERT, UPDATE]
|
110
|
+
```
|
111
|
+
|
112
|
+
```sql
|
113
|
+
-- SQL 语句中使用大写表名,仍然能正确匹配权限
|
114
|
+
INSERT INTO USERS (id, name) VALUES (1, 'test');
|
115
|
+
```
|
116
|
+
|
95
117
|
## 3. 完整配置示例
|
96
118
|
|
97
119
|
以下是一个包含多种配置场景的完整示例:
|
@@ -103,7 +125,7 @@ connections:
|
|
103
125
|
type: sqlite
|
104
126
|
database: ":memory:"
|
105
127
|
# 未指定writable,默认为false(只读)
|
106
|
-
|
128
|
+
|
107
129
|
# 示例2:可写连接,无细粒度控制
|
108
130
|
simple_writable_mysql:
|
109
131
|
type: mysql
|
@@ -114,7 +136,7 @@ connections:
|
|
114
136
|
password: secret
|
115
137
|
writable: true
|
116
138
|
# 未指定write_permissions,所有表都可写
|
117
|
-
|
139
|
+
|
118
140
|
# 示例3:可写连接,有表级和操作级控制
|
119
141
|
controlled_postgres:
|
120
142
|
type: postgres
|
@@ -124,7 +146,7 @@ connections:
|
|
124
146
|
user: postgres
|
125
147
|
password: postgres
|
126
148
|
writable: true
|
127
|
-
|
149
|
+
|
128
150
|
write_permissions:
|
129
151
|
# 表级权限
|
130
152
|
tables:
|
@@ -134,10 +156,10 @@ connections:
|
|
134
156
|
operations: [INSERT] # 只允许插入
|
135
157
|
temp_data:
|
136
158
|
operations: [INSERT, UPDATE, DELETE] # 允许所有写操作
|
137
|
-
|
159
|
+
|
138
160
|
# 默认策略
|
139
161
|
default_policy: read_only # 未指定的表默认只读
|
140
|
-
|
162
|
+
|
141
163
|
# 示例4:可写连接,只有默认策略
|
142
164
|
all_writable_postgres:
|
143
165
|
type: postgres
|
@@ -147,7 +169,7 @@ connections:
|
|
147
169
|
user: postgres
|
148
170
|
password: postgres
|
149
171
|
writable: true
|
150
|
-
|
172
|
+
|
151
173
|
write_permissions:
|
152
174
|
default_policy: allow_all # 所有表默认可写
|
153
175
|
```
|
@@ -210,6 +232,7 @@ connections:
|
|
210
232
|
| "Connection is not configured for write operations" | 连接未设置`writable: true` | 在配置文件中添加`writable: true` |
|
211
233
|
| "No permission to perform [操作] on table [表名]" | 表未被允许执行该操作 | 在`write_permissions.tables`中添加表和操作 |
|
212
234
|
| "Operation not confirmed" | 未提供正确的确认参数 | 在工具调用中添加`confirmation: "CONFIRM_WRITE"` |
|
235
|
+
| "No permission to perform [操作] on table [大写表名]" | SQL语句中使用了大写表名,但配置中使用小写表名 | 系统已支持大小写不敏感的表名比较,此问题在v1.0.1及以上版本已修复 |
|
213
236
|
|
214
237
|
## 6. 配置迁移
|
215
238
|
|
@@ -188,8 +188,8 @@ class ConnectionHandler(ABC):
|
|
188
188
|
if "row" in result and "affected" in result:
|
189
189
|
# 从结果字符串中提取受影响的行数
|
190
190
|
import re
|
191
|
-
#
|
192
|
-
match = re.search(r"(\d
|
191
|
+
# 限制数字长度,避免DoS风险
|
192
|
+
match = re.search(r"(\d{1,10}) rows?", result)
|
193
193
|
if match:
|
194
194
|
affected_rows = int(match.group(1))
|
195
195
|
except Exception:
|
@@ -601,7 +601,7 @@ class ConnectionServer:
|
|
601
601
|
# Default fallback
|
602
602
|
return "unknown_table"
|
603
603
|
|
604
|
-
async def _check_write_permission(self, connection: str, table_name: str, operation_type: str) ->
|
604
|
+
async def _check_write_permission(self, connection: str, table_name: str, operation_type: str) -> None:
|
605
605
|
"""检查写操作权限
|
606
606
|
|
607
607
|
Args:
|
@@ -609,9 +609,6 @@ class ConnectionServer:
|
|
609
609
|
table_name: 表名
|
610
610
|
operation_type: 操作类型 (INSERT, UPDATE, DELETE)
|
611
611
|
|
612
|
-
Returns:
|
613
|
-
bool: 是否有权限执行写操作
|
614
|
-
|
615
612
|
Raises:
|
616
613
|
ConfigurationError: 如果连接不可写或没有表级权限
|
617
614
|
"""
|
@@ -626,7 +623,10 @@ class ConnectionServer:
|
|
626
623
|
write_permissions = db_config.get("write_permissions", {})
|
627
624
|
if not write_permissions:
|
628
625
|
# 没有细粒度权限控制,默认允许所有写操作
|
629
|
-
return
|
626
|
+
return
|
627
|
+
|
628
|
+
# 将表名转换为小写,用于大小写不敏感的比较
|
629
|
+
table_name_lower = table_name.lower()
|
630
630
|
|
631
631
|
# 检查表级权限
|
632
632
|
tables = write_permissions.get("tables", {})
|
@@ -634,19 +634,22 @@ class ConnectionServer:
|
|
634
634
|
# 没有表级权限配置,检查默认策略
|
635
635
|
default_policy = write_permissions.get("default_policy", "read_only")
|
636
636
|
if default_policy == "allow_all":
|
637
|
-
return
|
637
|
+
return
|
638
638
|
else:
|
639
639
|
# 默认只读
|
640
640
|
raise ConfigurationError(WRITE_OPERATION_NOT_ALLOWED_ERROR.format(
|
641
641
|
operation=operation_type, table=table_name
|
642
642
|
))
|
643
643
|
|
644
|
-
#
|
645
|
-
|
646
|
-
|
644
|
+
# 创建表名到配置的映射,支持大小写不敏感的比较
|
645
|
+
tables_lower = {k.lower(): v for k, v in tables.items()}
|
646
|
+
|
647
|
+
# 检查特定表的权限(大小写不敏感)
|
648
|
+
if table_name_lower in tables_lower:
|
649
|
+
table_config = tables_lower[table_name_lower]
|
647
650
|
operations = table_config.get("operations", ["INSERT", "UPDATE", "DELETE"])
|
648
651
|
if operation_type in operations:
|
649
|
-
return
|
652
|
+
return
|
650
653
|
else:
|
651
654
|
raise ConfigurationError(WRITE_OPERATION_NOT_ALLOWED_ERROR.format(
|
652
655
|
operation=operation_type, table=table_name
|
@@ -655,15 +658,13 @@ class ConnectionServer:
|
|
655
658
|
# 表未明确配置,检查默认策略
|
656
659
|
default_policy = write_permissions.get("default_policy", "read_only")
|
657
660
|
if default_policy == "allow_all":
|
658
|
-
return
|
661
|
+
return
|
659
662
|
else:
|
660
663
|
# 默认只读
|
661
664
|
raise ConfigurationError(WRITE_OPERATION_NOT_ALLOWED_ERROR.format(
|
662
665
|
operation=operation_type, table=table_name
|
663
666
|
))
|
664
667
|
|
665
|
-
return False
|
666
|
-
|
667
668
|
def _create_handler_for_type(
|
668
669
|
self, db_type: str, connection: str
|
669
670
|
) -> ConnectionHandler:
|