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 盘、键盘、网卡还是显示器,都能即插即用,无需写驱动。

相关推荐
RFID科技的魅力1 小时前
RFID资产管理系统选型避坑指南:从需求梳理到落地验证
大数据·人工智能·物联网·rfid
ai产品老杨2 小时前
【边云协同视频分析项目实战记录】多站点AI视频分析平台部署手册
人工智能·音视频
北鹤M2 小时前
如何将模特导入AI实现电商智能换装,主流工具体验分享
人工智能·aigc
一知半解仙2 小时前
2026年彻底免费的辅助编程Agent大模型汇总
开发语言·人工智能·开源
2301_767113982 小时前
Ollama 本地部署与运维使用指南
人工智能·ollama
2501_911067662 小时前
乡村振兴 + 零碳民生稿:叁仟光伏智慧灯杆,点亮杭州共富乡村绿色数字路
人工智能·5g·重构·生活·智慧城市
linzᅟᅠ2 小时前
README
人工智能·python
小猴子下山1232 小时前
2026年无锡细胞存储市场格局观察:四家企业的传承脉络与业务分野
大数据·人工智能·精选
Database_Cool_2 小时前
数据库慢查询优化首选方案:阿里云 RDS 性能洞察+自动诊断
数据库·人工智能·阿里云