mcpField
P
Perfonext Profiler MCP

Perfonext Profiler MCP

ローカル
github.com/souvikdu開発ツール03 週間前に更新

Perfonext Profiler MCP について

Perfonext Profiler MCPは、Next.jsサーバーやスクリプトの性能を調べる開発者向けに、V8とChromeのCPUプロファイルを分析します。ホットスポットの順位、パッケージ別コスト、注釈付きソース行、比較、最適化案を提示します。

主な機能

  1. 01V8とChromeのCPUプロファイル読み込み
  2. 02自己時間によるホット関数の順位付け
  3. 03V8サンプル数をソース行に注釈
  4. 04npmパッケージ別のCPUコスト集計
  5. 05プロファイル比較による性能低下の検出
  6. 06ホットスポット向け最適化案の提示

活用シーン

  1. 01CPUプロファイルから高コスト関数を特定
  2. 02CPUコストの高い依存パッケージを発見
  3. 03ホットなソース行と呼び出し関係の確認
  4. 04プロファイル比較による性能低下の特定

MCP 対応

CPUプロファイルの読み込みと分析、ソースコンテキストの確認、プロファイル比較、最適化案の提示を行うツールをMCPクライアントに公開するstdio MCPサーバーです。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"souvikdu-perfonext-profiler": {
"command": "npx",
"args": [
"-y",
"@perfonext/profiler-mcp"
]
}
}
}
起動コマンドnpx -y @perfonext/profiler-mcp

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npm@perfonext/profiler-mcp0.7.3

ツール

9

掲載時のツール一覧 · 3 週間前に更新

パラメーター型必須説明
filePathstringはい.cpuprofile または Chrome trace .json ファイルの絶対パスまたは相対パス

詳細

perfonext-profiler-mcp

V8 と Chrome の CPU プロファイルを分析し、Next.js のサーバーやスクリプトのホットスポットを見つけます。

npm npm downloads license website

perfonext-profiler-mcp は、GitHub Copilot、Claude Desktop、 Claude Code、その他の MCP クライアントに、Next.js のパフォーマンス改善に役立つ構造化された CPU プロファイリングデータを提供する Model Context Protocol(MCP)サーバーです。V8 と Chrome の CPU プロファイルを読み込み、ホットスポットのランキング、パッケージごとのコスト、ソースコードの注釈付きホットラインに変換します。これにより、エージェントは数メガバイトに及ぶプロファイルダンプを取り込むことなく、根拠に基づいて推論できます。

クイックスタート

perfonext-profiler-mcp は標準的な MCP stdio サーバーなので、MCP 対応クライアント(VS Code の GitHub Copilot、Claude Desktop、Claude Code、Cursor など)で動作します。npx を使って直接実行します。

npx -y @perfonext/profiler-mcp

または、グローバルにインストールします。

npm install -g @perfonext/profiler-mcp

インストール後も、実行コマンドは perfonext-profiler-mcp のままです。

VS Code

サーバーを .vscode/mcp.json(ワークスペースの MCP 設定ファイル)に追加します。

{
  "servers": {
    "perfonext-profiler": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@perfonext/profiler-mcp"]
    }
  }
}

VS Code のウィンドウを再読み込みして MCP: List Servers を実行するとサーバーが起動します。または、信頼を求めるプロンプトが表示されたら許可してください。

Claude Desktop

サーバーを claude_desktop_config.json に追加します。

{
  "mcpServers": {
    "perfonext-profiler": {
      "command": "npx",
      "args": ["-y", "@perfonext/profiler-mcp"]
    }
  }
}

新しいサーバーを読み込むため、Claude Desktop を再起動してください。

Claude Code

CLI を使ってサーバーを追加します。

claude mcp add perfonext-profiler -- npx -y @perfonext/profiler-mcp

または、同じ mcpServers エントリーを .mcp.json に追加します。

その他の MCP クライアント

stdio MCP サーバーに対応するクライアントであれば、npx -y @perfonext/profiler-mcp を起動できます。MCP サーバーの設定形式については、 クライアントのドキュメントを参照してください。

ローカルでビルドしたチェックアウトを使う場合は、command/args で node とリポジトリの dist/index.js を指定してください。

トラブルシューティング

nvm を使用する macOS での spawn npx ENOENT/spawn node ENOENT

このエラーでサーバーが起動しない場合、GUI の MCP クライアントから nvm が見えていない可能性があります。macOS の GUI アプリはシェル設定(.zshrc/.bashrc)を読み込まないため、nvm でインストールした npx/node は PATH に含まれません。 絶対パスで npx を指定し、同じ Node ディレクトリを PATH に含めてください。

{
  "servers": {
    "perfonext-profiler": {
      "type": "stdio",
      "command": "/Users/YOU/.nvm/versions/node/v<version>/bin/npx",
      "args": ["-y", "@perfonext/profiler-mcp"],
      "env": {
        "PATH": "/Users/YOU/.nvm/versions/node/v<version>/bin:/usr/bin:/bin"
      }
    }
  }
}

これらのフィールドを、クライアントのサーバーエントリーにマージします。VS Code では servers の下に、Claude Desktop/Code では mcpServers の下に追加してください。その後、アシスタントに 「Next.js サーバーの CPU プロファイルを取得するにはどうすればよいですか?」 と尋ねます。

できること

  • .cpuprofile ファイルと、CPU プロファイルデータを含む Chrome のトレースエクスポートを読み込みます
  • 自己時間に基づいて最も負荷の高い関数を特定し、呼び出し元の npm パッケージを注釈として付与します
  • 選択した関数の呼び出し元と呼び出し先の関係を説明します
  • ホットな関数の実際のソースコードを読み込み、各行に V8 のサンプル数を注釈として付与します(v0.2.0)
  • npm パッケージごとに CPU の自己時間を集計し、コストの高いサードパーティ依存関係を見つけます(v0.3.0)
  • 2 つのプロファイルを比較し、性能の退行や改善を明らかにします
  • よくあるホットスポットに対して、決定的な最適化案を返します
  • 読み込んだプロファイルを要約し、MCP クライアントがコンテキストを簡潔に保てるようにします

ツール

ツール説明
how_to_collect.cpuprofile を取得して読み込むための、すぐに実行できるコマンドと手順を返します。まだプロファイルがない場合に使用してください
load_profileディスク上の .cpuprofile ファイルまたは Chrome トレースのエクスポートを解析して読み込みます
get_hotspots自己時間が長い関数を上位から検索します。各エントリーには、npm パッケージまたは (user code) を示す package フィールドが含まれます
explain_function関数の実行時間、呼び出し元、呼び出し先を説明します。注釈付きのソース行を添付するには、includeSource: true を渡してください
read_source_contextホットな関数の実際のソースファイルを読み込み、positionTicks のティック数を各行に注釈として付けます
get_package_costsnpm パッケージごとに CPU の自己時間を集計し、最もコストの高い依存関係を示します
compare_profiles2 つのプロファイルを比較し、リグレッションを強調表示します
suggest_optimizationsホットな関数に対して、複数のパターンに基づく構造化された最適化案を生成します。ファンインの多さ、再帰、支配的な呼び出し元、V8 固有のパターンを検出します。複数の呼び出しサイトに分割された関数の重複を排除します
get_profile_summary1 つのプロファイルを要約するか、読み込み済みのすべてのプロファイルを一覧表示します

各ツールの結果には、次に自然に続く呼び出しを示す nextStep の手がかりが含まれているため、MCP クライアントは迷うことなく、収集 → 分析 → 修正のサイクルを進められます。

プロンプトの例

  • 「Next.js サーバーの CPU プロファイルを取得する方法を教えてください。」
  • 「./profile.cpuprofile の CPU プロファイルを読み込んで、上位のホットスポットを表示してください。」
  • 「このプロファイルで最も CPU を消費している npm パッケージはどれですか?」
  • 「読み込み済みのプロファイルで processData にコストがかかる理由を説明してください。」
  • 「processData の実際のソース行を表示し、最も負荷の高い行に印を付けてください。」
  • 「transformResult を説明し、注釈付きのソースコードも含めてください。」
  • 「ベースラインと現在の CPU プロファイルを比較し、遅くなった箇所を教えてください。」
  • 「上位 3 つのホットスポットに対する最適化案を提示してください。」

ツールの詳細リファレンス

ツールごとの入出力スキーマとプロファイルの手動取得 ### `how_to_collect` の詳細
// Input
{ "scenario": "next-server" } // or "script"; defaults to "next-server"

// Output
{
  "scenario": "next-server",
  "summary": "Profile a production Next.js server while it handles a single request. ...",
  "command": "node --cpu-prof --cpu-prof-dir=./.perf-profiles ./node_modules/next/dist/bin/next start",
  "steps": [ "...", "load_profile({ filePath: \"./.perf-profiles/<file>.cpuprofile\" })" ],
  "outputDir": "./.perf-profiles",
  "nextStep": "After stopping the server, call load_profile with the .cpuprofile ..."
}

next-server は、単一のリクエストを処理する本番環境の Next.js サーバーをプロファイルします。next start でスタンドアロン出力がサポートされていないと表示された場合は、.next/standalone/server.js を指定して script シナリオを使用してください。script は、そのスタンドアロンサーバー(または別の Node エントリ)をプロファイルします。シナリオは単一のルートと単一のアクセスにしてください。Node はプロセス/ワーカースレッドごとに 1 つの .cpuprofile を出力ディレクトリに書き込みます。Next サーバーのコマンドでは NODE_OPTIONS ではなく Node CLI フラグを使用するため、Unix と Windows で同じように動作します。

read_source_context の詳細
// Input
{ "profileId": "<id>", "functionName": "myFn", "contextLines": 10 }

// Output (per line)
{
  "lineNumber": 42,
  "content": "  for (let i = 0; i < items.length; i++) {",
  "ticks": 18,      // V8 samples that landed on this line
  "isHot": true     // true when ticks >= 50% of peak ticks for this function
}

返される範囲は、宣言の周囲の固定範囲ではなく、関数の実際のホットラインをカバーするように設定されます。関数の実際のボトルネックは、多くの場合、その function 行よりもかなり先にあります。 contextLines(デフォルトは 10)は、宣言とホットラインの両方の周囲に設ける最小の余白を指定します。返される範囲の外にティックが残っている場合、トップレベルの結果に hiddenTicks(件数)と、より大きな contextLines で再試行するよう促す warning が含まれます。 explain_function でも、includeSource: true を指定して呼び出す場合は contextLines を受け付けます。

読み取り可能なのは、現在の作業ディレクトリ内のファイルのみです。file:// URL と絶対パスの両方を処理します。http://、node: の組み込みモジュール、およびプロジェクトルート外のパスは拒否されます。

suggest_optimizations の詳細
// Input
{ "profileId": "<id>", "limit": 5 }

// Output (per function)
{
  "function": "processData",
  "file": "file:///app/src/processor.js",
  "line": 10,
  "selfPercent": "18.2%",
  "patterns": [
    {
      "pattern": "high-fan-in",
      "detail": "Called from 6 distinct call sites (e.g. renderRow, buildTree, …)",
      "suggestion": "This function is a shared hot path. Ensure it is well-optimised and monomorphic …"
    },
    {
      "pattern": "hot-caller",
      "detail": "84% of calls come from \"renderRow\"",
      "suggestion": "Focus optimisation effort on \"renderRow\" rather than this function …"
    }
  ],
  "topSuggestion": "This function is a shared hot path …"
}

検出されるパターン(同じ関数に複数のパターンが当てはまる場合があります):

パターントリガー
gc-pressure関数名に GC/Scavenge/MarkCompact が含まれる
json-serializationJSON.parse / JSON.stringify
regex-costRegExp / exec / test の呼び出し
v8-deoptCompile / Recompile / Optimize / Deoptimize
high-fan-in異なる親の呼び出し元が 3 つ以上
recursion関数が自身の子孫サブツリーに現れる
hot-caller1 つの呼び出し元が呼び出し箇所の出現数の 80% 以上を占める
cpu-boundほかのパターンに一致しない場合のフォールバック

複数の呼び出し箇所に現れる関数は、順位付けの前に自動的に統合されるため、同じ論理関数が重複して報告されることはありません。

get_package_costs の詳細
// Input
{ "profileId": "<id>", "limit": 10 }

// Output (per package)
{
  "rank": 1,
  "package": "lodash",
  "selfTime": "42.3ms",
  "selfPercent": "14.1%",
  "totalTimeIncludingCallbacks": "58.0ms",
  "totalPercentIncludingCallbacks": "19.3%",
  "topFunctions": [
    { "function": "chunk", "file": "lodash/chunk.js", "line": 41, "selfTime": "28.0ms", "selfPercent": "9.3%" }
  ]
}

selfTime は、パッケージ自身のコード内で費やされた時間です。totalTimeIncludingCallbacks は、そのパッケージが呼び出したすべての処理もカウントします。そこには、パッケージに渡された独自のコールバックも含まれるため、パッケージを削除した場合に実際に削減できる時間を超えることがあります。

スコープ付きパッケージ(@babel/core、@next/env など)も正しく処理されます。ユーザーコードとネイティブの組み込みモジュール(パスに node_modules が含まれないもの)は除外されます。

CPU プロファイルの生成

すぐに実行できる手順を用意するには、Copilot に how_to_collect を呼び出すよう依頼するか、手動で作成してください:

Next.js の本番サーバー(単一のリクエストをプロファイル):

node --cpu-prof --cpu-prof-dir=./.perf-profiles ./node_modules/next/dist/bin/next start
# hit the route once, then stop the process so it can exit and write the profile

next start でスタンドアロン出力がサポートされていないと表示された場合:

node --cpu-prof --cpu-prof-dir=./.perf-profiles .next/standalone/server.js

Chrome DevTools:

  1. DevTools を開き、Performance タブに移動します。
  2. 調査したいシナリオを記録します。
  3. 記録を停止し、結果を .cpuprofile エクスポートとして保存します。

関連する Perfonext ツール

開発

npm install
npm run build
npm test

このリポジトリには、ローカル検証用のサンプルフィクスチャが tests/fixtures/ にあらかじめ含まれています。

ライセンス

MIT

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。