{
  "markdown": "# 農業情報メディア（nogyo-media）\n\nNext.js 15（App Router）＋ TypeScript ＋ Tailwind CSS v4 で構築した農業情報メディアの静的サイトです。記事本文は `content/articles/*.md` の frontmatter と HTML 本文で管理します。**Git** リモートは **GitHub** を想定しています（Vercel の Git 連携とも相性がよいです）。\n\n**メディア方針・未決バックログ・SEOメモ**は [docs/メディア方針と実装メモ.md](docs/メディア方針と実装メモ.md) にまとめています（実装・運用時の参照用）。\n\n## はじめての公開まで（ほぼ自動）\n\nターミナルでこのフォルダに移動できる前提です。あなたが用意するのは **名前・メール・GitHub のトークン** だけです（トークンは **GitHub に一度も載せない** でください）。\n\n1. **設定ファイルを作る**（例にコピーして編集）\n\n   ```bash\n   cd nogyo-media\n   cp setup.secrets.env.example setup.secrets.env\n   ```\n\n   `setup.secrets.env` を開き、`GIT_USER_NAME`・`GIT_USER_EMAIL`・`GH_TOKEN` を埋めます。  \n   - **GH_TOKEN** … GitHub → Settings → Developer settings → Personal access tokens で作成（リポジトリへの push ができる権限が必要です）。  \n   - トークンの代わりに **[GitHub CLI](https://cli.github.com/)** で `gh auth login` 済みなら、`GH_TOKEN` を空にしても push できます。\n\n2. **初回の Git 設定・コミット・GitHub へ push を一括実行**\n\n   ```bash\n   npm run setup:first-push\n   ```\n\n3. **（任意）Vercel をトークンだけで先に本番に出す**  \n   `setup.secrets.env` に `VERCEL_TOKEN=...`（Vercel → Account Settings → Tokens）を追加し:\n\n   ```bash\n   npm run setup:vercel\n   ```\n\n4. **push のたびに自動で本番更新したい場合**（おすすめ）  \n   [Vercel](https://vercel.com) で **New Project** → さきほどの GitHub リポジトリを **Import**（Root Directory は空のまま）。これで **2回目以降は `git push` だけでデプロイ**されます。\n\n**注意**: `setup.secrets.env` は `.gitignore` 済みです。**絶対にコミット・共有しないでください。** 漏れたらトークンはすぐ無効化し、作り直してください。\n\n## 記事化開始→確認→WEB公開（標準フロー）\n\nmicroCMS は使わず、**ファイルベースのみ**で公開します。\n\n### 0) 元PDFを置く\n\n`記事作成/記事化入力/` に元PDFを置きます。\n\n### 1) チャット指示で記事化開始（またはコマンド）\n\nチャットで「このPDFを記事化開始」と指示するか、`nogyo-media` で次を実行します。\n\n```bash\nnpm run article:start -- \"../記事化入力/<ファイル名>.pdf\"\n```\n\n実行すると次が作られます。\n\n- `記事/元資料/記事と元資料/<ファイル名>/`\n- 同フォルダ内に元PDFコピー\n- 同フォルダ内に `<ファイル名>_解説記事.html`（雛形）\n- 同フォルダ内に `<ファイル名>_作業メモ.md`\n\n### 2) 記事を作成して確認する\n\n`記事/元資料/記事と元資料/<ファイル名>/<ファイル名>_解説記事.html` を完成させ、内容を確認します。\n\n補足:\n- ページ上部の `タイトル / 日付 / タグ / 読了目安 / 目次 / 共有操作` はサイト側で共通表示されます。\n- HTML本文側では `<article>` 内に本文を記述し、`<h1>` や先頭 `<header>` は原則不要です（重複表示を避けるため）。\n- 記事生成時のルールは [docs/記事生成プロンプト.md](docs/記事生成プロンプト.md) を必ず参照してください。\n- **`data:image` / Base64画像 / SVGの data URI はそのまま公開しません**。Google が読む HTML を極端に肥大化させるため、公開時には外部画像へ変換・軽量化します。\n\n### 3) 確認OK後にWEB用ファイルを生成する\n\n```bash\nnpm run article:stage -- \"../記事/元資料/記事と元資料/<ファイル名>\" <slug>\n```\n\n例:\n\n```bash\nnpm run article:stage -- \"../記事/元資料/記事と元資料/25_物流革新に向けた取組の推進\" logistics-innovation-promotion\n```\n\nこのコマンドで次を作成/更新します。\n\n- `content/source-html/<slug>.html`\n- `content/articles/<slug>.md`（`sourceHtmlFile` 参照型）\n\n補足:\n- `stage-article-for-web.sh` は、HTML 内の `data:image` やローカル画像を `public/article-images/<slug>/` に書き出し、HTML の `src` を公開用パスへ差し替えます。\n- CSS の `url(data:...)` は変換対象外のため、含まれている場合はエラーで停止します。\n- 図版そのものは禁止ではありません。禁止しているのは **HTML への画像バイナリ埋め込みを、そのまま公開すること** です。\n- **公開図版は PNG を既定**とします（`prepare-article-assets.py`）。AVIF は環境によってデコードされず真っ白になることがあるため、`public/article-images/**/*.avif` と `source-html` 内の `.avif` 参照は **`npm run build` 前の検証で失敗**します。\n- **PDF・公式スライドの図版**は、スライド内の一部を切り抜かず、**該当ページ（スライド）を1枚まるごと**画像化して掲載します（1 PDF ページ＝原則 1 画像）。再現用に `scripts/render-pdf-page-to-png.py`（要 `pymupdf`）があります。\n\n### 4) 最後に公開する（手動）\n\n公開は **コミット** と **push** の2段階に分かれています。`article:publish` は**コミットまでで止まり、push しません**。\n\n```bash\nnpm run article:publish -- <slug>   # 1記事=1コミット。push はしない\nnpm run article:push -- --dry       # 溜まっているコミットの内容を表示（push しない）\nnpm run article:push                # その日の分をまとめて1回だけ push\n```\n\n`publish-article.sh` は `content/articles/<slug>.md` に加えて、`sourceHtmlFile` が指定されている場合は対応する `content/source-html/*.html` も一緒にコミットします。あわせて **記事一覧 CSV**（`public/articles-index.csv`）も再生成してコミットし、最後に未 push のコミット数を表示します。\n\n> **push は1日1回にまとめてください。** Vercel の課金は読者のアクセス量ではなく **push 回数（ビルドCPU時間）** でほぼ決まります（1 push ≈ $0.14、Pro の月間クレジットは $20）。記事を3本出す日も、コミットを3つ積んでから最後に `npm run article:push` を1回だけ実行します。「1記事=1コミット」は revert しやすさのために維持し、**push だけをまとめる**のが原則です。使い切るとサイトが停止します（2026-08-10 に実際に3日22時間停止）。\n>\n> なお **push を実行してよいのは、ユーザーから「push して」「公開して」と明示的に指示があったときだけ**です。指示がなければコミットまでで止め、「公開待ち」として報告します。\n\n#### push したら、その場で台帳とVercelを確認する\n\npush は「投げて終わり」にしません。**次の2つを push 直後に必ず済ませます。**\n\n1. **本番反映を確認する。** ローカルの `npm run build` が通っても本番に出たとは限りません。クエリを付けないプレーンな本番URLで、記事・図版・sitemap 掲載を確認します（`?cb=` などを付けるとキャッシュやルーティングが変わり「未反映」と誤判定します）。デプロイが数時間生成されないことが実際にあります。\n2. **`運営/公開キュー.tsv` の該当行を更新する。** 状態を `承認待ち` → `公開済` にし、`公開コミット` 列にコミットハッシュを入れます。\n\n2 を飛ばすと、**push は済んでいるのに台帳では「承認待ち」のまま**という行が溜まり、次に誰かが見たとき「まだ公開されていない記事」に見えます。2026-08-25 の棚卸しでは、この形のずれが3件見つかりました（うち1件は、コミットされないまま作業ツリーに4日間残っていた変更）。台帳はコミット直後ではなく **push 直後**に更新してください。コミットしただけの段階では、まだ公開されていないためです。\n\n### 記事一覧 CSV（タイトル・URL・公開日）\n\nトップ・新着・カテゴリ・タグのハブページと、全公開記事を **タイトル / URL / 公開日** の3列で出力します（ハブページの公開日列は空）。\n\n| 項目 | 内容 |\n|------|------|\n| ファイル | `public/articles-index.csv` |\n| 本番URL | `https://agri-ja.net/articles-index.csv` |\n| 手動更新 | `npm run articles:csv` |\n\n**自動更新のタイミング**\n\n- `npm run article:publish` … 記事 push 時に CSV も同じコミットへ含める\n- `npm run build` … Vercel デプロイ前にも再生成（push 忘れがあっても本番 CSV は最新化）\n\n記事の元データは `content/articles/*.md` の frontmatter（`title` / `slug` / `publishedAt`）です。記事 URL は `/articles/<slug>` 形式です。\n\n## ローカルでの起動\n\n```bash\ncd nogyo-media\nnpm install\nnpm run dev\n```\n\nブラウザで [http://localhost:3000](http://localhost:3000) を開きます。\n\n本番ビルド:\n\n```bash\nnpm run build\nnpm start\n```\n\n## Vercel へのデプロイ\n\n1. 本リポジトリを GitHub（または GitLab / Bitbucket）にプッシュします。\n2. [Vercel](https://vercel.com) にログインし、「New Project」で該当リポジトリをインポートします。\n3. **Root Directory** は、このリポジトリをそのままデプロイする場合は空のまま（または `.`）で問題ありません。親フォルダに複数プロジェクトがあるモノレポのときだけ `nogyo-media` などサブフォルダを指定します。\n4. フレームワークは Next.js と自動検出されます。そのままデプロイします。\n\n環境変数は現状のファイルベース記事のみでは不要です。ドメインやプレビュー URL は Vercel のプロジェクト設定から追加できます。\n\n### 初回／2回目以降の整理\n\n| タイミング | あなたがすること | 自動で行われること |\n|------------|------------------|---------------------|\n| **最初の1回** | 上記「はじめての公開まで」どおり `setup.secrets.env` を用意し、`npm run setup:first-push`。自動デプロイ用に Vercel でリポジトリを Import（または `npm run setup:vercel` で CLI デプロイ）。 | `setup:first-push` がコミットと GitHub への反映まで実行。 |\n| **2回目以降** | 記事やコードを直して `git push` するだけ。 | **Vercel** が自動でビルド・本番反映（プルリクならプレビュー URL も自動）。**GitHub Actions**（`.github/workflows/ci.yml`）が `npm run lint` と `npm run build` を実行し、失敗したら赤く表示される。 |\n| **依存ライブラリ** | 特に何もしなくてよい（任意で Dependabot の PR をレビューしてマージ）。 | **Dependabot**（`.github/dependabot.yml`）が週1で更新案の PR を出す。 |\n\nGitHub 上のリポジトリの **Actions** タブで、ワークフロー「CI」の成否を確認できます。Vercel のダッシュボードで各デプロイのログも見られます。\n\n## microCMSについて\n\n現在の標準運用では **microCMS を使いません**。  \n`content/articles` と `content/source-html` のファイルベース運用で公開します。\n\nmicroCMS を有効にする場合も、各記事の `tags` に読者タグを1〜3個含めないとビルドに失敗します。\n\n## MCP サーバー（AIエージェント向け公開エンドポイント）\n\n`https://agri-ja.net/mcp` で、記事と公開データを **MCP（Model Context Protocol）** のツールとして提供しています。実体は [app/mcp/route.ts](app/mcp/route.ts) の1ファイルだけです。\n\n- 読み取り専用・認証なし。MCP 2026-07-28（ステートレス）と 2025 系 Streamable HTTP の両方を同じURLで受けます。\n- ツールは4つ: `search_articles` / `get_article` / `rice_advance_payment` / `find_subsidy`\n- 記事本文は全文を返さず「要点＋冒頭抜粋＋URL」に留めます。AIの回答に出典URLが載り、読者がサイトに来られる状態を保つためです。\n- データ源は記事とサイト内ツールと同じ（`content/`）。記事を publish すればMCP側も自動で最新になります。\n- `/mcp` は実行時に `content/` を読む唯一のルートなので、`next.config.ts` の `outputFileTracingIncludes` から外さないでください（外すと本番で ENOENT）。\n\n**利用のしかた（案内するとき）**: Claude / ChatGPT / Cursor の「カスタムコネクタ」に `https://agri-ja.net/mcp` を登録するだけです。所在は [/llms.txt](app/llms.txt/route.ts) でも告知しています。\n\n**計測**: MCP経由の利用は GA4 にも Search Console にも映りません。Vercel の Function Logs に出る `[mcp] <method> <status> <ms>` が唯一の計測点です。\n\n### 公式レジストリ（registry.modelcontextprotocol.io）\n\n`net.agri-ja/agri-ja` として登録済み（2026-08-07・status active）。名前空間は GitHub ではなく **agri-ja.net のドメイン認証（HTTP方式）** で取っています。\n\n- 公開鍵: `public/mcp-registry-auth` → `next.config.ts` の rewrites で `/.well-known/mcp-registry-auth` として配信（**Vercel は `public/` 配下のドットディレクトリを配信しないため**、`public/.well-known/` に直接置くと本番で404になります）\n- 秘密鍵: `~/.config/mcp-registry/agri-ja-key.pem` と `agri-ja-privkey.hex`（**リポジトリ外。コミットしない**）\n- CLI: `~/.local/bin/mcp-publisher`\n\nツールを追加・変更したら `server.json` の `version` を上げて再公開します:\n\n```bash\ncd nogyo-media\n~/.local/bin/mcp-publisher validate\n~/.local/bin/mcp-publisher login http --domain agri-ja.net --private-key \"$(cat ~/.config/mcp-registry/agri-ja-privkey.hex)\"\n~/.local/bin/mcp-publisher publish\ncurl -s \"https://registry.modelcontextprotocol.io/v0.1/servers?search=agri-ja\"\n```\n\n動作確認（ローカル）:\n\n```bash\ncurl -s -X POST http://localhost:3000/mcp \\\n  -H 'Content-Type: application/json' \\\n  -H 'Accept: application/json, text/event-stream' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\",\"params\":{}}'\n```\n\n## ディレクトリ概要\n\n- `app/` — App Router のページ・レイアウト\n- `components/` — ヘッダー・ヒーロー・カード・サイドバー\n- `content/articles/` — 記事 Markdown（frontmatter ＋ HTML 本文）\n- `lib/articles.ts` — 記事データ層\n- `lib/categories.ts` / `lib/tags.ts` — カテゴリ・読者タグ・テーマタグ正規語彙（`THEME_TAG_REGISTRY`）\n\n記事の `tags` には **読者タグ**（`生産者向け` / `小売向け` / `流通向け` / `消費者向け`）を **必ず1〜3個** 含めてください。テーマタグは [docs/theme-tags.md](docs/theme-tags.md) の正規語彙から **0〜3個** 付けます。未登録タグや読者タグ個数違反はビルド時にエラーになります。\n\n新規記事のテーマタグ提案: `python3 scripts/suggest-theme-tags.py <slug> <category>`\n\n## ライセンス\n\nプライベートプロジェクト用。コンテンツの著作権は各出典に従ってください。\n\n",
  "bytes": 8896,
  "sha": "92494936a0df64f4d34040dc1fa771a941cc233dd6b4a7c714de629d750227c7",
  "repo_slug": "agrija2026-create/website",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_net_agri_ja_agri_ja_948263c3/readme"
}