🔌 第8章 基于MCPServer的IDE应用实战
📄 一句话概括

六个案例:找论文、抓网页、画导图、云桌面、私人导游、本地文件。 它们其实是同一个模板:装 Server、问一句、看它挑哪个工具、看结果。 六件事里只有「本地文件」能碰你磁盘,所以只有它必须做路径校验。

📝 本章和前面几章的关系

上一节两个案例在 Cline 上,这一节六个在 Trae 上。 换宿主不换协议:配置还是那段 json,工具还是那张表。 所以这一节的重点不是「六个案例」,是「一个模板套六次」。

一、六个案例,一个模板

AiXiv 找论文、Firecrawl 抓网页、Xmind 画导图、AgentBay 云桌面、地图做私人导游、 filesystem 管本地文件。 六个换了六种能力,动作一模一样:装 Server、问一句、看它挑哪个工具、看结果。 会一个就会六个。 差别只在参数和产物形态:论文是列表,网页是 markdown,导图是树,文件是文本。

所以读这一节别去记六个案例的细节,记这一个模板就够了:用户说一句、模型挑工具、工具返回、 模型接着说。

二、论文与网页:两步分开是有道理的

AiXiv 侧演示用了两个工具:paper.search 搜、paper.download 取全文。 搜是便宜的,下载是贵的——要流量、要时间、可能还要额度。所以让模型先搜,看完列表再决定下哪一篇。 Firecrawl 侧只有一个 scrape。它干的事不是「发个请求」,是把网页洗成 markdown。

这个区别很重要:HTML 里九成是标签,模型读不动;洗成 markdown 之后,它才能读正文。 所以这类 Server 的价值不在「能联网」,在「把网上的东西变成模型能读的形状」。

三、导图:让 AI 写树,不让 AI 画图

演示里给一段三段的大纲,工具把它变成一棵树:MCP 下面挂协议层、传输层、安全,各自再挂子节点。 产物是树,不是图片。 Xmind 那一步只是把树画出来。 这一点想通了,「让 AI 画思维导图」这件事就变得很具体:让 AI 写一个有层级的大纲, 再用工具转成 .xmind 的结构。

所以这里的工具只需要两个参数:中心主题和缩进大纲。缩进表示层级,比让模型输出 JSON 稳。 顺带一句:这类转换工具特别好写,也特别容易被低估。它不联网、不花钱、结果确定。

四、本地文件:唯一必须做校验的那个

演示里两个工具:fs.list 列目录、fs.read 读文件。 两个都只做一件事——把路径拼到根目录下,再用 realpath 检查前缀。 传 todo.md 正常,传两个点加斜杠就被拒。这就是第 3 章那个攻击在真实工具里的样子。 六个案例里只有它能碰你磁盘。所以只有它必须做路径校验,也只有它必须限定根目录。

限定根目录这一条要在工具里写死,不能靠配置。 配置会被改,代码不会。 顺便说一句 AgentBay 那类云桌面:它跑在别人的机器上,碰不到你的文件, 风险的模样完全不同——风险变成「它能替你操作什么账号」。

五、六个 Server 装在一起会怎样

演示最后量了一下:这里四个 Server 六个工具,拼成提示词 535 字、约 310 token。 把工具复制到 90 条,就成了 8025 字、约 4255 token。每轮对话都要带上这些。 所以实战里的做法是「按项目装」,不是「全都装」:做论文就装 AiXiv,写页面就装 Figma 和文件系统。

装 Server 像装浏览器插件:装十个,浏览器慢一半。 六个案例到这儿就完了。下一章换题材:七个生活类智能体,全是「一句话进、一个结果出」。

六、动手 Demo:在 Trae 里六个案例,一个模板

六个 Server 各造一两个工具,依次跑一遍:搜论文、抓网页、生成导图树、读写本地文件。 最后量一下工具表拼成提示词有多长,看「全都装」的代价。 工具都是真注册真调用,本地文件是真读真写。

ax = Server('aixiv-mcp')
ax.add(Tool('paper.search', '按关键词搜论文', SCHEMA, fn))
ax.add(Tool('paper.download', '给标题返回摘要与下载地址', SCHEMA, fn))

fc = Server('firecrawl-mcp')
fc.add(Tool('scrape', '抓网页,返回正文 markdown', SCHEMA, fn))

xm = Server('xmind-mcp')
xm.add(Tool('mindmap.create', '按缩进大纲生成节点树', SCHEMA, fn))

fs = Server('filesystem')
fs.add(Tool('fs.list', '列目录', SCHEMA, fn))
fs.add(Tool('fs.read', '读文件', SCHEMA, fn))

print(call(ax, 'paper.search', {'q': 'tool'}))
print(call(fc, 'scrape', {'url': 'https://example.com/news/1'}))
print(call(xm, 'mindmap.create', {'topic': 'MCP 知识地图', 'outline': OUTLINE}))
print(call(fs, 'fs.read', {'path': '../secret.txt'}))   # 被拒

实跑输出:

--------------------------------------------------------------------
在 Trae 里六个案例,一个模板
--------------------------------------------------------------------


  ① 六个案例,其实是同一个模板
  --------------------------------------------------------------------

| 案例 | Server | 第一个动作 | 产物 |
|---|---|---|---|
| 论文查找与下载 | AiXiv | 按关键词搜论文 | 标题、年份、摘要 |
| 网页信息抓取 | Firecrawl | 抓一个网址 | 正文 markdown |
| 思维导图整理 | Xmind | 把大纲写成节点树 | 一个 .xmind 结构 |
| 无影 AgentBay | AgentBay | 在云桌面里开一个应用 | 操作结果 |
| AI 私人导游 | 高德一类地图 | 查景点和路线 | 一天的行程 |
| 本地文件管理 | filesystem | 列目录、读文件 | 文件内容 |

  六个案例换了六种能力,动作是同一个:装 Server、问一句、看它挑哪个工具、看结果。
  【会一个就会六个】,差别只在参数和产物形态。

  ② AiXiv:先搜再取
  --------------------------------------------------------------------
用户说:帮我找几篇讲工具调用和 MCP 的论文。
  命中 2 篇
    Model Context Protocol: A Standard for Tool…   2024  arXiv  312 次引用
    Toolformer: Language Models Can Teach Thems…   2023  arXiv  1876 次引用

挑第一篇要全文:
  url:https://aixiv.example/abs/2861
  摘要:本文提出一种把工具调用写成协议的方法……
  两步分开是有道理的:搜是便宜的,下载是贵的(要流量、要时间),所以让模型先搜、确认之后再下。

  ③ Firecrawl:一个网址进去,一段 markdown 出来
  --------------------------------------------------------------------
抓那一页讲充电桩的新闻:
  # 标题:某地推进充电桩建设

  今年计划新建 2000 个快充桩……
  抓回来的不是 HTML,是 markdown。这一步很重要——【HTML 里九成是标签,模型读不动】。
  所以这类 Server 的价值不在于「能发请求」,在于「把网页洗成模型能读的东西」。

  ④ Xmind:把大纲写成节点树
  --------------------------------------------------------------------
给三段大纲,让它生成导图结构:
  ○ MCP 知识地图
    ├ MCP
      ├ 协议层
        ├ JSON-RPC
        ├ 五个错误码
      ├ 传输层
        ├ stdio
        ├ Streamable HTTP
      ├ 安全
        ├ 描述投毒
        ├ 最小权限
  产物是一棵树,不是图片。
  Xmind 那一步只是把树画出来,【所以「让 AI 画导图」实际是「让 AI 写树」】。

  ⑤ 本地文件管理:真的读写本机
  --------------------------------------------------------------------
  fs.list  -> {"items": ["todo.md"]}
  fs.read  -> {"text": "# 待办\n\n- 把 D022 跑通\n- 检查路径校验\n"}
  fs.read  -> {"error": "路径越界,已拒绝"}
  最后一行是第 3 章那个攻击在真实工具里的样子。这个工具写对了,它拒绝了。
  六件事里只有它能碰你本机的文件,所以【只有它必须做路径校验】。

  ⑥ 六个 Server 装在一起,问题来了
  --------------------------------------------------------------------

| 装几个 Server | 工具条数 | 拼成提示词多少字 | 约多少 token |
|---:|---:|---:|---:|
| 这里 4 个 | 6 | 535 | 310 |
| 六个都塞满 | 90 | 8025 | 4255 |

六个案例全装上,工具表就有几十条——第二行那些 token,每轮对话都要带上。
  第二行是拿这六条复制十五遍凑出来的,只用来看「条数涨上去,字数和 token 怎么涨」。
  【所以实战里的做法是「按项目装」,不是「全都装」】:做论文就装 AiXiv,
  写页面就装 Figma 和文件系统。
  这一章两个案例讲完,下一章换题材:七个生活类智能体,全是「一句话进、一个结果出」。

①第一张表六行,最后一列「产物」是关键。六个案例的产出形态完全不同,但流程是同一个。 ②论文那两步分开是有意的:搜便宜、取贵。先搜后取,是这类工具的标准做法。 ③抓网页那一步的重点是「洗成 markdown」,不是「发个请求」。HTML 直接给模型,它读不出正文。 ④导图那一段的产物是一棵树。看见那行缩进就知道:AI 画导图,画的是层级。 ⑤本地文件最后一行被拒了。这一行是六个案例里唯一跟安全直接相关的,其余五个的风险在别处。

30 秒实验

  1. 把 xmind 那个工具的提纲换成四层,看生成的树对不对。
  2. 把 fs.read 的根目录写死成上级目录,再跑一次,看它还会不会拒。
  3. 只装两个 Server(论文和文件),量一下工具表比全装少多少。

常见误区

  1. 「抓网页就是发个 HTTP 请求。」重点是洗成 markdown。给模型原始 HTML,它读不动。
  2. 「画思维导图是画图。」是写树。图是最后一步渲染出来的。
  3. 「本地文件工具加个配置就能限制范围。」配置会被改。限定根目录要写进代码。
自测三问(点开对答案) 1. 六个案例为什么说是一个模板? —— 流程都是:装 Server、问一句、模型挑工具、工具返回、模型接着说。换的只是工具和产物形态。 2. 为什么论文要先搜再取全文? —— 搜便宜、取贵。先看列表再决定下哪一篇,省流量也省额度。 3. 六个案例里哪个必须做路径校验?为什么? —— 本地文件那个。只有它能碰你的磁盘,其余五个碰不到本机文件。

这一章两个案例收尾。 下一章七个生活类智能体,全是问答形状,但每一个都藏着一个「参数从哪来」的问题。

相关笔记