关于 PostgreSQL MCP Server
这是一个 Go 编写的 PostgreSQL MCP 服务,供 AI 助手通过标准化接口读取和管理数据库。它按操作类型区分查询、DDL 和数据修改,并对 SQL 进行校验以限制危险操作。
主要功能
- 01执行 SELECT 查询
- 02创建或修改数据库结构
- 03插入、更新和删除记录
- 04按工具类型校验 SQL
- 05阻止危险管理操作
- 06支持 PostgreSQL SSL 连接
适用场景
- 01查询业务数据并生成分析
- 02查看用户或库存情况
- 03调整表结构与数据记录
MCP 相关
服务通过 MCP 向客户端提供 execute_query、ddl_query 和 modify_query 工具,分别用于读取、结构管理和数据修改。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
PostgreSQL MCP 服务
作者:Swan Htet Aung Phyo
AGH 计算机科学专业学生(后端开发者)
一个安全高效的 MCP 服务,可让 AI 助手通过简洁、标准化的接口与 PostgreSQL 数据库交互。
是否曾希望让 AI 助手查询数据库,同时不用担心安全问题?这个 MCP 服务正是你需要的。它为 AI 模型提供了与 PostgreSQL 数据库交互的安全方式,同时保护你的数据。
这是什么?
模型上下文协议(MCP)正在成为 AI 助手连接外部数据源的标准方式。此服务专为 PostgreSQL 数据库实现了 MCP,提供三种主要功能:
- 查询数据 - 让 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
就是这样!你的服务应该已经运行并准备好接受连接。
使用方法
该服务提供三种主要工具,分别用于特定类型的数据库操作:
读取数据(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 等命令及其他管理功能会被完全阻止。
连接安全:使用标准 PostgreSQL 连接安全机制,包括 SSL 支持。
输入清理:所有查询都会通过 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 统计信息为最新
贡献
发现错误或想添加功能?欢迎贡献!操作步骤如下:
- Fork 此仓库
- 创建功能分支(
git checkout -b feature/cool-new-feature) - 修改代码
- 充分测试
- 提交修改(
git commit -am 'Add cool new feature') - 推送到分支(
git push origin feature/cool-new-feature) - 创建 Pull Request
请确保代码遵循 Go 规范,并包含适当的错误处理。
许可证
本项目采用 MIT License 发布。详情请参阅 LICENSE 文件。
标签
#mcp #postgresql #golang #ai #database #model-context-protocol #sql #gorm #claude #assistant #server #api #data #query #secure #open-source
有疑问? 请在 GitHub 上提交 issue 或发起讨论。我们很乐意提供帮助!
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。