Mcp Server Motherduck — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Mcp Server Motherduck (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
<p align="center"> <img src="src/mcp_server_motherduck/assets/duck_feet_square.png" alt="MotherDuck / DuckDB Local MCP Server" width="120"> </p>
<h1 align="center">DuckDB / MotherDuck Local MCP Server</h1>
<p align="center"> SQL analytics and data engineering for AI Assistants and IDEs. </p>
Connect AI assistants to your data using DuckDB's powerful analytical SQL engine. Supports connecting to local DuckDB files, in-memory databases, S3-hosted databases, and MotherDuck. Allows executing SQL read- and write-queries, browsing database catalogs, and switching between different database connections on-the-fly.
Looking for a fully-managed remote MCP server for MotherDuck? → Go to the MotherDuck Remote MCP docs
| [Remote MCP](https://motherduck.com/docs/sql-reference/mcp/) | Local MCP (this repo) | |
|---|---|---|
| Hosting | Hosted by MotherDuck | Runs locally/self-hosted |
| Setup | Zero-setup | Requires local installation |
| Access | Read-write supported | Read-write supported |
| Local filesystem | - | Query across local and remote databases, ingest data from / export data to local filesystem |
Prerequisites: Install uv via pip install uv or brew install uv
{
"mcpServers": {
"DuckDB (in-memory, r/w)": {
"command": "uvx",
"args": ["mcp-server-motherduck", "--db-path", ":memory:", "--read-write", "--allow-switch-databases"]
}
}
}Full flexibility with no guardrails — read-write access and the ability to switch to any database (local files, S3, or MotherDuck) at runtime.
{
"mcpServers": {
"DuckDB (read-only)": {
"command": "uvx",
"args": ["mcp-server-motherduck", "--db-path", "/absolute/path/to/your.duckdb"]
}
}
}Connects to a specific DuckDB file in read-only mode. Won't hold on to the file lock, so convenient to use alongside a write connection to the same DuckDB file. You can also connect to remote DuckDB files on S3 using s3://bucket/path.duckdb — see Environment Variables for S3 authentication. If you're considering third-party access to the MCP, see Securing for Production.
{
"mcpServers": {
"MotherDuck (local, r/w)": {
"command": "uvx",
"args": ["mcp-server-motherduck", "--db-path", "md:", "--read-write"],
"env": {
"motherduck_token": "<YOUR_MOTHERDUCK_TOKEN>"
}
}
}
}See Command Line Parameters for more options, Securing for Production for deployment guidance, and Troubleshooting if you encounter issues.
| Client | Config Location | One-Click Install |
|---|---|---|
| Claude Desktop | Settings → Developer → Edit Config | .mcpb (MCP Bundle) |
| Claude Code | Use CLI commands below | - |
| Codex CLI | Use CLI commands below or ~/.codex/config.toml | - |
| Gemini CLI | Use CLI commands below or ~/.gemini/settings.json | - |
| Cursor | Settings → MCP → Add new global MCP server | <img src="https://cursor.com/deeplink/mcp-install-dark.svg" alt="Install in Cursor" height="20"> |
| VS Code | Ctrl+Shift+P → "Preferences: Open User Settings (JSON)" | |
| Kiro | ~/.kiro/settings/mcp.json (global) or .kiro/settings/mcp.json (project) |
Any MCP-compatible client can use this server. Add the JSON configuration from Quick Start to your client's MCP config file. Consult your client's documentation for the config file location.
<details> <summary><b>Claude Code CLI commands</b></summary>
In-Memory DuckDB (Dev Mode):
claude mcp add --scope user duckdb --transport stdio -- uvx mcp-server-motherduck --db-path :memory: --read-write --allow-switch-databasesLocal DuckDB (Read-Only):
claude mcp add --scope user duckdb --transport stdio -- uvx mcp-server-motherduck --db-path /absolute/path/to/db.duckdbMotherDuck (Read-Write):
claude mcp add --scope user motherduck --transport stdio --env motherduck_token=YOUR_TOKEN -- uvx mcp-server-motherduck --db-path md: --read-write</details>
<details> <summary><b>Codex CLI commands</b></summary>
In-Memory DuckDB (Dev Mode):
codex mcp add duckdb -- uvx mcp-server-motherduck --db-path :memory: --read-write --allow-switch-databasesLocal DuckDB (Read-Only):
codex mcp add duckdb -- uvx mcp-server-motherduck --db-path /absolute/path/to/db.duckdbMotherDuck (Read-Write):
codex mcp add motherduck --env motherduck_token=YOUR_TOKEN -- uvx mcp-server-motherduck --db-path md: --read-write</details>
<details> <summary><b>Gemini CLI commands</b></summary>
In-Memory DuckDB (Dev Mode):
gemini mcp add -s user duckdb uvx mcp-server-motherduck --db-path :memory: --read-write --allow-switch-databasesLocal DuckDB (Read-Only):
gemini mcp add -s user duckdb uvx mcp-server-motherduck --db-path /absolute/path/to/db.duckdbMotherDuck (Read-Write):
gemini mcp add -s user -e motherduck_token=YOUR_TOKEN motherduck uvx mcp-server-motherduck --db-path md: --read-write</details>
<details> <summary><b>Kiro manual JSON config</b></summary>
Add the following to your Kiro MCP config file (~/.kiro/settings/mcp.json for global, or .kiro/settings/mcp.json for project-scoped). See the Kiro MCP documentation for more details.
In-Memory DuckDB (Dev Mode):
{
"mcpServers": {
"DuckDB (in-memory, r/w)": {
"command": "uvx",
"args": ["mcp-server-motherduck", "--db-path", ":memory:", "--read-write", "--allow-switch-databases"]
}
}
}MotherDuck (Read-Write):
{
"mcpServers": {
"MotherDuck (local, r/w)": {
"command": "uvx",
"args": ["mcp-server-motherduck", "--db-path", "md:", "--read-write"],
"env": {
"motherduck_token": "<YOUR_MOTHERDUCK_TOKEN>"
}
}
}
}</details>
| Tool | Description | Required Inputs | Optional Inputs |
|---|---|---|---|
execute_query | Execute SQL query (DuckDB dialect) | sql | - |
list_databases | List all databases (useful for MotherDuck or multiple attached DBs) | - | - |
list_tables | List tables and views | - | database, schema |
list_columns | List columns of a table/view | table | database, schema |
switch_database_connection* | Switch to different database | path | create_if_not_exists |
*Requires --allow-switch-databases flag
All tools return JSON. Results are limited to 1024 rows / 50,000 chars by default (configurable via --max-rows, --max-chars).
When giving third parties access to a self-hosted MCP server, read-only mode alone is not sufficient — it still allows access to the local filesystem, changing DuckDB settings, and other potentially sensitive operations.
For production deployments with third-party access, we recommend [MotherDuck Remote MCP](https://motherduck.com/docs/sql-reference/mcp/) — zero-setup, read-write capable, and hosted by MotherDuck.
Self-hosting MotherDuck MCP: Fork this repo and customize as needed. Use a [service account](https://motherduck.com/docs/key-tasks/service-accounts-guide/) with [read-scaling tokens](https://motherduck.com/docs/key-tasks/authenticating-and-connecting-to-motherduck/read-scaling/#creating-a-read-scaling-token) and enable [SaaS mode](https://motherduck.com/docs/key-tasks/authenticating-and-connecting-to-motherduck/authenticating-to-motherduck/#authentication-using-saas-mode) to restrict local file access.
Self-hosting DuckDB MCP: Use --init-sql to apply security settings. See the Securing DuckDB guide for available options.
Build and run the server with Streamable HTTP on port 8000 (defaults to an in-memory DuckDB):
docker build -t mcp-server-motherduck .
docker run --rm -p 8000:8000 mcp-server-motherduckConnect to MotherDuck by passing a token and overriding the command:
docker run --rm -p 8000:8000 \
-e motherduck_token="$MOTHERDUCK_TOKEN" \
mcp-server-motherduck --transport http --db-path md:The MCP endpoint is available at http://localhost:8000/mcp. CLI flags and env vars from below still apply.
| Parameter | Default | Description |
|---|---|---|
--db-path | :memory: | Database path: local file (absolute), md: (MotherDuck), or s3:// URL |
--motherduck-token | motherduck_token env var | MotherDuck access token |
--read-write | False | Enable write access |
--motherduck-saas-mode | False | MotherDuck SaaS mode (restricts local access) |
--allow-switch-databases | False | Enable switch_database_connection tool |
--max-rows | 1024 | Max rows returned |
--max-chars | 50000 | Max characters returned |
--query-timeout | -1 | Query timeout in seconds (-1 = disabled) |
--init-sql | None | SQL to execute on startup |
--motherduck-connection-parameters | session_hint=mcp&<br>dbinstance_inactivity_ttl=0s | Additional MotherDuck connection string parameters (key=value pairs separated by &) |
--ephemeral-connections | True | Use temporary connections for read-only local files |
--transport | stdio | Transport type: stdio or http |
--stateless-http | False | For protocol compatibility only (e.g. with AWS Bedrock AgentCore Runtime). Server still maintains global state via the shared DatabaseClient. |
--port | 8000 | Port for HTTP transport |
--host | 127.0.0.1 | Host for HTTP transport |
| Variable | Description |
|---|---|
motherduck_token or MOTHERDUCK_TOKEN | MotherDuck access token (alternative to --motherduck-token) |
HOME | Used by DuckDB for extensions and config. Override with --home-dir if not set. |
AWS_ACCESS_KEY_ID | AWS access key for S3 database connections |
AWS_SECRET_ACCESS_KEY | AWS secret key for S3 database connections |
AWS_SESSION_TOKEN | AWS session token for temporary credentials (IAM roles, SSO, EC2 instance profiles) |
AWS_DEFAULT_REGION | AWS region for S3 connections |
AWS_ENDPOINT | AWS endpoint for S3 connections |
uvx (run which uvx to find it)--ephemeral-connections is turned on (default: true) and that you're not connected in read-write modeTo run from source:
{
"mcpServers": {
"Local DuckDB (Dev)": {
"command": "uv",
"args": ["--directory", "/path/to/mcp-server-motherduck", "run", "mcp-server-motherduck", "--db-path", "md:"],
"env": {
"motherduck_token": "<YOUR_MOTHERDUCK_TOKEN>"
}
}
}
}Release New Version GitHub ActionMAJOR.MINOR.PATCH formatMIT License - see LICENSE file.
## mcp-name: io.github.motherduckdb/mcp-server-motherduck
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.