返回市场
ai代理mcp数据库

ai代理mcp数据库

作者:vignesh-codes25 星标更新:2025-04-22

项目介绍

PostgreSQL MCP 服务器

这是一个提供对 PostgreSQL 数据库访问的 Model Context Protocol 服务器。该服务器使 LLM 能够与数据库交互,检查模式、执行查询,并对数据库条目执行 CRUD(创建、读取、更新、删除)操作。此仓库是 PostgreSQL MCP 服务器 的扩展,提供了创建表、插入条目、更新条目、删除条目和删除表的功能。

安装

要安装 PostgreSQL MCP 服务器,请按照以下步骤操作:

  1. 安装 Docker 和 Claude Desktop。
  2. 克隆仓库:git clone https://github.com/vignesh-codes/ai-agents-mcp-pg.git
  3. 运行 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
  4. 构建 mcp 服务器:docker build -t mcp/postgres -f src/Dockerfile .
  5. 打开 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 事务中执行。

新功能

  1. 创建表

    • 提供表名和列定义动态创建新表的能力。
    • 从 Claude Desktop 输入:
      {
        "tableName": "example_table",
        "columns": [
          { "name": "id", "type": "SERIAL PRIMARY KEY" },
          { "name": "name", "type": "VARCHAR(255)" },
          { "name": "age", "type": "INTEGER" }
        ]
      }
      
  2. 插入条目

    • 向指定表中插入新的条目。
    • 从 Claude Desktop 输入:
      {
        "tableName": "example_table",
        "values": {
          "name": "John Doe",
          "age": 30
        }
      }
      
  3. 更新条目

    • 根据条件更新表中的现有条目。
    • 从 Claude Desktop 输入:
      {
        "tableName": "example_table",
        "values": {
          "age": 35
        },
        "conditions": "name = 'John Doe'"
      }
      
  4. 删除条目

    • 根据条件删除表中的特定条目。
    • 从 Claude Desktop 输入:
      {
        "tableName": "example_table",
        "conditions": "name = 'John Doe'"
      }
      
  5. 删除表

    • 从数据库中删除现有表。
    • 从 Claude Desktop 输入:
      {
        "tableName": "example_table"
      }
      

资源

服务器提供数据库中每个表的模式信息:

  • 表模式 (postgres://<host>/<table>/schema)
    • 每个表的 JSON 模式信息。
    • 包括列名和数据类型。
    • 自动从数据库元数据中发现。

示例

输入到 Claude Desktop

让我们创建三个表 - 用户、支付和订单表。每个表必须有一个唯一的 ID 和其他所需列。支付表必须有用户 ID 作为外键。订单表必须有支付 ID 作为外键。向这些表添加一些示例数据。

输出自 Claude Desktop

我将帮助您创建这三个相互关联的表并填充它们的示例数据。我们一次一个地创建它们。



1. 首先,让我们创建用户表:
{
  `columns`: [
    {
      `name`: `id`,
      `type`: `INTEGER PRIMARY KEY`
    },
    {
      `name`: `name`,
      `type`: `TEXT`
    },
    {
      `name`: `email`,
      `type`: `TEXT`
    },
    {
      `name`: `created_at`,
      `type`: `TEXT`
    }
  ],
  `tableName`: `users`
}

2. 接下来,让我们创建带有对外键引用用户的支付表:
{
  `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. 最后,让我们创建带有对外键引用支付的订单表:
{
  `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 文件。