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.
Files changed (211) hide show
  1. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/CHANGELOG.md +7 -0
  2. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/PKG-INFO +1 -1
  3. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/write-operations.md +22 -0
  4. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/configuration-write-operations.md +29 -6
  5. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/pyproject.toml +1 -1
  6. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/base.py +9 -3
  7. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_write_permissions.py +15 -0
  8. mcp_dbutils-1.0.1/coverage.xml +0 -1928
  9. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.coveragerc +0 -0
  10. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_ar.md +0 -0
  11. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_en.md +0 -0
  12. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_es.md +0 -0
  13. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_fr.md +0 -0
  14. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_ru.md +0 -0
  15. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_zh.md +0 -0
  16. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  17. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_ar.md +0 -0
  18. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_en.md +0 -0
  19. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_es.md +0 -0
  20. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_fr.md +0 -0
  21. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_ru.md +0 -0
  22. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_zh.md +0 -0
  23. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_ar.md +0 -0
  24. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_en.md +0 -0
  25. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_es.md +0 -0
  26. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_fr.md +0 -0
  27. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_ru.md +0 -0
  28. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_zh.md +0 -0
  29. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_ar.md +0 -0
  30. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_en.md +0 -0
  31. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_es.md +0 -0
  32. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_fr.md +0 -0
  33. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_ru.md +0 -0
  34. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_zh.md +0 -0
  35. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_ar.md +0 -0
  36. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_en.md +0 -0
  37. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_es.md +0 -0
  38. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_fr.md +0 -0
  39. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_ru.md +0 -0
  40. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_zh.md +0 -0
  41. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/workflows/code-style.yml +0 -0
  42. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/workflows/issue-translator.yml +0 -0
  43. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/workflows/quality-assurance.yml +0 -0
  44. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.github/workflows/release.yml +0 -0
  45. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.gitignore +0 -0
  46. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.pre-commit-config.yaml +0 -0
  47. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/.releaserc.json +0 -0
  48. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/Dockerfile +0 -0
  49. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/LICENSE +0 -0
  50. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/README.md +0 -0
  51. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/README_AR.md +0 -0
  52. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/README_EN.md +0 -0
  53. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/README_ES.md +0 -0
  54. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/README_FR.md +0 -0
  55. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/README_RU.md +0 -0
  56. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/config.yaml.example +0 -0
  57. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/configuration.md +0 -0
  58. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/examples/README.md +0 -0
  59. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/examples/advanced-llm-interactions.md +0 -0
  60. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/examples/mysql-examples.md +0 -0
  61. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/examples/postgresql-examples.md +0 -0
  62. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/examples/sqlite-examples.md +0 -0
  63. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/installation-platform-specific.md +0 -0
  64. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/installation.md +0 -0
  65. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/technical/architecture.md +0 -0
  66. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/technical/development.md +0 -0
  67. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/technical/security.md +0 -0
  68. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/technical/sonarcloud-integration.md +0 -0
  69. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/technical/testing.md +0 -0
  70. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ar/usage.md +0 -0
  71. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/document-consistency-check.md +0 -0
  72. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/document-version-history.md +0 -0
  73. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/configuration.md +0 -0
  74. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/examples/advanced-llm-interactions.md +0 -0
  75. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/examples/mysql-examples.md +0 -0
  76. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/examples/postgresql-examples.md +0 -0
  77. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/examples/sqlite-examples.md +0 -0
  78. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/installation-platform-specific.md +0 -0
  79. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/installation.md +0 -0
  80. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/technical/architecture.md +0 -0
  81. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/technical/development.md +0 -0
  82. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/technical/security.md +0 -0
  83. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/technical/sonarcloud-integration.md +0 -0
  84. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/technical/testing.md +0 -0
  85. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/en/usage.md +0 -0
  86. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/configuration.md +0 -0
  87. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/examples/README.md +0 -0
  88. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/examples/advanced-llm-interactions.md +0 -0
  89. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/examples/mysql-examples.md +0 -0
  90. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/examples/postgresql-examples.md +0 -0
  91. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/examples/sqlite-examples.md +0 -0
  92. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/installation-platform-specific.md +0 -0
  93. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/installation.md +0 -0
  94. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/technical/architecture.md +0 -0
  95. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/technical/development.md +0 -0
  96. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/technical/security.md +0 -0
  97. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/technical/sonarcloud-integration.md +0 -0
  98. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/technical/testing.md +0 -0
  99. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/es/usage.md +0 -0
  100. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/configuration.md +0 -0
  101. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/examples/README.md +0 -0
  102. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/examples/advanced-llm-interactions.md +0 -0
  103. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/examples/mysql-examples.md +0 -0
  104. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/examples/postgresql-examples.md +0 -0
  105. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/examples/sqlite-examples.md +0 -0
  106. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/installation-platform-specific.md +0 -0
  107. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/installation.md +0 -0
  108. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/technical/architecture.md +0 -0
  109. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/technical/development.md +0 -0
  110. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/technical/security.md +0 -0
  111. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/technical/sonarcloud-integration.md +0 -0
  112. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/technical/testing.md +0 -0
  113. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/fr/usage.md +0 -0
  114. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/index.md +0 -0
  115. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/configuration.md +0 -0
  116. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/examples/README.md +0 -0
  117. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/examples/advanced-llm-interactions.md +0 -0
  118. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/examples/mysql-examples.md +0 -0
  119. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/examples/postgresql-examples.md +0 -0
  120. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/examples/sqlite-examples.md +0 -0
  121. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/installation-platform-specific.md +0 -0
  122. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/installation.md +0 -0
  123. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/technical/architecture.md +0 -0
  124. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/technical/development.md +0 -0
  125. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/technical/security.md +0 -0
  126. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/technical/sonarcloud-integration.md +0 -0
  127. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/technical/testing.md +0 -0
  128. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/ru/usage.md +0 -0
  129. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/configuration.md +0 -0
  130. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/examples/advanced-llm-interactions.md +0 -0
  131. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/examples/mysql-examples.md +0 -0
  132. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/examples/postgresql-examples.md +0 -0
  133. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/examples/sqlite-examples.md +0 -0
  134. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/installation-platform-specific.md +0 -0
  135. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/installation.md +0 -0
  136. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/security-best-practices.md +0 -0
  137. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/technical/architecture.md +0 -0
  138. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/technical/audit-logging.md +0 -0
  139. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/technical/development.md +0 -0
  140. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/technical/security.md +0 -0
  141. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/technical/sonarcloud-integration.md +0 -0
  142. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/technical/testing.md +0 -0
  143. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/technical/write-operations-design.md +0 -0
  144. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/usage-write-operations.md +0 -0
  145. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/docs/zh/usage.md +0 -0
  146. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/examples/config.yaml +0 -0
  147. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/scripts/check_docs_consistency.py +0 -0
  148. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/scripts/check_zh_docs.py +0 -0
  149. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/scripts/fix_en_nav_links.py +0 -0
  150. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/scripts/fix_imports.sh +0 -0
  151. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/scripts/fix_remaining_issues.sh +0 -0
  152. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/scripts/fix_zh_nav_links.py +0 -0
  153. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/scripts/run_sonar_analysis.sh +0 -0
  154. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/scripts/sonar-ai-fix.fish +0 -0
  155. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/smithery.yaml +0 -0
  156. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/sonar-project.properties +0 -0
  157. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/__init__.py +0 -0
  158. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/audit.py +0 -0
  159. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/config.py +0 -0
  160. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/log.py +0 -0
  161. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/mysql/__init__.py +0 -0
  162. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/mysql/config.py +0 -0
  163. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/mysql/handler.py +0 -0
  164. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/mysql/server.py +0 -0
  165. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/postgres/__init__.py +0 -0
  166. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/postgres/config.py +0 -0
  167. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/postgres/handler.py +0 -0
  168. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/postgres/server.py +0 -0
  169. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/sqlite/__init__.py +0 -0
  170. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/sqlite/config.py +0 -0
  171. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/sqlite/handler.py +0 -0
  172. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/sqlite/server.py +0 -0
  173. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/src/mcp_dbutils/stats.py +0 -0
  174. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/conftest.py +0 -0
  175. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/__init__.py +0 -0
  176. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/conftest.py +0 -0
  177. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/fixtures.py +0 -0
  178. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_list_connections.py +0 -0
  179. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_logging.py +0 -0
  180. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_monitoring.py +0 -0
  181. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_monitoring_enhanced.py +0 -0
  182. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_mysql.py +0 -0
  183. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_mysql_config.py +0 -0
  184. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_mysql_config_helpers.py +0 -0
  185. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_mysql_handler_extended.py +0 -0
  186. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_postgres.py +0 -0
  187. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_postgres_config.py +0 -0
  188. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_prompts.py +0 -0
  189. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_sqlite.py +0 -0
  190. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_sqlite_config.py +0 -0
  191. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_sqlite_handler_extended.py +0 -0
  192. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_tools.py +0 -0
  193. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/integration/test_tools_advanced.py +0 -0
  194. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/test_write_operations.py +0 -0
  195. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_audit.py +0 -0
  196. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_base.py +0 -0
  197. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_base_extended.py +0 -0
  198. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_base_handlers.py +0 -0
  199. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_base_helpers.py +0 -0
  200. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_base_server.py +0 -0
  201. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_base_write_operations.py +0 -0
  202. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_init.py +0 -0
  203. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_log.py +0 -0
  204. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_mysql_handler.py +0 -0
  205. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_mysql_server.py +0 -0
  206. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_postgres_handler.py +0 -0
  207. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_postgres_server.py +0 -0
  208. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_sql_parsing.py +0 -0
  209. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_sqlite_handler.py +0 -0
  210. {mcp_dbutils-1.0.1 → mcp_dbutils-1.0.2}/tests/unit/test_sqlite_server.py +0 -0
  211. {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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-dbutils
3
- Version: 1.0.1
3
+ Version: 1.0.2
4
4
  Summary: MCP Database Utilities Service
5
5
  Author: Dong Hao
6
6
  License-Expression: MIT
@@ -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
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mcp-dbutils"
3
- version = "1.0.1"
3
+ version = "1.0.2"
4
4
  description = "MCP Database Utilities Service"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -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
- if table_name in tables:
643
- table_config = tables[table_name]
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")