Command Palette

Search for a command to run...

UnylyUnyly
Browse all

Free Mysql

FreeNot checked

Free MySQL MCP server — give Claude, ChatGPT and Cursor a free cloud MySQL 8 database over MCP

GitHubEmbed

About

Free MySQL MCP server — give Claude, ChatGPT and Cursor a free cloud MySQL 8 database over MCP

README

MySQL 8.0.36 InnoDB Model Context Protocol No credit card

60-second quickstart

0:00 — get a database. Open freebase.cloud, sign up, create a session, choose MySQL. No card, no instance-class dropdown, no wait for a cluster to warm up.

0:20 — mint a token. Settings → MCP → New Token → pick the connection → copy the URL:

https://freebase.cloud/api/mcp/YOUR_TOKEN

0:30 — register it. One line for Claude Code:

claude mcp add --transport http billing https://freebase.cloud/api/mcp/YOUR_TOKEN

or for Cursor, ~/.cursor/mcp.json:

{ "mcpServers": { "billing": { "url": "https://freebase.cloud/api/mcp/YOUR_TOKEN" } } }

0:45 — ask for something.

List the tables in the billing database and show me the schema of the invoices table.

The model calls billing_list_tables, then billing_query. You now have an assistant with hands on a real MySQL 8.0.36 server.

0:60 — done. The rest of this README is reference material.


What this repository is

Configuration recipes and runnable examples for pointing an MCP client at a free MySQL instance. There is no server binary to build here — the MCP server is hosted; this repo is the client-side half of the story plus a worked schema.

Everything below uses a connection named billing, because MCP tool names are prefixed with your connection name rather than the engine name. Substitute yours.


Dialect and engine facts

Property Value
Server version MySQL 8.0.36
Default storage engine InnoDB
Isolation InnoDB defaults — REPEATABLE READ, row-level locking, MVCC
Character set utf8mb4, full Unicode including 4-byte codepoints
Dialect reference the MySQL 8.0 manual; port 3306 / mysql CLI syntax
Reachable over freebase.cloud's HTTP query API, and MCP

Read that last row carefully. This engine is not exposed as a raw TCP socket on 3306 — the SQL text travels over HTTPS instead of a MySQL client/server packet stream. What that means in practice:

  • The SQL is unchanged. A statement you would paste into MySQL Workbench, phpMyAdmin, Adminer or a .sql file runs here byte-for-byte. Window functions, CTEs, JSON_TABLE, ON DUPLICATE KEY UPDATE, generated columns, invisible indexes, GROUP_CONCAT, stored procedures — 8.0 grammar, 8.0 behaviour.
  • The transport is different. You POST statements to the query API (or let a model call the MCP tools) instead of opening a socket. A GUI client that insists on speaking the native protocol therefore will not attach directly; drive it through the HTTP endpoint instead. See examples/wire_query.sh.

If you specifically need a native TCP wire protocol from a desktop GUI, freebase.cloud's PostgreSQL, MongoDB and Redis engines expose one; MySQL does not.


Tool reference

Four tools, prefixed with the connection name:

billing_query           run a read statement, get rows back
billing_store           insert / update / upsert
billing_list_tables     enumerate tables
billing_annotate_table  attach a description to a table for the model to read

A worked call, as the model sees it:

// tools/call
{
  "name": "billing_query",
  "arguments": {
    "query": "SELECT status, COUNT(*) AS n, SUM(total_cents)/100 AS eur
              FROM invoices GROUP BY status ORDER BY n DESC"
  }
}

Annotate before you ask

billing_annotate_table is the difference between a model that guesses and a model that knows. Money columns are the classic trap:

billing_annotate_table(
  table: "invoices",
  description: "total_cents and tax_cents are integer minor units (EUR cents), never
                floats. status ∈ draft|sent|paid|void. issued_on is the invoice date;
                due_on is issued_on + client payment terms. An invoice is overdue when
                status='sent' AND due_on < CURDATE()."
)

Without it, a model will happily report a €48,900 invoice as €4,890,000. Annotations persist on the connection, so this is a one-time cost per table.


Client setup, by client

Client Where Key detail
Claude Code claude mcp add --transport http … writes .mcp.json; type is mandatory
Claude Desktop / web / Cowork Settings → Connectors → Add custom connector UI only; claude_desktop_config.json cannot do remote HTTP
Cursor .cursor/mcp.json url only, no type
VS Code / Copilot Chat .vscode/mcp.json top-level key is servers
Windsurf ~/.codeium/windsurf/mcp_config.json key is serverUrl
Zed settings.json key is context_servers
Cline its MCP settings "type": "streamableHttp" — camelCase
Roo Code .roo/mcp.json "type": "streamable-http" — kebab-case
Gemini CLI gemini mcp add --transport http … in settings.json the key is httpUrl, not url
Warp Settings → AI → Manage MCP servers paste box takes the bare object, no mcpServers wrapper
n8n MCP Client Tool node, n8n ≥ 1.104.0 Transport → HTTP Streamable, Auth → None

Ready-to-paste versions of the four fiddliest ones are in examples/client-configs.json.

Auth is always None. The token is a path segment of the URL, so no client ever needs an Authorization header. Treat the URL itself as the secret.

For ChatGPT: Settings → Apps → Advanced settings → developer mode → Apps → Create → paste the endpoint → Auth None → Scan Tools. Developer mode is documented for Pro, Plus, Business, Enterprise and Edu, but full write access is still rolling out to Business, Enterprise and Edu workspaces — so on some plans billing_query will work and billing_store will not. ChatGPT requires Streamable HTTP, which is what this endpoint speaks.


Example: a freelance invoicing ledger

examples/invoice_ledger.py builds and queries a four-table schema — clients, invoices, line_items, payments — entirely through MCP tool calls, using only the Python standard library.

Design decisions worth copying:

  • Money is BIGINT cents. No DECIMAL rounding arguments, no floats anywhere near a balance.
  • line_items.amount_cents is a generated column (quantity * unit_price_cents), so a row cannot disagree with itself.
  • Invoice balance is a view, not a column: total_cents - COALESCE(SUM(payments), 0). Stored balances drift; derived ones cannot.
  • ON DUPLICATE KEY UPDATE for payment idempotency, keyed on the payment processor's reference.

Sample output:

tables: clients, invoices, line_items, payments
— ageing —
bucket        invoices   outstanding
current              4       3 210.00
1-30 days            2         890.00
31-60 days           1       1 450.00
60+ days             1         275.00

examples/wire_query.sh is the same database from bash and curl, against the HTTP query API — useful in CI, cron jobs, or a Makefile, where spawning a Python interpreter is more ceremony than the task deserves.


Honest limits

  • The free tier is aimed at development, prototyping and small production workloads. No uptime figure, backup schedule or storage quota is promised anywhere in this repo, because none is verified. The dashboard shows current quotas.
  • No native 3306 socket, as described above. This is the main reason to pick PostgreSQL instead, if a desktop GUI or a driver you cannot change is a hard requirement.
  • One statement per tool call. Multi-statement transactions spanning several MCP calls are not a thing; keep atomic work inside a single statement, or a single stored procedure call.
  • Free-tier Claude allows one custom connector at a time.
  • mcp-remote is a fallback. If your client only speaks stdio, bridge with npx -y mcp-remote <url> --transport http-only. Its maintainers call it experimental; do not build a production path on it.

Frequently asked

Is this really MySQL, or a MySQL-flavoured API? MySQL 8.0.36 evaluates the statements. SELECT VERSION() returns the version string; MySQL error codes and SHOW CREATE TABLE output are MySQL's own.

Can I run mysqldump? Not against a socket, since none is exposed. Export by selecting your data through the query API or MCP — examples/wire_query.sh export shows one way to dump a table as INSERT statements.

Do stored procedures, triggers and events work? Procedures, functions, triggers and views: yes. Scheduled events depend on the event scheduler being enabled, which is not something this repo can promise for you — check SHOW VARIABLES LIKE 'event_scheduler' before relying on it.

Why is the tool called billing_query and not mysql_query? Because the prefix is your connection name. Two MySQL connections in one workspace get distinct tool names, which is what you want when an agent has both a staging and a scratch database attached.

Is MariaDB the same thing? Close, not identical — sequences, system-versioned tables and a different JSON implementation diverge. freebase.cloud runs MariaDB 11.3.2 as a separate engine if you need it.


Links


freebase.cloud is an independent service and is not affiliated with Oracle Corporation, MariaDB plc, Anthropic, OpenAI, Google, Microsoft or Cursor.

from github.com/freebase-cloud/free-mysql-mcp-server

Installing Free Mysql

This server has no published package — it is built from source. Open the repository and follow its README.

▸ github.com/freebase-cloud/free-mysql-mcp-server

FAQ

Is Free Mysql MCP free?

Yes, Free Mysql MCP is free — one-click install via Unyly at no cost.

Does Free Mysql need an API key?

No, Free Mysql runs without API keys or environment variables.

Is Free Mysql hosted or self-hosted?

Self-hosted: the server runs locally on your machine via the install command above.

How do I install Free Mysql in Claude Desktop, Claude Code or Cursor?

Open Free Mysql on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.

Related MCPs

Compare Free Mysql with

Not sure what to pick?

Find your stack in 60 seconds

Author?

Embed badge for your README

Browse similar

All data MCPs