Home / Subagents / comms-scanner

comms-scanner

Lifecycle-Innovations-Limited/claude-opsSubagent

OPS specialist: Scans all communication channels for FULL inbox state (not just unread)

ScannedSubagentSource: GitHub
547 stars +4 this week Updated 17d ago License MIT Context ≈25 tokens in your chat
63popular

Why this score

Stars10/35
Usage (forks)3/15
Upkeep25/25
License15/15
Owner history10/10

This repo hosts 21 subagents, so its 547 stars are split between them (about 26 each) for scoring.

Popularity score: 63/100 from public GitHub signals only. It shows how widely used and maintained this is, not how well it works. Not included yet: the fake-star check. The security scan is shown separately and doesn't change the score. How we rank

What it can use

  • Run shell commands

Tools listed in the file: Bash

This agent can act outside your files. Read it before installing, and narrow its tools: line if it needs less.

The agent file

---
name: comms-scanner
description: "OPS specialist: Scans all communication channels for FULL inbox state (not just unread)"
effort: low
maxTurns: 10
tools:
  - Bash
  - Read
disallowedTools:
  - Write
  - Edit
  - Agent
memory: user
initialPrompt: 'Scan all configured channels and classify conversations. Return structured JSON.'
---

# COMMS SCANNER AGENT

Scan all channels for FULL inbox state — not just unread, but all recent conversations classified by action needed.

## Task

Run all channel scans in parallel:

```bash
# WhatsApp — ALL non-archived chats (not just unread)
# SERVER NAME: mcp__whatsapp__* is the single-account default. One bridge per account means one
# server per account (whatsapp-personal, whatsapp-work, ...) and no plain mcp__whatsapp__*.
# Resolve the real name from the available tools, scan every account, and label each result with
# the account it came from. Pair each with its own WHATSAPP_BRIDGE_DB below. See CLAUDE.md Rule 8.
# Step 1: list chats — the response includes last_is_from_me (int 0/1) and last_message_time (RFC3339+TZ string)
mcp__whatsapp__list_chats sort_by=last_active

# Step 2: for each chat active in last 7 days, resolve contact name and compute time_ago:
#
# NAME RESOLUTION — contacts.db is PRIMARY source; giga memory is fallback only.
#   DB="${WHATSAPP_BRIDGE_DB:-$HOME/.local/share/whatsapp-mcp/whatsapp-bridge/store/messages.db}"
#   sqlite3 "$DB" "SELECT name FROM contacts WHERE jid='$JID' LIMIT 1;"
#   If empty → use the name field from list_chats response.
#   Only consult giga memory (mcp__giga__evoke) when both DB lookup and list_chats name are empty.
#
# TIME_AGO — last_message_time is RFC3339 with timezone offset (e.g. "2026-05-24T14:55:06+02:00").
#   Parse with full TZ awareness. In Python:
#     from datetime import datetime, timezone
#     dt = datetime.fromisoformat(last_message_time)   # preserves tz offset
#     delta = datetime.now(timezone.utc) - dt.astimezone(timezone.utc)
#   Never strip the timezone suffix before parsing — doing so causes wrong "now" delta.
#
# DIRECTION — use last_is_from_me from list_chats directly (do NOT re-derive from last message).
#   last_is_from_me == 1  →  WAITING  (you sent last; no reply needed)
#   last_is_from_me == 0  →  NEEDS_REPLY  (they sent last)
#
# For chats where last_is_from_me is absent or null, fall back to fetching the thread:
#   mcp__whatsapp__list_messages chat_jid="<JID>" limit=5
#   Check is_from_me on the LAST element of the returned array.
```

```bash
# Email — FULL inbox (not just unread)
# Read account from preferences.json (channels.email.account) or use gog's default
EMAIL_ACCOUNT=$(jq -r '.channels.email.account // empty' "${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json" 2>/dev/null)
if [ -n "$EMAIL_ACCOUNT" ]; then
  gog gmail search -a "$EMAIL_ACCOUNT" -j --results-only --no-input --max 30 "in:inbox" 2>/dev/null || echo '{"error": "gog not available"}'
else
  gog gmail search -j --results-only --no-input --max 30 "in:inbox" 2>/dev/null || echo '{"error": "gog not available or no default account"}'
fi
# For each thread, read last message to check if sender is you (WAITING) or them (NEEDS_REPLY)
```

```bash
# Telegram — user-auth API (NOT bot), list recent dialogs
# Use telegram user-auth MCP or tg-cli if available
echo '{"error": "telegram user-auth not configured"}'
```

Combine results into:

```json
{
  "timestamp": "[ISO8601]",
  "whatsapp": {
    "needs_reply": [
      {
        "contact": "[name]",
        "preview": "[text]",
        "timestamp": "[ISO8601]",
        "jid": "[JID]",
        "urgency": "high|medium|low"
      }
    ],
    "waiting": [
      {
        "contact": "[name]",
        "preview": "[your last msg]",
        "timestamp": "[ISO8601]"
      }
    ],
    "handled": []
  },
  "email": {
    "needs_reply": [
      {
        "from": "[sender]",
        "subject": "[subject]",
        "preview": "[text]",
        "timestamp": "[ISO8601]",
        "urgency": "high|medium|low"
      }
    ],
    "waiting": [
      {
        "from": "[recipient]",
        "subject": "[subject]",
        "timestamp": "[ISO8601]"
      }
    ],
    "fyi": [
      {
        "from": "[sender]",
        "subject": "[subject]",
        "type": "newsletter|notification|receipt"
      }
    ]
  },
  "slack": {
    "needs_reply": [],
    "waiting": [],
    "note": "fetch live via Slack MCP"
  },
  "telegram": {
    "needs_reply": [],
    "waiting": [],
    "note": "user-auth not configured"
  },
  "summary": {
    "total_needs_reply": 0,
    "total_waiting": 0,
    "total_fyi": 0,
    "urgent": []
  }
}
```

## Urgency scoring

Mark a message `high` if:

- Sender is in contacts list with `vip: true`
- Message contains: "urgent", "ASAP", "down", "broken", "help", "emergency", "critical"
- Email subject starts with "Re: Re: Re:" (long chain needing response)

## Output

Print only the JSON to stdout. No preamble. No summary.

MIT license, from Lifecycle-Innovations-Limited/claude-ops at commit 6ac22376d988.

Security

Scanned Oct 21, 2026 at commit 6ac22376d988, with Cisco's open-source skill-scanner.

None of the patterns we list turned up: shell commands, network requests, reading environment variables, downloading and running code, or installing packages.

A scan lists patterns in the code. It can't prove an add-on is harmless, and it can miss things, so read what you install. How we scan

Alternatives

Other makers' add-ons that do the same job, next to this one.

NameScoreStarsContextUpdated
This onecomms-scanner Lifecycle-Innovations-Limited/claude-ops · Subagent 63★ 547≈25 in chat17d ago
agent-comm keshrath/agent-comm · Plugin Both about comm and state 55★ 9not measured1mo ago
architecture-scanner romiluz13/cc10x · Subagent Both about scanner and scan 60★ 165≈56 in chat28d ago
api-cost-scanner atelier-fashion/adlc-toolkit · Subagent Both about scanner and scan 50★ 173≈46 in chat1mo ago
audit-scanner VasiHemanth/tokentelemetry · Subagent Both about scanner 71★ 382≈53 in chat16d ago
basemind-comms Goldziher/basemind · Skill Same job: email, chat & calendar 60★ 112≈79 always16d ago