Install
$ agentstack add skill-asoiso-trend-radar-trend-alert ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
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
- 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.
- 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.
- Filter to real spikes. Keep only topics whose response indicates a genuine spike (e.g.
is_spike=true,viral_scoreabove threshold, or explicitspike_detected). Discard noise. If nothing spikes, tell the user "无异动" and stop — do NOT push an empty alert.
- Discover configured channels.
`` mcp__trendradar__get_notification_channels() ` Use the returned channels[] to know which ids 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.
- 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="" ) ``
- 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_channelsshowsconfigured: falsefor a target channel, tell the user which env var keys to set (consult thesourcefield 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_notificationfailure. 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_newsresults 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 (analyzetopictrend, 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
- Source: asoiso/trend-radar
- License: Apache-2.0
- Homepage: https://agentskills.io
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.