一核四面:桌面应用如何同时服务 UI、CLI、HTTP 和 MCP
一核四面:桌面应用如何同时服务 UI、CLI、HTTP 和 MCP
如果你在做一款既给人直接用、又要接脚本、后台系统和 AI agent 的桌面工具,迟早会碰到一个架构问题:UI、CLI、HTTP、MCP 到底要各做一套,还是共用同一套内核?
我的结论是:更稳的做法通常不是四套实现,而是一套业务内核,四个调用入口。对 OmniGoAI 的 OmniPost 来说,桌面 UI、CLI、HTTP API、MCP 看起来面向不同对象,底下却应共享同一套平台能力、账号状态、校验规则和结果记录。
为什么桌面工具越来越需要多个入口?
因为现在很多桌面工具同时面对四类调用者:
- 人类用户,需要可见、可检查、可手动接管的界面;
- 本地脚本或计划任务,需要 CLI 做批处理;
- 现有系统,需要 HTTP 做 CMS、后台、队列集成;
- AI agent,需要 MCP 这种结构化工具接口。
如果只做其中一个入口,另外三个需求通常迟早会找上门。
真正共享的应该是什么?
所谓“一核四面”,共享的不该只是一个数据结构,而应该至少包括四层:
1. 业务规则共享
真正该收进内核的,是这些规则:
- 哪个平台支持草稿,哪个支持自动正式发布;
- 正式发布缺哪些字段要明确失败;
- 为什么掘金必须带分类、标签和摘要;
- NEED_LOGIN、VALIDATION_FAILED、MANUAL_PUBLISH 这类结果该怎么解释;
- 哪些结果算 published,哪些只是 draft。
这些规则不应在 UI、CLI、HTTP、MCP 里各写一遍,否则迟早漂移。
2. 状态模型共享
对桌面工具来说,至少这些事实应来自同一处:
- 应用是否在线;
- 平台和账号是否仍已登录;
- 最近一次执行结果;
- 某条内容当前是 draft、published、reviewing 还是 failed;
- 对应的错误码、日志和公开链接。
多入口系统最怕的不是失败,而是不同入口对同一件事给出不同答案。
3. 执行路径共享
“发布到知乎”这种动作,不该因为入口不同就走四套逻辑。正确做法应该是:
- 外层负责收参;
- 内核统一校验;
- 内核统一执行;
- 外层负责把结果按各自方式展示出去。
这样修一次 bug,四个入口都能一起受益。
4. 结果记录共享
这也是最容易被忽略的一层。无论从 UI、CLI、HTTP 还是 MCP 触发,结果都应该落到同一套记录里。至少包括:
- 时间;
- 平台;
- 账号;
- stage;
- error code;
- postUrl 或 editorUrl;
- recordId。
否则下次你连“这篇到底发过没有”都很难可靠判断。
四个入口各自负责什么?
UI:给人类一个控制面
UI 最重要的价值不是“也能点发布”,而是让人类可以:
- 看登录态;
- 手动补分类、标签、摘要;
- 查看预览和发布结果;
- 在验证码、风控或人工确认时接管。
CLI:给文件和脚本一个稳定入口
如果正文已经是 Markdown 文件,CLI 往往最顺手:
- 直接读文件;
- 适合计划任务、本地脚本和批量操作;
- 避免长正文在 shell 和 JSON 之间来回转义。
HTTP:给系统与系统之间做对接
HTTP 更适合这些场景:
- 内容来自 CMS 或后台服务;
- 多个上游共用一个发布层;
- 需要统一权限、审计或调度。
MCP:给 AI agent 一个结构化工具面
agent 的工作方式往往是:
- 先查状态;
- 再查账号;
- 根据返回结果补字段;
- preview;
- 决定草稿还是正式发布;
- 再读回结果继续下一步。
这种节奏天然更适合结构化工具调用,而不是一大段自由文本输出。
为什么“一核四面”更稳?
真正的好处主要有三点:
- 行为一致:平台能力、错误语义、published / draft / reviewing 的判断更容易统一;
- 维护成本低:新增能力先加进内核,再按需暴露到四个入口;
- 人工兜底自然:agent 遇到问题时,人可以直接在 UI 里看到同一条任务和同一份错误。
设计时最容易踩的坑
最常见的坑通常是这四个:
- 只统一传输层,没有统一业务层;
- 错误码没有统一语义;
- 结果记录分散在不同入口;
- 把 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+ 平台。
更多推荐

所有评论(0)