mcp-dbutils 1.0.1__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.1 → mcp_dbutils-1.0.2}/CHANGELOG.md +7 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/PKG-INFO +1 -1
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/write-operations.md +22 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/configuration-write-operations.md +29 -6
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/pyproject.toml +1 -1
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/base.py +9 -3
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_write_permissions.py +15 -0
- mcp_dbutils-1.0.1/coverage.xml +0 -1928
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.coveragerc +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_ar.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_en.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_es.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_fr.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_ru.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_zh.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_ar.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_en.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_es.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_fr.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_ru.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_zh.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_ar.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_en.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_es.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_fr.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_ru.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_zh.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_ar.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_en.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_es.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_fr.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_ru.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_zh.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_ar.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_en.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_es.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_fr.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_ru.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_zh.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/workflows/code-style.yml +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/workflows/issue-translator.yml +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/workflows/quality-assurance.yml +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/workflows/release.yml +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.gitignore +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.pre-commit-config.yaml +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.releaserc.json +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/Dockerfile +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/LICENSE +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/README.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/README_AR.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/README_EN.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/README_ES.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/README_FR.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/README_RU.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/config.yaml.example +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/configuration.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/examples/README.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/examples/advanced-llm-interactions.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/examples/mysql-examples.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/examples/postgresql-examples.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/examples/sqlite-examples.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/installation-platform-specific.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/installation.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/technical/architecture.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/technical/development.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/technical/security.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/technical/sonarcloud-integration.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/technical/testing.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/usage.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/document-consistency-check.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/document-version-history.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/configuration.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/examples/advanced-llm-interactions.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/examples/mysql-examples.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/examples/postgresql-examples.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/examples/sqlite-examples.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/installation-platform-specific.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/installation.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/technical/architecture.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/technical/development.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/technical/security.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/technical/sonarcloud-integration.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/technical/testing.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/usage.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/configuration.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/examples/README.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/examples/advanced-llm-interactions.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/examples/mysql-examples.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/examples/postgresql-examples.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/examples/sqlite-examples.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/installation-platform-specific.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/installation.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/technical/architecture.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/technical/development.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/technical/security.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/technical/sonarcloud-integration.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/technical/testing.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/usage.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/configuration.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/examples/README.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/examples/advanced-llm-interactions.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/examples/mysql-examples.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/examples/postgresql-examples.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/examples/sqlite-examples.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/installation-platform-specific.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/installation.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/technical/architecture.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/technical/development.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/technical/security.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/technical/sonarcloud-integration.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/technical/testing.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/usage.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/index.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/configuration.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/examples/README.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/examples/advanced-llm-interactions.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/examples/mysql-examples.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/examples/postgresql-examples.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/examples/sqlite-examples.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/installation-platform-specific.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/installation.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/technical/architecture.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/technical/development.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/technical/security.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/technical/sonarcloud-integration.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/technical/testing.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/usage.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/configuration.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/examples/advanced-llm-interactions.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/examples/mysql-examples.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/examples/postgresql-examples.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/examples/sqlite-examples.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/installation-platform-specific.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/installation.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/security-best-practices.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/technical/architecture.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/technical/audit-logging.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/technical/development.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/technical/security.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/technical/sonarcloud-integration.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/technical/testing.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/technical/write-operations-design.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/usage-write-operations.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/usage.md +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/examples/config.yaml +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/scripts/check_docs_consistency.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/scripts/check_zh_docs.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/scripts/fix_en_nav_links.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/scripts/fix_imports.sh +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/scripts/fix_remaining_issues.sh +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/scripts/fix_zh_nav_links.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/scripts/run_sonar_analysis.sh +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/scripts/sonar-ai-fix.fish +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/smithery.yaml +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/sonar-project.properties +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/__init__.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/audit.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/config.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/log.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/mysql/__init__.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/mysql/config.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/mysql/handler.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/mysql/server.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/postgres/__init__.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/postgres/config.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/postgres/handler.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/postgres/server.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/sqlite/__init__.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/sqlite/config.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/sqlite/handler.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/sqlite/server.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/stats.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/conftest.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/__init__.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/conftest.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/fixtures.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_list_connections.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_logging.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_monitoring.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_monitoring_enhanced.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_mysql.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_mysql_config.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_mysql_config_helpers.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_mysql_handler_extended.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_postgres.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_postgres_config.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_prompts.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_sqlite.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_sqlite_config.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_sqlite_handler_extended.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_tools.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_tools_advanced.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/test_write_operations.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_audit.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_base.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_base_extended.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_base_handlers.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_base_helpers.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_base_server.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_base_write_operations.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_init.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_log.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_mysql_handler.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_mysql_server.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_postgres_handler.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_postgres_server.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_sql_parsing.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_sqlite_handler.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_sqlite_server.py +0 -0
- {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_stats.py +0 -0
@@ -1,3 +1,10 @@
|
|
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
|
+
|
1
8
|
## [1.0.1](https://github.com/donghao1393/mcp-dbutils/compare/v1.0.0...v1.0.1) (2025-05-04)
|
2
9
|
|
3
10
|
|
@@ -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
|
|
@@ -625,6 +625,9 @@ class ConnectionServer:
|
|
625
625
|
# 没有细粒度权限控制,默认允许所有写操作
|
626
626
|
return
|
627
627
|
|
628
|
+
# 将表名转换为小写,用于大小写不敏感的比较
|
629
|
+
table_name_lower = table_name.lower()
|
630
|
+
|
628
631
|
# 检查表级权限
|
629
632
|
tables = write_permissions.get("tables", {})
|
630
633
|
if not tables:
|
@@ -638,9 +641,12 @@ class ConnectionServer:
|
|
638
641
|
operation=operation_type, table=table_name
|
639
642
|
))
|
640
643
|
|
641
|
-
#
|
642
|
-
|
643
|
-
|
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]
|
644
650
|
operations = table_config.get("operations", ["INSERT", "UPDATE", "DELETE"])
|
645
651
|
if operation_type in operations:
|
646
652
|
return
|
@@ -108,3 +108,18 @@ class TestWritePermissions:
|
|
108
108
|
await connection_server._check_write_permission("test_conn_allow_all", "any_table", "INSERT")
|
109
109
|
await connection_server._check_write_permission("test_conn_allow_all", "any_table", "UPDATE")
|
110
110
|
await connection_server._check_write_permission("test_conn_allow_all", "any_table", "DELETE")
|
111
|
+
|
112
|
+
@pytest.mark.asyncio
|
113
|
+
async def test_check_write_permission_case_insensitive(self, connection_server):
|
114
|
+
"""Test _check_write_permission with different table name case"""
|
115
|
+
# Table 'users' in config, but using 'USERS' in query
|
116
|
+
await connection_server._check_write_permission("test_conn_with_permissions", "USERS", "INSERT")
|
117
|
+
await connection_server._check_write_permission("test_conn_with_permissions", "USERS", "UPDATE")
|
118
|
+
|
119
|
+
with pytest.raises(ConfigurationError, match="No permission to perform DELETE operation on table USERS"):
|
120
|
+
await connection_server._check_write_permission("test_conn_with_permissions", "USERS", "DELETE")
|
121
|
+
|
122
|
+
# Table 'products' in config, but using mixed case 'Products' in query
|
123
|
+
await connection_server._check_write_permission("test_conn_with_permissions", "Products", "INSERT")
|
124
|
+
await connection_server._check_write_permission("test_conn_with_permissions", "Products", "UPDATE")
|
125
|
+
await connection_server._check_write_permission("test_conn_with_permissions", "Products", "DELETE")
|