到底什么是MCP?一文帮助你彻底搞懂

504 阅读6分钟

最近MCP(Model Context Protocol)的概念可谓是炙手可热,但是对它的定义众说纷纭,本着读书要读原著的原则,我们来打开MCP的官方网站,看看到底是怎么个事

先从概念入手

1、什么是MCP

模型上下文协议(MCP)是一个开放协议,旨在实现LLM应用程序与外部数据源和工具之间的无缝集成。它作为一种标准化的方式,将大模型与他们所需的上下文联系起来。

2、MCP解决了什么问题

MCP解决了AI和数据源之间碎片化集成的问题。它解决了AI与数据隔离并被困在信息孤岛后面的挑战,用一个通用协议取代了多个自定义实现。

3、谁开发了MCP

由Anthropic公司开发

4、MCP有哪些使用场景

MCP可用于各种场景,包括:构建AI驱动的ide,增强聊天界面,创建自定义AI工作流,将AI系统与外部数据源连接起来。

5、为什么MCP对AI发展如此重要

MCP很重要是因为它提供了一个通用的开放标准,使人工智能系统访问所需数据变得更简单、更可靠,从而能够更好地扩展连接系统。

6、与传统的集成方式相比,MCP的主要优势是什么

主要优势是 MCP 通过提供单一、标准化的协议消除了为每个新数据源进行自定义实现的需要,从而更容易扩展和维护需要访问多个数据源的 AI 系统。


概念总结

上面问题的回答重复性很高,总结来说,MCP就是由Anthropic公司提出的一套用来实现LLM与外部数据源和工具之间的标准化通讯方式,使得LLM可以与用户需要的上下文信息连接起来

至于用户需要的上下文信息是什么?它可能是figma设计稿数据、gitlab代码数据、内部文档数据、服务器日志数据、或者回答某个特定问题背后所需要的深厚知识背景等等...


MCP的架构模型

image.png

先上原图,可以看到也是传统的C/S架构,我们把它分为3个部分来看

第一部分就是我们常用的客户端ClaudeCursorTrae等;
第二部分是我们需要配置使用的MCP服务,可以是三方开源的,也可以是自己搭建的,它们与我们的客户端通过MCP协议进行互通;
第三部分是既有的东西,可以是内部的数据源、也可以是公网上的某些远端服务,它们与MCP Server如何连接呢?答案是可以任何方式,比如web api\数据库连接访问\FTP

  • MCP最终的工作流程: image.png

  • 使用MCP回答问题背后发生了什么

*准备工作:客户端(Claude、Cursor)通过连接了MCP Servers, 而MCP Servers通过各自的方式可访问特定的元数据

  1. 用户将问题发送给客户端(Claude、Cursor)
  2. 客户端分析可用的MCP Servers并决定使用哪一个
  3. 客户端执行所选的服务工具,通过MCP获取上下文内容,结合用户问题将context发送给AI模型
  4. AI模型将回答结果发回给客户端
  5. 客户端转换为自然语言回应,并将答案显示给用户

寻找一个使用场景

  • 给AI一个内部文档地址,让它根据文档内容帮忙实现一个代码需求,但是这个文档需要鉴权才能访问,你可以编写一个MCP服务来帮助LLM读取到文档内容
  • 你需要让AI根据某个MySQL数据库的表数据来汇总用户地域分布情况、年龄分布情况等,此时,你可以通过编写MCP Server,为LLM提供该元数据
  • 你需要让AI根据figma的某个设计稿生成一个静态页面代码,此时,你可以通过MCP Server让LLM成功获取到figma里的设计稿元数据,并根据你提供的Promats来进行生成
  • 你需要搭建一个智能聊天机器人,你想让这个机器人所有的回答都利用某个建设好的知识库内容,此时,你需要使用MCP服务桥接知识库给LLM作为回答的知识背景
  • ......

如何开发一个MCP Server

(1)开发前需要储备的知识
  • 1、官方是有提供SDK的,目前语言版本有Python、TS、Java、Kotlin、C#
  • 2、MCP servers可以提供三种主要的功能类型,分别是:
    Resources(资源) : 客户端可以直接读取的类似文件的数据(例如 API 响应或文件内容)
    Tools(工具) : 经用户批准后,可由 LLM 调用的函数
    Prompts(提示词):预先编写的提示词模板,帮助用户完成特定任务(有点类似智能体)
  • 3、MCP servers需要选定传输协议才能和Client通讯,服务器的启动方式取决于所选择的传输协议,TS可选如下2种方式:
    stdio(标准输入输出): 对于命令行工具的执行,可直接集成,适用于可通过脚本完成的任务,优点是无需搭建服务,缺点是需要用户有执行脚本的配置环境,比如node、py,脚本可远程托管到对应的包管理上。

Streamable HTTP(可流式传输的HTTP):(舍弃了HTTP with SSE方案,见附录)适用于远端的MCP服务,它又分为With Session ManagementWithout Session Management (Stateless)两种方式,前者是有会话状态管理的,适合复杂的任务交互,可以维护会话的上下文,也支持水平拓展;后者是无会话状态管理的,每个请求都是独立的,适合简单的工具API。

(2)开发一个stdio传输方式的demo
#!/usr/bin/env node
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

async function main() {
  const server = new McpServer({
    name: "internal-doc-server",
    version: "1.0.0",
  });

  // ... set up server resources, tools, and prompts ...

  server.tool(
    "get_doc_content",
    "获取内部文档内容",
    { doc_url: z.string().describe("文档链接") },
    async ({ doc_url }) => {
      // 登录获取cookie
      const data = new FormData();
      const token = process.env.MY_TOKEN || "";
      if (token) {
        data.append("token", token);
      } else {
        throw new Error("MY_TOKEN is not set");
      }

      const loginResp = await fetch(
        "https://xxx.com/login",
        {
          method: "POST",
          body: data,
          redirect: "manual",
        }
      );

      const loginCookie = loginResp.headers
        .get("set-cookie")
        .split(";")[0];

      // 获取文档内容
      const docResp = await fetch(
        `${doc_url}`,
        {
          headers: {
            cookie: `${loginCookie}`,
          },
          body: null,
          method: "GET",
        }
      );
      const docData = await docResp.text();

      return {
        content: [
          {
            type: "text",
            text: docData,
          },
        ],
      };
    }
  );

  const transport = new StdioServerTransport();
  await server.connect(transport);
}

main();

(3)配置到Cursor上

打开添加MCP,配置如下JSON即可

{
  "mcpServers": {
    "internal-doc-server-mcp": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "internal-doc-server@1.0.0"
      ],
      "env": {
        "MY_TOKEN": "xxx",
      }
    }
  }
}

如何开发一个MCP Client

MCP Client的开发需求较少,它通常是集成在一个具有实际业务意义的客户端里,比如AI Coding的IDE、AI聊天的客户端等,具体开发流程参照官方文档,这里不过多解读 modelcontextprotocol.io/quickstart/…

附录