settings.json(セッティングス・ジェイソン)

設定ファイル
settings.json
セッティングス・ジェイソン
Claude Code の動作(許可するコマンド・禁止するコマンド・環境変数の値・使うモデル等)を1ファイルにまとめて固定する設定ファイル。書式は JSON で、置き場所は4種類(user / project / local / enterprise)。Claude Code は起動時にこのファイルを読んで書いてある通りに振る舞う

料理ブログ等のプロジェクトでClaude Codeを使い始めて、許可ルールや環境変数を1ファイルにまとめて管理したい人向け

料理ブログ等のプロジェクトを Claude Code で開発していて、毎回出てくる「このコマンドを実行しますか?」の確認をルール化して止めたい時、Hugo などの環境変数を全員で揃えたい時、git push のような事故るコマンドを誰が触っても禁止にしたい時に、`.claude/settings.json`(チーム共有)または `.claude/settings.local.json`(私だけ)に書いて固定する

そもそも settings.json は何のためにあるのか

Claude Code を毎回ターミナルで起動するたびに「このコマンドは許可しますか?」と聞かれるのは、最初は安心感があるけど、3日もするとうるさい。

料理ブログの開発中、私が git status を打つたびに毎回「実行しますか?」と確認されていたら、たぶん10分で叩き消したくなります。

そこで settings.json の出番です。「git status は毎回OK」「git push は逆に絶対ダメ」「Hugo の環境変数は dev で固定」みたいなルールを、JSON という形式の1ファイルに書いておく。Claude Code は起動するたびにこのファイルを読んで、書いてある通りに動きます。

もう1つ大事なのは、このファイルを git に乗せてチームで共有できる点です。料理ブログを共同編集している友達と「許可ルール」を揃えたいとき、settings.json をリポジトリに置いておけば、全員が同じ動作で Claude Code を使えます。

噛み砕くと

家族用と個人用で、別々の手帳に分けて書いておく感覚に近いです。

家族全員が見る冷蔵庫の貼り紙には「醤油は切らさない」「日曜は米を炊く」みたいな共通ルールを書く。これが .claude/settings.json(プロジェクト全体で共有)の役割です。

一方で「私だけの好みでデプロイは rsync を使う」みたいな個人ルールは、私だけの手帳に書く。これが .claude/settings.local.json の役割。家族には押し付けない、私のリビングだけの設定。

そしてさらに上位に、家全体の家訓として「夜10時以降は静かに」みたいなルールがあります。これが企業ポリシーとして配布される enterprise 設定。誰が来ても上書きされません。

4種類の手帳が重なっていて、後から書いた方が優先される。これが settings.json の構造です。

settings.json はどこに置くと、いつ読まれるのか

4つの置き場所と、その優先順位を表にすると次の通りです。

スコープ ファイルの場所 誰のための設定か git で共有するか
user ~/.claude/settings.json 私の全プロジェクト共通 しない(個人マシンに置きっぱなし)
project <プロジェクト>/.claude/settings.json このプロジェクトのチーム全員 する(コミットして配布)
local <プロジェクト>/.claude/settings.local.json このプロジェクトの私だけ しない(.gitignore で除外)
enterprise OSごとに固定パス(macOSなら /Library/Application Support/ClaudeCode/managed-settings.json 組織全体の管理ポリシー IT部門が配布

重ね合わせの順番は enterprise > local > project > user で、上にあるほど強い。同じキーが複数のファイルに書いてあったら、上の方が勝ちます。

ただし例外として、permissions.allow みたいな配列は「上書き」じゃなく「合体(マージ)」されます。user で許可したコマンドと project で許可したコマンドは、両方有効になる。これは公式の挙動です。

つまり、組織のIT部門が enterprise で「git push 禁止」と書いたら、私が user で「git push OK」と書いてもダメ。逆に「許可リスト」はみんなのを足し合わせる方向で動きます。

料理ブログで「許可ルール+Hugo環境変数+lintフック」を1ファイルにまとめる4ステップ

共通題材は「料理ブログを Claude Code で開発している」状態です。プロジェクトフォルダは ~/projects/cooking-blog。Hugo で静的サイトを生成して、ブラウザで localhost:1313 でプレビュー、最後に rsync でサーバーにデプロイ、という構成。

ステップ1: .claude/settings.json を作って許可ルールの骨格を入れる

料理ブログのフォルダで .claude/ がまだなければ、新しく作ります。

$ cd ~/projects/cooking-blog
$ mkdir -p .claude
$ touch .claude/settings.json

そこに、チーム全員で揃えたい許可ルールを書きます。

{
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
  "permissions": {
    "allow": [
      "Bash(git status)",
      "Bash(git diff *)",
      "Bash(hugo *)",
      "Bash(npm run lint)"
    ],
    "deny": [
      "Bash(git push *)",
      "Bash(rm -rf *)",
      "Read(./.env)",
      "Read(./secrets/**)"
    ]
  }
}

allow に書いたコマンドはClaude Codeが毎回確認なしで実行する。deny に書いたコマンドは絶対に実行しない。git push は禁止しておくと、ブランチを直接本番に上げる事故が消えます。

これだけで、git statushugo server がノンストップで通るようになる。地味だけど効きます。

ステップ2: env で Hugo の動作環境を固定する

同じ settings.jsonenv を足します。

{
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
  "permissions": {
    "allow": ["Bash(git status)", "Bash(hugo *)", "Bash(npm run lint)"],
    "deny": ["Bash(git push *)", "Read(./.env)"]
  },
  "env": {
    "HUGO_ENV": "dev",
    "BASH_DEFAULT_TIMEOUT_MS": "300000"
  }
}

HUGO_ENV=dev を入れておくと、Hugo がプレビューモードで動いて下書き記事も表示してくれます。BASH_DEFAULT_TIMEOUT_MS は1コマンドの待ち時間上限を5分に伸ばす設定。Hugo のビルドが大きくなると2分(初期値)では足りなくなることがあるので、最初から伸ばしておく。

ステップ3: 個人だけの設定を .claude/settings.local.json に分離する

「私のマシンだけで rsync デプロイを許可したい」みたいな個人専用ルールは、別ファイルに書きます。

$ touch .claude/settings.local.json
{
  "permissions": {
    "allow": [
      "Bash(rsync -avz public/ user@example.com:/var/www/cooking/)"
    ]
  }
}

これで私のマシンでは rsync デプロイが通るけど、共同編集者の友達のマシンでは通らない。友達は友達の settings.local.json に、その人専用のデプロイ先を書く形になります。

そして、このファイルは git に乗せたくない。次のステップで .gitignore に追記します。

ステップ4: .gitignore に追記してチームに push する

プロジェクト直下の .gitignore を開いて、次の1行を足します。

.claude/settings.local.json

これで git status しても settings.local.json はリストに出てこない。逆に settings.json(プロジェクト共有)はちゃんと候補に出てくる。

あとはコミットして push するだけです。

$ git add .claude/settings.json .gitignore
$ git commit -m "add Claude Code shared settings"
$ git push origin main

共同編集者がリポジトリを git pull すると、自動的に .claude/settings.json が降ってきて、許可ルールと env が共有される。これでようやく「全員で同じ動作」が実現します。

主要な設定キーの早見表

料理ブログ題材で具体例を入れた、よく使うキーの一覧です。

キー 役割 料理ブログでの例
permissions.allow 確認なしで通すルール "Bash(hugo *)"
permissions.deny 絶対に通さないルール "Bash(git push *)"
permissions.ask 毎回確認するルール "Bash(rm *)"
permissions.defaultMode 未定義の操作にどう振る舞うか "default" / "acceptEdits" / "plan"
permissions.additionalDirectories 作業フォルダ外のアクセス先を追加 ["~/projects/cooking-images"]
env 環境変数の値を固定 {"HUGO_ENV": "dev"}
model 使うモデル指定 "claude-sonnet-4-6"
defaultShell 使うシェル指定 "bash" または "powershell"
cleanupPeriodDays セッションログの保持日数 30
hooks 特定のタイミングで自動実行するスクリプト コミット前に npm run lint を回す
attribution.commit コミットに自動で付ける署名 "🤖 Generated with Claude Code"
disabledMcpjsonServers / enabledMcpjsonServers MCPサーバーの個別ON/OFF ["puppeteer"]

全キーは公式docs(記事末リンク)に載っています。最初は permissions と env だけで十分。

編集の3ルートをどう使い分けるか

settings.json を書き換える方法は3つあります。

  • テキストエディタで直接書く。VS Code で開いて手で JSON を書き換える。$schema 行を入れておくとオートコンプリートが効くので、キー名のスペルミスが減ります。一番自由度が高い
  • /permissions スラッシュコマンド。Claude Code 起動中に /permissions と打つと、許可ルールの一覧パネルが開いて、対話的に追加・削除ができる。permissions セクション専用
  • /config スラッシュコマンド。同じく Claude Code 起動中に /config。設定UIが立ち上がって、permissions 以外も含めた主要な設定キーを画面から触れる。公式が推奨しているのはこのルート

私はチームで共有する .claude/settings.json はエディタで直接編集して、git diff でレビューしやすくする派。/permissions は「とりあえず1個許可ルールを足したい」みたいな軽い時に使います。

project scope と local scope を分ける運用

これが一番つまずきやすい部分です。

.claude/settings.json(project)には何を書くか。チーム全員で揃えたい動作だけ。料理ブログなら「Hugo を許可」「lint を許可」「git push を禁止」「HUGO_ENV=dev」みたいな共通ルール。これを git にコミットして配布します。

.claude/settings.local.json(local)には何を書くか。私だけのデプロイ先、私だけが使うAPIキー、私だけの好み(モデルを Opus に固定したい等)。これは .gitignore で除外して、git には乗せない。

判断の境目。「これを共同編集者のマシンに送り込んでいいか?」と自問して、迷うなら local に置く。秘密のキーや個人のサーバーアドレスを project 側に書いてコミットすると、git の履歴に永遠に残るので注意。

料理ブログ題材だと、こんな分け方になります。

設定内容 置き場所 理由
Hugo / lint の許可 project 全員が使うコマンドだから揃えたい
git push 禁止 project 事故防止は全員適用
HUGO_ENV=dev project みんな同じプレビュー条件で動く
rsync デプロイ許可 local 私の本番サーバーアドレスは秘密
使うモデル指定 local 個人の好み、人それぞれ
API キー local(できれば env ファイル経由) 絶対にコミットしてはいけない

料理ブログでの使いどころ3シナリオ

シナリオ1: 「hugo server を毎回確認されるのが鬱陶しい」

料理ブログのプレビューを立ち上げる時、Claude に hugo server -D を叩かせるたびに「実行しますか?」と聞かれる。1日10回叩いてたら、確認だけで5分溶けます。

project の settings.json"Bash(hugo *)" を allow で1行入れる。これで全員が確認なしで Hugo を回せる。共同編集者にも同じ恩恵。

シナリオ2: 「下書き記事だけ見たいので Hugo の draft 指定を常に有効にしたい」

Hugo は HUGO_ENV=dev の時に下書きを表示する仕様(公式ドキュメント記載)。毎回 HUGO_ENV=dev hugo server -D と打つのは長い。

project の settings.jsonenv"HUGO_ENV": "dev" を入れる。Claude Code から起動するすべてのコマンドで自動的にこの値がセットされて、もう打たなくていい。

シナリオ3: 「コミット直前に lint を必ず通したい」

料理ブログの記事HTMLが構文エラーで本番に上がる事故を防ぎたい。hooks セクションで PreToolUse を使い、Claude が git commit を叩こうとした瞬間に npm run lint を自動で走らせる設定を書きます。

lint がエラーを返したら、Claude のコミット操作はそこで止まる。この仕組みは hooks の本記事の範疇外なので、詳細は別エントリ(hooks 辞書)で扱います。settings.json の役割は「フックの定義をどこに書くか」を提供することです。

初心者が踏みやすい落とし穴

  • JSON のカンマ忘れ・末尾カンマで丸ごと壊れる{"a": 1, "b": 2,} の最後のカンマで Claude Code が起動時にエラーを吐く。$schema 行を入れておくとエディタが赤線を引いてくれるので必ず入れる
  • .claude/settings.local.json.gitignore に入れ忘れて秘密をコミットする。一度公開リポジトリに上がった API キーは履歴から消すのが地獄。最初に .gitignore 1行を入れる作業を絶対飛ばさない
  • permissions.allow に "Bash(curl *)" みたいな広いルールを書く。一見便利だが、Claude が任意のURLにアクセスできてしまう。公式も「URLでフィルタしたい場合は WebFetch を使え」と警告している
  • user と project で同じキーを書いて挙動が混乱するmodel を user で "opus"、project で "sonnet" と書いたら project の方が勝ちます。「あれ?モデル変わってる」となったら project の settings を疑う
  • enterprise の deny を user で上書きしようとして失敗する。組織管理の deny は誰も上書きできない。会社支給マシンで「git push できない!」と詰まったら、IT部門に管理ポリシーを確認
  • Read/Edit の deny は Bash の cat をブロックしない"Read(./.env)" を deny に書いても、Claude が cat .env を Bash で叩いたら通る。Bash の方も deny で塞ぐか、サンドボックス機能を使う
  • パスのルールが直感と違うRead(/secrets/**) はファイルシステムの絶対パス /secrets/ ではなく、プロジェクトルートからの相対パスを意味する。本物の絶対パスは // から始める。これは公式が「混乱しやすい」と注意を出している部分
  • settings.local.json をチームに展開しようとする。設計上、local は個人専用。チーム全員に同じ設定を配りたい時は project の方に書く

関連するコマンド・ツールへの動線

参考リンク

書き方

プロジェクトフォルダ直下の `.claude/settings.json` または `.claude/settings.local.json` に JSON で書く。トップレベルの主要キーは `permissions` `env` `hooks` `model` `defaultShell` `cleanupPeriodDays` など

やってみるとこうなる

入力

{
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
  "permissions": {
    "allow": ["Bash(hugo *)", "Bash(npm run lint)"],
    "deny": ["Bash(git push *)", "Read(./.env)"]
  },
  "env": {
    "HUGO_ENV": "dev"
  },
  "model": "claude-sonnet-4-6"
}

出力例

Claude Code を次回起動した時から、`hugo server -D` や `npm run lint` は確認なしで通るようになり、`git push origin main` は実行を止められる。`HUGO_ENV=dev` がセッション中ずっとセットされた状態になり、Hugo が下書き記事を含めてプレビューしてくれる

このページに出てきた言葉

スコープ
この設定が「どの範囲に効くか」を表す区分。user(私個人の全プロジェクト)/project(このプロジェクトの全員)/local(このプロジェクトの私だけ)/enterprise(組織全体)の4段階
user scope
ホームフォルダの <code>~/.claude/settings.json</code>。私のパソコン全体で効く、個人共通の設定
project scope
プロジェクトフォルダ直下の <code>.claude/settings.json</code>。チーム全員で共有する設定。git にコミットして配布する
local scope
プロジェクトフォルダ直下の <code>.claude/settings.local.json</code>。同じプロジェクトでも私だけの設定。<code>.gitignore</code> で除外する
enterprise scope
会社のIT部門が配布する管理ポリシー。OSごとに決まったパスに置かれて、個人やプロジェクトの設定では上書きできない
重ね合わせ
4つのスコープを順番に読み込んで、後で読んだ強いスコープが前のを上書きする仕組み。ただし配列値(permissions.allow など)はマージされる
環境変数
パソコンが起動時に覚えてる設定値。Claude Code を立ち上げると settings.json の env に書いた値が常にセットされた状態になる
JSON
データを「キー:値」の形でまとめる書式。<code>{"model": "sonnet", "env": {...}}</code> みたいに波括弧で囲んで書く、プログラム同士でデータをやり取りする時の標準形式
.gitignore
リポジトリ直下に置くテキストファイル。ここに書いたファイル名は git の管理対象から外れて、コミットされなくなる。<code>.claude/settings.local.json</code> は必ずここに入れる
Hugo
ブログやサイトを高速で生成する静的サイトジェネレーター。Markdown ファイルから HTML を書き出す、料理ブログの題材として本記事で使った

関連項目

公式ドキュメント

https://code.claude.com/docs/en/settings

-

← 戻る