A standalone MCP (Model Context Protocol) server written in C# that provides SQL Server integration capabilities for any MCP-compliant IDE or client.
- SQL Server connectivity
- Database schema exploration
- Table and view inspection
- Column metadata retrieval
- Stored procedure enumeration
- SQL query execution
- Stored procedure execution
- Debug mode for troubleshooting
- Configurable logging path
- Dynamic Project Connection Resolver: Automatically resolves and overrides database connection strings dynamically based on the active file in the editor
- .NET 10.0 SDK or higher
- SQL Server instance (local or remote)
- SQL Server client tools
- Build the project:
dotnet build-
Configure the application:
- Copy
appsettings.example.jsontoappsettings.json - Update the connection string and other settings in
appsettings.jsonwith your SQL Server details
{ "ConnectionStrings": { "DefaultConnection": "Server=your-server;Database=master;User ID=your-username;Password=your-password;TrustServerCertificate=True" }, "LogPath": "C:\\Path\\To\\Your\\LogDirectory\\", "DebugMode": "false" } - Copy
-
Configure the MCP server in your IDE / client:
- Add the server configuration to your IDE's MCP config file (e.g., Windsurf, Claude Desktop config, or Cline/Cursor settings).
- Point the command to the path of your built executable:
{ "mcpServers": { "sqlMcpService": { "command": "path/to/your/MCPSqlServer.exe", "args": [], "description": "SQL Server MCP Service" } } } -
Set up GitHub integration:
- Create a new GitHub repository for your project
- Initialize a new Git repository in your project directory using
git init - Add your GitHub repository as a remote using
git remote add origin <repository-url> - Push your changes to the remote repository using
git push -u origin master
The appsettings.json file contains the following configuration options:
ConnectionStrings:DefaultConnection: The SQL Server connection stringLogPath: Directory where log files will be storedDebugMode: Set to "true" to enable detailed debug loggingAllowWorkspaceOverride: Set to "false" to disable dynamic project connection overrides (defaults to "true")
In multi-project workspaces where different folders or subprojects connect to different databases, you can avoid updating the main configuration constantly:
- All database tools accept an optional
currentFilePathparameter (typically automatically populated by the IDE client with the active file's path). - The server walks up the directory tree from the file's parent folder looking for the nearest
appsettings.json. - If found, it dynamically extracts and uses that file's
ConnectionStrings:DefaultConnectionfor the query execution. - If no config file is found, or if
AllowWorkspaceOverrideis set to"false", it falls back to the primary connection string loaded at startup.
You can publish the application as a self-contained executable:
dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=trueThis will create a single executable file that includes all dependencies.
The MCP server communicates through standard input/output using the standard JSON-RPC 2.0 Model Context Protocol.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "tool-name",
"arguments": {
"param1": "value1",
"param2": "value2"
}
}
}{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "JSON-serialized tool output"
}
]
}
}Or in case of error:
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32602,
"message": "Error description"
}
}List all available non-system SQL Server databases.
Request:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_databases",
"arguments": {}
}
}List all tables and views in a specified database.
Request:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_tables",
"arguments": {
"database": "AdventureWorks",
"schema": "dbo"
}
}
}List all columns and column metadata in a specified table.
Request:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_columns",
"arguments": {
"database": "AdventureWorks",
"schema": "Person",
"table": "Person"
}
}
}List all stored procedures in a specified database.
Request:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_procedures",
"arguments": {
"database": "AdventureWorks",
"schema": "dbo"
}
}
}Get the definition of a stored procedure.
Request:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_procedure_definition",
"arguments": {
"database": "AdventureWorks",
"schema": "dbo",
"name": "uspGetEmployeeManagers"
}
}
}Execute a SQL query in the context of a specific database.
Request:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "execute_database_query",
"arguments": {
"database": "AdventureWorks",
"query": "SELECT TOP 10 * FROM Person.Person"
}
}
}Execute a SQL query at the server instance level (no database context required).
Request:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "execute_system_query",
"arguments": {
"query": "SELECT name FROM sys.databases"
}
}
}Execute a stored procedure.
Request:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "execute_procedure",
"arguments": {
"database": "AdventureWorks",
"schema": "dbo",
"procedure": "uspGetEmployeeManagers",
"parameters": {
"BusinessEntityID": 5
}
}
}
}This MCP server can be used from any MCP-compliant IDE or client (e.g. Windsurf, Cursor, Cline, Claude Desktop) to:
- Browse database schemas
- Execute SQL queries and view results
- Get code completion for table and column names
- Run stored procedures
- Generate SQL code snippets
- Analyze database structures
The application is organized into the following components:
Program.cs: Main entry point and request handlingJsonRpcHandler.cs: Handles JSON-RPC protocol and dispatches requests- Configuration is loaded from
appsettings.json - Logs are written to files specified by the
LogPathsetting
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
Common error codes:
invalid_request: Malformed JSON or missing required fieldsconnection_failed: Failed to connect to SQL Servermissing_parameter: Required parameter not providedquery_execution_error: Error executing a SQL querydatabase_not_found: Specified database does not existtable_not_found: Specified table does not exist