介绍

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

什么是 MCP 服务器?

MCP 服务器 是一个与 Cursor 通信并提供对外部数据或操作访问的进程。它可以通过多种方式实现,但这里我们采用最简单的方法:在你的电脑上通过 stdio(标准输入/输出流)本地运行的服务器。这样可以避免复杂的安全因素,让我们专注于 MCP 的核心逻辑。 MCP 最常见的用例之一是访问数据库。构建仪表盘、运行分析或编写迁移时,常常需要查询并检查数据库。我们的 Postgres MCP 服务器将支持两个核心能力:运行任意查询和列出表的模式(schema)。 虽然这两项任务用纯 SQL 也能完成,但 MCP 提供的特性让它们更强大、更通用。工具(tools)提供了暴露操作(例如执行查询)的方法,而资源(resources)则让我们能够共享标准化的上下文(例如模式信息)。在本指南后面我们还会介绍提示(prompts),它能启用更高级的工作流。 在底层,我们将依赖 postgres npm 包来对数据库执行 SQL 语句。MCP SDK 会对这些调用进行封装,使我们能够将 Postgres 的功能无缝集成到 Cursor 中。 [占位符:带有 tools 和 resources 的 MCP 服务器示意图]

如何构建 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 中查询同一个数据库实例
  • 集中化配置: 在单一位置统一管理 schema 更新和权限变更
  • 更强的安全性: 可以实施完善的身份认证、限流和访问控制
  • 可观测性: 可以在团队范围内监控使用模式和性能指标
为此,你需要把传输方式从 stdio 切换为 HTTP。 我们不会覆盖完整的部署流程,但这里有一个不错的起始提示词,你可以直接丢给 Cursor:
Based on the existig 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