MS SQL Server MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MS SQL Server MCP Servershow me the top 5 customers by order amount"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MS SQL Server MCP Server
A secure, read-only Model Context Protocol (MCP) server for Microsoft SQL Server with built-in performance monitoring and lock detection.
📦 npm: @piyapat/mssql-mcp-server
Quick Start with npx
You can run this MCP server directly without installation using npx:
npx @piyapat/mssql-mcp-serverRelated MCP server: mssql-explorer-mcp
Installation
Option 1: Use with npx (Recommended for Testing)
# Run directly with environment variables
MSSQL_SERVER=localhost \
MSSQL_DATABASE=mydb \
MSSQL_USER=readonly \
MSSQL_PASSWORD=password \
npx @piyapat/mssql-mcp-serverOption 2: Global Installation
# Install globally
npm install -g @piyapat/mssql-mcp-server
# Run
mssql-mcp-serverOption 3: Local Installation
# Clone and install
git clone https://github.com/PiyapatRag/mssql-mcp-server.git
cd mssql-mcp-server
npm install
npm run build
# Run
npm startConfiguration
Step 1: Create a .env file (Recommended)
Credentials live in a .env file — not hard-coded in the MCP client's JSON config:
cp .env.example .env
# then edit .env with your credentialsThe server looks for a .env file in this order (first found wins):
The path in
MSSQL_ENV_FILE(explicit override).envin the current working directory.envin the project root (next topackage.json)
Variables already set in the MCP client's "env" block always take precedence
over the .env file, and .env is git-ignored.
Step 2: Point Claude Desktop at the server
Edit your Claude Desktop config:
Windows: %APPDATA%\Claude\claude_desktop_config.json
macOS/Linux: ~/Library/Application Support/Claude/claude_desktop_config.json
With a .env in the project root, no credentials are needed in the JSON at all:
{
"mcpServers": {
"mssql": {
"command": "node",
"args": ["C:\\path\\to\\mssql-mcp-server\\build\\index.js"]
}
}
}If the .env lives somewhere else, pass only its path:
{
"mcpServers": {
"mssql": {
"command": "node",
"args": ["C:\\path\\to\\mssql-mcp-server\\build\\index.js"],
"env": {
"MSSQL_ENV_FILE": "C:\\secure\\location\\mssql.env"
}
}
}
}Setting variables directly in the "env" block still works (and overrides the
.env file) — useful for npx setups or running several servers against
different databases.
Environment Variables
Variable | Description | Default | Required |
| SQL Server hostname or IP |
| Yes |
| Database name | - | Yes |
| SQL Server username (or domain user when | - | Yes |
| Password | - | Yes |
| Windows/NTLM domain. When set, Windows Authentication is used instead of SQL authentication | - | No |
| SQL Server port |
| No |
| Use encryption (true/false) |
| No |
| Trust server certificate (true/false) |
| No |
|
|
| No |
| Comma-separated whitelist of stored procedures | - | No |
| Explicit path to a | - | No |
| Query timeout in ms |
| No |
| Max pooled connections |
| No |
Server Modes
Read-only mode (MSSQL_READ_ONLY=true, default)
mssql_query accepts only:
A single
SELECT/WITH...SELECTA multi-statement batch led by
DECLARE,INSERT, orCREATE TABLE #...that writes only to session-local#temptables /@tablevariables — e.g.INSERT INTO #t SELECT ...orCREATE TABLE #t (...); INSERT INTO #t ...; SELECT * FROM #t.CREATE INDEX ... ON #t,TRUNCATE/ALTER/DROP TABLE #tare also allowed inside such batches. Global##temptables are never allowed (they are visible to every session, so they count as persistent).EXECof a whitelisted procedure whose definition does not write to a persistent table
Everything else is rejected: writes/DDL on persistent objects, dynamic SQL,
EXEC inside batches (prevents bypassing the procedure whitelist), DBCC,
and stacked statements after a SELECT/WITH/EXEC.
Write mode (MSSQL_READ_ONLY=false)
INSERT / UPDATE / DELETE / DDL are permitted, but these are always blocked
regardless of mode:
xp_cmdshell, xp_regwrite/xp_regdelete*, sp_configure, RECONFIGURE,
SHUTDOWN, KILL, DROP DATABASE, ALTER DATABASE, RESTORE,
CREATE/ALTER/DROP LOGIN/USER/CREDENTIAL/CERTIFICATE, ALTER SERVER,
GRANT/DENY/REVOKE, OPENROWSET/OPENDATASOURCE.
⚠️ Use write mode only with a SQL login whose own permissions are equally limited — the database login remains the primary security boundary.
Key Features
Security First
✅ Two-layer read-only enforcement - A database read-only login (primary) plus an application-level allow-list (defense-in-depth). The app accepts
SELECT/WITH...SELECT,DECLAREbatches that write only to#temptables /@tablevariables, andEXECof whitelisted procedures whose definitions never write to a persistent table✅ Parameterized queries - Built-in SQL injection protection
✅ SSL/TLS support - Encrypted connections for production
✅ Connection pooling - Optimized resource management
Performance Monitoring
📊 Real-time lock detection - Identify blocking and deadlock situations
📈 Resource usage tracking - CPU, memory, and query performance metrics
🔍 Top query analysis - Find resource-intensive queries
⚡ Session monitoring - Track active and blocked sessions
Database Exploration
🗂️ Schema introspection - Tables, columns, keys, and constraints
📝 Stored procedure analysis - View definitions and parameters
🔎 Intelligent querying - Natural language to SQL with Claude
Available Tools (19)
Core
Tool | Description |
| Execute SQL. Read-only validation by default; write mode via |
| Test connectivity; returns server/edition/version, database, login, and current mode. |
| All databases with state, recovery model, compatibility level. |
| Tables with row count and size (MB), optionally filtered by schema. |
| Preview rows from a table (default 10, max 100) — no SQL needed, injection-safe. |
Schema exploration
Tool | Description |
| Columns, data types, PK/FK per table. |
| Foreign-key graph: from/to table+column, delete/update actions. |
| Views with full SQL definitions. |
| Stored procedures with parameters and full definitions. |
| Search the source of all procs/views/functions/triggers for a text fragment — impact analysis for legacy systems. |
Performance & storage
Tool | Description |
| Index usage stats (seeks/scans/updates) + optimizer-suggested missing indexes. |
| Fragmentation per index with REBUILD (≥ 30%) / REORGANIZE (5–30%) recommendations and ready-to-run |
| Most expensive queries ranked by |
| Health check: top wait stats (benign waits filtered), memory counters (PLE, grants pending, total vs target), workload counters, plus rule-based tuning recommendations. |
| Largest tables by size + database file sizes. |
| Sessions, CPU, buffer cache, top queries by CPU. |
Locks, blocking & deadlocks
Supported on SQL Server 2019 (15.x), 2022 (16.x), and 2025 (17.x) — all editions
including Express. Output includes the detected server version/edition and warns
when running on an older version (best-effort). Requires VIEW SERVER STATE.
Version & edition compatibility:
Express | Standard | Enterprise / Developer / Eval | Azure SQL MI | Azure SQL DB | |
Query / schema / storage tools | ✅ | ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ | ❌ (tool explains alternatives) |
| ✅ | ✅ | ✅ | ✅ | ⚠️ limited scope |
Rows/columns above apply to SQL Server 2019, 2022, and 2025. Older versions
(2016/2017) mostly work but are reported as best-effort in the tool output.
mssql_test_connection reports the detected edition class and its engine
limits (e.g. Express: 10 GB/database, ~1.4 GB buffer pool, 4 cores).
Tool | Description |
| Raw view of current locks and waits per session. |
| Blocking chains (victim ← blocker), lead-blocker identification incl. idle sessions holding open transactions, with SQL text of both sides. |
| Recent deadlock events from the built-in |
Claude Examples:
"Show me the top 10 customers by order count"
"Which tables are the largest, and which indexes are unused?"
"Which sessions are blocked right now, and who is the root blocker?"
"Were there any deadlocks last night, and which query caused them?"
"Find every stored procedure that references the CustomerOrders table"Security Setup
Read-only is enforced in two layers. The database login is the primary guard — even a write statement that reached the server cannot execute. The application-level allow-list (
classifyQueryin src/index.ts) is defense-in-depth: it accepts only read-only entry points and rejects everything else (writes, DDL, dynamic SQL, stacked queries). Because it allow-lists the leading keyword rather than blocking words, columns or aliases namedCreate,Update,CreatedDate, etc. are not blocked.
Create Read-Only SQL User (Recommended)
A ready-to-run script is provided at
scripts/create-readonly-login.sql — edit the
placeholders and run it as a sysadmin. It applies the least-privilege setup
below:
-- 1. Create login
CREATE LOGIN mcp_readonly WITH PASSWORD = 'SecurePassword123!';
-- 2. Switch to your database
USE YourDatabase;
-- 3. Create user
CREATE USER mcp_readonly FOR LOGIN mcp_readonly;
-- 4. Grant read permissions
ALTER ROLE db_datareader ADD MEMBER mcp_readonly;
-- 4b. Explicitly DENY writes (defense-in-depth)
ALTER ROLE db_denydatawriter ADD MEMBER mcp_readonly;
-- 5. Grant monitoring permissions
GRANT VIEW SERVER STATE TO mcp_readonly;
GRANT VIEW DATABASE STATE TO mcp_readonly;
GRANT VIEW DEFINITION TO mcp_readonly;
-- 6. Verify permissions
SELECT
dp.name AS DatabaseUser,
dp.type_desc,
r.name AS RoleName
FROM sys.database_principals dp
LEFT JOIN sys.database_role_members drm ON dp.principal_id = drm.member_principal_id
LEFT JOIN sys.database_principals r ON drm.role_principal_id = r.principal_id
WHERE dp.name = 'mcp_readonly';Development
Build
npm run buildWatch Mode
npm run devTesting Locally
# Set environment variables
export MSSQL_SERVER=localhost
export MSSQL_DATABASE=testdb
export MSSQL_USER=sa
export MSSQL_PASSWORD=password
# Run
npm startTroubleshooting
"command not found" Error with npx
If you get an error running with npx:
Ensure Node.js 18+ is installed:
node --versionClear npm cache:
npm cache clean --forceTry with full package name:
npx --package=@piyapat/mssql-mcp-server mssql-mcp-serverConnection Errors
Error: Login failed for user
-- Check authentication mode (must be Mixed Mode)
USE master;
GO
EXEC xp_instance_regread
N'HKEY_LOCAL_MACHINE',
N'Software\Microsoft\MSSQLServer\MSSQLServer',
N'LoginMode';
GO
-- Should return 2 for Mixed ModeError: Cannot connect to server
Verify SQL Server Browser service is running
Check firewall allows port 1433
Ensure TCP/IP protocol is enabled in SQL Server Configuration Manager
Permission Errors
-- Grant additional permissions if needed
USE YourDatabase;
GRANT EXECUTE TO mcp_readonly; -- If you need to call stored procedures
GRANT SHOWPLAN TO mcp_readonly; -- For execution plansBest Practices
Always use read-only accounts in production
Enable SSL encryption for network security
Monitor regularly - Set up regular monitoring checks
Limit result sets - Use maxRows to prevent memory issues
Index optimization - Monitor slow queries and add indexes
Regular maintenance - Keep statistics updated
Audit access - Track who queries what
Contributing
Contributions are welcome — see CONTRIBUTING.md for development setup, pull-request guidelines, and the release process. Version history is tracked in CHANGELOG.md.
License
MIT License - Feel free to use and modify for your needs.
Built With
@modelcontextprotocol/sdk - MCP SDK
mssql - SQL Server client for Node.js
Support
For issues:
Check the Troubleshooting section
Review SQL Server error logs
Verify Claude Desktop logs
Check database permissions
Built for Claude Desktop • Security First • Performance Focused
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/PiyapatRag/mssql-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server