PostgreSQL MCP服务器

一个安全高效的MCP服务器,通过标准化接口让AI助手与PostgreSQL数据库交互,支持查询、模式管理和数据更新。

  • by SwanHtetAungPhyo
  • Go
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 swanhtetaungphyo/postgres-mcp-server

使用说明

PostgreSQL MCP服务器

作者:Swan Htet Aung Phyo

AGH计算机科学专业学生(后端开发人员)

一个安全高效的MCP服务器,让AI助手通过一个干净、标准化的界面与PostgreSQL数据库进行交互。

你有没有想过让你的人工智能助手能够查询你的数据库,而不用担心安全问题?这个MCP服务器正是您所需要的。它为AI模型提供了一种安全的方式与PostgreSQL数据库交互,同时保证数据的安全。

这是怎么回事?

模型上下文协议(MCP)正在成为人工智能助手与外部数据源连接的标准方式。此服务器专门为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', 'alice@example.com', 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_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统计数据最新

贡献

发现错误或想添加功能?欢迎投稿!方法如下:

  1. 分叉存储库
  2. 创建要素分支(git checkout -b feature/cool-new-feature)
  3. 进行更改
  4. 彻底测试
  5. 提交您的更改(git commit -am 'Add cool new feature')
  6. 推到分支(git push origin feature/cool-new-feature)
  7. 创建拉取请求

请确保您的代码遵循Go惯例,并包含适当的错误处理。

许可证

该项目在MIT许可证下发布。有关详细信息,请参阅LICENSE文件。

标签

#mcp #postgresql #golang #ai #database #model-context-protocol #sql #gorm #claude #assistant #server #api #data #query #secure #open-source


问题? 在GitHub上打开一个问题或开始讨论。我们是来帮忙的!