MCP是什么,可以通俗易懂的讲解一下吗?

头像
Hashan
    254
    新疆乌鲁木齐市

    MCP是什么,可以通俗易懂的讲解一下吗?

    看过MCP文档,但是知识点还是模糊

    阅读 1.4k
    6 个回答

    Model Context Protocol

    简单点说就是让模型能够调用外部工具,类似function calling的功能。

    在调用AI模型接口的时候,告诉AI模型它可以调用哪些“工具”,然后客户端收到调用的请求,执行对应的工具,再将工具的返回结果提交给AI模型。

    然后这个 mcp 就可以说是一个标准协议,这个协议定义了AI客户端怎么去调用哪些工具、自己开发的工具可以通过实现mcp的协议,让工具被AI客户端调用。

    简单来说,就是一个大模型调用到工具函数的一个通用协议,原本的function call可能只是各家是各家的,openai的开发了后,还需要转到claude去用,或者Claude开发的转到openai去用,不那么适配和方便。因为你需要了解这两家各自的标准。

    image.png

    那么MCP出来后呢,就是把这一块给统一了,相当于在工具和大模型之间加了一层通用协议层,大模型和工具之间不需要各自适配,只要工具实现协议的server,大模型客户端实现client从server取工具,即可。那么大家都公认这么一套流程,开发server和通过client获取server中的tool、resource、prompt等,都是一个规范。

    image.png

    不论是python、还是js/ts、或者是go,大家都遵循这个参数标准去做sdk开发,任意大模型调用都很方便通过其去适配开发。

    给你个例子看看:

    python:

    app = Server("example-server")
    
    @app.list_tools()
    async def list_tools() -> list[types.Tool]:
        return [
            types.Tool(
                name="calculate_sum",
                description="Add two numbers together",
                inputSchema={
                    "type": "object",
                    "properties": {
                        "a": {"type": "number"},
                        "b": {"type": "number"}
                    },
                    "required": ["a", "b"]
                }
            )
        ]
    
    @app.call_tool()
    async def call_tool(
        name: str,
        arguments: dict
    ) -> list[types.TextContent | types.ImageContent | types.EmbeddedResource]:
        if name == "calculate_sum":
            a = arguments["a"]
            b = arguments["b"]
            result = a + b
            return [types.TextContent(type="text", text=str(result))]
        raise ValueError(f"Tool not found: {name}")

    typescript:

    const server = new Server({
      name: "example-server",
      version: "1.0.0"
    }, {
      capabilities: {
        tools: {}
      }
    });
    
    // Define available tools
    server.setRequestHandler(ListToolsRequestSchema, async () => {
      return {
        tools: [{
          name: "calculate_sum",
          description: "Add two numbers together",
          inputSchema: {
            type: "object",
            properties: {
              a: { type: "number" },
              b: { type: "number" }
            },
            required: ["a", "b"]
          }
        }]
      };
    });
    
    // Handle tool execution
    server.setRequestHandler(CallToolRequestSchema, async (request) => {
      if (request.params.name === "calculate_sum") {
        const { a, b } = request.params.arguments;
        return {
          content: [
            {
              type: "text",
              text: String(a + b)
            }
          ]
        };
      }
      throw new Error("Tool not found");
    });

    可以看到,虽然不同语言写法不同,但是都遵循一个mcp协议的规范。以tool为例子就是:

    types.Tool(
        name="calculate_sum",
        description="Add two numbers together",
        inputSchema={
            "type": "object",
            "properties": {
                "a": {"type": "number"},
                "b": {"type": "number"}
            },
            "required": ["a", "b"]
        }
    )

    都必须按照 namedescriptioninputSchema 来规范你的工具的参数。

    这样开发完之后,你去适配Claude还是openai又或是google家的,都可以从mcp的标准协议去解析各自的tool,然后传给对应的客户端去使用,大模型可以自由选择目前的工具去调用使用。

    新手上路,请多包涵

    llm 的 usb

    MCP,全称 Model Context Protocol(模型上下文协议),可以简单理解为一种让人工智能(AI)与外部工具和数据源无缝交互的标准化协议。它就像给AI装了一个“万能接口”,类似于USB-C接口,统一了AI与各种工具和数据的连接方式。

    通俗点说,MCP的作用是让AI更聪明地使用外部资源。例如:

    • 假设你有一个AI助手,它可以通过MCP读取你的电脑文件、访问数据库,甚至连接到微信或其他应用。
    • 你只需要告诉AI:“帮我整理数学考试成绩,把不及格的名单更新到值日表,并通知他们补考。” AI就能通过MCP完成这些任务,而不需要你手动操作。

    MCP的优势包括:

    1. 标准化:统一了AI与工具的连接方式,减少了开发者重复造轮子的麻烦。
    2. 灵活性:支持多种AI模型和工具的无缝切换。
    3. 安全性:数据可以在本地处理,不需要上传到云端,保护隐私。

    它的架构分为三部分:

    • MCP主机:比如聊天机器人或AI驱动的IDE。
    • MCP客户端:负责与MCP服务器连接。
    • MCP服务器:提供工具、数据和上下文支持。
    新手上路,请多包涵

    MCP将AI应用设计成了类似微服务的架构,AI应用是调用方,其他工具、资源是被调用的服务,MCP服务器就是服务管理中心。MCP协议就是这套结构里各部分互相通信使用的协议。

    当用户向AI提出一个问题:“你能帮我设置一个10分钟后的闹钟吗?”
    AI:"我不知道当前时间,我也无法设置闹钟,因为我不会"

    这个时候我们就要想办法让AI能做到,然后我们可以将我们的问题再详细一下变成这样:
    :“你能帮我设置一个10分钟后的闹钟吗?备注:我这里有两个函数一个名字为getCurrentTime是获取当前时间,一个是setAlarm设置10分钟后的闹钟,需要一个参数是时间。你可以在需要的时候告诉我你要调用哪个函数,我可以帮你执行,然后把执行结果再发给你。”
    AI:“我首先需要知道当前时间,我现在需要调用getCurrentTime”
    :根据返回结果自己写代码调用getCurrentTime获取结果,然后将结果发给AI,"2025-4-27 11:36:42"
    AI:"有了当前时间,我现在需要调用setAlarm,传入参数为‘2025-4-27 11:36:42’设置闹钟"
    :自己写代码调用我现在需要调用setAlarm(2025-4-27 11:36:42)“我已经执行setAlarm函数”
    AI:"我已帮你设置好10分钟后的闹钟"

    好了,恭喜你理解了Function Call的原理,getCurrentTime,setAlarm这两个函数都是在我们自己本地的项目里面定义的,如果有第二个项目要用,或者其他人要用,他们要么自己再写一遍,造一遍轮子,要么你把你的函数封装成库,给他们引入调用,但是别人用的可能是C++,JAVA,JS,Python等等语言,没办法使用你的库,这个时候怎么办呢,有了,我们可以写一个HTTP服务器,暴露这两个接口,他们可以通过HTTP协议调用你这两个函数。

    好了再次恭喜你,你也理解了MCP的原理,你这服务就叫做MCP Server,他们就叫做MCP Client

    你可以把你的接口说明文档发布到互联网,恭喜你,你定义了一套MCP的协议规范!

    当然这些都只是雏形,实际情况比这个复杂,还有很多地方需要完善,比如MCP服务器不仅仅提供Function,还提供prompt模板,resouce资源等

    撰写回答
    你尚未登录,登录后可以
    • 和开发者交流问题的细节
    • 关注并接收问题和回答的更新提醒
    • 参与内容的编辑和改进,让解决方法与时俱进
    推荐问题
    宣传栏