PostgreSQL MCP Server について
AI アシスタントから PostgreSQL のデータや操作にアクセスするための Go 製 MCP サーバーです。読み取り、スキーマ変更、データ変更を別々のツールに分け、SQL を検証して危険な操作を制限します。
主な機能
- 01SELECT クエリの実行
- 02データベーススキーマの作成・変更
- 03レコードの挿入・更新・削除
- 04ツール種別に応じた SQL 検証
- 05危険な管理操作のブロック
- 06PostgreSQL SSL 接続のサポート
活用シーン
- 01分析用の業務データの照会
- 02ユーザーや在庫情報の確認
- 03スキーマやデータレコードの変更
MCP 対応
MCP クライアントに execute_query、ddl_query、modify_query ツールを公開し、読み取り、スキーマ管理、データ変更を行います。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
PostgreSQL MCP Server
作者:Swan Htet Aung Phyo
AGH コンピューターサイエンス専攻の学生(バックエンド開発者)
AI アシスタントが、明確で標準化されたインターフェースを通じて PostgreSQL データベースを操作できる、安全で効率的な MCP サーバーです。
セキュリティを心配せずに、AI アシスタントにデータベースをクエリする機能を与えたいと思ったことはありませんか?この MCP サーバーがまさにその答えです。データを安全に保ちながら、AI モデルが PostgreSQL データベースを操作できる安全な方法を提供します。
これはどのようなものですか?
Model Context Protocol(MCP)は、AI アシスタントが外部データソースに接続するための標準になりつつあります。このサーバーは、PostgreSQL データベース向けに MCP を実装し、主に次の 3 つの機能を提供します。
- データをクエリする - AI アシスタントに SELECT クエリを実行させ、情報を検索できます
- スキーマを管理する - 必要に応じてデータベース構造を作成、変更、削除できます
- データを更新する - 適切な検証を行いながら、レコードを挿入、更新、削除できます
何より、危険な操作を防ぐため、すべての処理が検証され、制限されています。誤って DROP DATABASE コマンドを実行してしまうことはありません!
はじめに
必要なもの
- Go 1.19 以降がインストールされたマシン
- PostgreSQL データベース(バージョン 13 以降を推奨)
- セットアップに約 5 分
インストール
まず、プロジェクトを作成します。
mkdir postgresql-mcp-server
cd postgresql-mcp-server
go mod init postgresql-mcp-server
次に、依存関係を取得します。
go get github.com/metoro-io/mcp-golang
go get github.com/metoro-io/mcp-golang/transport/stdio
go get gorm.io/driver/postgres
go get gorm.io/gorm
メインサーバーのコードを main.go にコピーし、データベース接続を更新します。
const dbConn = "host=localhost user=postgres password=yourpassword dbname=yourdb port=5432 sslmode=disable"
ビルドして実行します。
go build -o postgresql-mcp-server
./postgresql-mcp-server
これで完了です!サーバーが起動し、接続を受け付ける準備ができているはずです。
使い方
このサーバーは、データベース操作の種類に応じた 3 つの主要なツールを提供します。
データの読み取り(execute_query)
おそらく最もよく使う機能です。SELECT クエリを実行して情報を取得できます。
-- Find all active users
SELECT name, email FROM users WHERE active = true;
-- Get sales summary for the last month
SELECT
product_name,
SUM(quantity) as total_sold,
AVG(price) as avg_price
FROM sales
WHERE created_at >= '2024-01-01'
GROUP BY product_name
ORDER BY total_sold DESC;
結果は見やすく整形されるため、AI アシスタントがデータを理解して扱いやすくなります。
データベース構造の管理(ddl_query)
テーブルの作成やスキーマの変更が必要ですか?このツールで DDL 操作を行えます。
-- Create a new table
CREATE TABLE blog_posts (
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT,
author_id INTEGER REFERENCES users(id),
published_at TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Add an index for better performance
CREATE INDEX idx_posts_author ON blog_posts(author_id);
-- Modify existing table
ALTER TABLE users ADD COLUMN last_login TIMESTAMP;
データの変更(modify_query)
データの挿入、更新、削除が必要な場合に使用します。
-- Add new records
INSERT INTO users (name, email, active)
VALUES ('Alice Johnson', '[email protected]', true);
-- Update existing data
UPDATE products
SET price = price * 0.9
WHERE category = 'electronics' AND stock > 100;
-- Clean up old data
DELETE FROM logs WHERE created_at < NOW() - INTERVAL '90 days';
セキュリティ機能
このサーバーの開発では、セキュリティを重要な考慮事項としました。データを安全に保つための仕組みは次のとおりです。
クエリの検証:実行前にすべてのクエリを確認します。各ツールで許可される SQL 文の種類は限定されています。クエリツールから誤って DROP TABLE コマンドを実行することはできません。
危険な操作の禁止:TRUNCATE、GRANT などのコマンドやその他の管理機能は、すべてブロックされます。
接続のセキュリティ:SSL サポートを含む、PostgreSQL 標準の接続セキュリティを使用します。
入力のサニタイズ:すべてのクエリに対し、GORM に組み込まれた SQL インジェクション対策が適用されます。
設定オプション
データベース接続
接続文字列には、標準の PostgreSQL 形式を使用します。
host=localhost user=myuser password=mypass dbname=mydb port=5432 sslmode=require
本番環境では、次のセキュリティ設定を検討してください。
// Production example
const dbConn = "host=db.example.com user=mcp_user password=secure_password dbname=production_db port=5432 sslmode=require"
環境変数
セキュリティを強化するには、認証情報をコードに直接記述する代わりに、環境変数を使用するとよいでしょう。
import "os"
func getDBConnection() string {
host := os.Getenv("DB_HOST")
user := os.Getenv("DB_USER")
password := os.Getenv("DB_PASSWORD")
dbname := os.Getenv("DB_NAME")
port := os.Getenv("DB_PORT")
return fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=require",
host, user, password, dbname, port)
}
MCP クライアントへの接続
Claude Desktop
claude_desktop_config.json に次の設定を追加します。
{
"mcpServers": {
"postgresql": {
"command": "/path/to/your/postgresql-mcp-server",
"args": []
}
}
}
その他の MCP クライアント
ほとんどの MCP クライアントでは、同様の設定形式を使用します。
{
"servers": [
{
"name": "postgresql-db",
"transport": "stdio",
"command": ["/path/to/postgresql-mcp-server"]
}
]
}
実際の使用例
このサーバーの実用的な使用方法をいくつか紹介します。
ビジネスインテリジェンスのクエリ
-- Monthly revenue trend
SELECT
DATE_TRUNC('month', order_date) as month,
SUM(total_amount) as revenue,
COUNT(*) as order_count
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY month
ORDER BY month;
ユーザー分析
-- Active users by registration date
SELECT
DATE(created_at) as signup_date,
COUNT(*) as new_users,
SUM(COUNT(*)) OVER (ORDER BY DATE(created_at)) as cumulative_users
FROM users
WHERE created_at >= '2024-01-01'
GROUP BY signup_date
ORDER BY signup_date;
在庫管理
-- Low stock alert
SELECT
product_name,
current_stock,
min_stock_level,
(min_stock_level - current_stock) as shortage
FROM inventory
WHERE current_stock < min_stock_level
ORDER BY shortage DESC;
よくある問題と解決策
接続の問題:データベースに接続できない場合は、接続文字列をもう一度確認してください。PostgreSQL が起動しており、指定したポートで接続を受け付けていることを確認してください。
権限エラー:データベースユーザーには、実行する操作に応じた適切な権限が必要です。読み取り専用アクセスの場合は、SELECT 権限で十分です。すべての機能を利用するには、CREATE、INSERT、UPDATE、DELETE 権限が必要です。
クエリが拒否される:クエリが拒否された場合は、適切なツールを使用しているか確認してください。SELECT クエリは execute_query に、CREATE/ALTER/DROP は ddl_query に渡します。
パフォーマンスの問題:大規模なデータセットの場合は、クエリに LIMIT 句を追加することを検討してください。このサーバーは結果セットを自動的に制限しないため、数百万行を返すクエリは遅くなることがあります。
パフォーマンスのヒント
- 頻繁にクエリする列にインデックスを使用します
- 大規模なデータセットには LIMIT 句を追加します
- 複雑なクエリの最適化には EXPLAIN の使用を検討します
- ANALYZE を実行して、PostgreSQL の統計情報を最新の状態に保ちます
貢献
バグを見つけた場合や、機能を追加したい場合は、ぜひご貢献ください。手順は以下のとおりです。
- リポジトリをフォークします
- 機能ブランチを作成します(
git checkout -b feature/cool-new-feature) - 変更を加えます
- 十分にテストします
- 変更をコミットします(
git commit -am 'Add cool new feature') - ブランチにプッシュします(
git push origin feature/cool-new-feature) - プルリクエストを作成します
コードが Go の規約に従い、適切なエラー処理を含んでいることを確認してください。
ライセンス
このプロジェクトは MIT License のもとで公開されています。詳細については LICENSE ファイルを参照してください。
タグ
#mcp #postgresql #golang #ai #database #model-context-protocol #sql #gorm #claude #assistant #server #api #data #query #secure #open-source
ご質問はありますか? GitHub でイシューを作成するか、ディスカッションを開始してください。サポートいたします。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。