mcpField
O
ops-inbox

ops-inbox

github.com/davepoon生产力3.7k73 次安装今天更新
代码仓库

关于 ops-inbox

ops-inbox 是 Claude 插件技能,用于扫描已配置通信渠道中的近期对话,并按回复状态分类。它会在呈现待处理回复前收集对话线程和联系人背景。

主要功能

  1. 01跨渠道完整收件箱扫描
  2. 02对话状态分类
  3. 03收集线程与联系人背景
  4. 04依据沟通偏好起草回复
  5. 05可选并行处理渠道

适用场景

  1. 01检查近期邮件与聊天对话
  2. 02优先处理需要回复的对话
  3. 03准备结合上下文的回复草稿

MCP 相关

它通过已配置的 MCP 集成访问 Slack、Telegram 和 Notion,并使用命令行工具处理其他渠道。访问对话前会检查渠道可用性和身份验证状态。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/davepoon/buildwithclaude --skill ops-inbox

安装后在 Claude Code 中输入/ops-inbox确认已加载。

附带文件CHANNELS.md

详细介绍

OPS ► 收件箱清零

运行时上下文

执行前,加载可用上下文:

  1. 偏好设置:读取 ${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json

    • default_channels — 默认扫描哪些渠道
    • secrets_manager / doppler — 环境变量中没有渠道凭据时,如何解析凭据
  2. 守护进程健康状态:读取 ${CLAUDE_PLUGIN_DATA_DIR}/daemon-health.json

    • 检查 wacli-sync 状态 — 如果未运行或需要身份验证,跳过 WhatsApp 并说明问题
    • 执行任何 wacli 命令前,还要检查 ~/.wacli/.health 中的实时身份验证状态
  3. 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>" --jsonFTS 搜索同上
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_ENABLEDfalse配置 Slack MCP 服务时设为 true
TELEGRAM_ENABLEDfalse配置 Telegram 用户身份验证 MCP 时设为 true
NOTION_MCP_ENABLEDfalse配置 Notion MCP 集成时设为 true
WACLI_STORE~/.wacliwacli 存储目录

核心原则:扫描完整收件箱

不要只检查未读消息。扫描每个渠道近期的完整收件箱,并对每段对话进行分类:

核心原则:完整上下文——绝不臆测

关键安全规则——不了解情况,绝不发送: 在任何渠道起草或发送任何回复之前,必须先阅读完整的对话历史(20 条以上消息),并通过总结证明你已理解对话:

  1. 对话的主题是什么
  2. 各方分别说了什么(区分用户消息和联系人的消息)
  3. 联系人在最后一条消息中实际提出了什么要求/表达了什么
  4. 合理的回复应回应什么

要避免的失败情况: Agent 只读了最后一条消息“je kan het toch uit Klaviyo halen?”,就回复“你需要什么数据?”,这完全答非所问,因为联系人是在让用户自己提取数据(他们有双重身份验证),而不是向用户索要数据。没有完整对话记录,回复就会毫无道理,还会让联系人困惑。

硬性规则:如果你无法用 2 句话概述对话脉络,就说明你读得还不够。返回去阅读更多消息。

用户不会记得每段对话。对于你呈现的每条消息,都必须先建立完整上下文。绝不要只展示主题行,然后问“你想怎么处理?”,用户需要先了解消息的来龙去脉。

对于每条需要回复的消息,自动收集以下上下文:

  1. 完整的对话正文——阅读整个对话(gog gmail thread get / wacli messages list --limit 20),而不只是最后一条消息。总结完整的对话脉络。
  2. 联系人资料——跨渠道搜索,建立联系人档案:
    • 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 次互动、关系背景
  3. 主题背景——确定主题,并搜索相关对话:
    • gog gmail search "subject:<keywords>" --max 5 — 相关邮件对话
    • wacli messages search --query "<topic keywords>" --json --limit 5 — 相关 WA 消息
    • 总结:主题内容、任何截止日期以及待定决策
  4. 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 中有该联系人的偏好,请据此处理

  • 绝不要生成泛泛的回复——每份草稿都必须体现你已阅读完整对话

  • 需要回复 — 对方发送了最后一条消息,正在等待你回复

  • 等待中 — 你发送了最后一条消息,正在等待对方回复(无需处理)

  • 已处理 — 对话已结束,可以归档

  • 仅供参考 — 新闻通讯、通知、自动消息(批量归档)

渠道可用性 + 回退机制

针对每个渠道,在运行时检测其可用性:

  1. Email:先尝试 gog CLI。如果 gog 不可用,则尝试 mcp__gog__gmail_* MCP 工具。如果两者都不可用,则报告不可用。
  2. 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),建议从源代码重新构建。
  3. Slack:只能通过 MCP 工具(mcp__claude_ai_Slack__*)使用。检查 SLACK_MCP_ENABLED 环境变量。
  4. Telegram:只能通过用户身份验证的 MCP(tdlib/MTProto)使用。检查 TELEGRAM_ENABLED 环境变量。绝不使用 BotFather 机器人。
  5. 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。
  6. Notion:只能通过 MCP 工具(mcp__claude_ai_Notion__* 或可自托管的 Notion MCP)使用。检查 NOTION_MCP_ENABLED 环境变量。在工作区中搜索近期评论、提及和分配的任务。

你的任务

  1. 解析预先收集的数据,获取初始计数(未读仅作为起始信号)。

  2. 扫描每个渠道的全部内容(不只是未读消息):

    • 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)读取近期对话。
  3. 显示完整收件箱:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 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 — 分类:

  1. 获取所有聊天:wacli chats list --json
  2. 筛选出 LastMessageTS 在过去 7 天内的聊天
  3. 对每个聊天,获取完整的近期对话:wacli messages list --chat "<JID>" --limit 20 --json — 获取 20 条消息,而不是 5 条。你需要完整的对话串来理解上下文。
  4. 解析 data.messages[] — 字段:FromMe、Text、Timestamp、ChatName、SenderName
  5. 对每个聊天,理解对话内容:
    • 按顺序阅读所有消息。确认哪些消息的 FromMe: true(用户发送),哪些是 FromMe: false(联系人发送)
    • 理解对话主题、讨论内容和待处理事项
    • 识别用户在已发送消息中的语气和风格
  6. 对每个聊天进行分类:
    • 需要回复:最后一条消息的 FromMe: false(对方最后发送了消息)
    • 等待中:最后一条消息的 FromMe: true(你最后发送了消息)
    • 归档:旧对话、近期没有活动,或已结束

阶段 2 — 为需要回复的聊天构建上下文(并行执行): 对每个需要回复的聊天:

  1. 完整对话摘要 — 阅读全部 20 条消息,概述对话脉络:讨论了什么、关键决定、未解决的问题
  2. 联系人资料 — 搜索此人:
    • 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 中已保存的资料
    • 整理:此人的身份、关系、跨渠道沟通记录
  3. 主题上下文 — 从对话中提取关键词并进行搜索:
    • wacli messages search --query "<topic keywords>" --json --limit 5 — 搜索相关的 WhatsApp 消息
    • gog gmail search -j --results-only --no-input --max 3 "<topic keywords>" — 搜索相关邮件
  4. 用户的消息风格 — 根据此聊天中 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 doctorwacli doctor --json检查身份验证/连接/锁/FTS 状态
wacli authwacli authQR 配对(交互式 — 在终端中显示 QR 码)
wacli syncwacli sync --follow --refresh-contacts --refresh-groups持续同步(由 launchd keepalive 管理)
wacli sync --oncewacli sync --once --idle-exit=10s单次同步,空闲时退出
wacli chats listwacli chats list --json列出所有聊天及其 JID、Name、Kind、LastMessageTS
wacli messages listwacli messages list --chat "<JID>" --limit 5 --json消息字段:ChatJID、FromMe、Text、Timestamp、SenderName
wacli messages searchwacli messages search --query "<text>" --json使用 FTS5 搜索所有消息
wacli contactswacli contacts --search "<name>" --json按姓名查找联系人
wacli sendwacli send --to "<JID>" --message "<msg>"发送文本消息
wacli history backfillwacli 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 守护进程持有存储锁,因此无法直接运行回填。请改为:

  1. 将 JID 写入 ~/.wacli/.backfill_jids(每行一个)
  2. 重启守护进程:launchctl kickstart -k gui/$(id -u)/com.claude-ops.wacli-keepalive
  3. 守护进程会在启动持久同步之前运行回填

wacli 故障排除:

  • @lid JID(关联设备格式)可能返回空消息 → 通过守护进程请求回填(见上文)
  • “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 — 分类:

  1. 通过 gog gmail search -a $GMAIL_ACCOUNT -j --results-only --no-input --max 30 "in:inbox" 搜索 in:inbox(不要使用 is:unread)
  2. 对每个会话,通过 gog gmail thread get -a $GMAIL_ACCOUNT <threadId> -j 读取完整会话 — 阅读所有邮件,而不只是最后一封
  3. 检查最后一封邮件的 From 标头和 labelIds(SENT、DRAFT)
  4. 分类:
    • 需要回复:最后一位发件人不是你,且不存在未发送的草稿 → 需要采取行动
    • 等待回复:最后一位发件人是你(SENT 标签)→ 等待对方回复
    • 草稿:存在未发送的草稿 → 确认尚未发送回复,然后询问是否发送
    • 供参考:新闻简报、自动通知、收据 → 批量归档

阶段 2 — 收集“需要回复”项目的上下文(并行运行): 对每个“需要回复”的会话,收集以下信息:

  1. 完整会话摘要 — 阅读会话中的每封邮件,总结对话脉络(谁说了什么、关键决定、未解决的问题)
  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 次互动
  3. 主题搜索 — 从主题和正文中提取关键词,然后:
    • 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 服务。

  1. 列出最近的对话(最近 7 天)
  2. 对每个对话,检查谁发送了最后一条消息
  3. 分类:需要回复 / 等待中 / 已处理
✈️  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 — 发现并扫描:

  1. 使用 mcp__claude_ai_Notion__notion-search 搜索近期活动:
    • 使用宽泛查询,例如 query: ""(空字符串会返回最近的页面)或特定主题词
    • 使用 filter: {"property": "object", "value": "page"} 将结果限制为页面(而非数据库)
    • 按 last_edited_time 降序排序,以显示近期活动
    • 注意:Notion 搜索基于标题/内容进行全文搜索——不支持基于提及的查询或日期范围筛选
  2. 对每个结果,使用页面 URL/ID 调用 mcp__claude_ai_Notion__notion-fetch 获取完整内容
  3. 获取活跃页面上的评论:使用页面 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 问题中处理。

  1. 确定读取列表:读取 ${CLAUDE_PLUGIN_DATA_DIR}/preferences.json → discord.inbox_channels[]。如果列表为空且已设置 DISCORD_GUILD_ID,则回退到 bin/ops-discord channels --json(列出服务器的文本频道,并通过 AskUserQuestion 让用户选择,每次最多 4 个,遵循规则 1 — 使用 [More...] 分页)。
  2. 对每个频道 ID:
    ${CLAUDE_PLUGIN_ROOT}/bin/ops-discord read "<CHANNEL_ID>" --limit 20 --json
    
  3. 对每个频道的近期消息进行分类:
    • 需要回复:最新的非机器人消息提及了操作员(<@user-id>)或是直接提问。
    • 供参考:机器人发布的通知(CI、警报)——汇总数量并跳过。
  4. 如需回复,请重复使用 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 显示现有计划。

评论

支持 Markdown