
PostgreSQL MCP Server
一个模型上下文协议服务器,为大型语言模型提供对 PostgreSQL 数据库的只读访问权限,以便检查模式和执行查询。
README
PostgreSQL MCP 服务器
一个模型上下文协议服务器,提供对 PostgreSQL 数据库的访问。该服务器使 LLM 能够与数据库交互,以检查模式、执行查询以及对数据库条目执行 CRUD(创建、读取、更新、删除)操作。此 repo 是 PostgreSQL MCP 服务器 的扩展,提供创建表、插入条目、更新条目、删除条目和删除表的功能。
安装
要安装 PostgreSQL MCP 服务器,请按照以下步骤操作:
- 安装 Docker 和 Claude Desktop
- 克隆存储库:
git clone https://github.com/vignesh-codes/ai-agents-mcp-pg.git
- 运行 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
- 构建 mcp 服务器:
docker build -t mcp/postgres -f src/Dockerfile .
- 打开 Claude Desktop 并通过更新
claude_desktop_config.json
中的mcpServers
字段来连接到 MCP 服务器:
与 Claude Desktop 一起使用
要将此服务器与 Claude Desktop 应用程序一起使用,请将以下配置添加到 claude_desktop_config.json
的 "mcpServers" 部分:
Docker
- 在 macOS 上运行 Docker 时,如果服务器在主机网络(例如,localhost)上运行,请使用
host.docker.internal
。 - 用户名/密码可以添加到 PostgreSQL URL 中,格式为
postgresql://user:password@host:port/db-name
。
{
"mcpServers": {
"postgres": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"mcp/postgres",
"postgresql://username:password@host.docker.internal:5432/mydatabase"
]
}
}
}
更新配置文件后,请务必重启 Claude Desktop 应用程序。
添加的功能
现有功能
- query
- 对连接的数据库执行只读 SQL 查询。
- 输入:
sql
(字符串):要执行的 SQL 查询。 - 所有查询都在 READ-ONLY 事务中执行。
新功能
-
创建表
- 能够通过提供表名和列定义来动态创建新表。
- 来自 Claude Desktop 的输入:
{ "tableName": "example_table", "columns": [ { "name": "id", "type": "SERIAL PRIMARY KEY" }, { "name": "name", "type": "VARCHAR(255)" }, { "name": "age", "type": "INTEGER" } ] }
-
插入条目
- 将新条目插入到指定的表中。
- 来自 Claude Desktop 的输入:
{ "tableName": "example_table", "values": { "name": "John Doe", "age": 30 } }
-
更新条目
- 根据条件更新表中现有的条目。
- 来自 Claude Desktop 的输入:
{ "tableName": "example_table", "values": { "age": 35 }, "conditions": "name = 'John Doe'" }
-
删除条目
- 根据条件删除表中特定的条目。
- 来自 Claude Desktop 的输入:
{ "tableName": "example_table", "conditions": "name = 'John Doe'" }
-
删除表
- 从数据库中删除现有的表。
- 来自 Claude Desktop 的输入:
{ "tableName": "example_table" }
资源
服务器提供数据库中每个表的模式信息:
- 表模式 (
postgres://<host>/<table>/schema
)- 每个表的 JSON 模式信息。
- 包括列名和数据类型。
- 自动从数据库元数据中发现。
示例
输入到 Claude Desktop
让我们创建三个表 - users、payments 和 orders 表。每个表必须有一个唯一的 id 和其他必需的列。Payments 表必须有 user id 作为外键。Orders 表必须有 payment id 作为外键。向这些表添加一些示例数据
来自 Claude Desktop 的输出
我将帮助你创建这三个相互连接的表,并用示例数据填充它们。让我们一个一个地创建它们。
1. 首先,让我们创建 users 表:
{
`columns`: [
{
`name`: `id`,
`type`: `INTEGER PRIMARY KEY`
},
{
`name`: `name`,
`type`: `TEXT`
},
{
`name`: `email`,
`type`: `TEXT`
},
{
`name`: `created_at`,
`type`: `TEXT`
}
],
`tableName`: `users`
}
2. 现在,让我们创建 payments 表,其中包含对 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. 最后,让我们创建 orders 表,其中包含对 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`
}
现在,让我们向这些表添加一些示例数据。
首先,让我们添加一些用户:
{
`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`
}
现在,让我们为这些用户添加一些付款:
{
`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`
}
最后,让我们添加一些链接到这些付款的订单:
{
`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`
}
让我们通过查询每个表来验证数据:
{
`sql`: `SELECT * FROM users;`
}
{
`sql`: `SELECT * FROM payments;`
}
{
`sql`: `SELECT * FROM orders;`
}
太棒了!我们现在已经创建了三个相互连接的表,其中包含示例数据。以下是我们设置内容的摘要:
1. 包含基本用户信息的用户表
2. 通过 user_id 链接到用户的付款表
3. 通过 payment_id 链接到付款的订单表
数据显示有两个用户各自进行了一次付款并下了一个订单。我们现在可以执行各种查询来分析这些表之间的关系。你想查看任何特定查询或添加更多数据吗?
输入到 Claude Desktop
添加更多具有 IN_PROGRESS 和 UNSUCCESSFUL 付款状态的用户
来自 Claude Desktop 的输出
我将添加更多具有不同付款状态的用户。
首先,让我们添加新用户:
{
`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`
}
现在,让我们为这些用户添加具有 IN_PROGRESS 和 UNSUCCESSFUL 状态的付款:
{
`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`
}
让我们为 IN_PROGRESS 付款添加订单(请注意,我们不会为 UNSUCCESSFUL 付款添加订单):
{
`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`
}
让我们通过检查所有付款及其状态来验证数据:
{
`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;`
}
现在我们的数据库中有了各种付款状态:
- 2 笔已完成的付款(John 和 Jane)
- 2 笔进行中的付款(Mike 和 Tom)
- 1 笔不成功的付款(Sarah)
订单表仅包含已完成和进行中付款的条目,因为不为不成功的付款创建订单是有意义的。你想查看任何特定查询或添加更多数据吗?
输入到 Claude Desktop
获取具有 IN_PROGRESS 付款状态的用户的用户信息
来自 Claude Desktop 的输出
我将编写一个查询来获取那些具有 IN_PROGRESS 状态付款的用户的用户信息。
{
`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;
`
}
我们可以看到有两个用户的付款正在进行中:
1. Mike Johnson(尝试支付 $299.99)
2. Tom Brown(尝试支付 $399.99)
这两笔付款都是在 2024 年 1 月 13 日发起的。你想查看有关这些用户或其订单的任何其他信息吗?
输入到 Claude Desktop
让我们将 Mike Johnson 的付款状态更新为已完成
来自 Claude Desktop 的输出
我将 Mike Johnson 的付款状态从 IN_PROGRESS 更新为已完成。
{
`values`: {
`status`: `completed`
},
`tableName`: `payments`,
`conditions`: {
`user_id`: `3`
}
}
让我们通过再次检查所有付款来验证更新:
{
`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;
`
}
更新成功。现在我们有:
- 3 笔已完成的付款(John、Jane 和 Mike)
- 1 笔进行中的付款(Tom)
- 1 笔不成功的付款(Sarah)
你想对数据进行任何其他更新吗?
数据库条目
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 文件。
推荐服务器

Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。