Remote MCP server
DatabaseConnect Claude to MotherDuck
Explore MotherDuck databases, shares, tables and columns, run DuckDB SQL, and read Guides and Flights. Toolspoke puts 17 of its actions behind one MCP endpoint that Claude, Cursor, and Codex all speak.
- Connection
- Remote MCP server
- Authentication
- Access token
- Actions exposed
- 17
- What a call bills
- Nothing
- Adapter
- Maintained by Toolspoke
Connected in three steps
- 1
Install MotherDuck
Open the marketplace in your workspace, add MotherDuck to the project your agents work in, and it appears on the gateway immediately.
- 2
Connect the credential
Authenticate with access token. Where to get one, and what it has to be able to reach, is the next section.
- 3
Point your agent at the gateway
Give your client one address, https://toolspoke.com/mcp. Claude Code takes it as a command, Claude and Claude Desktop add it as a custom connector, and Cursor, Codex and VS Code each read it from a config file of their own.
.mcp.json{
"mcpServers": {
"toolspoke": {
"type": "http",
"url": "https://toolspoke.com/mcp"
}
}
}One block covers every tool you have installed. MotherDuck shows up in the client as soon as your policy allows it, and so does everything else you install later.
Where the address goes, per client
- Claude Code
Run it in your project, then /mcp to sign in
claude mcp add --transport http toolspoke https://toolspoke.com/mcp- Claude and Claude Desktop
Settings, then Connectors, then Add custom connector
https://toolspoke.com/mcp- Cursor
~/.cursor/mcp.json, or .cursor/mcp.json for one project
{ "mcpServers": { "toolspoke": { "url": "https://toolspoke.com/mcp" } } }- Codex
~/.codex/config.toml
[mcp_servers.toolspoke] url = "https://toolspoke.com/mcp"- VS Code
.vscode/mcp.json, or the MCP: Add Server command
{ "servers": { "toolspoke": { "type": "http", "url": "https://toolspoke.com/mcp" } } }
What MotherDuck asks for
Access token. You provide it once, when you install the connector. Toolspoke encrypts it at rest and decrypts it only for the length of a single call, and the gateway attaches it to the outbound request itself, so it is never part of the arguments an agent sends.
- Access tokenRequired
- app.motherduck.com → Settings → Access Tokens → Create token. Choose a read scaling token if this tool should only read - it reaches read replicas that reject every write, so query_rw fails on the server. A regular access token is needed for query_rw and run_flight. The token acts as the user or service account that created it, and reaches every database that user can.
- eyJhbGciOi…
What Claude can do in MotherDuck
17 actions, each one declared and named by the connector rather than discovered at runtime. A workspace policy grants a person all of them, a hand-picked selection, everything on the read side, everything on the write side, or none.
- Reads
- 15Reads
- Writes
- 0Writes
- Destructive
- 2Destructive
Reads
15Fetches data and changes nothing.
list_databasesList every database this account can reach, including attached shares. Call this first to confirm the token works and to find the database names the other tools take.
list_sharesList the shares shared with this account, attached or not.
list_tablesList the tables and views in a database, optionally in one schema.
list_columnsList a table's or view's columns with their types. Use it before writing a query against an unfamiliar table.
list_viewsList the views in a database, optionally filtered by name or comment.
search_catalogFind databases, schemas, tables, columns or shares by name across the whole account. Use it when you know roughly what a table is called but not where it lives.
queryRun one read-only DuckDB SQL statement against a database and return the rows. Statements that change data or schema are refused; use query_rw for those. Include your own LIMIT.
ask_docs_questionAsk a question about DuckDB or MotherDuck and get an answer from their documentation.
get_query_guideRead the organization's Guides overview - its topics and root-level Guides with the metric definitions and join conventions to follow. Call it before writing SQL against unfamiliar business data.
list_guidesBrowse the organization's Guides. With no topic, lists the root level; with a topic, lists the Guides in it.
get_guideRead one Guide's full markdown and metadata.
list_flightsList Flights - scheduled Python jobs that run on MotherDuck - with their schedules.
get_flightRead one Flight's metadata, source code, requirements and config.
list_flight_runsList a Flight's runs with their status and timing.
get_flight_run_logsRead one Flight run's status, exit code and log output. Use it to find why a run failed.
Destructive
2Deletes or permanently alters something. Worth granting on purpose.
query_rwRun one DuckDB SQL statement that may change data or schema: INSERT, UPDATE, DELETE, CREATE, DROP, ATTACH. Destructive because DROP and DELETE remove data with no undo.
run_flightStart a run of a Flight now. Destructive because a Flight is arbitrary Python with the owner's credentials, so a run can write or delete data, and it bills compute.
What it will not do
Enforced by the gateway rather than left to convention, which is why each of these can be stated flatly.
- It cannot call anything else
- The 17 actions above are the whole of it. A call to any other name is refused before it reaches MotherDuck rather than forwarded on, and connecting your account does not add to the list: it is fixed by the connector, not discovered at run time.
- It reaches no further than your credential
- Toolspoke holds no access to MotherDuck of its own. Every call carries the credential you stored and nothing besides, so whatever that credential cannot reach, this connector cannot reach either.
- It never hears from MotherDuck
- Nothing is pushed to it. There is no webhook, no subscription and no polling, so this connector cannot notice by itself that something changed in MotherDuck. An agent has to ask.
- It does not smooth over provider limits
- Toolspoke does not retry, queue or back off around MotherDuck's own rate limits. A call that MotherDuck refuses comes back to the agent as a failed call.
Before you connect it
What can Claude do in MotherDuck?
17 named actions: 15 that only read and 2 that delete or permanently alter something. They include list_databases, list_shares and list_tables. Nothing outside that list is reachable: the connector declares each operation by name rather than proxying whatever an agent asks for.
What credentials does the MotherDuck connector need?
Access token. The connector asks for access token. Values are encrypted at rest and attached to the outbound request by the gateway, so they are never part of the arguments an agent sends and never reach the audit log.
Does the MotherDuck connector work with Cursor and Codex, or only Claude?
Any client that speaks MCP, and every one of them gets the same 17 actions. There is a single address, https://toolspoke.com/mcp. Claude Code adds it with claude mcp add --transport http, Claude and Claude Desktop take it as a custom connector in settings, Cursor reads it from .cursor/mcp.json, Codex from ~/.codex/config.toml, and VS Code from .vscode/mcp.json. Each of them signs in to the gateway itself, so there is no key to paste.
What does the MotherDuck connector not do?
The 17 actions above are the whole of it. A call to any other name is refused before it reaches MotherDuck rather than forwarded on, and connecting your account does not add to the list: it is fixed by the connector, not discovered at run time. Toolspoke holds no access to MotherDuck of its own. Every call carries the credential you stored and nothing besides, so whatever that credential cannot reach, this connector cannot reach either. Nothing is pushed to it. There is no webhook, no subscription and no polling, so this connector cannot notice by itself that something changed in MotherDuck. An agent has to ask. Toolspoke does not retry, queue or back off around MotherDuck's own rate limits. A call that MotherDuck refuses comes back to the agent as a failed call.
Can I limit which actions an agent can call?
Yes, in two places. The project switches MotherDuck's actions on and off one at a time, for everyone in the project at once, and the screen groups them by read, write and destructive so turning off everything that deletes is one click. An individual agent key can then be narrowed further, to particular toolkits in a project and to particular actions in a toolkit. Whatever it was granted, a key never reaches a project its owner cannot.
What gets recorded when an agent calls MotherDuck?
Every attempt, with the agent that made it and the person that agent belongs to, the full request payload, the response payload, the status, the duration, and what the call cost in sandbox time and model tokens. Values whose key names a secret are masked out before the record is shown to anyone. An operation the connector marks as not retained never has its response body written at all, so the gateway keeps no second copy of what was read.