# Trend Alert

> Watch a topic list for anomalous heat spikes and push channel-formatted alerts (飞书/钉钉/企业微信/Telegram/Slack/Bark/ntfy/Email/Webhook) via trendradar MCP. Use when the user wants 异动告警/突发热点推送/监控 XX 话题/订阅热点/breakout alert/ping me when X spikes.

- **Type:** Skill
- **Install:** `agentstack add skill-asoiso-trend-radar-trend-alert`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [asoiso](https://agentstack.voostack.com/s/asoiso)
- **Installs:** 0
- **Category:** [Communication](https://agentstack.voostack.com/c/communication)
- **Latest version:** 0.1.0
- **License:** Apache-2.0
- **Upstream author:** [asoiso](https://github.com/asoiso)
- **Source:** https://github.com/asoiso/trend-radar/tree/main/trend-alert
- **Website:** https://agentskills.io

## Install

```sh
agentstack add skill-asoiso-trend-radar-trend-alert
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# trend-alert

Anomaly detection on a watchlist of topics, with channel-correct push delivery via the trendradar MCP. Each spike is verified, formatted per channel, and rate-limited before being sent.

## When to activate

Trigger when the user expresses any of:

- 异动告警 / 突发热点推送 / breakout alert
- 监控 XX 话题 / 订阅热点 / 盯盘 / 关注列表
- 推送到飞书 / 钉钉 / Telegram / Slack / Bark / 邮件 / ntfy / 企业微信 / webhook
- "ping me when X spikes" / "alert me if X breaks out" / "通知我 X 暴涨"

Do NOT activate for routine "show me trends" or recap requests — those belong to `trend-monitor` or `trend-report`.

## Workflow

1. **Resolve watchlist.** Take topics from the user message. If they reference a stored list ("我的关注列表"), look in shared memory; otherwise ask once for the explicit topics. Normalize to a deduped list of strings.

2. **Detect anomalies per topic.** For each topic in the watchlist call:
   ```
   mcp__trendradar__analyze_topic_trend(
     topic="",
     analysis_type="viral",
     spike_threshold=3.0,
     time_window=24
   )
   ```
   Run these calls in parallel where possible.

3. **Filter to real spikes.** Keep only topics whose response indicates a genuine spike (e.g. `is_spike=true`, `viral_score` above threshold, or explicit `spike_detected`). Discard noise. If nothing spikes, tell the user "无异动" and stop — do NOT push an empty alert.

4. **Discover configured channels.**
   ```
   mcp__trendradar__get_notification_channels()
   ```
   Use the returned `channels[]` to know which `id`s have `configured: true`. If the user named a channel that is not configured, surface the missing env var keys (see Edge cases) and skip that channel.

5. **Per channel: fetch format rules, format, send.** For each target channel ``:
   ```
   mcp__trendradar__get_channel_format_guide(channel="")
   ```
   Use the `guide.supported` / `guide.unsupported` / `guide.prompt` fields to format the message body. Then:
   ```
   mcp__trendradar__send_notification(
     channel="",
     title="【异动】",
     content=""
   )
   ```

6. **Enrich with cause.** For the body's "可能原因" line, call `mcp__trendradar__find_related_news(topic=...)` once per spike and use the top-1 headline. Skip if no related news returned — do not fabricate.

## Per-channel format cheatsheet

| Channel | id | Bold | Headings | Color | Link | Quote `>` | Divider `---` | Notes |
|---|---|---|---|---|---|---|---|---|
| 飞书 | `feishu` | `**b**` | no | `...` | `[t](u)` | no | yes | ~29KB; cards |
| 钉钉 | `dingtalk` | `**b**` | `### / ####` only | no | `[t](u)` | yes | yes | ~20KB; lists ok |
| 企业微信 | `wework` | `**b**` | no | no | `[t](u)` | first line only | no | 4KB; no lists/strike |
| Telegram | `telegram` | `**b**`→`` | no (`#` stripped) | no (`` stripped) | `[t](u)`→`` | yes→`` | stripped | 4096 chars; HTML |
| Slack | `slack` | `**b**`→`*b*` | no (`#` stripped) | no | `[t](u)`→`` | yes | unstable | 4KB; mrkdwn |
| Bark | `bark` | `**b**` | no | no | `[t](u)` | no | no | 3.6KB; iOS push, very short |
| ntfy | `ntfy` | `**b**` / `*i*` | client-dependent | no | `[t](u)` | yes | client-dependent | 3.8KB; lists ok |
| Email | `email` | `**b**` / `*i*` / `~~s~~` | `# / ## / ###` | no | `[t](u)` | — | yes | no hard limit; full HTML |
| Generic Webhook | `generic_webhook` | standard md | depends on receiver | depends | standard md | depends | depends | ~4KB; honors custom template |

Authoritative source: always re-read `get_channel_format_guide(channel=...)` before formatting — this table is a quick reference, not a replacement.

## Message templates

Common shape for every channel:

- **Title:** `【异动】`
- **Body lines:**
  - 当前位次 / 热度值
  - 24h 热度变化（百分比）
  - Spike 倍数（vs baseline）
  - 可能原因（来自 `find_related_news` 的 top-1 头条 + 链接）
- **Footer:** 时间戳（YYYY-MM-DD HH:mm 本地时区）+ 数据来源 `trendradar`

### 飞书 example

```
**【异动】GPT-5**

**热度暴涨 4.2×**（基线 1.1k → 当前 4.6k）
当前位次：**#3**（↑ 12 位）
24h 变化：+312%

**可能原因**
[OpenAI 开放 GPT-5 公测，附带新工具调用 API](https://example.com/news/123)

---
2026-04-29 15:42 · 来源 trendradar
```

### Telegram example

```
**【异动】GPT-5**

**热度暴涨 4.2×** （基线 `1.1k` → 当前 `4.6k`）
当前位次：**#3** （↑ 12）
24h 变化：**+312%**

> 可能原因：[OpenAI 开放 GPT-5 公测](https://example.com/news/123)

*2026-04-29 15:42 · trendradar*
```

### Bark example

```
**GPT-5 热度暴涨 4.2×**

当前 #3（↑12 位），+312% / 24h
[查看新闻](https://example.com/news/123)
```

For 钉钉 use `### 【异动】` + `> 引用` + `---`. For 企业微信 keep it terse with bold-only, no divider. For Slack use `*bold*` and `` (the MCP converts from `**` / `[t](u)` automatically). For Email you may use full `# / ##` heading hierarchy. For Webhook default to standard markdown unless the receiver has a custom template.

## Rate limiting (safe defaults)

Maintain an in-session map of `(topic, channel) → last_sent_ts`:

- **De-dupe:** do not push the same `(topic, channel)` more than once per **60 minutes** unless the user explicitly overrides ("force", "立刻推送").
- **Aggregation:** if multiple spikes for the same channel fire within a **10-minute window**, combine them into a single multi-topic message with `【异动 ×N】, , ...` as the title and one section per topic in the body.
- **Channel-specific caution:** Bark and 企业微信 enforce strict server-side rate limits — never exceed 1 push per **30 seconds** per channel; back off and aggregate if more spikes queue up.
- Persist the map in shared memory if the user wants alerts across sessions; otherwise reset per session.

## Edge cases

- **Channel not configured.** When `get_notification_channels` shows `configured: false` for a target channel, tell the user which env var keys to set (consult the `source` field and the channel's docs — typical keys: `FEISHU_WEBHOOK_URL`, `DINGTALK_WEBHOOK_URL`, `WEWORK_WEBHOOK_URL`, `TELEGRAM_BOT_TOKEN` + `TELEGRAM_CHAT_ID`, `SLACK_WEBHOOK_URL`, `BARK_DEVICE_KEY`, `NTFY_TOPIC`, `EMAIL_SMTP_*`, `GENERIC_WEBHOOK_URL`). Skip the unconfigured channel and continue with the rest.
- **`send_notification` failure.** Retry **once** after a 2s delay. If the second attempt also fails, report the failure (channel + error message) to the user and continue with remaining channels — do not abort the whole batch.
- **Empty watchlist.** Ask the user for topics; do not invent any.
- **No spikes.** Report "无异动" with the watchlist that was checked. Do not push.
- **Length overflow.** Truncate body to channel max minus 200 bytes; append `…(已截断)` and a link to the full topic page if available.
- **Title chars:** strip control chars and newlines from `` before interpolating into the title.

## Don'ts

- Don't push without a confirmed spike from `analyze_topic_trend`. Heuristic guesses are not allowed.
- Don't include speculative predictions ("将上涨", "可能爆款") in alerts — alerts state observed facts only.
- Don't dump raw JSON or tool output into the message body.
- Don't push to channels the user did not ask for, even if configured.
- Don't reuse stale `find_related_news` results across different spikes.
- Don't bypass the 60-minute de-dupe window unless the user explicitly forces it.

## See also

- `../docs/mcp-tools.md` — full MCP tool reference (analyze_topic_trend, send_notification, channel guides).
- `../trend-monitor/SKILL.md` — for routine watchlist scans without push.
- `../trend-deep-dive/SKILL.md` — when an alert needs a follow-up causal investigation.

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [asoiso](https://github.com/asoiso)
- **Source:** [asoiso/trend-radar](https://github.com/asoiso/trend-radar)
- **License:** Apache-2.0
- **Homepage:** https://agentskills.io

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-asoiso-trend-radar-trend-alert
- Seller: https://agentstack.voostack.com/s/asoiso
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
