cli-anything-mailchimp 实战:用 CLI-Anything 将 Mailchimp Marketing API v3.0 封装为 Agent 原生命令行接口
【免费下载链接】CLI-Anything"CLI-Anything: Making ALL Software Agent-Native" -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything
这篇指南以 mailchimp 子模块的 README 为主体,结合其架构文档与源码,系统讲解如何安装、认证、运行cli-anything-mailchimp,覆盖 30 个资源组的 303 个命令、JSON 输出与 jq 组合、交互式 REPL 以及底层 HTTP 客户端实现。读完你将能够在 Shell 脚本或 Agent 工作流中直接管理 Mailchimp 的受众(lists)、邮件营销活动(campaigns)、报告(reports)、自动化(automations)与电商数据。
一、工具定位:把整个 Marketing API 变成 CLI 命令
cli-anything-mailchimp是构建在 CLI-Anything 框架之上的 Python CLI harness,目标是让 Mailchimp Marketing API v3.0全面 "Agent-native"——即每个 Swagger 端点都暴露为一个带类型检查的 Click 命令,并提供 JSON 输出与 REPL 模式,让大模型 Agent 无需编写 SDK 代码即可操作账号。
在 架构文档 MAILCHIMP.md 中给出的口径是:303 个命令、横跨 30 个资源组,覆盖完整 Marketing API 表面。包内技能文件 SKILL.md 的 frontmatter 同步声明了该能力范围。源码侧同样可验证:单元测试 test_core.py 中test_all_groups_importable断言len(ALL_GROUPS) == 30,且每个资源组都必须注册至少一个命令。
它能够完成的核心业务动作包括:
- 受众(Audiences/Lists):创建、更新、删除列表;添加/更新/归档成员;管理合并字段(merge fields)、分组(segments)、标签(tags)与 webhooks;
- 营销活动(Campaigns):创建、排期、立即发送、暂停、复制并分析邮件活动;
- 报告(Reports):打开率、点击率、退订、邮件活动、地域分布等投放分析;
- 自动化(Automations):创建与管理自动化邮件工作流;
- 电商(E-commerce):店铺、订单、顾客、商品、购物车与促销码;
- 以及模板(templates)、文件管理器(file-manager)、落地页(landing-pages)、短信活动(sms-campaigns)、调查(surveys)等其余全部 Marketing API 资源。
二、安装与前置条件
2.1 环境要求
- Python3.10+。该版本约束同时写入了包元数据 setup.py(
python_requires=">=3.10")与 SKILL.md 的 Prerequisites 一节。 - 运行时依赖:
click>=8.0、requests>=2.28、prompt-toolkit>=3.0(见 setup.py 的install_requires)。
2.2 安装命令
在仓库内以开发模式安装(对应文档给出的本地开发方式):
cd mailchimp/agent-harness && pip install -e .安装完成后,setup.py的entry_points会注册可执行命令cli-anything-mailchimp,其入口指向 mailchimp_cli.py 的main()。若需从 CLI-Anything 托管仓库的mailchimp/agent-harness子目录以pip install git+...方式安装,参见 MAILCHIMP.md 的安装说明。
2.3 认证:环境变量是唯一配置来源
本工具遵循 CLI-Anything 的惯例——不读取任何配置文件,只认环境变量。认证只需设置一个变量:
export MAILCHIMP_API_KEY=<your-api-key>-<datacenter>注意 API Key 必须带数据中心后缀,例如abc123-us8、xyz-eu2。带后缀的原因在于 Mailchimp 的 API 域名是按数据中心路由的(https://<dc>.api.mailchimp.com/3.0),缺少后缀的 Key 无法确定请求发往哪个机房。
三、快速上手:五条命令走完核心链路
安装并导出 Key 后,即可直接执行:
cli-anything-mailchimp ping # 健康检查,确认 API 连通性 cli-anything-mailchimp --json lists list # 以 JSON 列出所有受众 cli-anything-mailchimp --json campaigns list --count 10 # 列出前 10 个活动 cli-anything-mailchimp # 不带参数进入交互式 REPL其中ping命中GET /ping,连通成功后返回{"health_status": "Everything's Chimpy!"};root list则用于拉取账号基本信息。--json是根级全局开关,作用于任意子命令。
值得注意的一个命令层级细节是:ping这类单端点资源组被生成为 Click group,并在未显式给出子命令时自动调用其内部list命令(见 ping.py),因此cli-anything-mailchimp ping无需追加list即可执行健康检查——单元测试test_ping_group_invokes_health_check_without_list_subcommand专门锁定了这一行为。
四、命令全景:资源组与命令层级
从架构文档 MAILCHIMP.md 可以还原完整命令层级(操作数为文档口径):
cli-anything-mailchimp [--json] [--version] │ ├── ping # GET /ping —— 健康检查 ├── root # GET / —— 账号信息 ├── lists # 66 个操作(受众、成员、合并字段、分组、标签、webhooks) ├── campaigns # 22 个操作(发送、排期、暂停、复制等) ├── reports # 22 个操作(已发送活动的分析) ├── automations # 18 个操作(工作流与自动化邮件) ├── ecommerce # 60 个操作(店铺、订单、商品、购物车、促销码) ├── templates / template-folders / campaign-folders ├── file-manager # 11 个操作(文件与文件夹) ├── reporting # 12 个操作(Facebook/落地页报告) ├── landing-pages / sms-campaigns / surveys ├── audiences / contacts / customer-journeys / facebook-ads ├── batches / batch-webhooks ├── connected-sites / verified-domains / authorized-apps ├── conversations / activity-feed / account-exports └── search-campaigns / search-members这 30 个资源组模块存放在 commands/ 目录,由 __init__.py 汇总为ALL_GROUPS,再由根 CLI 统一注册(mailchimp_cli.py 中for _group in ALL_GROUPS: cli.add_command(_group))。
4.1 Root
| 命令 | 说明 |
|---|---|
cli-anything-mailchimp ping | 健康检查,确认 API 连通性 |
cli-anything-mailchimp root list | 获取账号信息 |
cli-anything-mailchimp --json <cmd> | 以 JSON 输出任意命令结果 |
cli-anything-mailchimp | 启动交互式 REPL |
4.2 Lists(受众)
| 命令 | 说明 |
|---|---|
lists list | 列出所有受众 |
lists get <LIST_ID> | 获取受众信息 |
lists create --data '<json>' | 创建受众 |
lists update <LIST_ID> --data '<json>' | 更新受众 |
lists delete <LIST_ID> | 删除受众 |
lists list-lists-id-members <LIST_ID> | 列出受众成员 |
lists get-lists-id-members-id <LIST_ID> <SUBSCRIBER_HASH> | 按 MD5 哈希获取成员 |
lists create-lists-id-members <LIST_ID> --data '<json>' | 添加成员 |
lists list-lists-id-merge-fields <LIST_ID> | 列出合并字段 |
lists create-lists-id-merge-fields <LIST_ID> --data '<json>' | 添加合并字段 |
lists list-lists-id-segments <LIST_ID> | 列出分组 |
lists list-list-member-tags <LIST_ID> <SUBSCRIBER_HASH> | 列出成员标签 |
lists create-list-member-tags <LIST_ID> <SUBSCRIBER_HASH> --data '<json>' | 添加/移除成员标签 |
lists list-lists-id-webhooks <LIST_ID> | 列出 webhooks |
lists create-lists-id-webhooks <LIST_ID> --data '<json>' | 添加 webhook |
从源码可见,生成命令同时完整保留了 API 的查询参数。以 lists.py 中lists list为例,它支持--fields、--exclude-fields、--count、--offset、--before-date-created、--since-date-created、--sort-field、--sort-dir、--has-ecommerce-store等开关,其中count默认值为 10、最大值为 1000,offset默认值为 0——这些取值约束直接源自 Mailchimp Swagger 规范的参数描述。每个命令还统一带有--extra-params(JSON 对象),用于透传未建模成独立开关的额外查询参数。
4.3 Campaigns
| 命令 | 说明 |
|---|---|
campaigns list | 列出活动 |
campaigns get <CAMPAIGN_ID> | 获取活动信息 |
campaigns create --data '<json>' | 创建活动 |
campaigns update <CAMPAIGN_ID> --data '<json>' | 更新活动设置 |
campaigns delete <CAMPAIGN_ID> | 删除活动 |
campaigns send <CAMPAIGN_ID> | 立即发送活动 |
campaigns schedule <CAMPAIGN_ID> --data '<json>' | 排期发送 |
campaigns cancel-send <CAMPAIGN_ID> | 取消已排期的发送 |
campaigns pause <CAMPAIGN_ID> | 暂停 RSS 活动 |
campaigns resume <CAMPAIGN_ID> | 恢复 RSS 活动 |
campaigns replicate <CAMPAIGN_ID> | 复制活动 |
campaigns list-content <CAMPAIGN_ID> | 获取活动内容 |
campaigns list-send-checklist <CAMPAIGN_ID> | 发送前检查清单 |
4.4 Reports(投放报告)
| 命令 | 说明 |
|---|---|
reports list | 列出所有活动报告 |
reports get <CAMPAIGN_ID> | 获取活动汇总报告 |
reports list-email-activity <CAMPAIGN_ID> | 逐订阅者打开/点击行为 |
reports list-click-details <CAMPAIGN_ID> | 链接点击明细 |
reports list-open-details <CAMPAIGN_ID> | 逐订阅者打开记录 |
reports list-unsubscribed <CAMPAIGN_ID> | 退订名单 |
reports list-locations <CAMPAIGN_ID> | 地域分布 |
reports list-domain-performance <CAMPAIGN_ID> | 分域名统计 |
4.5 Automations(自动化工作流)
| 命令 | 说明 |
|---|---|
automations list | 列出自动化 |
automations get <WORKFLOW_ID> | 获取自动化信息 |
automations create --data '<json>' | 创建自动化 |
automations pause <WORKFLOW_ID> | 暂停自动化 |
automations start <WORKFLOW_ID> | 启动自动化 |
automations archive <WORKFLOW_ID> | 归档自动化 |
automations list-emails <WORKFLOW_ID> | 列出自动化邮件 |
4.6 E-commerce(电商数据)
| 命令 | 说明 |
|---|---|
ecommerce list-ecommerce-stores | 列出店铺 |
ecommerce get <STORE_ID> | 获取店铺信息 |
ecommerce create --data '<json>' | 添加店铺 |
ecommerce list-ecommerce-stores-id-orders <STORE_ID> | 列出订单 |
ecommerce list-ecommerce-stores-id-products <STORE_ID> | 列出商品 |
ecommerce list-ecommerce-stores-id-customers <STORE_ID> | 列出顾客 |
ecommerce list-ecommerce-stores-id-carts <STORE_ID> | 列出购物车 |
ecommerce list-ecommerce-stores-id-promocodes <PROMO_RULE_ID> <STORE_ID> | 列出促销码 |
4.7 其余资源组速览
| 资源组 | 说明 |
|---|---|
templates | 邮件模板(增删改查) |
template-folders | 模板文件夹 |
campaign-folders | 活动文件夹 |
file-manager | 文件管理器中的文件与文件夹 |
landing-pages | 落地页(列出、创建、发布、取消发布) |
sms-campaigns | 短信活动 |
surveys | 调查(列出、获取、发布) |
reporting | Facebook 广告与落地页报告 |
search-campaigns | 按查询词搜索活动 |
search-members | 跨全部受众搜索成员 |
batches | 批量 API 操作 |
batch-webhooks | 批量操作 webhooks |
verified-domains | 发件域名验证 |
authorized-apps | OAuth 已授权应用 |
connected-sites | 关联站点集成 |
conversations | 收件箱会话 |
activity-feed | 账号活动流 |
account-exports | 账号数据导出 |
补充说明:上表中很多“长命令”是生成器从 Swagger 路径自动命名的(如
list-lists-id-members对应GET /lists/{list_id}/members),同时不少模块还维护了面向人的短别名(如create-members、list-content、list-send-checklist)。测试 test_core.py 中通过test_campaign_shortcut_aliases_match_generated_commands、test_report_shortcut_aliases_match_generated_commands、test_create_members_alias_matches_generated_command等用例,逐一断言了别名与实际 HTTP 路径的一致性。
五、设计决策与源码佐证
架构文档 MAILCHIMP.md 记录了六条核心设计决策,均能在源码中找到对应实现:
基于 Spec 的代码生成:303 个命令由 _codegen/generate.py 从 Mailchimp 公开的 Swagger 2.0 规范自动生成,生成产物直接入库。这样终端用户在拿到包后即可快速使用
--help,无需现场下载规范。生成代码均带有“Auto-generated… Do not edit manually”的头部注释(见 lists.py 与 ping.py)。测试中还专门守护了生成质量:test_no_builtin_shadowing_in_function_names用 AST 检查生成函数不会遮蔽 Python 内建名。仅环境变量认证:没有配置文件,
MAILCHIMP_API_KEY是唯一事实来源。客户端在缺 Key 时抛出MailchimpAuthError(client.py),get_client()负责向 stderr 打印错误并以退出码 1 结束。原样复制的
repl_skin.py:REPL 皮肤按 CLI-Anything 贡献规则从cli-anything-plugin/repl_skin.py无修改复制,位于 utils/repl_skin.py。路径参数作为位置参数:Mailchimp 路径中的
{list_id}、{campaign_id}等变量被生成为必填的位置 Click 参数,令命令保持简洁(例如campaigns get <CAMPAIGN_ID>)。请求体统一走
--dataJSON:POST/PATCH/PUT 的请求体以--data '{"key":"value"}'传入,避免为每个字段生成几十个 flag;这对 Agent 尤其友好——可以直接构造 JSON payload。每个生成命令还支持--extra-params(必须为 JSON 对象)来补充查询参数。Subscriber hash 工具:
cli_anything.mailchimp.core.client.subscriber_hash(email)实现了 Mailchimp 用于标识成员的 MD5 计算(先strip()去除首尾空白、再小写化邮箱后做 MD5),与 Node.js 参考实现保持一致。
六、输出策略:JSON、人类可读与错误信封
所有命令共享根级--json开关。在源码层面,mailchimp_cli.py 读取该开关后写入 output.py 的模块级标志USE_JSON,随后每个命令经_out()统一输出。
# 以 JSON 列出所有受众 cli-anything-mailchimp --json lists list # 以 JSON 获取某活动报告 cli-anything-mailchimp --json reports get abc123def # 管道给 jq —— 请使用 Mailchimp 原生字段名 cli-anything-mailchimp --json lists list | jq '.lists[].name' cli-anything-mailchimp --json campaigns list | jq '.campaigns[].id'6.1 JSON 信封形态
命令输出的是Mailchimp API 原生响应结构(而非二次包装),因此字段名与 API 文档一致:
// 集合类端点 —— 键与资源名一致(lists、campaigns、members 等) {"lists": [...], "total_items": 42, "_links": [...]} {"campaigns": [...], "total_items": 10, "_links": [...]} // 单资源 GET / POST / PATCH {"id": "abc123", "name": "My List", ...} // DELETE {"ok": true, "message": "Deleted."} // 错误 {"ok": false, "message": "Resource Not Found: ...", "data": {...}}各形态在 output.py 中均有对应实现:_out()在USE_JSON=True时打印美化 JSON;_out_ok()用于变更类操作,输出{"ok": true, "message": ...};_out_err()将 HTTP 状态、title、detail与原始错误体(Mailchimp Problem Detail)打包为{"ok": false, ...}并写入 stderr、以非零码退出。其中 DELETE 的{"ok": true}由 client.py 的delete()统一返回。
在人类可读模式下,单对象输出紧凑的键值对,集合输出带注解的列表,错误使用彩色✗前缀、成功使用✓前缀。
6.2 分页与全量拉取
集合命令直接暴露 Mailchimp 原生的count与offset查询参数,但CLI 默认不会自动翻页拉取全部数据——单次返回一页,其余数据由调用方按需翻页。若需要在脚本里做多页迭代,可借助 pagination.py 提供的分页器原语:paginate(client, path, result_key)以生成器逐页产出全部条目,collect(client, path, result_key)则返回(items, total_items)元组。测试覆盖了单页、多页、空结果以及“恰好一页满时不多拉第二次空页”的边界(test_exact_page_boundary_no_extra_fetch)。
七、常用 Agent 模式
技能文件 SKILL.md 整理了一组开箱即用的“Agent 模式”,全部是命令 + jq的组合:
# 获取账号健康状态 cli-anything-mailchimp --json ping | jq '.health_status' # 列出所有受众 ID 与名称 cli-anything-mailchimp --json lists list | jq '.lists[] | {id, name}' # 找出某受众中所有已订阅成员 cli-anything-mailchimp --json lists list-lists-id-members <list_id> --status subscribed | jq '.members[].email_address' # 创建活动并抓取其发送前检查清单 cli-anything-mailchimp --json campaigns create --data '{"type":"regular","settings":{"subject_line":"Hello","from_name":"Me","reply_to":"me@example.com"}}' | jq '.id' cli-anything-mailchimp --json campaigns list-send-checklist <campaign_id> | jq '.items[] | select(.result == false)' # 获取某已发送活动的退订名单 cli-anything-mailchimp --json reports list-unsubscribed <campaign_id> | jq '.unsubscribes[].email_address' # 向受众添加成员(subscriber hash = 小写邮箱的 MD5) cli-anything-mailchimp --json lists create-members <list_id> --data '{"email_address":"user@example.com","status":"subscribed"}' # 跨全部受众搜索某成员 cli-anything-mailchimp --json search-members list --query "user@example.com" | jq '.exact_matches.members[]'注意--data必须是可以被json.loads成功解析的合法 JSON;若传入{bad这类非法字符串,Click 会以退出码 2 报出Invalid value for --data ... valid JSON,而不会打印堆栈(test_invalid_data_json_reports_click_error用例验证了这一行为)。
八、交互式 REPL
不带任何参数运行cli-anything-mailchimp即进入 REPL。根 CLI 的invoke_without_command=True会拦截空调用并转发给_start_repl()(见 mailchimp_cli.py);REPL 通过prompt_toolkit读取输入、用shlex分词后,以standalone_mode=False复用同一个 Click CLI 执行,因此 REPL 内语法与命令行完全一致。help/?会列出所有资源组的一行简介,quit/exit/q或 Ctrl-C/Ctrl-D 退出:
◆ cli-anything · Mailchimp v0.1.0 Type help for commands, quit to exit ◆ mailchimp ❯ ping ✓ {"health_status": "Everything's Chimpy!"} ◆ mailchimp ❯ --json lists list {"lists": [...], "total_items": 3, "_links": [...]} ◆ mailchimp ❯ quit九、HTTP 客户端底层原理
核心客户端实现在 core/client.py,值得关注以下几个机制:
- 数据中心自动推导:
_server_prefix()从 API Key 后缀(-之后的最后一段)提取dc(如us8),缺失连字符时抛出带提示的ValueError。测试TestServerPrefix验证了abc123-us8 → us8、xyz-eu2 → eu2的推导,以及无后缀 Key 会抛错。 - 基础 URL 拼接:请求基址为
https://<dc>.api.mailchimp.com/3.0,超时统一为 30 秒。 - 认证方式:HTTP Basic Auth,用户名为任意字符串
anystring,密码即 API Key(client._session.auth = ("anystring", key));请求头携带User-Agent: cli-anything-mailchimp/0.1.0。测试test_auth_header断言了该元组形态。 - 错误建模:非 2xx 响应会被
_raise()解析为MailchimpError(status, title, detail, raw)——优先取 JSON 中的title/detail,解析失败则退回 HTTP reason 与前 200 字符响应体。测试test_get_error_raises构造 404 响应并断言异常携带的status与title。 - 动词映射:
get/post/patch/put/delete分别对应 HTTP 方法;post对 204 No Content 返回{},delete统一返回{"ok": True}。
十、注意事项与常见坑
技能文档与源码共同确认了以下关键约束,接入时务必留意:
Subscriber hash:Mailchimp 以“小写化邮箱的 MD5”作为成员标识。可用内置工具函数或以下一行命令计算:
python -c "import hashlib; email='email@example.com'; print(hashlib.md5(email.strip().lower().encode()).hexdigest())"实现位于 client.py,其正确性由测试
TestSubscriberHash守护(对test@example.com输出已知 MD5 值55502f40dc8b7c769880b10874abc9d0,且先去除首尾空白、再小写化)。请求体:所有 POST/PATCH/PUT 命令都接受
--data '<json>',各端点的字段 schema 以 Mailchimp API 端点文档为准。数据中心后缀:
MAILCHIMP_API_KEY必须包含-us8、-eu2这类后缀,CLI 会自动从中解析机房前缀,无需手工配置 base URL。速率限制:Marketing API 限制为 10 个并发连接外加账号级滚动限额;批量写入场景应使用
batches资源组走 Batch API,而不是并发发起大量单条请求。分页默认值:集合命令的
count默认 10、最大 1000,CLI 不自动翻页,需要全量数据时请显式翻页或使用分页工具。
十一、质量保障:测试布局
仓库为该 harness 提供了两级测试,分别位于 tests/:
- 单元测试 test_core.py:无需 API Key 即可运行。覆盖客户端地址推导与认证、
subscriber_hash归一化、缺 Key 时报错退出、基于responses库 mock 的 GET/POST/DELETE 与错误处理、分页边界、输出模块的 JSON 模式,以及大批“生成代码回归”用例(30 个资源组可导入、命令必须带--extra-params、别名与真实 HTTP 路径一致、非法 JSON 报 Click 错误而非 Traceback 等)。 - 端到端测试 test_full_e2e.py:包含 9 个真实链路用例,以是否设置
MAILCHIMP_API_KEY为门槛决定是否执行。
若你希望进一步深入命令细节,可直接阅读随包分发的完整命令参考 skills/SKILL.md(也随包安装,见 setup.py 的package_data),或查看某资源组生成源码,如 lists.py、campaigns.py。结合本文的架构说明与命令表格,你可以把cli-anything-mailchimp无缝嵌入到 Shell 脚本、CI 管道或 Agent 工具调用中,以统一的命令行界面驱动 Mailchimp 的营销自动化能力。
【免费下载链接】CLI-Anything"CLI-Anything: Making ALL Software Agent-Native" -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考