mcp-multi-db
Read-only MCP server for querying PostgreSQL, MySQL, and SQLite from AI agents — multi-database, safe by default.
README
mcp-multi-db
One MCP server for all your SQL databases — read-only and safe by default.
Connect an AI agent to PostgreSQL, MySQL, and SQLite at the same time through a
single Model Context Protocol server. List
your databases in one config file and the agent picks which one to query by
database_id. Every query is enforced read-only at the database level, so it's
safe to point at real data.
- Multi-engine, one server — Postgres, MySQL, and SQLite side by side; no separate server per database.
- Read-only & safe by default — two-layer enforcement (SQL-text guard + database-level read-only transactions) plus row limits and query timeouts. See SECURITY.md.
- Schema-aware — the agent can discover databases, tables/views, and column metadata before it writes a query.
- Zero query language to learn — just ask in natural language.

The clip drives the real server over stdio (via the MCP SDK) against a seeded SQLite database. Regenerate it with
npm run build && vhs examples/demo.tape.
Tools
| Tool | Description |
|---|---|
list_databases |
List configured database connections |
list_tables |
List tables/views in a database |
describe_table |
Show column metadata for a table |
run_query |
Run read-only SQL (SELECT, WITH, EXPLAIN) |
Quick start
No install needed — npx fetches the package on first use.
1. Create databases.json
Copy the example and edit with your connection details:
cp databases.example.json databases.json
{
"databases": [
{
"id": "local-sqlite",
"type": "sqlite",
"path": "/absolute/path/to/app.db",
"label": "Local dev SQLite"
},
{
"id": "analytics-pg",
"type": "postgres",
"connectionString": "postgresql://user:pass@localhost:5432/analytics",
"label": "Analytics Warehouse"
},
{
"id": "reporting-mysql",
"type": "mysql",
"connectionString": "mysql://user:pass@localhost:3306/reporting",
"label": "Reporting MySQL"
}
]
}
Never commit
databases.json— it contains credentials. It's already gitignored if you cloned the repo. Prefer read-only database users (see Security).
2. Register the server with your MCP client
The server speaks MCP over stdio, so it works with any MCP-capable client.
Use npx mcp-multi-db as the command and pass MCP_DB_CONFIG (the path to
your databases.json). See mcp.example.json and
databases.example.json for templates.
<details open> <summary><b>Claude Desktop</b></summary>
Edit claude_desktop_config.json (macOS:
~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"mcp-multi-db": {
"command": "npx",
"args": ["-y", "mcp-multi-db"],
"env": {
"MCP_DB_CONFIG": "/absolute/path/to/databases.json"
}
}
}
}
Restart Claude Desktop afterward. </details>
<details> <summary><b>Claude Code</b></summary>
claude mcp add mcp-multi-db \
--env MCP_DB_CONFIG=/absolute/path/to/databases.json \
-- npx -y mcp-multi-db
</details>
<details> <summary><b>Cursor</b></summary>
Add to ~/.cursor/mcp.json (or .cursor/mcp.json in your project), then open
Cursor Settings → Tools & MCP, restart the server, and use Agent mode:
{
"mcpServers": {
"mcp-multi-db": {
"command": "npx",
"args": ["-y", "mcp-multi-db"],
"env": {
"MCP_DB_CONFIG": "/absolute/path/to/databases.json"
}
}
}
}
</details>
<details> <summary><b>Cline / Windsurf / other MCP clients</b></summary>
Any client that supports stdio MCP servers uses the same shape: command npx,
args ["-y", "mcp-multi-db"], and env MCP_DB_CONFIG pointing at your
databases.json. Consult your client's docs for where its MCP config lives.
Prefer a pinned global install?
npm install -g mcp-multi-db, then use commandmcp-multi-dbwith no args. </details>
Configuration reference
Config is loaded from one of two environment variables, in order:
MCP_DB_CONFIG— path to a JSON file (recommended).MCP_DATABASES— inline JSON (useful when a file path is awkward).
The JSON may be either { "databases": [ ... ] } or a bare array. Each entry:
| Field | Required | Notes |
|---|---|---|
id |
yes | Unique; the agent references this as database_id |
type |
yes | postgres | mysql | sqlite |
connectionString |
postgres/mysql | Standard connection URI |
path |
sqlite | Absolute path to the .db file |
label |
no | Human-friendly name shown to the agent |
description |
no | Extra context shown to the agent |
Example prompts
- "List my configured databases"
- "What tables are in
local-sqlite?" - "Describe the
userstable inanalytics-pg" - "Run
SELECT COUNT(*) FROM ordersonreporting-mysql"
Security
- Read-only only.
INSERT,UPDATE,DELETE, DDL, etc. are blocked — both by a SQL-text guard and by running each query inside a database-level read-only transaction (SQLite opens read-only). ASELECTthat calls a side-effecting function is still refused. - Row limits. Results are capped (default 100, max 1000).
- Query timeouts. Statements are bounded (30s) to avoid runaway queries.
- Use least privilege anyway. Prefer dedicated read-only DB users and read replicas. Full details and reporting in SECURITY.md.
Docker
A multi-stage Dockerfile is included. Build and run with your
databases.json mounted in:
docker build -t mcp-multi-db .
docker run --rm -i \
-v /absolute/path/to/databases.json:/config/databases.json:ro \
mcp-multi-db
The image runs as a non-root user, ships only the built JS and runtime
node_modules (no toolchain), and speaks MCP over stdio just like the npx
install — so it slots into any MCP client by replacing the command and
args with the appropriate docker run -i invocation.
Development
npm install
npm run build # tsc -> build/, the artifact MCP clients run
npm test # builds, then runs the node:test suite
Tests use Node's built-in test runner (no extra dependencies) and cover the read-only SQL guard and the SQLite adapter end to end. CI runs build + tests on every push and pull request.
Adding another database engine is a contained change: add the config variant in
src/config.ts, implement the SqlDatabasePort interface in a
new adapter under src/adapters/, and register it in the
adapter factory. New adapters must enforce read-only at the connection level —
not rely on the text guard alone. See docs/extending.md for
the full checklist.
Documentation
- Architecture — components, request lifecycle, and the port-family design (with diagrams).
- Extending — add a SQL engine or a non-SQL family.
- Security — the two-layer read-only model and safe deployment.
The full index is in docs/.
License
ISC — see LICENSE.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。