介绍

MCP 服务器可以连接自定义数据源,并把它们带进 Cursor 使用。当天需要来自浏览器、数据库,或错误/系统日志等位置的上下文时,这会特别有用。设置 MCP 服务器很简单,配合 Cursor 上手很快。 在本指南里,我们会带你从零构建一个面向 Postgres 的 MCP 服务器。目标是让 Cursor 能直接对 Postgres 数据库执行 SQL 查询,并以结构化的方式暴露表结构(schema)。
本教程旨在讲解构建 MCP 服务器的核心基础。

什么是 MCP 服务器?

MCP 服务器 是一个与 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 中为 I/O 定义 schema
bun add postgres @modelcontextprotocol/sdk zod
然后,前往各个库的仓库,获取各自 README 的原始文件内容链接。构建服务器时我们会把它们作为上下文 现在来定义服务器的行为。为此,我们创建一个 spec.md 并写出高层目标
# Spec

- Allow defining DATABASE_URL through MCP env configuration
- Query postgres data through tool
  - By default, make it readonly
  - Allow write ops by setting ENV `DANGEROUSLY_ALLOW_WRITE_OPS=true|1`
- Access tables as `resources`
- Use Zod for schema definitions
如你所见,这是一个相当轻量的规范。需要的话可以自由补充更多细节。配合 README 链接,我们会构建最终的提示词
Read the following and follow @spec.md to understand what we want. All necesary dependeies are installed
- @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 提供可视化方式来查看服务器对外暴露的内容,并验证工具与资源是否按预期运行。需要确认查询能够执行,且模式(schema)信息能够正确返回。 MCP Inspector 界面 当一切就绪后,可以将服务器接入 Cursor,在真实环境中进行测试。此时,Cursor 将能够像使用内置能力一样使用 Postgres MCP 服务器,使我们可以直接查询并检查数据库。

后续步骤

在本地通过 stdio 运行 MCP 服务器是个很好的起点,但团队通常需要通过 MCP 服务器共享访问同一个数据库。在这种情况下,就有必要将 MCP 服务器部署为集中式 HTTP 服务。 已部署的 MCP 服务器相比单个 stdio 实例有几个优势:
  • 共享数据库访问: 多个团队成员可以通过 Cursor 查询同一数据库实例
  • 集中化配置: 在一个位置统一管理模式更新和权限变更
  • 更强的安全性: 可以实施完善的身份验证、限流和访问控制
  • 可观测性: 可以在团队范围内监控使用模式和性能指标
为此,你需要把传输方式从 stdio 切换为 HTTP。 虽然我们不会覆盖完整的搭建过程,但这里有一个可以给 Cursor 的不错的起始提示词
Based on the existing MCP server, create a new file that implements the HTTP protocol.

Move shared logic to mcp-core, and name each transport implementation by name (mcp-server-stdio, mcp-server-http)

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