MCP(Model Context Protocol)学习分享:从理论到实践

MCP(Model Context Protocol)学习分享:从理论到实践


一、MCP 是什么?

MCP 不是工具,不是应用,不是 API SDK,也不是一个产品------它是一个协议。

2024 年 11 月 25 日,Anthropic 公司推出了 MCP(Model Context Protocol),被誉为 "AI 界的 USB-C 接口协议" 。它的核心目标是:让任何一个 AI 模型,都能以统一的方式去访问外部资源和工具。

在 MCP 出现之前,想让大模型对接不同的数据源(数据库、API、文件系统、SaaS 服务等),开发者需要为每个模型、每个数据源分别写适配代码------这就是 RAG(检索增强生成)和 Function Calling 时代"零散适配"的痛点。MCP 的诞生,从根本上改变了这一局面。


二、MCP 的三大角色

MCP 的架构可以类比为电脑的 USB 生态,由三个核心部分组成:

arduino 复制代码
┌──────────────────────────────────────────────┐
│                 MCP Host(宿主)               │
│     Claude Code / Cursor / Trae / Codex       │
│                      │                        │
│              ┌───────┴───────┐                │
│              │  MCP Client   │                │
│              │  (插件式配置)  │                │
│              └───────┬───────┘                │
│                      │                        │
│           stdio / HTTP 通信                   │
│                      │                        │
│     ┌────────────────┼────────────────┐       │
│     │                │                │       │
│  ┌──┴──┐        ┌───┴───┐       ┌───┴───┐   │
│  │文件  │        │ 网盘   │       │ 邮件  │   │
│  │Server│        │Server │       │Server │   │
│  └─────┘        └───────┘       └───────┘   │
│           MCP Servers(服务端)               │
└──────────────────────────────────────────────┘
角色 说明 举例
MCP Host AI 应用程序宿主 Claude Code、Cursor、Trae
MCP Client 客户端,以插件形式配置 高德地图 client、Gmail client
MCP Server 提供上下文和工具的服务端 文件系统服务、数据库服务、飞书

工作流程:Host 通过 prompt 与大模型推理交互 → 大模型发现任务需要外部上下文 → 查看 Host 中配置了哪些 MCP Client → 选中对应的 Client 调用 → Client 通过标准协议与 Server 通信 → 返回结果给大模型生成最终回答。


三、核心价值:从 Chatbot 到 Agentic AI

MCP 最大的意义不在于"便利",而在于它从根本上重构了 AI 的应用架构 ,真正将 AI 从 Chatbot(聊天机器人) 推到了 Agentic AI(智能体 AI) 阶段。

MCP 为 Context Engineering(上下文工程)提供了标准化的通信底座,让大模型能够调用的上下文来源得到极大扩充。它统一了两大类能力:

类别 含义 例子
Resources(资源) 模型想知道的数据 数据库、API、文件、飞书文档、高德地图
Tools(工具) 模型能执行的操作 创建日历、发邮件、执行命令、远程控制

这些资源和工具,就是让大模型变得真正有用的上下文和能力。


四、实战:配置 MCP Server(以文件系统为例)

4.1 客户端配置 .mcp.json

在项目根目录下创建 .mcp.json,告诉 MCP Host 该项目需要哪些 MCP Server:

perl 复制代码
{
    "mcpServers": {
        "filesystem": {
            "type": "stdio",
            "command": "npx",
            "args": [
                "-y",
                "@modelcontextprotocol/server-filesystem",
                "/Users/liaojie/Desktop/workspace/lj-ai/ai/mcp/mcp-test"
            ]
        }
    }
}

关键字段解读:

  • type: "stdio" --- 通信方式为标准输入/输出流(另一种是 HTTP)
  • command: "npx" --- 通过 npx 启动(无需全局安装)
  • args --- 传递包名和允许访问的目录路径,实现安全沙箱式的文件访问控制

当你用 Claude Code 打开这个项目时,它会自动加载这份配置,大模型就拥有了安全读写指定目录的能力。

4.2 手写一个 MCP Server

光会用还不够,我们来手写一个最简单的 MCP Server,理解底层原理。以下是 simple-read-mcp/server.js 的逐段解析:

javascript 复制代码
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import fs from 'fs/promises';

核心依赖:

包 作用
@modelcontextprotocol/sdk MCP 协议的官方 SDK,封装了通信细节
zod 数据验证库,用于声明工具的参数 schema(替代手写 JSON Schema)
arduino 复制代码
// 实例化 MCP Server
const server = new McpServer({
  name: 'simple-read-mcp',
  version: '1.0.0'
});

每个 MCP Server 需要有名称 和版本号,这是协议规范的要求,方便 MCP Client 发现和识别。

javascript 复制代码
// 注册一个 Tool
server.tool(
  "read_file",                              // 工具名称
  "读取指定路径的本地文件内容",               // 工具描述(LLM 据此判断该选哪个工具)
  {
    path: z.string().describe("文件的绝对或相对路径")  // 参数 schema
  },
  async ({ path }) => {                     // 工具的实际执行逻辑
    try {
      const content = await fs.readFile(path, 'utf-8');
      return {
        content: [{ type: "text", text: content }]
      };
    } catch (err) {
      return {
        isError: true,
        content: [{ type: "text", text: `读取文件失败:${err.message}` }]
      };
    }
  }
);

server.tool() 的四个参数:

  1. 工具名 --- MCP Client 通过这个名字调用工具
  2. 描述 --- LLM 根据这段描述理解工具的用途,判断何时应该使用它
  3. 参数 Schema --- 用 Zod 定义,SDK 会自动转换为 JSON Schema 并进行校验
  4. 处理函数 --- 实际执行业务逻辑,返回 { content: [...] } 格式的结果
javascript 复制代码
// 启动服务
async function main() {
  const transport = new StdioServerTransport();  // 使用 stdio 传输层
  await server.connect(transport);               // 连接 Server 和 Transport
  console.error("MCP read_file 服务已启动(stdio模式)");
}

main().catch(console.error);

StdioServerTransport 是 MCP 最基础的传输方式。通信通过**标准输入/输出流(stdin/stdout)**进行,无需监听网络端口,天然安全隔离。


五、通信全链路:一次 MCP 调用的完整过程

把整个流程串起来看,就是下面这条完整的链路:

arduino 复制代码
用户输入 Prompt
    │
    ▼
Claude Code(MCP Host)
    │
    ▼
LLM 推理分析 → 判断需要读取文件
    │
    ▼
选中 "read_file" MCP Client
    │
    ▼
StdioServerTransport → stdin 发送请求
    │
    ▼
simple-read-mcp Server 收到请求
    │
    ▼
Zod 校验参数 → 执行 fs.readFile()
    │
    ▼
返回结果 → stdout
    │
    ▼
StdioServerTransport 接收 → Claude Code
    │
    ▼
LLM 基于文件内容生成最终回答 → 返回给用户

整个过程对开发者来说是透明 的------SDK 封装了 stdio 通信、JSON-RPC 协议、错误处理等底层细节,开发者只需要关注注册什么工具、工具做什么事。


六、总结

要点 说明
本质 MCP 是 LLM 与外部世界的通信协议,类比 USB-C
三大角色 Host(宿主应用)→ Client(配置层)→ Server(能力提供方)
两种能力 Resources(数据资源)+ Tools(可执行工具)
配置方式 .mcp.json 声明式配置,即插即用
开发三要素 Schema 声明工具签名 + Zod 校验参数 + 协议 SDK 处理通信
传输方式 stdio(标准流)或 HTTP,stdio 模式天然安全隔离
核心价值 统一标准,终结零散适配;推动 AI 从 Chatbot 进入 Agentic AI 时代

一句话记住 MCP: 如果你把大模型比作一台电脑的 CPU,那 MCP 就是主板上的 USB-C 接口------不管插上去的是 U 盘、键盘、网卡还是显示器,都能即插即用,无需写驱动。

相关推荐
AI日报派送佬4 小时前
2026年10月14日AI行业日报|Gemini 4 Argon正式发布;小模型跨设备传播风险引发安全热议
网络·人工智能·openai·谷歌·deepseek·anthropic·ai日报
镜象科技5 小时前
职业院校AI心理健康解决方案怎么选?三个特殊场景与三类路线
人工智能
Leo.yuan6 小时前
企业Data Agent架构选型:帆软Dora基于NL2BI的现有BI体系复用方案
大数据·人工智能
朱涛的自习室6 小时前
70 美金的 Beyond Compare,我让 Gemini 4 和 DeepSeek 造个开源免费版(Day 2)
android·前端·人工智能
米小虾6 小时前
上下文:Agent 的眼睛里到底装着什么
人工智能·agent
米小虾6 小时前
Agent = 大脑 + 眼睛 + 手脚:一篇看懂现代 AI Agent 的骨架
人工智能
小小测试开发6 小时前
安全评测得分 0.9556 掉到 0.3257,只改了 top_k 和 prompt_style 之外的题面比例
人工智能·安全·prompt
slacker-kian7 小时前
[实践]-用LLM对文本结构化:把多段文本描述变成规范的 JSON 知识库
人工智能·llm·prompt·结构化·pydantic·one-shot 提示
品牌常新7 小时前
景区巡逻机器人怎么选?派宝S5全地形守护解析
运维·人工智能·机器人