Sign inSign up

tuitentuan/postgresql-mcp-toolkit

By tuitentuan

Updated 2 days ago

Image
0

276

tuitentuan/postgresql-mcp-toolkit repository overview

PostgreSQL MCP Toolkit

Production-ready ASP.NET Core MCP server that exposes PostgreSQL inspection and SQL execution tools over the Model Context Protocol (HTTP, stateless). Designed for isolated Docker deployment.

Requirements

  • .NET 10 SDK (local development)
  • PostgreSQL database reachable from the server
  • Docker (for container deployment)

Environment variables

VariableRequiredDefaultDescription
POSTGRES_HOSTYesPostgreSQL hostname or IP
POSTGRES_PORTNo5432PostgreSQL port
POSTGRES_USERYesDatabase user
POSTGRES_PASSWORDYesDatabase password
POSTGRES_DATABASEYesDatabase name
API_KEYYesShared secret sent by clients in the x-api-key header
ASPNETCORE_URLSNohttp://+:8080 in the imageBind URL(s) for Kestrel

The server fails fast at startup if any required variable is missing or empty.

Authentication

  • Protected routes (including MCP endpoints) require header: x-api-key: <API_KEY>
  • Missing or invalid keys return 401 Unauthorized
  • /health is unauthenticated for container health checks

MCP tools

ToolDescription
list_tablesLists base tables as schema-qualified names (schema.table)
get_table_structureReturns columns, types, nullability, defaults, and primary-key flags
execute_sqlExecutes caller-supplied SQL (read/write); 30s command timeout

Local run

$env:POSTGRES_HOST = "localhost"
$env:POSTGRES_PORT = "5432"
$env:POSTGRES_USER = "postgres"
$env:POSTGRES_PASSWORD = "CHANGE_ME"
$env:POSTGRES_DATABASE = "mydb"
$env:API_KEY = "CHANGE_ME_API_KEY"
$env:ASPNETCORE_URLS = "http://localhost:8080"

dotnet run --project PostgreSQL-MCP-Toolkit.csproj

Health check:

GET http://localhost:8080/health

MCP client example (VS Code / Cursor):

{
  "servers": {
    "PostgreSQL-MCP-Toolkit": {
      "type": "http",
      "url": "http://localhost:8080",
      "headers": {
        "x-api-key": "CHANGE_ME_API_KEY"
      }
    }
  }
}

Docker

Build (from this directory):

docker build -t postgresql-mcp-toolkit .

Run:

docker run --rm -p 8080:8080 \
  -e POSTGRES_HOST=postgres.example.com \
  -e POSTGRES_PORT=5432 \
  -e POSTGRES_USER=app_user \
  -e POSTGRES_PASSWORD=CHANGE_ME \
  -e POSTGRES_DATABASE=app_db \
  -e API_KEY=CHANGE_ME_API_KEY \
  -e ASPNETCORE_URLS=http://+:8080 \
  postgresql-mcp-toolkit
docker compose (example)
services:
  postgresql-mcp-toolkit:
    build: .
    ports:
      - "8080:8080"
    environment:
      POSTGRES_HOST: postgres
      POSTGRES_PORT: "5432"
      POSTGRES_USER: app_user
      POSTGRES_PASSWORD: CHANGE_ME
      POSTGRES_DATABASE: app_db
      API_KEY: CHANGE_ME_API_KEY
      ASPNETCORE_URLS: http://+:8080

Replace all CHANGE_ME* placeholders before use. Do not bake secrets into the image.

More information

Tag summary

Content type

Image

Digest

sha256:3194de28a

Size

97.1 MB

Last updated

2 days ago

docker pull tuitentuan/postgresql-mcp-toolkit:v1.0.5