PostgreSQL MCP Server
PostgreSQL MCP サーバー
ユーザーが自然言語を通じて PostgreSQL データベースと対話できるようにする、プロダクショングレードの Model Context Protocol (MCP) サーバーです。このサーバーは FastMCP をベースに構築されており、自然言語の質問を安全な SQL クエリに変換し、クエリを実行して結果を検証します。参考ドキュメント:
Python Postgres MCP 要件調査 : https://gemini.google.com/share/c87a73f0969b
SQLGlot 詳細調査プラン : https://gemini.google.com/share/cc5e45c76c8f
機能特性
自然言語から 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 .envpip を使用する場合
# 克隆仓库
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.pyClaude 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) │
└──────────────┘セキュリティ機能
読み取り専用の強制:デフォルトでは SELECT クエリのみを許可
危険な関数のブロック:ブラックリストには危険な PostgreSQL 関数(pg_sleep、ファイル I/O など)が含まれます
SQL 解析:sqlglot を使用して正確な SQL 構造検証を実行
インジェクション対策:パラメータ化されたクエリと入力のサニタイズ
リソース制限:
行数制限(デフォルト:10,000)
クエリタイムアウト(デフォルト:30秒)
コネクションプール管理
トランザクション分離:すべてのクエリは読み取り専用トランザクションで実行
耐障害性機能
サーキットブレーカー:LLM API の連鎖的な失敗を防止
レート制限:API クォータの枯渇を防止
リトライロジック:指数バックオフを使用した一時的な障害の自動リトライ
コネクションプール:効率的なデータベース接続の再利用
スキーマキャッシュ:TTL ベースのキャッシュによりデータベースメタデータクエリを削減
設定リファレンス
データベース設定
変数 | 説明 | デフォルト値 |
| PostgreSQL ホスト |
|
| PostgreSQL ポート |
|
| データベース名 | 必須 |
| データベースユーザー | 必須 |
| データベースパスワード | 必須 |
| プールの最小接続数 |
|
| プールの最大接続数 |
|
| クエリタイムアウト(秒) |
|
OpenAI 設定
変数 | 説明 | デフォルト値 |
| OpenAI API キー | 必須 |
| 使用するモデル |
|
| リクエストごとの最大トークン数 |
|
| モデルの温度 |
|
| API タイムアウト(秒) |
|
セキュリティ設定
変数 | 説明 | デフォルト値 |
| INSERT/UPDATE/DELETE を許可 |
|
| カンマ区切りの関数ブラックリスト | .env.example 参照 |
| クエリごとの最大行数 |
|
| クエリタイムアウト(秒) |
|
キャッシュ設定
変数 | 説明 | デフォルト値 |
| スキーマキャッシュを有効化 |
|
| スキーマキャッシュ TTL(秒) |
|
| 最大キャッシュスキーマ数 |
|
耐障害性設定
変数 | 説明 | デフォルト値 |
| 最大リトライ回数 |
|
| 初期リトライ遅延(秒) |
|
| 指数バックオフ倍数 |
|
| サーキットブレーカー閾値 |
|
| サーキットブレーカータイムアウト(秒) |
|
可観測性設定
変数 | 説明 | デフォルト値 |
| Prometheus メトリクスを有効化 |
|
| メトリクス HTTP ポート |
|
| ログレベル |
|
| ログ形式(json/text) |
|
開発
開発環境のセットアップ
# 安装开发依赖
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:latestDocker 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_NAMEOpenAI API エラー
Error: OpenAI API request failed解決策:
API キーが有効で、残高があるか確認する
ネットワーク接続を確認する
リクエストがタイムアウトする場合は
OPENAI_TIMEOUT設定を確認する
クエリタイムアウト
Error: Query execution timeout exceeded解決策:
SECURITY_MAX_EXECUTION_TIMEを増やすデータベースを最適化する(インデックスの追加、VACUUM)
クエリを簡素化するか、フィルタ条件を追加する
スキーマキャッシュの問題
Error: Schema not found in cache解決策:
サーバーを再起動してスキーマを再読み込みする
データベースユーザーにスキーマ読み取り権限があるか確認する
CACHE_ENABLEDがtrueに設定されているか確認する
デバッグモード
デバッグログを有効にする:
export OBSERVABILITY_LOG_LEVEL=DEBUG
uv run python main.pyClaude 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 の再起動
設定を編集した後:
Claude Desktop を完全に終了する
Claude Desktop を再起動する
PostgreSQL MCP サーバーが利用可能になります
セキュリティ上の考慮事項
本番環境へのデプロイ
読み取り専用データベースユーザーの使用: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;API キーの保護:環境変数またはシークレット管理システムを使用し、バージョン管理には決してコミットしない
ネットワーク分離:サーバーを分離されたネットワークで実行し、IP 制限によってデータベースアクセスを制限する
使用状況の監視:メトリクスを有効にし、異常なパターンに対してアラートを設定する
レート制限:悪用を防ぐために適切なレート制限パラメータを設定する
ログのサニタイズ:機密データはログから自動的にフィルタリングされます
ライセンス
[ライセンス情報]
貢献
貢献を歓迎します!ガイドラインについては CONTRIBUTING.md を参照してください。
サポート
質問や問題がある場合:
GitHub Issues:[repository-url]/issues
ドキュメント:詳細な設計ドキュメントについては
specs/w5/ディレクトリを確認してください
謝辞
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Tools
- addB
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceEnables secure read-only interactions with PostgreSQL databases through natural language. Provides database inspection, table listing, and SQL query execution with built-in security validation.
- AlicenseAqualityAmaintenanceEnables read-only interaction with PostgreSQL databases through natural language queries, supporting dynamic connections and secure query validation.31952MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with PostgreSQL databases through natural language queries, schema inspection, and safe SQL execution.91
- AlicenseNot gradedqualityDmaintenanceEnables natural language querying of PostgreSQL databases with intelligent SQL generation using LLMs.1Apache 2.0
Related MCP Connectors
Query PostgreSQL databases in plain English — LLM-generated, safety-validated SQL.
Analytical memory for AI agents: a real Postgres queried in plain English over MCP. One command.
Comprehensive PostgreSQL documentation and best practices, including ecosystem tools
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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