This MCP server exposes safe, read-only tools for SQL Server and SQLite:
- getDatabases
- getTables(database)
- getSchema(database, table?)
- runSelect(database, sql, limit?, params?)
- runSelectAcross(databases[], sql, limit?, params?)
It uses stdio transport for MCP and enforces SELECT/CTE-only execution with client-side row limits.
- .NET SDK 10
- (Optional) Git for version control
Core:
SQL_PROVIDER=sqlserver|sqliteSQL_CONNECTION_STRING(preferred)
SQL Server (if no connection string):
SQL_SERVER_HOST,SQL_SERVER_PORT,SQL_SERVER_USER,SQL_SERVER_PASSWORD,SQL_SERVER_TRUST_CERT(true|false)
SQLite:
SQLITE_DB_FILES= comma-separated file paths orname=pathpairs for multiple DBs- Example:
main=c:\data\app.db,archive=c:\data\archive.db
- Example:
From this folder:
- Set environment for SQL Server
$env:SQL_PROVIDER = "sqlserver"
$env:SQL_CONNECTION_STRING = "Server=localhost;Database=master;User Id=sa;Password=Your_password123;TrustServerCertificate=True;"OR for SQLite
$env:SQL_PROVIDER = "sqlite"
$env:SQLITE_DB_FILES = "main=C:\\data\\app.db,archive=C:\\data\\archive.db"- Run the server (projectless single-file)
- If your environment supports one-file directives (same approach as
jira_mcp.cs), run it the same way you run that file.
- Alternative: run via standard .NET project If your environment does not support projectless directives, create a minimal project file:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<LangVersion>preview</LangVersion>
<Nullable>enable</Nullable>
<OutputType>Exe</OutputType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.8" />
<PackageReference Include="Microsoft.Extensions.Http" Version="9.0.8" />
<PackageReference Include="ModelContextProtocol" Version="0.3.0-preview.3" />
<PackageReference Include="Microsoft.Data.SqlClient" Version="5.2.0" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.0-preview.2" />
</ItemGroup>
<ItemGroup>
<Compile Include="sql_mcp.cs" />
</ItemGroup>
<PropertyGroup>
<EnableDefaultItems>false</EnableDefaultItems>
</PropertyGroup>
</Project>Save as SQL_MCP.csproj in this folder, then:
dotnet restore
dotnet runAdd .vscode/launch.json (optional) to run with your env:
{
"version": "0.2.0",
"configurations": [
{
"name": ".NET Launch SQL MCP",
"type": "coreclr",
"request": "launch",
"program": "dotnet",
"args": ["run"],
"cwd": "${workspaceFolder}",
"env": {
"SQL_PROVIDER": "sqlserver",
"SQL_CONNECTION_STRING": "Server=localhost;Database=master;User Id=sa;Password=Your_password123;TrustServerCertificate=True;"
},
"console": "integratedTerminal"
}
]
}In Cursor Settings, add an MCP server entry similar to:
{
"mcpServers": {
"sql-mcp": {
"command": "dotnet",
"args": ["run"],
"cwd": "c:\\Work\\MCP_SERVERS\\SQL_MCP",
"env": {
"SQL_PROVIDER": "sqlserver",
"SQL_CONNECTION_STRING": "Server=localhost;Database=master;User Id=sa;Password=Your_password123;TrustServerCertificate=True;"
}
}
}
}For SQLite, replace env with:
{
"SQL_PROVIDER": "sqlite",
"SQLITE_DB_FILES": "main=c:\\data\\app.db,archive=c:\\data\\archive.db"
}- getDatabases()
- getTables(database)
- getSchema(database, table?)
- runSelect(database, sql, limit?, params?)
- runSelectAcross(databases[], sql, limit?, params?)
Parameters are bound as @name. Only SELECT or WITH statements are accepted. Default limit 100 (max 1000).
- Read-only by design. Destructive keywords and multi-statements are rejected.
- Use least-privilege SQL accounts for production.