Skip to main content
Glama

PostgreSQL MCP Server

MIT License
16,948
17
  • Apple

PostgreSQL MCP サーバー

PostgreSQLデータベースへのアクセスを提供するモデルコンテキストプロトコル(MCP)サーバーです。このサーバーにより、LLMはデータベースと対話してスキーマの検査、クエリの実行、データベースエントリに対するCRUD(作成、読み取り、更新、削除)操作を実行できます。このリポジトリはPostgreSQL MCPサーバーの拡張機能であり、テーブルの作成、エントリの挿入、エントリの更新、エントリの削除、テーブルの削除などの機能を提供します。

インストール

PostgreSQL MCP サーバーをインストールするには、次の手順に従います。

  1. DockerとClaude Desktopをインストールする
  2. リポジトリをクローンします: git clone https://github.com/vignesh-codes/ai-agents-mcp-pg.git
  3. PG Docker コンテナを実行しますdocker run --name postgres-container -e POSTGRES_USER=admin -e POSTGRES_PASSWORD=admin_password -e POSTGRES_DB=mydatabase -p 5432:5432 -d postgres:latest
  4. mcp サーバーをビルドします: docker build -t mcp/postgres -f src/Dockerfile .
  5. Claude Desktop を開き、 claude_desktop_config.jsonmcpServersフィールドを更新して MCP サーバーに接続します。

Claude Desktopでの使用

このサーバーを Claude Desktop アプリで使用するには、 claude_desktop_config.jsonの「mcpServers」セクションに次の構成を追加します。

ドッカー

  • macOS 上で Docker を実行する場合、サーバーがホスト ネットワーク (例: localhost) 上で実行されている場合は、 host.docker.internalを使用します。
  • ユーザー名/パスワードはpostgresql://user:password@host:port/db-nameを使用して PostgreSQL URL に追加できます。
{ "mcpServers": { "postgres": { "command": "docker", "args": [ "run", "-i", "--rm", "mcp/postgres", "postgresql://username:password@host.docker.internal:5432/mydatabase" ] } } }

設定ファイルを更新した後は、必ず claude デスクトップ アプリを再起動してください。

追加された機能

既存の機能

  • クエリ
    • 接続されたデータベースに対して読み取り専用の SQL クエリを実行します。
    • 入力: sql (文字列): 実行する SQL クエリ。
    • すべてのクエリは読み取り専用トランザクション内で実行されます。

新しい機能

  1. テーブルを作成する
    • テーブル名と列定義を指定して、新しいテーブルを動的に作成する機能。
    • Claude Desktop からの入力:
      { "tableName": "example_table", "columns": [ { "name": "id", "type": "SERIAL PRIMARY KEY" }, { "name": "name", "type": "VARCHAR(255)" }, { "name": "age", "type": "INTEGER" } ] }
  2. エントリを挿入
    • 指定されたテーブルに新しいエントリを挿入します。
    • Claude Desktop からの入力:
      { "tableName": "example_table", "values": { "name": "John Doe", "age": 30 } }
  3. エントリの更新
    • 条件に基づいてテーブル内の既存のエントリを更新します。
    • Claude Desktop からの入力:
      { "tableName": "example_table", "values": { "age": 35 }, "conditions": "name = 'John Doe'" }
  4. エントリを削除
    • 条件に基づいてテーブル内の特定のエントリを削除します。
    • Claude Desktop からの入力:
      { "tableName": "example_table", "conditions": "name = 'John Doe'" }
  5. テーブルの削除
    • データベースから既存のテーブルを削除します。
    • Claude Desktop からの入力:
      { "tableName": "example_table" }

リソース

サーバーは、データベース内の各テーブルのスキーマ情報を提供します。

  • テーブルスキーマ( postgres://<host>/<table>/schema )
    • 各テーブルの JSON スキーマ情報。
    • 列名とデータ型が含まれます。
    • データベース メタデータから自動的に検出されます。

サンプル

Claudeデスクトップへの入力

lets create three tables - users, payments and orders tables. Each table must have a unique id and other required columns. Payments table must have user id as foreign key. Orders table must have payment id as foreign key. Add some sample data to these tables

Claude Desktopからの出力

I'll help you create these three interconnected tables and populate them with sample data. Let's create them one by one. 1. First, let's create the users table: { `columns`: [ { `name`: `id`, `type`: `INTEGER PRIMARY KEY` }, { `name`: `name`, `type`: `TEXT` }, { `name`: `email`, `type`: `TEXT` }, { `name`: `created_at`, `type`: `TEXT` } ], `tableName`: `users` } 2. Now, let's create the payments table with a foreign key reference to users: { `columns`: [ { `name`: `id`, `type`: `INTEGER PRIMARY KEY` }, { `name`: `user_id`, `type`: `INTEGER` }, { `name`: `amount`, `type`: `REAL` }, { `name`: `status`, `type`: `TEXT` }, { `name`: `payment_date`, `type`: `TEXT` } ], `tableName`: `payments` } 3. Finally, let's create the orders table with a foreign key reference to payments: { `columns`: [ { `name`: `id`, `type`: `INTEGER PRIMARY KEY` }, { `name`: `payment_id`, `type`: `INTEGER` }, { `name`: `product_name`, `type`: `TEXT` }, { `name`: `quantity`, `type`: `INTEGER` }, { `name`: `order_date`, `type`: `TEXT` } ], `tableName`: `orders` } Now, let's add some sample data to these tables. First, let's add some users: { `values`: { `id`: `1`, `name`: `John Doe`, `email`: `john@example.com`, `created_at`: `2024-01-01` }, `tableName`: `users` } { `values`: { `id`: `2`, `name`: `Jane Smith`, `email`: `jane@example.com`, `created_at`: `2024-01-05` }, `tableName`: `users` } Now, let's add some payments for these users: { `values`: { `id`: `1`, `amount`: `99.99`, `status`: `completed`, `user_id`: `1`, `payment_date`: `2024-01-10` }, `tableName`: `payments` } { `values`: { `id`: `2`, `amount`: `149.99`, `status`: `completed`, `user_id`: `2`, `payment_date`: `2024-01-12` }, `tableName`: `payments` } Finally, let's add some orders linked to these payments: { `values`: { `id`: `1`, `quantity`: `1`, `order_date`: `2024-01-10`, `payment_id`: `1`, `product_name`: `Laptop` }, `tableName`: `orders` } { `values`: { `id`: `2`, `quantity`: `2`, `order_date`: `2024-01-12`, `payment_id`: `2`, `product_name`: `Smartphone` }, `tableName`: `orders` } Let's verify the data by querying each table: { `sql`: `SELECT * FROM users;` } { `sql`: `SELECT * FROM payments;` } { `sql`: `SELECT * FROM orders;` } Great! We have now created three interconnected tables with sample data. Here's a summary of what we've set up: 1. Users table with basic user information 2. Payments table linked to users through user_id 3. Orders table linked to payments through payment_id The data shows two users who have each made one payment and placed one order. We can now perform various queries to analyze the relationships between these tables. Would you like to see any specific queries or add more data?

Claudeデスクトップへの入力

add few more users with IN_PROGRESS and UNSUCCESSFUL payment status

Claude Desktopからの出力

I'll add a few more users with different payment statuses. First, let's add new users: { `values`: { `id`: `3`, `name`: `Mike Johnson`, `email`: `mike@example.com`, `created_at`: `2024-01-08` }, `tableName`: `users` } { `values`: { `id`: `4`, `name`: `Sarah Wilson`, `email`: `sarah@example.com`, `created_at`: `2024-01-09` }, `tableName`: `users` } { `values`: { `id`: `5`, `name`: `Tom Brown`, `email`: `tom@example.com`, `created_at`: `2024-01-11` }, `tableName`: `users` } Now, let's add payments with IN_PROGRESS and UNSUCCESSFUL statuses for these users: { `values`: { `id`: `3`, `amount`: `299.99`, `status`: `IN_PROGRESS`, `user_id`: `3`, `payment_date`: `2024-01-13` }, `tableName`: `payments` } { `values`: { `id`: `4`, `amount`: `199.99`, `status`: `UNSUCCESSFUL`, `user_id`: `4`, `payment_date`: `2024-01-13` }, `tableName`: `payments` } { `values`: { `id`: `4`, `amount`: `199.99`, `status`: `UNSUCCESSFUL`, `user_id`: `4`, `payment_date`: `2024-01-13` }, `tableName`: `payments` } { `values`: { `id`: `5`, `amount`: `399.99`, `status`: `IN_PROGRESS`, `user_id`: `5`, `payment_date`: `2024-01-13` }, `tableName`: `payments` } Let's add orders for the IN_PROGRESS payments (note that we won't add orders for the UNSUCCESSFUL payment): { `values`: { `id`: `3`, `quantity`: `1`, `order_date`: `2024-01-13`, `payment_id`: `3`, `product_name`: `Gaming Console` }, `tableName`: `orders` } { `values`: { `id`: `4`, `quantity`: `1`, `order_date`: `2024-01-13`, `payment_id`: `5`, `product_name`: `4K TV` }, `tableName`: `orders` } Let's verify the data by checking all payments with their status: { `sql`: `SELECT u.name, p.amount, p.status, p.payment_date FROM users u JOIN payments p ON u.id = p.user_id ORDER BY p.payment_date;` } Now we have a good mix of payment statuses in our database: - 2 completed payments (John and Jane) - 2 in-progress payments (Mike and Tom) - 1 unsuccessful payment (Sarah) The orders table only contains entries for completed and in-progress payments, as it makes sense not to create orders for unsuccessful payments. Would you like to see any specific queries or add more data?

Claudeデスクトップへの入力

Fetch the users info who have IN_PROGRESS payment status

Claude Desktopからの出力

I'll write a query to fetch user information for those who have payments with IN_PROGRESS status. { `sql`: ` SELECT u.*, p.amount, p.payment_date FROM users u JOIN payments p ON u.id = p.user_id WHERE p.status = 'IN_PROGRESS' ORDER BY u.id; ` } We can see that two users have payments in progress: 1. Mike Johnson (attempting to pay $299.99) 2. Tom Brown (attempting to pay $399.99) Both payments were initiated on January 13, 2024. Would you like to see any additional information about these users or their orders?

Claudeデスクトップへの入力

Lets update the payment status to completed for Mike Johnson

Claude Desktopからの出力

I'll update Mike Johnson's payment status from IN_PROGRESS to completed. { `values`: { `status`: `completed` }, `tableName`: `payments`, `conditions`: { `user_id`: `3` } } Let's verify the update by checking all payments again: { `sql`: ` SELECT u.name, p.amount, p.status, p.payment_date FROM users u JOIN payments p ON u.id = p.user_id ORDER BY p.status, p.payment_date; ` } The update was successful. Now we have: - 3 completed payments (John, Jane, and Mike) - 1 in-progress payment (Tom) - 1 unsuccessful payment (Sarah) Would you like to make any other updates to the data?

DBエントリ

mydatabase=# SELECT * FROM users; id | name | email | created_at ----+--------------+-------------------+------------ 1 | John Doe | john@example.com | 2024-01-01 2 | Jane Smith | jane@example.com | 2024-01-05 3 | Mike Johnson | mike@example.com | 2024-01-08 4 | Sarah Wilson | sarah@example.com | 2024-01-09 5 | Tom Brown | tom@example.com | 2024-01-11 (5 rows) mydatabase=# SELECT * FROM payments; id | user_id | amount | status | payment_date ----+---------+--------+--------------+-------------- 1 | 1 | 99.99 | completed | 2024-01-10 2 | 2 | 149.99 | completed | 2024-01-12 4 | 4 | 199.99 | UNSUCCESSFUL | 2024-01-13 5 | 5 | 399.99 | IN_PROGRESS | 2024-01-13 3 | 3 | 299.99 | completed | 2024-01-13 (5 rows) mydatabase=# SELECT * FROM orders; id | payment_id | product_name | quantity | order_date ----+------------+----------------+----------+------------ 1 | 1 | Laptop | 1 | 2024-01-10 2 | 2 | Smartphone | 2 | 2024-01-12 3 | 3 | Gaming Console | 1 | 2024-01-13 4 | 5 | 4K TV | 1 | 2024-01-13 (4 rows)

ライセンス

このMCPサーバーはMITライセンスに基づいてライセンスされています。つまり、MITライセンスの条件に従って、ソフトウェアを自由に使用、改変、配布することができます。詳細については、プロジェクトリポジトリのLICENSEファイルをご覧ください。

-
security - not tested
A
license - permissive license
-
quality - not tested

hybrid server

The server is able to function both locally and remotely, depending on the configuration or use case.

スキーマを検査し、クエリを実行するために、LLM に PostgreSQL データベースへの読み取り専用アクセスを提供するモデル コンテキスト プロトコル サーバー。

  1. インストール
    1. Claude Desktopでの使用
    2. 追加された機能
    3. サンプル
    4. DBエントリ
    5. ライセンス

Related MCP Servers

  • -
    security
    A
    license
    -
    quality
    A Model Context Protocol server that provides read-only access to PostgreSQL databases with enhanced multi-schema support, allowing LLMs to inspect database schemas across multiple namespaces and execute read-only queries while maintaining schema isolation.
    Last updated -
    13
    2
    JavaScript
    MIT License
  • -
    security
    F
    license
    -
    quality
    A Model Context Protocol server providing both read and write access to PostgreSQL databases, enabling LLMs to query data, modify records, and manage database schemas.
    Last updated -
    4
    JavaScript
  • -
    security
    F
    license
    -
    quality
    A Model Context Protocol server that enables interaction with PostgreSQL databases to list tables, retrieve schemas, and execute read-only SQL queries.
    Last updated -
    16,948
    JavaScript
    • Linux
    • Apple
  • -
    security
    F
    license
    -
    quality
    A Model Context Protocol server that provides LLMs with full read-write access to PostgreSQL databases, allowing both querying and modifying database content with transaction management and safety controls.
    Last updated -
    84
    7
    TypeScript
    • Apple

View all related MCP servers

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/vignesh-codes/ai-agents-mcp-pg'

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