MCP:使用MCP访问PostgreSQL数据库

简介

上一篇文章《MCP: 什么是MCP》已经介绍了MCP的基本概念,下面来实操一个MCP服务的使用。

PostgreMCP 这个服务可以使大语言模型能够检查数据库模式并执行只读查询。下面开始实验一下。

环境准备

安装过程会自动从网络拉包,例如:

npx -y @modelcontextprotocol/server-postgres postgresql://username:password@IP:5432/dbname

如果使用的是docker也是同理,所以国内网络不好的话有可能一次装不成功,多试几次即可。

Windsurf

安装:Plugin Store / PostgreSQL / Install

配置:点击PostgreSQL,或者在对话框的MCP中找到PostgreSQL,点击Configure,粘贴配置(会自动生成)

{
  "mcpServers": {
    "postgresql": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-postgres",
        "postgresql://username:password@IP:5432/dbname"
      ],
      "env": {}
    }
  }
}

配置格式的说明来自于:https://github.com/modelcontextprotocol/servers-archived/tree/main/src/postgres

cursor

cursor用户可以在如下界面上安装: cursor / Setting / MCP / Add new global MCP Server 填写上面的json配置即可

使用方法

配置好Postgre MCP,就可以使用自然语言对PostgreSQL数据库进行查询操作了。

用法举例:询问系统登录情况

Prompt

帮我看下数据库记录,今天都有哪些用户登录了系统?

AI自动调用MCP执行数据库查询

我需要查找用户登录记录。首先,我需要找到存储登录记录的表。让我查询数据库中可能包含登录信息的表。

MCP Tool: postgresql / query
Ran with these arguments:
{
  "sql": "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND (table_name LIKE '%login%' OR table_name LIKE '%log%' OR table_name LIKE '%user%' OR table_name LIKE '%auth%');"
}

Output
[
  {
    "table_name": "log"
  },
  {
    "table_name": "user_role"
  },
  {
    "table_name": "user"
  }
]

我找到了几个可能包含登录信息的表:log、user_role 和 user。其中 log 表最可能包含登录记录,让我查询今天的登录记录。

首先,我需要查看 log 表的结构,以确定它包含哪些字段:

MCP Tool: postgresql / query
Ran with these arguments:
{
  "sql": "SELECT column_name FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'log';"
}

Output
[
  {
    "column_name": "log_id"
  },
  {
    "column_name": "log_title"
  },
  {
    "column_name": "log_content"
  },
  {
    "column_name": "log_type"
  },
  {
    "column_name": "created_at"
  },
  {
    "column_name": "log_user"
  },
  {
    "column_name": "log_ip"
  }
]

现在我了解了 log 表的结构,它包含了用户登录所需的字段,如 log_user(用户)、log_ip(IP地址)、created_at(创建时间)等。让我查询今天的登录记录。

今天是 2025-05-29,我需要查找今天的登录记录。我将使用 UNIX 时间戳来过滤今天的记录:

{
  "sql": "SELECT log_id, log_title, log_content, log_type, log_user, log_ip, to_timestamp(created_at) as login_time \nFROM log \nWHERE log_title LIKE '%登录%' \nAND created_at >= extract(epoch from date_trunc('day', current_date))\nORDER BY created_at DESC;"
}

Output
[]

看起来今天(2025-05-29)还没有用户登录记录。让我尝试查看最近几天的登录记录,以便为您提供更有用的信息:

{
  "sql": "SELECT log_id, log_title, log_content, log_type, log_user, log_ip, to_timestamp(created_at) as login_time \nFROM log \nWHERE log_title LIKE '%登录%' \nORDER BY created_at DESC\nLIMIT 10;"
}

Output

[
  {
    "log_id": "160867d60986804408259a32a3935817",
    "log_title": "用户登录",
    "log_content": "用户(admin)登录",
    "log_type": "3",
    "log_user": "admin",
    "log_ip": "192.168.0.2",
    "login_time": "2025-05-28T05:41:47.000Z"
  },
  {
    "log_id": "38c1b815a6ba3979920039df787ccfbb",
    "log_title": "用户登录",
    "log_content": "用户(admin)登录",
    "log_type": "3",
    "log_user": "admin",
    "log_ip": "192.168.0.2",
    "login_time": "2025-05-28T05:22:57.000Z"
  },
  {
    "log_id": "ec4b34e46106fb1b2a826e0c6f224595",
    "log_title": "用户登录",
    "log_content": "用户(admin)登录",
    "log_type": "3",
    "log_user": "admin",
    "log_ip": "192.168.0.2",
    "login_time": "2025-05-28T01:20:25.000Z"
  }
]

用户登录记录查询结果
根据查询结果,今天(2025-05-29)暂时没有用户登录系统的记录。

最近的登录记录是在昨天(2025-05-28):

| 登录时间 | 用户名 | IP地址 | 操作内容 | 
|---------|-------|-------|---------| 
| 2025-05-28 13:41:47 | admin | 192.168.0.2 | 用户登录 | 
| 2025-05-28 13:22:57 | admin | 192.168.0.2 | 用户登录 | 
| 2025-05-28 09:20:25 | admin | 192.168.0.2 | 用户登录 |

所有最近的登录都是由超级管理员(admin)账户从同一个IP地址(192.168.0.2)进行的。

需要我查询更早的登录记录或其他类型的系统操作记录吗?


Credits spent: 1 credit
Tool calls: 4 calls
Files changed: 0 files changed
Terminals created: 0 processes run

那么问题来了

AI是如何知道什么问题需要使用MCP协议,什么问题不使用的?

其实也好理解,用户在和AI在IDE中沟通的时候,IDE已经把环境信息作为参数传递给了大语言模型,比如当前打开的窗口、光标位置、项目路径、MCP配置信息等,大语言模型理解环境信息,并根据沟通内容判断用户的需求,例如是否谈到了数据库、表、字段等,从而选择是否调用MCP协议获取信息。

一句话来说就是:大语言模型可以根据用户需求,调用MCP等外部工具来获取信息。

结论

PostgreMCP实现了自然语言访问数据库,虽然直接让AI调用终端工具也可以实现数据库访问,但是通过MCP协议来实现,整个过程更简单,而且这个MCP是只读数据访问,不用担心不小心破坏数据内容。对于产品经理、数据分析师、产品运营等非技术类角色来说,这个工具非常实用。