Skip to main content

qbash / MySQL MCP server

A hosted MySQL MCP server for Claude and ChatGPT.

Connect your MySQL or MariaDB database to qbash once and expose it as an MCP server. Claude, ChatGPT, Cursor and Claude Code call the same tools, and each person signs in with their own qbash account.

The database connection lives in qbash. Each assistant gets the tools you select.

Meet qbash Tasks

Your Python, deployed and ready for your team.

A Task is a cloud-hosted Python function. Write your automation, save to deploy, and give your team a way to run it.

How Tasks work
  • Cloud-hosted

    Your function runs on qbash. No server to provision.

  • Built in Python

    Write the logic, call integrations, and decide what AI handles.

  • Multi-model

    Choose the model for each AI step in your function.

  • Versions & logs

    Review code changes, restore versions, and inspect each run.

  • Auto-deploy

    Save your Task to make the new version live.

  • Run anywhere

    Call it from a form, API, Slack, or AI chat. Schedule it, too.

What the assistant gets

Four tools cover schema lookup and queries.

The MySQL connector adds these tools to an MCP server. Turn off any the assistant does not need. A server for analysts might keep all four, and a server for a support team might expose a single saved query instead.

Tools the MySQL connector adds to an MCP server
ToolWhat it does
mysql_list_schemasLists the databases the MySQL user can see
mysql_list_tablesLists tables and views in a database
mysql_describe_tableShows columns, indexes, foreign keys and check constraints for a table
mysql_execute_queryRuns a SQL statement with the rights of the connected user

Where it runs

Run one MySQL MCP server for the whole team on qbash.

An open-source server is simplest for one developer on one laptop. For a team, qbash holds a single database connection and grants access person by person.

A self-hosted MySQL MCP server compared with qbash
ConcernSelf-hosted MySQL MCP serverqbash
Where it runsOn each person's laptop, or on a server you deployHosted on qbash
Database credentialsIn each person's client configurationStored once in qbash, encrypted
Who can connectAnyone with the configuration and the passwordPeople you share the server with, signed in through OAuth
Removing accessChange the database password for everyoneRemove one person's share, or make the server private
Custom logicFork and maintain the serverAdd a Task with your own query and checks

Set it up

Connect the database, build the server, then add it to your client.

  1. Create a MySQL user granted SELECT on the databases the assistant should see, and nothing else.
  2. In qbash, connect MySQL with that user.
  3. Open MCP Servers, select New server and add the MySQL connector block. Turn off any tools you do not want to expose.
  4. Share the server with the people who should use it, then copy the server URL from Connect.
  5. Add the URL as a custom connector in Claude, as an app in ChatGPT with developer mode turned on, or as a remote MCP server in Cursor or Claude Code. Then sign in with qbash. Developer mode in ChatGPT depends on your plan and workspace settings.

Statements run with the rights of the connected MySQL user. A user granted only SELECT keeps every query to reads, whatever the assistant asks for.

Your own rules

Wrap a query in a Task when the assistant should follow a fixed path.

A Task is a Python function saved on qbash. This one runs a single approved query for paid orders that have not shipped, and the assistant supplies only the number of days. Add the Task to the same MCP server and the assistant calls it like any other tool.

Task code
orders-waiting-to-ship.py
days = qbash.inputs.get("days")
if days is None:
    days = 2
if not isinstance(days, int) or isinstance(days, bool) or not 1 <= days <= 90:
    raise ValueError("Provide a whole number of days from 1 to 90.")

rows = qbash.integrations.mysql.execute_query(
    query=(
        "SELECT order_id, created_at FROM orders "
        "WHERE status = 'paid' AND shipped_at IS NULL "
        "AND created_at < UTC_TIMESTAMP() - INTERVAL ? DAY "
        "ORDER BY created_at LIMIT 100"
    ),
    query_params=[days],
    read_only=True,
)["result"]

qbash.output({
    "waiting_orders": rows,
    "oldest_order": rows[0]["order_id"] if rows else None,
})

Declare days as an optional Number input and name the Task Orders Waiting To Ship. Replace the orders table and its columns with your own schema, and check that created_at is stored in UTC.

Before you build

Questions

Can the assistant change data?

Only if the connected MySQL user has write privileges. Grant the user SELECT and nothing else, and MySQL refuses every write. The read_only option in a Task blocks changes to tables, but not SET GLOBAL, KILL or SELECT ... INTO OUTFILE, so the grants are what keep a query to reads.

Does this work with MariaDB or Amazon RDS?

It works with MySQL 5.7 and later and with MariaDB, including managed services such as Amazon RDS, Aurora MySQL and Google Cloud SQL. Connect with the host, a database user and an SSL mode. TLS is on by default.

Which clients can connect?

Any client that supports remote MCP servers, including claude.ai, Claude Code, ChatGPT, Cursor and VS Code. Use OAuth sign-in where the client supports it.

Can I expose some tools and hide others?

Yes. Turn off connector tools you do not want the assistant to call, rename them, or replace them with Tasks that run fixed queries.

Is there a free plan?

Yes. The Free plan includes 100 executions a month and 3 Tasks, with no credit card.