MySQL Reader (read-only)
Read-only MySQL tools for xmcp. Connect via a connection-string env var; all operations are read-only.
Prerequisites
- Node 20+
- pnpm
Install & build
pnpm i
pnpm build
Configure database connection
Set one of (first found wins): MYSQL_URL, MYSQL_CONNECTION_STRING, or DATABASE_URL.
export MYSQL_URL="mysql://user:password@localhost:3306/mydb"
SSL is controlled by MYSQL_SSL (default: "true"):
| Value | Behavior | |---|---| | true (default) | Encrypted, skips cert hostname validation — use when connecting through a tunnel or proxy | | strict | Encrypted, validates server certificate — use for direct connections with a valid cert | | false | No SSL — local dev only |
export MYSQL_SSL=true # tunnel / hosted DB (default)
export MYSQL_SSL=strict # direct connection, valid cert
export MYSQL_SSL=false # local dev, no SSL
Use in Cursor (STDIO)
Via npx (after publishing to npm — no local clone needed):
{
"mcpServers": {
"mysql-reader": {
"command": "npx",
"args": ["-y", "mysql-db-reader"],
"env": { "MYSQL_URL": "mysql://user:password@host:3306/db" }
}
}
}
Local build (after pnpm build):
{
"mcpServers": {
"mysql-reader": {
"command": "node",
"args": ["/ABSOLUTE/PATH/TO/mysql-db-reader/dist/stdio.js"],
"env": { "MYSQL_URL": "mysql://user:password@host:3306/db" }
}
}
}
Use via HTTP (optional)
pnpm dev
Then point your MCP client to http://localhost:3002/mcp.
To use a different port (e.g., 3001):
export MYSQL_URL="mysql://user:password@localhost:3306/mydb"
PORT=3001 pnpm dev
Example HTTP client config (TOML):
[mcp_servers.mysql-reader]
transport = "http"
url = "http://127.0.0.1:3001/mcp"
project = "/ABSOLUTE/PATH/TO/your/project"
Tools
mysql_list_databases(includeSystem=false)— list databasesmysql_list_tables(database, includeViews=true)— list tables/viewsmysql_get_table_schema(database, table)— columns/constraints/indexesmysql_preview_table(database, table, limit=50, orderBy?)— sample rowsmysql_query(sql, params?)— read-only SQL (SELECT/SHOW/DESC/EXPLAIN/WITH), max 10k rowsmysql_explain_query(sql)— EXPLAIN a SELECT
Codex compatibility
Tool names use lowercase snake_case (underscores, no dots) to comply with Codex's tool name pattern ^[a-zA-Z0-9_-]+$ (Codex models prefer lower_snake). See: MCP in Codex docs
Read-only is enforced via session settings and SQL guards.
Docs: xmcp docs











