基于MCP协议与Substack官方API构建AI数据助手
2026/5/9 4:40:09 网站建设 项目流程

1. 项目概述:用AI助手深度管理你的Substack内容生态

如果你和我一样,同时运营着几个Substack新闻通讯,那你肯定对那种在多个后台、数据仪表盘之间来回切换的繁琐感深有体会。查看最新的文章阅读量、追踪付费订阅者的增长趋势、对比不同栏目的表现……这些日常的数据洞察工作,虽然重要,却常常打断我们专注于内容创作的“心流”。过去,我尝试过用脚本抓取数据,也试过一些第三方仪表盘工具,但它们要么不够灵活,要么无法与我的日常工作流无缝集成。

最近,随着AI助手(如Claude、Cursor)通过MCP协议获得越来越强的“动手能力”,一个想法在我脑中成型:能不能让AI助手直接“看到”并“操作”我的Substack后台数据?这样,我就可以用最自然的语言提问,比如“帮我看看上周那篇关于AI趋势的文章表现如何?”或者“对比一下我的科技和商业两个通讯过去30天的订阅增长”,然后立刻得到结构化的答案,甚至让AI基于这些数据给出内容建议。

这正是substack-publisher-mcp这个项目要解决的问题。它是一个基于Substack官方Publisher API的MCP服务器。简单来说,它就像一座桥梁,一端连接着Substack官方、稳定且功能强大的数据接口,另一端则连接着支持MCP协议的各类AI工作台。通过这座桥,你的AI助手就获得了查询和管理Substack内容的“超能力”。

这个工具的核心价值在于其官方性稳定性。市面上早有一些通过逆向工程Substack内部接口来实现类似功能的工具或脚本,但它们有一个致命弱点:一旦Substack更新其网站前端或内部API,这些“脆弱”的工具就会立刻失效,需要开发者不断地“打补丁”。而substack-publisher-mcp直接使用Substack官方为合作伙伴和开发者提供的Publisher API,这是一个有正式文档、有版本管理、承诺向后兼容的接口。选择它,意味着你构建的自动化工作流不会在某个清晨突然崩溃。

它非常适合以下几类人:

  • 多产的内容创作者:需要频繁、快速地查看多篇文章、多个栏目的表现数据,以指导后续的创作方向。
  • 数据驱动的运营者:希望将Substack的订阅者数据、文章互动数据与其他业务数据(如网站流量、社交媒体指标)进行关联分析。
  • 效率至上的极客:热衷于用最先进的工具(AI助手)优化每一个工作环节,追求“动动嘴皮子就能获取信息”的流畅体验。
  • 管理多个Substack出版物的团队:需要统一、便捷地查看旗下所有通讯的运营健康状况。

接下来,我将带你从零开始,完整地部署、配置并使用这个工具,并分享我在实际使用中摸索出的技巧和避开的那些“坑”。

2. 核心原理与架构设计解析

在深入动手之前,理解substack-publisher-mcp是如何工作的,能帮助你在遇到问题时更快地定位和解决。它的架构可以清晰地分为三层:数据源层桥接服务层客户端应用层

2.1 数据源层:Substack Publisher API

这是整个体系的基石。Substack Publisher API是Substack官方提供的、面向出版者的数据接口。与那些通过模拟浏览器登录、抓取HTML页面数据的“野路子”不同,这是一个标准的RESTful API。

  • 认证方式:使用API密钥。你可以在Substack的后台设置中生成一个专有的密钥,这个密钥代表了你的身份,用于所有API请求的鉴权。它的优点是稳定、安全,且可以随时吊销,不会危及你的主账户密码。
  • 数据范围:目前API主要提供读取操作,这正是我们进行数据分析最需要的部分。它包括:
    • 出版物信息:获取你管理的Substack出版物列表。
    • 文章数据:获取已发布文章的列表、详情(标题、摘要、发布时间、封面图、受众范围等)。
    • 文章统计:获取单篇文章的深度互动数据,如打开数、点击量、阅读量,以及最重要的——由这篇文章带来的新免费订阅、新付费订阅和预估收入增长。
    • 订阅者数据:获取按日统计的订阅者数量细分(总邮件订阅者、付费订阅者、免费试用者等),以及通过邮箱查询特定订阅者信息。
  • 稳定性承诺:作为官方API,Substack会尽力保证其向后兼容性。这意味着你今天写的查询代码,明年大概率还能正常运行,省去了大量维护成本。

2.2 桥接服务层:MCP服务器

这是项目的核心,即substack-publisher-mcp本身。它的角色是一个协议转换器工具暴露器

  1. 协议转换:MCP(模型上下文协议)是Anthropic提出的一套标准,用于让AI模型安全、结构化地使用外部工具和资源。MCP服务器需要遵循特定的JSON-RPC规范进行通信。substack-publisher-mcp的工作就是接收来自AI客户端的、符合MCP格式的请求(例如,“调用list_posts工具”),然后将这个请求“翻译”成对Substack Publisher API的HTTPS调用(携带API密钥,请求正确的端点)。
  2. 工具暴露:它不仅仅转发请求,还以“工具”的形式向AI客户端描述自己的能力。它会告诉Claude或Cursor:“嗨,我这里有以下几个工具可用:list_publications(列出出版物)、get_post_stats(获取文章统计)……” 每个工具都有明确的名称、描述和参数定义。这样,AI在思考如何回答你的问题时,就能知道可以调用哪些工具来获取必要的信息。
  3. 环境管理与多出版物支持:服务器会读取启动时配置的环境变量(如SUBSTACK_API_KEYSUBSTACK_API_KEY_TECH),每个环境变量对应一个Substack出版物的API密钥。它负责在内部管理这些密钥与出版物名称的映射关系。当AI客户端的请求指定了publication参数时,服务器就能准确地使用对应的密钥去请求数据。

2.3 客户端应用层:你的AI工作台

这是你直接交互的界面,通常是Claude Desktop、Claude Code插件或Cursor编辑器。这些应用内置或通过配置支持MCP客户端功能。

  • 集成过程:你需要在客户端的配置文件中,告诉它如何启动我们的MCP服务器(即substack-publisher-mcp),包括Node.js命令路径、脚本位置以及最重要的环境变量(API密钥)。
  • 协作模式:配置成功后,当你向AI提问时,AI会先理解你的意图。如果发现需要Substack数据,它就会查阅已连接的MCP服务器提供的“工具清单”,选择合适的工具,生成一个结构化的调用请求,通过MCP协议发送给服务器。服务器获取数据后返回,AI再将这些原始数据整合、分析,并用你能理解的自然语言呈现出来。

整个流程可以概括为:你的自然语言问题 -> AI理解并规划 -> AI通过MCP调用工具 -> 工具服务器访问官方API -> 原始数据返回 -> AI加工并回答。这个设计巧妙地将AI的语言理解能力与稳定、官方的数据接口结合了起来。

3. 从零开始的完整部署与配置指南

理论清晰后,我们进入实战环节。我会假设你从一个全新的环境开始,详细演示每一步。

3.1 前期准备:获取核心钥匙

部署前,你需要准备好两样东西:Node.js运行环境和Substack的API密钥。

1. 安装Node.js 18或更高版本这是运行该MCP服务器的前提。如果你不确定是否安装,打开终端(Mac/Linux)或命令提示符/PowerShell(Windows),输入:

node --version

如果显示版本号大于等于18,则跳过此步。否则,请访问 Node.js官网 下载并安装最新的LTS版本。我推荐使用LTS版,它在稳定性和兼容性上更有保障。

2. 获取Substack Publisher API密钥这是访问你数据的通行证,务必妥善保管。

  • 步骤一:登录你的Substack创作者后台。
  • 步骤二:在左侧导航栏找到并点击“设置”
  • 步骤三:在设置页面中,寻找名为“开发者”“API”的选项卡。Substack的界面可能会更新,如果没找到,可以尝试在设置页面的搜索框输入“API”或“Developer”。
  • 步骤四:在API设置部分,你应该能看到“Publisher API”的相关选项。点击生成新的API密钥。系统可能会让你确认密码。
  • 步骤五重要!生成的密钥通常是一长串由数字和字母组成的字符串。请立即将其复制并保存到安全的地方(如密码管理器)。这个密钥只会显示一次,关闭页面后就无法再次查看,如果丢失,只能重新生成。

注意:这个API密钥拥有读取你账户下出版物数据的权限。请像保护你的密码一样保护它,不要将其提交到公开的代码仓库或分享给他人。

3.2 部署MCP服务器

有了密钥,我们就可以部署桥接服务了。

1. 克隆项目代码打开终端,切换到你希望存放项目的目录(例如~/projects),执行以下命令:

git clone https://github.com/dkships/substack-publisher-mcp.git cd substack-publisher-mcp

这会将项目的最新代码下载到本地。

2. 安装依赖并构建项目使用TypeScript编写,需要安装依赖并编译成JavaScript才能运行。

npm install npm run build

npm install会下载所有必要的第三方库。npm run build则会执行TypeScript编译,将src/目录下的源代码编译到dist/目录。请确保build步骤成功完成,因为后续MCP客户端启动的是dist/index.js文件。

3. 验证安装(可选但推荐)你可以快速测试一下服务器是否能正常启动。在项目根目录下,临时设置环境变量并运行:

SUBSTACK_API_KEY=你的测试API密钥 node dist/index.js

如果服务器启动后没有立即退出并报错,而是保持运行(可能等待连接),说明基础运行环境是没问题的。按Ctrl+C退出测试。

3.3 配置你的AI客户端

这是最关键的一步,让AI助手知道我们的服务器在哪里。配置方式因客户端而异。

通用配置结构无论哪种客户端,核心配置都是一个JSON对象,它定义了如何启动MCP服务器。以下是一个基础模板:

{ "mcpServers": { "substack": { "command": "node", "args": ["/绝对/路径/到/substack-publisher-mcp/dist/index.js"], "env": { "SUBSTACK_API_KEY": "你刚才获取的真实API密钥" } } } }
  • "substack":这是你给这个服务器起的名字,可以自定义,后续AI调用时会用到这个名字(或根据上下文自动识别)。
  • command:启动服务器的命令,这里是node
  • args:传递给命令的参数,即我们编译好的入口文件index.js绝对路径请务必替换成你电脑上的实际路径。
  • env:环境变量对象。这里设置SUBSTACK_API_KEY,其值就是你的密钥。

各客户端具体配置路径与方法

  • Claude Desktop (macOS): 配置文件位于:~/Library/Application Support/Claude/claude_desktop_config.json。 如果文件不存在,就创建它。将上面的配置模板内容写入该文件即可。

  • Claude Desktop (Windows): 配置文件位于:%APPDATA%\Claude\claude_desktop_config.json(通常在C:\Users\你的用户名\AppData\Roaming\Claude\)。 同样,不存在则创建。

  • Claude Code (VS Code 插件): 在你的项目根目录下,或者在你的用户全局设置中,创建一个名为.mcp.json的文件。配置内容需要稍作调整,增加"type": "stdio"

    { "mcpServers": { "substack": { "command": "node", "args": ["/绝对/路径/到/substack-publisher-mcp/dist/index.js"], "env": { "SUBSTACK_API_KEY": "你的API密钥" }, "type": "stdio" } } }

    "type": "stdio"是Claude Code要求的,指明使用标准输入输出进行通信。

  • Cursor 编辑器: 在项目根目录下,创建.cursor/mcp.json文件(注意.cursor是一个目录)。其配置格式与Claude Desktop类似,无需type字段。

配置多出版物支持如果你管理多个Substack,比如一个主博客、一个科技简报,可以配置多个环境变量。服务器会自动识别以SUBSTACK_API_KEY_为前缀的变量。

{ "mcpServers": { "substack": { "command": "node", "args": ["/path/to/dist/index.js"], "env": { "SUBSTACK_API_KEY_MAIN": "主博客密钥", "SUBSTACK_API_KEY_TECH": "科技简报密钥" // 注意:不需要配置不存在的出版物密钥 } } } }

配置完成后,重启你的AI客户端(Claude Desktop或Cursor),以使新的MCP配置生效。

4. 核心工具详解与高效使用技巧

服务器配置好后,AI助手就获得了六把“瑞士军刀”。我们来逐一剖析每把刀的用途、用法以及我摸索出的高效技巧。

4.1 工具全景图与基础查询

首先,你可以让AI帮你列出所有可用的工具。简单地询问:“你能用Substack工具做什么?”或者“列出可用的Substack相关功能”。AI会调用MCP的list_tools(这是一个MCP标准调用,非本项目提供)或直接展示它已知的来自我们服务器的工具。

通常,你会看到以下六个工具:

工具名称核心功能必填参数可选参数与技巧
list_publications列出所有已配置的出版物无。用于确认配置是否正确,以及查看出版物在系统中的标识名。
list_posts列出符合条件的文章startDate/endDate(ISO格式,如2024-03-01),sortBy(postDatetitle),type(all,only_paid,only_free),maxResults(默认20,可调大),next(用于分页)。技巧:初始查询可不设日期范围,快速查看最新文章。
get_post获取单篇文章详情urlSlug(文章URL的最后一段)无。urlSlug就是文章发布后,其URL中/p/后面的部分。
get_post_stats获取单篇文章的互动统计数据urlSlug无。这是分析文章表现的核心工具。
get_subscriber_counts获取每日订阅者数量统计startDate,endDate强烈建议始终指定日期范围,避免获取过量数据。
get_subscriber通过邮箱查找订阅者详情email无。适用于核实特定订阅者状态或信息。

所有工具都支持一个通用的可选参数:publication。当你有多个出版物时,用这个参数指定查询目标,例如{"publication": "TECH"}。如果不指定,服务器通常会使用默认的第一个配置的密钥对应的出版物。

4.2 实战场景与高效提问模板

知道了工具有哪些,关键在于如何组合使用它们。下面是我常用的几个场景和提问方式,能极大提升效率。

场景一:快速健康检查

  • 提问:“给我的Substack出版物做个快速健康检查,看看最近一周的整体订阅趋势和文章表现。”
  • AI背后的行动
    1. 调用list_publications确认出版物名称。
    2. 调用get_subscriber_counts,设置startDate为7天前,获取订阅趋势。
    3. 调用list_posts,设置startDate为7天前,maxResults为10,获取近期文章列表。
    4. 对于列表中的每篇文章,可能并行调用get_post_stats获取其数据。
    5. 综合分析数据:订阅是增长还是下降?哪篇文章打开率最高?哪篇带来了最多付费转化?最后给你一个简洁的总结报告。

场景二:深度分析单篇文章

  • 提问:“深度分析一下我上周发布的题为‘AI写作指南’的那篇文章,包括它的基本数据、互动表现,以及和之前同类型文章的比较。”
  • AI背后的行动
    1. 调用list_posts查找标题包含“AI写作指南”的文章,获取其urlSlug
    2. 调用get_post获取文章详情(发布时间、受众等)。
    3. 调用get_post_stats获取该文章的详细统计数据。
    4. (如果需要比较)再次调用list_posts,用type或时间范围筛选出同类型历史文章,然后批量获取它们的get_post_stats进行对比分析,计算平均打开率、转化率等。

场景三:多出版物对比

  • 提问:“对比一下我的‘主博客’和‘科技周报’这两个出版物在过去30天的新增付费订阅者数量。”
  • AI背后的行动
    1. 调用get_subscriber_counts,分别指定publicationMAINTECH,时间范围均为过去30天。
    2. 从返回的每日数据中,提取出new_paid_subscriptions的字段(注意:这个数据更可能来自get_post_stats的汇总,或需要从订阅者计数差值计算。实际中,get_subscriber_counts提供的是存量,增量需自行计算。AI可能会解释这一点,并转而分析付费订阅者总数的变化趋势)。这体现了AI的逻辑推理能力——它知道如何解读和运算数据。

场景四:寻找最佳发布时间

  • 提问:“分析我过去三个月所有文章的数据,找出打开率最高的发布时间是星期几和哪个时间段。”
  • AI背后的行动
    1. 调用list_posts,设置startDate为三个月前,maxResults设为50或更大。
    2. 对每篇文章,调用get_post获取精确的postDate
    3. 对每篇文章,调用get_post_stats获取opensrecipients,计算打开率。
    4. 将所有文章的发布时间(星期几、小时)与打开率进行关联分析,给出统计结论和建议。

我的心得:不要只问“我的数据怎么样?”,要问“基于我的数据,我应该……?”。将AI从“数据检索器”提升为“分析顾问”。例如,问“根据最近一个月付费文章和免费文章的表现差异,对我接下来的内容策略有什么建议?”AI会调用数据,并结合常见的新闻通讯运营知识,给你更具洞察力的回答。

5. 常见问题排查与进阶配置

即使按照指南操作,也可能会遇到一些问题。这里我整理了常见的“坑”及其解决方法。

5.1 连接与认证问题

问题现象可能原因排查步骤与解决方案
AI助手完全无法识别Substack工具,或提示“服务器错误”。1. MCP服务器启动失败。
2. 客户端配置路径错误。
3. 环境变量未正确传递。
1.手动测试服务器:在终端进入项目目录,运行SUBSTACK_API_KEY=你的密钥 node dist/index.js。观察是否有错误输出。常见的错误是Node版本过低或依赖缺失,根据提示解决。
2.检查路径:确保配置文件中args数组里的dist/index.js路径是绝对路径,并且指向你项目编译后的正确位置。在终端使用pwd(Mac/Linux)或cdchdir(Windows)确认项目根目录,然后拼接/dist/index.js
3.检查客户端日志:Claude Desktop和Cursor通常有日志输出窗口或设置。查看日志中是否有关于MCP服务器启动失败的详细信息。
AI可以识别工具,但调用时返回Unauthorized(401) 错误。API密钥错误或格式问题。1.核对密钥:确保配置的SUBSTACK_API_KEY的值与从Substack后台复制的完全一致,没有多余的空格或换行。
2.理解认证方式:Substack Publisher API的认证方式是将API密钥直接放在Authorization请求头中,前面不需要加Bearer这个词。substack-publisher-mcp已经处理好了这一点,所以问题通常出在密钥本身错误或已失效。
3.重新生成密钥:如果怀疑密钥泄露或无效,去Substack后台撤销旧密钥,生成一个新密钥并更新配置文件。
配置了多出版物,但AI说“未找到出版物”或查询不到数据。1. 环境变量名不匹配。
2. 出版物名称引用错误。
1.检查变量名:确保环境变量名严格遵循SUBSTACK_API_KEY_<NAME>格式,<NAME>是你自定义的大写标识(如MAIN)。在配置中引用时,工具参数publication的值也应该是这个<NAME>(例如"publication": "MAIN")。
2.使用list_publications:首先让AI调用这个工具,它会返回服务器识别到的所有出版物名称列表。用这个列表中的名称作为publication参数值。

5.2 数据与使用问题

问题现象可能原因排查步骤与解决方案
list_posts返回的文章数量很少或没有。1. 默认的maxResults限制。
2. 日期范围设置不当。
3. 文章类型过滤。
1.指定maxResults:在提问时明确要求,例如“列出我最近50篇文章”。AI会在调用工具时设置maxResults: 50
2.明确日期范围:Substack API可能默认返回最近有限的数据。通过startDateendDate参数指定更宽的范围。
3.检查type参数:如果你设置了type: "only_paid",则只会返回付费专区文章。
get_subscriber_counts返回的数据字段不全或为0。1. API数据延迟。
2. 统计口径理解有误。
1.理解延迟:订阅者数量等数据可能存在1-2天的处理延迟。今天查询昨天的数据可能最准确。
2.阅读API文档get_subscriber_counts返回的是每日结束时的订阅者存量快照,而不是当日新增数。新增数需要自己计算相邻日期的差值。get_post_stats中的new_free_subscriptionsnew_paid_subscriptions才是该文章带来的增量
AI的回答看起来没有调用数据,或数据过时。1. AI的上下文理解偏差。
2. 缓存或会话问题。
1.精确提问:在提问中明确指出“使用Substack工具查询”。例如,不要说“我的订阅者多少?”,而说“使用Substack工具,查询我上个月的订阅者总数变化”。
2.开启新会话:有时AI的会话中会有旧的上下文干扰。尝试开启一个新的聊天会话再提问。
3.指令引导:直接给出指令,如“请调用get_subscriber_counts工具,查询我过去7天的数据。”

5.3 进阶:安全与自动化考量

  • API密钥安全:永远不要将包含真实API密钥的配置文件提交到Git等版本控制系统。可以将配置文件放在版本控制忽略的文件中(如.gitignore里添加claude_desktop_config.json),或者使用环境变量引用。更安全的方式是,在配置文件中引用一个环境变量名,而在系统层面设置该环境变量。

    // 配置文件(可提交) { "mcpServers": { "substack": { "command": "node", "args": ["/path/to/dist/index.js"], "env": { "SUBSTACK_API_KEY": "$SUBSTACK_API_KEY_FROM_ENV" } } } }

    然后在启动Claude Desktop前,在终端设置环境变量(临时)或写入shell配置文件(永久)。

  • 速率限制:Substack Publisher API有调用频率限制。虽然对于个人日常查询通常不会触发,但如果你让AI进行非常复杂的历史数据批量分析(例如循环查询几百篇文章的详情),则可能被限流。substack-publisher-mcp服务器本身没有内置限流,因此需要你在提问时保持合理的数据范围。如果遇到429错误,说明触发了限流,需要等待一段时间再试。

  • 错误处理与日志:目前服务器的错误信息会通过MCP协议返回给客户端,最终体现在AI的回答或客户端日志中。对于调试,在启动服务器时添加NODE_ENV=development环境变量,或者查看项目的源码,可能会看到更详细的日志输出逻辑。复杂的错误需要结合客户端日志和服务器端输出来判断。

通过这套工具链,你将Substack的数据洞察能力无缝嵌入了你的AI增强工作流中。它节省的不仅仅是点击鼠标的时间,更是上下文切换的认知负荷,让你能更专注于从数据中获取洞见,而非忙于收集数据本身。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询