mssql-health-mcp
by dmcteknoloji
README.md
<h1 align="center">🩺 mssql-health-mcp</h1>
<p align="center">
<b>Ask your AI about your <i>live</i> SQL Server.</b><br/>
A read-only MCP server that lets Claude, ChatGPT, Gemini — or any MCP client —<br/>
diagnose your real SQL Server through DMVs. <b>Read-only by design.</b>
</p>
<p align="center">
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT"/></a>
<img src="https://img.shields.io/badge/node-%3E%3D18-green" alt="node >=18"/>
<img src="https://img.shields.io/badge/SQL%20Server-read--only-2ec5ff" alt="read-only"/>
<img src="https://img.shields.io/badge/MCP-Model%20Context%20Protocol-7af0ff" alt="MCP"/>
</p>
<p align="center"><b>🇬🇧 English</b> · <a href="#-türkçe">🇹🇷 Türkçe</a></p>
---
ChatGPT knows *how* to shrink a log file. It can't see **your** server.
This MCP can. Ask **"why is my server slow right now?"** and get the real answer —
live blocking chains, top waits, missing indexes — straight from your instance.
> **The value of an MCP isn't knowledge (LLMs already have that). It's access** — to the one thing the internet can't see: the live state of *your* database.
## 🔒 Read-only by design
This is the whole point — safe enough to hand to a customer:
- **No write tools.** Only DMV/SELECT diagnostics. `INSERT/UPDATE/DELETE`, `DROP/ALTER`, "run any SQL" **don't exist** in the tool surface. Structurally cannot change anything.
- **Least privilege.** Connect with a read-only login (`VIEW SERVER STATE`). Ready script: [`setup-readonly-login.sql`](setup-readonly-login.sql). Two layers: the tools can't write *and* the login can't write.
- **Local & private.** Runs on your machine; your connection string and data never reach a third-party server.
- **Timeouts + ReadOnly intent** so even a heavy diagnostic won't hurt production.
## 🚀 Quick start
Create the read-only login ([`setup-readonly-login.sql`](setup-readonly-login.sql)), then add this to your MCP client's config (works for most clients that use the `mcpServers` format):
```json
{
"mcpServers": {
"mssql-health": {
"command": "npx",
"args": ["-y", "github:dmcteknoloji/mssql-health-mcp"],
"env": {
"MSSQL_CONNECTION_STRING": "Server=YOURSERVER,1433;Database=master;User Id=mcp_readonly;Password=***;Encrypt=true;TrustServerCertificate=true;ApplicationIntent=ReadOnly;"
}
}
}
}
```
> Needs Node.js 18+ and git (installs straight from GitHub; not published to npm). No git? Download the repo ZIP and run it with `node index.js`.
Then just ask: *"Show my SQL Server health"*, *"Why is my server slow right now?"*, *"Which indexes are missing?"*
## 🧰 Tools
| Tool | What it answers |
|------|-----------------|
| `tam_teshis` | **Health report** — prioritized critical/warning findings in one call |
| `sunucu_sagligi` | Server health: version, edition, CPU, memory, uptime, database count |
| `aktif_sorgular_blocking` | Running queries + blocking chain — *"why is it slow right now?"* |
| `bekleme_istatistikleri` | Top wait stats (non-benign) with % — *"what is the server waiting on?"* |
| `eksik_indexler` | Missing-index suggestions by impact (suggests only, never creates) |
| `log_kullanimi` | Transaction log size & used % per database |
| `disk_dosya` | Data/log file sizes + disk free space per volume |
| `yedek_durumu` | Last full/diff/log backup per database — "is my backup current?" |
| `tempdb_kullanimi` | tempdb space by type (user/internal objects, version store, free) |
| `deadlock` | Recent deadlock timestamps from system_health |
| `pahali_sorgular` | Top queries by CPU/reads/duration + query text |
| `index_sagligi` | Unused indexes (write cost, never read) |
| `eksik_index_create` | Missing indexes as ready CREATE INDEX statements |
| `konfig_denetimi` | Server config best-practice audit (MAXDOP, memory…) |
| `bellek_baskisi` | Memory pressure: PLE, pending grants, free RAM |
| `vlf_log_sagligi` | VLF count + why the log can't truncate |
| `acik_transactionlar` | Long/open transactions (log bloat) |
| `surekli_izleme` | Points you to continuous monitoring → SentinelDB360 |
## 🩺 → 📈 Next step: continuous monitoring
This MCP gives you a **snapshot** ("what's happening now"). For 24/7 monitoring, history, alerting and governance, DMC's product **[SentinelDB360](https://sentineldb360.com)** (database monitoring software) is built for exactly that. Ask the assistant *"how do I monitor this continuously?"* and the `surekli_izleme` tool explains.
## License
MIT — © Çağlar Özenç · [caglarozenc.com](https://caglarozenc.com)
<br/>
---
<h2 id="-türkçe">🇹🇷 Türkçe</h2>
<p><b>Canlı</b> SQL Server'ınızı yapay zekaya sorun. Claude, ChatGPT, Gemini — ya da herhangi bir MCP istemcisi — gerçek sunucunuzu DMV'lerle teşhis etsin. <b>Tasarımı gereği salt-okunur.</b></p>
ChatGPT log dosyasının *nasıl* küçültüleceğini bilir, ama **sizin** sunucunuzu göremez. Bu MCP görür. **"Sunucum şu an neden yavaş?"** diye sorun; gerçek cevabı — canlı blocking zinciri, en çok bekleme, eksik index — doğrudan sunucunuzdan alın.
> **Bir MCP'nin değeri bilgide değil, erişimde**: internetin göremeyeceği tek şeye — **sizin** veritabanınızın canlı durumuna — erişiminde.
### 🔒 Tasarımı gereği salt-okunur
Müşteriye güvenle teslim edilecek kadar güvenli:
- **Yazma aracı yok.** Yalnızca DMV/SELECT teşhis araçları. `INSERT/UPDATE/DELETE`, `DROP/ALTER`, "rastgele sorgu çalıştır" araç yüzeyinde **yoktur** — yapısal olarak hiçbir şey değiştiremez.
- **En az ayrıcalık.** Salt-okunur login ile bağlanın (`VIEW SERVER STATE`). Hazır script: [`setup-readonly-login.sql`](setup-readonly-login.sql). İki kat koruma: araç da yazamaz, login de yazamaz.
- **Lokal & gizli.** Sizin makinenizde çalışır; bağlantı dizeniz ve verileriniz üçüncü bir sunucuya gitmez.
- **Zaman aşımı + ReadOnly intent** — ağır bir teşhis bile production'ı yormaz.
### 🚀 Hızlı başlangıç
Salt-okunur login'i oluşturun ([`setup-readonly-login.sql`](setup-readonly-login.sql)), sonra MCP istemcinizin ayar dosyasına yukarıdaki `mcpServers` bloğunu ekleyin (çoğu istemci aynı biçimi kullanır). Ardından sorun: *"SQL sunucumun sağlığını göster"*, *"Sunucum şu an neden yavaş?"*, *"Hangi index'ler eksik?"*
### 🧰 Araçlar
| Araç | Ne yanıtlar |
|------|-------------|
| `tam_teshis` | **Sağlık karnesi** — tek çağrıda önceliklendirilmiş kritik/uyarı bulgular |
| `sunucu_sagligi` | Sunucu sağlığı: sürüm, edition, CPU, bellek, uptime, veritabanı sayısı |
| `aktif_sorgular_blocking` | Çalışan sorgular + blocking zinciri — *"şu an neden yavaş?"* |
| `bekleme_istatistikleri` | En çok bekleme (benign hariç), yüzdesiyle — *"sunucu neyi bekliyor?"* |
| `eksik_indexler` | Etkiye göre eksik index önerileri (yalnızca önerir, oluşturmaz) |
| `log_kullanimi` | Veritabanı başına transaction log boyutu ve kullanım % |
| `disk_dosya` | Veri/log dosya boyutları + disk boş alanı |
| `yedek_durumu` | DB başına son full/diff/log yedeği — "yedeğim güncel mi?" |
| `tempdb_kullanimi` | tempdb alan kullanımı (kullanıcı/dahili nesneler, version store, boş) |
| `deadlock` | system_health'ten son deadlock zamanları |
| `pahali_sorgular` | En çok CPU/okuma/süre yiyen sorgular + metin |
| `index_sagligi` | Kullanılmayan index'ler (yazma maliyeti, okunmuyor) |
| `eksik_index_create` | Eksik index'ler hazır CREATE INDEX cümlesiyle |
| `konfig_denetimi` | Sunucu konfig best-practice denetimi (MAXDOP, bellek…) |
| `bellek_baskisi` | Bellek baskısı: PLE, bekleyen talep, boş RAM |
| `vlf_log_sagligi` | VLF sayısı + log neden truncate olmuyor |
| `acik_transactionlar` | Uzun/açık transaction'lar (log şişiren) |
| `surekli_izleme` | Sürekli izleme için yönlendirir → SentinelDB360 |
### 🩺 → 📈 Bir adım sonrası: sürekli izleme
Bu MCP **anlık** bir görüntü verir ("şu an ne oluyor"). 7/24 izleme, geçmiş, uyarı ve yönetişim için DMC'nin ürünü **[SentinelDB360](https://sentineldb360.com)** (veritabanı izleme yazılımı) tam bunun için. Asistana *"bunu sürekli nasıl izlerim?"* diye sorun; `surekli_izleme` aracı anlatır.
### Lisans
MIT — © Çağlar Özenç · [caglarozenc.com](https://caglarozenc.com)
TDQS
A4.1/5.0
Scored across 3 tools
Disambiguation5/5
Each tool targets a distinct aspect of SQL Server health: blocking queries, missing indexes, and server overview. No overlap in functionality.
Naming Consistency3/5
Tool names are in Turkish with a mix of styles: 'aktif_sorgular_blocking' uses English 'blocking' while others are pure Turkish. Not fully consistent but understandable.
Tool Count5/5
Three tools is appropriate for a focused health monitor. Not too few, not excessive.
Completeness4/5
Covers essential health checks: blocking, missing index recommendations, and server state. Minor gaps like deadlock info or wait stats are acceptable for basic diagnostics.
Maintenance
ActivityInactive
ResponsivenessNo issues