想让 AI 不只“会聊”还能“会做”?MCP 就是那条把大模型和真实世界连起来的桥。这篇带你从零搞懂 MCP,不仅在 Cursor 里亲手接上 高德、数据库和自建小工具等MCP,还要手写一个你自己的MCP!
一、MCP 是什么?
1.1 定义与背景
MCP(Model Context Protocol,模型上下文协议)是 2024 年 11 月底由 Anthropic 推出的一套开放标准,专门给大语言模型(LLM)用———让它们用同一种方式去和五花八门的数据源、工具“打交道”。
一句话记牢:MCP = 大模型连接世界的标准桥梁。 有了它,AI 才能既“动口”又“动手”。
智能体(Agent)要真正有用,得解决两类“连接”问题:
- Agent和工具:调 API、查数据库、跑代码、读文件……样样都要能打通。
- Agent 和 Agent:理解意图、协作任务、多轮对话。
MCP 主攻前者——让 LLM 从“只会说”升级成“能真干”(执行代码、查数据、调服务),后者也出现了A2A的协议,真的不得不感叹,AI发展的是真的快呀!
1.2 为什么需要 MCP?
以前的做法往往是:每个数据源、每种工具各写一套对接,M 个模型 × N 个数据源,越接越乱、难扩展,AI 也拿不到足够的上下文。
MCP 的思路很直接:统一入口、统一协议。 开发者用同一套方式给 AI 接上各种能力,省心又稳。
想啃原版文档的可以看:modelcontextprotocol.io/introductio…
1.3 MCP 能干什么?
一句“部署新版本到测试环境”就能串起 GitLab → Jenkins;一句“查某部门上季度销售额”就能自动生成并执行 SQL;再配上文件、数据库、Git、浏览器,AI 真能帮你干活。
一句话:配置好 MCP,就能把想要的服务接到你正在用的聊天或 IDE 里,不用干等厂商一个个适配。
二、在 Cursor 里把 MCP 接上
Cursor 自带 MCP 客户端,接上各种 MCP Server 之后,AI 就能摸到数据库、文件、地图、网页……下面手把手教你在 Cursor 里配好 MCP。
2.1 先准备好这些
- Cursor:到中国区官网 www.cursor.com/cn 下载安装,注册即用。
- 运行环境(看你用哪些 Server):
- Node.js:多数 Server 是 TypeScript/Node 写的,装好 Node(nodejs.org/zh-cn )并保证
npx能用。 - Python/uv:有的 Server 是 Python 的,装
uv(如pip install uv),用uvx跑。
- Node.js:多数 Server 是 TypeScript/Node 写的,装好 Node(nodejs.org/zh-cn )并保证
- 对话模式:想用 MCP 工具,记得选 Agent 模式,这样 AI 才有权限调工具、读文件、跑命令。
2.2 两种配置方式,选哪种?
往 Cursor 里加 MCP Server 有两种路子:
| 方式 | 配置在哪 | 生效范围 |
|---|---|---|
| 全局设置 | Cursor Settings → MCP → Add new global MCP server | 所有项目 |
| 项目级别 | 项目根目录 .cursor/mcp.json | 只对当前项目 |
更推荐项目级:只在本项目用得到的 Server 放进来,避免全局一堆 Server 干扰其他项目。
项目级配置三步走:
- 在项目根目录建一个
.cursor文件夹(没有的话)。 - 在里面新建
mcp.json。 - 按下面示例把要用的 MCP Server 填进去即可。
2.3 mcp.json 长什么样?
MCP 和 Cursor 之间有两种常见通信方式:
- stdio:本地跑的小程序,用标准输入/输出和 Cursor 说话,要写
command+args(比如npx、uvx)。 - SSE:远程服务,走 HTTP/SSE,多半填个 URL 就行。
下面是一份多 Server 示例(高德地图、MySQL、文件系统一起上):
{
"mcpServers": {
"amap-maps": {
"command": "npx",
"args": ["-y", "@amap/amap-maps-mcp-server"],
"env": {
"AMAP_MAPS_API_KEY": "你的高德API Key"
},
"name": "amap-maps"
},
"mysql": {
"command": "npx",
"args": ["-y", "@f4ww4z/mcp-mysql-server"],
"env": {
"MYSQL_HOST": "localhost",
"MYSQL_USER": "root",
"MYSQL_PASSWORD": "你的密码",
"MYSQL_DATABASE": "数据库名"
},
"name": "mysql"
},
"filesystem": {
"command": "npx",
"args": ["-y", "@smithery-ai/filesystem", "--key", "你的Smithery Key"],
"name": "filesystem"
}
}
}
怎么填?
- amap-maps:去高德开放平台 console.amap.com/ 建应用、拿 API Key,塞进
AMAP_MAPS_API_KEY。 - mysql:按你真实的主机、用户、密码、库名来。
- filesystem:走 Smithery 等托管时可能要
--key,以该 Server 文档为准。
有的 Server 是 uvx(Python)跑的,比如这样:
"mysqldb-mcp-server": {
"command": "uvx",
"args": ["mysqldb-mcp-server"],
"env": {
"MYSQL_HOST": "localhost",
"MYSQL_USER": "root",
"MYSQL_PASSWORD": "123456",
"MYSQL_DATABASE": "company"
},
"name": "mysqldb-mcp-server"
}
2.4 上哪儿找 Server、怎么填?
- Smithery:smithery.ai —— 按功能搜 MCP Server,有时要从页里的 GitHub 链接 抄
command/args,整段粘贴不一定好使。 - MCP.so:mcp.so/zh —— 高德等很多 Server 的配置说明在这。
- GitHub:
照着每个 Server 的文档填好 command、args、env 就行。
2.5 配好了,怎么确认?
- 打开 Cursor → Settings → MCP。
- 看看列表里有没有你刚加的 Server,状态要是 Enabled(绿点)。
- 切到 Agent 模式,用自然语言丢个任务;配置没问题的话,Agent 会去调对应的 MCP 工具。
不同模型(Claude、GPT 等)对工具调用的“积极程度”不一样,多试几句就能摸清脾气。
三、MCP 背后是怎么转的?
3.1 谁在干活:C/S 与五个角色
MCP 走的是经典的**客户端-服务器(C/S)**架构,这几样东西要分清:
| 角色 | 干啥的 |
|---|---|
| MCP Host | 你天天用的“主战场”,比如 Cursor、Claude Desktop、Cline。负责和 LLM 对话,里头已经塞好了 MCP Client。 |
| MCP Client | 藏在 Host 里,专门当“传话员”:LLM 说“我要调个工具” → Client 把请求发给对应的 MCP Server → 再把结果带回给 LLM。 |
| MCP Server | 真正干活的:查库、读文件、调 API……每个 Server 提供一撮“能力”,可以跑在你本机,也可以跑在云端。 |
| Local / Remote Resources | 本地资源(文件、本机数据库)和远程资源(云端 API 等)。 |
在 Cursor 里:Cursor 自己就是 Host + Client;你在 .cursor/mcp.json 里配的,是一个个 MCP Server。每个 Server 说白了就是本机或远程的一个进程(常见是 Node 或 Python),通过 stdio 或 SSE 和 Client 唠嗑。
3.2 两种“传话”方式
| 方式 | 适合啥 | 好处 | 注意 |
|---|---|---|---|
| stdio | 本地小工具、本机文件/软件 | 不依赖外网、快、好排查 | 得先装好运行环境(Node/npx 或 Python/uvx);单进程,别指望高并发。 |
| SSE | 远程 API、在线服务 | 多半填个 URL 就完事 | 依赖网络和对方服务在线。 |
3.3 一次调用是怎么跑完的?
流程可以压成五步:
- 你在 Host(比如 Cursor)里用自然语言提问。
- LLM 琢磨完,决定要调哪些“工具”。
- MCP Client 把请求发给对应的 MCP Server。
- Server 真去干活(查库、读文件、调 API……)并把结果返回。
- Client 把结果塞回 LLM,LLM 再组织成回复给你。
协议里和“工具”相关的两个核心 API:
- tools/list:Client 问 Server“你有啥工具?”——拿到名称、描述、参数结构。
- tools/call:Client 说“帮我执行某某工具,参数是……”——Server 执行后把结果返回。
所以写 MCP Server,就是在实现一堆“工具”,让 Client 用 list 发现、用 call 调用。
四、有哪些好用的 MCP?先看这一批
下面这些是资料和社区里出镜率很高、又确实实用的 MCP Server,按需挑着用就行。
| 类别 | 名称 / 包 | 能干啥 |
|---|---|---|
| 文件系统 | filesystem / fs | 让 AI 安全地读写法、建目录、按模式搜文件、看元数据。 |
| 数据库 | mysqldb-mcp-server / mcp-mysql-server | 和 MySQL 打交道:库表与数据的增删改查,方便 AI 做数据探索。 |
| 地图/位置 | amap-maps(高德) | 地理编码、路线规划(步行/驾车/公交)、POI、距离、天气等;要高德 API Key。 |
| 网页抓取 | Firecrawl | 抓网页、支持 JS 渲染、批量/限速、输出 Markdown/HTML;要 Firecrawl API Key。 |
| 代码/版本 | GitHub、Git | GitHub:仓库、Issue、PR 等;Git:本地仓库的读、搜、分析,让 AI 懂你项目。 |
| 记忆/上下文 | memory | 用知识图谱做持久记忆,AI 能记住你的偏好、身份等。 |
| 系统/控制 | desktop-commander | 在本机执行终端命令、管进程,开发/运维自动化很顺手。 |
| 搜索 | DuckDuckGo | 联网搜,减少幻觉,要最新信息时好用。 |
| 协作 | Slack | 和 Slack 工作区联动:频道、发消息等;要 Bot Token 和 Team ID。 |
几句提醒:
- 用到第三方服务的,记得去对应平台申请 API Key / Token,在
mcp.json的env里配好。 - 从 Smithery 之类抄配置不好使时,去它给的 GitHub 仓库 看最新的
command、args。 - 有的 Server 支持“只读”开关(比如 MySQL 的
MYSQL_READONLY),按需要开就行。
五、动手写一个:用 TypeScript 实现最小 MCP Server
原理摸清之后,不妨自己撸一个最小的 MCP Server:用官方 TypeScript SDK,走 stdio 和 Cursor 对话。下面这段可以直接跑起来,快动手搞起来。
5.1 环境和依赖
- 装好 Node.js(建议 18+)和 npm。
- 新建一个项目目录,执行:
npm init -y
在 package.json 中加上 "type": "module"(ESM),并安装依赖:
npm install @modelcontextprotocol/sdk zod
SDK 依赖 zod 做参数校验。想直接跑 TypeScript 的话,再装个 tsx:
npm install -D tsx typescript @types/node
5.2 核心代码长这样
建一个入口文件(比如 src/index.ts),挂上两个小工具:echo(原样回显)和 add(两数相加):
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({
name: "mcp-ts-example",
version: "1.0.0",
});
// 工具1:回显文本
server.registerTool(
"echo",
{
title: "Echo",
description: "将输入的文本原样返回,用于测试 MCP 调用",
inputSchema: z.object({
message: z.string().describe("要回显的文本"),
}),
},
async ({ message }) => ({
content: [{ type: "text", text: message }],
})
);
// 工具2:两数相加
server.registerTool(
"add",
{
title: "Add Numbers",
description: "计算两个数字的和",
inputSchema: z.object({
a: z.number().describe("第一个数"),
b: z.number().describe("第二个数"),
}),
},
async ({ a, b }) => ({
content: [{ type: "text", text: String(a + b) }],
})
);
const transport = new StdioServerTransport();
await server.connect(transport);
几个要点:
- McpServer:先建一个服务实例,带上
name、version。 - registerTool:按「工具名」「描述 + inputSchema」「异步处理函数」来注册;处理函数拿到解析好的参数,返回
{ content: [{ type: "text", text: "..." }] }。 - StdioServerTransport:用标准输入/输出和 Cursor 通信。
- server.connect(transport):连上传输层,开始等请求。
背后就是:客户端先 tools/list 拿工具列表,再 tools/call 调具体工具,上面这段代码会自动响应。
5.3 怎么跑起来?
- 直接跑 TypeScript(前提是装好了
tsx):
npx tsx src/index.ts
有些环境(比如沙箱)里 tsx 会因 IPC 权限报错,那就用下面这种方式。
- 先编译再运行(更稳,推荐):
npx tsc
node dist/index.js
启动后进程会挂着等 stdin 的 JSON-RPC;真正在 Cursor 里用时,是 Cursor 按需拉起这个进程,不用你一直在终端开着。
5.4 接到 Cursor 里
在项目根目录建好 .cursor/mcp.json,把 mcp-ts-example 配进去:
{
"mcpServers": {
"mcp-ts-example": {
"command": "sh",
"args": [
"-c",
"cd /你的项目路径/mcp-ts-example && (test -d dist || npx tsc) && node dist/index.js"
],
"name": "mcp-ts-example"
}
}
}
注意:
- 把
/你的项目路径/mcp-ts-example换成你机器上的绝对路径(例如/Users/xxx/Desktop/mcp/mcp-ts-example)。 (test -d dist || npx tsc)意思是:没有dist就先npx tsc编译一把,再node dist/index.js。- 第一次用之前,在 mcp-ts-example 目录里执行一次
npm install和npx tsc。
如果你本地 tsx 没问题,也可以简写成:
"mcp-ts-example": {
"command": "sh",
"args": ["-c", "cd /你的项目路径/mcp-ts-example && npx tsx src/index.ts"],
"name": "mcp-ts-example"
}
5.5 在 Cursor 里把它“打开”
配好之后,要在 Cursor 里把开关打开:
- 用 Cursor 打开带
.cursor的那个项目根目录(也就是 mcp 仓库根目录)。 - 打开 Settings(齿轮或
Cmd + ,)→ Tools & MCP(或 MCP)。 - 在列表里找到 mcp-ts-example,确保是 Enabled(绿点)。
- 要是没出现或报错:先在终端跑一遍
cd mcp-ts-example && npm install && npx tsc,再在 Cursor 里 Developer: Reload Window 重载一下。
5.6 在 Cursor 里试一把
- 一定要用 Agent 模式:聊天那里选 Agent(别用 Ask),否则不会调 MCP 工具。
- 用自然语言触发工具,比如:「先 echo “测试”,再用 add 算 10+20。」
- 配置没问题的话,Agent 会列出并调用 echo / add,把结果给你;要是工具列表空的或报错,回头按 5.5 检查是否启用、是否编译成功。
5.7 项目结构长啥样
结构大概这样:
mcp-ts-example/
├── package.json # "type": "module",依赖 @modelcontextprotocol/sdk、zod
├── tsconfig.json
└── src/
└── index.ts # 上述 Server 完整实现(echo、add 两工具)
玩熟之后,可以继续用 registerTool 加更多工具(读文件、调 API),用 registerResource 暴露只读资源,用 registerPrompt 做提示词模板,把 Server 越做越实用。
官方文档和示例:MCP TypeScript SDK、docs/server.md。
六、还想玩更多?上哪儿找 MCP?
- MCP 官方:github.com/modelcontex…
- Awesome MCP Servers:github.com/punkpeye/aw…
- Smithery:smithery.ai
- Glama:glama.ai/mcp/servers
- Cursor 目录:cursor.directory
- MCP.so:mcp.so/zh
- 阿里云百炼:bailian.console.aliyun.com/?tab=mcp#/m…
Server 会越来越多,AI 能调的东西也会越来越丰富;要注意社区质量参差不齐,建议以官方文档和 GitHub 说明为准,按需选用,别忘了 API Key 和权限安全。
七、小结
- MCP 是 LLM 和外部数据、工具之间的统一协议(Anthropic 提出),Cursor、OpenAI、阿里云等都在用。
- 在 Cursor 里用 项目级
.cursor/mcp.json配好 MCP Server,再开 Agent 模式,就能用自然语言驱动数据库、文件、地图、网页、Git 等。 - 原理就是 C/S:Host 里带着 Client,我们配的是 Server;传话用 stdio(本地)或 SSE(远程),核心 API 是 tools/list 和 tools/call。
- 常用 MCP 有文件系统、MySQL、高德、Firecrawl、GitHub、Git、Memory、控制台、搜索、Slack 等,按场景搭,注意 API Key 和安全。
把 MCP 玩转,相当于给 AI 装上“手和脚”——既能听懂你,也能真去动数据、调工具,是智能体落地时非常实用的一环。