|本文预计阅读:6 分钟
一、AI 能生内容,但发布这一步还是断的
我之前写过一篇文章,介绍 MatrixMedia 的 CLI 设计——exit code、JSON stdout、被 n8n 和 AI Agent 调用的方式。
那是"第一层":让 AI 能通过 shell 命令发布视频。
但 CLI 有个隐形的门槛:你得在代码里手动拼命令、处理字符串、解析输出。用 n8n 还好,有 Execute Command 节点,但如果用的是 Claude Desktop 或 Cursor,想让 AI 直接喊一声"把这条视频发到抖音"然后就能执行——CLI 这条路走不通。
这就是 MCP 解决的问题。
二、MCP 是什么,为什么选它
一句话:MCP 是 AI 模型和外部工具之间的标准通信协议。
你可以把它理解成:给 Claude、Cursor 这类 AI 工具开了一个标准插槽,开发者往里插"工具",AI 就能直接调用,不需要你在 Prompt 里解释怎么拼命令。
和直接封装 REST API 相比,区别在哪?
- REST API 需要 AI 知道请求格式,在 Prompt 里传参数,容易出错
- MCP 把参数结构、工具描述都提前声明好,AI 自动解析,调用时就像调本地函数
为什么选 stdio 传输?
MatrixMedia 是本地 Electron 应用,没有服务器,不对外暴露端口。stdio 传输用的是标准输入输出通道,MCP Client(Claude Desktop)直接把 Server 作为子进程拉起来,双向通信,不需要起 HTTP 服务,零配置,适合本地工具场景。
三、MCP Server 设计:4 个工具,职责划分清楚
整个 MCP Server 暴露了 4 个工具,每个有明确的单一职责:
list_accounts
列出所有已登录账号和当前登录态状态。AI 发布前先调这个确认账号存活,不做无意义的发布尝试。
list_history
查发布历史记录,支持按平台过滤。AI 需要判断"这条视频发没发过"时用这个,避免重复发布。
publish_video
核心工具。传入平台、账号手机号、视频路径、标题、标签,触发实际发布动作。底层调的就是原来的 CLI publish 命令。
login_douyin
单独把抖音登录拎出来做成一个工具。原因:抖音对 cookie 的校验最严,登录态过期最频繁,其他平台相对稳定。这样 AI 检测到发布失败(exit code 3)后可以直接调这个工具触发重新登录,不用人介入。
这 4 个工具的粒度刻意控制了:不把"查账号然后发布"合并成一个工具。分开的好处是 AI 可以自己组合调用,也让每个工具的可测试性更强。
四、核心实现:stdio 传输 + 工具注册
MCP Server 入口文件,核心逻辑:
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
import { listAccountsTool, handleListAccounts } from './tools/accounts.js';
import { listHistoryTool, handleListHistory } from './tools/history.js';
import { publishVideoTool, handlePublishVideo } from './tools/publish.js';
import { loginDouyinTool, handleLoginDouyin } from './tools/login.js';
const server = new Server(
{ name: 'matrixmedia', version: '0.1.0' },
{ capabilities: { tools: {} } }
);
// 声明所有工具
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [listAccountsTool, listHistoryTool, publishVideoTool, loginDouyinTool]
};
});
// 路由到具体 handler
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
switch (name) {
case 'list_accounts': return handleListAccounts(args);
case 'list_history': return handleListHistory(args);
case 'publish_video': return handlePublishVideo(args);
case 'login_douyin': return handleLoginDouyin(args);
default:
throw new Error(`未知工具: ${name}`);
}
});
// 启动 stdio 传输
const transport = new StdioServerTransport();
await server.connect(transport);
几个值得注意的点:
ListToolsRequestSchema handler 是 MCP Client 连接时的第一个请求,返回的是工具清单和每个工具的参数 schema。Claude 拿到这份清单后,就知道有哪些工具可以用、每个工具传什么参数。
每个工具的定义(listAccountsTool 这类变量)是一个带 name、description、inputSchema 的对象。description 写得越准确,AI 判断什么时候调哪个工具就越可靠——这比代码逻辑更重要。
handlePublishVideo 内部调的是 child_process.spawn,拉起 MatrixMedia CLI,读 exit code,把结果回传给 MCP Client。这样 MCP Server 本身是薄的,不重复发布逻辑,只做协议适配。
[图:publish_video handler 调用 CLI 的代码片段,展示 spawn + exit code 处理]
五、接入演示:以 Hermes Agent 为例,配置 + 全流程走一遍
Hermes Agent 是一个开源 AI Agent 框架,原生支持 MCP Server,配置一条命令搞定,用它来演示接入过程最直接。
第一步:构建 MCP Server
cd <MATRIXMEDIA_DIR>/mcp
npm install
npm run build
# 产物在 mcp/dist/index.js
第二步:把 matrixmedia 注册进 Hermes
hermes mcp add matrixmedia \
--command "node" \
--args "<MATRIXMEDIA_DIR>/mcp/dist/index.js" \
--env "MATRIXMEDIA_DIR=<MATRIXMEDIA_DIR>"
<MATRIXMEDIA_DIR> 换成你本机 MatrixMedia 的实际路径。注册完可以验一下:
hermes mcp list
# matrixmedia command: node ... ✓ connected
hermes mcp test matrixmedia
# 成功会列出 4 个工具:list_accounts / list_history / publish_video / login_douyin
第三步:直接在 Hermes 里说话
启动 Hermes,matrixmedia 工具自动可用:
hermes
然后:
"帮我查一下当前有哪些账号登录着"
Hermes 自动调 list_accounts,把账号列表直接打出来。
"把 /Users/xxx/video.mp4 发布到抖音,账号 138xxxx,标题是'今天分享个效率技巧',标签 #职场 #效率"
Hermes 调 publish_video,底层触发 Puppeteer,发布完成后告诉你结果。
Hermes 之外:其他支持 MCP 的工具同样可接
MCP 是开放协议,Cursor、Claude Desktop、Cline 等只要支持 stdio 传输的 MCP Client 都能用同一份配置接入。Hermes 这里演示的是最快的路径,配置格式参考 README 里附的 claude_desktop_config.json 示例。
六、顺带一提:小红书 CLI 也上了,现在是 7 个平台
这个版本同步上线了小红书的 CLI 支持。
当前 MatrixMedia 支持的平台:
| 平台 | CLI | MCP |
|---|---|---|
| 抖音 | ✅ | ✅ |
| 快手 | ✅ | ✅ |
| 百家号 | ✅ | ✅ |
| B站 | ✅ | ✅ |
| 头条 | ✅ | ✅ |
| 视频号 | ✅ | ✅ |
| 小红书 | ✅ | ✅ |
小红书上线的背景:小红书的图文 + 视频发布流程和其他平台差异比较大,Puppeteer 的处理方式需要单独写。这个版本完成了基础发布,正在补测试覆盖,如果你跑出了 bug 欢迎直接开 issue。
七、总结
这篇做的事情:
- 用 MCP Server 把 MatrixMedia 接进了 Hermes Agent(以及所有支持 MCP 的 AI 工具)
- 4 个工具,职责清楚:查账号 / 查历史 / 发布 / 登录抖音
- stdio 传输,本地运行,不需要起服务
- MCP Server 是薄适配层,底层还是 CLI,两套接口可以独立用
它解决的核心问题是:AI 流程里,内容生成之后的"发布"这一步,现在可以完全交给 AI 自动执行,不需要人坐在那等。
如果你也在用 AI 工具搭内容流程,或者正在做自己的 MCP Server,欢迎看看代码,有问题直接开 issue,中文优先。
代码对你有用的话,点个 Star,这是对开源项目最直接的支持。
字数统计:约 1800 字