記事一覧に戻る

LLMS 向けのインデックス自動生成ツール「llms-txt-maker」を作り始めました

llms.txt と llms-full.txt を生成するためのモノレポを公開し、設計や現在の進捗、これから取り組む予定を整理しました。

2025年10月17日1 min read
LLM
Next.js
TypeScript

TL;DR

  • LLM にサイト構造を渡すための llms.txt を毎回手で書くのが手間なので、生成を自動化するモノレポを公開しました。
  • コレクタとレンダラを切り分け、CLI・Next.js アダプタ・サンプルアプリをまとめて管理しています。
  • まだ v0.1 系の実装段階ですが、Zod ベースの設定バリデーションや sitemap クロールなど最低限の足回りは動く状態です。

きっかけ

ChatGPT や各種 LLM エージェントに自分のサイトを学習させようとすると、llms.txt のようなインデックスファイルを用意する必要があります。ブログやドキュメントの更新頻度が上がると、タイトルやディスクリプションの同期が追いつかず手作業のコストが跳ね上がるのが悩みでした。
そこで「サイトマップや Markdown をまとめて読み取り、LLM 向けの要約を自動生成するツールチェーン」を目指して、https://github.com/s-soya2421/llms-txt-maker を同階層のディレクトリに置いて開発を進めています。

モノレポ構成

pnpm と Changesets で管理するモノレポに以下のパッケージを切り出しました。

  • @soya/llms-txt: コアライブラリ。defineConfig, collectContent, render, renderFull などを提供し、手動入力・Markdown/MDX・sitemap クロールの結果をまとめて扱います。
  • @soya/llms-txt-next: Next.js の API ルートから llms.txt を返すための薄いアダプタ。ランタイム切り替えなどは今後の拡張予定。
  • @soya/llms-txt-cli: Commander ベースの CLI。設定ファイルを読み込み、public/llms.txt への書き出しや --dry-run をサポート。
  • examples/next-app: WIP のサンプルアプリ。Next.js で /llms.txt を提供する最小構成を検証しています。

コレクタとレンダラの仕組み

設定ファイルは Zod でバリデーションしつつ、モジュール間で共有できるよう defineConfig をエクスポートしています。実際の設定ファイルは以下のイメージです。

import { defineConfig } from '@soya/llms-txt';

export default defineConfig({
  site: { title: 'Example Docs', url: 'https://example.com' },
  sources: {
    manual: {
      items: [
        {
          title: 'Getting Started',
          url: 'https://example.com/start',
          summary: 'プロジェクト導入の流れ',
          tags: ['guide'],
        },
      ],
    },
    sitemap: {
      respectRobotsTxt: true,
      concurrency: 1,
      delayMs: 1500,
      maxSummaryChars: 200,
    },
  },
  renderOptions: {
    redactPII: true,
    includeTimestamp: true,
  },
});

collectContent がホームページを先に解決できれば、タイトルとメタディスクリプションを冒頭に挿入し、残りのページは ## 見出し + 単一リンクで列挙します。renderFull を使うと本文要約を含んだ llms-full.txt も作成可能です。

CLI での生成フロー

CLI パッケージは pnpm ワークスペースに依存しているため、まずはビルドしてからコマンドを叩きます。--sitemap--max-pages で一時的に設定を上書きできるので、都度クロール対象を変えたいケースにも対応可能です。

pnpm install
pnpm --filter @soya/llms-txt-cli build

node packages/llms-txt-cli/bin/llms-txt build \
  --config llms.config.ts \
  --out public/llms.txt

node packages/llms-txt-cli/bin/llms-txt build \
  --config llms.config.ts \
  --sitemap https://example.com/sitemaps/site-index.xml \
  --max-pages 200 \
  --out public/llms.txt

node packages/llms-txt-cli/bin/llms-txt build --dry-run

Next.js への組み込み

Next.js では API ルートにアダプタを挿すだけで済むようにしています。app/ ディレクトリを使っている場合は以下のように書けます。

// app/api/llms/route.ts
import { makeRoute } from '@soya/llms-txt-next';
import config from '../../../llms.config';

export const { GET } = makeRoute({ config });

実装中のサンプルアプリでは、生成した public/llms.txt を Vercel の静的エクスポートに含める想定で検証しています。

これから

現状はコア機能が最小限動く状態なので、以下のような改善を進める予定です。

  • CMS 連携用コレクタ(Strapi や MicroCMS)を追加して静的サイト以外でも使えるようにする。
  • HTML から Markdown を抽出するテンプレート機能や PII マスキングの改善。
  • CLI の crawl, fetch, build-llms などロードマップにあるサブコマンドの実装。
  • Next.js アダプタの Edge Runtime 対応と、/llms.txt を静的書き出しに含めるオプションの調整。

引き続き v0.1 系として試行錯誤しながら進めているので、フィードバックやユースケースがあればぜひ教えてください。