minanagehsalalma/medium-editor-mcp

GitHub: minanagehsalalma/medium-editor-mcp

一个面向 Medium 编辑器的 MCP 服务器,通过 GraphQL 重放和 legacy delta 编辑器路径实现草稿创建、内容修复与自动化发布。

Stars: 0 | Forks: 0

# Medium Editor MCP

Medium Editor MCP hero card

面向 Medium 实际编辑器界面的 Research-first MCP:包括 GraphQL 发现、legacy delta 写入、会话诊断、文章修复以及 Gist 到草稿的工作流。

CI Node 18+ TypeScript 5.x CycleTLS plus Axios GraphQL and legacy delta editor MIT

为什么创建此仓库 · 快速开始 · 安装 · 架构 · 工具图谱 · 研究笔记 · 内容工作流

## 为什么创建此仓库 大多数 Medium 自动化仓库都以以下两种愚蠢的方式走向消亡: - 假装已归档的公开 API 仍然覆盖编辑器 - 对于所有操作都退而求其次,使用脆弱的浏览器脚本 本仓库选择了一条更艰难但正确的路线: - 映射 Medium 目前仍在使用的活跃 GraphQL 接口 - 通过仍为草稿提供支持的 legacy delta 编辑器撰写文章正文 - 在将 mutation 失败误归咎于业务逻辑原因之前,先验证 session 和 transport 的健康状况 - 将这些研究转化为可复用的 MCP 工具,而不是一次性的脚本 这使得它对于研究以及生产环境中的草稿工作流都非常实用。 ## 你实际可以做什么 - 创建并修复真正的 Medium 草稿,而无需将所有内容通过浏览器 DOM 进行路由 - 使用基于 cookie 的 session 发现并重放活跃的 GraphQL 操作 - 通过经过验证的编辑器路径写入标题、副标题、链接、列表、代码块、图像和正文内容 - 在发布前审核并优化草稿的打包 - 使用专门的工具克隆、替换、修复、删除和恢复 Medium 文章 - 导入 GitHub gist 和 GitHub 仓库,并将其转化为更整洁的 Medium 草稿 ## 快速开始 ``` npm install npm run build npm test -- --runInBand ``` 从模板创建一个 `.env` 文件: ``` copy .env.example .env ``` 然后使用以下任一支持的 cookie 格式引导启动 Medium session: - 浏览器导出的 JSON 数组 - 包含 `cookies` 数组的封装 JSON - 原始 `Cookie:` header - Netscape cookie 文件 推荐首次运行的工具顺序: 1. `setup-medium-session` 2. `doctor-medium-mcp` 3. `test-medium-write-path` ## 在 Clients 中安装 本仓库的核心在于它可以干净利落地挂载到 MCP client 中,而不仅仅是作为代码来研究。 从这里开始: - [在 Codex 及其他 MCP clients 中安装](docs/installing-in-clients.md) 包含的示例: - [`examples/clients/codex.config.toml`](examples/clients/codex.config.toml) - [`examples/clients/vscode.mcp.json`](examples/clients/vscode.mcp.json) - [`examples/clients/cursor.mcp.json`](examples/clients/cursor.mcp.json) ## 架构 ``` flowchart LR A[Medium session
sid + uid + xsrf] --> B[Session setup + doctor] B --> C{Surface selection} C --> D[GraphQL replay
settings, publish, metadata] C --> E[Legacy delta editor
body writing, image blocks, repairs] C --> F[Browser validation
fallback only] G[Gist / markdown / source notes] --> H[Draft audit + optimization] H --> E D --> I[Post workflows] E --> I F --> I I --> J[Draft, publish, repair,
replace, delete, restore] ``` ## 工具图谱 | 层级 | 涵盖内容 | 主要工具 | | --- | --- | --- | | Session | Cookie 解析、脱敏、诊断、transport 健康 | `setup-medium-session`, `inspect-medium-session-config`, `doctor-medium-mcp`, `probe-medium-session` | | GraphQL | 发现、重放、操作捕获、实时 metadata/发布工作流 | `discover-medium-graphql`, `capture-medium-graphql-operations`, `medium-graphql-request`, `run-medium-graphql-operation` | | Legacy 编辑器 | 实际的正文写入和基于 delta 的文章修复 | `create-medium-legacy-draft`, `apply-medium-legacy-deltas`, `write-medium-rich-draft`, `create-medium-rich-draft` | | 内容 pipeline | Gist 导入、GitHub 仓库导入、草稿审核、打包优化、文章重构 | `import-gist`, `prepare-gist-draft`, `import-github-repo`, `prepare-github-repo-draft`, `audit-medium-draft`, `optimize-medium-draft-package`, `optimize-medium-article-draft` | | 文章操作 | 检查、可见性修复、分享密钥、克隆/替换、删除/恢复 | `inspect-medium-post-state`, `optimize-medium-post`, `optimize-medium-visibility`, `create-medium-share-key`, `delete-medium-post`, `undelete-medium-post` | ## 基于研究的界面 ``` flowchart TD A[Archived REST API] --> A1[Profile lookup] A --> A2[Publication lookup] A --> A3[Create-post only] B[Private GraphQL] --> B1[Settings] B --> B2[SEO + tags + canonical] B --> B3[Share keys] B --> B4[Publish flow] B --> B5[Delete / undelete] C[Legacy delta editor] --> C1[Title and subtitle paragraphs] C --> C2[Body paragraphs] C --> C3[Lists and code blocks] C --> C4[Image blocks] C --> C5[In-place body repair] ``` ## 快速验证 ### 1. Session 与健康状态 你不需要去猜测环境是否损坏。 - `inspect-medium-session-config` 显示处于活跃状态的 cookie 源(值已脱敏) - `doctor-medium-mcp` 检查 session 加载、探测、transport、registry 和工作流覆盖率 - `test-medium-write-path` 创建一个一次性草稿并验证正文的往返测试 ### 2. 文章正文写入 写入路径并非只是表面功夫。它负责处理真正的 Medium 特定格式决策: - 标题和副标题放入正确的 Medium 段落类型中 - 内联链接保持可点击状态 - 在可获取的情况下,gist 图像可以被拉取到正文中 - 简单的 Markdown 表格会被转换为 Medium 安全的可读块 - 本地图像可以作为实际的 Medium 图像段落进行上传 ### 3. 文章修复 文章工作流层源自修复真正损坏的文章,而不是玩具示例: - imported-date 锁定处理 - metadata 漂移修复 - 过期的副标题修复 - 克隆替换文章 - 可见性修复 - 删除与恢复 ## 示例工作流 ``` gist or repo -> normalize source -> audit draft -> optimize package -> write legacy body -> apply GraphQL metadata -> verify public state -> publish or repair ``` 这种分离正是核心所在:为正确的任务使用正确的 Medium 界面。 ## 仓库布局 ``` src/ medium-session*.ts cookie parsing, setup, doctor, diagnostics medium-graphql*.ts GraphQL replay and discovery medium-legacy-editor.ts delta editor and upload paths medium-rich-draft.ts markdown -> Medium paragraph writer medium-post-workflows.ts post inspection, repair, clone, replace, delete gist.ts gist import and Medium-oriented draft prep github-repo.ts GitHub repository import and Medium-oriented draft prep medium-*-optimizer.ts package and article optimization docs/ medium-editor-research.md observed editor behavior and boundaries content-workflows.md draft and publishing workflows repo-scope.md scope guardrails ``` ## 公开准则 本仓库对于它**不**声称能做到的事情有着刻意的严格要求: - 它不假装已归档的 Medium REST API 能提供与编辑器完全对等的功能 - 它不毫无证据地捏造私有 mutation 契约 - 当存在直接交互的界面时,它不将浏览器自动化作为主要架构 - 它不隐瞒 Cloudflare、session 过期或账户状态仍然可能阻碍流程的事实 ## 文档 - [docs/medium-editor-research.md](docs/medium-editor-research.md) - [docs/content-workflows.md](docs/content-workflows.md) - [docs/installing-in-clients.md](docs/installing-in-clients.md) - [docs/repo-scope.md](docs/repo-scope.md) - [docs/CHANGELOG.md](docs/CHANGELOG.md) - [.github/CONTRIBUTING.md](.github/CONTRIBUTING.md) - [.github/SECURITY.md](.github/SECURITY.md) ## 来源 - Medium 已归档 API 文档:https://github.com/Medium/medium-api-docs - GitHub Gist REST 文档:https://docs.github.com/en/rest/gists/gists
标签:API集成, GraphQL, MCP, Medium, MITM代理, TypeScript, 内容创作, 可观测性, 安全插件, 自动化攻击