mcp 啥玩意儿,一起来看看

最近,大家都在讨论 MCP,为什么突然冒出一个新鲜的词,我们来一探究竟。

MCP是什么

```plain 一句话概括:模型上下文协议(MCP)是一个开放标准化协议,就像AI应用的"USB-C接口",为大型语言模型(LLM)提供标准化的上下文访问方式,允许LLM连接到各种数据源和工具。 ```

MCP(Model Context Protocol),即模型上下文协议,是一个开放协议,它使得LLM应用程序与外部数据源和工具之间能够实现无缝集成。简单来说,MCP是一种标准化的方式,让AI模型能够更容易地与各种工具和服务进行交互。

核心问题探讨

在深入了解MCP之前,让我们先思考几个关键问题:

  1. MCP的本质和功能是什么
  2. LLM如何接入MCP
  3. MCP与传统Function Call的区别
  4. 为什么各大厂商热衷于接入MCP
  5. MCP的底层实现原理

MCP的架构设计

```plain 一句话概括:mcp 核心架构是客户端-服务器的设计。 客户端(位于LLM应用内)与服务器建立连接, 通过标准化的JSON-RPC消息传输, 服务器能为LLM应用提供上下文、工具和提示。 ```

查看官方文档(modelcontextprotocol.io/docs/concep...),我们可以总结MCP的核心架构:

  • 协议抽象层:MCP将不同工具/服务的API差异封装成统一接口,类似"万能插座",AI只需理解协议规范,无需关注底层实现细节。
  • 动态上下文管理:协议会携带会话ID、历史记录等上下文信息,帮助AI理解调用场景(例如在客服场景中自动关联用户订单信息)。
  • 异步通信机制:采用类似HTTP长轮询或StreamableHTTP的传输方式,支持AI在等待API响应的同时处理其他任务。

MCP实现示例

以TypeScript SDK为例,[源码地址](https://github.com/modelcontextprotocol/typescript-sdk/tree/main)

我们可以看看如何实现一个MCP服务器:

typescript 复制代码
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

// 创建一个MCP服务器
const server = new McpServer({
  name: "Demo",
  version: "1.0.0"
});

// 添加一个加法工具
// 参数:a和b都是数字类型
// 返回:将结果转换为字符串
server.tool("add",
  { a: z.number(), b: z.number() },
  async ({ a, b }) => ({
    content: [{ type: "text", text: String(a + b) }]
  })
);

// 添加一个动态问候资源
// 通过URI模板定义:greeting://{name}
// 返回:包含问候语的内容
server.resource(
  "greeting",
  new ResourceTemplate("greeting://{name}", { list: undefined }),
  async (uri, { name }) => ({
    contents: [{
      uri: uri.href,
      text: `Hello, ${name}!`
    }]
  })
);

// 启动服务器
// 使用标准输入输出(stdin/stdout)作为传输层
// 开始接收stdin的消息并通过stdout发送消息
const transport = new StdioServerTransport();
await server.connect(transport);

可以看到,上面的代码清晰的展示了怎么使用,使用非常简单。让我们进一步深入解析。

  • 通用的服务器类Server,处理客户端-服务器通信
  • 支持请求-响应模式和通知模式
  • 实现了协议版本协商和能力协商机制

MCP与Function Call的区别

为了理解MCP与传统Function Call的区别。

我们先看看使用 Function Call的实现方式:

plain 复制代码
传统Function Call的实现需要:
- 使用JSON Schema描述每个函数
- 处理模型响应
- 实现外部函数逻辑
- 处理API返回结果
- 将结果返回给模型
javascript 复制代码
import { OpenAI } from "openai";

const openai = new OpenAI();

const tools = [{
    "type": "function",
    "name": "get_weather",
    "description": "Get current temperature for a given location.",
    "parameters": {
        "type": "object",
        "properties": {
            "location": {
                "type": "string",
                "description": "City and country e.g. Bogotá, Colombia"
            }
        },
        "required": [
            "location"
        ],
        "additionalProperties": false
    }
}];

const response = await openai.responses.create({
    model: "gpt-4.1",
    input: [{ role: "user", content: "What is the weather like in Paris today?" }],
    tools,
});

console.log(response.output);

再来看看怎么使用 mcp,这里以 openai mcp 为例

python 复制代码
async with MCPServerStdio(
    params={
        "command": "npx",
        "args": ["-y", "@modelcontextprotocol/server-filesystem", samples_dir],
    }
) as server:
    tools = await server.list_tools()
    
agent=Agent(
    name="Assistant",
    instructions="Use the tools to achieve the task",
    mcp_servers=[mcp_server_1, mcp_server_2]
)

而MCP则提供了更高层次的抽象:

  • 统一接口:不同工具通过统一协议接入,减少适配成本
  • 标准化交互:定义了标准的请求-响应模式
  • 工具管理:集中式管理各种工具和服务
  • 上下文共享:在不同工具调用间保持上下文信息
  • 可扩展性:更容易添加和更新工具,无需频繁更新模型提示

为什么大厂热衷于接入MCP

最近海内外的大厂都纷纷加入了 mcp 的阵营,将自家的产品都接入了 mcp。

plain 复制代码
大厂之所以积极接入MCP协议,其核心在于这一技术重构了AI与工具、数据的交互范式,并为生态竞争和商业布局提供了战略支点。

主要原因包括:

  1. 降低集成成本:统一协议减少了不同API的适配工作
  2. 提高开发效率:开发者可以专注于业务逻辑而非接口适配
  3. 增强AI能力:让AI能够访问更多外部工具和服务
  4. 标准化生态:建立标准化的工具调用生态系统
  5. 提升用户体验:AI可以更流畅地完成复杂任务

MCP的底层实现原理

我们可以看下源码:(具体实现可以查看最下面参考链接)

typescript 复制代码
// 定义一个泛型协议类,用于处理请求、通知及结果
// Request: 客户端请求类型
// Notification: 服务端通知类型
// Result: 请求处理结果类型
class Protocol<Request, Notification, Result> {

  // 设置请求处理器
  // 泛型T: 请求数据结构的类型(如JSON Schema)
  // 参数 schema: 用于验证/匹配请求的数据结构
  // 参数 handler: 异步请求处理函数,接收请求数据及额外参数,返回处理结果
  setRequestHandler<T>(
    schema: T,
    handler: (request: T, extra: RequestHandlerExtra) => Promise<Result>
  ): void

  // 设置通知处理器
  // 泛型T: 通知数据结构的类型
  // 参数 schema: 用于验证/匹配通知的数据结构
  // 参数 handler: 异步通知处理函数,仅接收通知内容
  setNotificationHandler<T>(
    schema: T,
    handler: (notification: T) => Promise<void>
  ): void

  // 发送请求并等待响应
  // 泛型T: 预期响应数据的类型
  // 参数 request: 要发送的请求对象
  // 参数 schema: 用于验证响应数据的结构
  // 参数 options: 可选的请求配置(如超时时间)
  // 返回: 符合schema结构的响应数据Promise
  request<T>(
    request: Request,
    schema: T,
    options?: RequestOptions
  ): Promise<T>

  // 发送单向通知
  // 参数 notification: 要发送的通知对象
  // 返回: 通知发送确认的Promise
  notification(
    notification: Notification
  ): Promise<void>
}

MCP的底层实现主要特点:

  1. 类型安全设计:通过泛型参数确保请求、通知和结果类型的一致性
  2. 模式验证:使用schema参数进行数据结构校验(通常为JSON Schema)
  3. 异步处理:所有方法均基于Promise实现异步通信
  4. 双向通信:支持请求-响应模式(request)和发布-订阅模式(notification)
  5. 扩展性:RequestHandlerExtra参数可传递元数据(如请求来源、时间戳等)

总结

MCP作为一个开放协议,正在成为AI与外部工具交互的标准方式。它通过提供统一的抽象层,大大简化了AI调用外部服务的复杂性,使得开发者可以更专注于业务逻辑而非接口适配。

与传统Function Call相比,MCP提供了更高层次的抽象和更丰富的功能,包括统一接口、上下文管理、异步通信等。这也是为什么各大科技公司都在积极接入MCP,它不仅降低了开发成本,也提升了AI应用的能力和用户体验。

随着AI应用的普及,MCP有望成为连接AI与外部世界的重要桥梁,推动AI工具生态系统的标准化和繁荣发展。


相关资料参考:

相关推荐
sophister19 分钟前
MCP 协议关于tool 的几个基础问题
llm·cursor·mcp
新智元27 分钟前
高考考上 985 的 AI 来了!超强数理推理横扫真题,训练秘籍剑指 AGI
人工智能·openai
新智元3 小时前
刚刚,OpenAI 最强图像生成 API 上线,一张图 1 毛 5!
人工智能·openai
悟空非空也4 小时前
Trae重磅更新,智能体+MCP+Rules都齐啦,AI能力爆棚
人工智能·mcp·trae
Captaincc18 小时前
关于MCP最值得看的一篇:MCP创造者聊MCP的起源、架构优势和未来
前端·mcp
新智元21 小时前
大学文凭成废纸?AI 暴击美国 00 后!他哥大退学成千万富翁,我却还要还学贷
人工智能·openai
新智元1 天前
Transformer 原作打脸 DeepSeek 观点?一句 Wait 就能引发反思,RL 都不用
人工智能·openai
Baihai_IDP1 天前
GenAI 时代,数据唾手可得,但真正的挑战已经转变...
人工智能·llm·openai
卓越进步1 天前
MCP Server架构设计详解:一文掌握框架核心
大模型·llm·go·后端开发·mcp