Read-only by default · one scoped key per agent · every call audited

MYSQL dialect

MySQL MCP server

Give Claude Code, Cursor or any MCP client a a MySQL connection it cannot abuse: read-only by default, one scoped key per agent, every call audited, and the database password never leaves your deployment.

Driver and dialect

What ships, and what you supply

The dialect catalog and driver matrix rows for this engine.
Dialect constantMYSQL
JDBC drivercom.mysql:mysql-connector-j
Driver licenseGPL-2.0 with FOSS exception
In the published image? No
How to supply it Rebuild with ./gradlew -Pmysql bootJar, or drop mysql-connector-j.jar into lib/
JDBC URL shapejdbc:mysql://db.internal:3306/analytics

The driver is not redistributed in the image for license reasons. Supplying it is the operator's act of accepting that license — and registering a datasource for a dialect whose driver is absent fails at save time with datasource.driver_not_loaded, a packaging error that says so.

Copy, paste, done

Connect your agent

The endpoint is POST {host}/mcp over Streamable HTTP, and the credential is an API key in DP-API-Key or Authorization: Bearer dpk_…. Session cookies are rejected there, so the config is the same whichever engine you registered — the engine is a datasource, not a server.

Claude Code

claude mcp add --transport http datapipelines https://your-host/mcp \
  --header "DP-API-Key: dpk_<id>.<secret>"

Cursor — ~/.cursor/mcp.json

{
  "mcpServers": {
    "datapipelines": {
      "url": "https://your-host/mcp",
      "headers": { "DP-API-Key": "dpk_<id>.<secret>" }
    }
  }
}

GitHub Copilot in VS Code — .vscode/mcp.json

{
  "servers": {
    "datapipelines": {
      "type": "http",
      "url": "https://your-host/mcp",
      "headers": { "DP-API-Key": "dpk_<id>.<secret>" }
    }
  }
}

The endpoint and the header are ours and specified above; the surrounding file shape belongs to each client and is what its own documentation prescribes. The full walkthrough covers minting the key and checking that the tool list came back.

Registering the database

A MySQL datasource, read-only, credentials encrypted

The read-only flag refuses writes

Flag the datasource read-only and the three write-shaped uses — a DML node's source, a DDL node's source, and writing a node's output back to it — are refused at save time and again at execution time, against the live row.

Use a SELECT-only login as well

The flag is contract; the database credential is containment. For anything that must not change, create a SELECT-only user — the documented pattern, and what the demo's own datasources run under.

The password is encrypted at rest

AES-256-GCM in the metadata database, with the datasource name bound as additional authenticated data. The application refuses to start without a valid encryption key.

The agent introspects, but never registers

datasources_get_schemas, datasources_get_tables, datasources_get_columns and datasources_preview_rows exist so the agent grounds its SQL in your real schema instead of guessing at it. What it cannot do is create a datasource: no credential travels through an agent, so a person registers the connection and the agent uses it by name.

Working example

A seeded pipeline that reads this engine

nyc/mobility/rainy_vs_dry_ridership ships with the NYC demo — one command, real data, and a MySQL datasource among its sources. See what it does.

./app.sh --start --demo nyc,trade,lake

Asked before

This engine, in questions

Does the JDBC driver ship in the published image?

That is the page's driver-matrix table above: some engines' drivers are bundled, and the ones whose licenses we do not redistribute are user-supplied — registering a datasource whose driver is absent fails at save time with datasource.driver_not_loaded. The matrix is docs/deployment.md §3.5.

How does the agent authenticate to this engine?

It does not reach the engine at all: the agent talks to the MCP endpoint with an API key in DP-API-Key or Authorization: Bearer dpk_, and the server connects to the database with the credentials it holds. Session cookies are rejected on /mcp. The authentication is docs/mcp-server.md §4.1.

Is the database credential exposed to the agent?

No — the credential is AES-256-GCM encrypted at rest with the datasource name bound as additional authenticated data, and it is never returned through a tool or the API. The agent references the datasource by name. The encryption is docs/datasources.md §7.1.

Can the agent register the datasource itself?

No — no credential travels through an agent, so a person registers the connection and the agent uses it by name. What the agent gets instead is the read side: schemas, tables, columns and preview rows over the introspection tools. The tool list is docs/mcp-server.md §6.1.

Connect an agent to this engine today

Register the datasource, mint a scoped key, paste one config block — the setup page walks all of it, and the demo stack gives you a safe place to try the whole loop first.