@ryoppippi

ドキュメントをnpm packageとしてpublishしよう

14 Dec 2025 ・ 23 min read


English

TL;DR

  • LLMフレンドリーな​ドキュメント提供方​法と​しては、​ローカルに​ダウンロードさせるのが​現時点では​最も​効率が​良い
  • library提供者は、​ドキュメントをnpm等の​packageと​して​publishする​ことを​検討するべき​(例: @foo/docs
  • Vibe Codingが​盛んな​今日に​おいて、​libraryや​frameworkが​LLMフレンドリーである​ことは​とても​重要

Note: この​ブログでは​主に​JavaScriptエコシステムに​絞って​話を​するので、npm registryに​publishする​話を​書いています。​他の​エコシステムに​ついては​他の​エコシステムなりの​package配布手段が​あるので、​そこに​置き換えて​考えてみてください

2025年の​漢字は​「Coding Agent」と​「MCP」

2025年は​Coding Agentの​年でした。​3月にClaude Codeが​発表され、​5月に​GAに​なってからは​その​勢いはとどまる​ことなく、​その​後CodexOpenCodeなどの​Agent人気にも​火が​つきました。 世の​中を​見渡すと、​日頃どのような​モデルが​Codingに​良いか、​どの​エージェントが​うまく​出力を​出すか、​どのような​ツールが​コード生成を​サポートするかと​いった​話題で​持ちきりです。 これに​加えて、​MCPの​普及も​ありました。​特に​Coding Agentを​助ける​ものと​しては​効果的であると​され、​毎日のように​新しい​MCP Serverが​公開され、​人々は​それに​ついて​話しています。

LLMから​望む出力を​得るには

ところで​世の​中には​いろいろな​開発ツールや​libraryが​あります。​LLMは​主に​有名な​ものを​学習対象に​しており、​かつknowledge cutoff後の​知識に​ついては​当然知り得ないため、​当然、​何もしないまま​ポン出しでは​望む出力が​得られません。 有名な​話では​Svelte4と​5の​違い、​React Router V6と​V7の​違いなど、​breaking changesが​行われた​Web Frontend Frameworkなどでは​顕著に​表れていました。​さらに​CLIツールを​作る​ための​libraryなどは​得てして​マイナーな​もの、​学習対象が​少ない​ものが​多くなりがちで、​出力結果が​望ましい​ものでない​場合が​多いです。 これらの​問題を​解決する​ためには、​いかに​して​LLMに​できる​限りの​情報を​与えられるかと​いう​環境整備の​話が​大事に​なってきます。​つまり、​LLMの​知識に​ない​ものを​できるだけ​用意して​アクセスできる​状態に​する​ことで​望み通りの​情報を​得られるように​LLMを​導く、と​いう​ことです。 この​約1年を​通して​様々な​場所で​色々な​議論が​行われてきました。​それぞれの​良い​こと、​悪い​こと、​その​時に​良いと​されてきた​もの、​振り返ってみると​微妙だった​よねと​なっている​もの、​様々​あります。

けつろんぱ

Vibe Codingが​盛んな​今日に​おいて、​libraryや​frameworkを​LLMフレンドリーに​する​ことはますます重要に​なっています。​LLMと​相性が​悪いlibraryは、​それだけで​選択肢から​外される​可能性が​あります。​では、​library提供者は​どのように​して​LLMフレンドリーな​環境を​実現できるでしょうか?

結論から​言うと、​LLMフレンドリーな​ドキュメント提供方​法と​しては、ローカルに​あるだけの​ものを​ダウンロードしそれを​Coding Agentが​自由に​読める​状態に​することが​現時点では​最も​効率が​良いです。 libraryの​提供者は、​ドキュメントを​バージョン管理可能な​状態でnpm等の​registryに​上げるのが​現時点では​最も​効果的なのではないかと​筆者は​考えています。 ブログでは​ドキュメントを​与える​方​法が​どのように​変わっていったか、​そしてなぜ​その​方​法が​一番良いと​筆者が​結論づけているのかに​ついて​論じていきます。

ドキュメント提供方​法の​変遷

RAG

RAG (Retrieval-Augmented Generation)は、​LLMに​外部知識を​与える​ための​方​法と​して​広く​知られています。 2022年11月に​ChatGPTが​公開された​後、​人々の​間で、​「関連情報と​プロンプトを​一緒に​渡せば​知識に​基づいた​望ましい​出力が​得られる」と​いう​認識が​広まりました。 これに​伴って​プロンプトから​いかに​関連した​情報を​取り出して​渡すかと​いう​議論が​盛んに​なりました。 ここでは​RAGの​具体的な​手法には​触れませんが、​ドキュメントを​渡して​one-shotで​回答を​得ると​いう​ことの​大切さの​議論は、​ここから​盛んに​なった​ものと​考えられます。

2023年、​ChatGPTに​Web検索機能が​追加されました。​これに​より、​LLMは​インターネット上の​最新情報に​アクセスできるようになりました。 ChatGPTが​能動的に​情報を​ネットから​探して、​それに​ついて​回答を​生成する​ことが​可能に​なりました。 ただし、​HTMLと​いう​構造は​LLMフレンドリーではなく、​また​毎回​検索を​するのは​コストが​高いため、​決して​効率の​いい方​法とは​言えません。 現代の​Coding Agentは​ウェブ検索機能を​搭載するのが​当たり前に​なっている​一方、​この​問題は​今後も​ついて​回る​ことに​なるでしょう。 こと​現在のContext Engineeringの​常識を​鑑みるに​Web Searchに​頼るのは​最終手段に​すべきでしょう。

llms.txt

llms.txtは、​2024年9月に​提案された、​比較的新しい​ウェブ標準"案"です。 llms.txtを​用いる​ことで、​Webサイトは​HTMLのような​人間に​とっての​構造を​廃し、​LLMに​とって​必要最低限の​情報を​マークダウンで​記述する​ことで、​トークン量を​減らしつつ正確な​情報を​提供する​ことができます。

Mintlifyなど、​Coding Agentから​アクセスすると、​HTMLではなく​自動的にllms.txtを​返してくれるような​ドキュメントサービスも​増えています。

MCP Server

2024年後​半から​2025年に​かけて、MCP (Model Context Protocol)が​普及しました。 MCPは​2023年6月に​OpenAIから​発表された​ function calling ( tool calling )の​概念を​標準化する​形で​提案された​プロトコルです。 2025年に​なって、​Coding Agentに​情報を​与える​手段と​して、​Anthropic社から​大々的に​宣伝された​ことも​あり、​もの​すごい​勢いで​MCP Serverが​増えていきました。 MCP Serverの​素晴らしい​ところは、​ひとたびMCPに​沿った​形で​ツールを​定義すると、​それがClaude CodeでもCodexでもOpenCodeでもamp codeでも​好きな​Coding Agentで​それが​使えると​いう​ことです。

これまでに​いろいろな​タイプの​MCP Serverが​作られてきました。​筆者もsitemcpと​いう​MCP Serverを​作成し、​ドキュメントを​MCP Server経由で​提供する​方​法を​提案しました。

libraryや​frameworkの​提供者が​それを​使う​ための​ MCP Serverを​個別に​提供し始めています。

また​独自の​手法を​用いて​GitHubや​libraryの​情報を​いい​感じに​要約して​返してくれる​MCP Serverも​あります。​ Deepwiki MCPContext 7grep mcpなどは​その​最たる​例です。

既存の​方法の​問題点

しかし、​MCP Serverには​大きな​問題点が​ありました。

また、llms.txtにも​共通する​問題点と​して

  • 毎回リモートに​ある​ドキュメントを​参照するのに​時間も​コストも​かかる
  • ドキュメントが​バージョンごとに​存在しているのは​稀で、​バージ​ョンが​古いlibraryを​使っている​ときに​情報の​ミスマッチが​起きる
  • 実際に​Coding Agentが​使うのは​得られた​情報の​一部でしかないのにも​かかわらず、​取得した​すべての​情報を​context windowに​保持する​ことに​なり、​非常に​効率が​悪い

最後の​問題に​関しては、Claude Code は​ Subagents と​いう​仕組みを​導入する​ことで、​部分的に​解決しています。 しかし​他の​問題は​残ります。

原点回帰: ローカルドキュメント

MCPが​普及し始めた​2025年4月ごろから、MCPと​CLIは​どっちが​いいんだと​いう​議論が​度々​話題に​なっていました。​Coding Agentも​この​半年で​いく​つか​世代を​経る​ごとに、​CLIツールの​呼び出し方に​ついては、​めきめきと​精度が​上がっていきました​(これと​比較して、MCPなどの​ツール呼び出しの​精度は​実は​あんまり​上がってないんですよね…)。

これを​踏まえると、​できる​限りドキュメントや​libraryの​ソースコードを​手元に​置いておくのが​いいのではないかなと​いう​アイデアを​筆者の​周りではより​頻繁に​聞くようになりました。 例えば​友人である​ NATSUKIUM は​ ghqを​使って​使用している​libraryを​ローカルに​クローンして​参照するようにCLAUDE.mdに​指示を​書いています。​また、btcaと​いう​CLIツールでは、​指定した​libraryを​実際に​GitHubから​クローンしてきて、​その​情報を​与える​ための​仕組みを​整備していたりします。

一度​手元に​ドキュメントを​おいて​仕舞えば、​あとは​Coding Agentがfd, rgなどを​使って​必要な​情報を​探し出し、​必要な​部分だけを​読み込んで​処理すれば​よいわけです。 しかも​わざわざリモートに​情報を​取りに​行く​必要も​ないわけですから、​非常に​効率的です。 repositoryに​ドキュメントが​置いて​あったとしても、​それは​大抵Markdownでしょう。​2025年現在​何か​ドキュメントを​書くとした​場合に、​それが​Markdownでない​確率の​方が​低いと​考えられます。

ドキュメントを​publishしよう

ローカルに​ドキュメントや​コードを​置いておく​ことは​効果的である​ことは​明らかです。 では​この​仕組みを​どうやったら​一般化できるでしょうか? libraryの​提供者は​どうやれば​最小手で​自分の​libraryや​frameworkを​LLMフレンドリーに​できるでしょうか? 上の​方​法では​解決していない​バージ​ョンに​よる​違いなどは​どのように​解決すれば​いいのでしょうか。

筆者は、​library提供者がドキュメントをnpm packageに​同梱する。​あるいは​ @foo/docs のような​形で​ドキュメント専用packageを​提供することを​提案します。​(JavaScriptエコシステムの​場合)

なぜnpm packageなのか

npm packageと​して​ドキュメントを​提供する​ことには​いく​つかの​利点が​あります。

ローカルへの​自動配置

npmの​大きな​特徴と​して、​インストールした​packageがnode_modulesディレクトリに​実体と​して​配置される​ことが​挙げられます。 パスは​常に./node_modules/<package-name>と​予測可能で、​Coding Agentが​参照しやすい​構造に​なっています。 ドキュメントをnpm packageと​して​publishすれば、npm installするだけで​自動的に​プロジェクト内に​ドキュメントが​配置されるのです。

ドキュメント参照​容易性

ドキュメントを​Coding Agentに​参照させるのは​非常に​簡単です。

If you need to implement feature X, use the `@your-library` package.
Please refer to the documentation located at `./node_modules/@your-library/docs/**/*.md` for more information about how to use the library.

これを​そのままCLAUDE.mdAGENTS.mdに​書く​ことも​できますし、​より​具体的にはAgent Skillsの​一つと​して​定義する​ことで、​必要に​応じて​参照させる​ことも​できるでしょう。

配布​容易性

あなたが​libraryの​作者である​場合、​ドキュメントと​library本体を​モノレポで​管理している​場合が​ほとんどでしょう。​その​場合、​ドキュメントを​管理している​repositoryを​同時に​バージョンを​付けて​publishする​ことができます。 またすでに​repositoryに​ある​Markdownを​そのまま​コピーして​publishするだけで​完了するので​とても​簡単です。

バージョン管理​容易性

新しい​packageを​publishする​ごとに、​同時に​ドキュメントを​publishしていけば、​ユーザーは​libraryと​ドキュメントの​バージョンを​合わせて​ダウンロードする​ことができます。 Coding Agentは、​使用している​libraryの​バージ​ョンに​対応する​ドキュメントを確実に参照する​ことができます。

実際の​運用例

実は​この​方法は​すでに​いく​つかの​libraryで​行われている​ものです。

bun-types

Bunは​JavaScriptランタイムですが、​その​型定義を​提供する​ためにbun-typesと​いう​packageを​提供しています。 この​packageには​Bunの​型定義だけでなく、Bunの​ドキュメントも​同梱されています

また​面白い​ことにbun init -yコマンドで​プロジェクトを​生成させると、bunCLAUDE.mdファイルを​自動生成します。​その​中にはBunの​ドキュメントを​参照する​指示が​含まれています。

gunshi

gunshi by KAZUPON は​TypeScriptで​CLIツールを​作成する​ための​libraryです。​筆者が​今もっとも​愛用している​CLI libraryです。

この​libraryはgunshi packageとは​別に@gunshi/docsと​いう​ドキュメント専用packageを​提供しています。​Coding Agentはbun-typesと​同様に​この​ドキュメントを​参照する​ことで、gunshiの​使い方を​学習する​ことができます。 また、bunx @gunshi/docsコマンドを​叩くと、CLAUDE.mdCursor Ruleを​自動生成してくれる​仕組みも​提供しています()。

実際に​ gunshi の​ドキュメントを​参照させた​場合と​Web検索を​使った​場合を​比較すると​:

  • コストは​1.37USD -> 0.44 USD
  • 実装は​3:31 -> 0:40
  • 手戻りも​0回に!

などの​効果が​ありました。

@gunshi/docsを使った場合

Web検索のみ使用した場合

byethrow

また​同じく​筆者が​愛用している​新しい​Result型libraryであるbyethrow by KARIBASH も​同様に​ @praha/byethrow-docs と​いう​ドキュメント専用packageを​提供しています。 byethrowは​以前からmcpを​提供していましたが、​docs packageの​方が​高速に​実装を​する​ことができます。

注意点

この​方​法を​採用する​際には​いく​つか​考慮すべき点が​あります。

packageサイズの​増加

ドキュメントを​同梱する​ことで、​当然packageの​サイズは​増加します。​ただし、​Markdownファイルは​テキストベースであり、​画像などを​含めなければ​サイズの​増加は​限定的です。​また、@foo/docsのように​別packageと​して​提供する​場合は、​本体の​サイズには​影響しません。

メンテナンスコスト

ドキュメントを​packageに​含める​場合、​リリースの​たびに​ドキュメントも​一緒に​更新・publishする​必要が​あります。​CIパイプラインを​整備する​ことで、​この​コストは​最小化できます。 また​モノレポで​管理している​場合、​ドキュメントと​コードの​バージョンを​同期させるのが​容易です。

おわりに

この​1年間、Context Engineeringと​いう​名前のもとで、​どのように​ドキュメントを​整備して、​LLMひいては​Coding Agentに​渡すかと​いう​ことが​広く​議論されてきました。 筆者の​中での​現在の​最適な​方​法は、​ローカルに​ドキュメントを​落とし、​Coding Agentを​信頼して、​自由に​情報を​探索させる​ことだと​結論づけています。

npm registryへの​ドキュメントpublishは、​それを​推し進める​ための​良い​解決策なのではないでしょうか。

P.S.

僕はgunshiというtypescript製のcliを構築するためのライブラリが好きです(ccusageでもsitemcpでも使ってる)。 しかし、このライブラリ、めちゃくちゃ新しいのでLLMがgunshiについての知識は持っていません。なのでvibe codingと相性がめっちゃ悪い。 そこで @kazu_pon

ryoppippi
ryoppippi
@ryoppippi

So actually, if I took a benchmark of how effective our Claude code skills for Gunshi are, the result is amazing: With Skills • 0.44 USD • 40s for implementation • 1:05 for implementation + debugging Without Skills • 1.37 USD • 3:31 for implementation • 3:52 for

Reply

面白い。DaaP(Documents as a Package)と言うのかな?これ普及すればContext7のMCPが不要になるかもしれませんね。デフォルトはこれになって欲しいですし、Context7ではなくDeepWikiみたいなものでMCPを消費したいですね。

ryoppippi
ryoppippi
@ryoppippi

新しい記事! ドキュメントをnpm packageとしてpublishしよう | blog | ryoppippi ryoppippi.com/blog/2025-12-1…

Reply
comment on bluesky / twitter
CC BY-NC-SA 4.0 2022-PRESENT © ryoppippi