关于 ops-inbox
ops-inbox 是 Claude 插件技能,用于扫描已配置通信渠道中的近期对话,并按回复状态分类。它会在呈现待处理回复前收集对话线程和联系人背景。
主要功能
- 01跨渠道完整收件箱扫描
- 02对话状态分类
- 03收集线程与联系人背景
- 04依据沟通偏好起草回复
- 05可选并行处理渠道
适用场景
- 01检查近期邮件与聊天对话
- 02优先处理需要回复的对话
- 03准备结合上下文的回复草稿
MCP 相关
它通过已配置的 MCP 集成访问 Slack、Telegram 和 Notion,并使用命令行工具处理其他渠道。访问对话前会检查渠道可用性和身份验证状态。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ davepoon/ buildwithclaude --skill ops-inbox安装后在 Claude Code 中输入/ops-inbox确认已加载。
附带文件CHANNELS.md
详细介绍
OPS ► 收件箱清零
运行时上下文
执行前,加载可用上下文:
-
偏好设置:读取
${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.jsondefault_channels— 默认扫描哪些渠道secrets_manager/doppler— 环境变量中没有渠道凭据时,如何解析凭据
-
守护进程健康状态:读取
${CLAUDE_PLUGIN_DATA_DIR}/daemon-health.json- 检查
wacli-sync状态 — 如果未运行或需要身份验证,跳过 WhatsApp 并说明问题 - 执行任何 wacli 命令前,还要检查
~/.wacli/.health中的实时身份验证状态
- 检查
-
Ops 记忆:起草任何回复前,检查
${CLAUDE_PLUGIN_DATA_DIR}/memories/:contact_*.md— 加载你即将回复的联系人的资料preferences.md— 遵循用户的沟通风格和语言偏好topics_active.md— 检查与该联系人相关的进行中对话或截止日期donts.md— 起草回复时绝不违反这些限制
CLI/API 参考
wacli(WhatsApp)
健康状态文件 — 执行任何 wacli 命令前,检查 ~/.wacli/.health:
status=connected→ 正常继续status=needs_auth→ 提示用户:“在终端运行wacli auth,然后扫描 QR 码”status=needs_reauth→ 提示用户:“WhatsApp 会话已过期。运行wacli auth重新配对”- 文件不存在 → 改用
wacli doctor --json
| 命令 | 用法 | 输出 |
|---|---|---|
wacli doctor --json | 检查身份验证/连接/锁/FTS | {data: {authenticated, connected, lock_held, fts_enabled}} |
wacli chats list --json | 所有聊天 | {data: [{JID, Name, Kind, LastMessageTS}]} |
wacli messages list --chat "<JID>" --limit N --json | 获取聊天消息 | {data: {messages: [{FromMe, Text, Timestamp, SenderName, ChatName}]}} |
wacli messages search --query "<text>" --json | FTS 搜索 | 同上 |
wacli contacts --search "<name>" --json | 查找联系人 | 联系人对象 |
wacli send --to "<JID>" --message "<msg>" | 发送文本 | 成功/错误 |
wacli history backfill --chat="<JID>" --count=50 --requests=2 --wait=30s --idle-exit=5s --json | 获取较早的消息 | 回填结果 |
gog CLI(Gmail/Calendar)
| 命令 | 用法 | 输出 |
|---|---|---|
gog gmail search "in:inbox" --max 50 -j --results-only --no-input | 扫描整个收件箱 | 线程 JSON 数组 |
gog gmail thread get <threadId> -j | 获取包含所有消息的完整线程 | 完整消息 JSON |
gog gmail get <messageId> -j | 获取单条消息 | 消息 JSON |
gog gmail archive <messageId> ... --no-input --force | 归档消息(从收件箱中移除) | 归档结果 |
gog gmail archive --query "<gmail-query>" --max N --force | 按查询条件归档 | 归档结果 |
gog gmail send --to "<email>" --subject "<subj>" --body "<body>" | 发送电子邮件 | 发送结果 |
gog gmail send --reply-to-message-id <msgId> --reply-all --body "text" | 回复所有人 | 发送结果 |
gog gmail mark-read <messageId> ... --no-input | 标记为已读 | 结果 |
gog gmail labels list -j | 列出所有标签 | 标签 JSON |
Agent Teams 支持
如果设置了 CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1,在处理“所有渠道”模式时使用 Agent Teams。这使得:
- 渠道 Agent 可以并行运行并共享上下文(例如,WhatsApp Agent 发现一条提及电子邮件线程的消息后,电子邮件 Agent 可以优先处理该线程)
- 你可以指示 Agent:“暂时跳过 WhatsApp,先处理电子邮件”
- Agent 会按渠道报告完成情况,因此你可以在回复陆续到达时进行处理
团队设置(仅在启用该标志且处于“所有渠道”模式时):
TeamCreate("inbox-channels")
Agent(team_name="inbox-channels", name="whatsapp-scanner", ...)
Agent(team_name="inbox-channels", name="email-scanner", ...)
Agent(team_name="inbox-channels", name="slack-scanner", ...)
Agent(team_name="inbox-channels", name="telegram-scanner", ...)
Agent(team_name="inbox-channels", name="notion-scanner", ...)
每个 Agent 扫描其渠道并返回分类结果。然后,你按优先级处理所有渠道中的 NEEDS_REPLY 项目。
如果未设置该标志,则按顺序处理各渠道,或使用 fire-and-forget 子 Agent。
预先收集的数据
${CLAUDE_PLUGIN_ROOT}/../../bin/ops-unread 2>/dev/null || echo '{}'
环境变量
所有渠道凭据均来自环境变量或 CLI 身份验证,不会硬编码机密信息。
| 变量 | 默认值 | 用途 |
|---|---|---|
GMAIL_ACCOUNT | 自动检测 | gog CLI 使用的 Gmail 账号 |
SLACK_MCP_ENABLED | false | 配置 Slack MCP 服务时设为 true |
TELEGRAM_ENABLED | false | 配置 Telegram 用户身份验证 MCP 时设为 true |
NOTION_MCP_ENABLED | false | 配置 Notion MCP 集成时设为 true |
WACLI_STORE | ~/.wacli | wacli 存储目录 |
核心原则:扫描完整收件箱
不要只检查未读消息。扫描每个渠道近期的完整收件箱,并对每段对话进行分类:
核心原则:完整上下文——绝不臆测
关键安全规则——不了解情况,绝不发送: 在任何渠道起草或发送任何回复之前,必须先阅读完整的对话历史(20 条以上消息),并通过总结证明你已理解对话:
- 对话的主题是什么
- 各方分别说了什么(区分用户消息和联系人的消息)
- 联系人在最后一条消息中实际提出了什么要求/表达了什么
- 合理的回复应回应什么
要避免的失败情况: Agent 只读了最后一条消息“je kan het toch uit Klaviyo halen?”,就回复“你需要什么数据?”,这完全答非所问,因为联系人是在让用户自己提取数据(他们有双重身份验证),而不是向用户索要数据。没有完整对话记录,回复就会毫无道理,还会让联系人困惑。
硬性规则:如果你无法用 2 句话概述对话脉络,就说明你读得还不够。返回去阅读更多消息。
用户不会记得每段对话。对于你呈现的每条消息,都必须先建立完整上下文。绝不要只展示主题行,然后问“你想怎么处理?”,用户需要先了解消息的来龙去脉。
对于每条需要回复的消息,自动收集以下上下文:
- 完整的对话正文——阅读整个对话(
gog gmail thread get/wacli messages list --limit 20),而不只是最后一条消息。总结完整的对话脉络。 - 联系人资料——跨渠道搜索,建立联系人档案:
gog gmail search "from:<contact_email>" --max 10— 近期邮件记录wacli contacts --search "<name>" --json— WhatsApp 联系人信息wacli messages search --query "<name>" --json --limit 5— 近期 WhatsApp 提及记录- 如果已配置 Linear:搜索分配给此联系人或提及此联系人的问题
- 呈现:对方身份、职位/公司、最近 N 次互动、关系背景
- 主题背景——确定主题,并搜索相关对话:
gog gmail search "subject:<keywords>" --max 5— 相关邮件对话wacli messages search --query "<topic keywords>" --json --limit 5— 相关 WA 消息- 总结:主题内容、任何截止日期以及待定决策
- ops-memories(如果可用)——检查
~/.claude/plugins/data/ops-ops-marketplace/memories/,查找关于此联系人或主题的已存背景信息
呈现需要回复的消息时:
━━━ [Contact Name] — [Subject] ━━━
Who: [role, company, relationship — from contact search]
History: [last 3 interactions across channels]
Thread: [2-3 sentence summary of full conversation arc]
Last msg: [full body of their last message]
Context: [related threads/decisions/deadlines found]
Draft reply: "[contextually aware draft based on all above]"
[Send] [Edit] [Read full thread] [Skip]
起草回复时:
-
使用完整的对话历史,保持对话连贯
-
针对对方消息中的具体内容作出回应
-
匹配联系人的沟通风格(正式/随意、语言)
-
如果 ops-memories 中有该联系人的偏好,请据此处理
-
绝不要生成泛泛的回复——每份草稿都必须体现你已阅读完整对话
-
需要回复 — 对方发送了最后一条消息,正在等待你回复
-
等待中 — 你发送了最后一条消息,正在等待对方回复(无需处理)
-
已处理 — 对话已结束,可以归档
-
仅供参考 — 新闻通讯、通知、自动消息(批量归档)
渠道可用性 + 回退机制
针对每个渠道,在运行时检测其可用性:
- Email:先尝试
gogCLI。如果gog不可用,则尝试mcp__gog__gmail_*MCP 工具。如果两者都不可用,则报告不可用。 - WhatsApp:首先检查
~/.wacli/.health中的 keepalive 守护进程状态。如果status=needs_auth或status=needs_reauth,请勿尝试 wacli 命令,而是提示用户:“WhatsApp 需要重新验证身份。请在单独的终端中运行wacli auth并扫描二维码,然后输入 ‘done’。”使用AskUserQuestion:[Done — re-paired]、[Skip WhatsApp]。用户选择 Done 后,重启守护进程:launchctl kickstart -k gui/$(id -u)/com.claude-ops.wacli-keepalive,等待 5s,然后重新检查健康状态。如果健康状态文件不存在,则使用wacli doctor检查身份验证/连接状态。如果版本过旧(405 error),建议从源代码重新构建。 - Slack:只能通过 MCP 工具(
mcp__claude_ai_Slack__*)使用。检查SLACK_MCP_ENABLED环境变量。 - Telegram:只能通过用户身份验证的 MCP(tdlib/MTProto)使用。检查
TELEGRAM_ENABLED环境变量。绝不使用 BotFather 机器人。 - Discord:通过
${CLAUDE_PLUGIN_ROOT}/bin/ops-discord read <CHANNEL_ID> --limit 20 --json使用。需要DISCORD_BOT_TOKEN(v1 按频道范围提供 — 尚不支持 DM/网关)。预配置的读取列表位于${CLAUDE_PLUGIN_DATA_DIR}/preferences.json的discord.inbox_channels下(频道 ID 数组)。如果既未配置机器人令牌,也未配置读取列表,则跳过 Discord,并用一行说明(“Discord 未配置 — 请运行/ops:setup discord”),而不是提示用户 — ops-inbox 不是设置流程。规则 3 仍适用于/ops:setup。 - Notion:只能通过 MCP 工具(
mcp__claude_ai_Notion__*或可自托管的 Notion MCP)使用。检查NOTION_MCP_ENABLED环境变量。在工作区中搜索近期评论、提及和分配的任务。
你的任务
-
解析预先收集的数据,获取初始计数(未读仅作为起始信号)。
-
扫描每个渠道的全部内容(不只是未读消息):
- Email:通过
gog gmail search -a $GMAIL_ACCOUNT -j --results-only --no-input --max 30 "in:inbox"搜索in:inbox(而不是is:unread)。读取每个会话的最后一条消息,以确定最后是谁发送的。检查是否带有 DRAFT 或 SENT 标签。建议发送草稿前,先确认该会话中是否已发送过回复。 - WhatsApp:运行
wacli chats list --json获取所有聊天。筛选出未归档且LastMessageTS在最近 7 天内的聊天。对每个聊天,通过wacli messages list --chat <JID> --limit 20 --json获取完整对话(20 条消息,而非 5 条 — 需要完整会话)。解析data.messages[]中的FromMe、Text、Timestamp、ChatName字段。区分用户发送的消息(FromMe: true)和联系人发送的消息(FromMe: false)。根据最后一条消息的FromMe字段分类。 - Slack:使用 Slack MCP 工具进行搜索。检查每个会话的最后一条消息是谁发送的。
- Telegram:使用用户身份验证的 MCP(不是机器人 API)读取近期对话。
- Email:通过
-
显示完整收件箱:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPS ► INBOX MANAGER
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📱 WhatsApp [N need reply] | [N waiting] | [N archive]
📧 Email [N need reply] | [N waiting] | [N FYI]
💬 Slack [N need reply] | [N waiting]
✈️ Telegram [N need reply] | [N waiting]
──────────────────────────────────────────────────────
使用分批的 AskUserQuestion 调用(每次最多 4 个选项)。只显示已配置且有消息的渠道。如果选项总数 ≤4,则使用单次调用。
AskUserQuestion 调用 1:
[All channels (fastest — one pass)]
[WhatsApp only]
[Email only]
[More...]
AskUserQuestion 调用 2(仅当选择 “More...” 时):
[Slack only]
[Telegram only]
[Skip — already done]
如果只配置了 3 个渠道,“All channels” + 3 个渠道选项共 4 个,适合放在一次调用中。然后处理所选渠道。
处理各个渠道
WhatsApp(完整扫描 + 深入上下文)
阶段 1 — 分类:
- 获取所有聊天:
wacli chats list --json - 筛选出
LastMessageTS在过去 7 天内的聊天 - 对每个聊天,获取完整的近期对话:
wacli messages list --chat "<JID>" --limit 20 --json— 获取 20 条消息,而不是 5 条。你需要完整的对话串来理解上下文。 - 解析
data.messages[]— 字段:FromMe、Text、Timestamp、ChatName、SenderName - 对每个聊天,理解对话内容:
- 按顺序阅读所有消息。确认哪些消息的
FromMe: true(用户发送),哪些是FromMe: false(联系人发送) - 理解对话主题、讨论内容和待处理事项
- 识别用户在已发送消息中的语气和风格
- 按顺序阅读所有消息。确认哪些消息的
- 对每个聊天进行分类:
- 需要回复:最后一条消息的
FromMe: false(对方最后发送了消息) - 等待中:最后一条消息的
FromMe: true(你最后发送了消息) - 归档:旧对话、近期没有活动,或已结束
- 需要回复:最后一条消息的
阶段 2 — 为需要回复的聊天构建上下文(并行执行): 对每个需要回复的聊天:
- 完整对话摘要 — 阅读全部 20 条消息,概述对话脉络:讨论了什么、关键决定、未解决的问题
- 联系人资料 — 搜索此人:
wacli messages search --query "<contact_name>" --json --limit 10— 搜索其他聊天中的提及gog gmail search -j --results-only --no-input --max 5 "from:<name> OR to:<name>"— 搜索邮件记录- 检查
~/.claude/plugins/data/ops-ops-marketplace/memories/contact_*.md中已保存的资料 - 整理:此人的身份、关系、跨渠道沟通记录
- 主题上下文 — 从对话中提取关键词并进行搜索:
wacli messages search --query "<topic keywords>" --json --limit 5— 搜索相关的 WhatsApp 消息gog gmail search -j --results-only --no-input --max 3 "<topic keywords>"— 搜索相关邮件
- 用户的消息风格 — 根据此聊天中
FromMe: true的消息,记录:语言(NL/EN)、正式程度、表情符号使用情况、典型回复长度
阶段 3 — 提供完整上下文:
📱 WHATSAPP — NEEDS REPLY (with context)
━━━ 1. [Contact Name] ━━━
Who: [role, company, relationship — from contact search]
History: [last 3 interactions across channels]
Conversation: [2-3 sentence summary of the full chat thread]
Their message: [full text of their last message(s)]
Your last msg: [what you said before they replied]
Context: [related threads/topics found]
Language: [NL/EN — match the user's previous messages in this chat]
Draft reply: "[context-aware draft matching user's style + language]"
[Send] [Edit] [Read full thread] [More...]
If "More...":
[Archive] [Skip]
📱 WHATSAPP — WAITING (no action needed)
N. [Contact] — you said: "[your last message]" — [time ago]
Thread: [1-line summary of what you're waiting for]
对每个需要回复的聊天,使用 AskUserQuestion。
起草 WhatsApp 回复时:
- 使用与用户相同的语言(如果用户用荷兰语联系此联系人,则用荷兰语起草)
- 符合用户的风格(随意/正式、表情符号使用情况、消息长度)
- 针对联系人消息中的具体内容进行回应
- 如果 ops-memories 中有此联系人的偏好,请予以应用
- 切勿生成泛泛的回复 — 每条草稿都必须体现出你理解了完整对话
通过以下命令回复:wacli send --to "<JID>" --message "<msg>"
wacli CLI 参考(v0.5.0):
| 命令 | 用法 | 备注 |
|---|---|---|
wacli doctor | wacli doctor --json | 检查身份验证/连接/锁/FTS 状态 |
wacli auth | wacli auth | QR 配对(交互式 — 在终端中显示 QR 码) |
wacli sync | wacli sync --follow --refresh-contacts --refresh-groups | 持续同步(由 launchd keepalive 管理) |
wacli sync --once | wacli sync --once --idle-exit=10s | 单次同步,空闲时退出 |
wacli chats list | wacli chats list --json | 列出所有聊天及其 JID、Name、Kind、LastMessageTS |
wacli messages list | wacli messages list --chat "<JID>" --limit 5 --json | 消息字段:ChatJID、FromMe、Text、Timestamp、SenderName |
wacli messages search | wacli messages search --query "<text>" --json | 使用 FTS5 搜索所有消息 |
wacli contacts | wacli contacts --search "<name>" --json | 按姓名查找联系人 |
wacli send | wacli send --to "<JID>" --message "<msg>" | 发送文本消息 |
wacli history backfill | wacli history backfill --chat="<JID>" --count=50 --requests=2 --wait=30s --idle-exit=5s --json | 从手机获取较早的消息(需要 store 锁) |
健康状态文件约定(~/.wacli/.health):
在运行任何 wacli 命令之前,先读取 ~/.wacli/.health:
status=connected→ 正常继续status=needs_auth→ 提示用户:“在终端中运行wacli auth,然后扫描二维码”status=needs_reauth→ 提示用户:“WhatsApp 会话已过期。运行wacli auth重新配对”- 文件缺失 → 改为运行
wacli doctor --json
为消息为空的 @lid 聊天请求回填:
keepalive 守护进程持有存储锁,因此无法直接运行回填。请改为:
- 将 JID 写入
~/.wacli/.backfill_jids(每行一个) - 重启守护进程:
launchctl kickstart -k gui/$(id -u)/com.claude-ops.wacli-keepalive - 守护进程会在启动持久同步之前运行回填
wacli 故障排除:
@lidJID(关联设备格式)可能返回空消息 → 通过守护进程请求回填(见上文)- “Client outdated (405)” → 从源代码重新构建:
cd /tmp && git clone https://github.com/Lifecycle-Innovations-Limited/wacli.git && cd wacli && go build -o /usr/local/bin/wacli ./cmd/wacli/ - “store is locked” → keepalive 守护进程持有锁;如需释放:
launchctl bootout gui/$(id -u)/com.claude-ops.wacli-keepalive - 身份验证已过期 → 守护进程会在健康状态文件中写入
needs_auth;提示用户扫描二维码 - 密钥不同步(同步了 0 条消息)→ 守护进程会写入
needs_reauth;用户需要运行wacli auth重新配对
电子邮件(全面扫描 + 深入了解上下文)
阶段 1 — 分类:
- 通过
gog gmail search -a $GMAIL_ACCOUNT -j --results-only --no-input --max 30 "in:inbox"搜索in:inbox(不要使用is:unread) - 对每个会话,通过
gog gmail thread get -a $GMAIL_ACCOUNT <threadId> -j读取完整会话 — 阅读所有邮件,而不只是最后一封 - 检查最后一封邮件的
From标头和labelIds(SENT、DRAFT) - 分类:
- 需要回复:最后一位发件人不是你,且不存在未发送的草稿 → 需要采取行动
- 等待回复:最后一位发件人是你(SENT 标签)→ 等待对方回复
- 草稿:存在未发送的草稿 → 确认尚未发送回复,然后询问是否发送
- 供参考:新闻简报、自动通知、收据 → 批量归档
阶段 2 — 收集“需要回复”项目的上下文(并行运行): 对每个“需要回复”的会话,收集以下信息:
- 完整会话摘要 — 阅读会话中的每封邮件,总结对话脉络(谁说了什么、关键决定、未解决的问题)
- 联系人资料 — 针对发件人:
gog gmail search -j --results-only --no-input --max 10 "from:<sender_email>"— 他们最近发给你的邮件wacli contacts --search "<sender_name>" --json— WhatsApp 联系人wacli messages search --query "<sender_name>" --json --limit 5— 最近提及该联系人的 WhatsApp 消息- 整理:姓名、职位/公司、关系历史、最近 N 次互动
- 主题搜索 — 从主题和正文中提取关键词,然后:
gog gmail search -j --results-only --no-input --max 5 "subject:<keywords>"— 相关会话- 找出相关会话中的待定决定、截止日期和待办事项
阶段 3 — 提供完整上下文:
📧 EMAIL — NEEDS REPLY (with context)
━━━ 1. [Sender] — [Subject] ━━━
Who: [sender's role, company — from contact search]
History: [last 3 email exchanges with this person]
Thread summary: [2-3 sentences covering the full conversation arc]
Their message: [full body of their last message — NOT truncated]
Related: [any related threads or pending decisions found]
Draft reply: "[context-aware draft using full thread + contact history]"
[Send draft] [Edit draft] [Read full thread] [More...]
If "More...":
[Archive] [Skip]
📧 EMAIL — DRAFTS (unsent)
N. [Recipient] — [Subject] (draft ready to send)
📧 EMAIL — FYI / ARCHIVE
N. [Sender] — [Subject] (newsletter/notification)
For each NEEDS REPLY:
a) Read full thread + draft reply
b) Archive (no reply needed)
c) Skip
For FYI section:
x) Archive all FYI at once
对每封“需要回复”的邮件,使用 AskUserQuestion 提供 [Read + Reply] / [Archive] / [Skip] 选项。
回复时,先起草回复,然后使用 AskUserQuestion 确认:
Reply to [Sender] — [Subject]:
"[drafted reply]"
[Send] [Edit] [Skip]
批量归档“供参考”的邮件时,使用 AskUserQuestion:
Archive N FYI/newsletter emails?
[list of subjects]
[Archive all N] [Review each] [Skip]
使用 gog gmail send 发送草稿回复。使用 gog gmail archive <messageId> ... --no-input --force 归档。
Slack
使用 Slack MCP 工具,通过 query: "in:*"(不要使用 is:unread — 扫描最近的全部活动,而不只是未读消息)搜索提及。
对每条结果,显示频道、发件人和预览内容。阅读会话以了解上下文。
a) Read thread
b) Reply
c) Mark read / skip
Telegram(完整扫描 — 用户账号,不是机器人)
Telegram 集成必须以用户的个人账号进行身份验证(通过 tdlib/MTProto 进行用户身份验证),而不是 BotFather 机器人。目标是像通过 wacli 管理 WhatsApp 一样管理真实对话。
如果可用,请使用 Telegram 用户身份验证 MCP 服务。
- 列出最近的对话(最近 7 天)
- 对每个对话,检查谁发送了最后一条消息
- 分类:需要回复 / 等待中 / 已处理
✈️ TELEGRAM — NEEDS REPLY
1. [Contact] — [preview] — [time ago]
a) Read thread + reply
b) Archive
c) Skip
如果没有可用的 Telegram 用户身份验证工具,请报告:"Telegram 未配置 — 需要用户身份验证 MCP 服务(tdlib/MTProto)"。
Notion(MCP — 评论、提及、分配的任务)
Notion 是知识库和任务管理渠道。与消息渠道不同,Notion 的“收件箱”项目包括:
- 你拥有或提及了你的页面上的评论
- 跟踪的数据库中分配给你的任务
- 你监控的数据库中最近更新的页面
阶段 1 — 发现并扫描:
- 使用
mcp__claude_ai_Notion__notion-search搜索近期活动:- 使用宽泛查询,例如
query: ""(空字符串会返回最近的页面)或特定主题词 - 使用
filter: {"property": "object", "value": "page"}将结果限制为页面(而非数据库) - 按
last_edited_time降序排序,以显示近期活动 - 注意:Notion 搜索基于标题/内容进行全文搜索——不支持基于提及的查询或日期范围筛选
- 使用宽泛查询,例如
- 对每个结果,使用页面 URL/ID 调用
mcp__claude_ai_Notion__notion-fetch获取完整内容 - 获取活跃页面上的评论:使用页面 ID 调用
mcp__claude_ai_Notion__notion-get-comments,扫描评论作者和时间戳,判断哪些需要回复
阶段 2 — 分类:
对于有评论或提及的每个页面:
- 需要回复:有人评论或提及了你,而你尚未回复
- 等待中:最后一条评论由你发布,正在等待他人回复
- 供参考:页面已更新,但没有直接提及或需要采取的行动
- 任务:数据库中分配给你的项目(检查状态属性)
阶段 3 — 提供上下文:
📓 NOTION — NEEDS REPLY
━━━ 1. [Page Title] — [Database Name] ━━━
Page: [page URL]
Comment by: [commenter name] — [time ago]
Comment: "[full comment text]"
Page context: [2-3 sentence summary of the page content]
Draft reply: "[context-aware reply to the comment]"
[Reply] [View page] [Skip] [More...]
If "More...":
[Mark resolved] [Archive]
📓 NOTION — ASSIGNED TASKS
N. [Task title] — [database] — Status: [status] — Due: [date]
Context: [1-line summary]
📓 NOTION — RECENTLY UPDATED (FYI)
N. [Page title] — updated by [person] — [time ago]
对每个需要回复的项目使用 AskUserQuestion。
回复 Notion 评论时:
- 使用页面 ID 和回复文本调用
mcp__claude_ai_Notion__notion-create-comment - 与原评论的正式程度保持一致
- 适当时引用具体的页面内容
更新任务时:
- 使用
mcp__claude_ai_Notion__notion-update-page更改状态、添加备注 - 仅更新用户明确批准的属性
API 回退(MCP 不可用时):
如果 Notion MCP 工具失败或不可用,但已设置 NOTION_API_KEY,则回退到直接 API:
curl -s -H "Authorization: Bearer $NOTION_API_KEY" -H "Notion-Version: 2022-06-28" \
-H "Content-Type: application/json" \
-X POST https://api.notion.com/v1/search \
-d '{"sort":{"direction":"descending","timestamp":"last_edited_time"},"page_size":10}'
如果未设置 NOTION_MCP_ENABLED,或 Notion MCP 工具不可用,请报告:"Notion 未配置 — 请设置 NOTION_MCP_ENABLED=true,并通过 claude.ai 或可自托管的 MCP 添加 Notion 集成"。
Discord(v1 — REST 频道扫描)
Discord v1 支持按频道限定(通过 webhook 发送 + REST 读取)。私信和网关功能推迟到 v2 问题中处理。
- 确定读取列表:读取
${CLAUDE_PLUGIN_DATA_DIR}/preferences.json→discord.inbox_channels[]。如果列表为空且已设置DISCORD_GUILD_ID,则回退到bin/ops-discord channels --json(列出服务器的文本频道,并通过AskUserQuestion让用户选择,每次最多 4 个,遵循规则 1 — 使用[More...]分页)。 - 对每个频道 ID:
${CLAUDE_PLUGIN_ROOT}/bin/ops-discord read "<CHANNEL_ID>" --limit 20 --json - 对每个频道的近期消息进行分类:
- 需要回复:最新的非机器人消息提及了操作员(
<@user-id>)或是直接提问。 - 供参考:机器人发布的通知(CI、警报)——汇总数量并跳过。
- 需要回复:最新的非机器人消息提及了操作员(
- 如需回复,请重复使用
skills/ops-comms/SKILL.md→ Discord 发送中记载的send路径。
如果 bin/ops-discord 以状态码 1 退出,并返回 {"error":"no discord credential configured — run /ops:setup discord"},则打印一条单行说明并继续处理下一个频道——不要在收件箱流程中提示用户。
💬 DISCORD — activity (last 7d)
#channel-name [N messages] | [M need reply]
完成
处理完所有选定的渠道后,打印:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
INBOX ZERO ✓ — [timestamp]
Processed: [N] messages | Replied: [N] | Archived: [N]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
如果 $ARGUMENTS 指定了渠道(例如 whatsapp),则跳过菜单,直接进入该渠道。
原生工具用法
任务 — 收件箱进度
为正在处理的每个渠道使用 TaskCreate。随着消息被回复、归档或跳过,使用 TaskUpdate 更新状态。这样用户就能实时查看收件箱清零进度条。
Cron — 定时检查收件箱
处理完毕后,通过 AskUserQuestion 提供设置定期收件箱检查的选项:
[Schedule inbox check every 2 hours] [Schedule morning + evening] [No schedule]
如果用户选择设置,则使用 CronCreate。使用 CronList 显示现有计划。