news-monitoring について
news-monitoringは、定期的なニュース検索を設定し、簡潔で順位付けされたダイジェストを届けるスキルです。トピック設定、多言語での情報源検索、結果の選別と重複排除を案内し、定期配信と単発配信に対応します。
主な機能
- 01トピック、地域、観点の設定
- 02多言語かつ時期を考慮した検索語の作成
- 03記事の選別と順位付け
- 04過去のダイジェストとの重複排除
- 05単発または定期ダイジェストの配信
活用シーン
- 01業界や政策ニュースの監視
- 02定期的なトピック別ダイジェスト作成
- 03新しい検索結果と過去版の比較
- 04チャットや文書ワークフローへの配信
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ moonlight-lupin/ agent-skills --skill news-monitoringインストール後、Claude Code で/news-monitoringを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
evals/routing-fixtures.jsonreferences/pbsa-hk-search-config.mdselfhosting-digest-config.mdweb-search-fallback.md詳細
ニュースをモニタリングしてダイジェストを配信する
定期的にトピックやニュースをモニタリングし、ウェブで最新記事を検索して、見出しのダイジェストを作成し、メッセージングチャネルやドキュメントパイプラインに配信します。
ワークフロー
ステップ 1 — トピックを定義する
ユーザーと相談し、次の項目を定義します。
- 対象:何をモニタリングするか(例:香港のPBSA、AI規制、セルフホスト用ツール)
- 地域:対象とする地域(例:香港、シンガポール、全世界)
- 観点:どの側面を追跡するか — 投資・取引、政策・規制、供給・パイプライン、稼働率・賃料、一般的な論評
- 変化の速さ:分野の動向がどれほど速いか — 許容できる記事の古さを決めます(ステップ 5 を参照)
ステップ 2 — 検索キーワードを作成する
トピックの定義に基づいて検索クエリを作成します。
- 複数の観点:観点ごとに 1 つのクエリを作成します(投資、政策、供給など)
- 複数の言語:地域ごとに英語のキーワードと現地語のキーワードを用意します
- 期間の指定:可能であればクエリに新しさを指定します(例:「2026」、「最新」)
- クエリは簡潔にします — 3~7 語が最適です。長すぎるクエリでは、結果が少なくなります。
ステップ 3 — 情報源を選ぶ
トピックと地域に応じて、重要な情報源を特定します。
- 英語の情報源:国際メディア、現地の英字メディア、業界誌
- 現地語の情報源:地域の主要言語による現地メディア — 多くの場合、こうした情報源が最初にニュースを報じます
- 業界専門の情報源:業界紙、調査機関、REIT/セクター専門サイト
- クローズドなエコシステムのプラットフォーム(小红书、抖音、微信公众号):コンテンツはウェブ検索の対象になりません。この制約を率直に伝え、手動でのモニタリングまたはサードパーティの分析ツールを選択肢として提示します。
情報源の一覧をトピックの参照ファイルに記録します(「参照ファイル」セクションを参照)。
ステップ 4 — 検索を実行する
日付の基準設定(必須)。 検索を実行する前に、モデルに実際の現在の日付を認識させます。LLM はクエリに学習データのカットオフ年を使う傾向があり、検索結果が古くなるためです。次の内容を注入します。
今日の日付は {current date as "DD Month YYYY"} です。検索クエリで年が必要な場合、または「最新」「現在」「今年」に言及する場合は、{current year} または相対的な表現を使い、学習データから年を推測してはいけません。
主な方法:ハーネスの web_search ツールを使います。
web_search(query="Hong Kong PBSA student accommodation investment 2026", limit=10)
このツールは、config.yaml で設定されているバックエンドを使用します(例:SearXNG → DDGS フォールバック)。このスキルは特定のバックエンドに依存せず、使用する検索エンジンを指定しません。ステップ 2 の各クエリについて、web_search を 1 回ずつ呼び出します。
高度な方法:ニュース専用フィルターを使う場合は、SearXNG に直接 curl します。
ニュースカテゴリのフィルタリング、言語の選択、または web_search では指定できない期間の絞り込みが必要な場合に使います。
# English news, last month
curl -sL "${SEARXNG_URL}/search?q=ENCODED_QUERY&format=json&categories=news&language=en&time_range=month"
# Chinese news, last month
curl -sL "${SEARXNG_URL}/search?q=ENCODED_ZH_QUERY&format=json&categories=news&language=zh-Hant&time_range=month"
SearXNG の主なパラメーター:
format=json— 必須(省略すると 403 が返されます)categories=news— ニュースのみを検索language=zh-Hant/language=entime_range=day|week|month|year- 結果には情報源への直接 URL が含まれます(プロキシ経由の解決は不要です)
検索エンジンがすぐには表示しない可能性がある、厳選した必須モニタリング対象の情報源には RSS フィードを使います。
curl -sL "https://example.com/feed/"
<item> ブロックから <title>、<pubDate>、<link>、<description> を解析します。
ステップ 5 — 結果の処理
すべての検索結果を確認し、以下を行います。
- 品質フィルター — ランキングを行う前に、品質の低い結果を除外します。
- 内容が薄い:ランディングページ、集約サイトの簡易ページ、または実質的な本文がないページ(記事本文が100語未満)
- 無関係:キーワードが重複していても、定義されたトピックの切り口に一致しない結果(例:トピックが港についてなのに、「port」が「transport」と一致する)
- 重複 URL:同じ記事が複数の検索結果に掲載されている場合(最初の掲載のみ残す)
- 記事ではないもの:動画のみのページ、画像掲示板、プレビューのないログイン壁
- トピック用語には単語境界マッチングを使用し、部分文字列の一致による誤判定を避けます(例:「us」が「business」と一致する)
- 重複を除去 — 複数のクエリや検索エンジンに同じ記事が掲載されている場合、1件だけ残します(完全一致 URL ではなく、タイトルの類似性で照合します)。
- ユーザーの優先順位に従って並べ替えます。
- 新しさ:新しいものを先にします(デフォルト)
- 関連性:トピックの切り口にどの程度直接一致するか
- 情報源の優先度:Tier 1 の情報源を上位にします(トピック参照ファイルを参照)
- 順位付け — 新しさ × 関連性 × 情報源の Tier に基づき、各記事に優先度/影響度スコアを割り当てます。
- 古いコンテンツにフラグを付ける — 分野の変化の速さに照らして結果が古い場合は、ユーザーに知らせます。
- 変化の速い分野(AI、暗号資産、テクノロジー規制):2〜3か月以上前の記事は古い可能性があるため、フラグを付けるか除外します。
- 変化の遅い分野(不動産、インフラ、政策):6か月以内の記事でも関連性が保たれている場合があります。
- ステップ 1 で定義した変化の速さを基準に調整します。
- フィルター — トピックの範囲外、対象地域外、または新しさのしきい値を超えた記事を除外します。
ステップ 6 — 前回のダイジェストとの比較
定期的なダイジェスト(cron ジョブ)の場合は、重複を確認します。
- cron ジョブで
context_fromを使用し、前回のダイジェストの出力をコンテキストとして挿入します(Cron Setup セクションを参照)。 - 新しい結果を前回のダイジェストと比較します。完全一致ではなく、タイトルの類似性で照合します。
- 前回の実行ですでに掲載された記事を除外します。
- ニッチなトピックや活動の少ないトピックで重複が多い場合は、対象範囲の拡大や頻度の削減を検討します。
ステップ 7 — ダイジェストの作成
順位付けと重複除去を行った結果を、読みやすいダイジェストにまとめます。
📰 [TOPIC] — Headline Digest
🗓 [Today's date as DD Mon YYYY]
1. [Date] — Source
**Headline**
1-2 line summary. Key stat or implication.
🔗 Direct source URL
2. [Date] — Source
...
---
🔑 Key themes:
- Theme 1: brief summary
- Theme 2: brief summary
書式ルール:
- すべての記事に公開日を必ず記載します。
- 見出し+1〜2行の要約(段落形式の分析にはしません)。
- 優先度/影響度の高い順に並べます。
- 情報源のリンクには 🔗 と、発行元サイトへの直接 URLを使用します。Google News のプロキシ URL や Bing の apiclick URL は使用しません。
- 過去 7 日以内の記事には 🆕 を付けます。
- 項目数の上限はデフォルトで 5 件です(トピックごとに設定可能)。古いコンテンツで水増しするのではなく、頻度を下げます。
- 下部に主要テーマの要約を記載し、優勢な傾向を一行ずつまとめます。
URL のルール:
- すべてのリンクは、発行元のウェブサイトにある記事へ直接遷移しなければなりません。
- Google News RSS リンク(
news.google.com/rss/articles/CBMi...)は protobuf でエンコードされたプロキシ URL であり、どの方法でも解決できません。Google News RSS を検索のみに使用する場合は、含める前に SearXNG のタイトル検索またはweb_searchで実際の情報源 URL を確認します。 - Bing News RSS のリンクは
apiclick.aspxリダイレクトです。url=パラメーターから実際の URL を抽出します。 - 解決できない場合は、記事を含めたうえで
⚠️ Direct link unavailable — search [SOURCE] for: [title]と記載します。
ステップ 8 — 配信
以下のいずれかの方法で、ダイジェストをユーザーに配信します。
- チャットチャネル(Telegram、WhatsApp)— 最も一般的です。cron ジョブで
deliverパラメーターを使用します(例:deliver=telegram、deliver=whatsapp:<HANDLE>)。WhatsApp では明示的な宛先が必須です。deliver=whatsappのみでは失敗します。 - ドキュメントの生成 — まとめたダイジェストをドキュメント生成スキルに渡し、書式設定された PDF、スライドデッキ、または記事を作成します。スキルは、後続のスキルが利用できるよう、ダイジェストの内容を構造化形式(markdown)で出力する必要があります。
単発のダイジェストの場合:現在のチャットで直接配信します。 定期的なダイジェストの場合:cron ジョブを設定します(下記を参照)。
ステップ 9 — Cron の設定(参考)
定期的なダイジェストの場合は、cronjob ツールを使ってスケジュールされたジョブを作成します。これは任意です。単発のダイジェストでは不要です。
主なパラメーター:
schedule:cron 式(例:隔週の午前 9 時なら0 9 1,15 * *、3 日ごとなら0 3 */3 * *)prompt:トピック、検索クエリ、ソース一覧、ダイジェストの形式、出力言語、出力に関するルールを含む、自己完結した指示deliver:配信先チャネル(telegram、whatsapp:<HANDLE>など)context_from:以前の出力をコンテキストとして注入するジョブ ID のリスト(重複排除用。通常は自己参照のため、ジョブ自身の ID を指定します)enabled_toolsets:トークンのオーバーヘッドを減らすため、["web", "terminal"]に制限します
Cron プロンプトのテンプレート:
You are a [TOPIC] news scout. Find recent articles (within the last [N] months ONLY) and compile a concise digest.
## Date grounding
Today's date is {current date}. When a search query needs a year or refers to "latest"/"current"/"this year", use {current year} or relative wording — never a year inferred from training data.
## Search
Run [N] searches using the web_search tool — one per angle, in both English and [native language]:
1. web_search("[English query 1]", limit=10)
2. web_search("[English query 2]", limit=10)
3. web_search("[Native language query 1]", limit=10)
...
If results need news-specific filtering (categories, language, time_range), use SearXNG directly:
curl -sL "${SEARXNG_URL}/search?q=ENCODED_QUERY&format=json&categories=news&language=[lang]&time_range=month"
If SearXNG is unreachable, the web_search tool will fall back automatically.
## Processing
1. Quality filter — discard thin content (landing pages, stubs, <100 words), irrelevant results (word-boundary match topic terms, not substring), duplicate URLs, and non-article pages
2. Deduplicate across queries (match by title similarity)
3. Filter: only articles from the last [N] months, directly related to [TOPIC]
4. Compare against previous digest (provided as context) — remove articles already covered
5. Sort by recency, then by relevance
6. Pick TOP [5] articles
## Output
📰 [TOPIC] — Headline Digest
🗓 [today's date]
1. **{Headline}**
📅 {DD Mon YYYY} · {Source}
{1-2 line summary}
🔗 {DIRECT article URL}
...up to [5] items
---
🔑 Key themes: {one-line takeaway}
## Rules
- Every 🔗 link MUST be a direct URL to the publisher's site
- Always include publish date
- Use 🆕 for articles from last 7 days
- Do NOT fabricate articles
- OUTPUT DISCIPLINE: Output EXACTLY ONE copy of the digest. The VERY FIRST LINE must be '📰'. The VERY LAST LINE must be the last theme bullet. No thinking, reasoning, planning, or meta-commentary.
**IMPORTANT: Write ALL output in [LANGUAGE].** Preserve original [native language] headlines as-is when the source article is in [native language].
context_from による重複排除:
cron ジョブに context_from: ["<job_id>"] を設定し(ジョブ自身の ID を使用)、実行のたびに前回のダイジェストを受け取れるようにします。プロンプトに次の指示を追加します。「コンテキストとして提供された前回のダイジェスト出力を確認してください。すでに掲載された記事は含めないでください。完全一致ではなく、タイトルの類似性で照合してください。」
頻度の調整:
- 情報量の多いトピック:毎日、または 2~3 日ごと
- 中程度のトピック:毎週
- ニッチなトピック/活動が少ないトピック:隔週(1 日と 15 日)— より多くのコンテンツが蓄積され、重複を減らせます
ソース選定の参考
香港のソース
英語: SCMP、The Standard HK、Hong Kong Business、Mingtiandi、Colliers/JLL/CBRE/Savills の調査、ResearchAndMarkets
中国語(繁体字): HK01、香港經濟日報 HKET、明報 Ming Pao、文匯報 Wen Wei Po、東方日報 on.cc、Now財經、信報 HKEJ、香港商報
業界特化: PBSA News、Global Student Living、Centurion の発表(SGX 上場の PBSA REIT)
落とし穴
- ダイジェストに日付がないと却下されます。 ユーザーはすべての項目に公開日を明記するよう明示的に求めています。
- 古い記事は却下されます。 分野の情報の移り変わりの速さに応じて厳格に絞り込み、関連性の期間を過ぎた記事にはフラグを付けるか、除外してください。
- 要約しすぎないでください。 ユーザーが求めているのは見出しと1~2行であり、段落形式の分析ではありません。
- 項目を増やしすぎないでください。 デフォルトでユーザーが求めているのは最大5項目です。古い内容で水増しするのではなく、頻度を減らしてください。
- 現地語のソースを見落とさないでください。 現地語のメディアが最初にニュースを報じることはよくあります。必ず英語と、その地域の現地語の両方で検索してください。
- クローズドなエコシステムのプラットフォームについて、利用できると約束しないでください。 小红书、抖音、微信公众号はアプリ内でしか利用できません。事前に明確に伝えてください。
- Google News RSS のリンクは解決できません。
news.google.com/rss/articles/CBMi...の URL は決して含めないでください。まず発行元の直接 URL に解決してください。 - 出力の重複 — ダイジェストが2回表示されます。 一部のモデルは「思考」中にダイジェスト全体を書き、その後もう一度出力します。対策:「OUTPUT DISCIPLINE: Output EXACTLY ONE copy.」を追加し、先頭と末尾の行を指定してください。
- 出力言語が逸脱します。 スキルに現地語の検索クエリ(入力)が含まれていると、多言語モデルがその言語で出力するよう促されていると解釈することがあります。必ず出力言語を明示し、プロンプトの先頭と末尾の両方で指定してください。
- 「必須」の RSS ソースが検索結果に押し出されます。 割り当て数(例:検索結果5件+RSS 5件)を設けるか、必須ソースごとの最低枠を保証してください。
- WhatsApp の cron 配信には明示的な宛先が必要です。
deliver=whatsappは失敗します。deliver=whatsapp:<HANDLE>または明示的なチャット ID を使用してください。 - web ツールセットを使った delegate_task は、検索中心のタスクでは信頼性に欠けます。 検索は直接実行し、自分で結果を解析してください。
- SearXNG のアドレスが変更されました。 NAS の IP が変更された場合は、
~/.hermes/.envのSEARXNG_URLと、トピック参照ファイル内の curl コマンドを更新してください。 - DDGS は Hermes の venv にインストールされています。
PYTHONPATHの小細工は不要です。ddgsCLI とfrom ddgs import DDGSはそのまま動作します。/root/.hermes/ddgs_libや/opt/hermes/.venv/bin/pythonのような古いパスは使用しないでください。
参照ファイル
references/web-search-fallback.md— Hermes のウェブ検索バックエンドの振り分け方法、現在の設定(SearXNG → DDGS フォールバック)、実行時のフォールバックパッチの詳細、環境変数の確認方法を説明しています。検索の問題をデバッグする際に読み込んでください。references/pbsa-hk-search-config.md— PBSA Hong Kong 固有の内容:検索クエリ、ソースの階層、主要テーマ、配信設定。PBSA HK のモニタリングスキャンを実行する際に読み込んでください。references/selfhosting-digest-config.md— セルフホスティングとホームラボのダイジェスト:検索クエリ、追跡必須の RSS ソース、配信設定。セルフホスティングの週次ダイジェストを実行する際に読み込んでください。
評価
evals/routing-fixtures.json には、軽量な契約フィクスチャが含まれています。サンプルリクエストから期待される振り分け(リクエストを deep-research や youtube-topic-research に振り分けるべき場合を含む)、必須のダイジェスト出力フィールド、禁止されている出力パターンを定義しています。これらは仕様であり、実際のモデルに対して実行するものではありません。リポジトリルートの tests/test_routing_fixtures.py が、フィクスチャの形式が正しく保たれ、実在するスキルに振り分けられることを検証します。