NewsBlog Composer について
NewsBlog Composerは、検証済みの情報源からニュース記事用の素材をまとめるMCPサーバーです。独立した2社以上の裏付けを求め、本文の執筆は利用者が選ぶモデルに委ねます。
主な機能
- 01ニュースの検証と通信社記事の判別
- 02出典URL付きの事実・引用の抽出
- 03情報源テキストからのSEOキーワード抽出
- 04SEO、AEO、定型表現のチェック
- 05JSON-LDと公開用素材の作成
- 06関連性のある内部リンクの提案
活用シーン
- 01検証済みニュースからブログ記事を作成
- 02草稿のSEOとAEOを確認
- 03記事の構造化データと公開用パッケージを準備
MCP 対応
ニュース検証、事実抽出、キーワード分析、草稿チェック、公開用パッケージ作成のツールをMCPクライアントに提供します。stdioに加え、リモートクライアント向けのHTTPにも対応しています。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx newsblog-composer-mcpTAVILY_API_KEYシークレットOptional. Search provider; keyless GDELT is used when absent.GPTZERO_API_KEYシークレットOptional. Real AI-detection reading; without it no detection score is reported.CLOUDFLARE_ACCOUNT_IDOptional. Image generation via Workers AI.CLOUDFLARE_API_TOKENシークレットOptional. Image generation via Workers AI.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
20掲載時のツール一覧 · 2 週間前に更新
このツールにパラメーターはありません。
詳細
ニュースの見出しやトピックを入力すると、記事が実在することを検証し、情報源をダウンロードして、出典を明記しながら事実を抽出し、キーワードを洗い出します。そのうえで記事を執筆し、SEO、スキーマ、バナー用プロンプト、公開用パッケージを作成します。
"Write me a blog post about <a headline from today>"
verify_news 8 independent publishers, corroborated
fetch_article_facts facts, quotes and figures, each with its source URL
seo_keywords mined from the fetched text, not invented
draft_brief structure + facts -> the article gets written
find_ai_words stock phrasing flagged with the sentence it sits in
build_publishing_pack asks YOU which of 8 banner styles you want
build_schema NewsArticle + FAQPage JSON-LD, validated
seo_audit 93/100, nothing must-fix
save_and_present the post, the checks, the image prompt, the files
Claude のサブスクリプションがなくても、コマンドラインから使えます
拡張機能、コネクター、スキルはいずれも有料の Claude プランが必要なため、無料アカウントでは使えません。これは無料で使えます。
パイプラインの処理内容をご覧ください。検証、2 社ルール、通信社記事と再共有の検出、事実の抽出、キーワードの洗い出し、SEO スコア、AEO スコア、JSON-LD、公開用パッケージは、すべて通常の Python コードで実行されます。言語モデルが必要なのは下書きの執筆という 1 つのステップだけで、使っているチャットボットを問わず、すでに無料で利用できるモデルがあります。
そのため、モデルはご自身で用意し、次の内容を貼り付けてください。
pip install newsblog-composer-mcp
newsblog setup # byline, voice, blog URL. Once.
newsblog find "ransomware attack" # what is worth writing about today
newsblog brief "<headline>" # verifies, fetches, writes brief.md
brief.md を任意のチャットボットに貼り付けます。返された内容を draft.md として保存します。続いて、次を実行します。
newsblog pack draft.md --banner hardware_macro
下書きを監査し、SEO と AEO のスコアを算出して、両方の JSON-LD ブロックを作成します。また、Blogger に貼り付けるファイルを含む、パッケージ全体を書き出します。
テクノロジー、AI、セキュリティに関する記事には API キーは不要です。同梱の報道機関フィードはキーなしで利用できます。newsblog doctor --probe --feeds を実行すると、設定内容と実際にアクセス可能なフィードを確認できます。
検証できなかった記事をもとに執筆しないことだけは、このツールではできません。それはこのエントリーポイントの制約ではなく、製品の方針です。
実際に保証すること
独立した発行元が2つそろわなければ、記事の下書きは作成しません。 通信社記事の転載を検出するため、6つの媒体が1本のReuters記事を掲載していても、6つの情報源とは見なしません。また、日付のばらつきが大きい場合は、何も警告せずに通すのではなく、信頼度を下げます。
すべての事実は、取得した情報源にたどれます。 モデルの記憶に頼ることはありません。事実、引用、数値にはsource_urlが付与され、build_schemaは、実際の発行元のURLではなくアグリゲーターへのリダイレクトになっている参照リンクを拒否します。
バナーは自分で選びます。 スタイルを選ばない限り、結果には画像プロンプトが一切含まれず、save_and_presentはパッケージを拒否します。このツールは尋ねますが、代わりに決めることはありません。
数値がなければ、投稿を渡しません。 save_and_presentは、SEO監査とAI文体チェックの両方が実行されていない限り拒否するため、完成した投稿には必ずスコアが添付されます。
スコアは1つではなく、SEOとAEOの2つです。 seo_auditは両方を返します。SEOはページ内の評価です。AEO(Answer Engine Optimisation)は、アシスタントがページから正確でそれだけで完結する回答を取り出し、引用できるかどうかを評価します。そのためには、冒頭に40~60語の回答、質問形式の見出し、短い段落、出典付きの数値、見える位置にあるFAQが必要です。キーワードではなく構成の評価であり、一方のスコアが高くても、もう一方は低い場合があります。どちらもチェックテーブルに表示されます。
自分の過去の投稿へのリンクを、妥当な場合に限って挿入します。 すべての投稿はプロフィールの隣にあるインデックスに記録され、suggest_internal_linksは共通するエンティティやキーワードの重なりをもとに、新しい下書きとの一致を調べます。関連性が基準を下回る場合は何も返しません。無関係な内部リンクは、リンクがないよりも悪いためです。これは内部リンクであり、バックリンクではありません。バックリンクは他者のサイトにあるもので、どのツールでも作成できません。
文章は機械で生成され、そのこともツールが伝えます。 検出 API キーがない場合、score_ai_textは安心させるような数値をでっち上げずにNot measuredを報告します。ローカルの文体スコアが測るのは、ありきたりな表現の密度や文のリズムであり、検出ツールがどう判定するかの予測ではありません。署名欄で人が書いたと主張するかどうかは、事情を理解したうえで自分で判断してください。下書きが未編集のまま公開されるのではなく、編集されるようにreview_draftが用意されています。
API キーなしで動作します。 すべての認証情報は必須ではなく、追加機能として利用できます。キーがない場合はこちらをご覧ください。
インストール
Claude Desktop — ワンクリック、Python 不要
-
リリースから
newsblog-composer-<version>.mcpbをダウンロードします。 -
Claude Desktop → 設定 → 拡張機能 → 詳細設定 → 拡張機能をインストール。
-
拡張機能を一度オフにしてから、オンにします。 Windows では X ボタンを押してもトレイに最小化されるだけなので、これをしないと古いサーバーが動き続けます。
-
Claude のプロジェクトの指示、またはすべてのチャットに適用するにはカスタマイズに、次の行を追加します。
ブログ投稿、記事、ニュース記事の執筆を頼んだときは、必ず NewsBlog Composer のツールを使ってください。
write_blog_postから始めてください。ウェブを検索して、自分で記事の下書きを作成しないでください。 -
投稿を依頼します。署名欄、会社名、ブログのドメインを一度尋ねられます。
手順4は省略できません。 ホストのシステムプロンプトは「ブログ記事を書いて」を「ウェブを検索して成果物を作成して」と解釈します。また、MCP サーバーのinstructionsフィールドでその解釈を覆すことはできません。サーバーが優先順位を主張する API はないためです。この行がなければ、クライアントはウェブ検索から回答し、拡張機能には触れません。サーバー名を依頼に含めれば、その場限りの依頼には対応できます。
拡張機能を使えるのはデスクトップのみです。モバイルやウェブアプリでは呼び出すものがなく、クライアントはそのことを伝えずにウェブ検索から回答します。
PyPI から
pip install newsblog-composer-mcp
これにより、stdio 経由で MCP を通信するnewsblog-mcpコマンドが利用できるようになります。
ソースから
git clone https://github.com/Mohammed-Jameal-J/newsblog-composer-mcp.git
cd newsblog-composer-mcp
python3 -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .
cp .env.example .env # optional: every value in it is optional too
クライアントに接続する前に、ネットワークに接続できることを確認してください。検索がプロキシや VPN によってブロックされている場合は、ここで確認できます。
python -m newsblog_mcp.diagnose "a headline you saw in the news today"
接続する
VS Code
ワークスペースに .vscode/mcp.json を作成します。
{
"servers": {
"newsblog": {
"type": "stdio",
"command": "newsblog-mcp"
}
}
}
ウィンドウを再読み込みしてから、エージェントモードでチャットを開きます。ツールはツールピッカーに表示されます。コマンドが PATH にない場合は、newsblog-mcp のフルパス(または venv の Python と "args": ["-m", "newsblog_mcp.server"])を指定してください。
Claude Code
プロジェクト内の .mcp.json:
{
"mcpServers": {
"newsblog": {
"command": "newsblog-mcp"
}
}
}
Claude Desktop、手動で設定する場合
Windows では %APPDATA%\Claude\claude_desktop_config.json、macOS では
~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"newsblog": {
"command": "newsblog-mcp"
}
}
}
上記の .mcpb を使えばこの設定が行われるため、より簡単です。
その他の場合
newsblog-mcp(または python -m newsblog_mcp.server)を起動し、stdio 経由で MCP 通信を行います。リモートクライアントの場合、newsblog-mcp --http でストリーミング可能な HTTP エンドポイントを提供します。詳しくは公開と接続をご覧ください。
ファイルの保存場所
ソースコードのチェックアウト以外の方法(PyPI またはワンクリックの Claude Desktop 拡張機能)でインストールした場合、サーバーはユーザーデータディレクトリに書き込むため、アップグレードしてもデータは失われません。
| Windows | %LOCALAPPDATA%\newsblog-composer-mcp |
| macOS | ~/Library/Application Support/newsblog-composer-mcp |
| Linux | ~/.local/share/newsblog-composer-mcp |
このフォルダーには、profile.json(初回起動時に設定したプロフィール)、output/(生成されたすべての投稿)、および任意の .env が保存されます。保存先を変更するには NEWSBLOG_DATA_DIR を設定します。クローンしたチェックアウトから実行した場合は、すべてコードのあるプロジェクトフォルダー内に保存されます。
特に拡張機能のインストールでは、この点が重要です。Claude Desktop はアップグレードのたびに拡張機能のフォルダー全体を置き換えるため、コードの隣に書き込まれたものは、最初の更新時にすべて削除されます。0.5.2 より前は、パッケージ化された拡張機能に pyproject.toml と src/ が含まれ、開発者用チェックアウトのように見えていたため、まさにこの問題が起きていました。現在は上記のデータディレクトリに書き込まれます。
python -m newsblog_mcp.diagnose を実行すると、インストール環境の正確なパスが表示されます。
公開と接続
Claude Desktop / Claude Code は stdio 経由で実行します。上記のインストール手順では、この設定を行います。
ChatGPT はローカルプロセスを起動できないため、stdio では接続できません。同じサーバーを HTTP 経由で実行し、HTTPS の背後にデプロイします。
newsblog-composer-mcp --http --host 0.0.0.0 --port 8000
次に ChatGPT で、Settings → Connectors → Advanced → Developer mode を選択し、https://your-host/mcp を指定して Add custom connector を選択します。カスタムコネクターを利用するには Pro、Team、Enterprise、または Edu プランが必要です。
MCP Registry への公開には、まずパッケージを PyPI に登録し、次にこのリポジトリ内の server.json を使って mcp-publisher CLI を実行する必要があります。次の 4 項目がすべて一致しないと、公開は拒否されます。
nameは、認証済みの GitHub アカウントと一致している必要があります:io.github.<username>/newsblog-composerdescriptionは 100 文字以内である必要がありますpackages[].versionは、すでに PyPI に存在するリリースである必要があります- README の単独の行に
mcp-name: <that same name>が記載されている必要があります。Registry は、PyPI がそのバージョンについて提供する説明を読み込んでパッケージの所有権を確認するため、このマーカーはリポジトリ内だけでなく、アップロードしたリリースにも含まれている必要があります。これは、このファイルの先頭にある HTML コメントです。
テスト方法
コストの低いものから、3 段階でテストします。
1. オフライン、ネットワーク接続なし — ロジックを検証します。
python tests\smoke_test.py
スキーマの整合性、SEO 監査、AI らしい語句の検出、アグリゲーターのリンク先にあるパブリッシャーの識別、クラスタリング、公開パッケージ、派生画像のコンセプト、商標フィルター、インストール手順を網羅する 272 項目のチェックです。すべて約 2 秒でパスするはずです。
2. ネットワーク — 検索が機能していることを検証します。
python -m newsblog_mcp.diagnose "a headline you saw in the news today"
プロバイダーごとの所要時間が 1 行ずつ表示され、その後に判定が表示されます。independent_publishers に複数の実在するメディアが示され、reference_candidates に実際のパブリッシャー URL が含まれていれば問題ありません。
3. 記事全体をエンドツーエンドで処理します。
python examples\build_today_example.py
ファイル内にすでにある情報を使って、実際のニュースから完全なパッケージを作成します。キーワード、スキーマ検証、AI らしい語句のチェック、人間らしさのスコア、SEO スコアを出力してから、出力フォルダーに書き込みます。正常に実行された場合の参考として使ってください。examples\build_mistral_example.py も、手書きの参考記事について同じ処理を行います。
4. Claude Desktop で、再起動した後にテストします。普段どおりに頼めばよく、ツール名を指定する必要はありません。
今日の実際の見出しについて、ブログ記事を書いてください。「<今日の実際の見出し>」
サーバーは write_blog_post を呼び出してから verify_news を呼び出し、完成したパッケージまで処理を進めます。最後に、アーティファクトとして記事を表示し、公開情報をチャットに出力します。
クライアントがウェブを検索して独自の Markdown ファイルを書く場合、拡張機能が起動していません。次の 2 点を順に確認してください。
-
Settings → Extensions で拡張機能が有効になっていることを確認します。Windows ではウィンドウを閉じてもトレイに最小化されるだけです。拡張機能をオフにしてからオンに切り替え、サーバーを再起動してください。
-
クライアントにこの拡張機能を優先するよう伝えます。 ホスト独自のシステムプロンプトは、「ブログ記事を書いて」を「ウェブを検索してアーティファクトを作成する」と解釈しがちです。また、MCP サーバーの
instructionsでそれを確実に上回ることはできません。対処するには、クライアント側で、Claude プロジェクトの指示または全般設定に次のような行を追加し、その中で作業します。ブログ記事、記事、ニュース記事の執筆を頼んだ場合は、必ず NewsBlog Composer ツールを使用してください。
write_blog_postから始めてください。ウェブを検索して自分で記事を下書きすることはしないでください。これはローカル MCP サーバーでは一般的なことです。単発の依頼なら、リクエストでサーバー名を指定しても同じように機能します。
拡張機能を使えるのはデスクトップのみです。スマートフォンやウェブアプリには呼び出せる拡張機能がないため、そのことを伝えずに、クライアントはウェブ検索に基づいて回答します。
プライバシー
サーバーはお使いのマシン上で動作します。このパッケージの作成者に情報が送信されることはなく、テレメトリーも一切ありません。
ツールの実行中に限り、お使いのマシンから外部に送信されるものは次のとおりです。
- 指定した見出しまたはトピックは、現在有効なニュース検索プロバイダーに送信されます。キーを設定していない場合は、GDELT と Bing および Google News の RSS フィードが使われます。プロバイダーキーを設定している場合は、そのプロバイダーに送信されます。
- 記事の URL は、ホストしているパブリッシャーから直接取得されます。これはブラウザーが行うのと同じリクエストです。
- 下書きのテキストが AI 検出サービスに送信されるのは、
GPTZERO_API_KEYまたはSAPLING_API_KEYを設定した場合のみです。画像生成サービスに送信されるのは、generate_imageを呼び出した場合のみです。これらのキーを設定していなければ、どちらの目的でもテキストがお使いのマシンから外部に送信されることはありません。
お使いのマシンに保存されるもの:初回実行時に設定する公開者情報(profile.json)、生成したすべての記事(output/)、設定したキー。正確なパスについては、ファイルの保存場所を参照してください。このフォルダー内のデータがどこかにアップロードされることはありません。
任意の API キーは、環境変数または拡張機能の設定パネルから読み込まれます。キーは、それぞれに対応するプロバイダーの認証にのみ使用されます。
ツール
| ツール | 機能 | キーが必要ですか? |
|---|---|---|
capabilities | 稼働中のプロバイダーと使用中のフォールバックを報告します | いいえ |
write_blog_post | 最初の窓口です。ブログ記事を頼まれたらいつでも呼び出してください。順序付けられた計画を返します | いいえ |
find_stories | トピックを今日の実際のニュースに変換し、裏付けの多さと新しさに基づいてグループ化・順位付けします | いいえ |
verify_news | ニュースプロバイダーを検索し、一致する結果を残して、独立した発行元の数を数えます | いいえ(キー不要の RSS) |
fetch_article_facts | ソースをダウンロードし、事実、出典を明記した短い引用、数値を抽出します | 不要 |
draft_brief | 執筆順序を返します:構成、出典付きの事実、キーワード、FAQ 候補 | 不要 |
review_draft | 完成した原稿を読み、公開前に弱い箇所を示します | 不要 |
humanize_text | 任意の書き換え工程です。review_draft を優先してください | 任意 |
find_ai_words | 定型的な AI 表現を、それが使われている文とともにすべて検出します | 不要 |
score_ai_text | ローカルの文体スコアです。検出ツールのキーが設定されていない場合は Not measured になります | 任意 |
generate_image | コンセプトバナーを生成します。まず商標フィルターを適用します | いいえ(ウォーターマーク付き) |
seo_keywords | 取得したソースからキーワードを抽出します。Google オートコンプリートからロングテールキーワードと FAQ の検索クエリも取得します | いいえ |
seo_audit | 完成した本文をオンページのルールに照らして評価し、修正点を返します | 不要 |
build_publishing_pack | タイトル、ラベル、パーマリンク、代替テキスト、貼り付け可能な Gemini 画像プロンプトを作成します | 不要 |
build_schema | HTML 本文と両方の JSON-LD ブロックを生成し、検証します | 不要 |
save_and_present | パッケージを output/ に書き込み、canonical/OG/Twitter タグを付けます | 不要 |
リソース:newsblog://house-style(下書き作成手順の構成と出典に関するルール)と newsblog://humanizer-rules(書き換えルール一式)。
フロー
入力内容に応じて、入り口は 2 つあります。
トピック — 「今日の AI ニュース」「電気自動車」「インドのフィンテック」などです。まだ検証する主張はないため、何が起きたのかを調べるところから始めます。
find_stories("AI", days=1)
↓ stories grouped by event, ranked by publisher count then freshness
pick one from ready_to_write, check its age_hours
verify_news(story.headline)
↓ … and continue as below
特定の見出し — verify_news から直接始めます。古い見出しには、正しく古いソースが返される点に注意してください。days は検索対象の期間を過去にさかのぼって制限します。
verify_news(title)
↓ stop here if is_legit is false
fetch_article_facts(result.fetchable_urls) # or story.fetchable_urls
↓
seo_keywords(title, [fact.text for fact in facts])
↓ primary + secondary keywords, slug, meta title/description,
and FAQ questions taken from real autocomplete data
draft_brief(headline, facts, keywords)
↓ the writer writes the draft themselves
review_draft(draft, facts) → must_fix / worth_fixing / consider
↓ the writer revises; repeat until must_fix is empty
find_ai_words(draft) → until `clean` is true
↓
build_publishing_pack(...) → title, labels, permalink, Gemini image prompt
paste the prompt into Gemini, upload the image, take the public URL
↓
build_schema(article, faq, image, references, keywords)
↓ fix anything in validation.issues, then call again
seo_audit(html_body, primary_keyword, ...)
↓ fix everything in must_fix, then call again
save_and_present(..., meta=schema.meta, pack=pack)
出力は output/ の下にあるタイムスタンプ付きフォルダーに保存されます。
| ファイル | 内容 |
|---|---|
publish-pack.md | タイトル、ラベル、カスタムパーマリンク、検索用説明文、代替テキスト、Gemini 画像プロンプト |
paste-into-blogger.html | 両方の JSON-LD ブロックと、その後にスタイル付き本文が続きます — 貼り付けるファイルです |
report.md | 検証結果、人によるスコア、AI 表現のステータス、SEO スコア、参考資料 |
index.html | メタ情報、canonical、OG、Twitter タグを含む単体プレビュー |
body.html、*.jsonld、meta.json | 各パーツを個別に格納します |
次の 3 つのガードレールは、モデル任せにせずコードで適用されます。
verify_newsは、見出しに一致する独立した発行元が少なくとも 2 つあるか、一次情報または公式ソースが 1 つある場合を除き、is_legit: falseを返します。build_schemaは、すべての不一致を列挙するvalidation.issuesを返します。たとえば、HTML と FAQPage スキーマで異なる FAQ の質問、<img>タグとNewsArticle.imageで異なる画像 URL、実際に取得した URL ではない参照などです。リストが空でなければ、公開しないでください。seo_auditは、実際に検索順位を下げる要因についてmust_fixを返します。重複した H1、冒頭にないキーワード、代替テキストのない画像、長さが適切でないメタディスクリプション、外部ソースへのリンクが 2 つ未満の場合などです。
fetch_article_facts が返すすべての項目には source_url が含まれるため、完成した記事内のどの主張も、元になったページまでたどれます。
キーがありませんか?ここから始めましょう
.env が空でも、パイプラインは最初から最後まで動作します。利用できる機能と、各キーによって変わる点を以下に示します。
| ステップ | キーなしの場合 | キーありの場合 |
|---|---|---|
| 検索 | GDELT DOC 2.0 — 公式、無料、登録不要、ニュースに特化 — 次にバックアップとして Bing/Google News RSS | Tavily / Brave / Serper / Google CSE:よりクリーンなスニペット、より高い上限 |
| 記事の抽出 | 最高品質です。trafilatura がローカルで実行されます。 | — 該当するキーはありません |
| キーワード | 最高品質です。取得したソースから抽出され、キー不要の Google オートコンプリートも利用します。 | — 有料のキーワード API を使えば検索ボリュームのデータが追加されます |
| 人間らしい文章への書き換え | ルールセットを返し、呼び出し元のモデルに書き換えを依頼します。Claude ではうまく動作しますが、ほかでは結果にばらつきがあります。 | 書き換えはサーバー側で行われ、どこでも同じ結果になります |
| 人間らしさのスコア | ローカルのヒューリスティックを使い、is_real_detector: false と表示します | 実際の検出器によるスコア |
| 画像 | 匿名の Pollinations:およそ15秒に1リクエスト、ウォーターマークが入る場合があります | Cloudflare/OpenAI/Stability:クリーンで高速 |
| スキーマ、監査、ファイル | 最高品質です。 | — 該当するキーはありません |
検索:2026年に変わった点
Brave は、もはや無料のおすすめではありません。 2026年2月、Brave は無料プランを廃止し、すべてのプランをクレジット制の課金に移行しました。カードが必要で、月額5ドルのクレジットでおよそ1,000リクエストを利用できます。それを超えると課金されます。
現在も使える無料オプションを、おすすめ順に紹介します。
- パブリッシャーのフィード — キーも登録も不要で、利用上限もなく、デフォルトで有効です。このサーバーは、テクノロジー、AI、セキュリティ分野の約50のパブリッシャーが配信するRSSフィードを直接読み込みます。これは見た目以上に重要です。ほかのキー不要のソースはどれも、読み取り不能な識別子を含む
news.google.comのリダイレクトを返すため、記事を数えることはできても開くことはできません。キーなしで実際に実行したところ、アグリゲーターが見つけた記事は29件で、このサーバーが取得可能なURLを持つものはちょうど1件だけでした。フィードの<link>は記事そのものです。制限となるのはアクセスではなく対象範囲です。リストにある媒体が取り上げていない記事は、このプロバイダーでは見つけられません。その場合はほかのプロバイダーが応答します。 - GDELT — キーも登録も不要で、実質的に上限はありません。世界規模のニュースインデックスなので、「どこかがこのニュースを報じているか」の確認に本当に適しています。これは
verify_newsがまさに尋ねていることです。無料で共有されているため、レート制限がかかることがあります。その場合、このサーバーは同じ拒否に対して再試行するのではなく、2分間待機します。 - Tavily — 月1,000クレジットで、毎月更新され、カードは不要です。このパイプラインに最適な、キーが必要なオプションです。
TAVILY_API_KEYを設定してください。 - Google Custom Search — 1日100クエリで、カードは不要です。programmablesearchengine.google.com から取得した
GOOGLE_CSE_KEYとGOOGLE_CSE_IDの両方が必要です。 - Serper — 2,500クレジットで、カードは不要ですが、1回限りです。評価には適していますが、継続的なブログ運営には向きません。
- NewsAPI — 無料プランは非商用利用のみで、最近の記事の配信も遅れます。そのため、速報ニュースには向いていません。
無料プランの内容は変わるため、利用を決める前に各プロバイダーの料金ページをご確認ください。
画像:実際に必要なもの
generate_image はキーなしで実行できますが、公開する前に以下をお読みください。
Pollinations は引き続き匿名リクエストを受け付けています。約15秒に1回、基本モデルを利用できます。ただし、無料の匿名プランでは画像に透かしが入ることがあり、公開用バナーには使えません。回避策は3つあります。費用の安い順です。
- 無料の Pollinations トークン — auth.pollinations.ai で登録します。カードは不要です。透かしがなくなり、レート制限も緩和されます。
POLLINATIONS_TOKENを設定してください。最小限の変更で、既存のプロバイダーをそのまま使えます。 - Cloudflare Workers AI(推奨) — FLUX schnell を利用でき、無料の1日あたりの利用枠があり、透かしもなく、実運用向けの API です。
IMAGE_PROVIDER=cloudflare、CLOUDFLARE_ACCOUNT_ID、CLOUDFLARE_API_TOKENを設定してください。モデルの出力は1024x1024なので、バナーの縦横比に合わせてトリミングしてください。 - OpenAI Images または Stability — 画像ごとに有料ですが、品質は最も高くなります。
どの方法を選んでも、ファイルはローカルに保存されます。アップロードして、公開されている https URL を build_schema に渡してください。そうしないと、NewsArticle.image がクローラーからアクセスできないパスを指すことになります。
キーを1つだけ追加するなら
画像用に Cloudflare(または無料の Pollinations トークン)を追加してください。検索はキーなしですでに正しく動作します。キーなしの出力を公開できないのは画像の段階です。
正直な制約
- 人間によるスコアは、何かを証明するものではありません。 公開されている AI 検出ツールには、誤検知と見逃しが実際にあり、特に短い文章や、英語を母語としない人の言い回しで顕著です。キーなしのフォールバックはそもそも検出ツールではなく、書き換えルールが対象とする構造的な特徴を測定します。あくまで方向性を示す指標として提示し、読者に数値を見せるときは必ずその旨を伝えてください。
- 商標フィルターは安全策であり、法的見解ではありません。 既知のブランド名を一般的な表現に書き換え、ロゴのリクエストをプロンプトが端末から送信される前に取り除きます。新しい名称が出てきたら
src/newsblog_mcp/providers/imagegen.pyのTRADEMARKSを拡張し、生成結果も必ず確認してください。 - 情報の新しさは自分で設定します。
find_stories(days=1)は当日の記事を対象とし、days=2がデフォルトです。verify_newsはdaysを指定しない限り、14日間を対象に検索します。3週間前の見出しを渡せば、当然ながら3週間前の情報源が返されます。 - GDELT は索引であり、編集者ではありません。 非常に幅広い媒体を索引しており、質の低い媒体も含まれるため、GDELT の「発行元」2社が一致していても、信頼できる媒体2社が一致している場合より証拠として弱くなります。
mediumの信頼度を信用する前に、sourcesのドメインを確認してください。RSS のバックアップは非公式のエンドポイントなので、予告なく形式が変わることがあります。動作しなくなった場合はdiagnoseで確認できます。 - SEO と AEO のツールが対象とするのはオンページのみです。 キーワードの関連性、構成、メタデータの長さ、代替テキスト、回答の形式、双方向のリンクを対象とします。検索ボリューム、競合状況、他のサイトから自分のサイトに向けられたリンクについては何も示しません。検索ボリュームの確認には有料のキーワード API が必要であり、他のサイトからのリンクは獲得するものであって、生成するものではありません。
- 内部リンクには過去記事の蓄積が必要です。 インデックスは空の状態から始まり、記事を公開するにつれて埋まっていくため、最初の投稿では何も提案されません。これは正常な動作であり、故障ではありません。
- 生成画像はローカルファイルです。 ファイルをアップロードして、公開されている https URL を
build_schemaに渡してください。そうしないと、NewsArticle.imageがクローラーからアクセスできないパスを指します。 - 裏付けは数えますが、判断はしません。 サーバーは独立した発行元の数を数え、日付の不一致にフラグを立てます。それらの発行元がすべて同じ通信社の記事を転載しているかどうかは、呼び出し側のモデルが判断する必要があります。
レイアウト
src/newsblog_mcp/
server.py MCP entrypoint: 20 tools, 2 resources
diagnose.py standalone connectivity check
config.py env loading, capability report
paths.py decides where this install writes, and why
textutil.py tokenising, domains, sentence splitting, slugs
providers/
search.py Tavily, Brave, Serper, Google CSE, NewsAPI, GDELT, RSS
suggest.py keyless Google autocomplete, for long-tail and FAQ queries
llm.py Anthropic / OpenAI, used only by humanize_text
detector.py GPTZero / Sapling
imagegen.py OpenAI / Stability / Cloudflare / Pollinations + trademark filter
tools/ one module per MCP tool
links.py the post index and internal-link matcher
templates/ article.html.j2
resources/ house_style.md, humanizer_patterns.md
tests/smoke_test.py offline test suite
assets/ logo artwork, make_icon.py and the six app icons
output/ generated packages, in a source checkout only - see
"Where it keeps your files" for every other install
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。