Remote MCP server

Database

Connect 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. 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. 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. 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

15

Fetches data and changes nothing.

  • list_databases

    List 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_shares

    List the shares shared with this account, attached or not.

  • list_tables

    List the tables and views in a database, optionally in one schema.

  • list_columns

    List a table's or view's columns with their types. Use it before writing a query against an unfamiliar table.

  • list_views

    List the views in a database, optionally filtered by name or comment.

  • search_catalog

    Find 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.

  • query

    Run 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_question

    Ask a question about DuckDB or MotherDuck and get an answer from their documentation.

  • get_query_guide

    Read 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_guides

    Browse the organization's Guides. With no topic, lists the root level; with a topic, lists the Guides in it.

  • get_guide

    Read one Guide's full markdown and metadata.

  • list_flights

    List Flights - scheduled Python jobs that run on MotherDuck - with their schedules.

  • get_flight

    Read one Flight's metadata, source code, requirements and config.

  • list_flight_runs

    List a Flight's runs with their status and timing.

  • get_flight_run_logs

    Read one Flight run's status, exit code and log output. Use it to find why a run failed.

Destructive

2

Deletes or permanently alters something. Worth granting on purpose.

  • query_rw

    Run 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_flight

    Start 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.