<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Function Calling on Code Plato</title><link>https://CodePlato3721.github.io/zh/tags/function-calling/</link><description>Recent content in Function Calling on Code Plato</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Mon, 07 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://CodePlato3721.github.io/zh/tags/function-calling/index.xml" rel="self" type="application/rss+xml"/><item><title>我们什么时候不需要MCP</title><link>https://CodePlato3721.github.io/zh/post/%E6%88%91%E4%BB%AC%E4%BB%80%E4%B9%88%E6%97%B6%E5%80%99%E4%B8%8D%E9%9C%80%E8%A6%81mcp/</link><pubDate>Mon, 07 Sep 2026 00:00:00 +0000</pubDate><guid>https://CodePlato3721.github.io/zh/post/%E6%88%91%E4%BB%AC%E4%BB%80%E4%B9%88%E6%97%B6%E5%80%99%E4%B8%8D%E9%9C%80%E8%A6%81mcp/</guid><description>&lt;img src="https://pub-deacd49348914a49b1254b01f351ef0d.r2.dev/2026/09/when-you-don-t-need-mcp/cn/banner.png" alt="Featured image of post 我们什么时候不需要MCP" /&gt;&lt;h2 id="问题"&gt;问题&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;经常看到招聘 JD 上写着 MCP，似乎每个人都要会 MCP 才能做 agent 开发&lt;/li&gt;&#10;&lt;li&gt;又有人说 MCP 太重了，没什么人用 MCP&lt;/li&gt;&#10;&lt;li&gt;我们又会看到很多教程说，使用 MCP 统一接口很好用&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;我们平时看到的教程都是介绍 MCP 是什么，为什么要用 MCP。说了很多，其实大家还是不能直观地理解 MCP 的取舍。我今天就反过来说说什么时候不需要 MCP，来帮助大家更直观地感受 MCP。&lt;/p&gt;&#10;&lt;h2 id="mcp是什么"&gt;MCP是什么&#10;&lt;/h2&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;MCP（Model Context Protocol，模型上下文协议）&lt;/strong&gt; 是 Anthropic 发起的一个开放协议，用来让 AI 应用（比如 Claude Code、Claude Desktop、OpenClaw 这些 agent）用&lt;strong&gt;统一的方式&lt;/strong&gt;去发现和调用外部工具、读取外部资源&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;这是字面上的概念。实际上你可以把 MCP 看作是暴露给 agent 的一种资源。在 MCP 出现之前，如果你想让一个 AI 应用连上 Google Drive、GitHub、Slack 这些服务，&lt;strong&gt;每个 AI 应用&lt;/strong&gt;都得为每一个外部服务单独写一套集成代码。&#10;MCP 相当于给这个连接关系定义了一个&amp;quot;标准插座&amp;quot;。&lt;/p&gt;&#10;&lt;h2 id="不用mcp用什么"&gt;不用MCP用什么&#10;&lt;/h2&gt;&lt;p&gt;如果不用 MCP，我们还有很多别的东西可以选择。最重要的是两种：&#10;&lt;strong&gt;function calling：&lt;/strong&gt; 2023 年 OpenAI 推出了 function calling 的能力。其实很简单，就是你先把一段函数签名传给 LLM。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-arduino" data-lang="arduino"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;get_weather&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;查询某个城市当前的天气&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;input_schema&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#34;city&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;string&amp;#34;&lt;/span&gt;}},&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;LLM 知道有一个 tool 之后，如果 LLM 在执行过程中觉得需要调用这个外部工具，那么执行结果的 &lt;code&gt;content&lt;/code&gt; 内会多出一个 &lt;code&gt;tool_use&lt;/code&gt; 对象，并且 &lt;code&gt;stop_reason&lt;/code&gt; 也会写 &lt;code&gt;tool_use&lt;/code&gt;。就像：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: [&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;tool_use&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;get_weather&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;input&amp;#34;&lt;/span&gt;: {&lt;span style="color:#f92672"&gt;&amp;#34;city&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;new york&amp;#34;&lt;/span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;stop_reason&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;tool_use&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后你就自己写代码去实现这个函数调用。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; response.stop_reason &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tool_use&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tool_use &lt;span style="color:#f92672"&gt;=&lt;/span&gt; response.content[&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ... 调用查天气的函数&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当然实际工作中没这么土，你可以用 LangChain 之类的框架。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;CLI：&lt;/strong&gt; 其实也是一种 &lt;strong&gt;function call&lt;/strong&gt;，只不过你就只暴露一种 tool，而且直接告诉 LLM 这就是个 bash，你想执行什么命令就自己写命令。好处就是你不需要告诉 LLM bash 能干啥，要怎么用。因为 LLM 在阅读了大量资料后，它本来就知道怎么写 bash 命令。&lt;/p&gt;&#10;&lt;p&gt;但是使用 &lt;strong&gt;CLI&lt;/strong&gt; 有一定风险，权限控制不好做。&lt;/p&gt;&#10;&lt;h2 id="模型视角感受"&gt;模型视角感受&#10;&lt;/h2&gt;&lt;p&gt;首先你必须知道一件事情：模型根本不知道你调用的是 MCP 还是 function calling。&#10;比如，当你注册查询天气这个工具的时候，如果使用 MCP 注册，那么模型看到的 tools 是这样的：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;get_weather&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Get the current weather for a specified city&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;input_schema&amp;#34;&lt;/span&gt;: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;object&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;city&amp;#34;&lt;/span&gt;: {&lt;span style="color:#f92672"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;string&amp;#34;&lt;/span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果你用 function calling，模型看到的 tools 是这样的：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;get_weather&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Get the current weather for a specified city&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;input_schema&amp;#34;&lt;/span&gt;: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;object&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;city&amp;#34;&lt;/span&gt;: {&lt;span style="color:#f92672"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;string&amp;#34;&lt;/span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我们现在来玩一个游戏，你能看出这两个 JSON 的区别吗？答案是它们没有区别。所以不需要纠结用 MCP 跟 function calling 会对模型造成什么影响。对模型来说，根本就没有区别。&lt;/p&gt;&#10;&lt;h3 id="mcp的缺点"&gt;MCP的缺点&#10;&lt;/h3&gt;&lt;p&gt;那么 MCP 既然这么好，为什么不都用 MCP 呢？因为 MCP 有缺点：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;上下文开销大：&lt;/strong&gt; 一旦连接上一个 MCP server，这个 server 暴露的&lt;strong&gt;所有&lt;/strong&gt;工具的完整 schema（名字、参数、描述）都会被提前塞进模型的上下文窗口，不管这次对话用不用得上。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;消耗服务器资源：&lt;/strong&gt; MCP Server 是一个持续存在、需要一直跑着的东西。你启动的 MCP Server 多了，服务器的 CPU、内存都会被消耗。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;运维负担：&lt;/strong&gt; MCP server 既然是一个独立进程，你需要自己负责它崩溃后重启、多个 server 间的启动顺序，以及内部状态的持续维护。&lt;/p&gt;&#10;&lt;h3 id="mcp的优点"&gt;MCP的优点&#10;&lt;/h3&gt;&lt;p&gt;MCP 听起来很糟糕啊。那为什么那么多公司还是继续使用 MCP 呢？因为它虽然有很多缺点，但是它最大的优点就是统一了项目资源的集成接口。统一接口这件事情本身就有 2 个好处：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;调用代码简洁：&lt;/strong&gt; 这东西不做软件的人感觉不出它的好处。做软件的人听到统一接口都知道它好。你原来几千行的屎山代码，可能突然就变成十几行了。接口一多，bug 就埋藏得多、埋藏得深，维护起来就没完没了。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;接入第三方资源简单：&lt;/strong&gt; 所有第三方资源都做成了 MCP，这下接入资源不用再花费很多精力去做定制化了。这件事情其实也没什么技术含量，就跟统一货币、度量衡一样。关键是得有人去做这件事情。&lt;/p&gt;&#10;&lt;h2 id="结论"&gt;结论&#10;&lt;/h2&gt;&lt;p&gt;如果你的需求是以下其中一种：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;你想用第三方做的工具&lt;/li&gt;&#10;&lt;li&gt;你在用你们团队多平台公用的工具&lt;/li&gt;&#10;&lt;li&gt;你想做多角色权限区分&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;那么你可以考虑使用 MCP，否则的话，使用其他轻量化方法，比如 function calling 就够了。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="关于作者"&gt;关于作者&#10;&lt;/h2&gt;&lt;p&gt;我是代码Plato。&lt;/p&gt;&#10;&lt;p&gt;我相信，人类的创造力才是 AI Coding 的真实之树，而代码与模型不过是投射在洞穴墙上的影子。&lt;/p&gt;&#10;&lt;p&gt;微博：@代码Plato&#10;主页：https://weibo.com/u/1041257881&lt;/p&gt;&#10;</description></item></channel></rss>