🚀 创建 PHP MCP 应用以发布 Darkwood 文章
Source: Dev.to
大型语言模型在文本生成方面已经表现出色。
然而,在许多项目中仍然缺少一种简单的方法,将这种生成转化为真正的工作流:撰写草稿、复审、校正、发布,并以直观的方式集成到 AI 客户端应用中。
这正是 MCP(Model‑Centered Programming)应用变得有趣的地方。
为什么 MCP 应用程序很重要
MCP 应用程序增加了更实用的功能:它们允许工具 嵌入自己的用户界面。
这会显著改变交互模型:
- 与仅返回文本不同,工具现在可以在宿主系统中打开专用界面。
- 该界面可以显示输入状态、呈现结果、在整个流程中引导用户,并触发额外的工具调用。
- 工具不再是单纯的远程函数,而更像是 完整的应用程序界面。
在编辑工作流中,这种模型远比纯文本更为适合。
用例:在 Darkwood 上发布博客文章
此 MCP 应用用于简化在 Darkwood 上发布博客文章的过程。工作流包括两个主要步骤:
- GenerateDraft – 根据主题或上下文生成初始草稿。
- PublishDraft – 处理发布过程。
注意:如果草稿尚未满意,流程可以继续。可以回退、修改或重新审阅,然后再尝试发布。这个迭代循环至关重要,因为第一稿往往过于草率、过于通用、过长,或不符合编辑意图。
MCP 服务器,多种使用方式
服务器可以通过不同的传输方式使用:
| 传输方式 | 描述 | 典型使用场景 |
|---|---|---|
| Stdio | 主机启动服务器,通过标准输入发送 JSON‑RPC 消息,并从标准输出读取响应。 | Claude Desktop 扩展、本地集成、Claude Desktop 打包。 |
| HTTP | 服务器提供 HTTP API。可以由专用且持久的进程提供服务(例如:flow worker)。 | 面向浏览器的主机、本地测试、在 HTTP 限制比子进程更方便的环境中。 |
备注:当涉及 MCP 应用时,用户界面通过另一个 JSON‑RPC 通道(通常是
postMessage)与主机通信。因此存在 两个通信层级:
- 主机 ↔ 服务器通过 MCP,
- UI 界面 ↔ 主机通过
postMessage。
MCP 连接的生命周期
- 初始化 – 主机初始化连接并发现服务器的能力。
- 发现 – 主机列出可用的工具和资源。
- 调用 – 当用户触发工具时,主机在服务器上调用该工具。
- 资源 UI – 如果工具拥有界面资源 (
ui://…),主机加载该资源并在隔离的 iframe 中显示。 - 交互 – MCP 应用变为交互式:它接收用户输入的数据,显示结果,并通过主机触发补充操作。
在 Darkwood 工作流中,这意味着用户(或助手)可以从草稿生成切换到发布,然后再回到修正循环,整个过程无需离开 MCP 交互模型。
架构
概览
+-------------------+ +-------------------+
| Hôte MCP | | Serveur PHP |
| (client) | | (MCP server) |
+-------------------+ +-------------------+
^ ^
| |
| JSON‑RPC (Stdio / HTTP) |
| |
v v
+-------------------+ +-------------------+
| Interface UI | | Ressources UI |
+-------------------+ +-------------------+
MCP 主机连接到 PHP 服务器。
这种分离使得在兼容的主机上保持可移植的用户界面,同时在服务器端保持干净的 MCP 合约。
详细传输
Stdio
- 适用于 Claude Desktop 扩展。
- 主机启动服务器,通过
stdin/stdout交换 JSON‑RPC 消息。 - 简单、本地且高效,适用于客户端管理进程的情况。
HTTP
- 适用于面向浏览器的主机、本地测试或任何使用 HTTP 更方便的配置。
- 两种实现模式:
- 专用且持久的进程(例如:flow worker)。
- 传统 HTTP 服务器(例如:Symfony Server)。
重要: “支持 HTTP” 并不自动意味着 “在所有地方都支持相同的执行模型”。
- 使用 Stdio 或 持久 HTTP worker,可以考虑使用持久进程,从而实现异步功能、事件循环和持续编排。
- 使用 Symfony Server 时,每个请求都在同步的 HTTP 循环中处理:实现更简单,但工作流的编排需要委托(例如:Flow 层或外部协调)。
编辑流管理
- 初始化 – 主机负责传输、渲染以及用户界面与服务器之间的连接。
- 编排 – Flow 层在涉及多个操作和状态转换的工作流中进行编排。
编辑流通常涉及不止一个操作和不止一个状态转换;Flow 层确保这些步骤得到正确协调。
结论
MCP 应用提供了集成用户界面,将单纯的文本生成转变为完整工作流:撰写、审校、发布和迭代。
在 Darkwood 的情境下,这实现了:
- 快速生成初稿。
- 在不离开 MCP 环境的情况下轻松迭代(校正、审阅)。
- 流畅地发布最终内容。
通过将 Stdio 与 HTTP 传输相结合,并采用清晰的架构(主机 ↔ 服务器 ↔ UI),开发者能够打造丰富、响应迅速且易于扩展的编辑体验。
这种设计对出版工作流有效吗?
这不仅仅是一次简单的函数调用,也不是完整的后台应用程序。
它需要足够的结构来管理状态和决策,同时又足够轻量,能够通过与 AI 的对话触发。
这正是 MCP 应用程序 在此处完美适用的原因。
各层的角色
- 工具接口 – 为模型提供交互界面。
- 用户界面 – 为用户或客户提供受控的工作流视图。
- 流编排 – 使系统能够管理多步骤的转换。
这种组合之所以有效,是因为每一层都保持专注:
- 模型决定 何时 使用工具,
- 项目不仅仅是本地原型或浏览器演示;它可以安装在 Claude 中,作为真正的工具集成使用。
配置
- 扩展清单 – 定义 Claude 如何启动服务器。
- 从原型到真实编辑工具 – 项目已经为编辑工具定义了一种可复用的形式:
- 用于生成草稿的工具,
- 一旦该结构就位,工作流的改进就会变得更简单:
- 优化生成质量,
- 丰富发布元数据,
- 添加验证,
- 集成真正的 CMS。
托管方、用户界面和服务器之间的契约保持稳定。
开源
https://github.com/darkwood-com/darkwood-publish-article-mcp-apps
Conclusion
在 Darkwood 的案例中,最有趣的并不是 PHP 能够与 MCP 通信。
更有趣的是,一个 PHP MCP 服务器现在可以作为小型编辑应用的后端,能够通过 AI 客户端访问,同时具备:
- 工具的语义,
- 集成的用户界面。
这将“模型可以调用函数”的集成提升为“模型可以参与受控的发布工作流”。
这是一种更有用的场景。
来源
- MCP 应用快速入门 –
README.md - php‑mcp‑apps 的 MVP 架构 –
php-mcp-apps-mvp-architecture.md