MCP 入门与实践:大模型连接世界的桥梁

35 阅读11分钟

想让 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 跑。
  • 对话模式:想用 MCP 工具,记得选 Agent 模式,这样 AI 才有权限调工具、读文件、跑命令。

2.2 两种配置方式,选哪种?

往 Cursor 里加 MCP Server 有两种路子:

方式配置在哪生效范围
全局设置Cursor Settings → MCP → Add new global MCP server所有项目
项目级别项目根目录 .cursor/mcp.json只对当前项目

更推荐项目级:只在本项目用得到的 Server 放进来,避免全局一堆 Server 干扰其他项目。

项目级配置三步走:

  1. 在项目根目录建一个 .cursor 文件夹(没有的话)。
  2. 在里面新建 mcp.json
  3. 按下面示例把要用的 MCP Server 填进去即可。

2.3 mcp.json 长什么样?

MCP 和 Cursor 之间有两种常见通信方式

  • stdio:本地跑的小程序,用标准输入/输出和 Cursor 说话,要写 command + args(比如 npxuvx)。
  • 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、怎么填?

照着每个 Server 的文档填好 commandargsenv 就行。

2.5 配好了,怎么确认?

  1. 打开 Cursor → Settings → MCP
  2. 看看列表里有没有你刚加的 Server,状态要是 Enabled(绿点)。
  3. 切到 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),通过 stdioSSE 和 Client 唠嗑。

3.2 两种“传话”方式

方式适合啥好处注意
stdio本地小工具、本机文件/软件不依赖外网、快、好排查得先装好运行环境(Node/npx 或 Python/uvx);单进程,别指望高并发。
SSE远程 API、在线服务多半填个 URL 就完事依赖网络和对方服务在线。

3.3 一次调用是怎么跑完的?

流程可以压成五步:

  1. 你在 Host(比如 Cursor)里用自然语言提问。
  2. LLM 琢磨完,决定要调哪些“工具”。
  3. MCP Client 把请求发给对应的 MCP Server
  4. Server 真去干活(查库、读文件、调 API……)并把结果返回。
  5. 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。
代码/版本GitHubGitGitHub:仓库、Issue、PR 等;Git:本地仓库的读、搜、分析,让 AI 懂你项目。
记忆/上下文memory用知识图谱做持久记忆,AI 能记住你的偏好、身份等。
系统/控制desktop-commander在本机执行终端命令、管进程,开发/运维自动化很顺手。
搜索DuckDuckGo联网搜,减少幻觉,要最新信息时好用。
协作Slack和 Slack 工作区联动:频道、发消息等;要 Bot Token 和 Team ID。

几句提醒:

  • 用到第三方服务的,记得去对应平台申请 API Key / Token,在 mcp.jsonenv 里配好。
  • 从 Smithery 之类抄配置不好使时,去它给的 GitHub 仓库 看最新的 commandargs
  • 有的 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);

几个要点:

  1. McpServer:先建一个服务实例,带上 nameversion
  2. registerTool:按「工具名」「描述 + inputSchema」「异步处理函数」来注册;处理函数拿到解析好的参数,返回 { content: [{ type: "text", text: "..." }] }
  3. StdioServerTransport:用标准输入/输出和 Cursor 通信。
  4. 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 installnpx 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 里把开关打开:

image.png

  1. 用 Cursor 打开.cursor 的那个项目根目录(也就是 mcp 仓库根目录)。
  2. 打开 Settings(齿轮或 Cmd + ,)→ Tools & MCP(或 MCP)。
  3. 在列表里找到 mcp-ts-example,确保是 Enabled(绿点)。
  4. 要是没出现或报错:先在终端跑一遍 cd mcp-ts-example && npm install && npx tsc,再在 Cursor 里 Developer: Reload Window 重载一下。

5.6 在 Cursor 里试一把

image.png

  1. 一定要用 Agent 模式:聊天那里选 Agent(别用 Ask),否则不会调 MCP 工具。
  2. 用自然语言触发工具,比如:「先 echo “测试”,再用 add 算 10+20。」
  3. 配置没问题的话,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 SDKdocs/server.md


六、还想玩更多?上哪儿找 MCP?

image.png

image.png

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/listtools/call
  • 常用 MCP 有文件系统、MySQL、高德、Firecrawl、GitHub、Git、Memory、控制台、搜索、Slack 等,按场景搭,注意 API Key 和安全。

把 MCP 玩转,相当于给 AI 装上“手和脚”——既能听懂你,也能真去动数据、调工具,是智能体落地时非常实用的一环。