MCP server for PostgreSQL, MySQL, and SQLite. Gives AI assistants secure database access via Model Context Protocol.
npx @pilat/mcp-datalink
Works with Claude Desktop, Claude Code, Cursor, Cline, and any MCP-compatible client.
Add to your MCP client config file (see config locations below):
{
"mcpServers": {
"datalink": {
"command": "npx",
"args": ["-y", "@pilat/mcp-datalink"],
"env": {
"DATALINK_ANALYTICS_URL": "postgresql://user:password@localhost:5432/analytics",
"DATALINK_ANALYTICS_READONLY": "true",
"DATALINK_INVENTORY_URL": "mysql://user:password@localhost:3306/inventory",
"DATALINK_CACHE_URL": "sqlite:///path/to/cache.db"
}
}
}
}This creates three database connections: analytics (read-only), inventory, and cache.
| Variable | Description |
|---|---|
DATALINK_{NAME}_URL |
Connection URL (creates database named {name}) |
DATALINK_{NAME}_READONLY |
Set to true to block writes |
DATALINK_{NAME}_MAX_TIMEOUT |
Max query timeout in ms (caps model requests) |
Connection URL formats:
# PostgreSQL
postgresql://user:password@localhost:5432/dbname
postgresql://user:password@localhost:5432/dbname?sslmode=require
# MySQL
mysql://user:password@localhost:3306/dbname
mysql://user:password@localhost:3306/dbname?ssl=true
# SQLite
sqlite:///path/to/database.db
sqlite:///Users/me/data/app.sqlite
sqlite://../relative/path/data.dbURLs support ${VAR} syntax to reference other environment variables:
{
"mcpServers": {
"datalink": {
"command": "npx",
"args": ["-y", "@pilat/mcp-datalink"],
"env": {
"DATALINK_MAIN_URL": "${DATABASE_URL}"
}
}
}
}This allows reusing existing environment variables (like DATABASE_URL from your shell or .env file).
Supported syntax:
| Syntax | Description |
|---|---|
${VAR} |
Expands to value of VAR, or keeps ${VAR} if unset |
${VAR:-default} |
Expands to value of VAR, or default if unset |
Examples:
# Reference existing DATABASE_URL
DATALINK_MAIN_URL="${DATABASE_URL}"
# Build URL from parts
DATALINK_MAIN_URL="postgresql://${DB_USER}:${DB_PASS}@${DB_HOST}:5432/mydb"
# With default values
DATALINK_MAIN_URL="postgresql://localhost:${DB_PORT:-5432}/mydb"| Client | Config file |
|---|---|
| Claude Code | ~/.claude/settings.local.json (global) or .mcp.json (project) |
| Claude Desktop (macOS) | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Claude Desktop (Windows) | %APPDATA%\Claude\claude_desktop_config.json |
| Cursor | ~/.cursor/mcp.json or Settings → Features → MCP Servers |
| Cline | cline_mcp_settings.json or VS Code settings cline.mcpServers |
| Tool | Description |
|---|---|
list_databases |
List configured database connections |
list_tables |
List tables with row counts |
describe_table |
Get schema, indexes, foreign keys |
query |
Run SELECT queries |
execute |
Run INSERT/UPDATE/DELETE |
explain |
Show query execution plans |
- Prepared statements only (no SQL injection)
- Single statement per query (no chaining)
- DDL blocked (no DROP, ALTER, TRUNCATE)
- Readonly mode per connection
- Output truncation (100 rows, 64KB max)
- Query timeout: 30s default, model can request up to 10min,
MAX_TIMEOUTcaps it
MIT