ある開発者が、隠れた npx のルックアップが Claude Code の各ターンに約10秒の遅延をもたらしていることを発見しました。ルックアップをグローバルインストールに置き換えることで、各インタラクションから6秒を短縮できました。

なぜレイテンシが問題だったのか

Claude Code は、数十のコンポーネントを含むモノレポをナビゲートし、シンボルをインデックス化し、Postgres にトランスクリプトを保存し、エラーレポートを送信します。ワークフローはスムーズに感じられますが、モデルのレスポンスが遅れ始めると問題が顕在化します。ヘルスチェックを行ったところ、いくつかの非効率な点と、コストの高い1つのネットワークコールが明らかになりました。

ヘルスチェックで判明したこと

  • 重複したインストール – ネイティブのランチャーと古い npm-global バージョンが共存していました。古いコピーを削除することで、不要なパスのルックアップを排除しました。
  • 壊れたエージェントファイル – 説明のないファイルが有効なファイルと同じ名前になっており、Claude Code がそのファイルを無視する原因となっていました。壊れたエントリを削除することで、混乱を解消しました。
  • 未使用の拡張機能 – 一度も実行されることのないプラグインと MCP サーバーを無効化し、ランタイムのフットプリントを削減しました。
  • 肥大化した「CLAUDE.md」ファイル – これらのファイルには、コード内に既に存在する情報(例:ビルドコマンド)が繰り返し記述されており、モデルに送信されるペイロードを増大させていました。内容を削ぎ落とし、不可欠なコンテキストのみを残しました。

これらのクリーンアップも効果的でしたが、最大の成果は、モデルのレスポンス後に実行される Stop hook から得られました。

隠れた npx 税

Stop hook は 6 つの個別のコマンドを実行しますが、それぞれに npx -y という接頭辞が付いています。-y フラグは、コマンドを実行する前に npx に npm レジストリで新しいバージョンがないか確認させるため、ネットワークリクエストを発生させます。各ルックアップには平均 1.6 秒 かかり、6 回の呼び出しによって、すべてのターンに 約 10 秒 が追加されていました。実際には、フック全体のレイテンシは 12 秒 と測定され、ネットワークの不調時には最大 113 秒 までスパイクが発生することもありました。

シンプルな解決策

npx の呼び出しをグローバルにインストールされたバイナリに置き換えることで、レジストリのルックアップを排除しました。

  • Before: npx -y @invariance/gps → 1 回あたり 1.6 秒
  • After: gps (グローバルインストール済み) → 1 回あたり 0.7 秒

この変更により、Stop hook の実行時間は 1 ターンあたり約 6 秒 短縮され、リモートチェックによる大幅なスパイクも解消されました。

次に注意すべき点

  • フックのタイミング – カスタムフックに計測処理を組み込み、ユーザーに影響が出る前にレイテンシを可視化してください。
  • 依存関係の衛生管理 – 重複したインストールや未使用の拡張機能を定期的に整理してください。
  • 設定ファイル – 「CLAUDE.md」は軽量に保ち、モデルが推論できない情報のみを記載するようにしてください。

教訓はシンプルです。自動化は、コストのかかる内部的な仕組みを隠してしまうことがあります。素早いヘルスチェックを行えば、スムーズな AI アシスタントを鈍重なものに変えてしまう、隠れたネットワークコールを見つけ出すことができます。

まとめ: Claude Code が遅いと感じたら、フックの実行時間を計測し、npx のルックアップを排除しましょう。グローバルインストールを活用することで、各ターンの時間を短縮し、開発フローをスムーズに保つことができます。