<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Claude on Chico's Tech Blog</title><link>https://realtime-ai.chat/tags/claude/</link><description>Recent content in Claude on Chico's Tech Blog</description><image><title>Chico's Tech Blog</title><url>https://github.com/chicogong.png</url><link>https://github.com/chicogong.png</link></image><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 18 May 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://realtime-ai.chat/tags/claude/index.xml" rel="self" type="application/rss+xml"/><item><title>2026 大模型选型:别问「哪个最强」,问「哪个够用」</title><link>https://realtime-ai.chat/posts/llm-selection-2026/</link><pubDate>Mon, 18 May 2026 10:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/llm-selection-2026/</guid><description>2026 年大模型选型不该看跑分排名。这篇给一套按场景选型的决策框架:能力梯队、推理成本、延迟、上下文、闭源开源、私有化部署,附决策流程图。</description><content:encoded><![CDATA[<p>去年我们一个内部项目,用 Claude Opus 跑一个意图分类:输入一句用户的话,输出三个标签之一。上线两周,有人去看账单,愣住了——这个分类任务,一个 14B 的开源模型在自己的卡上跑,效果差不了几个点,成本是它的几十分之一。</p>
<p>这就是 2026 年选型最常见的错误:<strong>把&quot;哪个模型最强&quot;当成了&quot;我该用哪个模型&quot;。</strong></p>
<p>这两个问题根本不是一回事。GPQA、SWE-bench、ARC-AGI-2 这些榜单告诉你的是天花板,而你大部分的线上请求,离天花板远着呢。一个分类、一段摘要、一次格式化抽取——这些活儿,旗舰模型是高射炮打蚊子。选型不是选最强,是给<strong>每一类任务</strong>配一个&quot;刚好够用、且最便宜&quot;的模型。</p>
<p>这篇不排名。给你一套按场景拆的决策框架。</p>
<h2 id="先认清2026-年的模型是分梯队的">先认清:2026 年的模型是分梯队的</h2>
<p>2026 年 5 月,前沿模型大概是这么个格局——记住具体版本号意义不大,它们每两三个月就跳一次,记住<strong>梯队</strong>就行:</p>
<table>
  <thead>
      <tr>
          <th>梯队</th>
          <th>代表模型(2026.05)</th>
          <th>典型 API 价格(输入/输出,每百万 token)</th>
          <th>该干什么</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>旗舰</td>
          <td>GPT-5.5、Claude Opus 4.7、Gemini 3.1 Pro</td>
          <td>$5 / $25 量级</td>
          <td>复杂推理、Agent 编排、难代码</td>
      </tr>
      <tr>
          <td>主力</td>
          <td>Claude Sonnet 4.6、Gemini 3 Flash、DeepSeek V4-Pro</td>
          <td>$1–3 / $3–15 量级</td>
          <td>绝大多数生产任务</td>
      </tr>
      <tr>
          <td>快而省</td>
          <td>Claude Haiku 4.5、Gemini 3 Flash-Lite、DeepSeek V4-Flash</td>
          <td>$0.1–1 / $0.3–5 量级</td>
          <td>分类、抽取、路由、简单问答</td>
      </tr>
  </tbody>
</table>
<p>这张表里藏着一个关键事实:<strong>旗舰和&quot;快而省&quot;之间,输出价格差了几十倍。</strong> DeepSeek V4-Flash 的输出大约 $0.28,GPT-5.5 是 $30——一百多倍。这个差距不是边角料,它会直接决定你的产品能不能规模化。</p>
<p>而梯队之间的<strong>能力</strong>差距,这两年反而在缩小。2024 年你能明显感觉到旗舰和主力不是一个物种;2026 年,在很多具体任务上,主力模型只比旗舰差几个百分点,有时候你压根测不出来。能力在收敛,价格还拉得很开——这就是&quot;按梯队选型&quot;能省钱的根本原因。</p>
<p>所以第一条原则:<strong>默认从主力梯队起步,只在它确实顶不住时才往上抬。</strong> 不要反过来,从旗舰往下砍——那样你永远不知道下面那一档是不是早就够了。</p>
<h2 id="维度一能力够不够要按任务类型问">维度一:能力够不够,要按&quot;任务类型&quot;问</h2>
<p>&ldquo;够用&quot;不是一个模糊的感觉,它可以拆。把你的任务大致归到三类:</p>
<p><strong>确定性任务</strong>——分类、实体抽取、格式转换、敏感词过滤。这类任务有标准答案,对错可量化。结论很直接:<strong>用快而省梯队,甚至小开源模型。</strong> 旗舰在这里没有任何优势,它多出来的&quot;智商&quot;在一个三选一的分类题上无处发挥。我前面说的那个翻车案例,就是这一类。</p>
<p><strong>生成与改写任务</strong>——写文案、做摘要、客服话术、翻译。这类没有唯一答案,但对&quot;质量&quot;敏感。主力梯队是甜区。值得一提:Claude 系列在中长文写作上的语感明显更自然,一次能稳定输出十几万 token 不塌;如果你的产品核心就是&quot;写得像人&rdquo;,这个差异值得你多花那点钱。</p>
<p><strong>推理与 Agent 任务</strong>——多步代码、需要调工具、长链路规划、&ldquo;自己想办法完成&rdquo;。这是 2026 年唯一<strong>真的需要旗舰</strong>的地方。一个 Agent 要连续做二三十步,每一步的小错误会累积,中间某一步判断失误,后面全废。这种场景下,旗舰多出来的几个点,放大到整条链路就是&quot;能跑通&quot;和&quot;跑不通&quot;的区别。GPT-5.5、Claude Opus 4.7 这一档,贵有贵的道理——但前提是,你的任务真的是 Agent,而不是被包装成 Agent 的一次性问答。</p>
<p>一个实操建议:<strong>别用一个模型扛所有任务。</strong> 成熟的做法是按任务路由——一个便宜模型做分流和简单活儿,难的才转交旗舰。这比&quot;全程旗舰&quot;省一大笔,也比&quot;全程便宜&quot;靠谱。</p>
<h2 id="维度二成本不是单价是单价--调用量--输出长度">维度二:成本不是单价,是「单价 × 调用量 × 输出长度」</h2>
<p>很多人看 API 价格,只瞄一眼那个&quot;每百万 token 多少钱&quot;。这是不够的。真正的账是三个数相乘:</p>
<ul>
<li><strong>单价</strong>——尤其是<strong>输出</strong>单价,通常是输入的 3 到 5 倍,而且 Agent 类任务输出占比高。</li>
<li><strong>调用量</strong>——一天一千次还是一千万次,差四个数量级。</li>
<li><strong>平均输出长度</strong>——让模型&quot;先想再答&quot;(reasoning)能提质量,但思考链本身也是要付费的 token。</li>
</ul>
<p>把这三个乘起来,你常会得到一个反直觉的结论。举个例子:一个日活几万的客服机器人,绝大多数对话是&quot;查物流&quot;&ldquo;改地址&quot;这种,真正复杂的咨询可能只占 5%。如果你全程用旗舰,等于为了那 5% 的复杂场景,给 95% 的简单场景也付了旗舰价。把 95% 切到主力或快省梯队,月成本可能直接砍掉七八成,用户一点感知都没有。</p>
<p>两个几乎免费、却经常被忘掉的省钱手段,务必用上:</p>
<ul>
<li><strong>Prompt Caching(提示缓存)</strong>——固定不变的前缀(system prompt、长文档、few-shot 例子)缓存住,命中后这部分输入便宜约 90%。多轮对话、RAG、批量同模板任务,收益巨大。</li>
<li><strong>Batch(批处理)</strong>——不要求实时返回的任务,走批处理接口,普遍五折。离线打标、夜间报表、内容审核这类活儿,没理由不用。</li>
</ul>
<p>记住:<strong>选型省下的钱,常常比换一个&quot;更便宜的模型&quot;省得还多。</strong> 因为它省的是结构性的浪费。</p>
<h2 id="维度三延迟上下文被场景一票否决的硬约束">维度三:延迟、上下文——被场景一票否决的硬约束</h2>
<p>有些维度不参与&quot;性价比&quot;的权衡,它们是<strong>门槛</strong>:不过线,这个模型直接出局,多强多便宜都没用。</p>
<p><strong>延迟。</strong> 如果你做的是实时语音对话,用户说完到 AI 出声的预算只有几百毫秒(这个我在<a href="../voice-technology/voice-latency-budget/">上一篇</a>里专门拆过)。这种场景,你要盯的是<strong>首 token 延迟(TTFT)</strong>,不是模型聪不聪明。一个慢半拍的旗舰,体验上输给一个快的主力模型。反过来,如果是离线批处理,延迟根本不在你的考虑范围里——这时候为&quot;快&quot;付的溢价就是纯浪费。</p>
<p><strong>上下文长度。</strong> 2026 年长上下文已经不稀缺:Gemini 3.1 Pro 和 DeepSeek V4 都是 1M token 窗口,Llama 4 甚至把 10M 带进了开源世界。但<strong>有窗口不等于会用</strong>。把 50 万 token 一股脑塞进去,模型对中间段落的注意力会明显下降——业内说的 &ldquo;lost in the middle&rdquo; 没有消失。所以长上下文是个二元的资格题:你的单次任务真需要塞进一整本书、一个大代码库,那 1M 窗口是硬指标;如果你的输入本来就几千 token,纠结谁的窗口更大毫无意义,<strong>该花力气的是 RAG 的检索质量,而不是模型的窗口数字。</strong></p>
<p>判断方法很简单:<strong>先问&quot;这个场景能不能容忍 X&rdquo;,不能就直接划掉一批模型,再在活下来的里面比性价比。</strong> 别把硬约束和软偏好混在一起算。</p>
<h2 id="维度四闭源还是开源2026-年这道题变简单了">维度四:闭源还是开源,2026 年这道题变简单了</h2>
<p>两年前这是个艰难抉择,因为开源模型确实差一截。2026 年不一样了。</p>
<p>DeepSeek V4-Pro 在 SWE-bench Verified 上能摸到 80% 出头,和顶级闭源模型只差零点几个点,而且是 MIT 许可证。Qwen 3.5 / 3.6、Llama 4 也都在各自的领域逼近前沿。<strong>开源和闭源的能力差距,现在是用单个 benchmark 上的几个点来衡量,不再是&quot;差一代&quot;。</strong> 同时,主流开源模型现在发布即附带官方量化版本(Q4/Q5/Q8),部署门槛大幅下降。</p>
<p>所以这道题的判据,从&quot;谁更强&quot;变成了别的:</p>
<ul>
<li>选<strong>闭源 API</strong>:你要的是省心。不碰 GPU、不管扩缩容、要最新最强、出了事有人兜底。绝大多数从 0 到 1 的产品,该走这条路——你的精力应该花在产品上,不是运维推理集群。</li>
<li>选<strong>开源</strong>:你有三个理由之一——量足够大(自己跑的边际成本能把闭源 API 打下去)、需要深度微调(让模型长出领域知识)、或者数据不能出门(下一节细说)。</li>
</ul>
<p>还有个容易被忽视的点:<strong>开源是一份保险。</strong> 用闭源 API,你绑定了对方的定价、限流和模型下线节奏——它说某个版本退役,你就得连夜迁移。把一部分负载放在能自己掌控的开源模型上,是对供应商风险的对冲。</p>
<h2 id="维度五要不要私有化部署这题先于选模型">维度五:要不要私有化部署——这题先于选模型</h2>
<p>如果你的数据是病历、银行流水、未公开的财报、核心代码——<strong>这一条会推翻上面所有结论。</strong> 它不是一个性价比维度,它是法律和信任的红线。</p>
<p>判断私有化部署需求,问三个问题:</p>
<ol>
<li><strong>数据能不能离开你的网络?</strong> 受监管的医疗、金融、政务,答案常常是&quot;不能&quot;。</li>
<li><strong>合规要求审计闭环吗?</strong> 欧盟 AI 法案 2026 年 8 月全面生效,高风险系统要求可追溯、可解释、有人类监督。这些在一个黑盒 API 后面很难自证。</li>
<li><strong>数据主权有没有硬约束?</strong> 某些行业、某些地区,要求推理全程在境内、在自有设施内完成。</li>
</ol>
<p>只要有一个答案指向&quot;必须自己掌控&quot;,那就<strong>只能选能私有化的开源模型</strong>——Qwen、Llama、DeepSeek 这一类,把权重下载下来,跑在自己的 VPC 或机房里。这时候&quot;GPT-5.5 更强&quot;是一句正确的废话,因为它根本不在你的候选集里。</p>
<p>要提醒的是,私有化不是&quot;省钱&quot;的同义词。算上 GPU 采购或租赁、运维、扩缩容、安全加固,<strong>很多时候它比 API 更贵。</strong> 选它的理由是控制权和合规,不是成本。如果你既没有合规硬约束、量也撑不起一个推理集群,却因为&quot;感觉更安全&quot;去自建,那大概率是给自己挖坑。</p>
<h2 id="把这套框架连起来">把这套框架连起来</h2>
<p>选型不是从一张排行榜里挑第一名,而是带着你的场景,依次过几道闸门:</p>
<pre class="mermaid">flowchart TD
  A[一个具体任务] --> B{数据能否出本网络?}
  B -- 不能/强合规 --> P[私有化部署<br/>开源模型: Qwen / Llama / DeepSeek]
  B -- 可以 --> C{任务类型?}
  C -- 确定性<br/>分类·抽取·路由 --> D[快而省梯队<br/>Haiku / Flash-Lite / 小开源模型]
  C -- 生成改写<br/>文案·摘要·翻译 --> E[主力梯队<br/>Sonnet / Flash / DeepSeek V4-Pro]
  C -- 推理 Agent<br/>多步·调工具·规划 --> F[旗舰梯队<br/>GPT-5.5 / Opus 4.7 / Gemini 3.1 Pro]
  D --> G{有延迟或上下文硬约束?}
  E --> G
  F --> G
  G -- 有 --> H[在满足约束的模型里<br/>重新筛一遍]
  G -- 没有 --> I[按规模决定<br/>闭源 API or 自建开源]
</pre><p>注意几个细节。<strong>第一道闸是数据合规,不是能力</strong>——合规一票否决,放在最前面,免得你比了半天性价比最后发现这个模型根本不能用。任务类型决定的是<strong>梯队</strong>,不是具体型号——型号每季度都变,梯队的逻辑稳定得多。延迟和上下文是<strong>筛选器</strong>,不是打分项——它们只负责把不合格的划掉。最后才轮到闭源还是开源,而这一步<strong>主要由调用量决定</strong>:量小走 API,量大到自建更划算时,再考虑迁。</p>
<h2 id="最后">最后</h2>
<p>2026 年大模型这块,缺的从来不是好模型,缺的是&quot;清楚自己要什么&quot;。</p>
<p>榜单天天有人更新,排名天天有人吵,但你的客服机器人需要的可能只是一个稳定、便宜、够快的主力模型;你的代码 Agent 才真的吃旗舰那几个点的智商;你的合规系统压根不在公开榜单的讨论范围里。</p>
<p>把&quot;哪个最强&quot;这个问题放下。换成一串具体的问题:这个任务是什么类型?能容忍多少延迟?一天调用多少次?数据能不能出门?——这几个问题答完,该选哪个,基本也就清楚了。</p>
<p>选型的功夫,九成在想清楚需求,一成在看模型。顺序别搞反。</p>
]]></content:encoded></item><item><title>提示词工程实战手册：让AI听懂你的话</title><link>https://realtime-ai.chat/posts/prompt-engineering-handbook/</link><pubDate>Mon, 12 Jan 2026 10:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/prompt-engineering-handbook/</guid><description>提示词工程实战手册:用 CRISP 框架写出让 AI 准确理解的 Prompt,附 ChatGPT、Claude 实用技巧。</description><content:encoded><![CDATA[<h2 id="开场同样的问题天差地别的回答">开场：同样的问题，天差地别的回答</h2>
<p>先看一个真实场景：</p>
<p><strong>❌ 普通人的提问</strong>：</p>
<blockquote>
<p>&ldquo;帮我写一篇文章&rdquo;</p></blockquote>
<p><strong>AI回答</strong>：好的，请问您想写什么主题的文章？（然后开始无尽的追问&hellip;）</p>
<p><strong>✅ 高手的提问</strong>：</p>
<blockquote>
<p>&ldquo;你是一位资深科技博主。请用轻松幽默的语气，写一篇800字左右的文章，介绍AI编程助手（如Cursor、Copilot）如何改变程序员的工作方式。文章需要包含：1个生动的开场故事、3个具体的使用场景、1个数据对比、结尾的行动号召。&rdquo;</p></blockquote>
<p><strong>AI回答</strong>：直接输出一篇结构完整、语气生动、可直接发布的高质量文章。</p>
<p><strong>这就是提示词工程的魔力。</strong></p>
<hr>
<h2 id="第一章crisp框架--黄金提示词公式">第一章：CRISP框架 —— 黄金提示词公式</h2>
<p><img alt="提示词工程框架" loading="lazy" src="/images/tutorials/prompt-engineering.png"></p>
<p>我总结了一个简单易记的框架：<strong>CRISP</strong></p>
<table>
  <thead>
      <tr>
          <th style="text-align: center">字母</th>
          <th style="text-align: left">含义</th>
          <th style="text-align: left">说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: center"><strong>C</strong></td>
          <td style="text-align: left">Context（背景）</td>
          <td style="text-align: left">告诉AI&quot;你是谁&quot;和&quot;场景是什么&quot;</td>
      </tr>
      <tr>
          <td style="text-align: center"><strong>R</strong></td>
          <td style="text-align: left">Role（角色）</td>
          <td style="text-align: left">让AI扮演专家身份</td>
      </tr>
      <tr>
          <td style="text-align: center"><strong>I</strong></td>
          <td style="text-align: left">Instructions（指令）</td>
          <td style="text-align: left">清晰的任务描述</td>
      </tr>
      <tr>
          <td style="text-align: center"><strong>S</strong></td>
          <td style="text-align: left">Specification（规格）</td>
          <td style="text-align: left">输出的格式、长度、风格</td>
      </tr>
      <tr>
          <td style="text-align: center"><strong>P</strong></td>
          <td style="text-align: left">Proof（示例）</td>
          <td style="text-align: left">给出1-2个例子（Few-Shot）</td>
      </tr>
  </tbody>
</table>
<h3 id="实战模板">实战模板</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gh"># 背景 (Context)
</span></span></span><span class="line"><span class="cl"><span class="gh"></span>我正在为技术博客写一篇关于[主题]的文章，读者是有一定编程基础的开发者。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gh"># 角色 (Role)
</span></span></span><span class="line"><span class="cl"><span class="gh"></span>你是一位拥有10年经验的资深技术作家，擅长用通俗易懂的语言解释复杂概念。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gh"># 指令 (Instructions)
</span></span></span><span class="line"><span class="cl"><span class="gh"></span>请帮我撰写这篇文章，要求：
</span></span><span class="line"><span class="cl"><span class="k">1.</span> 开头用一个真实案例或故事引入
</span></span><span class="line"><span class="cl"><span class="k">2.</span> 核心内容分为3-4个要点
</span></span><span class="line"><span class="cl"><span class="k">3.</span> 每个要点配有代码示例
</span></span><span class="line"><span class="cl"><span class="k">4.</span> 结尾总结并给出行动建议
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gh"># 规格 (Specification)
</span></span></span><span class="line"><span class="cl"><span class="gh"></span><span class="k">-</span> 字数：1500-2000字
</span></span><span class="line"><span class="cl"><span class="k">-</span> 语气：专业但不枯燥，适当加入幽默
</span></span><span class="line"><span class="cl"><span class="k">-</span> 格式：Markdown，使用代码块、列表、表格
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gh"># 示例 (Proof)
</span></span></span><span class="line"><span class="cl"><span class="gh"></span>类似风格的文章参考：[给出一段示例文字]
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="第二章chain-of-thought--让ai学会思考">第二章：Chain of Thought —— 让AI学会思考</h2>
<p><strong>核心原理</strong>：不要让AI直接给答案，让它先&quot;想一想&quot;。</p>
<h3 id="对比实验">对比实验</h3>
<p><strong>❌ 普通提问</strong>：</p>
<blockquote>
<p>&ldquo;北京到上海的高铁票价是多少？坐飞机呢？哪个更划算？&rdquo;</p></blockquote>
<p><strong>AI回答</strong>：可能会给出过时或错误的价格，或者简单说&quot;无法获取实时信息&quot;。</p>
<p><strong>✅ CoT提问</strong>：</p>
<blockquote>
<p>&ldquo;请一步步分析北京到上海的出行方式选择：</p>
<ol>
<li>首先，列出主要的交通方式</li>
<li>然后，分析每种方式的优缺点（时间、价格区间、舒适度）</li>
<li>接着，根据不同场景给出建议</li>
<li>最后，总结你的推荐&rdquo;</li>
</ol></blockquote>
<p><strong>AI回答</strong>：会输出一个结构化的对比分析，即使没有实时数据，也能给出有价值的框架性建议。</p>
<h3 id="万能cot触发词">万能CoT触发词</h3>
<p>只需在提问末尾加上这些&quot;魔法词&quot;：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">- &#34;请一步步思考&#34;
</span></span><span class="line"><span class="cl">- &#34;Let&#39;s think step by step&#34;
</span></span><span class="line"><span class="cl">- &#34;请先分析，再给出结论&#34;
</span></span><span class="line"><span class="cl">- &#34;在回答之前，请列出你的推理过程&#34;
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="第三章few-shot--用例子教ai">第三章：Few-Shot —— 用例子教AI</h2>
<p><strong>核心原理</strong>：与其解释你要什么，不如直接给例子。</p>
<h3 id="场景让ai生成特定风格的代码注释">场景：让AI生成特定风格的代码注释</h3>
<p><strong>❌ 普通提问</strong>：</p>
<blockquote>
<p>&ldquo;帮我给这段代码加注释，要幽默一点&rdquo;</p></blockquote>
<p><strong>✅ Few-Shot提问</strong>：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">请按照以下风格为代码添加注释：
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">【示例1】
</span></span><span class="line"><span class="cl">代码：if user.age &lt; 18:
</span></span><span class="line"><span class="cl">注释：# 未成年人禁止入内，这里是成年人的世界 🍺
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">【示例2】  
</span></span><span class="line"><span class="cl">代码：except Exception as e:
</span></span><span class="line"><span class="cl">注释：# 出事了！别慌，喝杯咖啡冷静一下 ☕
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">现在请为以下代码添加注释：
</span></span><span class="line"><span class="cl">def calculate_tax(income):
</span></span><span class="line"><span class="cl">    if income &gt; 100000:
</span></span><span class="line"><span class="cl">        return income * 0.3
</span></span><span class="line"><span class="cl">    else:
</span></span><span class="line"><span class="cl">        return income * 0.1
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>AI输出</strong>：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">calculate_tax</span><span class="p">(</span><span class="n">income</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># 收入超过10万？恭喜你，国家需要你的贡献 💰</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">income</span> <span class="o">&gt;</span> <span class="mi">100000</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">income</span> <span class="o">*</span> <span class="mf">0.3</span>  <span class="c1"># 30%，肉疼但合法</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">income</span> <span class="o">*</span> <span class="mf">0.1</span>  <span class="c1"># 10%，快乐打工人的小确幸 🎉</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="第四章结构化输出--让ai规范回答">第四章：结构化输出 —— 让AI规范回答</h2>
<p><strong>核心原理</strong>：明确告诉AI你要什么格式，它就不会乱来。</p>
<h3 id="技巧1要求json输出">技巧1：要求JSON输出</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">请分析以下用户反馈，并以JSON格式输出：
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">用户反馈：&#34;产品还不错，但是价格太贵了，客服响应也有点慢&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">输出格式：
</span></span><span class="line"><span class="cl">{
</span></span><span class="line"><span class="cl">  &#34;sentiment&#34;: &#34;正面/中性/负面&#34;,
</span></span><span class="line"><span class="cl">  &#34;aspects&#34;: [
</span></span><span class="line"><span class="cl">    {&#34;name&#34;: &#34;方面名称&#34;, &#34;score&#34;: 1-5, &#34;comment&#34;: &#34;具体评价&#34;}
</span></span><span class="line"><span class="cl">  ],
</span></span><span class="line"><span class="cl">  &#34;summary&#34;: &#34;一句话总结&#34;
</span></span><span class="line"><span class="cl">}
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="技巧2使用xml标签">技巧2：使用XML标签</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">请生成一个产品描述，使用以下结构：
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&lt;product_name&gt;产品名称&lt;/product_name&gt;
</span></span><span class="line"><span class="cl">&lt;tagline&gt;一句话卖点&lt;/tagline&gt;
</span></span><span class="line"><span class="cl">&lt;features&gt;
</span></span><span class="line"><span class="cl">  &lt;feature&gt;功能点1&lt;/feature&gt;
</span></span><span class="line"><span class="cl">  &lt;feature&gt;功能点2&lt;/feature&gt;
</span></span><span class="line"><span class="cl">&lt;/features&gt;
</span></span><span class="line"><span class="cl">&lt;cta&gt;行动号召&lt;/cta&gt;
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="技巧3表格输出">技巧3：表格输出</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">请对比分析GPT-4、Claude 3.5、Gemini Pro的特点，以Markdown表格形式输出，包含以下列：
</span></span><span class="line"><span class="cl">| 模型 | 上下文长度 | 速度 | 价格 | 适合场景 |
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="第五章避坑指南--常见错误与解决方案">第五章：避坑指南 —— 常见错误与解决方案</h2>
<h3 id="错误1一次问太多">错误1：一次问太多</h3>
<p><strong>❌ 错误示范</strong>：</p>
<blockquote>
<p>&ldquo;帮我写一篇技术博客，顺便翻译成英文，再配几张图，最后发到我的WordPress上&rdquo;</p></blockquote>
<p><strong>✅ 正确做法</strong>：拆分成多个步骤，逐个完成</p>
<h3 id="错误2假设ai知道背景">错误2：假设AI知道背景</h3>
<p><strong>❌ 错误示范</strong>：</p>
<blockquote>
<p>&ldquo;那个bug修好了吗？&rdquo;</p></blockquote>
<p><strong>✅ 正确做法</strong>：</p>
<blockquote>
<p>&ldquo;昨天讨论的用户登录页面表单验证bug（提交时没有检查邮箱格式），请检查修复代码是否正确&rdquo;</p></blockquote>
<h3 id="错误3不给反馈">错误3：不给反馈</h3>
<p><strong>❌ 错误示范</strong>：
直接接受第一次输出，即使不满意</p>
<p><strong>✅ 正确做法</strong>：</p>
<blockquote>
<p>&ldquo;这个回答不够具体，请在第二点增加一个Python代码示例&rdquo;
&ldquo;语气太正式了，请用更轻松的口吻重写&rdquo;</p></blockquote>
<hr>
<h2 id="第六章高级技巧速查表">第六章：高级技巧速查表</h2>
<table>
  <thead>
      <tr>
          <th style="text-align: left">技巧</th>
          <th style="text-align: left">适用场景</th>
          <th style="text-align: left">示例</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left"><strong>角色扮演</strong></td>
          <td style="text-align: left">需要专业视角</td>
          <td style="text-align: left">&ldquo;你是一位有20年经验的&hellip;&rdquo;</td>
      </tr>
      <tr>
          <td style="text-align: left"><strong>逆向思维</strong></td>
          <td style="text-align: left">避免常见错误</td>
          <td style="text-align: left">&ldquo;列出写提示词的10个常见错误&rdquo;</td>
      </tr>
      <tr>
          <td style="text-align: left"><strong>对比分析</strong></td>
          <td style="text-align: left">决策场景</td>
          <td style="text-align: left">&ldquo;从A/B/C三个方面对比X和Y&rdquo;</td>
      </tr>
      <tr>
          <td style="text-align: left"><strong>模拟对话</strong></td>
          <td style="text-align: left">练习场景</td>
          <td style="text-align: left">&ldquo;模拟一场面试，你是面试官&rdquo;</td>
      </tr>
      <tr>
          <td style="text-align: left"><strong>递进细化</strong></td>
          <td style="text-align: left">复杂任务</td>
          <td style="text-align: left">先大纲 → 再填充 → 最后润色</td>
      </tr>
      <tr>
          <td style="text-align: left"><strong>设置边界</strong></td>
          <td style="text-align: left">避免跑题</td>
          <td style="text-align: left">&ldquo;只回答关于X的问题，其他一律拒绝&rdquo;</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="彩蛋我的私藏提示词模板">彩蛋：我的私藏提示词模板</h2>
<h3 id="模板1代码review">模板1：代码Review</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">请作为一位严格的高级工程师，review以下代码：
</span></span><span class="line"><span class="cl"><span class="k">1.</span> 指出潜在的bug和安全隐患
</span></span><span class="line"><span class="cl"><span class="k">2.</span> 提出性能优化建议
</span></span><span class="line"><span class="cl"><span class="k">3.</span> 检查代码风格和可读性
</span></span><span class="line"><span class="cl"><span class="k">4.</span> 给出改进后的代码示例
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">代码如下：
</span></span><span class="line"><span class="cl">[粘贴代码]
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="模板2技术方案设计">模板2：技术方案设计</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">我需要设计一个[系统/功能]，请帮我：
</span></span><span class="line"><span class="cl"><span class="k">1.</span> 分析技术选型（至少对比3种方案）
</span></span><span class="line"><span class="cl"><span class="k">2.</span> 画出架构图（用Mermaid语法）
</span></span><span class="line"><span class="cl"><span class="k">3.</span> 列出关键技术点和难点
</span></span><span class="line"><span class="cl"><span class="k">4.</span> 给出实施步骤和时间估算
</span></span><span class="line"><span class="cl"><span class="k">5.</span> 预警可能的风险点
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">背景信息：[业务场景、技术栈、团队规模]
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="模板3学习新技术">模板3：学习新技术</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">我想快速学习[技术名称]，我的背景是[现有技能]。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">请为我制定一个7天学习计划：
</span></span><span class="line"><span class="cl"><span class="k">-</span> 每天的学习目标和时长
</span></span><span class="line"><span class="cl"><span class="k">-</span> 推荐的学习资源（官方文档、教程、视频）
</span></span><span class="line"><span class="cl"><span class="k">-</span> 每天的动手练习项目
</span></span><span class="line"><span class="cl"><span class="k">-</span> 检验学习效果的方法
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="结语提示词是你的第二语言">结语：提示词是你的&quot;第二语言&quot;</h2>
<p>掌握提示词工程，就像学会了一门与AI对话的&quot;第二语言&quot;。</p>
<p><strong>记住三个核心原则</strong>：</p>
<ol>
<li><strong>明确</strong>：告诉AI你是谁、要什么、怎么要</li>
<li><strong>示例</strong>：与其解释，不如给例子</li>
<li><strong>迭代</strong>：好的结果往往需要2-3轮调整</li>
</ol>
<p><strong>现在，去试试这些技巧吧！</strong></p>
]]></content:encoded></item><item><title>MCP协议：AI工具的「乐高积木」玩法</title><link>https://realtime-ai.chat/posts/mcp-protocol-guide/</link><pubDate>Sun, 11 Jan 2026 10:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/mcp-protocol-guide/</guid><description>用「乐高积木」的比喻讲清 MCP 协议:它如何像 USB 一样让任意工具接入 AI,以及工具集成的实战玩法。</description><content:encoded><![CDATA[<h2 id="开场ai助手的能力危机">开场：AI助手的「能力危机」</h2>
<p><strong>场景一：你问Claude</strong></p>
<blockquote>
<p>你：&ldquo;帮我查一下公司数据库里上个月的销售数据&rdquo;<br>
Claude：&ldquo;抱歉，我无法直接访问数据库&hellip;&rdquo;</p></blockquote>
<p><strong>场景二：你问ChatGPT</strong></p>
<blockquote>
<p>你：&ldquo;读取我桌面上的report.pdf并总结&rdquo;<br>
ChatGPT：&ldquo;我无法访问您的本地文件&hellip;&rdquo;</p></blockquote>
<p><strong>问题来了</strong>：这些AI明明这么聪明，为什么连最基本的「读文件」「查数据库」都做不到？</p>
<p><strong>答案</strong>：不是它们不够聪明，而是缺少「工具」。</p>
<p>就像一个天才厨师，如果厨房里没有刀、锅、灶，也做不出美食。</p>
<hr>
<h2 id="第一章mcp协议是什么">第一章：MCP协议是什么？</h2>
<h3 id="11-一句话解释">1.1 一句话解释</h3>
<p><strong>MCP (Model Context Protocol)</strong> = AI模型的「USB接口标准」</p>
<p>就像USB让所有设备都能连接电脑一样，MCP让所有工具都能连接AI。</p>
<h3 id="12-没有mcp之前的世界">1.2 没有MCP之前的世界</h3>
<p>每个AI应用都要自己实现工具集成：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 开发者A的实现</span>
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">ClaudeWithDatabase</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">query_db</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sql</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 自己写数据库连接逻辑</span>
</span></span><span class="line"><span class="cl">        <span class="n">conn</span> <span class="o">=</span> <span class="n">psycopg2</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 自己写SQL执行逻辑</span>
</span></span><span class="line"><span class="cl">        <span class="n">cursor</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">sql</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 自己写结果格式化</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">format_results</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 开发者B的实现（完全不同）</span>
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">GPTWithDatabase</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">db_query</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 又要重新实现一遍</span>
</span></span><span class="line"><span class="cl">        <span class="n">engine</span> <span class="o">=</span> <span class="n">create_engine</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 完全不同的接口</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">engine</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">query</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>问题</strong>：</p>
<ul>
<li>❌ 每个开发者都要重复造轮子</li>
<li>❌ 工具无法在不同AI之间复用</li>
<li>❌ 维护成本极高</li>
</ul>
<h3 id="13-有了mcp之后">1.3 有了MCP之后</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 任何AI都可以使用同一个MCP服务器</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">mcp</span> <span class="kn">import</span> <span class="n">Client</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 连接到数据库MCP服务器</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">Client</span><span class="p">(</span><span class="s2">&#34;postgresql://localhost:5432/mydb&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Claude使用</span>
</span></span><span class="line"><span class="cl"><span class="n">claude_response</span> <span class="o">=</span> <span class="n">claude</span><span class="o">.</span><span class="n">chat</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;查询上月销售数据&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">tools</span><span class="o">=</span><span class="p">[</span><span class="n">client</span><span class="p">]</span>  <span class="c1"># 直接传入MCP客户端</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># GPT使用（完全相同的方式）</span>
</span></span><span class="line"><span class="cl"><span class="n">gpt_response</span> <span class="o">=</span> <span class="n">gpt</span><span class="o">.</span><span class="n">chat</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;查询上月销售数据&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">tools</span><span class="o">=</span><span class="p">[</span><span class="n">client</span><span class="p">]</span>  <span class="c1"># 同一个工具！</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>优势</strong>：</p>
<ul>
<li>✅ 一次开发，到处使用</li>
<li>✅ 工具可以在不同AI之间共享</li>
<li>✅ 标准化接口，易于维护</li>
</ul>
<hr>
<h2 id="第二章mcp的核心架构">第二章：MCP的核心架构</h2>
<h3 id="21-三个角色">2.1 三个角色</h3>
<pre class="mermaid">graph LR
    A[AI模型<br/>Claude/GPT] -->|请求工具| B[MCP客户端]
    B -->|标准协议| C[MCP服务器]
    C -->|实际操作| D[资源<br/>数据库/文件/API]
</pre><p><strong>角色说明</strong>：</p>
<ol>
<li><strong>AI模型（Host）</strong>：发起请求的&quot;大脑&quot;</li>
<li><strong>MCP客户端（Client）</strong>：AI和工具之间的&quot;翻译官&quot;</li>
<li><strong>MCP服务器（Server）</strong>：实际执行操作的&quot;工具箱&quot;</li>
</ol>
<h3 id="22-通信流程">2.2 通信流程</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 完整的MCP通信示例</span>
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">MCPCommunicationFlow</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">demonstrate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># Step 1: AI发现可用工具</span>
</span></span><span class="line"><span class="cl">        <span class="n">tools</span> <span class="o">=</span> <span class="n">mcp_client</span><span class="o">.</span><span class="n">list_tools</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 返回: [</span>
</span></span><span class="line"><span class="cl">        <span class="c1">#   {&#34;name&#34;: &#34;query_database&#34;, &#34;description&#34;: &#34;查询PostgreSQL数据库&#34;},</span>
</span></span><span class="line"><span class="cl">        <span class="c1">#   {&#34;name&#34;: &#34;read_file&#34;, &#34;description&#34;: &#34;读取本地文件&#34;},</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># ]</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1"># Step 2: AI选择并调用工具</span>
</span></span><span class="line"><span class="cl">        <span class="n">result</span> <span class="o">=</span> <span class="n">mcp_client</span><span class="o">.</span><span class="n">call_tool</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="n">name</span><span class="o">=</span><span class="s2">&#34;query_database&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="n">arguments</span><span class="o">=</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="s2">&#34;sql&#34;</span><span class="p">:</span> <span class="s2">&#34;SELECT * FROM sales WHERE month = &#39;2025-11&#39;&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">)</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1"># Step 3: MCP服务器执行并返回结果</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># result = {</span>
</span></span><span class="line"><span class="cl">        <span class="c1">#   &#34;content&#34;: [</span>
</span></span><span class="line"><span class="cl">        <span class="c1">#     {&#34;type&#34;: &#34;text&#34;, &#34;text&#34;: &#34;找到123条记录&#34;},</span>
</span></span><span class="line"><span class="cl">        <span class="c1">#     {&#34;type&#34;: &#34;resource&#34;, &#34;uri&#34;: &#34;db://sales/2025-11&#34;}</span>
</span></span><span class="line"><span class="cl">        <span class="c1">#   ]</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># }</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1"># Step 4: AI处理结果并回复用户</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">ai_model</span><span class="o">.</span><span class="n">generate_response</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="23-协议规范">2.3 协议规范</h3>
<p>MCP使用<strong>JSON-RPC 2.0</strong>作为通信协议：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="c1">// 请求示例
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;jsonrpc&#34;</span><span class="p">:</span> <span class="s2">&#34;2.0&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;method&#34;</span><span class="p">:</span> <span class="s2">&#34;tools/call&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;params&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;query_database&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;arguments&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;sql&#34;</span><span class="p">:</span> <span class="s2">&#34;SELECT COUNT(*) FROM users&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 响应示例
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;jsonrpc&#34;</span><span class="p">:</span> <span class="s2">&#34;2.0&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;result&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;text&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;text&#34;</span><span class="p">:</span> <span class="s2">&#34;总用户数: 1,234,567&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="第三章实战搭建你的第一个mcp服务器">第三章：实战——搭建你的第一个MCP服务器</h2>
<h3 id="31-最简单的例子文件读取服务器">3.1 最简单的例子：文件读取服务器</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># file_server.py</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">mcp.server</span> <span class="kn">import</span> <span class="n">Server</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">mcp.types</span> <span class="kn">import</span> <span class="n">Tool</span><span class="p">,</span> <span class="n">TextContent</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 创建MCP服务器</span>
</span></span><span class="line"><span class="cl"><span class="n">app</span> <span class="o">=</span> <span class="n">Server</span><span class="p">(</span><span class="s2">&#34;file-reader&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 定义工具</span>
</span></span><span class="line"><span class="cl"><span class="nd">@app.list_tools</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">list_tools</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="n">Tool</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="n">name</span><span class="o">=</span><span class="s2">&#34;read_file&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="n">description</span><span class="o">=</span><span class="s2">&#34;读取本地文件内容&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="n">inputSchema</span><span class="o">=</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="s2">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;object&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="s2">&#34;properties&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="s2">&#34;path&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                        <span class="s2">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;string&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                        <span class="s2">&#34;description&#34;</span><span class="p">:</span> <span class="s2">&#34;文件路径&#34;</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="p">},</span>
</span></span><span class="line"><span class="cl">                <span class="s2">&#34;required&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;path&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 实现工具逻辑</span>
</span></span><span class="line"><span class="cl"><span class="nd">@app.call_tool</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">call_tool</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">arguments</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s2">&#34;read_file&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">path</span> <span class="o">=</span> <span class="n">arguments</span><span class="p">[</span><span class="s2">&#34;path&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1"># 安全检查</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="p">[</span><span class="n">TextContent</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">                <span class="nb">type</span><span class="o">=</span><span class="s2">&#34;text&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="n">text</span><span class="o">=</span><span class="sa">f</span><span class="s2">&#34;错误：文件 </span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2"> 不存在&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="p">)]</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1"># 读取文件</span>
</span></span><span class="line"><span class="cl">        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">content</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="p">[</span><span class="n">TextContent</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="nb">type</span><span class="o">=</span><span class="s2">&#34;text&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="n">text</span><span class="o">=</span><span class="sa">f</span><span class="s2">&#34;文件内容：</span><span class="se">\n</span><span class="si">{</span><span class="n">content</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">)]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 启动服务器</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&#34;__main__&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>运行服务器</strong>：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python file_server.py
</span></span><span class="line"><span class="cl"><span class="c1"># MCP服务器启动在 stdio://</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="32-在claude-desktop中使用">3.2 在Claude Desktop中使用</h3>
<p>编辑Claude Desktop配置文件：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="c1">// ~/Library/Application Support/Claude/claude_desktop_config.json
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;mcpServers&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;file-reader&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;command&#34;</span><span class="p">:</span> <span class="s2">&#34;python&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;args&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;/path/to/file_server.py&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>重启Claude Desktop，现在你可以</strong>：</p>
<blockquote>
<p>你：&ldquo;读取我桌面上的report.txt&rdquo;<br>
Claude：&ldquo;好的，让我读取文件&hellip; [调用read_file工具] &hellip;文件内容是：&hellip;&rdquo;</p></blockquote>
<p>🎉 <strong>成功！Claude现在可以读取本地文件了！</strong></p>
<h3 id="33-进阶数据库查询服务器">3.3 进阶：数据库查询服务器</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span><span class="lnt">61
</span><span class="lnt">62
</span><span class="lnt">63
</span><span class="lnt">64
</span><span class="lnt">65
</span><span class="lnt">66
</span><span class="lnt">67
</span><span class="lnt">68
</span><span class="lnt">69
</span><span class="lnt">70
</span><span class="lnt">71
</span><span class="lnt">72
</span><span class="lnt">73
</span><span class="lnt">74
</span><span class="lnt">75
</span><span class="lnt">76
</span><span class="lnt">77
</span><span class="lnt">78
</span><span class="lnt">79
</span><span class="lnt">80
</span><span class="lnt">81
</span><span class="lnt">82
</span><span class="lnt">83
</span><span class="lnt">84
</span><span class="lnt">85
</span><span class="lnt">86
</span><span class="lnt">87
</span><span class="lnt">88
</span><span class="lnt">89
</span><span class="lnt">90
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># database_server.py</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">mcp.server</span> <span class="kn">import</span> <span class="n">Server</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">mcp.types</span> <span class="kn">import</span> <span class="n">Tool</span><span class="p">,</span> <span class="n">TextContent</span><span class="p">,</span> <span class="n">Resource</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">psycopg2</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">app</span> <span class="o">=</span> <span class="n">Server</span><span class="p">(</span><span class="s2">&#34;postgres-query&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 数据库连接配置</span>
</span></span><span class="line"><span class="cl"><span class="n">DB_CONFIG</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;host&#34;</span><span class="p">:</span> <span class="s2">&#34;localhost&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;database&#34;</span><span class="p">:</span> <span class="s2">&#34;myapp&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;user&#34;</span><span class="p">:</span> <span class="s2">&#34;postgres&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;password&#34;</span><span class="p">:</span> <span class="s2">&#34;secret&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@app.list_tools</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">list_tools</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="n">Tool</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="n">name</span><span class="o">=</span><span class="s2">&#34;query_database&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="n">description</span><span class="o">=</span><span class="s2">&#34;执行SQL查询并返回结果&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="n">inputSchema</span><span class="o">=</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="s2">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;object&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="s2">&#34;properties&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="s2">&#34;sql&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                        <span class="s2">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;string&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                        <span class="s2">&#34;description&#34;</span><span class="p">:</span> <span class="s2">&#34;SQL查询语句&#34;</span>
</span></span><span class="line"><span class="cl">                    <span class="p">},</span>
</span></span><span class="line"><span class="cl">                    <span class="s2">&#34;format&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                        <span class="s2">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;string&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                        <span class="s2">&#34;enum&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;table&#34;</span><span class="p">,</span> <span class="s2">&#34;json&#34;</span><span class="p">,</span> <span class="s2">&#34;markdown&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">                        <span class="s2">&#34;description&#34;</span><span class="p">:</span> <span class="s2">&#34;返回格式&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                        <span class="s2">&#34;default&#34;</span><span class="p">:</span> <span class="s2">&#34;markdown&#34;</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="p">},</span>
</span></span><span class="line"><span class="cl">                <span class="s2">&#34;required&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;sql&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">),</span>
</span></span><span class="line"><span class="cl">        <span class="n">Tool</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="n">name</span><span class="o">=</span><span class="s2">&#34;list_tables&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="n">description</span><span class="o">=</span><span class="s2">&#34;列出数据库中的所有表&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="n">inputSchema</span><span class="o">=</span><span class="p">{</span><span class="s2">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;object&#34;</span><span class="p">,</span> <span class="s2">&#34;properties&#34;</span><span class="p">:</span> <span class="p">{}}</span>
</span></span><span class="line"><span class="cl">        <span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@app.call_tool</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">call_tool</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">arguments</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">conn</span> <span class="o">=</span> <span class="n">psycopg2</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="o">**</span><span class="n">DB_CONFIG</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s2">&#34;list_tables&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="c1"># 查询所有表</span>
</span></span><span class="line"><span class="cl">            <span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_sql</span><span class="p">(</span><span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">                SELECT table_name 
</span></span></span><span class="line"><span class="cl"><span class="s2">                FROM information_schema.tables 
</span></span></span><span class="line"><span class="cl"><span class="s2">                WHERE table_schema = &#39;public&#39;
</span></span></span><span class="line"><span class="cl"><span class="s2">            &#34;&#34;&#34;</span><span class="p">,</span> <span class="n">conn</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">            <span class="n">tables</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;table_name&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">tolist</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="p">[</span><span class="n">TextContent</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">                <span class="nb">type</span><span class="o">=</span><span class="s2">&#34;text&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="n">text</span><span class="o">=</span><span class="sa">f</span><span class="s2">&#34;数据库表：</span><span class="se">\n</span><span class="s2">&#34;</span> <span class="o">+</span> <span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;- </span><span class="si">{</span><span class="n">t</span><span class="si">}</span><span class="s2">&#34;</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">tables</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="p">)]</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="k">elif</span> <span class="n">name</span> <span class="o">==</span> <span class="s2">&#34;query_database&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">sql</span> <span class="o">=</span> <span class="n">arguments</span><span class="p">[</span><span class="s2">&#34;sql&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">            <span class="n">format_type</span> <span class="o">=</span> <span class="n">arguments</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&#34;format&#34;</span><span class="p">,</span> <span class="s2">&#34;markdown&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">            <span class="c1"># 执行查询</span>
</span></span><span class="line"><span class="cl">            <span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_sql</span><span class="p">(</span><span class="n">sql</span><span class="p">,</span> <span class="n">conn</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">            <span class="c1"># 格式化输出</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">format_type</span> <span class="o">==</span> <span class="s2">&#34;markdown&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">result</span> <span class="o">=</span> <span class="n">df</span><span class="o">.</span><span class="n">to_markdown</span><span class="p">(</span><span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="k">elif</span> <span class="n">format_type</span> <span class="o">==</span> <span class="s2">&#34;json&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">result</span> <span class="o">=</span> <span class="n">df</span><span class="o">.</span><span class="n">to_json</span><span class="p">(</span><span class="n">orient</span><span class="o">=</span><span class="s2">&#34;records&#34;</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">result</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">df</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="p">[</span><span class="n">TextContent</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">                <span class="nb">type</span><span class="o">=</span><span class="s2">&#34;text&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="n">text</span><span class="o">=</span><span class="sa">f</span><span class="s2">&#34;查询结果（</span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">df</span><span class="p">)</span><span class="si">}</span><span class="s2">行）：</span><span class="se">\n</span><span class="si">{</span><span class="n">result</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="p">)]</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">finally</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&#34;__main__&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>使用效果</strong>：</p>
<blockquote>
<p>你：&ldquo;我们数据库里有哪些表？&rdquo;<br>
Claude：[调用list_tables] &ldquo;数据库中有以下表：users, orders, products&hellip;&rdquo;</p>
<p>你：&ldquo;查询上个月订单总额&rdquo;<br>
Claude：[调用query_database] &ldquo;上个月订单总额为 ¥1,234,567&hellip;&rdquo;</p></blockquote>
<hr>
<h2 id="第四章mcp的杀手级应用场景">第四章：MCP的「杀手级」应用场景</h2>
<h3 id="41-场景一智能数据分析助手">4.1 场景一：智能数据分析助手</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 用户只需要说话，AI自动完成整个分析流程</span>
</span></span><span class="line"><span class="cl"><span class="n">用户</span><span class="p">:</span> <span class="s2">&#34;分析一下我们Q4的销售趋势&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># AI的工作流程（全自动）：</span>
</span></span><span class="line"><span class="cl"><span class="mf">1.</span> <span class="p">[</span><span class="n">调用list_tables</span><span class="p">]</span> <span class="n">发现有sales表</span>
</span></span><span class="line"><span class="cl"><span class="mf">2.</span> <span class="p">[</span><span class="n">调用query_database</span><span class="p">]</span> <span class="n">查询Q4数据</span>
</span></span><span class="line"><span class="cl"><span class="mf">3.</span> <span class="p">[</span><span class="n">调用python_executor</span><span class="p">]</span> <span class="n">用pandas分析趋势</span>
</span></span><span class="line"><span class="cl"><span class="mf">4.</span> <span class="p">[</span><span class="n">调用chart_generator</span><span class="p">]</span> <span class="n">生成可视化图表</span>
</span></span><span class="line"><span class="cl"><span class="mf">5.</span> <span class="p">[</span><span class="n">返回分析报告</span><span class="p">]</span> <span class="s2">&#34;Q4销售呈上升趋势，环比增长23%...&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>实现代码</strong>：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># analytics_server.py</span>
</span></span><span class="line"><span class="cl"><span class="nd">@app.call_tool</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">call_tool</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">arguments</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s2">&#34;analyze_sales&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># Step 1: 查询数据</span>
</span></span><span class="line"><span class="cl">        <span class="n">df</span> <span class="o">=</span> <span class="n">query_sales_data</span><span class="p">(</span><span class="n">arguments</span><span class="p">[</span><span class="s2">&#34;period&#34;</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1"># Step 2: 自动分析</span>
</span></span><span class="line"><span class="cl">        <span class="n">insights</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;total&#34;</span><span class="p">:</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;amount&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">(),</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;growth&#34;</span><span class="p">:</span> <span class="n">calculate_growth</span><span class="p">(</span><span class="n">df</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;top_products&#34;</span><span class="p">:</span> <span class="n">df</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="s1">&#39;product&#39;</span><span class="p">)[</span><span class="s1">&#39;amount&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span><span class="o">.</span><span class="n">nlargest</span><span class="p">(</span><span class="mi">5</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;trend&#34;</span><span class="p">:</span> <span class="n">detect_trend</span><span class="p">(</span><span class="n">df</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1"># Step 3: 生成图表</span>
</span></span><span class="line"><span class="cl">        <span class="n">chart_url</span> <span class="o">=</span> <span class="n">generate_chart</span><span class="p">(</span><span class="n">df</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1"># Step 4: 返回结果</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">            <span class="n">TextContent</span><span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">&#34;text&#34;</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="n">format_insights</span><span class="p">(</span><span class="n">insights</span><span class="p">)),</span>
</span></span><span class="line"><span class="cl">            <span class="n">Resource</span><span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">&#34;image&#34;</span><span class="p">,</span> <span class="n">uri</span><span class="o">=</span><span class="n">chart_url</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">]</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="42-场景二全能开发助手">4.2 场景二：全能开发助手</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 开发者的梦想：AI能直接操作代码库</span>
</span></span><span class="line"><span class="cl"><span class="n">用户</span><span class="p">:</span> <span class="s2">&#34;帮我重构auth模块，添加OAuth支持&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># AI的操作：</span>
</span></span><span class="line"><span class="cl"><span class="mf">1.</span> <span class="p">[</span><span class="n">调用git_server</span><span class="p">]</span> <span class="n">创建新分支</span> <span class="n">feature</span><span class="o">/</span><span class="n">oauth</span>
</span></span><span class="line"><span class="cl"><span class="mf">2.</span> <span class="p">[</span><span class="n">调用file_server</span><span class="p">]</span> <span class="n">读取现有auth代码</span>
</span></span><span class="line"><span class="cl"><span class="mf">3.</span> <span class="p">[</span><span class="n">调用code_generator</span><span class="p">]</span> <span class="n">生成OAuth实现</span>
</span></span><span class="line"><span class="cl"><span class="mf">4.</span> <span class="p">[</span><span class="n">调用file_server</span><span class="p">]</span> <span class="n">写入新代码</span>
</span></span><span class="line"><span class="cl"><span class="mf">5.</span> <span class="p">[</span><span class="n">调用test_runner</span><span class="p">]</span> <span class="n">运行测试</span>
</span></span><span class="line"><span class="cl"><span class="mf">6.</span> <span class="p">[</span><span class="n">调用git_server</span><span class="p">]</span> <span class="n">提交并推送</span>
</span></span><span class="line"><span class="cl"><span class="mf">7.</span> <span class="p">[</span><span class="n">返回</span><span class="p">]</span> <span class="s2">&#34;重构完成，所有测试通过，PR已创建&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>MCP服务器组合</strong>：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;mcpServers&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;git&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;command&#34;</span><span class="p">:</span> <span class="s2">&#34;mcp-git-server&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;filesystem&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;command&#34;</span><span class="p">:</span> <span class="s2">&#34;mcp-file-server&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;args&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;--root&#34;</span><span class="p">,</span> <span class="s2">&#34;/Users/dev/myproject&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;test-runner&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;command&#34;</span><span class="p">:</span> <span class="s2">&#34;mcp-pytest-server&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="43-场景三企业知识库问答">4.3 场景三：企业知识库问答</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 连接公司所有数据源</span>
</span></span><span class="line"><span class="cl"><span class="n">用户</span><span class="p">:</span> <span class="s2">&#34;上季度客户投诉最多的问题是什么？&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># AI自动整合多个数据源：</span>
</span></span><span class="line"><span class="cl"><span class="mf">1.</span> <span class="p">[</span><span class="n">调用jira_server</span><span class="p">]</span> <span class="n">查询工单系统</span>
</span></span><span class="line"><span class="cl"><span class="mf">2.</span> <span class="p">[</span><span class="n">调用slack_server</span><span class="p">]</span> <span class="n">搜索客服频道</span>
</span></span><span class="line"><span class="cl"><span class="mf">3.</span> <span class="p">[</span><span class="n">调用database_server</span><span class="p">]</span> <span class="n">查询CRM数据</span>
</span></span><span class="line"><span class="cl"><span class="mf">4.</span> <span class="p">[</span><span class="n">调用confluence_server</span><span class="p">]</span> <span class="n">检索知识库</span>
</span></span><span class="line"><span class="cl"><span class="mf">5.</span> <span class="p">[</span><span class="n">综合分析</span><span class="p">]</span> <span class="s2">&#34;最多的投诉是配送延迟（占37%），主要原因是...&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="第五章mcp生态系统">第五章：MCP生态系统</h2>
<h3 id="51-官方mcp服务器">5.1 官方MCP服务器</h3>
<p>Anthropic已经提供了一些开箱即用的服务器：</p>
<table>
  <thead>
      <tr>
          <th>服务器</th>
          <th>功能</th>
          <th>使用场景</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>@modelcontextprotocol/server-filesystem</code></td>
          <td>文件系统访问</td>
          <td>读写本地文件</td>
      </tr>
      <tr>
          <td><code>@modelcontextprotocol/server-github</code></td>
          <td>GitHub集成</td>
          <td>管理仓库、PR、Issues</td>
      </tr>
      <tr>
          <td><code>@modelcontextprotocol/server-postgres</code></td>
          <td>PostgreSQL</td>
          <td>数据库查询</td>
      </tr>
      <tr>
          <td><code>@modelcontextprotocol/server-brave-search</code></td>
          <td>网络搜索</td>
          <td>实时信息检索</td>
      </tr>
      <tr>
          <td><code>@modelcontextprotocol/server-slack</code></td>
          <td>Slack集成</td>
          <td>发送消息、查询历史</td>
      </tr>
  </tbody>
</table>
<p><strong>安装使用</strong>：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装官方服务器</span>
</span></span><span class="line"><span class="cl">npm install -g @modelcontextprotocol/server-github
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 配置到Claude Desktop</span>
</span></span><span class="line"><span class="cl"><span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;mcpServers&#34;</span>: <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;github&#34;</span>: <span class="o">{</span>
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;command&#34;</span>: <span class="s2">&#34;mcp-server-github&#34;</span>,
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;env&#34;</span>: <span class="o">{</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;GITHUB_TOKEN&#34;</span>: <span class="s2">&#34;your_token_here&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="o">}</span>
</span></span><span class="line"><span class="cl">    <span class="o">}</span>
</span></span><span class="line"><span class="cl">  <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="52-社区mcp服务器">5.2 社区MCP服务器</h3>
<p>开源社区已经创建了大量服务器：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 一些有趣的社区服务器</span>
</span></span><span class="line"><span class="cl"><span class="n">awesome_mcp_servers</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;mcp-server-notion&#34;</span><span class="p">,</span>      <span class="c1"># Notion笔记集成</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;mcp-server-gmail&#34;</span><span class="p">,</span>       <span class="c1"># Gmail邮件管理</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;mcp-server-calendar&#34;</span><span class="p">,</span>    <span class="c1"># Google Calendar</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;mcp-server-docker&#34;</span><span class="p">,</span>      <span class="c1"># Docker容器管理</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;mcp-server-kubernetes&#34;</span><span class="p">,</span>  <span class="c1"># K8s集群操作</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;mcp-server-aws&#34;</span><span class="p">,</span>         <span class="c1"># AWS云服务</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;mcp-server-stripe&#34;</span><span class="p">,</span>      <span class="c1"># 支付处理</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;mcp-server-openai&#34;</span><span class="p">,</span>      <span class="c1"># OpenAI API封装</span>
</span></span><span class="line"><span class="cl"><span class="p">]</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="53-创建自己的mcp服务器">5.3 创建自己的MCP服务器</h3>
<p><strong>Python版本</strong>：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pip install mcp
</span></span><span class="line"><span class="cl">mcp create my-server
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> my-server
</span></span><span class="line"><span class="cl"><span class="c1"># 编辑 server.py</span>
</span></span><span class="line"><span class="cl">python server.py
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>TypeScript版本</strong>：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">npm create @modelcontextprotocol/server my-server
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> my-server
</span></span><span class="line"><span class="cl"><span class="c1"># 编辑 src/index.ts</span>
</span></span><span class="line"><span class="cl">npm run build
</span></span><span class="line"><span class="cl">npm start
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="第六章mcp-vs-其他方案">第六章：MCP vs 其他方案</h2>
<h3 id="61-对比表">6.1 对比表</h3>
<table>
  <thead>
      <tr>
          <th>方案</th>
          <th>优点</th>
          <th>缺点</th>
          <th>适用场景</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>MCP</strong></td>
          <td>标准化、可复用、生态丰富</td>
          <td>相对新，文档还在完善</td>
          <td>需要多工具集成的AI应用</td>
      </tr>
      <tr>
          <td><strong>Function Calling</strong></td>
          <td>简单直接</td>
          <td>每个AI都要单独实现</td>
          <td>简单的单一工具调用</td>
      </tr>
      <tr>
          <td><strong>LangChain Tools</strong></td>
          <td>成熟的框架</td>
          <td>绑定LangChain生态</td>
          <td>LangChain项目</td>
      </tr>
      <tr>
          <td><strong>自定义API</strong></td>
          <td>完全控制</td>
          <td>开发成本高，难复用</td>
          <td>特殊需求</td>
      </tr>
  </tbody>
</table>
<h3 id="62-什么时候用mcp">6.2 什么时候用MCP？</h3>
<p>✅ <strong>适合使用MCP</strong>：</p>
<ul>
<li>需要集成多个工具（数据库+文件+API）</li>
<li>希望工具可以在不同AI之间复用</li>
<li>构建企业级AI应用</li>
<li>需要标准化的工具接口</li>
</ul>
<p>❌ <strong>不适合使用MCP</strong>：</p>
<ul>
<li>只需要一个简单的API调用</li>
<li>项目已经深度绑定其他框架</li>
<li>对性能有极致要求（MCP有一定开销）</li>
</ul>
<hr>
<h2 id="第七章最佳实践">第七章：最佳实践</h2>
<h3 id="71-安全性">7.1 安全性</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># ❌ 危险：直接执行用户SQL</span>
</span></span><span class="line"><span class="cl"><span class="nd">@app.call_tool</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">call_tool</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">arguments</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">sql</span> <span class="o">=</span> <span class="n">arguments</span><span class="p">[</span><span class="s2">&#34;sql&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">execute_sql</span><span class="p">(</span><span class="n">sql</span><span class="p">)</span>  <span class="c1"># SQL注入风险！</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># ✅ 安全：参数化查询 + 权限控制</span>
</span></span><span class="line"><span class="cl"><span class="nd">@app.call_tool</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">call_tool</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">arguments</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># 1. 验证用户权限</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">user</span><span class="o">.</span><span class="n">has_permission</span><span class="p">(</span><span class="s2">&#34;query_database&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="p">[</span><span class="n">TextContent</span><span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">&#34;text&#34;</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s2">&#34;权限不足&#34;</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1"># 2. 白名单检查</span>
</span></span><span class="line"><span class="cl">    <span class="n">allowed_tables</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;users&#34;</span><span class="p">,</span> <span class="s2">&#34;orders&#34;</span><span class="p">,</span> <span class="s2">&#34;products&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="nb">all</span><span class="p">(</span><span class="n">table</span> <span class="ow">in</span> <span class="n">allowed_tables</span> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="n">extract_tables</span><span class="p">(</span><span class="n">sql</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="p">[</span><span class="n">TextContent</span><span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">&#34;text&#34;</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s2">&#34;不允许查询该表&#34;</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1"># 3. 参数化查询</span>
</span></span><span class="line"><span class="cl">    <span class="n">sql</span> <span class="o">=</span> <span class="n">arguments</span><span class="p">[</span><span class="s2">&#34;sql&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">params</span> <span class="o">=</span> <span class="n">arguments</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&#34;params&#34;</span><span class="p">,</span> <span class="p">[])</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">execute_safe_sql</span><span class="p">(</span><span class="n">sql</span><span class="p">,</span> <span class="n">params</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="72-错误处理">7.2 错误处理</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nd">@app.call_tool</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">call_tool</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">arguments</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 执行操作</span>
</span></span><span class="line"><span class="cl">        <span class="n">result</span> <span class="o">=</span> <span class="n">perform_operation</span><span class="p">(</span><span class="n">arguments</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="p">[</span><span class="n">TextContent</span><span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s2">&#34;text&#34;</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="n">result</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">except</span> <span class="ne">FileNotFoundError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 友好的错误提示</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="p">[</span><span class="n">TextContent</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="nb">type</span><span class="o">=</span><span class="s2">&#34;text&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="n">text</span><span class="o">=</span><span class="sa">f</span><span class="s2">&#34;❌ 文件不存在：</span><span class="si">{</span><span class="n">e</span><span class="o">.</span><span class="n">filename</span><span class="si">}</span><span class="se">\n</span><span class="s2">建议：检查文件路径是否正确&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">)]</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">except</span> <span class="ne">PermissionError</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="p">[</span><span class="n">TextContent</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="nb">type</span><span class="o">=</span><span class="s2">&#34;text&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="n">text</span><span class="o">=</span><span class="s2">&#34;❌ 权限不足</span><span class="se">\n</span><span class="s2">建议：使用sudo或检查文件权限&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">)]</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 记录详细错误日志</span>
</span></span><span class="line"><span class="cl">        <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;MCP tool error: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">,</span> <span class="n">exc_info</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 返回用户友好的错误</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="p">[</span><span class="n">TextContent</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="nb">type</span><span class="o">=</span><span class="s2">&#34;text&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="n">text</span><span class="o">=</span><span class="sa">f</span><span class="s2">&#34;❌ 操作失败：</span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">)]</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="73-性能优化">7.3 性能优化</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 使用缓存减少重复查询</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">lru_cache</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@lru_cache</span><span class="p">(</span><span class="n">maxsize</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">query_database</span><span class="p">(</span><span class="n">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># 相同的SQL查询会被缓存</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">execute_sql</span><span class="p">(</span><span class="n">sql</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 异步处理提高并发</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">asyncio</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@app.call_tool</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">call_tool</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">arguments</span><span class="p">:</span> <span class="nb">dict</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># 并行执行多个操作</span>
</span></span><span class="line"><span class="cl">    <span class="n">results</span> <span class="o">=</span> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">gather</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">query_database</span><span class="p">(</span><span class="n">sql1</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">        <span class="n">query_database</span><span class="p">(</span><span class="n">sql2</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">        <span class="n">read_file</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">combine_results</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="第八章未来展望">第八章：未来展望</h2>
<h3 id="81-mcp的发展方向">8.1 MCP的发展方向</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 2025年：基础工具集成</span>
</span></span><span class="line"><span class="cl"><span class="n">current_capabilities</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;文件系统访问&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;数据库查询&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;API调用&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;Git操作&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2026年预测：更智能的工具</span>
</span></span><span class="line"><span class="cl"><span class="n">future_capabilities</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;自动工具组合（AI自己决定调用哪些工具）&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;工具学习（根据使用反馈优化工具行为）&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;跨服务器协作（多个MCP服务器协同工作）&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;实时数据流（WebSocket支持）&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;工具市场（一键安装社区工具）&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">]</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="82-可能的应用场景">8.2 可能的应用场景</h3>
<p><strong>场景一：全自动运维</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">用户</span><span class="p">:</span> <span class="s2">&#34;网站响应变慢了&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">AI自动执行</span><span class="err">：</span>
</span></span><span class="line"><span class="cl"><span class="mf">1.</span> <span class="p">[</span><span class="n">调用monitoring_server</span><span class="p">]</span> <span class="n">检查服务器指标</span>
</span></span><span class="line"><span class="cl"><span class="mf">2.</span> <span class="p">[</span><span class="n">调用log_server</span><span class="p">]</span> <span class="n">分析错误日志</span>
</span></span><span class="line"><span class="cl"><span class="mf">3.</span> <span class="p">[</span><span class="n">调用database_server</span><span class="p">]</span> <span class="n">检查慢查询</span>
</span></span><span class="line"><span class="cl"><span class="mf">4.</span> <span class="p">[</span><span class="n">调用docker_server</span><span class="p">]</span> <span class="n">重启有问题的容器</span>
</span></span><span class="line"><span class="cl"><span class="mf">5.</span> <span class="p">[</span><span class="n">调用slack_server</span><span class="p">]</span> <span class="n">通知团队</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">结果</span><span class="p">:</span> <span class="s2">&#34;已自动修复，原因是数据库连接池耗尽&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>场景二：智能客服</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">客户</span><span class="p">:</span> <span class="s2">&#34;我的订单怎么还没发货？&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">AI自动处理</span><span class="err">：</span>
</span></span><span class="line"><span class="cl"><span class="mf">1.</span> <span class="p">[</span><span class="n">调用crm_server</span><span class="p">]</span> <span class="n">查询客户信息</span>
</span></span><span class="line"><span class="cl"><span class="mf">2.</span> <span class="p">[</span><span class="n">调用order_server</span><span class="p">]</span> <span class="n">查询订单状态</span>
</span></span><span class="line"><span class="cl"><span class="mf">3.</span> <span class="p">[</span><span class="n">调用logistics_server</span><span class="p">]</span> <span class="n">查询物流信息</span>
</span></span><span class="line"><span class="cl"><span class="mf">4.</span> <span class="p">[</span><span class="n">调用email_server</span><span class="p">]</span> <span class="n">发送更新邮件</span>
</span></span><span class="line"><span class="cl"><span class="mf">5.</span> <span class="p">[</span><span class="n">调用ticket_server</span><span class="p">]</span> <span class="n">创建跟进工单</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">回复</span><span class="p">:</span> <span class="s2">&#34;您的订单已在配送中，预计明天送达&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="结语mcp的意义">结语：MCP的意义</h2>
<p><strong>MCP不仅仅是一个协议，它代表了AI应用开发的范式转变</strong>：</p>
<h3 id="从ai是工具到ai用工具">从「AI是工具」到「AI用工具」</h3>
<p><strong>以前</strong>：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">人类 → 使用AI → 获得答案
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>现在</strong>：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">人类 → 告诉AI目标 → AI使用工具 → 完成任务
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="开发者的新机会">开发者的新机会</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 以前：开发AI应用很难</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">build_ai_app</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">学习LLM</span> <span class="n">API</span> <span class="err">✅</span>
</span></span><span class="line"><span class="cl">    <span class="o">+</span> <span class="n">实现工具集成</span> <span class="err">❌</span> <span class="p">(</span><span class="n">难</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="o">+</span> <span class="n">处理错误和边界情况</span> <span class="err">❌</span> <span class="p">(</span><span class="n">难</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="o">+</span> <span class="n">维护和更新</span> <span class="err">❌</span> <span class="p">(</span><span class="n">难</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="o">=</span> <span class="n">放弃</span> <span class="err">😭</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 现在：使用MCP很简单</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">build_ai_app_with_mcp</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">学习LLM</span> <span class="n">API</span> <span class="err">✅</span>
</span></span><span class="line"><span class="cl">    <span class="o">+</span> <span class="n">安装MCP服务器</span> <span class="err">✅</span> <span class="p">(</span><span class="n">简单</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="o">+</span> <span class="n">配置JSON文件</span> <span class="err">✅</span> <span class="p">(</span><span class="n">简单</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="o">=</span> <span class="n">成功</span> <span class="err">🎉</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="最后的思考">最后的思考</h3>
<p><strong>MCP的本质是「标准化」</strong>。</p>
<p>就像USB标准让所有设备都能连接电脑，MCP让所有工具都能连接AI。</p>
<p><strong>这意味着</strong>：</p>
<ul>
<li>🔧 开发者可以专注于创造工具，而不是重复集成</li>
<li>🤖 AI可以使用越来越多的工具，变得越来越强大</li>
<li>👥 用户可以用自然语言完成复杂任务，无需学习技术细节</li>
</ul>
<p><strong>MCP正在构建AI的「工具生态系统」</strong>，就像App Store之于iPhone。</p>
<hr>
<p><strong>快速开始</strong>：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. 安装MCP SDK</span>
</span></span><span class="line"><span class="cl">pip install mcp
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 创建你的第一个服务器</span>
</span></span><span class="line"><span class="cl">mcp create my-first-server
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 在Claude Desktop中配置</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 编辑 ~/Library/Application Support/Claude/claude_desktop_config.json</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 开始使用！</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>相关资源</strong>：</p>
<ul>
<li><a href="https://modelcontextprotocol.io/">MCP官方文档</a></li>
<li><a href="https://github.com/modelcontextprotocol">MCP GitHub仓库</a></li>
<li><a href="https://github.com/modelcontextprotocol/servers">MCP服务器列表</a></li>
<li><a href="https://github.com/modelcontextprotocol/python-sdk">MCP Python SDK</a></li>
</ul>
<p><strong>MCP的时代才刚刚开始。</strong></p>
]]></content:encoded></item></channel></rss>