MCP サーバのデバッグ:クライアントログの読み方

Claude Desktop、Cursor、Cline が MCP サーバログをどこに書くか、接続失敗時に何を見るか、カスタムサーバに stderr 計装を入れる方法。

Operations

詳細な説明

ログの保存場所

各クライアントは MCP デバッグログをアプリ本体ログとは別に書き出します:

  • Claude Desktop(macOS)~/Library/Logs/Claude/mcp.log に加え、サーバごとに mcp-server-filesystem.log 等のファイル。
  • Claude Desktop(Windows)%APPDATA%\Claude\logs\mcp.log
  • Cursor:View → Output パネル → ドロップダウンで MCP を選択。
  • Cline:Output → Cline ドロップダウン → "MCP" で検索。

確認すべきこと

正常なサーバはクライアント起動直後に "Initialized" を出力します。よくある失敗パターン:

[error] Failed to spawn server "github": ENOENT

command 値を解決できませんでした。npx/uvx の場合、GUI アプリ環境の PATH にバイナリが含まれていないことがほとんどです — トラブルシューティング を参照。

[error] Server "postgres" exited with code 1: connection refused

接続文字列のホスト:ポートで Postgres が動いていません。DB を起動するか URI を直してください。

[error] Invalid env var GITHUB_PERSONAL_ACCESS_TOKEN: 401 Bad credentials

トークンが間違いか期限切れです — GitHub トークン で再発行してください。

自作サーバの計装

カスタムサーバ(カスタム stdio サーバ 参照)は構造化ログを stderr に書きます:

console.error(JSON.stringify({
  level: "info",
  msg: "tool called",
  tool: name,
  ts: new Date().toISOString(),
}));

stderr はクライアントのサーバ別ログにキャプチャされるため、MCP の stdio JSON-RPC フレームに影響を与えずに見えます。

ライブテール

macOS の Claude Desktop なら:

tail -F ~/Library/Logs/Claude/mcp*.log

Claude を再起動する前に別端末で開いておけば、起動中にどのサーバがいつ接続(または失敗)したかが正確に分かります。

警告の扱い

@modelcontextprotocol/server-... パッケージの "deprecated" 警告は短期的には無視して構いませんが、env 変数名が変わっていないかパッケージの CHANGELOG をアップデート前に確認してください。

ユースケース

「昨日まで動いていた設定」が突然動かなくなったときの原因切り分け — トークン期限切れ、postgres 再起動、npx キャッシュ破損、GUI 環境の PATH 欠落など。

試してみる — MCP Server Config Generator

フルツールを開く