温嘉琪的博客 / BUILDING SOMETHING FUN

给自己的 app 做 MCP Server

MCP Server 通常是什么东西?Google Drive 有,GitHub 有,Notion 有。逻辑是:我是一个有大量用户的平台,我让 AI 能操作我这里的数据,这样用 AI 的人可以顺手把我也接进去。

我在做的是一个早期 iOS app,叫 Manitodo,用户只有我自己。我为什么要给它做 MCP Server?


起点是一个具体的不舒服。

我用 Claude Code 开发 Manitodo。AI 帮我写代码、调 bug、想架构,这件事已经很顺了。但有一个地方一直有点奇怪:AI 在帮我开发这个 app,但它不知道这个 app 里正在发生什么。

我在跟 AI 讨论"要不要给进度记录加一个时间线视图",AI 可以给建议,但它不知道我在 Manitodo 里现在有几个目标、这些目标的完成度怎么样、我自己实际用这个产品的时候卡在哪里。它对产品本身是盲的,所有建议都是基于我描述给它的情况,而不是真实的产品状态。

这不是 AI 不够聪明,是它根本拿不到那些信息。

MCP Server 是我想到的答案:如果 Manitodo 能把自己的数据暴露出去,AI 在帮我做决策的时候就能看到真实情况,而不只是听我说。

这是两件很不一样的事。"给 app 加 AI 功能"是让 AI 服务用户,"给 app 做 MCP Server"是让 AI 服务开发者——也就是我自己。后者在独立开发的语境里其实更有用,但很少有人这么想。


开始做之后,遇到了一个比预想中更根本的问题。

AI 能拿到数据,但它不知道这些数据在我的产品里意味着什么。

举一个具体的地方。Manitodo 设定目标的时候,描述要用已经实现的状态来写——不是"我想学日语",而是"掌握了日语 N2"。这是一个刻意的设计,用已实现的语气来描述目标,心理上的感受是不一样的。

这件事 AI 不会自己知道。你不说,它就照着用户说的话原封不动存进去。用户说"我想学日语",它填的就是"我想学日语"。这个产品设计在 AI 介入之后悄无声息地失效了,没有报错,看起来一切正常。

类似的问题还有很多。比如 AI 拿到一个目标列表,它该展示哪些字段?只给标题它不够用——不知道这个目标的方向,下一步就得再查一次。给全字段又太重,而且大部分字段在这个场景里没有意义。怎么知道"够用"在哪里?这不是技术问题,是对产品的理解问题,AI 拿不到这个理解。

比如 AI 调了一个接口,拿回来一个空列表。它下一步该做什么?这取决于这个空列表在产品流程里意味着什么——是用户刚开始用、什么都没有,还是这个状态本来就不该出现。AI 不知道,除非你告诉它。

我意识到的事情是:给 AI 接入产品,真正要传递的不是接口,是你对产品的理解。接口它能调用,但这些设计决策、边界条件、上下文,它都不知道。而你知道。


这个过程有一个没预料到的副产品。

我在给 AI 写"说明书"的时候,被迫把很多从来没有明确说过的东西用语言描述了一遍。有些设计决策我心里有数,但从来没有写下来,因为只有我一个人用这个产品,没有必要解释给任何人听。

给 AI 解释的时候,这些东西必须说清楚,否则它就会做错。

有几个地方,我在写的时候发现自己其实没想清楚——我以为我知道"为什么这样设计",但要说给 AI 听的时候,说不出一个完整的理由。

这是意思之外的收获:给 AI 做集成,结果帮我把产品想得更清楚了。强迫自己把显而易见的东西说出来,有时候才会发现它并没有那么显而易见。