Skip to main content
Glama
lastfore

PostgreSQL MCP Server

by lastfore

PostgreSQL MCP サーバー

ユーザーが自然言語を通じて PostgreSQL データベースと対話できるようにする、プロダクショングレードの Model Context Protocol (MCP) サーバーです。このサーバーは FastMCP をベースに構築されており、自然言語の質問を安全な SQL クエリに変換し、クエリを実行して結果を検証します。参考ドキュメント:

機能特性

  • 自然言語から SQL への変換:GPT-5.2-mini を使用して、一般的な英語の質問を最適化された PostgreSQL クエリに変換

  • セキュリティ第一:読み取り専用の強制、危険な関数のブロック、SQL インジェクション対策、クエリタイムアウト制御

  • 結果検証:AI ベースの結果検証と信頼度スコアの提供

  • スキーマのインテリジェンス:自動スキーマキャッシュ、TTL ベースの更新メカニズム

  • プロダクション対応:コネクションプール管理、サーキットブレーカー、レート制限、包括的なメトリクス収集

  • MCP 互換:Claude Desktop およびあらゆる MCP 互換クライアントをサポート

Related MCP server: PostgreSQL MCP Server

クイックスタート

前提条件

  • Python 3.14+

  • PostgreSQL 12+

  • OpenAI API キー(GPT-5.2-mini 用)

  • UV パッケージマネージャー(推奨)または pip

インストール

UV を使用する場合(推奨)

# 克隆仓库
git clone <repository-url>
cd pg-mcp

# 安装依赖
uv sync

# 复制环境配置模板
cp .env.example .env

# 编辑 .env 并配置参数
vi .env

pip を使用する場合

# 克隆仓库
git clone <repository-url>
cd pg-mcp

# 创建虚拟环境
python -m venv .venv
source .venv/bin/activate  # Windows 系统: .venv\Scripts\activate

# 安装依赖
pip install -e .

# 复制环境配置模板
cp .env.example .env

# 编辑 .env 并配置参数
vi .env

設定

.env ファイルを編集して設定を行います:

# 数据库配置
DATABASE_HOST=localhost
DATABASE_PORT=5432
DATABASE_NAME=your_database
DATABASE_USER=your_user
DATABASE_PASSWORD=your_password

# OpenAI 配置
OPENAI_API_KEY=sk-your-api-key-here
OPENAI_MODEL=gpt-5.2-mini

# 安全设置(可选,显示默认值)
SECURITY_ALLOW_WRITE_OPERATIONS=false
SECURITY_MAX_ROWS=10000
SECURITY_MAX_EXECUTION_TIME=30

完全な設定オプションについては .env.example を参照してください。

サーバーの実行

スタンドアロンモード

# 使用 UV
uv run python main.py

# 或使用 pip
python main.py

Claude Desktop との統合

Claude Desktop の MCP 設定ファイルに以下の設定を追加します:

macOS/Linux: ~/Library/Application Support/Claude/claude_desktop_config.json

Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "postgres": {
      "command": "uv",
      "args": [
        "--directory",
        "/absolute/path/to/pg-mcp",
        "run",
        "python",
        "main.py"
      ],
      "env": {
        "DATABASE_HOST": "localhost",
        "DATABASE_NAME": "your_database",
        "DATABASE_USER": "your_user",
        "DATABASE_PASSWORD": "your_password",
        "OPENAI_API_KEY": "sk-your-api-key-here"
      }
    }
  }
}

詳細な設定手順については Claude Desktop 設定 を参照してください。

使用方法

クエリ例

Claude Desktop またはその他の MCP クライアントで接続した後、自然言語で質問できます:

単純なクエリ

How many tables are in the database?
→ SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'public'

Show me all users
→ SELECT * FROM users LIMIT 10000

What are the column names in the products table?
→ SELECT column_name, data_type FROM information_schema.columns
  WHERE table_name = 'products'

分析クエリ

What are the top 10 products by sales?
→ SELECT product_name, SUM(quantity * price) as total_sales
  FROM orders
  GROUP BY product_name
  ORDER BY total_sales DESC
  LIMIT 10

How many users registered in the last 30 days?
→ SELECT COUNT(*) FROM users
  WHERE created_at > CURRENT_DATE - INTERVAL '30 days'

SQL のみモード

実行せずに SQL のみを要求することも可能です:

Generate SQL to find duplicate emails
Return Type: sql
→ Returns: SELECT email, COUNT(*) FROM users GROUP BY email HAVING COUNT(*) > 1

戻り値の型

サーバーは2つの戻り値の型をサポートしています:

  • result(デフォルト):クエリを実行して結果を返す

  • sql:SQL を生成・検証するが、実行はしない

レスポンス形式

クエリ成功時のレスポンス

{
  "success": true,
  "generated_sql": "SELECT COUNT(*) FROM users",
  "data": {
    "columns": ["count"],
    "rows": [[1523]],
    "row_count": 1,
    "execution_time": 0.023
  },
  "confidence": 95,
  "tokens_used": 234
}

SQL のみモードのレスポンス

{
  "success": true,
  "generated_sql": "SELECT * FROM users WHERE created_at > CURRENT_DATE - INTERVAL '30 days'",
  "confidence": 90,
  "tokens_used": 156
}

エラーレスポンス

{
  "success": false,
  "error": {
    "code": "SECURITY_VIOLATION",
    "message": "Query contains blocked operation: DELETE",
    "details": {
      "blocked_operation": "DELETE"
    }
  }
}

アーキテクチャ

コアコンポーネント

┌─────────────────────────────────────────────────────────────┐
│                      MCP Server (FastMCP)                   │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                    Query Orchestrator                       │
│  - Coordinates all components                               │
│  - Manages retry logic                                      │
│  - Handles error recovery                                   │
└─────────────────────────────────────────────────────────────┘
           │                  │                  │
           ▼                  ▼                  ▼
    ┌───────────┐     ┌────────────┐     ┌──────────────┐
    │   SQL     │     │    SQL     │     │     SQL      │
    │ Generator │────▶│ Validator  │────▶│  Executor    │
    │ (LLM)     │     │ (Security) │     │ (Database)   │
    └───────────┘     └────────────┘     └──────────────┘
           │                                      │
           ▼                                      ▼
    ┌───────────┐                          ┌──────────────┐
    │  Schema   │                          │   Result     │
    │  Cache    │                          │  Validator   │
    └───────────┘                          │  (LLM)       │
                                           └──────────────┘

セキュリティ機能

  1. 読み取り専用の強制:デフォルトでは SELECT クエリのみを許可

  2. 危険な関数のブロック:ブラックリストには危険な PostgreSQL 関数(pg_sleep、ファイル I/O など)が含まれます

  3. SQL 解析:sqlglot を使用して正確な SQL 構造検証を実行

  4. インジェクション対策:パラメータ化されたクエリと入力のサニタイズ

  5. リソース制限

    • 行数制限(デフォルト:10,000)

    • クエリタイムアウト(デフォルト:30秒)

    • コネクションプール管理

  6. トランザクション分離:すべてのクエリは読み取り専用トランザクションで実行

耐障害性機能

  • サーキットブレーカー:LLM API の連鎖的な失敗を防止

  • レート制限:API クォータの枯渇を防止

  • リトライロジック:指数バックオフを使用した一時的な障害の自動リトライ

  • コネクションプール:効率的なデータベース接続の再利用

  • スキーマキャッシュ:TTL ベースのキャッシュによりデータベースメタデータクエリを削減

設定リファレンス

データベース設定

変数

説明

デフォルト値

DATABASE_HOST

PostgreSQL ホスト

localhost

DATABASE_PORT

PostgreSQL ポート

5432

DATABASE_NAME

データベース名

必須

DATABASE_USER

データベースユーザー

必須

DATABASE_PASSWORD

データベースパスワード

必須

DATABASE_MIN_POOL_SIZE

プールの最小接続数

5

DATABASE_MAX_POOL_SIZE

プールの最大接続数

20

DATABASE_COMMAND_TIMEOUT

クエリタイムアウト(秒)

30

OpenAI 設定

変数

説明

デフォルト値

OPENAI_API_KEY

OpenAI API キー

必須

OPENAI_MODEL

使用するモデル

gpt-5.2-mini

OPENAI_MAX_TOKENS

リクエストごとの最大トークン数

32000

OPENAI_TEMPERATURE

モデルの温度

0.0

OPENAI_TIMEOUT

API タイムアウト(秒)

30

セキュリティ設定

変数

説明

デフォルト値

SECURITY_ALLOW_WRITE_OPERATIONS

INSERT/UPDATE/DELETE を許可

false

SECURITY_BLOCKED_FUNCTIONS

カンマ区切りの関数ブラックリスト

.env.example 参照

SECURITY_MAX_ROWS

クエリごとの最大行数

10000

SECURITY_MAX_EXECUTION_TIME

クエリタイムアウト(秒)

30

キャッシュ設定

変数

説明

デフォルト値

CACHE_ENABLED

スキーマキャッシュを有効化

true

CACHE_SCHEMA_TTL

スキーマキャッシュ TTL(秒)

3600

CACHE_MAX_SIZE

最大キャッシュスキーマ数

100

耐障害性設定

変数

説明

デフォルト値

RESILIENCE_MAX_RETRIES

最大リトライ回数

3

RESILIENCE_RETRY_DELAY

初期リトライ遅延(秒)

1.0

RESILIENCE_BACKOFF_FACTOR

指数バックオフ倍数

2.0

RESILIENCE_CIRCUIT_BREAKER_THRESHOLD

サーキットブレーカー閾値

5

RESILIENCE_CIRCUIT_BREAKER_TIMEOUT

サーキットブレーカータイムアウト(秒)

60

可観測性設定

変数

説明

デフォルト値

OBSERVABILITY_METRICS_ENABLED

Prometheus メトリクスを有効化

true

OBSERVABILITY_METRICS_PORT

メトリクス HTTP ポート

9090

OBSERVABILITY_LOG_LEVEL

ログレベル

INFO

OBSERVABILITY_LOG_FORMAT

ログ形式(json/text)

json

開発

開発環境のセットアップ

# 安装开发依赖
uv sync --all-extras

# 安装 pre-commit 钩子(可选)
pre-commit install

テストの実行

# 运行所有测试
uv run pytest

# 运行并生成覆盖率报告
uv run pytest --cov=src --cov-report=html

# 运行特定测试类别
uv run pytest tests/unit/          # 仅单元测试
uv run pytest tests/integration/   # 集成测试
uv run pytest tests/e2e/           # 端到端测试
uv run pytest -m integration       # 标记为集成的测试

コード品質

# 类型检查
uv run mypy src

# Lint 和格式化
uv run ruff check --fix .
uv run ruff format .

# 运行所有质量检查
uv run pytest --cov=src --cov-fail-under=80
uv run mypy src
uv run ruff check .

プロジェクト構造

pg-mcp/
├── src/pg_mcp/
│   ├── cache/              # Schema 缓存
│   ├── config/             # 配置管理
│   ├── db/                 # 数据库连接池
│   ├── models/             # 数据模型
│   ├── observability/      # 日志、指标、追踪
│   ├── prompts/            # LLM Prompt 模板
│   ├── resilience/         # 熔断器、限流器
│   ├── services/           # 核心业务逻辑
│   │   ├── orchestrator.py      # 查询协调
│   │   ├── sql_generator.py     # 基于 LLM 的 SQL 生成
│   │   ├── sql_validator.py     # 安全验证
│   │   ├── sql_executor.py      # 查询执行
│   │   └── result_validator.py  # 结果验证
│   └── server.py           # FastMCP 服务器
├── tests/
│   ├── unit/               # 单元测试
│   ├── integration/        # 集成测试
│   └── e2e/                # 端到端测试
├── fixtures/               # 测试数据库 fixture
├── .env.example            # 环境模板
├── pyproject.toml          # 项目配置
└── main.py                 # 入口点

Docker デプロイ

イメージのビルド

docker build -t pg-mcp:latest .

コンテナの実行

docker run -d \
  --name pg-mcp \
  -e DATABASE_HOST=your-db-host \
  -e DATABASE_NAME=your-db \
  -e DATABASE_USER=your-user \
  -e DATABASE_PASSWORD=your-password \
  -e OPENAI_API_KEY=sk-your-key \
  -p 9090:9090 \
  pg-mcp:latest

Docker Compose

# 启动所有服务(PostgreSQL + pg-mcp)
docker-compose up -d

# 查看日志
docker-compose logs -f pg-mcp

# 停止服务
docker-compose down

詳細な設定は docker-compose.yml を参照してください。

監視

メトリクス

サーバーはポート 9090(設定可能)で Prometheus メトリクスを公開します:

curl http://localhost:9090/metrics

利用可能なメトリクス:

  • pg_mcp_queries_total - 処理されたクエリの総数

  • pg_mcp_query_duration_seconds - クエリ実行時間のヒストグラム

  • pg_mcp_sql_generation_duration_seconds - SQL 生成時間

  • pg_mcp_sql_validation_failures_total - 検証失敗回数

  • pg_mcp_database_errors_total - データベースエラー数

  • pg_mcp_llm_tokens_used_total - LLM トークン使用総数

ログ

構造化された JSON ログ(またはテキスト形式)が標準出力に出力されます:

{
  "timestamp": "2025-12-20T10:30:00.123Z",
  "level": "INFO",
  "message": "Query executed successfully",
  "database": "mydb",
  "execution_time": 0.023,
  "row_count": 42
}

トラブルシューティング

よくある質問

接続が拒否される

Error: Connection to database failed

解決策:PostgreSQL が実行中であり、認証情報が正しいことを確認してください:

psql -h $DATABASE_HOST -U $DATABASE_USER -d $DATABASE_NAME

OpenAI API エラー

Error: OpenAI API request failed

解決策

  1. API キーが有効で、残高があるか確認する

  2. ネットワーク接続を確認する

  3. リクエストがタイムアウトする場合は OPENAI_TIMEOUT 設定を確認する

クエリタイムアウト

Error: Query execution timeout exceeded

解決策

  1. SECURITY_MAX_EXECUTION_TIME を増やす

  2. データベースを最適化する(インデックスの追加、VACUUM)

  3. クエリを簡素化するか、フィルタ条件を追加する

スキーマキャッシュの問題

Error: Schema not found in cache

解決策

  1. サーバーを再起動してスキーマを再読み込みする

  2. データベースユーザーにスキーマ読み取り権限があるか確認する

  3. CACHE_ENABLEDtrue に設定されているか確認する

デバッグモード

デバッグログを有効にする:

export OBSERVABILITY_LOG_LEVEL=DEBUG
uv run python main.py

Claude Desktop 設定

macOS/Linux 設定

~/Library/Application Support/Claude/claude_desktop_config.json を編集します:

{
  "mcpServers": {
    "postgres": {
      "command": "uv",
      "args": [
        "--directory",
        "/Users/yourname/projects/pg-mcp",
        "run",
        "python",
        "main.py"
      ],
      "env": {
        "DATABASE_HOST": "localhost",
        "DATABASE_PORT": "5432",
        "DATABASE_NAME": "mydb",
        "DATABASE_USER": "postgres",
        "DATABASE_PASSWORD": "your-password",
        "OPENAI_API_KEY": "sk-your-api-key-here",
        "OPENAI_MODEL": "gpt-5.2-mini",
        "SECURITY_MAX_ROWS": "10000",
        "CACHE_ENABLED": "true",
        "OBSERVABILITY_LOG_LEVEL": "INFO"
      }
    }
  }
}

Windows 設定

%APPDATA%\Claude\claude_desktop_config.json を編集します:

{
  "mcpServers": {
    "postgres": {
      "command": "uv",
      "args": [
        "--directory",
        "C:\\Users\\YourName\\projects\\pg-mcp",
        "run",
        "python",
        "main.py"
      ],
      "env": {
        "DATABASE_HOST": "localhost",
        "DATABASE_NAME": "mydb",
        "DATABASE_USER": "postgres",
        "DATABASE_PASSWORD": "your-password",
        "OPENAI_API_KEY": "sk-your-api-key-here"
      }
    }
  }
}

Python Virtualenv の使用

UV を使用しない場合は、Python を直接設定してください:

{
  "mcpServers": {
    "postgres": {
      "command": "/absolute/path/to/pg-mcp/.venv/bin/python",
      "args": ["main.py"],
      "cwd": "/absolute/path/to/pg-mcp",
      "env": {
        "DATABASE_HOST": "localhost",
        ...
      }
    }
  }
}

Claude Desktop の再起動

設定を編集した後:

  1. Claude Desktop を完全に終了する

  2. Claude Desktop を再起動する

  3. PostgreSQL MCP サーバーが利用可能になります

セキュリティ上の考慮事項

本番環境へのデプロイ

  1. 読み取り専用データベースユーザーの使用:SELECT 権限のみを持つ専用の PostgreSQL ユーザーを作成する:

CREATE USER pg_mcp_readonly WITH PASSWORD 'secure-password';
GRANT CONNECT ON DATABASE your_database TO pg_mcp_readonly;
GRANT USAGE ON SCHEMA public TO pg_mcp_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO pg_mcp_readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT ON TABLES TO pg_mcp_readonly;
  1. API キーの保護:環境変数またはシークレット管理システムを使用し、バージョン管理には決してコミットしない

  2. ネットワーク分離:サーバーを分離されたネットワークで実行し、IP 制限によってデータベースアクセスを制限する

  3. 使用状況の監視:メトリクスを有効にし、異常なパターンに対してアラートを設定する

  4. レート制限:悪用を防ぐために適切なレート制限パラメータを設定する

  5. ログのサニタイズ:機密データはログから自動的にフィルタリングされます

ライセンス

[ライセンス情報]

貢献

貢献を歓迎します!ガイドラインについては CONTRIBUTING.md を参照してください。

サポート

質問や問題がある場合:

  • GitHub Issues:[repository-url]/issues

  • ドキュメント:詳細な設計ドキュメントについては specs/w5/ ディレクトリを確認してください

謝辞

Install Server
F
license - not found
B
quality
D
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Tools

Related MCP Servers

  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables secure read-only interactions with PostgreSQL databases through natural language. Provides database inspection, table listing, and SQL query execution with built-in security validation.
  • A
    license
    A
    quality
    A
    maintenance
    Enables read-only interaction with PostgreSQL databases through natural language queries, supporting dynamic connections and secure query validation.
    3
    195
    2
    MIT

View all related MCP servers

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/lastfore/pg-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server