
Claude Code v2.1.287 の主要アップデート - Claude Mods の追加とシェル書き込みの安全策強化
クラウド事業統括本部の石川です。Claude Code の v2.1.287(2026-10-01 公開)がリリースされました。本記事では主要な変更点を整理し、本日は、話題の新機能の Claude Mods を実際に試してみました。
前回のアップデート記事はこちらです。
アップデートサマリー
v2.1.287 では 106 件の変更が入りました。CHANGELOG の項目の内訳は、Fixed(修正)が 67 件、Improved(改善)が 20 件、Changed(変更)が 10 件、Added(追加)が 9 件です。追加にはプラグインの拡張機構や MCP・OpenTelemetry まわりの機能が、変更にはシェル経由の書き込みの確認や Bedrock などでのコンテキストウィンドウの既定値が含まれます。修正はスクリーンリーダーモード、クラウドセッションと Remote Control、VS Code 拡張機能に多く入っています。
注目のアップデート
Claude Mods が追加(新機能)
プラグインで Claude Code の画面表示や動作そのものを変更できる「Claude Mods」が追加されました。既存の設定ファイルの hooks、スキル、ステータスライン、MCP サーバーは Claude Code の外側で動き、スクリプトを実行するか、Claude にテキストやツールを渡します。mod は Claude Code の内部で動くため、これらではできない変更ができます。
公式ドキュメントによると、mod は JavaScript または TypeScript で書いたイベントハンドラー(hooks module)を持つプラグインです。ツール呼び出し、プロンプトの送信、画面の描画などのイベントが起きると、Claude Code が mod の hook を呼び出します。hook はそのイベントを監視する、書き換える、自分で応答して本来の処理を置き換える、のいずれかを行います。これにより、トランスクリプトの横のペインやプロンプト上の帯を描画したり、Claude のターンを介さずに自分の関数を実行する /command を追加したりできます。
mod は v2.1.287 以降で利用でき、既定で有効です。通常のプラグインと同じくマーケットプレイスからインストールでき、--plugin-dir で一時的に読み込むこともできます。mod はサンドボックス化されず、ユーザーの権限でファイルの読み書き、プログラムの起動、ネットワークリクエストができます。そのため公式ドキュメントでは、信頼できる作者とマーケットプレイスの mod だけをインストールするよう求めています。
mod を止めるには、/plugin で個別に無効化する、--safe-mode で起動する、~/.claude/settings.json に "disableAllHooks": true を設定する、といった方法があります。組織の管理者は、managed settings でユーザーがインストールした mod の読み込みを止めることもできます。なお、早期アクセス時の環境変数 CLAUDE_CODE_ENABLE_FUNCTION_HOOKS は v2.1.287 以降は無視されるため、0 を設定しても mod は無効になりません。
トランスクリプトの横に独自のペインを表示したい、Claude に応答させずに自作の関数をすぐ実行する /command を追加したい、といった形で Claude Code を自分用に拡張したい方に役立つ変更だと感じます。
組み込み mod「You should know」が追加(新機能)
組み込みの mod として「You should know」が追加されました。この mod を有効にすると、作業中の Claude とは別のエージェントが並行して動き、ユーザーや Claude が見落としそうな点を知らせます。
利用できるのは、テレメトリが有効なファーストパーティのセッションです。ファーストパーティのセッションとは、Amazon Bedrock や Google Cloud's Agent Platform などを経由せず、Anthropic の API に直接接続しているセッションを指します。この接続ではテレメトリは既定で有効です。mod は次のコマンドで有効にします。
/plugin enable cc-plugin-you-should-know@builtin
公式ドキュメントの組み込み mod の一覧によると、この mod は既定で無効です。Claude が長めのタスクに取り組んでいる間に、知っておくべき点をプロンプトの上にメモとして表示します。
Anthropic の API に直接接続し、テレメトリを無効にしないまま長めのタスクを任せている方は、有効にして挙動を確かめてみる価値があると感じます。
CLAUDE.md が再度添付される問題を修正(不具合解消)
セッションを再開した後やコンパクションの後に、フォルダーの CLAUDE.md がもう一度添付される問題が修正されました。
長いセッションで再開やコンパクションを繰り返す使い方では、同じ CLAUDE.md の重複がなくなる分、コンテキストの無駄が減ると推測します。
シェル経由の削除・書き込みに対する確認の強化(セキュリティ)
シェルコマンド経由の削除・書き込みについて、確認を求める範囲を広げる変更と修正が 3 件入りました。
- 危険な
rm(/やホームディレクトリに対するものなど)は常に確認を求めますが、同じコマンドで~やワイルドカードのパスへ出力をリダイレクトしていると、この確認が外れる問題が修正されました。 - リポジトリにコミットされたシンボリックリンクを経由して、機密ファイルや作業ツリーの外へ書き込むシェルコマンドは、書き込み先を示して人の確認を待つようになりました。
~を書き込み先とする行も対象です。 - ツール全体を許可する
Bashの allow ルールや、許可を返すフックがあっても、Claude Code のファイルツールが拒否するファイル(Anthropic のプロファイルストア、ホストの認証情報ファイル)へのシェル書き込みは実行されず、確認を求めるようになりました。
Bash をツール全体で許可している方や、コミット済みのシンボリックリンクを含む外部のリポジトリを扱う方に、特に関係の深い変更と感じます。
OpenTelemetry の user_prompt イベントに prompt_text が追加(セキュリティ)
OpenTelemetry の user_prompt イベントに prompt_text 属性が追加されました。ドット付きのキーをネストして扱うバックエンド向けに用意された、prompt のコピーです。CHANGELOG では、prompt を削除・マスクしている箇所では prompt_text も同じように削除・マスクするよう案内しています。なお、公式ドキュメントでは、prompt は既定で伏せ字(redacted)になり、OTEL_LOG_USER_PROMPTS=1 を設定すると本文が含まれると説明されています。
OTEL_LOG_USER_PROMPTS=1 でプロンプト本文を送り、コレクターやバックエンド側で属性名を指定して prompt をマスクしている構成では、prompt_text をルールに追加しないと本文がマスクされずに残ると考えます。
アップデート内容
新機能
- Claude Mods: プラグインが Claude Code のより深い挙動を変更できるようになりました(前述)。
- 組み込み mod「You should know」: Claude とは別のエージェントが、見落としそうな点を知らせる組み込み mod です(前述)。
- OpenTelemetry の
prompt_text:user_promptイベントにpromptのコピーであるprompt_textが追加されました(前述)。 - agents ビューの
n:<text>フィルター: セッション名とタスクにマッチするフィルターが追加されました。フィルター時は折りたたまれたセクション内の一致も表示され、Enter で最初の一致を開きます。 - セルフホストランナーの組み込み
gh api: Anthropic 管理の git を使うセッションで、GitHub CLI がインストールされていない macOS/Linux マシン向けに、REST のみに対応したgh apiが組み込まれました。 - [VS Code] Run in background: 実行中のコマンドやサブエージェントをバックグラウンドに移して、作業を続けられるようになりました。
- [VS Code] エージェントマップでの出力表示: バックグラウンドシェルと Monitor の出力が、エージェントマップのカードに表示されるようになりました。
- [Windows] シェルツールが使えなくなる設定の警告: Bash ツールを拒否すると PowerShell ツールも無効になり、Claude がシェルツールを使えなくなる場合に、起動時に警告が表示されるようになりました。
MCP サーバーの URL プロンプトへの対応は、後述の「破壊的変更・既定値の変更」で扱います。
セキュリティ
- シェル経由の削除・書き込みに対する確認の強化: 危険な
rm、コミット済みシンボリックリンク経由の書き込み、保護対象ファイルへのシェル書き込みの 3 件です(前述)。 __proto__という名前の MCP ツールで組織の権限上限が無視される問題を修正: 組織が設定したツール単位の権限上限が、__proto__という名前の MCP ツールでは黙って無視されていました。- Linux のサンドボックス化された Bash コマンドが実行ファイルのハンドルを継承する問題を修正: サンドボックス化された Bash コマンドが、Claude Code の実行ファイルへの開いたハンドルを継承していました。
改善
claude agentsからの返信の扱いを変更: 返信がキューに入ったメッセージとして届くようになりました。ターンの実行中に送った/stop以外のスラッシュコマンドは、そのターンの終了時に実行されます。- MCP サーバーの
alwaysLoad: falseの挙動を変更: そのサーバーのすべてのツールが、ツール検索の後ろに遅延されるようになりました。 - メッセージ途中の
/skill名をスキルとして Claude に伝えるよう改善:disable-model-invocationを設定したスキルも対象です。 - 大きな MCP ツール結果の扱いを改善: メモリ使用量とセッションファイルが小さくなり、上限を大きく超える結果では、トークン数を数えるための追加のアップロードを行わなくなりました。
- [Windows] Bash ツールの速度を改善: すべてのコマンドの前に実行していたサブシェルが取り除かれました。
- このほか、
/configと/memoryのキー操作、権限プロンプトの表示(ツール呼び出しを破線で囲む、待機中のプロンプトを古い順に表示する)、ライトテーマのコントラスト、自動モデル切り替え時の effort レベルの維持、右クリック・中クリックでの貼り付けのタイミング、リモートセッションから Claude が送るファイルの扱い(再試行、ディスクからのストリーミング、エラーの説明)、プラグインとマーケットプレイスのエラー表示、VS Code 拡張機能・Claude Tag・Code Review の細かな挙動などが改善・変更されています。スクリーンリーダーモードは行の書き込み方法が変わり、CLAUDE_AX_PREPARK_MS=50を設定すると従来の待機に戻せます。
修正
- CLAUDE.md が再度添付される問題を修正: セッションの再開後やコンパクション後に、フォルダーの CLAUDE.md がもう一度添付されていました(前述)。
- MCP コネクタのツール呼び出しが 2 回実行される問題を修正: MCP サーバーが対応するプロトコルバージョンを変えたとき、コネクタのツール呼び出しがまれに 2 回実行される、またはそのコネクタの呼び出しが再起動まで失敗することがありました。
- フルスクリーンセッションが異常終了する原因を修正: 低速・高負荷のマシンで長い会話中にスクロールキーを押し続けると、"Claude Code exited after an unrecoverable interface error" で終了することがあり、その原因の 1 つが修正されました。
- Bedrock/Vertex で
availableModelsが無視される問題を修正: 起動時のモデルチェックが強制されたavailableModelsリストを無視し、/modelが Opus の 1 行だけになることがありました。 - Bedrock Guardrails のブロックが API エラーになる問題を修正: 応答が思考(thinking)から始まった場合に、応答の途中で届いた Amazon Bedrock Guardrails のブロックが、ガードレールのメッセージではなく API エラーでターンを終えていました。
- Bedrock をバックエンドとするゲートウェイでリクエストが拒否される問題を修正:
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETASを設定しても、セッションタイトルとプロンプトフックのリクエストから structured-output 形式が除かれず、Bedrock をバックエンドとするゲートウェイに拒否されていました。 - クラウドセッションで会話が失われる問題を修正: コンパクション中にセッションが再起動すると、それ以前の会話が失われることがありました。
- Remote Control がメッセージを受信しない問題を修正: 再接続リクエストに応答がないと、数分間メッセージを受信しない状態になっていました。30 秒で打ち切って再試行するようになりました。
asyncRewakeフックが Claude を繰り返し起こす問題を修正: フックのスクリプトファイルが存在しないとき、"found issues" 通知で Claude が繰り返し起こされていました。壊れたフックは 1 回だけ報告されるようになりました。- このほか、スクリーンリーダーモード、Remote Control とクラウドセッション、
claude agents、/ultrareview、VS Code 拡張機能、Claude Tag、Code Review など、多数の細かな不具合が修正されています。
破壊的変更・既定値の変更
MCP サーバーの URL プロンプトに対応(互換性に影響する変更)
2025-11-25 版のプロトコルを使う MCP サーバーから、サインインなどのための URL プロンプトを受け取れるようになりました。公式ドキュメントでは、URL モードの要求を受けると Claude Code がブラウザでリンクを開くかを尋ね、承諾すると開くと説明されています。
CHANGELOG では、このアップデートの後に接続できなくなった MCP サーバーがある場合、その MCP 設定エントリに "bareElicitationCapability": true を追加するよう案内しています。以下は設定例です(サーバー名と URL は仮のものです)。
対処前(v2.1.287 で接続できなくなった設定):
{
"mcpServers": {
"example-server": {
"type": "http",
"url": "https://mcp.example.com/mcp"
}
}
}
対処後:
{
"mcpServers": {
"example-server": {
"type": "http",
"url": "https://mcp.example.com/mcp",
"bareElicitationCapability": true
}
}
}
Bedrock・Vertex・Foundry・Claude apps gateway で 1M コンテキストが既定に(既定値の変更)
Bedrock、Vertex、Foundry、Claude apps gateway で、Opus 4.7 以降と Fable が [1m] サフィックスなしで 1M コンテキストウィンドウを既定で使うようになりました。200K を維持したい場合は CLAUDE_CODE_DISABLE_1M_CONTEXT=1 を設定します。
公式ドキュメント(Model configuration、2026-10-02 時点)では、Amazon Bedrock・Google Cloud's Agent Platform・Microsoft Foundry で [1m] を付けないモデル ID は 200K で動作し、1M を使う場合はモデル ID に [1m] を付けると説明されています。以下は、モデル ID を環境変数で固定している場合の設定例です(モデル ID の形式はプロバイダーによって異なります)。
変更前(〜v2.1.286):
# 1M コンテキストを使うには、モデル ID に [1m] を付ける
export ANTHROPIC_DEFAULT_OPUS_MODEL='claude-opus-4-8[1m]'
変更後(v2.1.287〜):
# Opus 4.7 以降は [1m] を付けなくても 1M コンテキストが既定
export ANTHROPIC_DEFAULT_OPUS_MODEL='claude-opus-4-8'
# 200K を維持したい場合
export CLAUDE_CODE_DISABLE_1M_CONTEXT=1
Claude Mods を試してみた
Claude Mods を、公式ドキュメント(Create a mod)のチュートリアルにある最小の mod「first-mod」を使って試してみます。first-mod は、Claude のツール呼び出しの回数を数えてスピナーの横に表示し、回数を出力する /tally コマンドを追加するという流れです。
スピナーとは、Claude が作業している間、プロンプトの入力欄の上に表示される 1 行の表示です。Thinking… のように、作業中であることを示す語が表示されます。first-mod は、この語の後ろに · tool calls: 3… のような回数を付け足します。
全体の流れ
前提条件
- Claude Code v2.1.287
- macOS または Linux の bash / zsh
完成時のファイル構成
first-mod/
├── .claude-plugin/
│ └── plugin.json
└── hooks/
├── hooks.json
└── register.js
| ファイル | 役割 |
|---|---|
.claude-plugin/plugin.json |
プラグインのマニフェスト。mod 用の特別なフィールドはありません |
hooks/hooks.json |
modules キーで hooks module(mod のコード)のパスを指定します。このキーがあると、プラグインが mod として扱われます |
hooks/register.js |
hooks module。どのイベントでどの関数を実行するかを Claude Code に登録します |
register.js の 4 つの hook は、次のように変数 calls を共有します。
Step 1: ディレクトリを作る
作業用のディレクトリに移動し、mod のファイルを置く 2 つのディレクトリを作ります。以降のコマンドはすべてこのディレクトリで実行します。
mkdir -p first-mod/.claude-plugin first-mod/hooks
Step 2: マニフェスト(plugin.json)を作る
cat > first-mod/.claude-plugin/plugin.json <<'EOF'
{
"name": "first-mod",
"version": "0.1.0",
"description": "Counts Claude's tool calls, shows the count beside the spinner, and adds a /tally command",
"author": { "name": "Your Name" }
}
EOF
Step 3: コードの場所を指定する(hooks.json)
modules には、hooks.json からの相対パスで hooks module を 1 つ指定します。
cat > first-mod/hooks/hooks.json <<'EOF'
{
"description": "The first-mod hooks module",
"modules": ["./register.js"]
}
EOF
Step 4: mod のコードを書く(register.js)
cat > first-mod/hooks/register.js <<'EOF'
// The count, shared by the hooks below
let calls = 0
// Claude Code calls this once when the mod loads
export function register(on) {
// Runs when the session starts, before your first prompt
on('session.start', async ($, e, next) => {
// Add the /tally command
await $.command.register({
name: 'tally',
description: 'Show how many tool calls Claude has made',
})
// Let the session start as usual
return next(e)
})
// Runs each time Claude is about to use a tool
on('tool.call', async ($, e, next) => {
calls += 1
// Ask Claude Code to draw the interface again, so the new count shows
$.ui.invalidate('ui.render')
// Let the tool run as usual
return next(e)
})
// Runs when you type /tally, and only then, because of the matcher
on('command.run', { command: 'tally' }, async () => {
// The text to print in the transcript
return { text: 'Claude has made ' + calls + ' tool calls since this mod loaded' }
})
// Runs each time Claude Code draws the spinner
on('ui.render', { component: 'Spinner' }, async ($, e, next) => {
// Keep Claude Code's spinner, with the count added after its word
return next({ ...e, props: { ...e.props, suffix: ' · tool calls: ' + calls + '…' } })
})
}
EOF
mod が読み込まれると、Claude Code は register 関数を呼び出し、引数に関数 on を渡します。on を 1 回呼ぶごとに、指定したイベントの hook(イベントハンドラー)が 1 つ登録されます。各 hook は、mods API($)、イベントの入力(e)、次の処理に渡す関数(next)の 3 つを引数に受け取ります。
| hook | 実行されるタイミング | 処理内容 | イベントの扱い |
|---|---|---|---|
session.start |
セッション開始時(最初のプロンプトの前)と、mod の再読み込み時 | /tally コマンドを登録する |
監視(next(e) を返し、セッションは通常どおり始まる) |
tool.call |
Claude がツールを使う直前 | calls に 1 を足し、画面の再描画を依頼する |
監視(next(e) を返し、ツールは通常どおり実行される) |
command.run |
/tally が入力されたとき({ command: 'tally' } で絞り込み) |
回数を含むテキストを返す | 応答(next を呼ばず、自分の結果を返す) |
ui.render |
スピナーの描画時({ component: 'Spinner' } で絞り込み) |
スピナーの語の後ろに回数を追加する | 書き換え(suffix を変更した e を next に渡す) |
3 ファイルがそろったことを確認します。
% find first-mod -type f | sort
first-mod/.claude-plugin/plugin.json
first-mod/hooks/hooks.json
first-mod/hooks/register.js
Step 5: mod をvalidateをする
claude plugin validate は、マニフェストを検査し、Claude Code が mod を読み込むときと同じ静的解析を hooks module のソースに対して行います。mod のコードは実行されません。
% claude plugin validate ./first-mod
Validating plugin manifest: /Users/ishikawa.satoru/workspaces/cc/blog/20261002-v
2.1.287/first-mod/.claude-plugin/plugin.json
Validating hooks: /Users/ishikawa.satoru/workspaces/cc/blog/20261002-v2.1.287/fi
rst-mod/hooks/hooks.json
❯ ./register.js hooks: session.start, tool.call, command.run{command=tally},
ui.render{component=Spinner}
❯ ./register.js calls: $.command.register, $.ui.invalidate
✔ Validation passed
確認ポイント
hooks:の行に、mod が処理するイベントが並んでいる(波かっこ内はフィルター)calls:の行に、mod が呼び出す mods API のメソッドが並んでいる- 最後に
✔ Validation passedと表示されている
公式ドキュメントでは、他の人が作った mod をインストールする前に、何をする mod かを確認する方法としてもこのコマンドを案内しています。
Step 6: -p モードで mod のコマンドを実行する
Step 5 では、mod のコードを実行せずに中身を調べました。Step 6 では、first-mod を実際に Claude Code に読み込ませ、mod が追加する /tally コマンドが動くかを確かめます。
対話画面は使わず、-p(print モード)で実行します。-p は、渡した入力を 1 回だけ処理して結果を出力し、終了するモードです。ここでは入力として /tally を渡します。
% claude -p "/tally" --plugin-dir ./first-mod --max-turns 1
first-mod: Claude has made 0 tool calls since this mod loaded
| オプション | 意味 |
|---|---|
-p "/tally" |
対話画面を開かずに /tally を入力として渡し、結果を出力して終了する |
--plugin-dir ./first-mod |
first-mod をインストールせずに、このセッションだけ読み込む |
--max-turns 1 |
エージェントのターン数を 1 に制限する。今回の検証時に付けたオプションで、公式チュートリアルでは付けずに実行し、同じ出力が示されています |
このコマンドを実行すると、次の順に処理されます。
- Claude Code が first-mod を読み込み、
register関数を呼び出して 4 つの hook を登録する - セッションの開始時に、
session.startの hook が/tallyコマンドを登録する - 入力の
/tallyにcommand.runの hook が応答し、回数を含むテキストを返す。hook はnextを呼ばないため、Claude は応答しない - Claude Code がテキストの先頭にプラグイン名(
first-mod:)を付けて出力し、終了する
Claude に作業を頼んでいないためツール呼び出しは起きず、回数は 0 になります。
確認ポイント
first-mod: Claude has made 0 tool calls since this mod loadedと表示されている
このStepで動くのは session.start と command.run の hook だけです。回数を数える tool.call の hook と、スピナーに回数を表示する ui.render の hook は、Step 7 の対話モードで確認します。claude -p でも mod の hook は動きますが、ペインやスピナーへの表示は対話モードのターミナルと Desktop アプリでのみ行われます。
自動で生成されたファイルを確認する
--plugin-dir で mod を読み込むと、Claude Code は mod のディレクトリに TypeScript の型定義ファイルを書き出します。
% find first-mod -maxdepth 4 | sort
first-mod
first-mod/.claude-plugin
first-mod/.claude-plugin/plugin.json
first-mod/.claude-plugin/types
first-mod/.claude-plugin/types/.gitignore
first-mod/.claude-plugin/types/claude-code
first-mod/.claude-plugin/types/claude-code-mcp
first-mod/.claude-plugin/types/claude-code-mcp/index.d.ts
first-mod/.claude-plugin/types/claude-code-tools
first-mod/.claude-plugin/types/claude-code-tools/index.d.ts
first-mod/.claude-plugin/types/claude-code/index.d.ts
first-mod/.claude-plugin/types/tsconfig.json
first-mod/hooks
first-mod/hooks/hooks.json
first-mod/hooks/register.js
first-mod/tsconfig.json
| パス | 内容(公式ドキュメントより) |
|---|---|
.claude-plugin/types/claude-code/index.d.ts |
実行中の Claude Code のバージョンで使えるイベント、mods API のメソッド、描画できる要素 |
.claude-plugin/types/claude-code-tools/index.d.ts |
組み込みツールの入力と結果 |
.claude-plugin/types/claude-code-mcp/index.d.ts |
接続していた MCP ツールの入力 |
.claude-plugin/types/tsconfig.json |
hooks module 向けのコンパイラーオプション |
tsconfig.json(mod のルート) |
mod に tsconfig.json がない場合に追加され、上の tsconfig.json を extends で参照する |
.claude-plugin/types/.gitignore の中身は * で、型定義ファイルは Git の管理対象から外れます。公式ドキュメントによると、イベントやメソッドはリリースごとに変わることがあるため、ドキュメントと型定義ファイルの内容が食い違う場合は型定義ファイルを優先します。
Step 7: 対話モードでスピナーと /tally を確認する
このStepの表示内容は、公式ドキュメントの記載に基づいています。
-
mod を読み込んで、対話モードで Claude Code を起動します。
$ claude --plugin-dir ./first-mod -
プロンプトで
/pluginを実行します。タブの下に1 mod active · first-modのように、読み込まれた mod の数と名前が表示されることを確認し、/pluginの画面を閉じます。

-
ツールを何回か呼び出すプロンプトを送ります。例えば次のように入力します。
first-mod ディレクトリのファイルを一覧して、hooks/register.js を読んでClaude が作業している間、スピナーの語の後ろに回数が表示され、ツール呼び出しのたびに増えます(例:
Thinking · tool calls: 2…)。 -
Claude の応答が終わったら、
/tallyを入力して Enter を押します。トランスクリプトに、Step 3 のツール呼び出しの回数を含む次のようなテキストが表示されます。first-mod: Claude has made 1 tool calls since this mod loaded
組み込みの /diff も mod として実装されていて、そのソースが公開されています。自分で mod を書くときの参考実装として、まず読んでみる価値があると感じます。
最後に
Mods は既定で有効で、インストールした mod はユーザーの権限で動作します。組織で Claude Code を使っている場合は、mod の扱いと、Bedrock などで Opus 4.7+/Fable の 1M コンテキストが既定になった点を、展開前に確認しておくのがよいと考えます。
Claude Code を自分の作業に合わせて拡張したい方は、アップデートして公式チュートリアルの mod から試してみてはいかがでしょうか。
参考文献







