写作与公文
需要把 Markdown 文章保存为 Substack…
当用户想把 Markdown 文件发布到 Substack,且已有浏览器自动化 MCP 并登录 Substack 时,用该流程把内容转为 HTML 粘贴为富文本并保存为草稿。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
需要把 Markdown 文章保存为 S特定
解决思路
- 解析 Substack publication subdomain:优先使用技能参数;否则检查环境变量 `SUBSTACK_PUBLICATION`;都没有则提示用户提供,例如 `verysmallwoods.substack.com` 中的 `verysmallwoods`;未解析前不得导航。
- 选择浏览器自动化 MCP:默认优先 Playwright MCP;仅当 Playwright 不可用时使用 Chrome DevTools MCP;运行时优先 `mcp__playwright__browser_navigate`,不可用再回退 `mcp__chrome-devtools__navigate_page`。
- 按映射使用两种 MCP 工具:导航 Chrome DevTools `navigate_page` / Playwright `browser_navigate`;快照 `take_snapshot` / `browser_snapshot`;截图 `take_screenshot` / `browser_take_screenshot`;点击 `click` / `browser_click`;填文本 `fill` / `browser_type`;上传文件 `upload_file` / `browser_file_upload`;按键 `press_key` / `browser_press_key`;执行 JS `evaluate_script` / `browser_evaluate`。
- 使用关键 URL:Substack dashboard 为 `https://{publication}.substack.com/publish`;帖子编辑器为 `https://{publication}.substack.com/publish/post/{postId}`。
- 识别 Substack 编辑器关键元素:标题输入 `textbox "title"`,副标题输入 `textbox "Add a subtitle…"`,内容区 `.ProseMirror`,保存状态 `button "Saved"`,预览按钮 `button "Preview"`,继续按钮 `button "Continue"`(不要使用),设置按钮 `button "Settings"`。
- 识别编辑器其他元素:退出按钮 `button "Exit"`,图片按钮 `button "Image"`,图片菜单项 `menuitem "Image"`,作者/出版物选择器 `button "{PublicationName}"`。
- 编辑器工具栏包含 Bold、Italic、Strikethrough、Code、Link、Image、Audio、Video、Quote、Lists(bullet/ordered)、Button、More(Code block、Divider、Footnote、LaTeX 等)。
- 打开 Settings 或 File Settings 侧栏时:标题用 `textbox "Add a title..."`,描述用 `textbox "Add a description..."`,缩略图用上传按钮(3:2 比例)。
- 内容插入必须用剪贴板粘贴 HTML,不要用 `fill`,也不要直接粘贴纯 Markdown;Tiptap 只对 HTML 粘贴按富文本渲染。
- 表格预处理第 1 步:检测 Markdown 文件中的表格(由含 `|` 的行形成表格结构)。Substack 不支持 HTML 表格,表格会塌成纯文本,必须转为 PNG 图片后单独上传。
- 表格预处理第 2 步:把每个表格提取到临时文件,例如 `/tmp/table1.md`,再用 diagram-to-image skill 转图:`node ~/.claude/skills/diagram-to-image/scripts/diagram-to-image.mjs /tmp/table1.md -o /tmp/table1.png`。
- 表格预处理第 3 步:记录每个表格在文章中的插入位置(例如在哪个标题或段落后)。
- 表格预处理第 4 步:在 HTML 转换前从 Markdown 内容中删除表格 Markdown,避免它以纯文本形式被粘贴。
- 准备内容:读取 Markdown 文件;从 YAML frontmatter 的 `title` 字段、H1 标题 `# Title` 或文件名提取标题;从 YAML frontmatter 的 `excerpt` 或 `description` 字段提取副标题;取完整 Markdown 正文。
- 准备内容时剥离 YAML frontmatter,并按文章需要剥离交叉引用链接(例如英文版本链接)。
- 转换 Markdown 到 HTML:使用 Python `markdown` 库,扩展使用 `['tables', 'fenced_code']`;剥离 YAML frontmatter;按需剥离交叉引用链接;把 HTML 写入 `/tmp/substack_article.html`。
- 不要使用 `nl2br` 扩展,否则单换行会变成 `<br>`,在编辑器中产生多余换行。
- 导航到 Substack:访问 `https://{publication}.substack.com/publish`;如果未登录,提示用户先登录,例如「请先登录 Substack,登录完成后告诉我。」
- 创建新帖子:从 dashboard 点击 `Create new`,选择 `Text post`,或直接导航到新帖 URL;如果编辑器已打开空帖,则直接继续。
- 填写标题和副标题:点击 `textbox "title"` 并输入文章标题;点击 `textbox "Add a subtitle…"` 并输入副标题或摘要。
- 把 HTML 复制到系统剪贴板:运行 `python3 /path/to/copy_to_clipboard.py html --file /tmp/substack_article.html`。
- 点击编辑器内容区 `.ProseMirror` 或其中的段落元素,然后按 `Meta+v`(macOS)或 `Control+v`(Windows/Linux)粘贴,触发 Tiptap 的 HTML 粘贴处理。
- 插入表格图片:把光标点击到表格应出现的段落或空行;点击 `button "Image"` 打开下拉;点击 `menuitem "Image"` 打开文件选择器;用 Playwright MCP 的 `browser_file_upload` 或 Chrome DevTools MCP 的 `upload_file` 上传图片。
- 插入表格图片注意:Playwright MCP 只允许从 allowed roots(项目目录)上传文件;如果图片在 `/tmp/`,先复制到项目目录;每个表格重复定位和上传。
- 插入表格图片前若表格内容已被粘贴成纯文本:三击选择该段落,按 Backspace 删除,再插入表格图片。
- 验证草稿:检查 `button "Saved"` 保存状态(绿点 + `Saved`);take snapshot 验证内容结构;可选 take screenshot 做视觉验证;编辑器自动保存,无需显式保存。
- 报告完成:告知用户草稿已保存到 Substack,请用户预览并手动发布;提供帖子 URL:`https://{publication}.substack.com/publish/post/{postId}`。
- 关键规则:绝不点击 `Continue`,因为它会启动发布流程;只保存草稿,自动保存会处理。
- 关键规则:始终先把 Markdown 转成 HTML;用剪贴板粘贴;检查登录状态;不修改原始 Markdown 文件;完成后报告需人工审核。
- 关键规则:表格必须转图片;注意 Playwright 文件上传路径限制;先解析 publication,不硬编码 subdomain;优先 Playwright MCP。
- 故障处理:如果内容显示为纯文本或原始 HTML 标签,原因是用 `fill` 工具而非剪贴板粘贴;改用 `copy_to_clipboard.py` + `Cmd+V` 方法。
- 故障处理:如果表格不渲染而显示纯文本,转为 PNG 并上传为图片;简单表格也可重构为格式化列表;若纯文本已粘贴,三击删除该段落后再插入表格图片。
- 故障处理:如果页面要求登录,提示 `请先登录 Substack: https://{publication}.substack.com`,登录完成后继续。
- 故障处理:如果编辑器未加载,等待页面完全加载,重新 take snapshot;仍不加载则刷新页面。
- 故障处理:如果剪贴板复制失败,确保依赖 `pip install pyobjc-framework-Cocoa`(macOS),检查 HTML 文件存在且可读,或先复制较小测试字符串。
- 格式支持:标题 H2-H6 支持,H1 不推荐(标题单独填写);粗体、斜体、行内代码、代码块、链接、引用、无序列表、有序列表、水平线支持;表格不支持需转图片;图片通过 Image 工具栏按钮手动上传。
- 内容转换管道:Markdown 文件 → Python `markdown` 库 → HTML 字符串 → `copy_to_clipboard.py` → 系统剪贴板(text/html + text/plain)→ `Cmd+V` → Tiptap ProseMirror 编辑器 → 自动保存 → Substack 草稿。
适用边界 · 注意事项
- 没有可用的浏览器自动化 MCP(Playwright MCP 或 Chrome DevTools MCP),或用户未登录 Substack 时,不适用。
- 无法提供或解析 Substack publication subdomain 时,不适用;该流程不能硬编码默认 publication。
- 文章包含 Substack 不支持的 HTML 表格,且不接受把表格转成 PNG 图片或格式化列表时,不适用;该流程也只保存草稿,不自动发布。