UNPKG

mssql-mcp-server

Version:

MCP server for Microsoft SQL Server database access and comprehensive schema exploration using tedious. Includes enhanced stored procedure tools for complete SQL source code access.

219 lines (168 loc) 7.62 kB
# MSSQL MCP Configuration Guide ## 🔐 Understanding Windows Authentication Requirements **Why Environment Variables Are Essential for NTLM:** When using Windows Authentication with SQL Server, the MCP server operates as a background process that lacks access to the current user's Windows session. This creates specific requirements: 1. **NTLM Protocol Limitations**: Windows Authentication requires explicit domain credentials to establish the NTLM handshake 2. **Service Context**: MCP servers run outside the user's interactive session and cannot inherit Windows credentials automatically 3. **Security Delegation**: The tedious library must explicitly authenticate as a domain user to access SQL Server 4. **Cross-Process Authentication**: Unlike GUI applications, background services need explicit credential provision **This is why `WINDOWS_USERNAME`, `WINDOWS_PASSWORD`, and `WINDOWS_DOMAIN` must be set in environment variables - it's a technical requirement of NTLM authentication in service contexts, not just a configuration preference.** ## 🎯 Configuration Approaches (Best to Legacy) ### 1. **Individual Variables** (Recommended - Cleanest) ```json { "servers": { "mssql-mcp": { "type": "stdio", "command": "node", "args": ["C:\\path\\to\\mssql-mcp\\dist\\index.js"], "env": { "WINDOWS_USERNAME": "myuser", "WINDOWS_PASSWORD": "mypass", "WINDOWS_DOMAIN": "MYDOMAIN", "CONNECTION_CRM": "Data Source=crm-server; Initial Catalog=CRM;", "CONNECTION_ERP": "Data Source=erp-server; Initial Catalog=ERP;", "CONNECTION_HR": "Data Source=hr-server; Initial Catalog=HR;" } } } } ``` **✅ Pros:** - No JSON strings to escape - Clearest, most readable - Standard industry practice - No parsing errors possible - Easy to edit and maintain ### 2. 🔄 **Clean JSON Variables** ```json { "servers": { "mssql-mcp": { "type": "stdio", "command": "node", "args": ["C:\\path\\to\\mssql-mcp\\dist\\index.js"], "env": { "windows_credentials": "{\"username\": \"myuser\", \"password\": \"mypass\", \"domain\": \"MYDOMAIN\"}", "connections": "{\"crm\": \"Data Source=crm-server;\", \"erp\": \"Data Source=erp-server;\"}" } } } } ``` **✅ Pros:** - Shorter variable names - Grouped related settings - Cleaner than legacy approach **⚠️ Cons:** - Requires JSON string escaping - Potential parsing errors ### 3. 📜 **Legacy Prefixed Variables** ```json { "servers": { "mssql-mcp": { "type": "stdio", "command": "node", "args": ["C:\\path\\to\\mssql-mcp\\dist\\index.js"], "env": { "MSSQL_WINDOWS_CREDENTIALS": "{\"username\": \"myuser\", \"password\": \"mypass\", \"domain\": \"MYDOMAIN\"}", "MSSQL_CONNECTIONS": "{\"crm\": \"Data Source=crm-server;\", \"erp\": \"Data Source=erp-server;\"}" } } } } ``` **✅ Pros:** - Backward compatible - Still functional **⚠️ Cons:** - Longer variable names - Requires JSON string escaping ## 🔄 Migration Path **Current Users:** All approaches work! You can migrate at your own pace. **New Users:** Start with **Individual Variables** (Method 1) for the cleanest experience. ## 🎯 Connection Name Mapping When using `CONNECTION_*` variables, the connection names are automatically mapped: | Environment Variable | Connection Name | |---------------------|----------------| | `CONNECTION_CRM_APP` | `crm_app` | | `CONNECTION_FINANCE_ERP` | `finance_erp` | | `CONNECTION_HR_SYSTEM` | `hr_system` | | `CONNECTION_ANALYTICS_DW` | `analytics_dw` | The prefix `CONNECTION_` is removed and the name is converted to lowercase. ## 🏢 Multi-Application Database Setup The MSSQL MCP Server supports storing connection strings for **multiple different database servers and applications** in a single MCP configuration. This allows you to easily switch between completely different systems, applications, and database servers during conversations. ### Use Cases - Different application databases (CRM, E-commerce, HR, etc.) - Customer/client database systems - Legacy system databases - Third-party/partner databases - Analytics and reporting databases - Archive and backup systems ### Example Multi-Application Configuration ```json { "servers": { "mssql-mcp": { "type": "stdio", "command": "node", "args": ["C:\\path\\to\\mssql-mcp\\dist\\index.js"], "env": { "WINDOWS_USERNAME": "domain-user", "WINDOWS_PASSWORD": "secure-password", "WINDOWS_DOMAIN": "COMPANY", "MSSQL_CONNECTION_STRING": "Data Source=DefaultServer; Initial Catalog=DefaultDB; Integrated Security=SSPI; TrustServerCertificate=True;", "CONNECTION_CRM_APP": "Data Source=crm-server.company.com; Initial Catalog=CRM_Database; Integrated Security=SSPI; TrustServerCertificate=True;", "CONNECTION_ECOMMERCE_APP": "Data Source=ecommerce-db.company.com; Initial Catalog=OnlineStore; Integrated Security=SSPI; TrustServerCertificate=True;", "args": ["C:\\path\\to\\mssql-mcp\\dist\\index.js"], ``` ### Connection Priority The server resolves connections in this order: 1. **Explicit `connectionString`** parameter (highest priority) 2. **Named `connectionName`** parameter 3. **Default connection** from `MSSQL_CONNECTION_STRING` 4. **Error** if none available ## 💬 Conversational Usage You can use natural language to switch between completely different database systems: ``` User: "What database connections do I have available?" Assistant: I'll list all your configured database connections... [Shows: crm_app, ecommerce_app, customer_system, etc.] User: "I want to work with the CRM application database" Assistant: I'll connect to the CRM application database... [Uses connectionName: "crm_app"] User: "Show me the customer tables" Assistant: I'll list the tables in the CRM database... [Executes with connectionName: "crm_app"] ``` ## 🛡️ Security Best Practices 1. **Environment Variables**: Store sensitive credentials in environment variables, not configuration files 2. **Minimal Permissions**: Use database accounts with only necessary read permissions 3. **Connection Encryption**: Always use `TrustServerCertificate=True` or proper SSL certificates 4. **Domain Accounts**: Use dedicated domain accounts for MCP server authentication 5. **Network Security**: Ensure proper firewall and network segmentation ## 🔧 Troubleshooting ### Common Issues **"Login failed for user" errors:** - Verify Windows credentials are correct - Ensure the domain account has access to the database - Check that the domain is reachable from the MCP server **"Server not found" errors:** - Verify server names and network connectivity - Check that SQL Server is configured to accept connections - Ensure SQL Server Browser service is running (for named instances) **JSON parsing errors:** - Validate JSON string format in environment variables - Escape quotes properly in JSON strings - Consider switching to Individual Variables approach to avoid JSON ### Testing Configuration Use the `test_connection` tool to verify your configuration: ```javascript // Test default connection await mcp.call("test_connection", {}); // Test specific named connection await mcp.call("test_connection", { connectionName: "crm_app" }); ```