Traul Message Search
dandaka/traul
Drives the traul CLI to sync, search and monitor messages from Slack, Telegram, Discord, Linear, Gmail, WhatsApp, Claude Code sessions and Markdown files.
Full inbox management across all channels — WhatsApp (wacli), Email (Gmail MCP), Slack (MCP), Telegram (user-auth MCP), Discord (webhook + REST read), Notion (MCP — comments, mentions, assigned…
$ npx skills add davepoon/buildwithclaude --skill ops-inbox -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install davepoon/buildwithclaude ops-inbox --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/davepoon/buildwithclaude.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/claude-ops/skills/ops-inbox .claude/skills/ops-inbox && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "ops-inbox" agent skill from https://github.com/davepoon/buildwithclaude/tree/main/plugins/claude-ops/skills/ops-inbox into .claude/skills/ops-inbox/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-inbox", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/davepoon/buildwithclaude/tree/main/plugins/claude-ops/skills/ops-inboxType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add davepoon/buildwithclaude --skill ops-inbox -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install davepoon/buildwithclaude ops-inbox --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/davepoon/buildwithclaude.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/claude-ops/skills/ops-inbox .agents/skills/ops-inbox && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ops-inbox" agent skill from https://github.com/davepoon/buildwithclaude/tree/main/plugins/claude-ops/skills/ops-inbox into .agents/skills/ops-inbox/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-inbox", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add davepoon/buildwithclaude --skill ops-inbox -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install davepoon/buildwithclaude ops-inbox --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/davepoon/buildwithclaude.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/claude-ops/skills/ops-inbox .cursor/skills/ops-inbox && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "ops-inbox" agent skill from https://github.com/davepoon/buildwithclaude/tree/main/plugins/claude-ops/skills/ops-inbox into .cursor/skills/ops-inbox/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-inbox", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/davepoon/buildwithclaude.git --path plugins/claude-ops/skills/ops-inbox--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add davepoon/buildwithclaude --skill ops-inbox -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install davepoon/buildwithclaude ops-inbox --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/davepoon/buildwithclaude.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/claude-ops/skills/ops-inbox .gemini/skills/ops-inbox && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "ops-inbox" agent skill from https://github.com/davepoon/buildwithclaude/tree/main/plugins/claude-ops/skills/ops-inbox into .gemini/skills/ops-inbox/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-inbox", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install davepoon/buildwithclaude ops-inboxInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add davepoon/buildwithclaude --skill ops-inbox -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/davepoon/buildwithclaude.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/claude-ops/skills/ops-inbox .github/skills/ops-inbox && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "ops-inbox" agent skill from https://github.com/davepoon/buildwithclaude/tree/main/plugins/claude-ops/skills/ops-inbox into .github/skills/ops-inbox/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-inbox", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add davepoon/buildwithclaude --skill ops-inbox -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install davepoon/buildwithclaude ops-inbox --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/davepoon/buildwithclaude.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/claude-ops/skills/ops-inbox .opencode/skills/ops-inbox && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "ops-inbox" agent skill from https://github.com/davepoon/buildwithclaude/tree/main/plugins/claude-ops/skills/ops-inbox into .opencode/skills/ops-inbox/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-inbox", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
ops-inboxFull inbox management across all channels — WhatsApp (wacli), Email (Gmail MCP), Slack (MCP), Telegram (user-auth MCP), Discord (webhook + REST read), Notion (MCP — comments, mentions, assigned…
Ops Inbox is an agent skill from davepoon/buildwithclaude. Full inbox management across all channels — WhatsApp (wacli), Email (Gmail MCP), Slack (MCP), Telegram (user-auth MCP), Discord (webhook + REST read), Notion (MCP — comments, mentions, assigned tasks). Scans FULL inbox (not just unread), identifies messages needing replies, archives handled conversations.
Its SKILL.md is about 7.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `CHANNELS.md`).
It sits in Productivity & Automation, covering Email management. It works with WhatsApp, Model Context Protocol, Gmail and Discord. The repository describes itself as: A single hub to find Claude Skills, Agents, Commands, Hooks, Plugins, and Marketplace collections to extend Claude Code, Claude Desktop, Agent SDK and OpenClaw. The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 10bfc43. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
BashReadGrepGlobSkillAgentAskUserQuestionTeamCreateSendMessageTaskCreate…and 14 more on the same allowed-tools line.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
curlgitgoFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
github.comapi.notion.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
NOTION_API_KEYDISCORD_BOT_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Ops Inbox loads about 7.2k tokens when it runs. Until then it costs about 79 tokens; SKILL.md has 2,997 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Bash, Read, Grep, Glob, Skill, Agent, AskUserQuestion, TeamCreate, SendMessage, TaskCreate, TaskUpdaAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from davepoon/buildwithclaude at commit 10bfc43, republished under its MIT licence (© davepoon). 2,997 words, ~7,219 tokens.
.claude/skills/ops-inbox/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Before executing, load available context:
Preferences: Read ${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json
default_channels — which channels to scan by defaultsecrets_manager / doppler — how to resolve channel credentials if not in envDaemon health: Read ${CLAUDE_PLUGIN_DATA_DIR}/daemon-health.json
wacli-sync status — if not running or auth needed, skip WhatsApp and surface the issue~/.wacli/.health for live auth status before any wacli commandOps memories: Check ${CLAUDE_PLUGIN_DATA_DIR}/memories/ before drafting any reply:
contact_*.md — load profile for the contact you're about to reply topreferences.md — apply user's communication style and language preferencestopics_active.md — check for active threads or deadlines related to this contactdonts.md — never violate these restrictions in draftsHealth file — check ~/.wacli/.health BEFORE any wacli command:
status=connected → proceed normallystatus=needs_auth → prompt user: "Run wacli auth in terminal, scan QR"status=needs_reauth → prompt user: "WhatsApp session expired. Run wacli auth to re-pair"wacli doctor --json| Command | Usage | Output |
|---|---|---|
wacli doctor --json | Check auth/connected/lock/FTS | {data: {authenticated, connected, lock_held, fts_enabled}} |
wacli chats list --json | All chats | {data: [{JID, Name, Kind, LastMessageTS}]} |
wacli messages list --chat "<JID>" --limit N --json | Messages for chat | {data: {messages: [{FromMe, Text, Timestamp, SenderName, ChatName}]}} |
wacli messages search --query "<text>" --json | FTS search | Same as above |
wacli contacts --search "<name>" --json | Contact lookup | Contact objects |
wacli send --to "<JID>" --message "<msg>" | Send text | Success/error |
wacli history backfill --chat="<JID>" --count=50 --requests=2 --wait=30s --idle-exit=5s --json | Fetch older messages | Backfill result |
| Command | Usage | Output |
|---|---|---|
gog gmail search "in:inbox" --max 50 -j --results-only --no-input | Full inbox scan | JSON array of threads |
gog gmail thread get <threadId> -j | Get full thread with all messages | Full message JSON |
gog gmail get <messageId> -j | Get single message | Message JSON |
gog gmail archive <messageId> ... --no-input --force | Archive messages (remove from inbox) | Archive result |
gog gmail archive --query "<gmail-query>" --max N --force | Archive by query | Archive result |
gog gmail send --to "<email>" --subject "<subj>" --body "<body>" | Send email | Send result |
gog gmail send --reply-to-message-id <msgId> --reply-all --body "text" | Reply all | Send result |
gog gmail mark-read <messageId> ... --no-input | Mark as read | Result |
gog gmail labels list -j | List all labels | Labels JSON |
If CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 is set, use Agent Teams when processing "all channels" mode. This enables:
Team setup (only when flag is enabled, "all channels" mode):
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", ...)Each agent scans its channel and reports back classified results. You then process NEEDS_REPLY items across all channels in priority order.
If the flag is NOT set, process channels sequentially or use fire-and-forget subagents.
${CLAUDE_PLUGIN_ROOT}/../../bin/ops-unread 2>/dev/null || echo '{}'All channel credentials come from env vars or CLI auth — no hardcoded secrets.
| Variable | Default | Purpose |
|---|---|---|
GMAIL_ACCOUNT | auto-detect | Gmail account for gog CLI |
SLACK_MCP_ENABLED | false | Set true when Slack MCP server is configured |
TELEGRAM_ENABLED | false | Set true when Telegram user-auth MCP is configured |
NOTION_MCP_ENABLED | false | Set true when Notion MCP integration is configured |
WACLI_STORE | ~/.wacli | wacli store directory |
Do NOT just check unread. Scan the FULL recent inbox for each channel and classify every conversation:
CRITICAL SAFETY RULE — NEVER SEND WITHOUT UNDERSTANDING: Before drafting or sending ANY reply on ANY channel, you MUST have read the FULL conversation history (20+ messages) and PROVEN you understand it by summarizing:
Failure mode this prevents: An agent reads only the last message "je kan het toch uit Klaviyo halen?" and replies "Welke data heb je nodig?" — completely wrong because the contact was telling the user to pull data themselves (they have 2FA), not asking for data. Without the full thread, the reply was nonsensical and confused the contact.
Hard rule: if you cannot summarize the conversation arc in 2 sentences, you have not read enough messages. Go back and read more.
The user does NOT remember every thread. For EVERY message you present, you MUST build full context BEFORE showing it. Never show just a subject line and ask "what do you want to do?" — the user needs to understand what it's about first.
For every NEEDS REPLY item, gather this context automatically:
gog gmail thread get / wacli messages list --limit 20), not just the last message. Summarize the full conversation arc.gog gmail search "from:<contact_email>" --max 10 — recent email historywacli contacts --search "<name>" --json — WhatsApp presencewacli messages search --query "<name>" --json --limit 5 — recent WhatsApp mentionsgog gmail search "subject:<keywords>" --max 5 — related email threadswacli messages search --query "<topic keywords>" --json --limit 5 — related WA messages~/.claude/plugins/data/ops-ops-marketplace/memories/ for any stored context about this contact or topicWhen presenting a NEEDS REPLY item:
━━━ [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]When drafting replies:
Use the full thread history to maintain conversation continuity
Reference specific points from their message
Match the contact's communication style (formal/casual, language)
If ops-memories has preferences for this contact, apply them
Never generate a generic reply — every draft must show you read the full thread
NEEDS REPLY — other party sent last message, awaiting your response
WAITING — you sent last message, waiting for them (no action needed)
HANDLED — conversation concluded, can be archived
FYI — newsletters, notifications, automated messages (bulk archive)
For each channel, detect availability at runtime:
gog CLI first. If gog unavailable, try mcp__gog__gmail_* MCP tools. If neither, report unavailable.~/.wacli/.health for keepalive daemon status. If status=needs_auth or status=needs_reauth, do NOT attempt wacli commands — instead prompt the user: "WhatsApp needs re-authentication. Run wacli auth in a separate terminal and scan the QR code, then type 'done'." Use AskUserQuestion: [Done — re-paired], [Skip WhatsApp]. On Done, restart the daemon: launchctl kickstart -k gui/$(id -u)/com.claude-ops.wacli-keepalive, wait 5s, re-check health. If no health file exists, fall back to wacli doctor for auth/connection status. If outdated (405 error), advise rebuilding from source.mcp__claude_ai_Slack__*). Check SLACK_MCP_ENABLED env var.TELEGRAM_ENABLED env var. Never use BotFather bots.${CLAUDE_PLUGIN_ROOT}/bin/ops-discord read <CHANNEL_ID> --limit 20 --json. Requires DISCORD_BOT_TOKEN (v1 is channel-scoped — no DM/gateway support yet). Pre-configured read list lives at ${CLAUDE_PLUGIN_DATA_DIR}/preferences.json under discord.inbox_channels (array of channel IDs). If neither a bot token nor a read list is configured, skip Discord with a one-line note ("Discord not configured — run /ops:setup discord") rather than prompting — ops-inbox is not a setup flow. Rule 3 still applies to /ops:setup.mcp__claude_ai_Notion__* or self-hosted Notion MCP). Check NOTION_MCP_ENABLED env var. Searches workspace for recent comments, mentions, and assigned tasks.Parse pre-gathered data for initial counts (unread is just a starting signal).
For each channel, run a FULL scan (not just unread):
in:inbox (not is:unread) via gog gmail search -a $GMAIL_ACCOUNT -j --results-only --no-input --max 30 "in:inbox". For each thread, read the last message to determine who sent it last. Check for DRAFT or SENT labels. Before suggesting to send a draft, verify no reply was already sent in the thread.wacli chats list --json to get all chats. Filter to non-archived chats with LastMessageTS in the last 7 days. For each, fetch the FULL conversation via wacli messages list --chat <JID> --limit 20 --json (20 messages, not 5 — you need the full thread). Parse data.messages[] with fields FromMe, Text, Timestamp, ChatName. Understand which messages are from the user (FromMe: true) vs the contact (FromMe: false). Classify by last message FromMe field.Display the full inbox:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
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]
──────────────────────────────────────────────────────Use batched AskUserQuestion calls (max 4 options each). Only show channels that are configured and have messages. If <=4 total options, use a single call.
AskUserQuestion call 1:
[All channels (fastest — one pass)]
[WhatsApp only]
[Email only]
[More...]AskUserQuestion call 2 (only if "More..."):
[Slack only]
[Telegram only]
[Skip — already done]If only 3 channels are configured, "All channels" + 3 channel options = 4, fits in one call. Then process the selected channel(s).
Phase 1 — Classify:
wacli chats list --jsonLastMessageTS in the last 7 dayswacli messages list --chat "<JID>" --limit 20 --json — get 20 messages, NOT 5. You need the full conversation thread to understand context.data.messages[] — fields: FromMe, Text, Timestamp, ChatName, SenderNameFromMe: true (user sent) vs FromMe: false (contact sent)FromMe: false (they sent last)FromMe: true (you sent last)Phase 2 — Build context for NEEDS REPLY chats (run in parallel): For each NEEDS REPLY chat:
wacli messages search --query "<contact_name>" --json --limit 10 — mentions in other chatsgog gmail search -j --results-only --no-input --max 5 "from:<name> OR to:<name>" — email history~/.claude/plugins/data/ops-ops-marketplace/memories/contact_*.md for stored profilewacli messages search --query "<topic keywords>" --json --limit 5 — related WA messagesgog gmail search -j --results-only --no-input --max 3 "<topic keywords>" — related emailsFromMe: true messages in this chat, note: language (NL/EN), formality, emoji usage, typical response lengthPhase 3 — Present with full context:
📱 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]Use AskUserQuestion for each NEEDS REPLY chat.
When drafting WhatsApp replies:
Reply via: wacli send --to "<JID>" --message "<msg>"
wacli CLI reference (v0.5.0):
| Command | Usage | Notes |
|---|---|---|
wacli doctor | wacli doctor --json | Check auth/connected/lock/FTS status |
wacli auth | wacli auth | QR pairing (interactive — shows QR in terminal) |
wacli sync | wacli sync --follow --refresh-contacts --refresh-groups | Persistent sync (managed by launchd keepalive) |
wacli sync --once | wacli sync --once --idle-exit=10s | One-shot sync, exits when idle |
wacli chats list | wacli chats list --json | All chats with JID, Name, Kind, LastMessageTS |
wacli messages list | wacli messages list --chat "<JID>" --limit 5 --json | Messages: ChatJID, FromMe, Text, Timestamp, SenderName |
wacli messages search | wacli messages search --query "<text>" --json | FTS5 search across all messages |
wacli contacts | wacli contacts --search "<name>" --json | Contact lookup by name |
wacli send | wacli send --to "<JID>" --message "<msg>" | Send text message |
wacli history backfill | wacli history backfill --chat="<JID>" --count=50 --requests=2 --wait=30s --idle-exit=5s --json | Fetch older messages from phone (needs store lock) |
Health file contract (~/.wacli/.health):
Before ANY wacli command, read ~/.wacli/.health:
status=connected → proceed normallystatus=needs_auth → prompt user: "Run wacli auth in terminal, scan QR"status=needs_reauth → prompt user: "WhatsApp session expired. Run wacli auth to re-pair"wacli doctor --jsonRequesting backfill for @lid chats with empty messages:
The keepalive daemon holds the store lock, so you can't run backfill directly. Instead:
~/.wacli/.backfill_jids (one per line)launchctl kickstart -k gui/$(id -u)/com.claude-ops.wacli-keepalivewacli troubleshooting:
@lid JIDs (linked device format) may return empty messages → request backfill via the daemon (see above)cd /tmp && git clone https://github.com/Lifecycle-Innovations-Limited/wacli.git && cd wacli && go build -o /usr/local/bin/wacli ./cmd/wacli/launchctl bootout gui/$(id -u)/com.claude-ops.wacli-keepaliveneeds_auth to health file; prompt user for QR scanneeds_reauth; user needs wacli auth re-pairPhase 1 — Classify:
in:inbox (NOT is:unread) via gog gmail search -a $GMAIL_ACCOUNT -j --results-only --no-input --max 30 "in:inbox"gog gmail thread get -a $GMAIL_ACCOUNT <threadId> -j — read ALL messages, not just the last oneFrom header and labelIds (SENT, DRAFT)Phase 2 — Build context for NEEDS REPLY items (run in parallel): For each NEEDS REPLY thread, gather:
gog gmail search -j --results-only --no-input --max 10 "from:<sender_email>" — their recent emails to youwacli contacts --search "<sender_name>" --json — WhatsApp contactwacli messages search --query "<sender_name>" --json --limit 5 — recent WhatsApp mentionsgog gmail search -j --results-only --no-input --max 5 "subject:<keywords>" — related threadsPhase 3 — Present with full context:
📧 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 onceUse AskUserQuestion for each NEEDS REPLY email with options [Read + Reply] / [Archive] / [Skip].
When replying, draft the reply and use AskUserQuestion to confirm:
Reply to [Sender] — [Subject]:
"[drafted reply]"
[Send] [Edit] [Skip]For FYI bulk archive, use AskUserQuestion:
Archive N FYI/newsletter emails?
[list of subjects]
[Archive all N] [Review each] [Skip]Draft replies via gog gmail send. Archive via gog gmail archive <messageId> ... --no-input --force.
Use Slack MCP tools with query: "in:*" (NOT is:unread — scan full recent activity, not just unread) for mentions.
For each result, show channel, sender, preview. Read thread for context.
a) Read thread
b) Reply
c) Mark read / skipTelegram integration must authenticate as the user's personal account (user-auth via tdlib/MTProto), NOT a BotFather bot. The goal is to manage real conversations just like WhatsApp via wacli.
Use the Telegram user-auth MCP server if available.
✈️ TELEGRAM — NEEDS REPLY
1. [Contact] — [preview] — [time ago]
a) Read thread + reply
b) Archive
c) SkipIf no Telegram user-auth tool is available, report: "Telegram not configured — needs user-auth MCP server (tdlib/MTProto)".
Notion serves as a knowledge base and task management channel. Unlike messaging channels, Notion "inbox" items are:
Phase 1 — Discover and scan:
mcp__claude_ai_Notion__notion-search:query: "" (empty string returns recent pages) or topic-specific termsfilter: {"property": "object", "value": "page"} to limit to pages (not databases)last_edited_time descending to surface recent activitymcp__claude_ai_Notion__notion-fetch with the page URL/IDmcp__claude_ai_Notion__notion-get-comments with the page ID — scan comment authors and timestamps to determine which need repliesPhase 2 — Classify:
For each page with comments or mentions:
Phase 3 — Present with context:
📓 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]Use AskUserQuestion for each NEEDS REPLY item.
When replying to Notion comments:
mcp__claude_ai_Notion__notion-create-comment with the page ID and reply textWhen updating tasks:
mcp__claude_ai_Notion__notion-update-page to change status, add notesAPI fallback (when MCP is down):
If Notion MCP tools fail or are unavailable but NOTION_API_KEY is set, fall back to direct 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}'If NOTION_MCP_ENABLED is not set or Notion MCP tools are unavailable, report: "Notion not configured — set NOTION_MCP_ENABLED=true and add Notion integration via claude.ai or self-hosted MCP".
Discord v1 support is channel-scoped (webhook send + REST read). DM + gateway are deferred to a v2 issue.
${CLAUDE_PLUGIN_DATA_DIR}/preferences.json → discord.inbox_channels[]. If empty and DISCORD_GUILD_ID is set, fall back to bin/ops-discord channels --json (list the guild's text channels and let the user pick via AskUserQuestion, ≤4 per Rule 1 — paginate with [More...]).${CLAUDE_PLUGIN_ROOT}/bin/ops-discord read "<CHANNEL_ID>" --limit 20 --json<@user-id>) or is a direct question.send path documented in skills/ops-comms/SKILL.md → Discord send.If bin/ops-discord exits 1 with {"error":"no discord credential configured — run /ops:setup discord"}, print a single-line note and continue to the next channel — do not prompt inside the inbox flow.
💬 DISCORD — activity (last 7d)
#channel-name [N messages] | [M need reply]After all selected channels are processed, print:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
INBOX ZERO ✓ — [timestamp]
Processed: [N] messages | Replied: [N] | Archived: [N]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━If $ARGUMENTS specifies a channel (e.g. whatsapp), skip the menu and go directly to that channel.
Use TaskCreate for each channel being processed. Update with TaskUpdate as messages are replied/archived/skipped. Gives the user a live inbox-zero progress bar.
After processing, offer to schedule recurring inbox checks via AskUserQuestion:
[Schedule inbox check every 2 hours] [Schedule morning + evening] [No schedule]Use CronCreate if selected. Show existing schedules with CronList.
© davepoon, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in plugins/claude-ops/skills/ops-inbox of davepoon/buildwithclaude.
Open the folder on GitHubat commit 10bfc43
Ops Inbox next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Ops Inbox this skilldavepoon/buildwithclaude | 3.6k | — | ~7.2k | Automated safety check: Notes | MIT | |
| Traul Message Searchdandaka/traul | 113 | — | ~3.9k | Automated safety check: Notes | AGPL-3.0 | |
| Connect Apps with ComposioComposioHQ/awesome-claude-skills | 77k | 3 repos | ~557 | Automated safety check: Pass | None | |
| Composio Cloud Toolsquarqlabs/argus | 277 | — | ~543 | Automated safety check: Pass | Apache-2.0 | |
| Setup Lanes Linklanes-sh/app | 273 | — | ~2.3k | Automated safety check: Pass | None | |
| ConnectComposioHQ/awesome-claude-skills | 77k | 3 repos | ~987 | Automated safety check: Pass | None |
dandaka/traul
Drives the traul CLI to sync, search and monitor messages from Slack, Telegram, Discord, Linear, Gmail, WhatsApp, Claude Code sessions and Markdown files.
ComposioHQ/awesome-claude-skills
Connects an agent to 1000+ external apps through the Composio Tool Router plugin, so it can actually send emails, create issues and post messages instead of only drafting them.
quarqlabs/argus
Routes requests to external SaaS apps such as GitHub, Gmail, Google Calendar, Slack, Notion and Linear through cloud tools, with safeguards on irreversible actions.
lanes-sh/app
A skill your agent uses when installing or standing up Lanes Link, the self-hostable MCP endpoint that gives an agent someone's own accounts, memory, tasks, assets, skills, identity and vault.
ComposioHQ/awesome-claude-skills
Connect Claude to any app. An agent skill from ComposioHQ/awesome-claude-skills.
ComposioHQ/composio
Route and complete Composio work across Composio For You and Composio Platform.
davepoon/buildwithclaude
A skill your agent uses when the user asks to "analyze video", "watch this video", "what happens in this video", "describe this clip", "review this footage", "classify these videos", "compare…
davepoon/buildwithclaude
Activate this agent for any future-oriented question that requires deep quantitative analysis, historical precedents, and structured scenario planning.
davepoon/buildwithclaude
Build, update, and apply iOS design specifications using Apple Human Interface Guidelines (HIG) source data.
davepoon/buildwithclaude
Download YouTube videos with customizable quality and format options.
davepoon/buildwithclaude
Discover Atlas Cloud image and video models, inspect their live schemas, and submit one confirmed media generation request with bounded GET polling.
davepoon/buildwithclaude
Toolkit for creating animated GIFs optimized for Slack, with validators for size constraints and composable animation primitives.
Categories
Full inbox management across all channels — WhatsApp (wacli), Email (Gmail MCP), Slack (MCP), Telegram (user-auth MCP), Discord (webhook + REST read), Notion (MCP — comments, mentions, assigned…. Ops Inbox is an agent skill from davepoon/buildwithclaude. Full inbox management across all channels — WhatsApp (wacli), Email (Gmail MCP), Slack (MCP), Telegram (user-auth MCP), Discord (webhook + REST read), Notion (MCP — comments, mentions, assigned tasks).
Ops Inbox fits situations like: tasks that involve Email management.
Run `npx skills add davepoon/buildwithclaude --skill ops-inbox -a claude-code`. Or copy the skill folder (plugins/claude-ops/skills/ops-inbox in davepoon/buildwithclaude) into .claude/skills/ops-inbox in your project. Claude Code loads it when a task matches its description.
Run `npx skills add davepoon/buildwithclaude --skill ops-inbox -a codex`. Or copy the skill folder (plugins/claude-ops/skills/ops-inbox in davepoon/buildwithclaude) into .agents/skills/ops-inbox in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add davepoon/buildwithclaude --skill ops-inbox -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ops-inbox, .gemini/skills/ops-inbox, .github/skills/ops-inbox and .opencode/skills/ops-inbox in your project.
Going by SKILL.md and its folder, Ops Inbox needs the command-line tools its instructions call (curl, git and go) and credentials named NOTION_API_KEY and DISCORD_BOT_TOKEN. Our summary lists: A credential in DISCORD_BOT_TOKEN. Its frontmatter pre-approves these tools: Bash, Read, Grep, Glob, Skill, Agent, AskUserQuestion, TeamCreate, SendMessage, TaskCreate, TaskUpdate, TaskList, CronCreate, CronList, mcp__gog__gmail_search, mcp__gog__gmail_read_thread, mcp__gog__gmail_send, mcp__gog__gmail_labels, mcp__claude_ai_Notion__notion-search, mcp__claude_ai_Notion__notion-fetch, mcp__claude_ai_Notion__notion-get-comments, mcp__claude_ai_Notion__notion-create-comment, mcp__claude_ai_Notion__notion-update-page, mcp__claude_ai_Notion__notion-create-pages.
SKILL.md names 2 domains. In commands or code: github.com and api.notion.com; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Ops Inbox is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 7.2k tokens (SKILL.md is roughly 29k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Ops Inbox: Traul Message Search (dandaka/traul, 113 stars), Connect Apps with Composio (ComposioHQ/awesome-claude-skills, 77k stars), Composio Cloud Tools (quarqlabs/argus, 277 stars) and Setup Lanes Link (lanes-sh/app, 273 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
davepoon (a GitHub user) maintains it in davepoon/buildwithclaude, which has 3,604 GitHub stars. The repository holds 245 skills in this directory. The repository was last updated on October 6, 2026.
Source: davepoon/buildwithclaude on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.