Supabase
server ทางการของ Supabase ให้ AI สร้างตาราง ถามข้อมูล และดูการตั้งค่าโปรเจกต์ในฐานข้อมูล Supabase ของคุณ
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
Security-first MCP server for PostgreSQL, SQLite, MySQL, DuckDB with SQL injection prevention.
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
POSTGRES_URI, SQLITE_PATH, MYSQL_URI, DUCKDB_PATH, ALLOW_DESTRUCTIVE, MAX_RESULT_ROWSค่าที่ติดป้ายความลับคือกุญแจของบัญชีคุณ อย่าส่งให้ใคร และอย่าวางในแชต
ต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"universal-db": {
"command": "uvx",
"args": [
"universal-db-mcp"
],
"env": {
"POSTGRES_URI": "ใส่ค่าของคุณ",
"SQLITE_PATH": "ใส่ค่าของคุณ",
"MYSQL_URI": "ใส่ค่าของคุณ",
"DUCKDB_PATH": "ใส่ค่าของคุณ",
"ALLOW_DESTRUCTIVE": "ใส่ค่าของคุณ",
"MAX_RESULT_ROWS": "ใส่ค่าของคุณ"
}
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add universal-db --env POSTGRES_URI='ใส่ค่าของคุณ' --env SQLITE_PATH='ใส่ค่าของคุณ' --env MYSQL_URI='ใส่ค่าของคุณ' --env DUCKDB_PATH='ใส่ค่าของคุณ' --env ALLOW_DESTRUCTIVE='ใส่ค่าของคุณ' --env MAX_RESULT_ROWS='ใส่ค่าของคุณ' -- uvx universal-db-mcpเติมค่าที่เว้นว่างไว้ก่อนรัน
วางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"universal-db": {
"command": "uvx",
"args": [
"universal-db-mcp"
],
"env": {
"POSTGRES_URI": "ใส่ค่าของคุณ",
"SQLITE_PATH": "ใส่ค่าของคุณ",
"MYSQL_URI": "ใส่ค่าของคุณ",
"DUCKDB_PATH": "ใส่ค่าของคุณ",
"ALLOW_DESTRUCTIVE": "ใส่ค่าของคุณ",
"MAX_RESULT_ROWS": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"universal-db": {
"type": "stdio",
"command": "uvx",
"args": [
"universal-db-mcp"
],
"env": {
"POSTGRES_URI": "ใส่ค่าของคุณ",
"SQLITE_PATH": "ใส่ค่าของคุณ",
"MYSQL_URI": "ใส่ค่าของคุณ",
"DUCKDB_PATH": "ใส่ค่าของคุณ",
"ALLOW_DESTRUCTIVE": "ใส่ค่าของคุณ",
"MAX_RESULT_ROWS": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
SQLITE_PATH envDUCKDB_PATH envALLOW_DESTRUCTIVE envMAX_RESULT_ROWS envค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 8 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub Fashad-Ahmed ซึ่งเป็นเจ้าของ repo
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
ต้องใส่ค่าเหล่านี้: POSTGRES_URI, MYSQL_URI
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (1.1.2) เข้า registry 5 เดือนที่ผ่านมา
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Python (uv) ในเครื่องด้วย
ในหมวดเดียวกันมี Supabase, MongoDB MCP Server, Elasticsearch MCP Server
server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว
อ่านการ์ด:↓ ดาวน์โหลดต่อสัปดาห์i★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi
server ทางการของ Supabase ให้ AI สร้างตาราง ถามข้อมูล และดูการตั้งค่าโปรเจกต์ในฐานข้อมูล Supabase ของคุณ
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
The security-first, Python-native MCP server for database access from AI agents.
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)
No Docker. No cloud account. No database server to install. DuckDB and SQLite run in-process:
# Query a local SQLite database — one command, zero infra
SQLITE_PATH=./myapp.db uvx universal-db-mcp
DUCKDB_PATH=./analytics.duckdb uvx universal-db-mcp
DUCKDB_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):
{
"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/.
Read-only by default. Defense-in-depth. Every query validated before it
touches the driver.
| Layer | What it does |
|---|---|
| 1 | Driver-level read-only — PostgreSQL session flag, SQLite mode=ro URI, DuckDB read_only=True. Write rejected before SQL parsing. |
| 2 | Keyword blocking — DROP, DELETE, TRUNCATE, ALTER, INSERT, UPDATE, GRANT, EXEC blocked in read-only mode |
| 3 | Injection pattern detection — UNION SELECT, stacked statements, SQL comments (--, /*), xp_, SLEEP(), WAITFOR, BENCHMARK() |
| 4 | Multiple statement rejection — ; separating statements always blocked |
| 5 | Parameter type enforcement — only str, int, float, bool, null accepted as parameters |
| 6 | Result size limits — truncated at MAX_RESULT_ROWS (default 1000) to prevent memory exhaustion |
| 7 | Identifier sanitization — table/column names stripped of metacharacters in internally-generated SQL |
| 8 | DuckDB 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 runs in-process (no server) and reads Parquet, CSV, JSON natively. Connect AI agents to your analytics data without spinning up a warehouse:
# Query parquet files directly
DUCKDB_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) ...]
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 build -t universal-db-mcp .
docker run -i --rm \ -e POSTGRES_URI=postgresql://readonly:pass@host.docker.internal:5432/mydb \ -e ALLOW_DESTRUCTIVE=false \ universal-db-mcp
See examples/docker_mcp_config.json for wiring this into an MCP client.
# PostgreSQL
POSTGRES_URI=postgresql://readonly:pass@localhost/mydb uvx universal-db-mcp
SQLITE_PATH=./db.sqlite3 uvx universal-db-mcp
MYSQL_URI=mysql://readonly:pass@localhost/mydb uvx universal-db-mcp
DUCKDB_PATH=./analytics.duckdb uvx universal-db-mcp
POSTGRES_URI=... SQLITE_PATH=... uvx universal-db-mcp
| Tool | Description |
|---|---|
query | Execute SQL — read-only by default, all 8 security layers apply |
schema | Inspect tables and columns — no config needed |
explain | Get query execution plan without running the query |
health | Check connection status, DB version, and pool metrics |
list_databases | Show all configured databases and connection state |
query_history | Inspect the last 100 executed queries |
snapshot_schema | Capture current schema for drift detection |
schema_diff | Compare 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.
# ── PostgreSQL ─────────────────────────────────────
POSTGRES_URI=postgresql://user:pass@host:5432/db POSTGRES_READONLY=true # default: true
SQLITE_PATH=/path/to/database.db SQLITE_READONLY=true # default: true
MYSQL_URI=mysql://user:pass@host:3306/db MYSQL_READONLY=true # default: true
DUCKDB_PATH=/path/to/analytics.duckdb # or :memory: DUCKDB_READONLY=true # default: true
ALLOW_DESTRUCTIVE=false # default: false — blocks INSERT/UPDATE/DELETE/DROP MAX_RESULT_ROWS=1000 # truncate large results ENABLE_LOGGING=true # log queries to stderr QUERY_TIMEOUT=30 # seconds RATE_LIMIT_RPM=60 # requests per minute
Always use a dedicated read-only account. Never give the MCP server credentials that can modify data.
PostgreSQL:
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:
CREATE USER 'mcp_agent'@'localhost' IDENTIFIED BY 'strong_random_password';
GRANT SELECT ON mydb.* TO 'mcp_agent'@'localhost'; FLUSH PRIVILEGES;
git clone <repo-url>
cd universal-db-mcp python -m venv .venv && source .venv/bin/activate pip install -e ".[dev]"
pytest
pytest tests/test_security.py -v
pytest --cov=src/universal_db_mcp --cov-report=term-missing
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
| This project | Google MCP Toolbox | |
|---|---|---|
| Runtime | Python — pip install / uvx | Go binary / Docker |
| Local DBs | SQLite + DuckDB zero-infra | No SQLite |
| Analytics | DuckDB in-process | No columnar adapter |
| Auth model | Read-only by default + env vars | IAM / GCP-native |
| SQL injection | 8-layer sanitizer + parameterized | Auth-focused |
| Extend | Python ecosystem, any pip package | Go plugins |
| Vendor | Neutral | Google Cloud funnel |
Different tools for different jobs. Use this when you want Python-native, local-first, security-hardened access without cloud dependencies.
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.