Claude Media
Claude Codeの--toolsフラグで使えるツールを絞り込む

Claude Codeの--toolsフラグで使えるツールを絞り込む

Claude Codeの--toolsフラグで組み込みツールを絞り込む書き方と、--allowedTools・--disallowedTools・--restrictedとの使い分けを解説します。

Claude Codeの--toolsフラグでできること

--toolsは、Claude Codeのセッションが起動時に使える組み込みツールをカンマ区切りで絞り込む起動オプションです。指定した名前のツールだけが有効になり、リストに無い組み込みツールはセッションから消えます。書式は単純です。空文字""を渡せば全ツール無効、"default"を渡せば既定セットに戻ります。

対象になるのはBashEditReadAgentのような組み込みツール名です。評価用のサンドボックスでファイル書き込み系のツールを丸ごと外したいときや、特定用途のセッションを最小限のツールだけで動かしたいときに使います。実際に使えるツールの一覧はプロバイダー・OS・設定によって変わるため、確実に知りたいときは動いているセッションでClaudeに直接「使えるツールは何か」と聞くか、MCPツールの正確な名前は/mcpで確認します。似た名前のフラグが他に3つあり、それぞれ役割が違うので、次の節で1つずつ分けます。

構文と具体例 — カンマ区切り・空文字・defaultの意味

構文はカンマ区切りでツール名を並べるだけです。スペースは入れません。

claude --tools "Bash,Edit,Read"

上のコマンドはBash・Edit・Readの3つだけを有効にし、WriteやWebFetchを含む他の組み込みツールは使えなくなります。全ツールを無効化したいときは空文字を渡します。

claude --tools ""

既定セットに戻したいだけなら"default"を渡します。既定セットの中身はOS依存で、次の節で扱うGlobGrepの扱いがその代表例です。

TaskCreateTaskGetTaskListTaskUpdateのようなタスク管理ツールは、Claude 3.x系・Opus 4〜4.7・Sonnet 4〜4.6・Haiku 4.5では既定で有効ですが、それ以外のモデルでは既定から外れます(この既定はClaude Code v2.1.268以降の挙動です)。--toolsのリストにタスク管理ツールの名前を含めると、対象外のモデルでもそのセッションだけタスク管理ツールを使えるようになります。

claude --tools "Bash,Edit,Read,TaskCreate,TaskGet,TaskList,TaskUpdate"

同じ効果は環境変数CLAUDE_CODE_ENABLE_TODO_TOOLS=1でも得られますが、これは全モデル・全プロバイダーに一律で効く設定です。セッション単位で狙って有効化したいなら--toolsのほうが小回りが利きますが、--allowedToolsにタスク管理ツールの名前を1つでも指定する方法でも同じセッションだけをopt-inできます(Agent SDKではallowedToolstoolsオプションが同じ働きをします)。バックグラウンドセッションとClaude Code on the webでは、モデルやリストの有無に関わらずタスク管理ツールが提供されます。

--allowedTools・--disallowedTools・--restrictedとの使い分け

似た名前のフラグが複数あり、役割は重なりません。--allowedTools(--allowed-toolsとも書けます)はプロンプトなしで実行してよいツールを指定するもので、ツールの存在自体は消しません。公式ドキュメントも「使えるツールの範囲を絞りたいなら--toolsを使う」と明記しています。--disallowedTools(--disallowed-tools)は逆に拒否ルールで、裸のツール名を渡すとそのツールをコンテキストから除去し、Bash(rm *)のようなスコープ付きルールならツール自体は残したまま特定の呼び出しだけを拒否します。

フラグ対象効果具体例
--tools対象組み込みツール(MCPは対象外)効果指定した名前だけを有効にする具体例--tools "Bash,Edit,Read"
--allowedTools対象組み込み・MCP問わず効果プロンプトなしで実行を許可(存在は消さない、タスク管理ツール名の指定はopt-inにもなる)具体例--allowedTools "Bash(git log *)" "Read"
--disallowedTools対象組み込み・MCP問わず効果裸の名前はツール自体を除去、スコープ付きは呼び出しだけ拒否具体例--disallowedTools "Edit" "Bash(rm *)"
--restricted対象コマンド実行系ツールとWebFetch効果defaultプリセットでは復元されず、--toolsの個別指名でのみ復元具体例--restricted -p "query"

--restrictedは評価用ハーネスが共有マシン上でClaude Codeを動かすような、より強いモードです。コマンドやコードを実行するツールとWebFetchを一律で外し、ファイル操作を作業ディレクトリの範囲に閉じ込め、読み込む設定も管理設定と--settingsだけに絞ります(Claude Code v2.1.248以降)。--toolsで個別に名指ししない限り、"default"を渡しても外れたツールは戻りません。--restrictedはさらにbypassPermissionsモードへの切り替えを拒否し、そのセッションからクラウドセッションを新規作成することもできません。同じ「絞り込み」でも、--restrictedはセキュリティ境界を張る機能、--toolsは用途に応じてツール一式を組み替える機能という役割分担です。

--allowedTools--disallowedToolsの公式ドキュメントの例はBash(git log *)のようなスコープ付きルールを使いますが、--toolsの例はいずれも裸のツール名だけで、スコープ付きルールの例は示されていません。ツールの一覧を絞るだけの--toolsと、呼び出し内容まで見て許可・拒否を判定する--allowedTools/--disallowedToolsとでは、想定している粒度が違うと考えたほうが混乱しません。hookのmatcherフィールドも同じように裸のツール名だけを受け付け、スコープ付きルールの書式は使いません。設定の粒度という意味では、--toolsが近いのはこちら側です。権限ルールの書き方そのものはClaude CodeのallowedTools/disallowedToolsで起動時に権限を絞る、起動モードの選び方はClaude Codeの--permission-modeで起動モードを指定するで扱っています。

macOSとLinuxでGlobとGrepが既定で消えている理由

macOS・Linux・WSLでは、GlobGrepは既定のツールセットに含まれません。Claude Codeは代わりにBash経由のfindgrepでファイル探索と検索をこなします(Windowsでは既定セットに含まれます)。この既定を知らずに--toolsで絞り込むと、狙った検索が動かない状態にはまります。

たとえば--tools "Bash,Grep"と指定した場合、Grepは使えるようになりますがGlobは既定のまま消えています。両方を戻すなら--tools "Bash,Glob,Grep"のように両方を書く必要があります。--allowedTools "Grep"のように書けば、GrepGlobが揃って復元されます。

Glob・Grepが戻る条件はもう2つあります。拒否ルールや--disallowedTools--restrictedのいずれかでBashをセッションから外すこと、そしてサブエージェントのtoolsフィールドでBashを含めずGlobGrepを指定することです。後者はそのサブエージェントだけ、あるいは--agentでメインセッションとして起動した場合はセッション全体に効きます。

もう1つ実務上のつまずきがあります。--toolsで実体のGrepツールを有効にすると、検索エンジンがripgrepに変わり、正規表現の書式もBash経由のgrepが使っていたPOSIX系ではなくripgrep流になります。Goコードのinterface{}を検索したいときはinterface\{\}のようにエスケープが必要で、これまでBash上のgrepで書けていたパターンがそのままでは通らないことがあります。

--toolsが及ばない範囲 — MCPツールとEndConversation

--toolsは組み込みツールだけを対象にし、MCPサーバーが提供するツールには影響しません。MCPツールもまとめて拒否したいときは、--toolsとは別に--disallowedTools "mcp__*"を指定します。--toolsの一覧にmcp__始まりの名前を混ぜても、MCPツールの有効・無効は変わりません。

もう1つ、--toolsのリストで名前を省略しても消えないツールがあります。EndConversationです。このツールはセッションを終了させるだけで、ファイルの読み書きや設定変更を一切しません。安全装置としての性質上セッション自身がオフにできない設計になっており、リストに含めなくても残ります。空文字""で全ツールを無効化した場合だけ、接続中のMCPツールが1つも残っていなければEndConversationも一緒に消えます。逆に言えば、MCPツールが1つでも生きていれば""を渡してもEndConversationは残ります。

EndConversation自体はClaude Code v2.1.213以降・対話型ターミナルセッション限定の機能で、-pの非対話実行、Agent SDK経由のセッション、VS Code拡張のパネル、GitHub Actions、Claude Code on the webにはそもそも登場しません。--toolsで呼び出せるツールではありません。

サブエージェントとエージェントチームへの継承

--toolsで絞ったツール一覧は、セッションが起動するサブエージェントにも及びます。サブエージェントがメインセッションと別のモデルを使っていても、Claude Codeはメインセッション側が持つツールだけをサブエージェントに渡します。サブエージェント自身のtoolsフィールドでさらに絞ることはできますが、--toolsでメインセッションから除外したツールをサブエージェント側で復活させることはできません。

エージェントチームでも考え方は同じです。同一プロセス内で動くチームメイトはメインセッションの--tools設定をそのまま引き継ぎますが、別ウィンドウ(split pane)で動くチームメイトは独立したClaude Codeプロセスとして起動するため、そのプロセス自身の起動フラグとモデル選択が別に効きます。チーム全体に同じ絞り込みを適用したいなら、メインセッションだけでなく各チームメイトの起動コマンドにも同じ--toolsを渡す必要があります。

まとめ

--toolsはセッションが使える組み込みツールの範囲そのものを決めるフラグです。プロンプトの要否を決める--allowedTools、特定の呼び出しだけを拒否する--disallowedTools、セキュリティ境界を張る--restrictedとは役割が異なります。カンマ区切りで名前を並べるだけの単純な構文ですが、macOSとLinuxでのGlob・Grep既定除外、MCPツールが対象外であること、EndConversationが原則として残ることを知らないと、狙った絞り込みになりません。

タスク管理ツールをモデル横断で有効にしたい場合や、評価用サンドボックスでツールを最小限に絞りたい場合は、まず--toolsに並べる名前を書き出し、そこに--disallowedTools "mcp__*"を組み合わせるかどうかを検討する順番で設計すれば、判断は2手で済みます。クラウドセッションでのツール制限はClaude Codeクラウドセッションで使えるツールとリソース制限、MCP側のツール数が増えたときの事情はMCPのツール定義はなぜコンテキストを圧迫するのかも合わせて確認しておくと、絞り込みの設計判断がしやすくなります。

この記事を共有:XはてブLinkedIn