关于 Substack by Cotlet
Substack by Cotlet 是面向技术用户的自托管 Python API 和 MCP 服务,用于管理 Substack 出版物。它使用已登录的 Chrome 会话,并同时提供 REST、Python 和 MCP 接口。
主要功能
- 01管理帖子、草稿、Notes 和评论
- 02定时发布帖子和 Notes
- 03访问订阅者和出版物统计
- 04通过 Chrome 会话 Cookie 连接
- 05支持 MCP、REST API 和 Python
适用场景
- 01从 Markdown 创建草稿并安排发布时间
- 02查看尚未回复的评论
- 03导出订阅者名单
- 04生成订阅、收入和帖子活动报告
MCP 相关
通过 stdio 或可流式传输的 HTTP,向 MCP 客户端提供 Substack 出版物及读者操作工具。只读、发布和消息操作提示可帮助客户端在执行重要操作前请求确认。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://cotlet.dev/mcp/v1/substack/connectclaude mcp add --transport http dev-cotlet-substack https://cotlet.dev/mcp/v1/substack/connect{"mcpServers":{"dev-cotlet-substack":{"type":"http","url":"https://cotlet.dev/mcp/v1/substack/connect"}}}在 Cursor 中打开{"servers":{"dev-cotlet-substack":{"type":"http","url":"https://cotlet.dev/mcp/v1/substack/connect"}}}在 VS Code 中打开{"mcpServers":{"dev-cotlet-substack":{"type":"http","url":"https://cotlet.dev/mcp/v1/substack/connect"}}}{"mcpServers":{"dev-cotlet-substack":{"serverUrl":"https://cotlet.dev/mcp/v1/substack/connect"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
https://cotlet.dev/mcp/v1/substack/connecthttps://cotlet.dev/mcp/v1/substack需要授权工具
详细介绍
Substack API 和 MCP 服务,可自托管
一个 Substack API 和 Substack MCP 服务,使用 Python 在你自己的电脑上运行,并使用你自己的 Google Chrome 会话。包含我们在 Cotlet 生产环境中运行的全部 50 个 Substack 工具:通过 Markdown 创建文章和草稿、发布和安排发布、Notes、评论、订阅者、统计数据、推荐和私信。
Substack 没有用于撰写文章、发布 Notes 或管理订阅者的公共 API,也没有官方 MCP 服务。本仓库提供这两者:
- MCP 服务,适用于 Claude Code、Claude Desktop、Cursor、Codex 和任何 MCP 客户端,可通过 stdio 或 HTTP 使用。设置
- REST API,地址为
http://127.0.0.1:8787/api/v1/substack,OpenAPI 文档位于/docs。设置 - Python:
call("list_posts", status="draft"),以及examples/中 14 个现成脚本。
本项目面向希望自行运行的技术人员,仅限非商业用途(许可证)。如果你希望在服务器上让它全天候运行,在 Substack 更改网站后仍保持可用,或供团队或企业使用,请使用 cotlet.dev 上的托管版本。
git clone https://github.com/cotletdev/substack-api-mcp-server.git && cd substack-api-mcp-server
python3 -m venv .venv && . .venv/bin/activate && pip install -e .
substack-mcp connect # reads your Substack session from Chrome
substack-mcp call list_posts
claude mcp add substack -- "$PWD/.venv/bin/substack-mcp" mcp
目录
- 工作原理
- 要求
- 安装
- 连接你的 Chrome
- MCP 服务
- REST API
- Python 和示例脚本
- 全部 50 个工具
- 配置
- 安全性和你的 Substack 账号
- 错误
- 自托管或托管服务
- 常见问题
- 许可证
工作原理
AI agent (MCP) / script (REST, Python) ──▶ substack-mcp on your computer ──your Substack cookies──▶ substack.com
▲
substack-mcp connect ───────┘ reads them once from your Chrome (DevTools Protocol)
- 像往常一样,在你自己的 Chrome 中登录 Substack。
substack-mcp connect通过 Chrome DevTools Protocol 连接到该 Chrome,读取 substack.com Cookie,并将其保存到~/.config/substack-api-mcp/session.json,仅你的用户可以读取。Substack 通过发送到邮箱的验证码或链接进行登录,因此无需查看或存储密码。- 每次工具调用都会使用这些 Cookie 向 Substack 自己的 Web 应用端点发送请求(读者端为
substack.com/api/v1,你的出版物控制面板为yourname.substack.com/api/v1),并通过 curl_cffi 发送请求,以复制 Chrome 的 TLS 指纹。不会运行无头浏览器。
Substack 的会话 Cookie(substack.sid)有效期约为三个月。当 Substack 将你登出时,如果 Chrome 已开启远程调试,服务会再次从 Chrome 读取 Cookie。
要求
- Python 3.11 或更高版本。
- Google Chrome 144 或更高版本,并已登录 Substack。任何启用了调试端口的 Chrome 或 Chromium 均可使用。
- macOS、Linux 或 Windows。
- 一个 Substack 账号。出版者工具(文章、订阅者、统计数据、评论)适用于你的账号担任管理员、所有者、编辑或投稿者的第一个出版物。读者工具(动态、搜索、Notes、消息)适用于任何账号。
安装
git clone https://github.com/cotletdev/substack-api-mcp-server.git
cd substack-api-mcp-server
python3 -m venv .venv
. .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .
substack-mcp --version
使用 uv:运行 uv venv && uv pip install -e .,然后运行 uv run substack-mcp ...。
要使用 AI Agent(Claude Code、Codex、Cursor)设置本项目?在此文件夹中打开它,并让它设置仓库:AGENTS.md 会告知它每个步骤,而它只会要求你在 Chrome 中执行相关步骤。
更新:运行 git pull && pip install -e .。我们会将托管版 Substack 工具的每项更改都同步到此仓库。
连接你的 Chrome
选项 A:日常使用的 Chrome(推荐)
-
在 Chrome 中打开
chrome://inspect/#remote-debugging,然后开启远程调试。Chrome 随后会接受这台计算机上的程序发起的 DevTools 连接,并在每次连接前询问你。 -
确保你已登录 substack.com。
-
运行:
substack-mcp connect -
Chrome 会询问是否允许连接。点击允许。
Saved 19 Substack cookies to /Users/you/.config/substack-api-mcp/session.json
Signed in to Substack as Maya Chen (@mayachen)
之后,你可以再次关闭远程调试。如果你希望 Substack 将你登出后,服务能自行获取新会话,请保持此功能开启。
connect 会在 Chrome 默认的配置文件夹中查找 DevToolsActivePort 文件。对于 Chrome Beta、Canary 或自定义配置文件夹,请传入 --profile-dir "<folder>"。
选项 B:使用开放调试端口的 Chrome
Chrome 不会在默认配置文件中开放调试端口,因此请启动一个单独的 Chrome,在其中登录 Substack 一次,然后连接到它:
# macOS
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222 --user-data-dir="$HOME/.chrome-substack"
# Linux
google-chrome --remote-debugging-port=9222 --user-data-dir="$HOME/.chrome-substack"
# Windows
"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222 --user-data-dir="%USERPROFILE%\.chrome-substack"
substack-mcp connect --cdp http://127.0.0.1:9222
--cdp 也接受 ws:// DevTools URL,例如通过 SSH 隧道连接到另一台计算机上的 Chrome 时使用的 URL。
选项 C:手动粘贴 Cookie
对于没有 Chrome 的服务:在 Chrome 中打开 substack.com 的 DevTools,选择**应用 > Cookie > https://substack.com**,复制 substack.sid 的值,然后:
substack-mcp connect --token # paste it, input is hidden
# or, without a session file:
export SUBSTACK_AUTH_TOKEN=...
粘贴的令牌不会自动刷新。Substack 将你登出后,请粘贴新的令牌。
随时检查会话:
substack-mcp status
MCP 服务
MCP 服务会列出每个工具及其输入架构、面向 Agent 编写的说明和提示:读取工具会标记为只读,发布、发送消息或删除内容的工具也会标记出来,以便客户端在执行前征求你的同意。
Claude Code
claude mcp add substack -- /path/to/substack-api-mcp-server/.venv/bin/substack-mcp mcp
# read only:
claude mcp add substack -- /path/to/substack-api-mcp-server/.venv/bin/substack-mcp mcp --read-only
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json(macOS)或 %APPDATA%\Claude\claude_desktop_config.json(Windows):
{
"mcpServers": {
"substack": {
"command": "/path/to/substack-api-mcp-server/.venv/bin/substack-mcp",
"args": ["mcp"]
}
}
}
Cursor
~/.cursor/mcp.json,配置块与 Claude Desktop 相同。可直接使用的副本位于 mcp.json。
Codex
~/.codex/config.toml:
[mcp_servers.substack]
command = "/path/to/substack-api-mcp-server/.venv/bin/substack-mcp"
args = ["mcp"]
通过 HTTP
substack-mcp serve 也会通过可流式传输的 HTTP 在 http://127.0.0.1:8787/mcp 提供 MCP 服务,适用于接受 URL 的客户端:
substack-mcp serve
claude mcp add --transport http substack http://127.0.0.1:8787/mcp
然后可以向你的 Agent 提出这类请求:
将 essay.md 改写成一篇面向所有人的草稿,并安排在纽约时间周二 8:00 发布。发布后,发一条带有链接卡片的 Note。
找出我最近三篇帖子中尚未回复的评论,并为每条评论拟一段简短回复。
上周的数据:新增订阅者和付费订阅者、取消订阅数、收入,以及每篇帖子的打开次数。
过去 30 天,我的读者都来自哪里?
REST API
substack-mcp serve # http://127.0.0.1:8787, MCP at /mcp, docs at /docs
每个工具在 /api/v1/substack 下都有自己的路由,路径与托管 API cotlet.dev 上的相同,因此针对其中一个 API 编写的代码也适用于另一个。路径部分和查询字符串是参数,JSON 请求体则可提供其余参数。
curl 'http://127.0.0.1:8787/api/v1/substack/posts?status=scheduled'
curl 'http://127.0.0.1:8787/api/v1/substack/stats?period=30d'
curl -X POST http://127.0.0.1:8787/api/v1/substack/drafts \
-H 'Content-Type: application/json' \
-d '{"title": "Notes on pricing", "body_markdown": "## Why I raised prices\n\nThree reasons..."}'
按名称调用任意工具,并将请求体作为其参数:
curl -X POST http://127.0.0.1:8787/api/v1/substack/tools/list_comments -d '{"post_id": "148213977"}'
GET /api/v1/substack/tools:列出每个工具及其路由、输入架构和示例回答。GET /docs:交互式 OpenAPI 文档;GET /openapi.json提供架构,适用于 n8n、Postman 或生成的客户端。- 回答均为 JSON。列表会返回
next_cursor;将其作为cursor传回即可获取下一页。
服务仅侦听 127.0.0.1。若要从你的其他设备访问,请设置令牌,然后每个请求都需要包含 Authorization: Bearer <token>:
SUBSTACK_MCP_TOKEN=$(openssl rand -hex 24) substack-mcp serve --host 0.0.0.0
Python 和示例脚本
直接使用 Python,无需服务端:
from substack_api_mcp import call
from substack_api_mcp.scripting import paginate, write_rows
posts = list(paginate("list_posts", {"status": "published"}, "posts"))
write_rows(posts, "posts.csv")
draft = call("create_draft", title="Notes on pricing", body_markdown="Three reasons...")
call("schedule_post", post_id=draft["post_id"], publish_at="2026-11-03T08:00:00-05:00")
或者通过 shell 调用一个工具:substack-mcp call get_post_stats post_id=148213977,也可以使用 JSON 对象。
可直接使用的脚本位于 examples/。每个脚本都会输出 JSON,在适用时接受 --out file.csv 或 --out file.json,并支持 --help:
| 脚本 | 功能 |
|---|---|
draft_from_markdown.py | 将 .md 文件转换为草稿:第一个标题会作为文章标题,并保留标题、链接和列表。--publish-at 可设置发布时间。 |
schedule_post.py | 将草稿安排在指定时间发布,或使用 --cancel 将其改回草稿。 |
publish_note.py | 立即发布 Note 或安排在指定时间发布;--link-latest 会为最新文章添加链接卡片。 |
list_posts.py | 列出已发布、草稿或已安排的文章:标题、受众、日期和 URL。 |
get_post.py | 将一篇文章保存为 Markdown 文件。 |
weekly_report.py | 新增和付费订阅者、取消订阅、收入,以及每篇新文章的打开次数和新增订阅者。 |
post_stats.py | 最近 N 篇文章的打开次数、打开率、浏览量、点赞、转发和新增订阅者。 |
daily_stats.py | 按天统计订阅者、付费订阅者、关注者和浏览量。 |
traffic_sources.py | 查看访客来源,按浏览量从高到低排列。 |
unanswered_comments.py | 列出最近 N 篇文章中你尚未回复的评论。 |
reply_to_comment.py | 在某条评论下回复。 |
list_subscribers.py | 按套餐或加入日期列出订阅者,并显示活跃度评级。 |
export_subscribers.py | 导出完整列表,格式与控制面板中的 CSV 导出相同。 |
add_subscribers.py | 在征得你同意后,将文本或 CSV 文件中的电子邮件地址添加为免费订阅者。 |
python examples/draft_from_markdown.py essay.md --publish-at 2026-11-03T08:00:00-05:00
python examples/unanswered_comments.py --last 3 --out todo.csv
按计划运行时,只要自己的电脑处于开机状态,就可以使用 cron:0 8 * * 1 cd ~/substack-api-mcp-server && .venv/bin/python examples/weekly_report.py。
全部 50 个工具
post_id 来自 list_posts,comment_id 来自 list_comments。运行 substack-mcp tools 可打印此列表,运行 substack-mcp tools --json 还会显示输入架构。
文章和草稿
| 工具 | 访问权限 | REST 路由 | 功能 |
|---|---|---|---|
list_posts | 读取 | GET /posts | 按时间从新到旧列出你的出版物文章,并显示状态和受众。 |
get_post | 读取 | GET /posts/{post_id} | 完整文章信息:标题、副标题、Markdown 正文、受众、URL 和日期。 |
create_draft | 写入 | POST /drafts | 根据 Markdown 创建新草稿。在你发布或安排发布之前,不会发送任何内容。 |
update_draft | 写入 | PATCH /drafts/{post_id} | 修改草稿的标题、副标题、正文或受众。 |
duplicate_post | 写入 | POST /posts/{post_id}/duplicate | 将任意文章复制为新草稿。 |
delete_post | 写入 | DELETE /posts/{post_id} | 删除草稿、已安排或已发布的文章及其评论。 |
发布
| 工具 | 访问权限 | REST 路由 | 功能 |
|---|---|---|---|
publish_post | 写入 | POST /posts/{post_id}/publish | 立即发布草稿。 |
schedule_post | 写入 | PUT /posts/{post_id}/schedule | 将草稿安排在指定时间通过网站和电子邮件发布。 |
cancel_scheduled_post | 写入 | DELETE /posts/{post_id}/schedule | 取消已安排的文章发布;文章会保留为草稿。 |
unpublish_post | 写入 | DELETE /posts/{post_id}/publish | 将已发布的文章从网站撤下并改回草稿。 |
分区和文章标签
| 工具 | 访问权限 | REST 路由 | 功能说明 |
|---|---|---|---|
list_sections | 读取 | GET /sections | 查看出版物的分区,即其中独立的新闻简报。 |
list_post_tags | 读取 | GET /post-tags | 查看出版物用于归类文章的标签。 |
create_post_tag | 写入 | POST /post-tags | 创建用于归类文章的新标签。 |
tag_post | 写入 | PUT /posts/{post_id}/tags/{tag_id} | 为文章添加或移除标签。 |
评论
| 工具 | 访问权限 | REST 路由 | 功能说明 |
|---|---|---|---|
list_comments | 读取 | GET /posts/{post_id}/comments | 查看文章评论,包括作者、文本以及你是否已回复。 |
reply_to_comment | 写入 | POST /comments/{comment_id}/replies | 以你的身份回复文章下的评论。 |
pin_comment | 写入 | PUT /comments/{comment_id}/pin | 将评论置顶到文章评论区顶部,或取消置顶。 |
like_comment | 写入 | PUT /comments/{comment_id}/like | 以你的身份点赞或取消点赞评论或 Note。 |
remove_comment | 写入 | POST /comments/{comment_id}/remove | 以出版物版主的身份,从文章中移除他人的评论。 |
delete_comment | 写入 | DELETE /comments/{comment_id} | 删除你自己的评论、Note 或 Note 回复。 |
Notes
| 工具 | 访问权限 | REST 路由 | 功能说明 |
|---|---|---|---|
list_notes | 读取 | GET /notes | 按时间从近到远查看你或其他 Substack 用户发布的 Note,以及点赞和回复。 |
list_note_replies | 读取 | GET /notes/{note_id}/replies | 查看 Note 下的回复,包括作者、文本和点赞。 |
publish_note | 写入 | POST /notes | 立即或在指定时间发布 Substack Notes 短帖,还可选择添加指向你某篇文章的链接卡片。 |
reply_to_note | 写入 | POST /notes/{note_id}/replies | 以你的身份回复任何 Note 或 Note 回复。 |
订阅者
| 工具 | 访问权限 | REST 路由 | 功能说明 |
|---|---|---|---|
list_subscribers | 读取 | GET /subscribers | 查看订阅者及其套餐、开始日期和活跃度评级。 |
add_subscriber | 写入 | POST /subscribers | 将一个邮箱地址作为免费订阅者添加到列表中。 |
remove_subscriber | 写入 | DELETE /subscribers/{email} | 从订阅者列表中移除一个邮箱地址。 |
export_subscribers | 读取 | GET /subscribers/export | 获取完整订阅者列表的 CSV 下载链接及行数。 |
list_subscriber_tags | 读取 | GET /subscriber-tags | 查看用于归类订阅者的标签。 |
create_subscriber_tag | 写入 | POST /subscriber-tags | 创建用于归类订阅者的私有标签。 |
tag_subscribers | 写入 | POST /subscriber-tags/{tag_id}/subscribers | 按邮箱地址为订阅者添加或移除标签。 |
统计数据
| 工具 | 访问权限 | REST 路由 | 功能说明 |
|---|---|---|---|
get_publication_stats | 读取 | GET /stats | 查看某个时段的订阅者总数和付费订阅者数量、新增订阅者、付费订阅取消数及预估收入。 |
get_daily_stats | 读取 | GET /stats/daily | 按日查看订阅者总数、付费订阅者数量、关注者数量和浏览量。 |
get_audience_insights | 读取 | GET /audience | 查看订阅者所在地区,以及与读者群体重合的出版物。 |
list_traffic_sources | 读取 | GET /traffic-sources | 按浏览量从高到低查看某个时段内访问者的来源。 |
get_post_stats | 读取 | GET /posts/{post_id}/stats | 查看收件人数、打开次数、打开率、浏览量、点赞数、转发数以及新增订阅者数。 |
get_post_traffic | 读取 | GET /posts/{post_id}/traffic | 查看文章读者的来源,包括来源渠道、类别和设备。 |
get_post_engagement | 读取 | GET /posts/{post_id}/engagement | 查看点赞和评论文章的用户,以及文章带来的新增和流失订阅者。 |
推荐
| 工具 | 访问权限 | REST 路由 | 功能说明 |
|---|---|---|---|
list_recommendations | 读取 | GET /recommendations | 你推荐的出版物,或推荐了你的出版物,以及各自带来的订阅者数量。 |
recommend_publication | 写入 | PUT /recommendations/{publication_id} | 向读者推荐其他出版物,或停止推荐该出版物。 |
读者、动态和消息
| 工具 | 访问权限 | REST 路由 | 功能说明 |
|---|---|---|---|
get_feed | 读取 | GET /feed | 你的 Substack 首页动态:帖子和 Notes,可选择「为你推荐」或「关注」。 |
search_substack | 读取 | GET /search | 搜索整个 Substack 中的用户、帖子和 Notes。 |
list_activity | 读取 | GET /activity | 你的 Substack 通知:回复、点赞、新关注者和转发,按最新优先排列。 |
get_unread_counts | 读取 | GET /unread-counts | 你有多少条未读私信、消息请求和活动通知。 |
list_conversations | 读取 | GET /conversations | 你的私信对话,按最新优先排列,并显示最后一条消息。 |
get_conversation | 读取 | GET /conversations/{conversation_id} | 一段私信对话中的最新消息,按时间从早到晚排列。 |
send_message | 写入 | POST /messages | 在 Substack 中发送私信,可以在对话中发送,也可以发送给某个人。 |
follow_user | 写入 | PUT /users/{user}/follow | 关注或取消关注 Substack 用户,让他们的 Notes 显示在你的动态中。 |
like_post | 写入 | PUT /posts/{post_id}/like | 以你的身份为任意 Substack 帖子点赞或取消点赞。 |
list_subscriptions | 读取 | GET /subscriptions | 你订阅的出版物,以及你的套餐和是否会收到它们的邮件。 |
出于设计考虑,本项目不会构建以下功能:Substack 登录、电子邮件、个人资料和账户设置、出版物地址或所有权,以及任何资金相关操作(付费套餐、提现、赠送订阅)。每个请求都会经过防护机制,拒绝对这些 Substack 路径的写入。
配置
| 变量 | 默认值 | 功能说明 |
|---|---|---|
SUBSTACK_MCP_HOME | ~/.config/substack-api-mcp | session.json 所在文件夹。 |
SUBSTACK_AUTH_TOKEN | Substack substack.sid Cookie,用于替代 substack-mcp connect。 | |
SUBSTACK_PROXY | 所有发往 Substack 的请求所用的代理,例如 http://user:pass@host:port。 | |
SUBSTACK_MCP_READ_ONLY | 1 会隐藏并拒绝所有会更改 Substack 的工具(等同于 --read-only)。 | |
SUBSTACK_MCP_TOKEN | serve 所需的 Bearer 令牌;要监听 127.0.0.1 以外的地址时必须设置。 | |
SUBSTACK_MCP_HOST、SUBSTACK_MCP_PORT | 127.0.0.1、8787 | serve 的地址。 |
安全与 Substack 账户
- 任何地方都不会使用密码。 Substack 通过发送到电子邮箱的验证码登录。程序只读取 Cookie,且只读取 substack.com 的 Cookie。
- 会话文件由你保管。
session.json创建时的权限模式为 0600。任何持有该文件的人都能以你的身份操作 Substack,因此请勿将它放入 git 或共享文件夹。 - 默认仅限本地访问。
serve绑定到127.0.0.1,未设置SUBSTACK_MCP_TOKEN时会拒绝绑定到其他地址。 - 仅允许访问 substack.com。 发往 substack.com 及其子域以外的请求和重定向都会被拒绝。
- 只读模式。
--read-only或SUBSTACK_MCP_READ_ONLY=1只会开放 25 个读取工具。 - 操作会触达真实用户。 已发布和已安排的帖子会通过邮件发送给你的订阅者;Notes、评论、回复和私信则会以你的名义发出。MCP 客户端会在执行前征求确认;脚本不会,因此请先在测试出版物上尝试。
- 只添加主动请求加入的人。
add_subscriber会发送 Substack 的欢迎邮件。导入未主动注册的人会违反 Substack 的规则。
错误
REST API 会返回 {"error": "<code>", "message": "..."}。MCP 服务会将相同的代码和消息作为工具错误返回。
| 状态 | 代码 | 处理方法 |
|---|---|---|
| 401 | auth_required, auth_expired | 没有会话、Substack 已将你登出,或在执行敏感操作(订阅者列表)前要求你重新登录。在 Chrome 中退出并重新登录 substack.com,然后运行 substack-mcp connect。 |
| 403 | app_permission_denied | 你在出版物中的角色无权执行此操作。 |
| 403 | scope_denied | 服务以只读模式运行,或调用会更改你的账户设置。 |
| 403 | target_blocked | Substack 拒绝了请求,或显示了机器人验证。在 Chrome 中打开一次 substack.com,然后重试。 |
| 409 | captcha_required | Substack 要求进行 CAPTCHA 验证。请在 Chrome 中完成验证。 |
| 422 | invalid_input | 缺少参数或参数错误;消息会指出具体参数。 |
| 429 | rate_limited | Substack 正在限制该账户。请等待几分钟。 |
| 502 | target_error | Substack 返回了错误,或更改了其网站。修复完成后运行 git pull 获取最新工具,或提交问题。 |
自托管或托管
| 此仓库 | Cotlet,托管版 | |
|---|---|---|
| 工具 | 同样的 50 个 | 同样的 50 个 |
| 运行位置 | 在你的电脑上,电脑开机时运行 | 在云端,全天候运行 |
| Substack 会话 | 使用你的 Chrome,Cookie 保存在本地文件中 | 使用你在欧盟的专属 Cloud Browser,配置文件通过 AES-256-GCM 加密 |
| Substack 更改网站时 | 我们修复后运行一次 git pull | 我们为你修复,每天测试所有工具 |
| 审批 | MCP 客户端会在每次调用时征求确认 | 发布文章、Notes、回复和私信会等待你的确认;可按工具切换 |
| 适用于 | 你电脑上的 MCP 客户端、本地脚本 | Claude.ai 和 ChatGPT 连接器、n8n、Make、Zapier,以及任何 HTTP 客户端 |
| 适用对象 | 你,仅限非商业用途 | 团队、企业、代理机构 |
| 价格 | 免费 | 免费试用 7 天,含 2,000 点数,无需信用卡;之后可购买一次性点数包,5,000 点数起价 $29 |
在托管版中,成功调用会消耗 20 到 30 点数(大多数工具为 25 点数),失败调用免费;Cloud Browser 在启用了供 Agent 使用的应用时,每天消耗 50 点数。完整定价。
常见问题
Substack 有官方 API 吗? 只有功能有限的 API(截至 2026 年 10 月 11 日核实)。其 Developer API 经批准后可查询公开的创作者个人资料,但没有公开 API 可用于发布帖子或 Notes、管理订阅者或发送电子邮件。RSS 只能读取公开帖子。详情和来源:cotlet.dev/integrations/substack-api-mcp-server。
有适用于 Claude、ChatGPT 或 Cursor 的 Substack MCP 服务吗?
有,这个服务在你的计算机上运行:substack-mcp mcp 适用于 Claude Code、Claude Desktop、Cursor 和 Codex。ChatGPT 和 Claude.ai 连接器需要公开的 HTTPS URL,托管的 Substack MCP 服务可以提供该 URL。
我可以从 Markdown 安排 Substack 帖子的发布时间吗?
可以:python examples/draft_from_markdown.py essay.md --publish-at 2026-11-03T08:00:00-05:00。Substack 编辑器无法导入 Markdown。该脚本会将文件作为草稿发送,保留其中的标题、粗体文本、链接、列表和代码块,然后安排发布时间。图片必须使用公开 URL。
它也能安排 Notes 的发布时间吗?
可以。publish_note 接受 publish_at 时间,Note 会在你的已安排 Notes 中等待,直到该时间发布。链接卡片需要关联一篇已发布的帖子。
我可以将 Substack 订阅者导出为 CSV 吗?
可以:python examples/export_subscribers.py --out subscribers.csv 会生成与订阅者仪表板中“导出”功能相同的 CSV。list_subscribers.py --plan paid 或 --since 2026-10-01 可按条件筛选列表,并显示订阅方案、加入日期和活跃度评分。
我可以将帖子导出为 Markdown 吗?
可以:每次导出一篇,使用 examples/get_post.py --post-id <id> --out post.md,包括付费墙后的内容以及你自己的出版物中的草稿。list_posts.py 可提供 ID。
这是 Substack 抓取工具吗? 它能完成大家使用抓取工具时想做的事(导出帖子、订阅者和统计数据),但不会在无头浏览器中解析 HTML。它会在你自己的帐户和出版物中调用 Substack 网页应用所调用的相同 JSON 端点。
为什么它需要我的 Chrome? 为了读取你的 Substack 会话。Substack 通过电子邮件发送验证码来登录,因此无论如何都不需要提供密码。每次登录时只需使用一次 Chrome,而不是每次调用都使用。
Substack 将我登出后会怎样?
调用会因 auth_expired 失败。如果已开启 Chrome 远程调试,服务会在下次调用时读取新的 Cookie(Chrome 提示时点击“允许”);否则请再次运行 substack-mcp connect。即使会话有效,订阅者列表有时也会要求重新登录:先在 substack.com 登出并重新登录,然后运行 connect。
它需要付费的 Substack 方案吗? 不需要。收入、付费订阅者和取消订阅数据仅适用于启用了付费订阅的出版物。
它能向我的所有订阅者发送电子邮件吗? 只能通过发布或安排帖子来发送,方式与编辑器相同。Substack 会针对一篇帖子发送一次电子邮件;发送后对帖子的编辑会显示在网页和应用中。
它能在 VPS 或 Docker 中运行吗?
技术上可以,需使用 SUBSTACK_AUTH_TOKEN。这样 Substack 会看到你的会话来自数据中心 IP,看起来就不太像是你本人。若要保持始终在线,托管版本会将你的会话保存在你自己的 Cloud Browser 中,并使用固定 IP。
我的 Substack 帐户会被封禁吗? 请求会携带 Chrome 的指纹,并逐个发出,就像你亲自点击一样。没人能保证平台绝不会采取措施。请遵循你的日常使用方式,不要批量添加或联系他人。
我可以在工作中或为客户使用它吗? 不可以,许可证仅允许非商业用途。若用于团队、公司或客户项目,请使用 Cotlet 或发送邮件至 [email protected]。
它是开源的吗? 源代码公开,但许可证不是开源许可证:仅限非商业用途,不得用于商业活动。
有工具无法正常工作,或者我需要另一个工具。 请提交问题,注明工具名称和错误消息。
许可证
PolyForm Noncommercial License 1.0.0。简而言之:
- **允许:**非商业用途:你为个人目的使用自己的 Substack 账号,或由慈善机构、学校、公共研究机构或政府机构使用。可以修改代码,并以相同许可证分享。
- **不允许:**任何商业用途,包括自营业务;客户项目;出售或提供本项目,或基于本项目构建的服务。
本仓库的早期版本(托管 API 的脚本,截止到提交 4399e88)仍采用 MIT 许可证。
由 Cotlet(@cotletdev)维护。Substack 是其所有者的商标。本项目为非官方项目,与 Substack 无关,也未获得其认可或赞助。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。