MCP 不只是一组工具:用 mcp-use 把 Server、React View 与 Inspector 串成可执行的 AI 应用
MCP 不只是一组工具:用 mcp-use 把 Server、React View 与 Inspector 串成可执行的 AI 应用
我观察到,Model Context Protocol(MCP)最容易被低估的地方,是大家常把它理解成「让模型多几个函式可以呼叫」。这个理解没有错,但只说到协定的入口,还没有碰到真正的产品问题:工具被呼叫之后,结果要怎么呈现?输入输出如何维持一致?开发者怎么测试与除错?如果最后要交付给使用者的不是一段 JSON,而是一个能互动的 AI 应用,单靠几个散落的 server function 很快就会失去秩序。
这也是我认为 mcp-use 值得关注的原因。它不是单纯的 MCP client 或 server 范例,而是以 TypeScript 为核心,尝试把 MCP Server、型别验证、React Views、浏览器 Inspector 与代理导向的开发流程放在同一个框架里。换句话说,它处理的不是「能不能呼叫工具」这一题,而是「如何把 MCP 工具做成可以开发、测试、观察与交付的应用」。
先讲结论:它解的是 MCP 应用的整合成本
mcp-use 的官方 README 将定位放在 TypeScript MCP framework,并同时强调 MCP servers、ChatGPT plugins、Claude connectors、MCP Apps 与 Native Views。从这个定位可以看出,它瞄准的是应用层,而不是重新发明 MCP 协定本身。
我认为它的价值可以拆成四层:
1. Server 层:用 MCPServer 宣告服务名称、版本与工具。
1. Schema 层:以 Zod 描述输入与结构化输出,让工具契约靠近程式码。
1. View 层:让工具可以绑定 React View,把结果变成可互动的介面。
1. 检查与交付层:透过 Inspector、CLI 与开发伺服器观察工具,降低整合时的黑盒感。
这四层不代表所有专案都必须一次用完。反而应该把它看成一条由小到大的导入路径:先建立一个可呼叫的工具,再补上结构化资料与 View,最后才处理部署、权限、观测性与模型端整合。
为什么「型别」在 MCP 应用中特别重要?
传统 API 也会定义 schema,但在 MCP 情境里,工具描述本身会影响模型如何选择与组合工具。输入栏位名称、描述、输出结构与安全提示,不只是给前端看的文件,也可能成为模型规划下一步时的上下文。
mcp-use 的 quickstart 使用 Zod 建立输入与输出 schema,再把它们交给 server.tool。例如天气工具可以把 city 定义为字串,把输出固定成城市、温度与天气状况。这种做法的重点不在于范例本身,而在于让工具的三种契约靠在一起:
- 开发者在 TypeScript 中能得到型别提示。
- MCP client 能取得较清楚的工具定义。
- React View 可以依照结构化结果渲染,而不是从一段自然语言中猜资料。
这会直接影响维护成本。当工具数量增加时,最怕的是 server 回传格式悄悄改变,UI 仍假设旧栏位存在,最后只在模型实际操作时才爆出错误。把 schema 放在工具定义旁边,不会消除所有错误,但能让错误更早出现、更容易被定位。
从第一个工具开始:可验证的快速上手
官方 README 提供的初始化入口是:
npx -y create-mcp-use-app@latest
建立专案后,依 README 的流程执行:
npm run dev
开发伺服器启动后,可以打开:
http://localhost:3000/mcp/inspector
这个流程值得注意,因为它不是只产生一个空白专案。官方说明指出,scaffold 会准备 server、TypeScript 设定、开发脚本、Inspector 与 React view pipeline。对第一次接触 MCP 的团队来说,这比复制一段 server 程式码更实用:你能在同一个本机环境里建立工具、启动服务,接着直接观察 MCP endpoint。
最小的 server 大致包含三个部分:建立 MCPServer、用 schema 描述工具,以及在 handler 中回传 MCP 内容与 structuredContent。以官方天气范例来看,工具除了文字输出,也会回传结构化的 weather object。这个差异很关键:文字适合让模型阅读,结构化结果则适合被 View、其他程式码或后续工具继续使用。
React View 让工具结果不必停在文字
当工具宣告 view: { name: "weather-card" } 后,mcp-use 可以把同名目录中的 React 元件接到这个工具。官方范例透过 useToolContext 取得状态、输入与工具输出,再用 useCallTool 重新呼叫工具。画面可以呈现城市、温度与状态,也能提供 Refresh 按钮。
我认为这里最值得借鉴的不是「天气卡片」本身,而是互动边界的设计:
- 工具负责取得资料与定义资料契约。
- View 负责把状态转换成使用者看得懂的介面。
- 呼叫工具的动作仍然透过明确的 hook 完成,而不是在 UI 里偷偷复制一套 API 逻辑。
对企业知识库、资料查询、工作流程审批或内部营运助手而言,这个模型很自然。例如查询报表的工具可以回传结构化的摘要与明细,View 再提供筛选、重新查询或下一步操作。模型负责理解意图,工具负责执行,View 负责把结果变成可操作的工作介面。
但也要保持清醒:React View 不是自动生成完整产品。你仍要处理 loading、error、空资料、权限、重复提交、失败重试与不同 client 的相容性。框架帮你把连线方式整理好,产品品质仍取决于你如何设计状态与错误边界。
Inspector 的意义:从「模型说它做了」回到可观察
AI 应用最麻烦的除错情境之一,是模型描述自己做了什么,但开发者看不到真正送出的参数、工具回应与 UI 状态。mcp-use 把 Inspector 放在快速上手路径中,我认为这是一个正确选择。
在本机开启 Inspector 后,开发者可以先不依赖完整的 ChatGPT 或 Claude 产品整合,直接检查 MCP endpoint 是否能被连线、工具是否出现、输入是否符合 schema、回应是否包含预期的 structured content。这种测试顺序可以把问题切开:
- 如果 Inspector 都连不上,先查 server、路由或网路。
- 如果工具出现但输入失败,查 schema 与参数描述。
- 如果工具成功但 View 不对,查 structured content 与前端状态。
- 如果本机正常、外部 client 失败,再查 client 能力与部署设定。
这比直接把所有变数丢进模型对话,再从一段自然语言输出猜问题在哪里,可靠得多。对准备进入正式环境的团队,我会把 Inspector 视为开发阶段的基本验证入口,而不是可有可无的展示功能。
mcp-use 适合哪些专案?
第一类是需要把内部资料或动作暴露给 AI agent 的 TypeScript 团队。例如 CRM 查询、工单操作、文件搜寻、资料库读取与流程触发。这些场景通常不只需要一个 function,还需要清楚的 schema、错误处理与可观察性。
第二类是希望在对话之外提供互动式 AI 介面的产品。若使用者需要看表格、卡片、状态进度或重新执行某个动作,Native Views 的方向会比单纯回传 Markdown 更接近产品需求。
第三类是正在评估 MCP Apps、ChatGPT 或 Claude connector 整合的前端团队。mcp-use 的 scaffold、文件与 Inspector 能缩短概念验证时间,让团队先验证「工具契约与 UI 是否合理」,再投入完整平台整合。
相对地,如果你的需求只是写一个极简、长期稳定的 MCP server,而且团队不使用 TypeScript 或 React,那么直接采用更贴近语言生态的 SDK,可能更简单。框架提供越多整合能力,代表你也要理解更多惯例与版本边界。
导入前不可忽略的限制
第一,MCP 并不等于安全策略。 工具可以读资料、写资料,甚至触发破坏性动作。schema 里的 readOnlyHint、destructiveHint 与 openWorldHint 能提供提示,但不能取代伺服器端授权、使用者确认、审计纪录与最小权限。任何会改变状态的工具,都应该在 handler 和后端服务再次验证权限。
第二,模型可理解不代表模型一定会正确使用。 工具名称、描述与栏位说明要清楚,但还是要用真实任务测试错误选择、缺少参数、过度呼叫与重复提交。尤其是多工具环境,命名冲突与模糊描述会让问题变得难以追踪。
第三,互动 View 增加了测试面积。 你不只要测 server,还要测 View 在 pending、error、空结果与资料格式变更时的行为。如果同一个 MCP app 会被多种 client 开启,也要确认各 client 对 View、资源与连线生命周期的支援程度。
第四,版本迁移要有计划。 README 已提供从 v1 迁移到 v2 的官方入口,这提醒我们不要只看目前能不能跑。正式导入前应锁定版本、阅读 migration guide、保留可重现的安装设定,并把 server schema 与整合测试放进 CI。
我会怎么开始一个小型试点?
我不会一开始就把整个企业资料层搬进 MCP。比较稳妥的做法是选一个唯读、资料边界清楚、失败成本低的任务,例如查询团队文件或读取一份测试报表。
第一步,用 scaffold 建立专案,确认本机 server 与 Inspector 都能运作。第二步,只加入一个工具,为输入与输出写明确 schema,并设计几个正常与异常案例。第三步,先用 Inspector 验证工具,再接到目标 client。第四步,若文字结果确实不足以支援任务,再加一个简单 View,而不是预先建立复杂的前端系统。第五步,把权限、日志、逾时、重试与敏感资料遮罩补上,最后才讨论部署。
这个顺序的核心是把「协定连线问题」、「工具契约问题」、「介面问题」与「产品治理问题」分开验证。mcp-use 可以降低前两者的起步成本,但不应让团队误以为后两者会自动消失。
结语:MCP 应该被当成应用介面,而不是模型外挂
如果只把 MCP 当作工具清单,最后很容易得到一堆模型偶尔能呼叫、却没有人敢交付的 function。mcp-use 提供的方向,是把 MCP 往应用框架推进:用 TypeScript 与 schema 管理契约,用 React View 呈现互动结果,再用 Inspector 把开发与除错变成可重复的流程。
我会把它定位成「适合快速建立可观察 MCP 应用的 TypeScript 框架」,而不是所有 MCP 专案的唯一答案。对 AI Chain 读者而言,真正值得带走的判断标准也许是:你的 MCP 专案是否需要结构化工具契约?是否需要把结果交给互动介面?是否需要在接上模型之前先看见完整的工具行为?如果答案是肯定的,mcp-use 就值得拿一个小型、低风险的任务来试验。
参考资料