
FastMCP server for Substack — publish Notes and posts, pull analytics, manage dr
io.github.adelaidasofia由 GitHub 账号 adelaidasofia 发布v0.1.0更新于 Oct 25, 2026
FastMCP server for Substack — publish Notes and posts, pull analytics, manage drafts, pluggable…
发布方自己的服务:posts.design
概览
一个本地 MCP 服务器,让助手使用浏览器会话 Cookie 发布 Substack Notes 和文章、管理草稿并获取出版物分析数据。
- 可以做什么
- 发布、回复和列出 Notes,支持附件,并可批量发布 vault 草稿;对文章点赞、restack 和评论,并读取订阅源和出版物列表;创建、编辑、定时和发布文章草稿,列出分区、草稿和已发布文章,并上传图片;读取仪表盘 KPI、单篇统计、订阅者增长与来源、热门文章、收入和推荐等分析数据,并可快照到 vault 文件;将 Obsidian 风格的 vault 草稿文件桥接到 Substack,并通过本地 Pillow 或 Canva 流程生成视觉卡片
- 适用场景
- 适合希望让助手起草、定时和发布文章与 Notes、回复订阅源内容,并查看订阅者和收入分析而无需切换到 Substack 后台的 Substack 作者。
- 运行要求
- 以本地 Python 进程运行(从仓库 pip 安装或使用打包插件)。需要 config.json,包含出版物子域名、默认出版物、可选的 vault 草稿路径和图片生成器设置。认证使用 SUBSTACK_SID_COOKIE 会话 Cookie,过期后需从浏览器开发者工具重新提取。Canva 图片生成需要连接 Canva MCP 并填写设计 ID。
安装
在 SourceWeft 中
- 打开 控制台中的 FastMCP server for Substack — publish Notes and posts, pull analytics, manage dr,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
substack-mcp
[License] [GitHub stars] [Last commit] [Open issues] [PyPI version] [PyPI downloads] [Built by Mycelium AI]
FastMCP server for Substack: publish Notes and posts, pull analytics, manage drafts, bridge Obsidian vault drafts to Substack, and generate visual cards with pluggable image generators.
Quick reference
Tool inventory (30)
Notes + vault pipeline
test_connection(publication?)-- verify auth, return your profilelist_publications()-- show configured publications and which is defaultpublish_note(text, publication?, attachment_ids?)-- publish a Note immediately; markdown supportedcreate_note_attachment(image_path?, image_url?, link_url?, publication?)-- upload image or register link; returns attachment UUID for use with publish_notelist_my_notes(limit?, publication?)-- your recent Notes with reaction + comment countsreply_to_note(note_id, text, publication?)-- reply to a Note by IDlist_vault_drafts()-- parse vault drafts file, return index + preview for each draftpublish_vault_draft(index, publication?, move_to_published?)-- publish one vault draft as a Notebatch_publish_vault_drafts(indices, publication?)-- publish multiple vault drafts in sequence
Post management
create_draft(title, body, subtitle?, audience?, publication?, section_id?)-- create a post draft; body is markdownupdate_draft(draft_id, title?, body?, subtitle?, audience?, publication?, section_id?)-- edit an existing draftpublish_post(draft_id, send_email?, audience?, publication?, section_id?)-- publish a draft live to subscribersschedule_post(draft_id, publish_at, publication?, section_id?)-- schedule a draft for future publication (ISO 8601)list_sections(publication?)-- list configured sections for a publication; required to publish on publications with sectionslist_drafts(limit?, publication?)-- list unpublished draftslist_published(limit?, publication?)-- list published posts with basic statsget_post(identifier, publication?)-- get full post by slug or numeric IDupload_image(image_path, publication?)-- upload an image to Substack CDN; returns CDN URLreact(post_id, publication?)-- heart a postrestack(post_id, publication?)-- restack a postcomment(post_id, body, publication?)-- comment on a postget_feed(limit?, publication?)-- your reader feed (posts from publications you follow)
Analytics
get_dashboard(days?, publication?)-- KPIs: total/paid subscribers, views, growth, ARRget_post_stats(post_id, publication?)-- views, opens, clicks, shares, conversions for one postget_subscriber_growth(publication?)-- subscriber count over timeget_growth_sources(publication?)-- subscriber growth by source (search, recommendations, direct, social)get_top_posts(limit?, publication?)-- posts ranked by engagementget_earnings(publication?)-- revenue data for paid publicationsget_recommendation_stats(direction?, publication?)-- recommendation network performancecapture_analytics_to_vault(publication?)-- write a weekly analytics snapshot to your vault
Install
Open Claude Code, paste:
Legacy install
Configuration
Copy config.example.json to config.json and fill in your values:
config.json is gitignored. Key fields:
Session cookie setup
Substack does not have a public API with OAuth. Auth uses your browser session cookie.
- Open Chrome and log in to Substack.
- Open DevTools (F12) and go to the Application tab.
- Under Cookies, find
substack.com. - Copy the value of
substack.sid. - Paste it into
config.jsonunder the matching publication'scookiefield.
The raw value works; the server accepts both abc123 and substack.sid=abc123.
Session cookies expire. If tools return {"error": "Auth failed"}, re-extract the cookie.
Register in Claude Code
Add to your .mcp.json (project-scoped) or via claude mcp add -s user:
Restart Claude Code after editing .mcp.json. Verify with claude mcp list.
Vault integration
Set vault_drafts_path in config.json to a markdown file in your Obsidian vault.
Format each draft as a section separated by ---. Sections under ## Ready to Post
are surfaced first by list_vault_drafts. Sections under ## Essay Seeds come next.
After publishing, publish_vault_draft moves the draft to a ## Published section
and appends the Substack URL and timestamp.
Pluggable image generators
Visual card generation is handled by the adapter set in config.json under
image_generator.default.
Shipped adapters
pillow_local (default) -- pure Pillow, no external API. Renders 1080x1080 PNG
cards locally using fonts from the fonts/ directory. Three pillar templates: warm
mustard with optional figure (P1), deep burgundy bold quote (P2), mustard with section
tag (P3). Use with render_card.py as a standalone CLI.
canva -- Canva MCP choreography. Returns a steps list describing the Canva MCP
tool calls needed to clone a template, replace text, replace the figure, and export PNG.
The Claude session executing the playbook follows these steps. Requires Canva MCP
connected in Claude Code and design IDs filled in under image_generator.canva.pillars.
Stubbed adapters (contributions welcome)
nano_banana -- Gemini 3 Pro Image via the nano-banana skill. Stub in
image_generators/nano_banana.py. Implement generate() by calling the skill's
image endpoint with a prompt built from the card spec.
midjourney -- Midjourney API (or proxy). Stub in image_generators/midjourney.py.
Implement generate() by submitting a prompt, polling for completion, and downloading
the result.
dalle -- OpenAI DALL-E. Stub in image_generators/dalle.py. Implement generate()
using openai.images.generate.
Writing your own adapter
Subclass ImageGenerator from image_generators.base:
Register it in image_generators/__init__.py and add a config block under
image_generator.my_adapter in config.json.
Visual publishing pipeline
The visual_helper.py script handles the deterministic side of the visual queue
pipeline: parsing a Review Queue markdown file, rotating through figures, and
marking entries published. See visual_playbook.md for the full end-to-end flow
including image generation, upload, and publishing steps.
Known gotchas
-
Cookie expiry.
substack.sidcookies expire after a few weeks. Re-extract from Chrome DevTools whentest_connectionreturns auth errors. -
draft_bylinesis required but undocumented.create_draftwill 400 without it. The server fetches youruser_idfrom/user/profile/selfautomatically and injects it into every draft POST. -
Note attachment endpoint requires trailing slash.
POST /comment/attachment/(with slash) works. Without slash it returns 404. The server handles this correctly. -
Publication-scoped vs global endpoints. Notes use
substack.com/api/v1/comment/feed/. Post drafts use{subdomain}.substack.com/api/v1/drafts. Mixing them returns 404 or 403. -
pledgedArrin the dashboard is a projection, not real pledges. Useget_earningsfor actual revenue data. -
Multi-publication support. Pass
publication="name"to any tool to target a specific publication. Omit it to usedefault_publicationfrom config. -
Sections are required to publish on publications that have them. Substack returns
HTTP 400: Please choose a sectionfrompublish_post/schedule_postwhen the draft hasn't been filed under a section. Look up section IDs withlist_sections(publication="main"), then passsection_id=<id>to either the draft tool or the publish/schedule tool:publish_post/schedule_postpatch the draft before publishing, so a single call is enough.
Related MCPs
Same author, same architecture pattern (FastMCP, draft+confirm on writes where applicable, vault auto-export, MIT):
- slack-mcp — multi-workspace Slack
- imessage-mcp — macOS iMessage
- whatsapp-mcp — WhatsApp via whatsmeow
- google-workspace-mcp — Gmail / Calendar / Drive / Docs / Sheets
- apollo-mcp — Apollo.io CRM + sequences
- luma-mcp — lu.ma events
- parse-mcp — markitdown / Docling / LlamaParse router
- rescuetime-mcp — RescueTime productivity data
- graph-query-mcp — vault knowledge graph queries
- graph-autotagger-mcp — wikilink suggestions from the graph
- investor-relations-mcp — seed-raise pipeline tracker
- vault-sync-mcp — bidirectional vault sync
Telemetry
This plugin sends a single anonymous install signal to myceliumai.co the first time it loads in a Claude Code session on a given machine.
What is sent:
- Plugin name (e.g.
slack-mcp) - Plugin version (e.g.
0.1.0)
What is NOT sent:
- No user identifiers, names, emails, tokens, or API keys
- No file paths, message content, or anything from your work
- No IP address is stored after dedup processing
Why: Helps the maintainer know which plugins people actually install, so attention goes to the ones that get used.
Opt out: Set the environment variable MYCELIUM_NO_PING=1 before launching Claude Code. The hook will skip the network call entirely. Already-pinged installs leave a sentinel at ~/.mycelium/onboarded-<plugin> — delete it if you want to reset state.
License
MIT
Built by Mycelium AI. Full install or team version at diazroa.com.
来源:README.md,提交 1d5c90f
工具
0版本历史
1- v0.1.0最新Sep 16, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分
其他 Posts 集成
posts.design
design.posts官方发布者
posts.design 提供的远程 MCP 端点,让助手为即将发布的帖子查找设计参考和视频拆解。

Weibo Hot Search (微博热搜): Trending Topics & Posts
由 GitHub 账号 serenido 发布
托管在 Apify 上的远程 MCP 服务器,让助手获取微博热搜实时榜单、热度变化以及可选的热门帖子。

Weibo: Posts, Hot Searches, Comments & Creators (微博)
由 GitHub 账号 serenido 发布
远程 Apify MCP 服务器,让助手无需登录即可采集微博热搜、关键词帖子、评论和创作者资料,并输出结构化 JSON。

Pay Transparency Rules for Job Posts
由 GitHub 账号 Nero-Engine 发布
让助手查询美国、加拿大和欧盟的薪酬透明法规,并在发布前检查职位是否合规。

LinkedIn Posts
由 GitHub 账号 saulius876-lgtm 发布
让助手从链接或公司页面获取 LinkedIn 帖子,包括正文、作者、日期、互动、热门评论和媒体。