Next.js 公式ドキュメント RAG CLI (next-devtools-mcp)
Project description
Next.js 公式ドキュメント RAG(next-devtools-mcp)
公式の next-devtools-mcp を経由して Next.js の公式ドキュメントを取得し、その内容だけを根拠に質問に答える Python の CLI です。MCP の nextjs_docs と nextjs-docs://llms-index を使うため、検索対象は常に公式が配布するインデックス/本文に沿います。
前提条件
- Python 3.10+(プロジェクトでは 3.14 付近で動作確認)
- Node.js と
npx(MCP サーバーをnpx -y next-devtools-mcpで起動するため) - OpenAI 互換の Chat API に渡せる API キー(例: NVIDIA Integrate API)
セットアップ
cd /path/to/rag
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
# (推奨)パスを通さなくても `rag-nextjs` で起動できるようにする
pip install -e .
環境変数用に .env を用意します。
cp .env.example .env
# .env を編集して API キーなどを設定
環境変数
| 変数 | 必須 | 説明 |
|---|---|---|
NVIDIA_API_KEY または OPENAI_API_KEY |
はい | Chat API 用のキー |
NVIDIA_OPENAI_BASE_URL または OPENAI_BASE_URL |
推奨 | 互換 API のベース URL(NVIDIA 利用時は .env.example の URL を参照) |
CHAT_MODEL |
いいえ | 既定: nvidia/nemotron-3-nano-30b-a3b |
CHAT_TEMPERATURE |
いいえ | 既定: 0.2 |
CHAT_EXTRA_BODY |
いいえ | extra_body に渡す JSON(例: Nemotron の推論オプション)。1 行の JSON 文字列 |
CHAT_STREAM |
いいえ | 1 / true / yes / on でストリーミング(既定)。0 など falsy で常に 非ストリーミング のみ送信 |
CHAT_STREAM_FALLBACK |
いいえ | 既定オン。ストリームを最後まで読んでも表示用テキストが一度も出ないとき、同じ入力で 非ストリーミングを 1 回 試す |
CHAT_SHOW_REASONING |
いいえ | 既定オフ。オンにすると reasoning_content 等の 推論テキストも標準出力に流す。推論付きモデルの通常利用ではオフのままがよい |
CHAT_MAX_TOKENS |
いいえ | 設定時のみ、max_tokens としてリクエストに付与 |
CHAT_STREAM_INCLUDE_USAGE |
いいえ | オン時、ストリーミング要求に stream_options: {"include_usage": true} を付与(使用量を最終チャンクで受け取る用途) |
CHAT_HTTP_TIMEOUT_SECONDS |
いいえ | 読み取り込みを含む HTTP タイムアウト(秒)。既定: 600 |
OPENAI_TIMEOUT または HTTP_TIMEOUT |
いいえ | 上記と同目的。評価は OPENAI_TIMEOUT → HTTP_TIMEOUT → CHAT_HTTP_TIMEOUT_SECONDS の先勝ち |
CHAT_HTTP_CONNECT_SECONDS |
いいえ | 接続確立までのタイムアウト(秒)。既定: 30(遅い TLS でも切れにくくするため) |
NEXTJS_MCP_COMMAND |
いいえ | MCP 起動コマンド(シェルと同様に空白区切り)。既定: npx -y next-devtools-mcp |
RAG_TOP_K |
いいえ | --top-k の既定値(ページ取得数)。既定: 4 |
RAG_SPINNER |
いいえ | 進捗行のブラケット/スピナーアニメーション。既定オン(1)。0 でアニメーションを無効にし、必要なときのみプレーンな [nextjs-rag] 行になる |
RAG_SPINNER_FORCE |
いいえ | 1 のとき TTY でなくても スピナーを描画(パイプ先が端末など特殊なとき向け)。既定オフ |
RAG_QUIET |
いいえ | 1 のとき 進捗表示をすべて出さない(-q と同様の効果)。コマンドラインの -q と併用すると、どちらかが真なら抑止されます |
Chat API(モデル差の吸収)
OpenAI の Chat Completions 互換エンドポイントを前提にしています。プロバイダやモデルによって次のような差があります。
- ストリーム本文の欠落 … ゲートウェイ側でストリーミングの
deltaに本文が載らない場合がある → 既定ではCHAT_STREAM_FALLBACKにより 非ストリームで再試行。 - 推論フィールドの名称 …
reasoning_content以外にreasoning/thinking/thoughtなどで返す API がある → 既定ではユーザー向け回答のcontent(とrefusal)だけを標準出力へ出し、推論は出しません。デバッグで推論も見たいときはCHAT_SHOW_REASONING=1を指定してください。 contentの形 … 文字列だけでなく、type: "text"のブロックの配列で返す実装に対応します。
大規模モデル(例: nvidia/nemotron-3-super-120b-a12b)は 最初のトークンまで数十秒〜数分かかることがあります。ログに path が出たあと無言に見える場合は、しばらく待つか、CHAT_HTTP_TIMEOUT_SECONDS をさらに延ばしてください。ストリームが不安定なら CHAT_STREAM=0 で非ストリーム固定にすると確実です。
使い方
開発用にリポジトリへ editable install した場合(pip install -e .)、どこからでも次のように起動できます。
rag-nextjs "App Router で Server Actions を使うには?"
リポジトリ直下では従来どおり次も同じです(main.py に shebang があるため ./main.py も可)。
python main.py "App Router で Server Actions を使うには?"
python -m rag_nextjs "App Router で Server Actions を使うには?"
./main.py --help
取得するドキュメントページ数を増やす:
python main.py --top-k 5 "キャッシュの revalidate について"
rag-nextjs --top-k 5 "キャッシュの revalidate について"
ヘルプ:
rag-nextjs --help
python -m rag_nextjs --help
python main.py --help
進捗は 標準エラー出力 に表示されます(処理中は ⠋ … のようなアニメーションと、フェーズごとの説明。ドキュメント取得中は何件目・どの path かもここで更新されます。モデル応答の初回トークン待ちでも同様にスピナーを出します)。
標準出力には、取得したドキュメント path: … と空行のあと、続けて 回答本文がストリーミングされます。回答だけファイルに残したいときは 2>/dev/null で stderr を捨てるか、path 行を除去する必要があります。
rag-nextjs "質問…" 2>/dev/null > answer.txt
ログを抑えたいときは -q / --quiet または環境変数 RAG_QUIET=1 を指定してください。回答は できる限りストリーミング され、非対応時は CHAT_STREAM_FALLBACK で非ストリーム再試行があります(オフにすると CHAT_STREAM_FALLBACK=0)。
動作の流れ(概要)
- 子プロセスで
next-devtools-mcpを起動し、MCP セッションを確立する。 - リソース
nextjs-docs://llms-indexで公式インデックス(llms.txt相当)を読む。 - 質問文とインデックス行の単語重なりで、関連しそうなドキュメント path を最大
top_k件選ぶ。 - 各 path に対してツール
nextjs_docsで本文を取得する。 - 取得本文をコンテキストとして、設定した Chat モデルに送り、回答を生成する。
LLM は可能なら ストリーミング で逐次標準出力に表示し、(5) が本文ゼロで終わった場合のみ 同一プロンプトを非ストリーミングで再実行します(CHAT_STREAM_FALLBACK がオンで、CHAT_STREAM がオンのとき)。進捗の見た目は stderr のスピナーが担います。
インデックス説明が英語中心のため、日本語のみの短い質問だと取得 path が外れやすい場合があります。そのときは --top-k を大きくするか、ドキュメントで使われている用語(Server Actions、Route Handler など)を混ぜてみてください。
この README の対象は 公式サイトのドキュメントを読む経路です。
nextjs_docs/llms-index… nextjs.org の公式ドキュメントに基づいて答える(本プロジェクトが利用)。nextjs_index/nextjs_call… ローカルで動いている Next.js 16 以降の開発サーバーの MCP(/_next/mcp)に接続し、コンパイルエラーやルート情報など実行中アプリの状態を調べる用途。
アプリのランタイム診断まで Python から行いたい場合は、別途 dev サーバーを起動したうえで、そのツール群を呼び出す実装が必要になります。
トラブルシューティング
npxが見つからない … Node.js をインストールし、NEXTJS_MCP_COMMANDでフルパスのnpxを指定するか、PATHを通してください。next-devtools-mcpの起動に失敗する … ネットワークで npm レジストリに届くか、npx -y next-devtools-mcpを手動で実行できるか確認してください。- 関連ドキュメントが取得できない … 質問を変える、
--top-kを増やす、英語キーワードを足す。 - API エラー …
.envのベース URL・モデル名・キーが、そのプロバイダの OpenAI 互換仕様と一致しているか確認してください。 - 回答がずっと出ない(path のあとで止まる) … stderr に「モデル応答を待機中…」のスピナーが動いていれば、まだ初回トークン待ちです。大モデルは数十秒〜かかることがあります。標準エラーを見ていないターミナルでは
2>&1 | tee log.txtなどで確認してください。長すぎる場合はCHAT_HTTP_TIMEOUT_SECONDSを延ばす。ストリームが空のまま終わる API ではCHAT_STREAM_FALLBACK(既定オン)で非ストリームに切り替わるはずなので、それでもダメならCHAT_STREAM=0やCHAT_MAX_TOKENS/CHAT_EXTRA_BODYでプロバイダ必須パラメータを渡す。
ライセンス
リポジトリ側のライセンスに従ってください。next-devtools-mcp 本体は npm パッケージのライセンス(MIT)が適用されます。
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rag_nextjs-1.0.0.tar.gz.
File metadata
- Download URL: rag_nextjs-1.0.0.tar.gz
- Upload date:
- Size: 21.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
004621e2d9c60b7a4733c70b29ea32308788cd94a753caee582acb48d9f9699f
|
|
| MD5 |
0bcc5e7a978c353c1305ca124781ccb6
|
|
| BLAKE2b-256 |
c547fbdb1eceb83e6bd29f5a6b745a27e2a8e4f897ab0f2e3c8dad33d788c5c6
|
Provenance
The following attestation bundles were made for rag_nextjs-1.0.0.tar.gz:
Publisher:
python-publish.yml on econanringo/nextjs-rag
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rag_nextjs-1.0.0.tar.gz -
Subject digest:
004621e2d9c60b7a4733c70b29ea32308788cd94a753caee582acb48d9f9699f - Sigstore transparency entry: 1523592039
- Sigstore integration time:
-
Permalink:
econanringo/nextjs-rag@9a76fea8839958a3da24bad1cae81e8162f9f19b -
Branch / Tag:
refs/heads/main - Owner: https://github.com/econanringo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@9a76fea8839958a3da24bad1cae81e8162f9f19b -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file rag_nextjs-1.0.0-py3-none-any.whl.
File metadata
- Download URL: rag_nextjs-1.0.0-py3-none-any.whl
- Upload date:
- Size: 20.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
76b8ecc3d29aea3b22bb585c5fee4565eb700497f177304b2b92220fba4221d8
|
|
| MD5 |
7fa5136a786a449d0cbaa3c1e92d7bcb
|
|
| BLAKE2b-256 |
f438e6dd10a4f4a635f08e79a0948e0cdfcfb15e675f803f9ce0f99b32381210
|
Provenance
The following attestation bundles were made for rag_nextjs-1.0.0-py3-none-any.whl:
Publisher:
python-publish.yml on econanringo/nextjs-rag
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rag_nextjs-1.0.0-py3-none-any.whl -
Subject digest:
76b8ecc3d29aea3b22bb585c5fee4565eb700497f177304b2b92220fba4221d8 - Sigstore transparency entry: 1523592075
- Sigstore integration time:
-
Permalink:
econanringo/nextjs-rag@9a76fea8839958a3da24bad1cae81e8162f9f19b -
Branch / Tag:
refs/heads/main - Owner: https://github.com/econanringo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@9a76fea8839958a3da24bad1cae81e8162f9f19b -
Trigger Event:
workflow_dispatch
-
Statement type: