返回博客
·AI工具

Cursor 的 MCP 插件机制:一个开发者踩过的坑

MCP (Model Context Protocol) 让 AI IDE 能连接外部工具,但 Cursor 的 MCP 配置坑比文档多得多。

#Cursor#MCP#AI IDE#插件

MCP(Model Context Protocol)出来之后,AI IDE 都疯了似的往里面塞东西。Cursor 第一个支持 MCP 之后,我兴冲冲去配置,结果折腾了一下午——文档里写的三步配置,实际踩了七个坑。

你以为的配置,实际的配置

官方文档说,在 Cursor 设置里加一段 JSON,重启,完事。简单吗?简单。

实际呢?我第一次配的时候,server 地址写的是 http://localhost:3000,但实际 MCP server 跑在 Docker 容器里,宿主机访问 localhost 根本不通。这个错我排查了四十分钟,最后还是靠 curl 才发现——连 server 都没连上,当然没有 context。

第二个坑:环境变量。很多 MCP server 需要 API Key,比如把 Postgres 暴露给 AI 用的那个,你得在 Cursor 的 MCP 配置里手动写 env 字段。但 Cursor 不支持从 .env 文件读取,所以你要么每次手动贴,要么写个脚本自己注入。这个设计本身没问题,但文档只字未提。

我实际用到的 MCP Servers

折腾完之后,目前稳定跑的有几个:

**1. Postgres MCP**

把数据库表结构喂给 AI,让它帮你写 SQL。这个场景很实用,特别是那种"我想让 AI 帮我查数据但又不想暴露明文密码"的顾虑。

{

"mcpServers": {

"postgres": {

"command": "npx",

"args": ["-y", "@modelcontextprotocol/server-postgres", "postgresql://user:pass@localhost:5432/mydb"]

}

}

}

注意连接串里带密码,生产环境别这么干。正经用法是用 Docker,把凭证当环境变量传进去:

{

"mcpServers": {

"postgres": {

"command": "docker",

"args": ["run", "--rm", "-e", "POSTGRES_URL", "-v", "/tmp/.config:/root/.config", "mcp/postgres"],

"env": {

"POSTGRES_URL": "postgresql://user:pass@host:5432/db"

}

}

}

}

**2. Filesystem MCP(只读模式)**

这个最有用。让 AI 读你的代码库做上下文。但要注意权限问题——别给 AI 写权限,否则它可能"不小心"改了你生产环境的配置文件。

{

"mcpServers": {

"filesystem": {

"command": "npx",

"args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/your/repo"],

"env": {}

}

}

}

只给一个目录的读权限,AI 就不会乱跑。

**3. 自定义 Web Search**

这个是我自己写的。公司内网有搜索 API,但 AI 连不上。写了一个轻量的 MCP server 包了一层,让 Cursor 能通过自然语言搜内部文档。

// 极简 MCP server 框架

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";

import { Tool } from "@modelcontextprotocol/sdk/types.js";

const server = new McpServer({

name: "internal-search",

version: "1.0.0",

});

server.tool(

"search_docs",

"Search internal documentation",

{ query: { type: "string", description: "Search query" } },

async ({ query }) => {

const results = await fetch("https://internal.search/api?q=" + encodeURIComponent(query)).then(r => r.json());

return { content: [{ type: "text", text: JSON.stringify(results) }] };

}

);

避坑总结

  • **连不上 server**:先用 curl 或 npx 手动测试 server 能不能跑,别一上来就配 Cursor。
  • 2. **环境变量丢了**:Cursor 的 MCP env 配置是覆盖不是合并,写进去的 env 会覆盖系统 env,注意别把自己搞死。

    3. **权限别给大**:filesystem 只给读、只给需要的目录,生产环境相关的目录一根手指都别让它碰。

    4. **日志调试**:Cursor 的 MCP 日志在 DevTools 里,F12 打开然后看 network 面板,请求发出去的 raw body 里能看到你配置的 server 到底有没有被正确加载。

    最后说两句

    MCP 这个方向是对的——给 AI 工具化能力,而不是让它在那儿瞎猜。但 Cursor 目前的实现还处于 early stage,文档和实际行为对不上是常态。建议在正式配置之前,先手动跑一遍你的 MCP server,确认它能正常工作,再往里套 Cursor 的配置。省得在那儿怀疑人生。

    对了,Cursor 每次更新都可能改 MCP 的行为,上次更新后我的 Postgres MCP 突然连不上了,查了 changelog 才发现他们换了 JSON schema 的解析方式。跟踪一下 release notes 吧,这玩意儿变化快。