Universal Db Mcp

io.github.Fashad-Ahmed由 GitHub 帳號 Fashad-Ahmed 發布v1.1.2更新於 Oct 24, 2026

Security-first MCP server for PostgreSQL, SQLite, MySQL, DuckDB with SQL injection prevention.

已驗證STDIO僅桌面資料庫資料與分析

概覽

AI 產生的概覽

在本機執行、預設唯讀的 MCP 伺服器,讓助理檢視資料表結構並對 PostgreSQL、MySQL、SQLite 與 DuckDB 執行受防護的 SQL。

可以做什麼
對已設定的資料庫執行 SQL 查詢,預設唯讀,具備注入偵測與列數上限,也可選擇僅試執行或查看執行計畫而不實際執行。檢視資料表與欄位結構,列出已設定的資料庫並檢查連線狀態與版本。查看最近 100 筆已執行查詢,並擷取結構快照以比對結構變動。查詢本機 SQLite 檔案與行程內 DuckDB,包括記憶體中的分析。
適用情境
適合讓助理以自然語言探索或查詢關聯式與分析型資料庫,尤其是無需架設伺服器的本機 SQLite 或 DuckDB 檔案,同時預設阻擋寫入。
執行需求
以 Python 套件在本機執行(uvx 或 pip)。至少需要一項連線設定:POSTGRES_URI、MYSQL_URI、SQLITE_PATH 或 DUCKDB_PATH。選用設定包括 ALLOW_DESTRUCTIVE、MAX_RESULT_ROWS 與唯讀開關。僅連線遠端 PostgreSQL 或 MySQL 時需要網路存取。
安裝前請注意
POSTGRES_URI 與 MYSQL_URI 含資料庫憑證,應使用專用唯讀帳號。將 ALLOW_DESTRUCTIVE 設為 true 會允許 INSERT、UPDATE、DELETE 與 DDL,可能寫入或刪除資料。查詢結果與結構資訊會傳送給模型供應商。DuckDB 的檔案讀取函式已被攔阻,但指向敏感資料前請先閱讀安全文件。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Universal Db Mcp,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

Universal Database MCP Server

The security-first, Python-native MCP server for database access from AI agents.

[CI] [PyPI] [Python 3.10+] [FastMCP] [License: MIT]

[Demo: schema discovery, a real query, a blocked DROP, and dry-run mode]


Why This Exists

Most database MCP servers give AI agents raw SQL access and hope for the best. This server assumes the LLM is untrusted input and applies 8 layers of injection prevention before any query reaches your database — including blocking UNION attacks, stacked statements, time-based injection, and comment bypasses.

Supports: PostgreSQL · SQLite · MySQL · DuckDB (columnar analytics)


Zero Setup: Works on Your Laptop Right Now

No Docker. No cloud account. No database server to install. DuckDB and SQLite run in-process:

bash
# Query a local SQLite database — one command, zero infraSQLITE_PATH=./myapp.db uvx universal-db-mcp
# Query a local DuckDB file or parquet filesDUCKDB_PATH=./analytics.duckdb uvx universal-db-mcp
# In-memory DuckDB for throwaway analysisDUCKDB_PATH=:memory: uvx universal-db-mcp

Add to Claude Code in ~/.claude/mcp_servers.json, or to Claude Desktop in ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) / %APPDATA%\Claude\claude_desktop_config.json (Windows):

json
{  "mcpServers": {    "mydb": {      "command": "uvx",      "args": ["universal-db-mcp"],      "env": {        "SQLITE_PATH": "/Users/you/projects/myapp/db.sqlite3",        "ALLOW_DESTRUCTIVE": "false"      }    }  }}

Restart Claude Desktop / Claude Code after saving — that's it.

That's it. Claude Code discovers the tools automatically.

More client configs (Claude Desktop, Cursor, Windsurf, Docker) in examples/.


Security Model: 8 Layers

Read-only by default. Defense-in-depth. Every query validated before it touches the driver.

LayerWhat it does
1Driver-level read-only — PostgreSQL session flag, SQLite mode=ro URI, DuckDB read_only=True. Write rejected before SQL parsing.
2Keyword blocking — DROP, DELETE, TRUNCATE, ALTER, INSERT, UPDATE, GRANT, EXEC blocked in read-only mode
3Injection pattern detection — UNION SELECT, stacked statements, SQL comments (--, /*), xp_, SLEEP(), WAITFOR, BENCHMARK()
4Multiple statement rejection — ; separating statements always blocked
5Parameter type enforcement — only str, int, float, bool, null accepted as parameters
6Result size limits — truncated at MAX_RESULT_ROWS (default 1000) to prevent memory exhaustion
7Identifier sanitization — table/column names stripped of metacharacters in internally-generated SQL
8DuckDB filesystem blocklist — read_csv(), read_parquet(), glob(), LOAD, INSTALL, httpfs, COPY blocked at adapter level; read_only=True only blocks writes, not file reads

Full threat model: docs/SECURITY.md


DuckDB: Analytics Without Infrastructure

DuckDB runs in-process (no server) and reads Parquet, CSV, JSON natively. Connect AI agents to your analytics data without spinning up a warehouse:

bash
# Query parquet files directlyDUCKDB_PATH=:memory: uvx universal-db-mcp

Then in Claude Code:

You: "Load sales.parquet and show me monthly revenue by region"Claude: [uses query tool → SELECT region, strftime('%Y-%m', date) AS month, SUM(revenue) ...]

Natural Language → SQL

No separate NL-to-SQL tool needed — Claude already does this. Give it the schema tool and ask in plain English:

You: "Which customers placed more than 5 orders last month?"Claude: [calls schema() to see table structure, then query() with the         generated SQL — every query still passes through all 8 security         layers before touching your database]

Pair with dry_run: true (DRYRUN=true) while prototyping — Claude gets the query plan back without anything executing.


Docker

bash
docker build -t universal-db-mcp .docker run -i --rm \  -e POSTGRES_URI=postgresql://readonly:[email protected]:5432/mydb \  -e ALLOW_DESTRUCTIVE=false \  universal-db-mcp

See examples/docker_mcp_config.json for wiring this into an MCP client.


All Databases

bash
# PostgreSQLPOSTGRES_URI=postgresql://readonly:pass@localhost/mydb uvx universal-db-mcp
# SQLite (local file, zero infra)SQLITE_PATH=./db.sqlite3 uvx universal-db-mcp
# MySQLMYSQL_URI=mysql://readonly:pass@localhost/mydb uvx universal-db-mcp
# DuckDB (columnar, in-process analytics)DUCKDB_PATH=./analytics.duckdb uvx universal-db-mcp
# Multiple databases simultaneouslyPOSTGRES_URI=... SQLITE_PATH=... uvx universal-db-mcp

MCP Tools

ToolDescription
queryExecute SQL — read-only by default, all 8 security layers apply
schemaInspect tables and columns — no config needed
explainGet query execution plan without running the query
healthCheck connection status, DB version, and pool metrics
list_databasesShow all configured databases and connection state
query_historyInspect the last 100 executed queries
snapshot_schemaCapture current schema for drift detection
schema_diffCompare current schema against the last snapshot

v1.1.0: dry-run mode (DRYRUN=true), table allowlists (WHITELISTED_TABLES), query complexity warnings, structured audit logs, and a --check CLI flag for connectivity validation. See CHANGELOG.md.


Configuration

bash
# ── PostgreSQL ─────────────────────────────────────POSTGRES_URI=postgresql://user:pass@host:5432/dbPOSTGRES_READONLY=true          # default: true
# ── SQLite ─────────────────────────────────────────SQLITE_PATH=/path/to/database.dbSQLITE_READONLY=true            # default: true
# ── MySQL ──────────────────────────────────────────MYSQL_URI=mysql://user:pass@host:3306/dbMYSQL_READONLY=true             # default: true
# ── DuckDB ─────────────────────────────────────────DUCKDB_PATH=/path/to/analytics.duckdb   # or :memory:DUCKDB_READONLY=true            # default: true
# ── Security ───────────────────────────────────────ALLOW_DESTRUCTIVE=false         # default: false — blocks INSERT/UPDATE/DELETE/DROPMAX_RESULT_ROWS=1000            # truncate large resultsENABLE_LOGGING=true             # log queries to stderrQUERY_TIMEOUT=30                # secondsRATE_LIMIT_RPM=60               # requests per minute

Secure Database Users

Always use a dedicated read-only account. Never give the MCP server credentials that can modify data.

PostgreSQL:

sql
CREATE USER mcp_agent WITH PASSWORD 'strong_random_password';GRANT CONNECT ON DATABASE mydb TO mcp_agent;GRANT USAGE ON SCHEMA public TO mcp_agent;GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_agent;

MySQL:

sql
CREATE USER 'mcp_agent'@'localhost' IDENTIFIED BY 'strong_random_password';GRANT SELECT ON mydb.* TO 'mcp_agent'@'localhost';FLUSH PRIVILEGES;

Development

bash
git clone <repo-url>cd universal-db-mcppython -m venv .venv && source .venv/bin/activatepip install -e ".[dev]"
# Run tests (67+ passing, no external DB required for SQLite + DuckDB)pytest
# Security tests onlypytest tests/test_security.py -v
# With coveragepytest --cov=src/universal_db_mcp --cov-report=term-missing

Architecture

src/universal_db_mcp/├── server.py          # FastMCP server — 5 tools├── config.py          # Env-var config via Pydantic├── adapters/│   ├── base.py        # Abstract adapter + result dataclasses│   ├── postgresql.py  # asyncpg, connection pool, read-only via init callback│   ├── sqlite.py      # aiosqlite, read-only via file URI mode=ro│   ├── mysql.py       # aiomysql, DictCursor│   └── duckdb.py      # duckdb, thread-pool executor, lock-guarded└── security/    └── sanitizer.py   # SQLSanitizer — 8-layer injection prevention
docs/└── SECURITY.md        # Full security architecture and threat model

vs. Google MCP Toolbox

This projectGoogle MCP Toolbox
RuntimePython — pip install / uvxGo binary / Docker
Local DBsSQLite + DuckDB zero-infraNo SQLite
AnalyticsDuckDB in-processNo columnar adapter
Auth modelRead-only by default + env varsIAM / GCP-native
SQL injection8-layer sanitizer + parameterizedAuth-focused
ExtendPython ecosystem, any pip packageGo plugins
VendorNeutralGoogle Cloud funnel

Different tools for different jobs. Use this when you want Python-native, local-first, security-hardened access without cloud dependencies.


License

MIT — LICENSE


Security Notice: This server provides AI agents with database access. Always use read-only credentials, review docs/SECURITY.md before production deployment, and never commit .env files.

來源:README.md,提交 7581347

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v1.1.2最新Sep 16, 2026

評分

已滿足適用檢查項的 40%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。