mcp-database
README.md
# mcp-database
MCP server **read-only** untuk MySQL / MariaDB. Memungkinkan Claude melakukan
pengecekan data lewat query SQL — tanpa bisa mengubah/menghapus data.
## Tools yang disediakan
| Tool | Fungsi |
|------|--------|
| `list_tables` | Menampilkan daftar semua tabel di database |
| `describe_table` | Menampilkan struktur kolom sebuah tabel |
| `run_query` | Menjalankan SELECT/SHOW/DESCRIBE/EXPLAIN/WITH (read-only) |
## Pengaman (read-only)
- Hanya statement baca yang diterima. `INSERT/UPDATE/DELETE/DROP/ALTER/CREATE/...`
ditolak otomatis.
- Multi-statement (dipisah `;`) ditolak.
- Komentar SQL (`-- `, `#`, `/* */`) dibersihkan sebelum divalidasi.
- `LIMIT` otomatis ditambahkan (default 1000 baris) bila query tidak punya.
- Query punya timeout (default 15 detik).
> **Sangat disarankan**: tetap pakai user MySQL yang hanya punya hak `SELECT`,
> sebagai lapisan keamanan kedua di sisi database.
>
> ```sql
> CREATE USER 'readonly_user'@'%' IDENTIFIED BY 'password_kuat';
> GRANT SELECT ON nama_database.* TO 'readonly_user'@'%';
> FLUSH PRIVILEGES;
> ```
## Setup
```bash
npm install
cp .env.example .env # lalu isi kredensial database
npm run build
```
Isi `.env`:
```
DB_HOST=localhost
DB_PORT=3306
DB_USER=readonly_user
DB_PASSWORD=...
DB_NAME=nama_database
MAX_ROWS=1000
QUERY_TIMEOUT_MS=15000
```
## Menghubungkan ke Claude Desktop
Edit file konfigurasi:
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
Kredensial cukup ditaruh di file `.env` (server otomatis memuatnya dari folder
proyek). Config-nya jadi sederhana:
```json
{
"mcpServers": {
"database": {
"command": "node",
"args": ["c:\\project\\mcp-database\\dist\\index.js"]
}
}
}
```
> ⚠️ **JANGAN** menambahkan blok `env` dengan nilai placeholder (`localhost`,
> `nama_database`, dst). Nilai di blok `env` akan **menimpa** `.env` Anda dan
> menyebabkan koneksi gagal (`ECONNREFUSED`). Isi `.env` saja.
>
> Restart **total** Claude Desktop (Quit dari tray, lalu buka lagi) setiap kali
> mengubah config atau melakukan rebuild — bukan sekadar tutup window.
## Menghubungkan ke Claude Code (CLI)
```bash
claude mcp add database -- node c:\project\mcp-database\dist\index.js
```
(pastikan `.env` sudah terisi, atau tambahkan `--env DB_HOST=...` dst.)
## Contoh penggunaan di Claude
> "Cek ada berapa pengguna yang statusnya aktif di tabel pengguna"
>
> Claude akan memanggil `list_tables` → `describe_table` → `run_query`
> dengan `SELECT COUNT(*) FROM pengguna WHERE status = 'aktif'`.
## Pengembangan
```bash
npm run dev # tsc --watch
```
TDQS
A4.3/5.0
Scored across 3 tools
Disambiguation5/5
Each tool has a clear, distinct purpose: listing tables, describing table schema, and running custom queries. There is no overlap or ambiguity.
Naming Consistency5/5
All tool names follow a consistent verb_noun pattern in snake_case (list_tables, describe_table, run_query), making them predictable.
Tool Count4/5
Three tools is minimal but appropriate for a read-only database server, covering the essential operations. Slightly more could be added, but not necessary.
Completeness4/5
The set covers the core read-only operations: enumeration, schema inspection, and arbitrary queries. Minor gaps like listing views or indexes exist, but the surface is sufficient for most exploration tasks.