◉CLAUDE LABEN
●2.1.309 — サンドボックスと権限チェックが厳しくなり、Windows の hooks と PowerShell の不具合も直りました(10/22)●2.1.307 — スリープやキーチェーンロックのあとに MCP が再接続されない問題を修正しました(10/21)。2.1.306 では claude -p の誤表示も解消●SONNET 4.5 — Claude API での提供終了は 11/30、残り37日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.309 — サンドボックスと権限チェックが厳しくなり、Windows の hooks と PowerShell の不具合も直りました(10/22)●2.1.307 — スリープやキーチェーンロックのあとに MCP が再接続されない問題を修正しました(10/21)。2.1.306 では claude -p の誤表示も解消●SONNET 4.5 — Claude API での提供終了は 11/30、残り37日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/Claude Code
⟐ Claude Code/2026-10-23中級

夜間の claude -p で MCP が「認証待ち」になった朝、sleep と keychain を切り分ける事前確認を足しました

Claude Code 2.1.307 は macOS の sleep とログインキーチェーンのロックが原因の MCP 失敗を修正しました。修正の有無に関わらず効く事前確認スクリプトと、sleep 履歴との照合手順をまとめます。

Claude Code275MCP59claude -p4macOS運用25

✦ プレミアム記事

自宅の Mac で、夜のうちに claude -p を回している方には、思い当たる朝があるかもしれません。ログを開くと、MCP サーバーが「needs authentication」と出ていたり、タイムアウトの扱いのまま最後まで失敗が続いていたりします。前の晩に何かを変えた覚えはありません。

Claude Code 2.1.307 の更新履歴には、まさにこの状況に当たる修正が2つありました。

症状2.1.307 での扱い(更新履歴の記述)
macOS でログインキーチェーンがロックされている間、`claude -p` で MCP が「needs authentication」と表示される理由を表示するようになり、アンロック後の次の実行では再サインインなしで接続される
macOS または Linux が MCP の接続中に sleep すると、タイムアウト扱いになり、ヘッドレス実行では失敗したままになる修正済み

直るのであれば、アップデートして終わりです。ただ、私の場合は少し違う考え方をしました。直った後でも、夜間実行の前に「いま MCP が使えるか」を確かめる習慣は残したほうが、朝の損失が小さいと判断したのです。ここでは、その事前確認と、失敗が起きた朝に原因を切り分ける手順を書き残します。

まず、失敗を3つに分けて考えます

朝に見る失敗は、見た目が似ていても原因が違います。

  • sleep 由来: 接続している最中に Mac が眠った。復帰後も失敗状態が残る
  • keychain 由来: ログインキーチェーンがロックされていて、保存済みの認証情報を読めない
  • そもそも認証切れ: サーバー側でトークンが失効した。これは待っても直りません

最初の2つは「待てば、または環境を整えれば自然に直る」種類で、3つ目は人が再サインインする必要があります。夜間実行の前に確認する目的は、この区別を実行前に付けて、直る失敗なら1回だけ待ち、直らない失敗なら最初から見送ることです。

事前確認スクリプト — claude mcp list を1行の JSON にします

claude mcp list の出力を読み、サーバーごとに接続済みか、認証待ちか、失敗かを分類します。終了コードで結果を返すので、シェルから扱えます。

#!/usr/bin/env python3
"""claude mcp list の出力を読み、夜間実行の前に MCP の状態を1行で返す。
終了コード: 0=全部接続 / 3=認証待ち・失敗・読み取り不能 / 4=claude が実行できない
"""
import re, subprocess, sys, json
 
STATE_PATTERNS = [
    ("connected", re.compile(r"Connected", re.I)),
    ("needs_auth", re.compile(r"Needs authentication", re.I)),
    ("failed", re.compile(r"Failed to connect|timed out|timeout", re.I)),
]
 
def classify(line: str) -> str:
    for name, pat in STATE_PATTERNS:
        if pat.search(line):
            return name
    return "unknown"
 
def parse(text: str) -> dict:
    servers = {}
    for raw in text.splitlines():
        line = raw.strip()
        # 例: "github: npx -y @x/server - ✓ Connected"。サーバー名は最初の ": " まで
        m = re.match(r"^([\w.\-]+):\s+(.*)$", line)
        if not m:
            continue
        servers[m.group(1)] = classify(m.group(2))
    return servers
 
def main() -> int:
    try:
        out = subprocess.run(["claude", "mcp", "list"], capture_output=True,
                             text=True, timeout=90).stdout
    except (FileNotFoundError, subprocess.TimeoutExpired) as e:
        print(json.dumps({"preflight": "no_claude", "error": type(e).__name__}))
        return 4
    servers = parse(out)
    if not servers:  # 0 件は「全部接続」ではなく「読めていない」
        print(json.dumps({"preflight": "empty_list", "raw_head": out[:120]}, ensure_ascii=False))
        return 3
    bad = {k: v for k, v in servers.items() if v != "connected"}
    print(json.dumps({"preflight": "ok" if not bad else "degraded",
                      "total": len(servers), "bad": bad}, ensure_ascii=False))
    return 0 if not bad else 3
 
if __name__ == "__main__":
    sys.exit(main())

claude mcp list の出力は、手元で確認できた範囲では「サーバー名: 起動コマンド - 状態」の形でした。バージョンによって記号や文言が変わる可能性があるため、正規表現は状態を表す語だけに絞っています。お使いの環境では、先に claude mcp list を一度実行して、行の形を確かめてからお使いください。

書いている途中で気づいた、直感に反する落とし穴

最初の版は、bad が空なら ok を返していました。ところが、claude mcp list が何も出力しない環境で実行すると、サーバー0件のまま ok と判定して終了コード 0 を返しました。

「問題のあるサーバーがない」と「サーバーが1つも読めていない」は別の状態です。0件のとき ok を返す事前確認は、いちばん役に立ってほしい場面(コマンド自体が期待どおりに動いていないとき)で、黙って通してしまいます。上のコードの empty_list の分岐は、この見落としを直したものです。MCP を使っていない構成の方は、この分岐を「0件は正常」に変えてください。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦夜間に claude -p を回す前に、MCP が使える状態かを1行で判定し、使えないなら実行を見送る仕組みを自分のマシンに入れられるようになる
✦朝になって MCP の失敗を見つけたとき、sleep が原因か認証の問題かを pmset の履歴と照合して切り分けられるようになる
✦「0 件なのに ok」と判定する見落としを、スクリプトを書く前に先回りして潰せるようになる
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⟐ Claude Code2026-10-23
夜間の claude -p で MCP が「認証が必要」と出る朝に、Mac のスリープとキーチェーンを疑う順番
無人で回した claude -p の朝のログに「needs authentication」や MCP のタイムアウトが残っているとき、Mac のスリープとログインキーチェーンのロックを先に確かめる手順です。v2.1.307 で変わった挙動と、版を上げても残る部分の線引きをまとめました。
⟐ Claude Code2026-10-24
「今後は確認しない」を押し続けた設定ファイルに、python3 が丸ごと通る一行がありました — 2.1.309 の更新履歴を読んで始めた許可ルールの棚卸し
2.1.309 は権限チェックとサンドボックスの修正が並ぶ版です。自分の settings.local.json の許可ルールを棚卸しするスクリプトと、インタプリタへの接頭辞ワイルドカードを見つけたときの直し方をまとめます。
⟐ Claude Code2026-10-22
claude -p だけがログインを認めてくれないとき — 再ログインの前に確かめる資格情報の優先順位
対話では動くのに claude -p やスクリプトからだけログインを拒まれるとき、/login をやり直す前に見る場所を、公式の認証ドキュメントの優先順位に沿って並べました。