稀土掘金技术社区 05月08日 15:45
聊一下MCP,希望能让各位清醒一点吧🧐
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文探讨了MCP(Model-Client Protocol)协议在AI工具调用中的应用,通过实际代码示例分析了MCP的核心逻辑,并对比了MCP与传统Function call的异同。文章指出MCP本质上是一个协议,而非提升大模型工具调用能力的手段,并分析了MCP在生态构建中的战略意义,最后分享了作者对MCP的使用策略和建议。

💡 **MCP的核心是Function call**: MCP 并非一项新技术,其工具调用能力依赖于Function call。文章通过代码示例展示了MCP客户端调用AI的Function call能力,进而决定是否使用工具,实现API调用并返回结果。

🤔 **MCP的实际应用与挑战**: 在实际生产环境中,Function call面临工具调用准确性、参数提取准确性以及多意图识别等挑战。文章强调了MCP的本质是协议,并未提升大模型的工具调用能力。

💰 **MCP的成本考量**: 部署MCP服务器涉及成本,尤其对于非收费产品而言。文章提到了百度地图和阿里的百炼等应用,并指出第三方API调用可能产生的额外费用。

🤝 **MCP的生态意义与竞争**: MCP作为一种技术标准化协议,旨在解决AI模型与外部工具集成的碎片化问题。文章分析了MCP背后Anthropic等大厂对AI生态主导权的竞争,以及MCP在行业标准制定中的潜在影响。

2025-04-30 08:30 重庆

最近正在忙着准备 AI 产品示例项目的数据,但是有好几群友问了MCP的问题,先花点时间给大家安排一下 MCP。

(💰金石瓜分计划回归,速戳上图了解详情🔍)

最近正在忙着准备 AI 产品示例项目的数据,但是有好几群友问了MCP的问题,先花点时间给大家安排一下 MCP。作为一个带队落地 AI 应用的真实玩家,是怎么看待 MCP 的?

先说观点:「MCP 不错,但它仅仅是个协议而已」,很多科普文章中,提到的更多都是愿景,而不是落地的场景。

本文不再重新陈述 MCP 的基本概念,而是旨在能让大家了解的是 MCP 有什么用?怎么用?要不要用?

我准备了一份MCP实现的核心代码,只保留必要的内容,五分钟就能看明白 MCP 回事。

先上代码,让我们看看实现 MCP 最核心的部分我们都干了些什么东西。顺便让大家看看 MCP 到底和 Function call 是个什么关系

此处只贴用于讲解的代码,其他代码基本都是逻辑处理与调用。也可关注公众号:【华洛 AI 转型纪实】,发送mcpdemo,来获取完整代码。

MCP 代码核心逻辑

我们在本地运行的 MCP,所以使用的是Stdio模式的客户端和服务端。也就是:StdioServerTransportStdioClientTransport

先看打满日志的 demo 运行起来起来后,我们获得的信息:

我们的服务端写了两个简单的工具,加法减法

服务端启动成功之后,客户端成功的从服务端获取到了这两个工具。

我们发起了一个问题:计算1+1

接下来做的事情就是 MCP 的客户端核心三步逻辑:

    客户端调用 AI 的 function call 能力,由 AI 决定是否使用工具,使用哪个工具。

    客户端把确定要使用的工具和参数发送回服务端,由服务端实现 API 调用并返回结果。

    客户端根据结果,再次调用 AI,由 AI 进行回答。

我们一边看代码一边说里面的问题:

第一步调用 AI,决定使用工具

客户端代码:

      const response = await this.openai.chat.completions.create({    model: model,    messages,    tools: this.tools, // ! 重点看这里,this.tools是服务端返回的工具列表  });

    看到了么?这里用的还是 Function call! 谣言一:MCP和Function call没关系,MCP就可以让大家调用工具,终结了。MCP 就是用的 function call 的能力来实现的工具调用。当然我们也可以不用 Function call,我们就直接用提示词判断,也是可以的。

    这里要说的是:MCP就是个协议。并没有给大模型带来任何新的能力,也没有某些人说的 MCP 提升了 Function call 的能力,以后不用 Function call 了,用 MCP 就够了这种话,千万不要被误导。

    「MCP 并没有让大模型的工具调用能力提升」

    在真实的生产环境中,目前 Function call 主要的问题有:

      工具调用准确性不够。 真正的生成环境可能不是三个五个工具,而是三十个五十个。工具之间的界限不够清晰的话,就会存在模型判断不准确的情况。

      参数提取准确性不够。 特别是当一个工具必填加选填的参数达到十个以上的时候,面对复杂问题,参数的提取准确率会下降。

      多意图的识别。
      用户的一个问题涉及到多个工具时,目前没有能够稳定提取的模型。

    第二步把工具和参数发回服务端,由服务端调用 API

    客户端代码:

      const result = await this.mcp.callTool({  name: toolName,  arguments: toolArgs,});

      服务端的代码:

        server.tool(  "加法",  "计算数字相加",  {    "a": z.number().describe("加法的第一个数字"),    "b": z.number().describe("加法的第二个数字"),  },  async ({ a, b, c }) => {    console.error(`服务端: 收到加法API,计算${a}${b}两个数的和。模型API发送`    // 这里模拟API的发送和使用    let data = a + b    return {      content: [        {          type"text",          text: a + '+' + b + '的结果是:' + data,        },      ],    };  },);

        发现问题了么? API 是要有 MCP 服务器提供者调用的。「要花钱的朋友!」

        每一台 MCP 服务器背后都是要成本的,收费产品进行 MCP 服务器的支持还说的过去,不收费的产品全靠爱发电。更不要说,谁敢在生成环境接一个不收费的私人的小服务器?

        百度地图核心 API 全面兼容 MCP 了,百度地图是收费的,进行多场景的支持是很正常的行为。

        来看看百炼吧,阿里的百炼目前推出了 MCP 的功能,支持在百炼上部署 MCP server。

        也是要花钱的朋友~,三方 API 调用费用另算。

        阿里的魔塔社区提供了大量的 MCP,可以看到有一些大厂的服务在,当然有收费的有免费的,各位可以尝试

        第三步客户端根据结果,再次调用 AI,由 AI 进行回答。

        客户端代码:

          messages.push({  role"user",  content: result.content,});
          const aiResponse = await this.openai.chat.completions.create({  model: model,  messages: messages,});

          从服务端返回的结果,添加到messages中,配合提示词由大模型进行回复即可。

          这一步属于正常的流程,没什么好说的。

          那么问题是:我们使用 MCP 来实现,和我们自己实现这套流程有什么区别么?我们为什么要用 MCP 呢?

          当初群里朋友第一次提到 MCP 的时候,我去看了一眼文档,给了这样的结论:

          大厂为了抢生态做的事情,给落地的流程中定义了一些概念,多了脑力负担,流程和自己实现没区别。

          对于工具的使用,自己实现和用 MCP 实现有什么区别么?

          自己实现的流程和逻辑是这样的:

            我们的提示词工程师写好每个工具的提示词
            我们的后端工程师写好模型的调用,使用的是前面写好的提示词
            提供接口给前端,等待前端调用
            前端调用传入 query,后端通过 AI 获取了工具
            通过工具配置调用 API,拿到数据交给 AI,流式返回用户。

          MCP 的逻辑是这样的:

            我们的提示词工程师写好每个工具的提示词
            我们后端工程师分别写好 MCP 服务端、MCP 客户端
            MCP 客户端提供个接口给前端,等待前端调用
            前端调用传入 query,MCP 客户端调用 AI,获取了工具。
            客户端把确定要使用的工具和参数发送会服务端,由服务端实现 API 调用并返回结果。
            客户端根据结果,再次调用 AI,由 AI 进行回答,流式返回用户。

          「看吧,本质上是没有区别的。」

          什么?你说 MCP 服务端,如果日后需要与其他企业进行合作,可以方便的让对方的 MCP 客户端调用? 我们的客户端也可以很方便的接入别人的 MCP 服务端。

          不好意思,不用 MCP 也可以,因为 Function call 的参数格式已经确定了,这里原本存在差异性就极小。而且 MCP 也并没有解决这个差异性。还是需要客户端进行修改的。

          MCP 真正的意义

          现在还是诸神混战时期,整个 AI 产品的上下游所有的点,都具有极高的不确定性。

          MCP 给出了一个技术标准化的协议,是大家共建 AI 的愿景中的一环,潜力是有的。

          但是 Anthropic 真的只是在乎这个协议么?前面的内容我们也看到了,MCP 和我们自己实现的流程几乎是一样的。但是为什么还要提出 MCP 呢?

          「为了生态控制权和行业话语权。」

          MCP 它表面上是一个开放的协议,旨在解决 AI 模型与外部工具集成的碎片化问题,但其实他就是 Anthropic 对未来 AI 生态主导权的竞争。

          未来 MCP 如果真的作为一个标准的协议成为大家的共识,围绕这个协议,甚至每家模型的工具调用格式都将被统一,此时 Anthropic 在委员会里的位置呢?不言而喻啊。

          结语

          最后把我的策略分享给大家吧:

          「打算在圈子里玩的部分,就和大家用一样的,不在圈子里玩的,其实自己团队实现也是 OK 的。」

          我这边更多的是自己团队实现的,而且在这个实现过程中大家对模型应用、AI 产品的理解不断地在提升。

          希望各位读者也多进行尝试,这样未来面对新出的各路牛鬼蛇神时大家才能有更多的判断力。

          共勉吧!

          ☺️你好,我是「华洛」,如果你对程序员转型 AI 产品负责人感兴趣,请给我点个赞。

          已入驻【稀土掘金】,欢迎大家围观,后续会分享大量最近三年来的经验和踩过的坑。


          关注更多AI编程资讯请去AI Coding专区:https://juejin.cn/aicoding

          阅读原文

          跳转微信打开

          Fish AI Reader

          Fish AI Reader

          AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

          FishAI

          FishAI

          鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

          联系邮箱 441953276@qq.com

          相关标签

          MCP协议 AI工具调用 Function call AI生态
          相关文章