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/ディレクトリを確認してください
謝辞
Available Tools
1 tooladdA
Add two numbers
| Name | Required | Description | Default |
|---|---|---|---|
| a | Yes | ||
| b | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. 'Add two numbers' accurately and sufficiently communicates a pure arithmetic operation, with no indication of side effects or hidden behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four words long, contains zero filler, and conveys the complete operation. It is front-loaded and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-integer addition tool with an output schema and no siblings, this description is nearly complete. It could mention the return value or pure behavior explicitly, but the output schema and inherent simplicity reduce that need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clarifies that both parameters are numbers to be added, but it does not name them or describe each parameter individually. Since addition is commutative, the lack of role differentiation is a minor gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb ('add') and a clear resource ('two numbers'), making the tool's purpose immediately obvious. With no sibling tools, there is no ambiguity to resolve.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is clear: this tool is for summing two numbers. It does not explicitly discuss when not to use it, but with no sibling tools and only two integer parameters, the context is straightforward.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.2.1- First observed
add
TDQS
Scored across 1 tool
Only one tool exists, so no ambiguity between tools.
With a single tool, naming consistency is inherently maintained.
A single trivial arithmetic tool is extremely thin for a PostgreSQL MCP server, fitting the description of an extreme mismatch.
The server's name suggests database-related functionality, but the only tool adds two numbers, leaving the entire database surface missing.
Maintenance
Related MCP Connectors
Query PostgreSQL databases in plain English — LLM-generated, safety-validated SQL.
Deterministic safety, correctness & cost gate that vets Postgres SQL before your AI agent runs it.
Query Postgres, MySQL, SQL Server, Oracle, BigQuery, ClickHouse and Redshift from your AI client.
Ask data questions in natural language. Get SQL, insights, and charts from your databases.
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.-
- AlicenseAqualityBmaintenanceEnables read-only interaction with PostgreSQL databases through natural language queries, supporting dynamic connections and secure query validation.3134 npm2MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with PostgreSQL databases through natural language queries, schema inspection, and safe SQL execution.6 npm1-
- FlicenseNot gradedqualityDmaintenanceConverts natural language to safe SQL queries for PostgreSQL databases with read-only access and multi-layer security validation. Provides tools for running validated SELECT queries, retrieving schema, and sampling table data.-