一核四面:桌面应用如何同时服务 UI、CLI、HTTP 和 MCP

如果你在做一款既给人直接用、又要接脚本、后台系统和 AI agent 的桌面工具,迟早会碰到一个架构问题:UI、CLI、HTTP、MCP 到底要各做一套,还是共用同一套内核?

我的结论是:更稳的做法通常不是四套实现,而是一套业务内核,四个调用入口。对 OmniGoAI 的 OmniPost 来说,桌面 UI、CLI、HTTP API、MCP 看起来面向不同对象,底下却应共享同一套平台能力、账号状态、校验规则和结果记录。

为什么桌面工具越来越需要多个入口?

因为现在很多桌面工具同时面对四类调用者:

  1. 人类用户,需要可见、可检查、可手动接管的界面;
  2. 本地脚本或计划任务,需要 CLI 做批处理;
  3. 现有系统,需要 HTTP 做 CMS、后台、队列集成;
  4. AI agent,需要 MCP 这种结构化工具接口。

如果只做其中一个入口,另外三个需求通常迟早会找上门。

真正共享的应该是什么?

所谓“一核四面”,共享的不该只是一个数据结构,而应该至少包括四层:

1. 业务规则共享

真正该收进内核的,是这些规则:

  1. 哪个平台支持草稿,哪个支持自动正式发布;
  2. 正式发布缺哪些字段要明确失败;
  3. 为什么掘金必须带分类、标签和摘要;
  4. NEED_LOGIN、VALIDATION_FAILED、MANUAL_PUBLISH 这类结果该怎么解释;
  5. 哪些结果算 published,哪些只是 draft。

这些规则不应在 UI、CLI、HTTP、MCP 里各写一遍,否则迟早漂移。

2. 状态模型共享

对桌面工具来说,至少这些事实应来自同一处:

  1. 应用是否在线;
  2. 平台和账号是否仍已登录;
  3. 最近一次执行结果;
  4. 某条内容当前是 draft、published、reviewing 还是 failed;
  5. 对应的错误码、日志和公开链接。

多入口系统最怕的不是失败,而是不同入口对同一件事给出不同答案

3. 执行路径共享

“发布到知乎”这种动作,不该因为入口不同就走四套逻辑。正确做法应该是:

  1. 外层负责收参;
  2. 内核统一校验;
  3. 内核统一执行;
  4. 外层负责把结果按各自方式展示出去。

这样修一次 bug,四个入口都能一起受益。

4. 结果记录共享

这也是最容易被忽略的一层。无论从 UI、CLI、HTTP 还是 MCP 触发,结果都应该落到同一套记录里。至少包括:

  1. 时间;
  2. 平台;
  3. 账号;
  4. stage;
  5. error code;
  6. postUrl 或 editorUrl;
  7. recordId。

否则下次你连“这篇到底发过没有”都很难可靠判断。

四个入口各自负责什么?

UI:给人类一个控制面

UI 最重要的价值不是“也能点发布”,而是让人类可以:

  1. 看登录态;
  2. 手动补分类、标签、摘要;
  3. 查看预览和发布结果;
  4. 在验证码、风控或人工确认时接管。

CLI:给文件和脚本一个稳定入口

如果正文已经是 Markdown 文件,CLI 往往最顺手:

  1. 直接读文件;
  2. 适合计划任务、本地脚本和批量操作;
  3. 避免长正文在 shell 和 JSON 之间来回转义。

HTTP:给系统与系统之间做对接

HTTP 更适合这些场景:

  1. 内容来自 CMS 或后台服务;
  2. 多个上游共用一个发布层;
  3. 需要统一权限、审计或调度。

MCP:给 AI agent 一个结构化工具面

agent 的工作方式往往是:

  1. 先查状态;
  2. 再查账号;
  3. 根据返回结果补字段;
  4. preview;
  5. 决定草稿还是正式发布;
  6. 再读回结果继续下一步。

这种节奏天然更适合结构化工具调用,而不是一大段自由文本输出。

为什么“一核四面”更稳?

真正的好处主要有三点:

  1. 行为一致:平台能力、错误语义、published / draft / reviewing 的判断更容易统一;
  2. 维护成本低:新增能力先加进内核,再按需暴露到四个入口;
  3. 人工兜底自然:agent 遇到问题时,人可以直接在 UI 里看到同一条任务和同一份错误。

设计时最容易踩的坑

最常见的坑通常是这四个:

  1. 只统一传输层,没有统一业务层;
  2. 错误码没有统一语义;
  3. 结果记录分散在不同入口;
  4. 把 MCP 做成另一套“影子产品”。

常见问题

为什么不能只做 HTTP,再让 UI 和 MCP 都包它?

可以,但前提是 HTTP 后面仍然是真正的共享内核,而不是把业务逻辑直接长在接口层上。

MCP 和 HTTP 的本质区别是什么?

HTTP 更适合系统对系统,MCP 更适合 agent 逐步调工具、逐步消费结果。两者背后最好还是同一套核心能力。

UI 在 agent 时代还重要吗?

很重要。只要系统里还存在登录、风控、人工确认和结果复盘,UI 就仍然是必要的人类控制面。

“一核四面”会不会把产品做得更重?

真正让产品变重的不是入口数量,而是每个入口都各做一遍。共享内核反而是在给多入口降复杂度。

本文首发于 OmniGoAI 官网:https://omnigoai.com/zh/blog/one-core-four-faces-design/ ——OmniPost,把内容一键分发到 30+ 平台。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐