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工具生态系统的标准化和繁荣发展。


相关资料参考:

相关推荐
kaizq12 小时前
AI-MCP-SQLite-SSE本地服务及CherryStudio便捷应用
python·sqlite·llm·sse·mcp·cherry studio·fastmcp
太空眼睛15 小时前
【MCP】使用SpringBoot基于Streamable-HTTP构建MCP-Server
spring boot·sse·curl·mcp·mcp-server·spring-ai·streamable
草帽lufei15 小时前
OpenAI API调用实践文本分类和内容生成
openai·agent
康de哥1 天前
MCP Unity + Claude Code 配置关键步骤
unity·mcp·claude code
田井中律.1 天前
MCP协议
mcp
通义灵码1 天前
Qoder 支持通过 DeepLink 添加 MCP Server
人工智能·github·mcp
草帽lufei2 天前
OpenAI API从0到1基础调用实践
openai
酩酊仙人3 天前
fastmcp构建mcp server和client
python·ai·mcp
魁首3 天前
OpenAI Codex 深入剖析:下一代 AI 编程助手的架构与原理
前端·openai·ai编程
kwg1263 天前
本地搭建 OPC UA MCP 服务
python·agent·mcp