Claude CodeでRSSフィードを実装する完全ガイド: 静的サイトの配信と検証
Claude CodeでRSS 2.0/Atomを実装し、XMLエスケープ、日付、URL、多言語、検証まで整える実践ガイド。
RSSフィードは古い機能ではなく、読者との直通路になる
ブログを公開しても、読者が毎回トップページを見に来るとは限りません。検索、SNS、ニュースレター、RSSリーダー、社内ポータル、Slack通知など、記事の入口は分散しています。その中でRSSフィードは、検索アルゴリズムやSNSの表示順位に依存せず、更新情報を読者の手元へ届けられる地味に強い配信口です。
RSSは、記事タイトル、URL、概要、公開日などをXMLという機械が読みやすい形式で並べたファイルです。XMLはタグで意味を表すテキスト形式で、HTMLに似ていますが、閉じタグやエスケープのルールが厳密です。AtomはRSSに近いフィード形式で、RFC 4287として仕様化されています。初心者はまずRSS 2.0を作り、必要ならAtomも追加する順番で十分です。
この記事では、Claude Codeに「RSSを作って」と丸投げするのではなく、公式仕様、絶対URL、XMLエスケープ、日付、キャッシュ、多言語、検証まで含めて実装する流れを扱います。関連する基礎として、記事管理はClaude CodeでブログCMSを作る、検索流入はClaude Code SEO最適化、サイトマップはClaude Codeでサイトマップを生成するも合わせて読むと全体像がつながります。
一次情報は必ず確認してください。RSS 2.0はRSS Advisory BoardのRSS 2.0 Specification、AtomはIETFのRFC 4287、検証はW3C Feed Validation Service、Astroの実装はAstro公式RSSレシピを基準にします。
実務で効く4つのユースケース
1つ目は、個人ブログや技術メディアのリピート読者獲得です。RSSリーダーを使う読者は少数派に見えるかもしれませんが、開発者、研究者、編集者、情報収集が仕事の人には今も使われています。新記事をFeedlyやInoreaderで読んでもらえれば、SNSに流した投稿が埋もれても記事が届きます。
2つ目は、社内ナレッジの更新通知です。たとえば社内ドキュメント、障害報告、リリースノート、セキュリティ注意喚起をRSSにしておくと、Slack Botや社内ポータルが同じフィードを読めます。人間向けのブログページと機械向けのフィードを同じ記事データから生成できるため、二重入力を避けられます。
3つ目は、多言語サイトのSEOと再訪導線です。日本語、英語、中国語などで同じslugを持つ記事を公開している場合、/rss.xmlだけでなく/en/rss.xml、/zh/rss.xmlのように言語別フィードを用意すると、読者は自分の言語だけ購読できます。フィード内のlanguage、URL、タイトル、descriptionをロケールごとに分けることが重要です。
4つ目は、収益導線の保守です。ClaudeCodeLabのように研修、テンプレート、導入相談へつなげるサイトでは、新記事がRSSに載らないだけでリピート読者への接点が減ります。広告収益だけでなく、Claude Code研修・導入相談や商品ページへの導線も、公開後に届いて初めて意味があります。
実装前に決める仕様
Claude Codeへ依頼する前に、RSSの仕様を1枚にまとめます。ここを曖昧にすると、相対URL、壊れたXML、未来日付、古い記事順、多言語混在などの失敗が起きます。
| 項目 | 推奨 | 理由 |
|---|---|---|
| 形式 | まずRSS 2.0、必要ならAtomも追加 | 対応リーダーが多く実装が単純 |
| URL | すべて絶対URL | リーダーやクローラーが正しく解決しやすい |
| 日付 | RSSはtoUTCString()、AtomはtoISOString() | RSSはRFC 822系、AtomはRFC 3339系に寄せる |
| 本文 | 初期はdescription中心 | 全文HTMLはsanitizeと画像URL処理が必要 |
| 件数 | 20から50件 | 大きすぎると取得と検証が重くなる |
| キャッシュ | Cache-Controlを付ける | CDNとリーダーの再取得を安定させる |
| 検証 | W3C Feed Validatorと自動テスト | ブラウザ表示だけでは壊れたXMLを見逃す |
フィードの最低限の構造は、rss、channel、itemです。channelはサイト全体の情報、itemは記事1件の情報です。guidは記事を一意に識別する値で、通常は記事のパーマリンクを使えます。タイトルやdescriptionに&や<が入るとXMLが壊れるため、必ずエスケープします。
依存なしで動くRSS 2.0ジェネレーター
まずはフレームワークに依存しないNode.js版です。scripts/generate-rss.mjsとして保存し、node scripts/generate-rss.mjsでdist/rss.xmlを作れます。記事データをCMSやMDXから読む部分は、実プロジェクトに合わせて差し替えてください。
// scripts/generate-rss.mjs
import fs from "node:fs";
import path from "node:path";
const siteUrl = "https://example.com";
const outputPath = path.join(process.cwd(), "dist", "rss.xml");
const posts = [
{
title: "Claude CodeでRSSフィードを実装する",
description: "RSS 2.0フィードを安全に生成し、検証する方法を解説します。",
slug: "claude-code-rss-feed",
pubDate: "2026-06-02T09:00:00+09:00",
tags: ["Claude Code", "RSS"],
},
{
title: "Claude Codeでサイトマップを生成する",
description: "検索エンジン向けにsitemap.xmlを生成する実装例です。",
slug: "claude-code-sitemap-generation",
pubDate: "2026-05-30T09:00:00+09:00",
tags: ["Claude Code", "SEO"],
},
];
function escapeXml(value) {
return String(value ?? "")
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
function absoluteUrl(pathname) {
return new URL(pathname, siteUrl).toString();
}
function toRssDate(value) {
const date = new Date(value);
if (Number.isNaN(date.getTime())) {
throw new Error(`Invalid date: ${value}`);
}
return date.toUTCString();
}
const items = posts
.sort((a, b) => new Date(b.pubDate).getTime() - new Date(a.pubDate).getTime())
.map((post) => {
const url = absoluteUrl(`/blog/${post.slug}/`);
const categories = post.tags.map((tag) => ` <category>${escapeXml(tag)}</category>`).join("\n");
return ` <item>
<title>${escapeXml(post.title)}</title>
<link>${url}</link>
<guid isPermaLink="true">${url}</guid>
<description>${escapeXml(post.description)}</description>
<pubDate>${toRssDate(post.pubDate)}</pubDate>
${categories}
</item>`;
})
.join("\n");
const xml = `<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>ClaudeCodeLab</title>
<link>${siteUrl}/</link>
<description>Claude Codeの実装ガイドと運用ノウハウ</description>
<language>ja</language>
<lastBuildDate>${new Date().toUTCString()}</lastBuildDate>
<ttl>60</ttl>
${items}
</channel>
</rss>
`;
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
fs.writeFileSync(outputPath, xml, "utf8");
console.log(`Generated ${outputPath}`);
このコードの要点は3つです。escapeXmlでXMLを壊す文字を変換すること、new URL()で絶対URLを作ること、日付の不正値を例外にすることです。Claude Codeには「この3点を消さない」と明記してレビューさせます。
Astroなら@astrojs/rssで始める
Astroサイトでは公式パッケージの@astrojs/rssを使うと、RSS 2.0の骨組みを安全に作れます。astro.config.mjsにsiteが設定されていることを確認してから、src/pages/rss.xml.tsを作ります。
npm install @astrojs/rss
// src/pages/rss.xml.ts
import rss from "@astrojs/rss";
import { getCollection } from "astro:content";
export async function GET(context: { site: URL }) {
const posts = await getCollection("blog", ({ data }) => !data.draft);
const items = posts
.sort((a, b) => {
const aDate = new Date(a.data.updatedDate ?? a.data.pubDate).getTime();
const bDate = new Date(b.data.updatedDate ?? b.data.pubDate).getTime();
return bDate - aDate;
})
.slice(0, 30)
.map((post) => ({
title: post.data.title,
description: post.data.description,
pubDate: post.data.updatedDate ?? post.data.pubDate,
link: `/blog/${post.id}/`,
categories: post.data.tags,
}));
return rss({
title: "ClaudeCodeLab",
description: "Claude Codeの実装ガイドと運用ノウハウ",
site: context.site,
items,
customData: "<language>ja</language><ttl>60</ttl>",
});
}
全文HTMLをRSSに入れたい場合は、MarkdownをHTML化してsanitizeする必要があります。sanitizeは、外部入力やMDX由来のHTMLから危険なタグや属性を落とす処理です。最初から全文配信にすると、相対画像、広告スクリプト、埋め込みコンポーネントが壊れやすいので、初心者はdescription配信から始めるのが現実的です。
HTMLのheadには自動検出用のリンクを入れます。これがあると、ブラウザ拡張やリーダーがフィードを見つけやすくなります。
<link rel="alternate" type="application/rss+xml" title="ClaudeCodeLab RSS" href="/rss.xml" />
<link rel="alternate" type="application/atom+xml" title="ClaudeCodeLab Atom" href="/atom.xml" />
Atomと多言語フィードの考え方
Atomを出す場合は、feed、entry、id、updatedを安定させます。Atomの日付はISO 8601形式、つまりJavaScriptならtoISOString()が扱いやすいです。
function atomEntry(post, siteUrl) {
const url = new URL(`/blog/${post.slug}/`, siteUrl).toString();
const updated = new Date(post.pubDate).toISOString();
return ` <entry>
<title>${escapeXml(post.title)}</title>
<link href="${url}" />
<id>${url}</id>
<updated>${updated}</updated>
<summary>${escapeXml(post.description)}</summary>
</entry>`;
}
多言語サイトでは、フィード生成をロケール設定で分けます。blog-enなら/en/rss.xml、blog-zhなら/zh/rss.xmlのように、コレクション名、URL prefix、languageを対応させます。
const feeds = [
{ collection: "blog", prefix: "", language: "ja", title: "ClaudeCodeLab" },
{ collection: "blog-en", prefix: "/en", language: "en", title: "ClaudeCodeLab English" },
{ collection: "blog-zh", prefix: "/zh", language: "zh", title: "ClaudeCodeLab 中文" },
];
ここでよくある失敗は、日本語記事のURLを英語フィードに入れてしまうことです。タイトルだけ翻訳されていても、リンク先が別言語なら読者体験は壊れます。Claude Codeには「各localeのcollection、prefix、langが一致しているか」をレビュー条件に入れます。
検証、キャッシュ、失敗例
生成後は、ブラウザでXMLが見えるだけでは不十分です。W3C Feed Validatorで公開URLを検証し、ローカルでも最低限の構造を確認します。次のスクリプトはNode.js 18以上で動きます。
// scripts/check-feed.mjs
const feedUrl = process.argv[2] ?? "http://localhost:4321/rss.xml";
const response = await fetch(feedUrl);
const xml = await response.text();
const failures = [];
if (!response.ok) failures.push(`HTTP status is ${response.status}`);
if (!xml.includes("<rss")) failures.push("RSS root element is missing");
if (!xml.includes("<channel>")) failures.push("channel element is missing");
if (!xml.includes("<item>")) failures.push("item element is missing");
if (/&(?!amp;|lt;|gt;|quot;|apos;|#\d+;|#x[a-fA-F0-9]+;)/.test(xml)) {
failures.push("unescaped ampersand may break XML");
}
if (!/<guid[^>]*>https?:\/\//.test(xml)) failures.push("guid should be an absolute URL");
if (!/<link>https?:\/\//.test(xml)) failures.push("channel or item link should be absolute");
if (failures.length) {
console.error(failures.map((failure) => `- ${failure}`).join("\n"));
process.exit(1);
}
console.log(`OK: ${feedUrl} looks like a valid RSS feed`);
キャッシュは強すぎても弱すぎても困ります。静的ホスティングならCDNがXMLを配るため、更新後に数分遅れることがあります。頻繁に記事を出すサイトならCache-Control: public, max-age=300, s-maxage=3600のように、ブラウザは短め、CDNは少し長めにする設計が扱いやすいです。完全静的生成ではヘッダー設定がホスティング側になるため、Netlify、Vercel、Cloudflare Pagesなどの設定ファイルも確認します。
具体的な落とし穴は多いです。&をエスケープせず「R&D」と書いてXMLを壊す。pubDateに2026/06/02のような曖昧な日付を入れてリーダーごとに解釈が変わる。/blog/post/の相対URLだけを入れて外部リーダーがリンク解決に失敗する。draft記事をRSSへ出してしまう。updatedDateで並べ替えたのにpubDateは古いままで読者が更新に気づかない。多言語フィードでhreflangは合っているのにRSSだけ日本語へ飛ぶ。これらは全部、公開後に気づくと信用を落とす種類の不具合です。
Claude Codeに渡すプロンプトとレビュー観点
Claude Codeには、実装とレビューを分けて頼むと安定します。最初の依頼ではファイル範囲と仕様を固定し、次の依頼で生成結果を批判的に見てもらいます。
Astroの静的サイトにRSS 2.0フィードを実装してください。
制約:
- src/pages/rss.xml.tsだけを新規作成または編集する
- @astrojs/rssを使う
- draft記事は除外する
- linkとguidは絶対URLになる設計にする
- pubDateまたはupdatedDateで新しい順に並べる
- 最大30件に制限する
- customDataにlanguageとttlを入れる
確認:
- RSS Advisory BoardのRSS 2.0仕様に照らして、channelとitemの必須情報を確認する
- W3C Feed Validatorで検証できる形にする
- XMLエスケープ、日付、URL、多言語展開時の注意点をコメントではなく実装で守る
- 最後に実行したコマンドと確認結果を報告する
レビュー用の指示はさらに厳しくします。
実装済みRSSフィードをレビューしてください。
バグ、仕様違反、読者体験の問題、SEO上の問題、キャッシュの問題を優先して指摘してください。
特に、相対URL、draft混入、XMLエスケープ漏れ、日付形式、guidの安定性、多言語URLの不一致を確認してください。
問題がなければ、残るリスクと手動確認項目だけを短くまとめてください。
Claude Codeはコード生成だけでなく、公開前の品質レビューにも使えます。ただし、最終判断は人間が持つべきです。仕様リンクを読んだか、公開URLで検証したか、実際のRSSリーダーで見たか。この3点は必ず確認してください。
まとめと実際に試した結果
RSSフィードは小さなXMLファイルですが、読者の再訪、社内通知、多言語配信、収益導線の保守に効きます。初心者は、まずdescription中心のRSS 2.0を作り、絶対URL、XMLエスケープ、日付、draft除外、件数制限、W3C検証を固めてください。Atomや全文配信は、その後で十分です。
ClaudeCodeLabでは、こうしたフィード、サイトマップ、記事品質チェック、CTA設計をまとめてClaude Code研修・導入相談で扱えます。記事を増やすだけではなく、公開後に読者へ届き、検索され、相談や商品購入へ自然につながる仕組みを作ることが目的です。
この記事で紹介した内容を実際に小さなAstro構成で試したところ、最も多かった失敗はXMLエスケープ漏れと相対URLでした。R&Dを含むタイトル、?ref=blog&lang=jaを含むURL、タイムゾーン付きの日付を混ぜると、簡単な手動確認では見落とします。Nodeの検証スクリプトとW3C Feed Validatorを組み合わせると、公開前にかなりの問題を拾えました。最終的には、RSSは「作る」より「壊れない状態を検証し続ける」ほうが実務では大事だと感じました。
無料PDF: Claude Code はじめてのチートシート
まずは無料PDFで基本コマンドと最初の使い方をまとめて確認してください。登録後はそのままテンプレート集や導入相談にも進めます。
スパムは送りません。登録情報は厳重に管理します。
Claude Codeを仕事で使える形にしませんか?
無料PDFで基礎を固めたあと、すぐ使えるテンプレート集で試し、必要なら業務自動化や導入相談まで進められます。
この記事を書いた人
Masa
Claude Codeの実務活用、導入設計、収益導線改善を検証しているエンジニア。10言語の技術メディアを運営中。
関連書籍・参考図書
この記事のテーマに関連する書籍を楽天ブックスで探せます。
※ 当サイトは楽天市場のアフィリエイトプログラムに参加しています。上記リンクから商品をご購入いただくと、運営者に紹介料が支払われる場合があります。
関連記事
ObsidianメモをCLAUDE.mdに変えるClaude Code運用: 文脈を毎回説明しない仕組み
Obsidianの作業メモからCLAUDE.md用の運用ノートを作り、Claude Codeに安定した文脈を渡す方法。
Claude Code Revenue CTA Routing: 記事からPDF、Gumroad、相談へ送る設計
PVだけで終わらせず、読者の状態に合わせて無料PDF、Gumroad教材、導入相談へ分岐するCTA設計です。
Claude Codeチーム引き継ぎルール: レビュー、権限、収益導線まで渡す実務手順
Claude Codeの作業をチームで渡すための証拠、権限、ロールバック、無料PDF/Gumroad/相談導線の実務ルール。