OAuth系MCPサーバーの「接続済み?」を自動チェック。思考を止めないClaudeCode監視スクリプト

OAuth系MCPサーバーの「接続済み?」を自動チェック。思考を止めないClaudeCode監視スクリプト

2026.02.13

ClaudeCodeに指示を出した際に頻繁に以下の状況と遭遇することが増えました。
スクリーンショット 2026-02-13 14.44.36

google-calendar、todoist、notion等のOAuth系MCPサーバーを使っている際にセッション切れになると発生します。問題は接続切れに気が付かないままClaudeCodeがMCPと通信開始すると、成功しない状況下でも再試行するというプロセスが発生すること。再接続のために手動介入が必要になりますが、その際にプロンプトをキャンセルさせる必要があり、自ずと再開させるためのプロンプトも求められます。

事前にMCPの接続が切れていると判れば、プロンプトを入力する前にMCPの再接続手続きを行うことで滞りなく作業が進むはずと考え、MCPの常時監視をやってみました。

仕様

  • 5分間隔で動作
  • macOS スリープ中は間隔が自動的に開く(省電力動作で正常)
  • 切断検知時は即座に通知を送信し、次回チェックで復旧を確認

実装

OAuthの再接続は手動必須なため、自動再接続までは行いません。

  1. 監視スクリプトにてclaude mcp list の出力をパースし、切断を検知して通知
  2. LaunchAgent plist 作成・登録 — 5分間隔で自動実行
  3. 動作確認・チューニング — 通知表示テスト、チェック間隔調整
  4. ネットワーク疎通チェック(ping 8.8.8.8、3秒タイムアウト)— 失敗時は SKIP して終了(スリープ復帰直後の誤検知防止)
  5. claude mcp list を実行(30秒タイムアウト)
  6. 監視対象サーバー(google-calendar, todoist, notion)ごとに出力を確認
  7. サーバーが一覧に存在しない、または Connected でない場合は切断と判定
  8. 切断サーバーがあれば terminal-notifier(未インストール時は osascript)で macOS 通知を送信
    • 通知クリック時: claude mcp reset-auth をクリップボードにコピーし、ターミナルを開く
  9. 結果を ~/.claude/logs/mcp-monitor.log に記録
#!/bin/bash
# mcp-monitor.sh
# OAuth系MCPサーバーの接続状態を監視し、切断時にmacOS通知を送る
# LaunchAgentから定期実行される想定

set -euo pipefail

# 監視対象のOAuth系MCPサーバー
WATCH_SERVERS=("google-calendar" "todoist" "notion")

# claude CLIのパス(LaunchAgent環境ではPATHが限定されるため絶対パス指定)
CLAUDE_BIN="/path/to/claude"
NOTIFIER_BIN="/opt/homebrew/bin/terminal-notifier"

LOG_DIR="$HOME/.claude/logs"
LOG_FILE="$LOG_DIR/mcp-monitor.log"
mkdir -p "$LOG_DIR"

log() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "$LOG_FILE"
}

# claude CLIが存在しなければ終了
if [[ ! -x "$CLAUDE_BIN" ]]; then
  log "ERROR: claude CLI not found at $CLAUDE_BIN"
  exit 1
fi

# ネットワーク疎通チェック(スリープ復帰直後の誤検知防止)
if ! /sbin/ping -c 1 -W 3 8.8.8.8 > /dev/null 2>&1; then
  log "SKIP: network not available"
  exit 0
fi

# MCP接続状態を取得(タイムアウト30秒)
MCP_OUTPUT=$(timeout 30 "$CLAUDE_BIN" mcp list 2>&1) || {
  log "ERROR: claude mcp list failed or timed out"
  exit 1
}

# 切断されたサーバーを検出
DISCONNECTED=()
for server in "${WATCH_SERVERS[@]}"; do
  # サーバー名の行を抽出
  server_line=$(echo "$MCP_OUTPUT" | grep "^${server}:" || true)

  if [[ -z "$server_line" ]]; then
    # サーバーが一覧に存在しない
    DISCONNECTED+=("$server (not found)")
    log "WARN: $server not found in mcp list"
  elif ! echo "$server_line" | grep -q "Connected"; then
    # サーバーが存在するがConnectedでない
    DISCONNECTED+=("$server")
    log "WARN: $server disconnected"
  fi
done

# 切断サーバーがあれば通知
if [[ ${#DISCONNECTED[@]} -gt 0 ]]; then
  SERVERS_TEXT=$(IFS=', '; echo "${DISCONNECTED[*]}")
  log "NOTIFY: disconnected servers: $SERVERS_TEXT"

  if [[ -x "$NOTIFIER_BIN" ]]; then
    "$NOTIFIER_BIN" \
      -title "Claude Code MCP" \
      -subtitle "接続切れ検知" \
      -message "$SERVERS_TEXT が切断されています" \
      -sound "Basso" \
      -group "claude-mcp-monitor" \
      -execute 'echo "claude mcp reset-auth" | pbcopy && open -a Terminal'
  else
    # terminal-notifierがなければosascriptにフォールバック
    osascript -e "display notification \"$SERVERS_TEXT が切断されています\" with title \"Claude Code MCP\" subtitle \"接続切れ検知\" sound name \"Basso\""
  fi
else
  log "OK: all watched servers connected"
fi

スクリーンショット 2026-02-13 11.03.44

terminal-notiferの通知表示はシステム設定にて「持続的に」することをおすすめします。通知に気づくより前に消えることが多かったためです。
スクリーンショット 2026-02-13 11.42.39

稼働ログは以下のようになります。

[2026-02-13 05:49:13] OK: all watched servers connected
[2026-02-13 06:26:36] WARN: google-calendar disconnected
[2026-02-13 06:26:36] WARN: todoist disconnected
[2026-02-13 06:26:36] NOTIFY: disconnected servers: google-calendar,todoist
[2026-02-13 07:44:56] OK: all watched servers connected

あとがき

Claude Codeとの壁打ちにてベースを作成し、Geminiに確認させて出てきた改善案を元に、Claude Codeがより安定させたものとしています。例えば、再認証コマンドのクリップボードコピーはGeminiによるものです。

この監視のお陰でプロンプト実施時にMCPが切れたままになることは減りました。プロンプト実施中に切れるのは仕方ないので、途中でプロンプトをキャンセルさせてから繋ぎ直しています。

「接続断まで後N分」といった通知が出せればさらに良いのですが、接続仕様は公示されていないためログを元に解析すべく、今は様子見としています。

OAuth系MCPサーバーのセッション切れでストレスとなっている方におすすめです。

この記事をシェアする

FacebookHatena blogX

関連記事