
RBDC MCP Server
A database server based on Model Context Protocol (MCP), supporting SQLite, MySQL, PostgreSQL, MSSQL, DuckDB, and Turso databases.
π¨π³ δΈζζζ‘£ / Chinese Documentation: readme_cn.md
Advantages
- Multiple Database Support: Seamlessly work with SQLite, MySQL, PostgreSQL, MSSQL, DuckDB, and Turso using a unified interface
- AI Integration: Native integration with Claude AI through the Model Context Protocol
- Zero Configuration: Automatic management of database connections and resources
- Security: Controlled access to your database through AI-driven natural language queries
- Simplicity: Use natural language to query and modify your database without writing SQL
ποΈ Database Support
| Database | Connection URL Format |
|---|---|
| SQLite | sqlite://path/to/database.db |
| MySQL | mysql://user:password@host:port/database |
| PostgreSQL | postgres://user:password@host:port/database |
| MSSQL | mssql://user:password@host:port/database |
| DuckDB | duckdb://path/to/database.duckdb |
| Turso | turso://database-url?token=your-token |
π οΈ Available Tools
sql_query: Execute a single read-only SQL statement. Pass optionalaliasto target a non-default database; defaults todefault.sql_exec: Execute INSERT/UPDATE/DELETE operations when the server is not in read-only mode. Pass optionalaliasto target a non-default database.db_status: Inspect connection pool state for a database. Pass optionalalias.test_connection: Ping a registered database. Pass optionalalias.list_databases: List all registered database aliases along with their URL and detected type.add_database: Register a new database connection under analiasand start a pool at runtime. Supported URL schemes:sqlite://,mysql://,pg:///postgres://,mssql:///sqlserver://,duckdb://,turso:///libsql://.remove_database: Unregister a previously-added alias. The reserveddefaultalias cannot be removed.
π Dynamic Multi-Database
rbdc-mcp is a multi-database server from a single process. You can start
it with no database URL at all (args: [] in your MCP client config) and
let the AI register databases on the fly through MCP tools. When a URL is
provided via --database-url, it becomes the default alias; the AI can then
register more databases at runtime and route queries to any of them by alias.
Zero-URL Startup (Dynamic Mode)
When the server starts with no --database-url, the list_databases tool
returns an empty list and any operation targeting the default alias will
suggest using add_database first. The AI can register the first (or any)
database under any alias it chooses:
add_database(alias="inventory", url="sqlite://./inventory.db")β register a database.list_databasesβ confirm it is now registered.sql_query({ alias: "inventory", sql: "SELECT * FROM products" })β query it.
Tip: You can also register a database with
alias="default"if you prefer to omitaliasfrom subsequent queries.
Pre-declared Startup (Static Mode)
Tool flow the AI follows:
list_databasesβ see all currently registered aliases.add_database(alias="orders_mysql", url="mysql://user:pass@host/orders")β register a new database and start a pool for it.sql_query({ alias: "orders_mysql", sql: "SELECT COUNT(*) FROM orders" })β route a query to that database. Omitaliasto use thedefaultone.remove_database(alias="orders_mysql")β tear down the pool and unregister the alias when finished.
Two ways to register databases
| Path | When | How |
|---|---|---|
| CLI pre-declared | Stable list, you want the AI to see every database at boot | Repeat --database-url and pair --alias (the first URL becomes default). |
Runtime add_database | Ad-hoc / exploratory / zero-URL startup | The AI calls the add_database MCP tool. |
Both paths write into the same in-memory alias β pool registry, so the result is identical from the AI's point of view: list_databases returns every alias regardless of where it was registered.
Why this matters
- One MCP server process, many databases β no need to spawn
rbdc-mcp-mysql,rbdc-mcp-postgres, etc. for each database. - All aliases are discoverable via
list_databases, so the AI can dynamically pick the right target per query. - When a
--database-urlis provided, thedefaultalias is reserved for it and cannot be removed. - Each alias has its own independent connection pool β concurrent queries against different aliases do not block each other.
Example prompt you can give the AI
"Connect to my MySQL orders database at
mysql://root:pwd@10.0.0.5/ordersand tell me the total revenue by month."
The AI will call add_database(...), then sql_query(...) against that alias
without restarting the MCP server β works the same whether you provided a
--database-url at startup or not.
Read-Only Mode
--read-only disables the sql_exec tool, preventing any data modifications. Additionally, sql_query validates submitted SQL and rejects statements containing write keywords (INSERT, UPDATE, DELETE, etc.) or multi-statement input.
πΈ Screenshots
Step 1: Configuration

Step 2: Usage in Claude

Installation
π Method 1: Install via Cargo (Recommended)
Prerequisites: Install Rust first.
Choose the install command based on your needs:
# All drivers (default, ~10-15 minutes build)
cargo install --git https://github.com/rbatis/rbdc-mcp.git
# Minimal: SQLite only (fastest build, ~2-3 minutes)
cargo install --git https://github.com/rbatis/rbdc-mcp.git --no-default-features --features sqlite
# Single driver (e.g., MySQL):
cargo install --git https://github.com/rbatis/rbdc-mcp.git --no-default-features --features mysql
# Multiple drivers:
cargo install --git https://github.com/rbatis/rbdc-mcp.git --no-default-features --features "mysql postgres"π‘ Build speed tip: If you only need one database (e.g., SQLite), add --no-default-features --features sqlite to skip compiling unused drivers, cutting build time from ~15 minutes to ~2 minutes.
Available Features
| Feature | Driver | Description |
|---|---|---|
sqlite | rbdc-sqlite | SQLite support |
mysql | rbdc-mysql | MySQL support |
postgres | rbdc-pg | PostgreSQL support |
mssql | rbdc-mssql | MSSQL/SQL Server support |
duckdb | rbdc-duckdb | DuckDB support |
turso | rbdc-turso | Turso/libsql support |
full | (all above) | Enable all database drivers |
π¦ Method 2: Download Pre-built Binaries
Download the latest release for your platform from GitHub Releases:
| Platform | Download |
|---|---|
| Windows (x64) | rbdc-mcp-windows-x86_64.exe |
| macOS (Intel) | rbdc-mcp-macos-x86_64 |
| macOS (Apple Silicon) | rbdc-mcp-macos-aarch64 |
| Linux (x64) | rbdc-mcp-linux-x86_64 |
After downloading, rename the file to rbdc-mcp (or rbdc-mcp.exe on Windows) and add it to your system PATH.
π§ Agent Client Configuration
Configure rbdc-mcp in your MCP-compatible client by adding it to the MCP server list.
Claude Desktop
Configuration File Location:
- Windows:
%APPDATA%\Claude\claude_desktop_config.json - macOS:
~/Library/Application Support/Claude/claude_desktop_config.json
Basic Configuration:
{
"mcpServers": {
"rbdc-mcp": {
"command": "rbdc-mcp",
"args": []
}
}
}With args: [], the server starts with no database pre-configured.
The AI registers databases at runtime using the add_database tool (see
Dynamic Multi-Database below).
To pre-configure a database at startup:
{
"mcpServers": {
"rbdc-mcp": {
"command": "rbdc-mcp",
"args": ["--database-url", "sqlite://./database.db"]
}
}
}Database Examples:
<details> <summary><strong>Single-Server Multi-Database Configuration</strong></summary>One rbdc-mcp process can host many databases. The first --database-url is registered as the default alias; pair extra URLs with --alias to declare a fixed set the AI can see immediately at startup via list_databases (see <a href="#-dynamic-multi-database">Dynamic Multi-Database</a>). The AI can also register more databases at runtime through the add_database MCP tool.
Start a single default database (AI registers the rest at runtime):
{
"mcpServers": {
"rbdc-mcp": {
"command": "rbdc-mcp",
"args": [
"--database-url", "sqlite://./database.db"
]
}
}
}Pre-declare several databases with explicit aliases (one process, multiple pools):
{
"mcpServers": {
"rbdc-mcp": {
"command": "rbdc-mcp",
"args": [
"--database-url", "sqlite://./local.db", "--alias", "local",
"--database-url", "mysql://user:password@db1:3306/orders", "--alias", "orders",
"--database-url", "postgres://user:password@db2:5432/bi", "--alias", "bi",
"--database-url", "duckdb://./warehouse.duckdb", "--alias", "warehouse"
]
}
}
}The first --alias value is ignored (the first URL always becomes default). The aliases must be unique, non-empty, and not equal to default for any URL after the first.
Legacy style β one process per database (still works, but no longer needed for multi-database access):
{
"mcpServers": {
"rbdc-mcp-sqlite": {
"command": "rbdc-mcp",
"args": ["--database-url", "sqlite://./database.db"]
},
"rbdc-mcp-mysql": {
"command": "rbdc-mcp",
"args": ["--database-url", "mysql://user:password@localhost:3306/database"]
},
"rbdc-mcp-postgres": {
"command": "rbdc-mcp",
"args": ["--database-url", "postgres://user:password@localhost:5432/database"]
},
"rbdc-mcp-mssql": {
"command": "rbdc-mcp",
"args": ["--database-url", "mssql://user:password@localhost:1433/database"]
},
"rbdc-mcp-duckdb": {
"command": "rbdc-mcp",
"args": ["--database-url", "duckdb://path/to/database.duckdb"]
},
"rbdc-mcp-turso": {
"command": "rbdc-mcp",
"args": ["--database-url", "turso://database-url?token=your-token"]
}
}
}{
"mcpServers": {
"rbdc-mcp": {
"command": "C:\\tools\\rbdc-mcp.exe",
"args": ["--database-url", "sqlite://C:\\path\\to\\database.db"]
}
}
}Restart: After saving, restart Claude Desktop to load the MCP server.
Test: In Claude Desktop, try asking:
- "Show me the database connection status"
- "What tables are in my database?"
Codex
Configuration File Location:
- Global:
~/.codex/mcp.toml - Project-level:
.codex/mcp.toml(place in your project root)
Basic Configuration (.codex/mcp.toml or ~/.codex/mcp.toml):
[mcp_servers.rbdc-mcp]
command = "rbdc-mcp"
args = ["--database-url", "sqlite://./database.db"]
type = "stdio"
enabled = trueDatabase Examples (single process, multiple databases):
# Pre-declare several databases with explicit aliases
[mcp_servers.rbdc-mcp]
command = "rbdc-mcp"
args = [
"--database-url", "sqlite://./local.db", "--alias", "local",
"--database-url", "mysql://user:password@db1:3306/orders", "--alias", "orders",
"--database-url", "postgres://user:password@db2:5432/bi", "--alias", "bi",
"--database-url", "duckdb://./warehouse.duckdb", "--alias", "warehouse",
]
type = "stdio"
enabled = trueThe first URL becomes the default alias (its --alias, if any, is ignored). Additional URLs must be paired with --alias in declaration order. The AI can see every registered alias at startup through the list_databases MCP tool, and can also register more databases at runtime through add_database.
Restart: After saving the config file, restart Codex to load the MCP server. If Codex is already running, run codex reconnect to force a reload.
Test: In Codex chat, try asking:
- "Show me the database connection status"
- "What tables are in my database?"
π Usage Examples
Natural Language Database Operations
- Query Data: "Show me all users in the database"
- Modify Data: "Add a new user named John with email john@example.com"
- Get Status: "What's the database connection status?"
- Schema Info: "What tables exist in my database?"
- Multi-Database: "Connect to my MySQL orders database and compare its row counts with the local SQLite cache"
βοΈ Configuration Options
| Parameter | Description | Default |
|---|---|---|
--database-url, -d | Database connection URL. Omit to start empty (databases added at runtime via add_database). Repeat to pre-register multiple databases at startup. | None (optional) |
--alias | Alias for the corresponding --database-url (declaration order). The first is ignored; later aliases must be unique, non-empty, and not default. | auto (db2, db3, ...) |
--max-connections | Maximum connection pool size | 1 |
--timeout | Connection timeout (seconds) | 30 |
--log-level | Log level (error/warn/info/debug) | info |
--read-only | Disable sql_exec and enforce read-only SQL validation | false |
No common issues documented yet. If you hit a problem, the repository's GitHub Issues page is the best place to look.
License
Apache-2.0
- Multi-Database in One Server: The AI can register additional database connections at runtime via the
add_databasetool and route queries to any registered database by itsaliasβ no need to spawn extra MCP server processes |--database-url, -d| Database connection URL. Omit to start empty (databases added at runtime viaadd_database). Repeat to pre-register multiple databases at startup. |None(optional) |