# database-mcp-postgres MCP server

> Provides AI clients with safe, structured access to PostgreSQL databases using controlled SQL execution and schema searching.

- Repository: https://github.com/arifulislamat/database-mcp
- Page: https://hostedmcp.org/servers/arifulislamat/database-mcp-postgres
- Transport: stdio
- Stars: 5
- License: MIT
- Latest version: 0.5.0

## Install

### Claude Code

```sh
claude mcp add --env 'POSTGRES_DATABASE=<POSTGRES_DATABASE>' --env 'POSTGRES_HOST=<POSTGRES_HOST>' --env 'POSTGRES_USER=<POSTGRES_USER>' --env 'POSTGRES_PASSWORD=<YOUR_POSTGRES_PASSWORD>' database-mcp-postgres -- npx -y @database-mcp/postgres
```

### Cursor (`~/.cursor/mcp.json`)

```json
{
  "mcpServers": {
    "database-mcp-postgres": {
      "command": "npx",
      "args": [
        "-y",
        "@database-mcp/postgres"
      ],
      "env": {
        "POSTGRES_DATABASE": "<POSTGRES_DATABASE>",
        "POSTGRES_HOST": "<POSTGRES_HOST>",
        "POSTGRES_USER": "<POSTGRES_USER>",
        "POSTGRES_PASSWORD": "<YOUR_POSTGRES_PASSWORD>"
      }
    }
  }
}
```

### VS Code (`.vscode/mcp.json`)

```json
{
  "servers": {
    "database-mcp-postgres": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@database-mcp/postgres"
      ],
      "env": {
        "POSTGRES_DATABASE": "<POSTGRES_DATABASE>",
        "POSTGRES_HOST": "<POSTGRES_HOST>",
        "POSTGRES_USER": "<POSTGRES_USER>",
        "POSTGRES_PASSWORD": "<YOUR_POSTGRES_PASSWORD>"
      }
    }
  }
}
```

### VS Code CLI

```sh
code --add-mcp '{"name":"database-mcp-postgres","type":"stdio","command":"npx","args":["-y","@database-mcp/postgres"],"env":{"POSTGRES_DATABASE":"<POSTGRES_DATABASE>","POSTGRES_HOST":"<POSTGRES_HOST>","POSTGRES_USER":"<POSTGRES_USER>","POSTGRES_PASSWORD":"<YOUR_POSTGRES_PASSWORD>"}}'
```

### Claude Desktop (`claude_desktop_config.json`)

```json
{
  "mcpServers": {
    "database-mcp-postgres": {
      "command": "npx",
      "args": [
        "-y",
        "@database-mcp/postgres"
      ],
      "env": {
        "POSTGRES_DATABASE": "<POSTGRES_DATABASE>",
        "POSTGRES_HOST": "<POSTGRES_HOST>",
        "POSTGRES_USER": "<POSTGRES_USER>",
        "POSTGRES_PASSWORD": "<YOUR_POSTGRES_PASSWORD>"
      }
    }
  }
}
```

### Codex

```sh
codex mcp add database-mcp-postgres --env 'POSTGRES_DATABASE=<POSTGRES_DATABASE>' --env 'POSTGRES_DATABASE=<POSTGRES_DATABASE>' --env 'POSTGRES_DATABASE=<POSTGRES_DATABASE>' --env 'POSTGRES_HOST=<POSTGRES_HOST>' --env 'POSTGRES_HOST=<POSTGRES_HOST>' --env 'POSTGRES_HOST=<POSTGRES_HOST>' --env 'POSTGRES_USER=<POSTGRES_USER>' --env 'POSTGRES_USER=<POSTGRES_USER>' --env 'POSTGRES_USER=<POSTGRES_USER>' --env 'POSTGRES_PASSWORD=<YOUR_POSTGRES_PASSWORD>' --env 'POSTGRES_PASSWORD=<YOUR_POSTGRES_PASSWORD>' --env 'POSTGRES_PASSWORD=<YOUR_POSTGRES_PASSWORD>' -- npx -y @database-mcp/postgres
```

### Codex config.toml (`~/.codex/config.toml`)

```toml
[mcp_servers.database-mcp-postgres]
command = "npx"
args = ["-y", "@database-mcp/postgres"]

[mcp_servers.database-mcp-postgres.env]
POSTGRES_DATABASE = "<POSTGRES_DATABASE>"
POSTGRES_HOST = "<POSTGRES_HOST>"
POSTGRES_USER = "<POSTGRES_USER>"
POSTGRES_PASSWORD = "<YOUR_POSTGRES_PASSWORD>"
```

### Gemini CLI

```sh
gemini mcp add -s user -e 'POSTGRES_DATABASE=<POSTGRES_DATABASE>' -e 'POSTGRES_DATABASE=<POSTGRES_DATABASE>' -e 'POSTGRES_DATABASE=<POSTGRES_DATABASE>' -e 'POSTGRES_HOST=<POSTGRES_HOST>' -e 'POSTGRES_HOST=<POSTGRES_HOST>' -e 'POSTGRES_HOST=<POSTGRES_HOST>' -e 'POSTGRES_USER=<POSTGRES_USER>' -e 'POSTGRES_USER=<POSTGRES_USER>' -e 'POSTGRES_USER=<POSTGRES_USER>' -e 'POSTGRES_PASSWORD=<YOUR_POSTGRES_PASSWORD>' -e 'POSTGRES_PASSWORD=<YOUR_POSTGRES_PASSWORD>' -e 'POSTGRES_PASSWORD=<YOUR_POSTGRES_PASSWORD>' database-mcp-postgres npx -- -y @database-mcp/postgres
```

### Gemini settings.json (`~/.gemini/settings.json`)

```json
{
  "mcpServers": {
    "database-mcp-postgres": {
      "command": "npx",
      "args": [
        "-y",
        "@database-mcp/postgres"
      ],
      "env": {
        "POSTGRES_DATABASE": "<POSTGRES_DATABASE>",
        "POSTGRES_HOST": "<POSTGRES_HOST>",
        "POSTGRES_USER": "<POSTGRES_USER>",
        "POSTGRES_PASSWORD": "<YOUR_POSTGRES_PASSWORD>"
      }
    }
  }
}
```

## Environment variables

| Name | Required | Secret | Description |
|---|---|---|---|
| `POSTGRES_DATABASE` | yes | no | Database name |
| `POSTGRES_DATABASE` | yes | no | Database name |
| `POSTGRES_DATABASE` | yes | no | Database name |
| `POSTGRES_HOST` | yes | no | Database host |
| `POSTGRES_HOST` | yes | no | Database host |
| `POSTGRES_HOST` | yes | no | Database host |
| `POSTGRES_USER` | yes | no | Database user (a read-only user is recommended) |
| `POSTGRES_USER` | yes | no | Database user (a read-only user is recommended) |
| `POSTGRES_USER` | yes | no | Database user (a read-only user is recommended) |
| `POSTGRES_PASSWORD` | no | yes | Database password (or use POSTGRES_PASSWORD_FILE) |
| `POSTGRES_PASSWORD` | no | yes | Database password (or use POSTGRES_PASSWORD_FILE) |
| `POSTGRES_PASSWORD` | no | yes | Database password (or use POSTGRES_PASSWORD_FILE) |

## FAQ

### How does the server ensure database safety?

It uses a two-layer read-only enforcement consisting of a conservative SQL guard and a session-level read-only setting in the database.

### What are the default limits for queries?

The server defaults to a 1000 row cap and a 30-second statement timeout.

### How are database credentials handled?

Credentials are provided via flags, environment variables, or YAML configuration files and are never accepted through chat prompts.

### Are database passwords visible in logs?

No, passwords use non-printable secret types and DSNs are sanitized to ensure secrets never appear in logs.
