Skip to main content
Glama
riefer02

mysql-db-reader

by riefer02
README.md
# 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

```bash
pnpm i
pnpm build
```

### Configure database connection

Set one of (first found wins): `MYSQL_URL`, `MYSQL_CONNECTION_STRING`, or `DATABASE_URL`.

```bash
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 |

```bash
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):

```json
{
  "mcpServers": {
    "mysql-reader": {
      "command": "npx",
      "args": ["-y", "mysql-db-reader"],
      "env": { "MYSQL_URL": "mysql://user:password@host:3306/db" }
    }
  }
}
```

**Local build** (after `pnpm build`):

```json
{
  "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)

```bash
pnpm dev
```

Then point your MCP client to `http://localhost:3002/mcp`.

To use a different port (e.g., 3001):

```bash
export MYSQL_URL="mysql://user:password@localhost:3306/mydb"
PORT=3001 pnpm dev
```

Example HTTP client config (TOML):

```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 databases
- `mysql_list_tables(database, includeViews=true)` — list tables/views
- `mysql_get_table_schema(database, table)` — columns/constraints/indexes
- `mysql_preview_table(database, table, limit=50, orderBy?)` — sample rows
- `mysql_query(sql, params?)` — read-only SQL (SELECT/SHOW/DESC/EXPLAIN/WITH), max 10k rows
- `mysql_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](https://github.com/openai/codex/blob/main/docs/advanced.md#model-context-protocol-mcp)

Read-only is enforced via session settings and SQL guards.

Docs: [xmcp docs](https://xmcp.dev/docs)

TDQS

A4.2/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: listing databases, listing tables, getting schema, previewing rows, explaining queries, and running arbitrary queries. There is no overlap or ambiguity.

Naming Consistency5/5

All tools follow a consistent 'mysql_verb_noun' pattern (e.g., mysql_list_databases, mysql_preview_table). The naming is uniform and predictable.

Tool Count5/5

With 6 tools, the set is well-scoped for a read-only database server. Each tool earns its place by covering a distinct operation without redundancy or unnecessary bloat.

Completeness4/5

The tool set covers the main workflow: discovery (list databases, list tables), schema inspection, data preview, query execution, and performance analysis. Minor gaps like 'SHOW CREATE TABLE' or view support exist, but the core read-only operations are complete.

Maintenance

ActivityStale
ResponsivenessNo issues