npm package: @pilat/mcp-datalink
Description: MCP server for secure database access (PostgreSQL, MySQL, SQLite)
Author: Vladimir Urushev
Latest version: 1.4.1

# @pilat/mcp-datalink

MCP server for PostgreSQL, MySQL, and SQLite. Gives AI assistants secure database access via [Model Context Protocol](https://modelcontextprotocol.io).

```
npx @pilat/mcp-datalink
```

Works with Claude Desktop, Claude Code, Cursor, Cline, and any MCP-compatible client.

## Installation

Add to your MCP client config file (see [config locations](#config-file-locations) below):

```json
{
  "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:**

```bash
# 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.db
```

### Environment Variable Substitution

URLs support `${VAR}` syntax to reference other environment variables:

```json
{
  "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:**

```bash
# 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"
```

### Config File Locations

| Client | Config file |
|--------|-------------|
| Claude Code | `~/.claude.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` |

## Tools

| 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 |

## Security

- Prepared statements only (no SQL injection)
- Single statement per query (no chaining)
- DDL blocked (no DROP, ALTER, TRUNCATE)
- Readonly mode per connection
- Response size limit (100 rows, 64KB default, configurable via `DATALINK_MAX_TOTAL_SIZE`)
- Query timeout: 30s default, model can request up to 10min, `MAX_TIMEOUT` caps it

## License

MIT