# MCP Server for PostgreSQL

这是一个基于Node.js的MCP（Model Context Protocol）服务器，用于与PostgreSQL数据库交互。它允许AI模型通过MCP协议查询和操作PostgreSQL数据库。

## 功能特点

- 支持基本的SQL查询操作
- 可配置的写操作权限（INSERT、UPDATE、DELETE、DDL）
- 多数据库模式支持
- 基于模式的细粒度权限控制
- 安全的事务管理
- 查询结果以JSON格式返回

## 安装

```bash
# 全局安装
npm install -g @kohlarnhin/mcp-server-postgres

# 本地安装
npm install @kohlarnhin/mcp-server-postgres
```

## 配置

环境变量可以通过`.env`文件或直接在运行环境中设置：

```
POSTGRES_HOST=127.0.0.1
POSTGRES_PORT=5432
POSTGRES_USER=postgres
POSTGRES_PASS=your_password
POSTGRES_DB=your_database

# 日志设置
ENABLE_LOGGING=true

# 写操作权限（全局）
ALLOW_INSERT_OPERATION=true
ALLOW_UPDATE_OPERATION=true
ALLOW_DELETE_OPERATION=false
ALLOW_DDL_OPERATION=false

# 基于特定模式的权限（可选）
# 格式: "schema1:true,schema2:false"
SCHEMA_INSERT_PERMISSIONS="public:true,private:false"
SCHEMA_UPDATE_PERMISSIONS="public:true,private:false"
SCHEMA_DELETE_PERMISSIONS="public:false,private:false"
SCHEMA_DDL_PERMISSIONS="public:false,private:false"

# 多数据库模式（可选）
# 当POSTGRES_DB为空时启用
MULTI_DB_WRITE_MODE=false
```

## 使用方法

### 本地开发

```bash
npm run dev
```

### 生产环境

```bash
npm run build
npm start
```

### 以stdio模式运行（用于MCP集成）

```bash
npm run stdio
```

## MCP集成

在`~/.cursor/mcp.json`中添加以下配置，将其集成到支持MCP的环境中：

```json
{
  "mcpServers": {
    "Postgres": {
      "command": "npx",
      "args": [
        "mcprunner",
        "POSTGRES_HOST=127.0.0.1",
        "POSTGRES_PORT=5432",
        "POSTGRES_USER=postgres",
        "POSTGRES_PASS=123456",
        "POSTGRES_DB=your_database",
        "ALLOW_INSERT_OPERATION=true",
        "ALLOW_UPDATE_OPERATION=true",
        "ALLOW_DELETE_OPERATION=false",
        "--",
        "npx",
        "-y",
        "@kohlarnhin/mcp-server-postgres"
      ]
    }
  }
}
```

## 查询示例

通过MCP协议，可以执行如下SQL查询：

```sql
-- 查询表列表
SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'

-- 查询特定表的结构
SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'your_table' AND table_schema = 'public'

-- 查询数据
SELECT * FROM your_table WHERE condition

-- 插入数据（如果启用了INSERT权限）
INSERT INTO your_table (column1, column2) VALUES ('value1', 'value2')

-- 更新数据（如果启用了UPDATE权限）
UPDATE your_table SET column1 = 'new_value' WHERE condition

-- 删除数据（如果启用了DELETE权限）
DELETE FROM your_table WHERE condition

-- DDL操作（如果启用了DDL权限）
CREATE TABLE new_table (id SERIAL PRIMARY KEY, name VARCHAR(100))
```

## 许可证

MIT 