跳转到主要内容

介绍

MCP 服务器可以让你接入自定义数据源,并在 Cursor 内直接使用它们。当你需要来自浏览器、数据库,或错误与系统日志等来源的上下文时,这尤其有用。设置 MCP 服务器很简单,配合 Cursor 可以快速完成。 在本指南中,我们会带你一步步构建一个面向 Postgres 的 MCP 服务器。我们的目标是让 Cursor 能直接对 Postgres 数据库运行 SQL 查询,并以结构化方式公开表的 schema。
本教程旨在讲解构建 MCP 服务器的核心基础。

什么是 MCP 服务器?

MCP server 是一个与 Cursor 通信并提供外部数据或操作访问的进程。实现方式有很多,不过这里我们会用最简单的办法:在你电脑本地通过 stdio(标准输入/输出流)运行的服务器。这样可以避免复杂的安全问题,让我们把精力放在 MCP 的核心逻辑上。 MCP 最常见的用例之一是访问数据库。构建仪表盘、跑分析或做迁移时,通常需要查询并检查数据库。我们的 Postgres MCP 服务器会支持两项核心能力:执行任意查询和列出表的模式(schema)。 虽然这两件事用纯 SQL 也能做,但 MCP 提供的功能让它们更强大、更通用。工具(tools)提供了一种暴露执行查询等操作的方式,而资源(resources)让我们能共享标准化的上下文,比如模式信息。后面我们还会看看提示(prompts),它们能解锁更高级的工作流。 在底层,我们会依赖 postgres npm 包来对数据库执行 SQL 语句。MCP SDK 会作为这些调用的封装层,让我们把 Postgres 的功能无缝集成进 Cursor。

如何构建 MCP 服务器

构建服务器的第一步是新建一个项目。我们先创建一个新文件夹,并初始化一个 Bun 项目
> mkdir postgres-mcp-server
> Bun init
从这里开始,我们选择 Blank 项目。样板搭好后,需要安装必要的依赖。zod 用于在 MCP SDK 中为输入/输出定义模式(schema)
bun add postgres @modelcontextprotocol/sdk zod
接下来,我们会前往每个库的仓库,获取各自 README 文件的原始内容链接。构建服务器时,我们会把这些作为上下文使用 现在,我们来定义服务器的预期行为。为此,我们会创建一个 spec.md 文件,并写出总体目标
# 规范

- 允许通过 MCP 环境配置设置 DATABASE_URL
- 通过工具查询 Postgres 数据
  - 默认只读
  - 将环境变量 `DANGEROUSLY_ALLOW_WRITE_OPS=true|1` 设置为启用写操作
- 将数据表作为 `resources` 访问
- 使用 Zod 定义模式(schema)
如你所见,这份规范相当轻量。可以按需补充更多细节。配合 README 中的链接,我们会构建最终的提示词。
阅读以下内容,并按照 @spec.md 了解我们的目标。所有必要的依赖已安装
- @https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md
- @https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md
在这三个组件都到位之后(规范、MCP SDK 文档和 Postgres 库文档),我们就可以用 Cursor 来脚手架出服务器实现。Cursor 会帮我们把这些部分串起来,生成将 MCP SDK 与 Postgres 接入的代码。 经过几轮来回提示后,我们已经有了 MCP 服务器的第一个版本。想试用的话,可以用 MCP Inspector
npx @modelcontextprotocol/inspector bun run index.ts

测试 MCP 服务器

完成初始实现后,可以使用 MCP Inspector 进行测试。Inspector 提供了查看服务器对外暴露内容的方式,并可用来核验工具和资源是否按预期工作。需要确认查询能够执行,且架构信息能正确返回。 MCP Inspector 界面 当一切正常时,把服务器连接到 Cursor 本身,在真实环境中进行测试。此时,Cursor 将能够像使用内置功能一样使用 Postgres MCP 服务器,让我们可以直接查询并检视数据库。

下一步

在本地通过 stdio 运行 MCP 服务器是个很好的起点,但团队通常需要通过 MCP 服务器共享访问同一个数据库。在这种情况下,就有必要将 MCP 服务器部署为集中式 HTTP 服务。 已部署的 MCP 服务器相比单个 stdio 实例具有多项优势:
  • 共享数据库访问: 多个团队成员可以通过 Cursor 查询同一个数据库实例
  • 集中式配置: 架构更新和权限变更可在单一位置统一管理
  • 更强的安全性: 可实现完善的身份验证、限流和访问控制
  • 可观测性: 团队范围内的使用模式和性能指标可被监控
要实现这一点,需要将传输方式从 stdio 切换为 HTTP。 我们不会覆盖完整的部署流程,但下面有一个不错的起始提示,可以交给 Cursor
在现有 MCP 服务器的基础上,新增一个实现 HTTP 协议的文件。

将通用逻辑抽取到 mcp-core,并按传输方式为各实现命名(mcp-server-stdio、mcp-server-http)。

@https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md 
最终结果可在此查看:pg-mcp-server
I