MCP PostgreSQL 增强版
一种增强的模型上下文协议服务器,使大型语言模型能够检查带有丰富元数据的数据库模式,并执行带有安全检查的只读SQL查询。
MCP 服务配置
复制以下 JSON 到 OPClaw 或其他 MCP 客户端的配置文件中即可使用
{
"mcpServers": {
"postgres-full": {
"args": [
"-y",
"mcp-postgres-full-access",
"postgresql://username:password@localhost:5432/database"
],
"command": "npx",
"env": {
"MAX_CONCURRENT_TRANSACTIONS": "5",
"PG_STATEMENT_TIMEOUT_MS": "30000",
"TRANSACTION_TIMEOUT_MS": "60000"
}
}
}
}
该服务需要配置环境变量:DATABASE_URL
服务介绍
PostgreSQL 全访问 MCP 服务器
这是一个强大的 Model Context Protocol 服务器,提供对 PostgreSQL 数据库的完全读写访问。与官方的只读 MCP PostgreSQL 服务器不同,这个增强的实现允许大型语言模型(LLMs)在适当的事务管理和安全控制下查询和修改数据库内容。
目录
🌟 特性
完全读写访问
- 安全执行 DML 操作 (INSERT, UPDATE, DELETE)
- 使用 DDL 创建、修改和管理数据库对象
- 显式提交的事务管理
- 安全超时和自动回滚保护
丰富的模式信息
- 详细的列元数据(数据类型、描述、最大长度、是否可为空)
- 主键标识
- 外键关系
- 带有类型和唯一性标志的索引信息
- 表行数估算
- 表和列的描述(如果可用)
高级安全控制
- SQL 查询分类 (DQL, DML, DDL, DCL, TCL)
- 对安全查询强制执行只读执行
- 所有操作都在隔离的事务中运行
- 自动事务超时监控
- 可配置的安全限制
- 两步事务提交过程,需要明确的用户确认
🔧 工具
-
execute_query
- 执行只读 SQL 查询(SELECT 语句)
- 输入:
sql(字符串): 要执行的 SQL 查询 - 所有查询都在一个只读事务中执行
- 结果包括执行时间指标和字段信息
-
execute_dml_ddl_dcl_tcl
- 执行数据修改操作(INSERT, UPDATE, DELETE)或模式更改(CREATE, ALTER, DROP)
- 输入:
sql(字符串): 要执行的 SQL 语句 - 自动包装在一个可配置超时的事务中
- 返回一个事务 ID 以便显式提交
- 重要安全特性: 执行后会话将结束,允许用户在决定提交或回滚之前审查结果
-
execute_commit
- 通过其 ID 显式提交一个事务
- 输入:
transaction_id(字符串): 要提交的事务的 ID - 提交或回滚后安全地处理清理工作
- 永久性地将更改应用到数据库
-
execute_rollback
- 通过其 ID 显式回滚一个事务
- 输入:
transaction_id(字符串): 要回滚的事务的 ID - 安全地丢弃所有更改并清理资源
- 在审查更改并决定不应用它们时非常有用
-
list_tables
- 获取数据库中所有表的全面列表
- 包括列数和表描述
- 不需要输入参数
-
describe_table
- 获取特定表结构的详细信息
- 输入:
table_name(字符串): 要描述的表的名称 - 返回完整的模式信息,包括主键、外键、索引和列详情
📊 资源
服务器为数据库表提供增强的模式信息:
- 表模式 (
postgres://<host>/<table>/schema)- 每个表的详细 JSON 模式信息
- 包括完整的列元数据、主键和约束
- 从数据库元数据中自动发现
🚀 与 Claude Desktop 配合使用
Claude Desktop 集成
要将此服务器与 Claude Desktop 一起使用,请按照以下步骤操作:
-
首先,确保您的系统上已安装 Node.js
-
使用 npx 或将其添加到项目中来安装包
-
通过编辑
claude_desktop_config.json(通常在 macOS 上位于~/Library/Application Support/Claude/)来配置 Claude Desktop:
{
"mcpServers": {
"postgres-full": {
"command": "npx",
"args": [
"-y",
"mcp-postgres-full-access",
"postgresql://username:password@localhost:5432/database"
],
"env": {
"TRANSACTION_TIMEOUT_MS": "60000",
"MAX_CONCURRENT_TRANSACTIONS": "5",
"PG_STATEMENT_TIMEOUT_MS": "30000"
}
}
}
}
- 将数据库连接字符串替换为实际的 PostgreSQL 连接详情
- 完全重启 Claude Desktop
重要:使用“允许一次”以保证安全
当 Claude 尝试向您的数据库提交更改时,Claude Desktop 会提示您批准:

在批准之前始终仔细审查 SQL 更改!
安全的最佳实践:
- 始终点击“允许一次”(而不是“始终允许”)来进行提交操作
- 在批准前仔细审查事务 SQL
- 考虑使用权限有限的数据库用户
- 如果可能,在首次尝试此服务器时使用测试数据库
这种“允许一次”的方法使您能够完全控制,以防止对数据库进行不必要的更改,同时在需要时仍能让 Claude 帮助进行数据管理任务。
⚙️ 环境变量
您可以使用 Claude Desktop 配置中的环境变量来自定义服务器行为:
"env": {
"TRANSACTION_TIMEOUT_MS": "60000",
"MAX_CONCURRENT_TRANSACTIONS": "5"
}
关键环境变量:
-
TRANSACTION_TIMEOUT_MS:事务超时时间(毫秒,默认值:15000)- 如果您的事务需要更多时间,请增加此值
- 超过此时间的事务将自动回滚以确保安全
-
MAX_CONCURRENT_TRANSACTIONS:最大并发事务数(默认值:10)- 降低此数字以进行更保守的操作
- 较高的值允许更多的同时写入操作
-
ENABLE_TRANSACTION_MONITOR:启用/禁用事务监视器("true" 或 "false",默认值:"true")- 监视并自动回滚被放弃的事务
- 通常不需要禁用
-
PG_STATEMENT_TIMEOUT_MS:SQL 查询执行超时时间(毫秒,默认值:30000)- 限制任何单个 SQL 语句可以运行的时间
- 重要的安全功能,以防止失控查询
-
PG_MAX_CONNECTIONS:最大 PostgreSQL 连接数(默认值:20)- 重要的是要保持在数据库连接限制内
-
MONITOR_INTERVAL_MS:检查卡住事务的频率(默认值:5000)- 通常不需要调整
🔄 使用 Claude 进行全数据库访问
此服务器使 Claude 能够在您的批准下从您的 PostgreSQL 数据库读取和写入数据。以下是一些示例对话流程:
示例:创建新表并添加数据
您:“我需要一个新产品表,包含 id、名称、价格和库存列”
Claude:分析您的数据库并创建查询
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL,
inventory INTEGER DEFAULT 0
);
Claude Desktop 将提示您批准此操作
您:审查并点击“允许一次”
Claude:“我已经创建了产品表。您是否希望我添加一些示例数据?”
您:“是的,请添加 5 个示例产品”
Claude:创建 INSERT 语句并提示批准
您审查并使用“允许一次”批准
示例:使用安全查询进行数据分析
您:“按价格排序,我的前三名产品是什么?”
Claude:自动执行只读查询
向您显示结果
安全流程
关键的安全特性是对任何修改数据库的操作采用两步法:
- Claude 分析您的请求并准备 SQL
- 对于只读操作(SELECT),Claude 会自动执行
- 对于写入操作(INSERT, UPDATE, DELETE, CREATE 等):
- Claude 在事务中执行 SQL 并结束对话
- 您审查结果
- 在新的对话中,您回复 "Yes" 提交或 "No" 回滚
- Claude Desktop 显示将要更改的具体内容并请求许可
- 您点击 "Allow once" 允许特定操作
- Claude 执行该操作并返回结果
这为您提供了多次机会在永久应用到数据库之前验证更改。
⚠️ 安全注意事项
当连接 Claude 到具有写入权限的数据库时:
数据库用户权限
重要: 创建一个具有适当权限的专用数据库用户:
-- Example of creating a restricted user (adjust as needed)
CREATE USER claude_user WITH PASSWORD 'secure_password';
GRANT SELECT ON ALL TABLES IN SCHEMA public TO claude_user;
GRANT INSERT, UPDATE, DELETE ON TABLE table1, table2 TO claude_user;
-- Only grant specific permissions as needed
安全使用最佳实践
-
始终使用 "Allow once" 来审查每个写入操作
- 永远不要选择 "Always allow" 进行数据库修改
- 花时间仔细检查 SQL
-
首次探索此工具时连接测试数据库
- 考虑使用数据库副本/备份进行初始测试
-
限制数据库用户权限 仅授予必要的权限
- 避免使用超级用户或管理员账户
- 尽可能授予表级别的权限
-
在广泛使用前实施数据库备份
-
永远不要共享不应暴露给 LLM 的敏感数据
-
在批准前验证所有 SQL 操作
- 检查表名
- 验证列名和数据
- 确认 WHERE 子句是否合适
- 查看是否有适当的事务处理
Docker
服务器可以很容易地在 Docker 容器中运行:
# Build the Docker image
docker build -t mcp-postgres-full-access .
# Run the container
docker run -i --rm mcp-postgres-full-access "postgresql://username:password@host:5432/database"
对于 macOS 上的 Docker,使用 host.docker.internal 连接到主机网络:
docker run -i --rm mcp-postgres-full-access "postgresql://username:password@host.docker.internal:5432/database"
📄 许可证
此 MCP 服务器根据 MIT 许可证授权。
💡 与官方 PostgreSQL MCP 服务器比较
| 功能 | 此服务器 | 官方 MCP PostgreSQL 服务器 |
|---|---|---|
| 读取访问 | ✅ | ✅ |
| 写入访问 | ✅ | ❌ |
| 模式详情 | 增强 | 基本 |
| 事务支持 | 显式带有超时 | 只读 |
| 索引信息 | ✅ | ❌ |
| 外键详情 | ✅ | ❌ |
| 行数估算 | ✅ | ❌ |
| 表描述 | ✅ | ❌ |
作者
由 Syahiid Nur Kamil (@syahiidkamil) 创建
版权所有 © 2024 Syahiid Nur Kamil。保留所有权利。