mcpField
N
noise2blog

noise2blog

github.com/varnan-techマーケティング・グロース68744 回インストール2 週間前に更新
リポジトリ

noise2blog について

メモ、文字起こし、ツイートのまとめ、短い草稿、URL の内容を整ったブログ記事にするスキルです。Gemini で文章を生成し、設定時には Tavily の調査で主張を確認します。具体的な内容は必ず情報源に基づきます。

主な機能

  1. 01メモ、文字起こし、ツイート集、草稿、URL に対応
  2. 02入力形式と記事スタイルの判定
  3. 03設定時の Tavily による関連主張の確認
  4. 04記事、SEO メタディスクリプション、別タイトルの生成
  5. 05入力資料や調査結果に基づく主張の確認

活用シーン

  1. 01断片的なメモから公開用記事を作成
  2. 02文字起こしやツイートスレッドをブログ記事に編集
  3. 03草稿内の主張を情報源と照合

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/varnan-tech/opendirectory --skill noise2blog

インストール後、Claude Code で/noise2blogを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

.env.example
README.md
evals/
evals.json
references/
blog-format.md
output-template.md

詳細

ノイズからブログへ

箇条書き、音声の書き起こし、ツイートの寄せ集め、短い下書きなど、どんな未整理の入力からでも、洗練された公開可能なブログ記事を作成します。すべての主張は、元の素材または Tavily で検証した調査に基づいています。


重要なルール:具体的な情報を捏造しないでください。 ブログ記事内のすべての主張、指標、事例は、元の入力または Tavily の検索結果に基づいている必要があります。データ、引用、結果を決して捏造しないでください。


ステップ 1:セットアップの確認

必要な環境変数が設定されていることを確認します。

echo "GEMINI_API_KEY: ${GEMINI_API_KEY:+set}"
echo "TAVILY_API_KEY: ${TAVILY_API_KEY:-not set, Tavily enrichment will be skipped}"

GEMINI_API_KEY が設定されていない場合: 停止します。ユーザーに次のように伝えます。「GEMINI_API_KEY が必要です。aistudio.google.com → Get API key から取得し、.env ファイルに追加してください。」

TAVILY_API_KEY が設定されていない場合: 続行します。Tavily による情報の補足はスキップされることを伝えます。ブログ記事は、提供されたコンテンツのみに基づいて作成されます。個人的な体験談、経験に基づくチュートリアル、意見記事であれば問題ありません。

入力があることを確認します。 ユーザーは次のいずれかを提供する必要があります。

  • 貼り付けたテキスト(箇条書き、ラフなメモ、書き起こし、ツイートの寄せ集め、短い下書き)
  • 取得する URL

入力がない場合は、次のように尋ねます。「ラフなメモ、箇条書き、または書き起こしを共有してください。直接貼り付けるか、ソースを取得するための URL を教えてください。」


ステップ 2:入力を読み、分析する

入力が URL の場合: WebFetch を使ってページのコンテンツを取得します。タイトル、著者、公開日、本文全体、主な統計、番号付きリスト、小見出し、引用を抽出します。

入力が貼り付けられたテキストの場合: そのまま読みます。入力の種類を特定します。

  • 箇条書きまたはラフなメモ:断片的なアイデア、不完全な文、思いつくままの文章
  • 音声の書き起こし:会話調で、繰り返しやつなぎ言葉(ええと、あの、なんというか、ほらなど)があり、話が脱線しがちな文章
  • ツイートスレッドの寄せ集め:短い断片、@メンション、ハッシュタグ、「1/8」のような番号付け
  • 短い下書き:構成はあるものの内容が薄く、加筆と推敲が必要な文章

品質確認ポイント: 続行する前に、次の内容を伝えます。

  1. 特定した入力の種類
  2. 中心となる主題または主な主張を一文で
  3. 元のコンテンツから得られる、最も重要な洞察、事実、アイデアを 3~5 件
  4. 外部検証が必要な主張(ベンチマーク、統計、製品比較、調査結果)

中心となる主題を特定できない場合は、次のように尋ねます。「読者に持ち帰ってほしい、最も重要なことは何ですか?」


ステップ 3:ブログ記事のスタイルを選ぶ

スタイルは 4 種類あります。コンテンツの特徴から自動判定します。ユーザーによる指定があれば、常にそちらを優先します。

スタイル使用する場面特徴
技術チュートリアル手順を追ったガイド、やり方の説明、コードの解説番号付きの手順、コマンド、コードスニペット、コンテンツ内の「方法」に関する説明
ケーススタディ実施前後のストーリー、構築記録、学んだ教訓具体的な結果、期間、第一人称の体験談
オピニオンリーダーシップ意見、主張、直感に反する主張「私はこう考えます」、「X の問題点」、通説に反する立場、議論の提示
解説X とは何か、なぜ重要なのか、どのように機能するのか概念を軸とする説明、比較が中心の内容、「ほとんどの人が知らない」という説明

判定ロジック:

  • コンテンツに番号付きの手順やコマンドがある → 技術チュートリアル
  • コンテンツに実施前後の比較、具体的な指標、または物語の展開がある → ケーススタディ
  • コンテンツが一般的な通説に反論している、または強い意見を主張している → オピニオンリーダーシップ
  • コンテンツが、その概念、ツール、トレンドに詳しくない人向けに説明している → 解説

選んだスタイルと、その理由を伝えます。判定が難しい場合は 1 つ選び、その選択を伝えます。


ステップ 4:Tavily リサーチで情報を補強する

TAVILY_API_KEY が設定されていない場合は、このステップを黙ってスキップします。

検証やデータによる裏付けが有効な、生のコンテンツ内の主張を裏付ける証拠を検索します。候補として適しているのは、次のようなものです。

  • 製品のベンチマークやパフォーマンス数値
  • 市場統計や業界のトレンド
  • 技術的な比較(「X は Y より高速」など)
  • 引用元ではなく、ユーザーの記憶に基づいている数値

検証が必要な主張ごとに、Tavily で 1 回検索します。情報源の過剰な追加を避けるため、検索は最大 3 回に制限します。

curl -s -X POST "https://api.tavily.com/search" \
  -H "Content-Type: application/json" \
  -d '{
    "api_key": "'"$TAVILY_API_KEY"'",
    "query": "SPECIFIC_CLAIM_OR_TOPIC",
    "search_depth": "advanced",
    "max_results": 5,
    "include_answer": true
  }'

score >= 0.65 の結果を保持します。次の情報を抽出します:タイトル、URL、コンテンツの抜粋。

Tavily の検索結果を使用する際のルール:

  • 生の入力にすでに含まれている主張の裏付けや検証に使用します。検索結果からまったく新しい主張を加えてはいけません。
  • 「[出典]によると」「[X]のデータによると」のように、本文中で自然に出典を示します。
  • Tavily の検索結果で主張を裏付けられない場合は、無関係な結果で置き換えず、未検証のままにします

ステップ 5:ブログ記事を作成する

references/blog-format.md を最後まで読みます。references/output-template.md から該当するテンプレートを選択します。作成前にすべてのルールを把握します。

特殊文字を安全に扱うため、Gemini へのリクエストを一時ファイルに書き込みます。

cat > /tmp/noise2blog-request.json << 'ENDJSON'
{
  "system_instruction": {
    "parts": [{
      "text": "You are a tech writer who sounds like a real person. Rules: Active voice only. Short paragraphs, 1-3 lines max, then a blank line. Use contractions naturally (don't, won't, it's, can't, you're, they're). No em dashes — use a comma or period instead. No semicolons. Every sentence needs a concrete detail: a number, a tool name, a file name, a command, a result. No filler phrases: no 'In today's rapidly evolving', no 'Let's dive in', no 'It's worth noting', no 'In conclusion', no 'I hope this was helpful'. No banned words: incredible, amazing, leveraging, synergize, game-changing, groundbreaking, revolutionary, paradigm, cutting-edge, seamless, robust, unprecedented, delve, harness, utilize, transformative, disruptive, unlock, comprehensive, actionable, crucial, pivotal. Title must not start with I, My, or We. Open with a hook paragraph that does not announce the topic. Close with something actionable. Do not invent claims, metrics, or outcomes not present in the source material."
    }]
  },
  "contents": [{
    "parts": [{
      "text": "RAW_CONTENT_AND_INSTRUCTIONS_HERE"
    }]
  }],
  "generationConfig": {
    "temperature": 0.7,
    "maxOutputTokens": 4096
  }
}
ENDJSON

RAW_CONTENT_AND_INSTRUCTIONS_HERE を次の内容に置き換えます。

  • 生の入力コンテンツ
  • ブログ記事のスタイルと構成に関する指示(選択したテンプレートから)
  • ステップ 4 で収集した Tavily の検索結果
  • 目標文字数:800~1,800 語

リクエストを送信します。

curl -s -X POST \
  "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d @/tmp/noise2blog-request.json \
  | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['candidates'][0]['content']['parts'][0]['text'])"

次の内容も作成します。

  • (B)SEO プレビュー用の 1~2 文のメタディスクリプション
  • (C)異なる切り口のフックを使った代替タイトル 1 つ

ステップ 6:セルフ QA

すべての項目を確認し、違反があれば提示前に修正します。

  • タイトルが「I」「My」「We」で始まっていない
  • タイトルが具体的で会話調になっている(「X の包括的なガイド」「Y の究極のガイド」ではない)
  • 冒頭の段落が、トピックを予告するのではなく読者を引きつけている(「この記事では……」などではない)
  • どの行にも em ダッシュを使っていない
  • セミコロンを使っていない
  • 空行が入る前の段落が 3 行を超えていない
  • 禁止語を使っていない:incredible、amazing、leveraging、game-changing、delve、harness、unlock、groundbreaking、cutting-edge、remarkable、paradigm、revolutionize、seamless、robust、utilize、unprecedented、comprehensive、actionable、crucial、pivotal
  • データを捏造していない:すべての主張が生の入力または Tavily の検索結果に基づいている
  • 記事の末尾が「In conclusion」「To summarize」「I hope this helped」になっていない
  • 800~1,800 語(語数を明記)
  • 論理的な流れになっている:導入 → 問題/背景 → 本文の各セクション → 実践につながる締めくくり

違反があれば、提示前に修正します。最終的な語数を明記します。


ステップ 7:出力

ブログ記事全文をコードブロックで提示します。

メタディスクリプションと代替タイトルは、記事の下に記載します。

次のように質問します:「エディターにコピーできる状態にしますか? 特定のプラットフォームで公開する場合は、お知らせいただければ frontmatter をその形式に整えます。」

プラットフォーム固有のリクエストの場合:

Ghost:

---
title: "POST_TITLE"
date: YYYY-MM-DD
tags: [tag1, tag2]
status: draft
---

dev.to:

---
title: POST_TITLE
description: META_DESCRIPTION
tags: [tag1, tag2, tag3]
published: false
---

Substack:通常の Markdown として提示します。Substack のエディターは Markdown を直接インポートします。

Hashnode:

---
title: POST_TITLE
subtitle: META_DESCRIPTION
tags: [tag1, tag2]
---

コメント