Skip to main content
Glama
yeyorg
by yeyorg
README.md
# MCP-XAMP

> MCP server that gives Claude Code and OpenCode direct access to your XAMPP
> MariaDB/MySQL databases. Five tools: list databases, list tables, describe
> table, read query, write query.

## Quick Start

1. **Clone** the repo
2. **Configure** your AI agent (Claude Code or OpenCode)
3. **Start querying** — `list_databases`, `read_query`, etc.

No global install needed — runs directly with `uv run`.

---

## Requirements

- Python 3.13+
- XAMPP with MariaDB/MySQL running on `localhost:3306`
- [uv](https://docs.astral.sh/uv/)

---

## Installation

```bash
git clone https://github.com/<user>/mcp-xamp.git
cd mcp-xamp
uv sync
```

Verify it works:

```bash
uv run mcp-xamp
```

### Optional: install globally

If you prefer `mcp-xamp` available as a command anywhere:

```bash
uv tool install --python 3.13 .
```

Then use `"command": "mcp-xamp"` instead of `uv run --directory ...` in the
configs below.

---

## Claude Code Setup

### Option A: global install (recomendado)

Instala `mcp-xamp` como comando global y registralo en Claude Code:

```bash
uv tool install --python 3.13 .
```

Luego agregá el server MCP. Elegí el scope que prefieras:

```bash
# Scope project (crea .mcp.json en el directorio actual)
claude mcp add xamp \
  -e MCP_XAMP_HOST=localhost \
  -e MCP_XAMP_PORT=3306 \
  -e MCP_XAMP_USER=root \
  -e MCP_XAMP_PASSWORD= \
  -e MCP_XAMP_ALLOW_WRITE=true \
  -- mcp-xamp

# Scope user (disponible en todos tus proyectos)
claude mcp add --scope user xamp \
  -e MCP_XAMP_HOST=localhost \
  -e MCP_XAMP_PORT=3306 \
  -e MCP_XAMP_USER=root \
  -e MCP_XAMP_PASSWORD= \
  -e MCP_XAMP_ALLOW_WRITE=true \
  -- mcp-xamp
```

Ajusta los valores de las variables según tu instalacion de XAMPP.

### Option B: sin instalar (usando uv run)

Si preferis no instalar globalmente, apunta al directorio del repo:

```bash
claude mcp add xamp \
  -e MCP_XAMP_HOST=localhost \
  -e MCP_XAMP_PORT=3306 \
  -e MCP_XAMP_USER=root \
  -e MCP_XAMP_PASSWORD= \
  -e MCP_XAMP_ALLOW_WRITE=true \
  -- uv run --directory /ruta/a/mcp-xamp mcp-xamp
```

Reemplaza `/ruta/a/mcp-xamp` con la ruta real donde clonaste el repo.

### Config manual (archivo .mcp.json)

Si preferis editar el archivo a mano, tambien funciona:

```json
{
  "mcpServers": {
    "xamp": {
      "command": "mcp-xamp",
      "args": [],
      "env": {
        "MCP_XAMP_HOST": "localhost",
        "MCP_XAMP_PORT": "3306",
        "MCP_XAMP_USER": "root",
        "MCP_XAMP_PASSWORD": "",
        "MCP_XAMP_ALLOW_WRITE": "true"
      }
    }
  }
}
```

Si no instalaste globalmente, usa `"command": "uv"` con los args correspondientes
(ver el `.mcp.json` de este repo como referencia).

### Verify

Dentro de Claude Code, corre `/mcp` para confirmar que `xamp` aparece como
conectado. Despues proba:

```
List all databases on my XAMPP server.
```

---

## OpenCode Setup

### Config location

OpenCode reads MCP config from `opencode.json` or `opencode.jsonc`. The file
can be in:

| Location | Scope |
| --- | --- |
| `<project-root>/opencode.json` | Project-specific |
| `<project-root>/.opencode/opencode.json` | Project-specific (alt) |
| `~/.config/opencode/opencode.json` | Global (all projects) |

### Add the MCP server

Add this block to your `opencode.json` or `opencode.jsonc`:

```jsonc
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "xamp": {
      "type": "local",
      "command": ["uv", "run", "--directory", "/path/to/mcp-xamp", "mcp-xamp"],
      "enabled": true,
      "environment": {
        "MCP_XAMP_ALLOW_WRITE": "true"
      }
    }
  }
}
```

Replace `/path/to/mcp-xamp` with your actual clone path.

If you used `uv tool install`, simplify to:

```jsonc
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "xamp": {
      "type": "local",
      "command": ["mcp-xamp"],
      "enabled": true,
      "environment": {
        "MCP_XAMP_ALLOW_WRITE": "true"
      }
    }
  }
}
```

### Verify

Restart OpenCode, then try:

```
Show me all databases on the xamp server. use xamp tools
```

---

## Environment Variables

All configuration goes through environment variables. Sensible defaults for a
standard XAMPP installation.

| Variable | Default | Description |
| --- | --- | --- |
| `MCP_XAMP_HOST` | `127.0.0.1` | MariaDB/MySQL host |
| `MCP_XAMP_PORT` | `3306` | MariaDB/MySQL port |
| `MCP_XAMP_USER` | `root` | Database user |
| `MCP_XAMP_PASSWORD` | (empty) | Database password |
| `MCP_XAMP_ALLOW_WRITE` | `false` | Set to `true` to enable INSERT/UPDATE/DELETE/DDL |

Credentials are read from environment variables **only**. They never appear in
tool arguments, log output, or error messages.

---

## Tools

| Tool | Description | Requires |
| --- | --- | --- |
| `list_databases` | Show all accessible databases | — |
| `list_tables` | Show tables in a database | `database` |
| `describe_table` | Show columns, types, and keys | `database`, `table` |
| `read_query` | Execute SELECT / SHOW / DESCRIBE / EXPLAIN | `database`, `query` |
| `write_query` | Execute INSERT / UPDATE / DELETE / DDL | `database`, `query`, `MCP_XAMP_ALLOW_WRITE=true` |

---

## Security

- **Read-only by default.** Write operations require `MCP_XAMP_ALLOW_WRITE=true`.
- **Credentials never logged.** Host, port, user, and password are stripped from
  error messages.
- **Credentials only from env vars.** No tool parameters, no config files,
  no CLI args.
- **Connection-per-query.** Each tool invocation opens and closes its own
  connection — no shared state, no stale connections.
- **XAMPP default is root with no password.** Create a dedicated user for
  production use:

  ```sql
  CREATE USER 'mcp_agent'@'127.0.0.1' IDENTIFIED BY 'secure_password';
  GRANT SELECT ON *.* TO 'mcp_agent'@'127.0.0.1';
  ```

---

## Development

```bash
# Install dev dependencies
uv sync --group dev

# Run tests
uv run pytest -v --cov=src/mcp_xamp

# Lint
uv run ruff check src/ tests/

# Format
uv run ruff format src/ tests/
```

---

## License

MIT — see [LICENSE](LICENSE).

TDQS

A4/5.0

Scored across 5 tools

Disambiguation4/5

Most tools have distinct purposes, but read_query can also describe a table, creating some overlap with describe_table. However, the specialized describe_table provides a simpler interface.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern with snake_case: describe_table, list_databases, list_tables, read_query, write_query.

Tool Count5/5

Five tools is well-scoped for a database server, covering essential operations without unnecessary bloat.

Completeness5/5

The set covers listing databases and tables, describing table structure, and arbitrary read/write SQL queries, including DDL via write_query. This provides full CRUD and schema management capabilities.

Maintenance

ActivityInactive
ResponsivenessNo issues