Claude Code CLIで1Password MCP × シークレット注入を正しく設定する — .mcp.json・~/.claude.json の実装ガイド
Claude Code CLI固有の設定(~/.claude.json / .mcp.json / settings.json)で1Password op://シークレットを安全に注入する方法を解説。op run ラッパー・${VAR}展開・スコープ設計・よくあるトラブルシュートまで実装レベルでカバー。
※ 本記事にはプロモーションが含まれています。記事内リンクから申し込みがあった場合、筆者に紹介報酬が発生します。内容は独自調査に基づいており、報酬によって評価が変わることはありません。 #PR
エンジニアのゆとです。
「1Password MCPをClaude Codeで使いたい」と調べると、Claude Desktop前提の記事ばかり出てくる。
claude_desktop_config.json に op run -- を書く方法は確かに正しい。でも、Claude Code CLIを使っている場合、設定ファイルの場所もシークレットの渡し方も、Desktopとは少し違う。
具体的にはこういう悩みだ。
~/.claude.jsonのmcpServersにop://を直接書いても展開されない.mcp.jsonのenvに平文でAPIキーを書くのは嫌だが、${VAR}がどこから来るか分からないclaude mcp add --env KEY=valueで追加したが、キーが設定ファイルに平文で保存されていた
この記事では、Claude Code CLIで1Password MCPとシークレット注入を組み合わせる方法を、設定ファイルの構造から実装手順まで整理する。
Claude Code CLIとClaude Desktopで何が違うのか
まずここを整理しておかないと、ドキュメントを読んでも混乱する。
| 観点 | Claude Desktop | Claude Code CLI |
|---|---|---|
| 設定ファイル | ~/Library/Application Support/Claude/claude_desktop_config.json | ~/.claude.json(ローカル/ユーザースコープ)、.mcp.json(プロジェクトスコープ) |
| 起動方法 | GUIアプリ | ターミナルで claude コマンド |
| シークレット注入 | 設定ファイルに op run -- を書いてサーバー起動をラップ | op run -- claude でClaude Code自体を起動するか、.mcp.json の環境変数展開を使う |
${VAR} 展開 | 対応していない | .mcp.json で対応(2025年後半以降) |
op:// ネイティブ解決 | 非対応 | 非対応(Issue #23642でリクエスト中) |
重要なのは最後の行だ。2026年6月時点で、Claude Code CLIは op:// URIをネイティブに解決しない。
設定ファイルの env に "GITHUB_TOKEN": "op://Vault/Item/field" と書いても、Claude Codeは op://... という文字列をそのままMCPサーバーに渡してしまう。Vault参照の解決は行われない。
この制約を踏まえた上で、現時点で使えるアプローチを見ていく。
前提: 1Password CLIのセットアップ
まだ入れていない場合はここから。
brew install 1password-cli
インストール後、1Passwordデスクトップアプリとの連携を有効化する。アプリの設定 → 開発者 → 「CLIとの統合を許可」をオンにする。
# 接続確認
op vault list
Vaultの一覧が返ってくれば準備完了。以降はデスクトップアプリのロック解除状態がCLIと共有される(Touch IDで解除できる)。
シークレットをVaultに登録する:
op item create \
--category "API Credential" \
--title "GitHub MCP Token" \
--vault "Claude Code MCP" \
"credential[password]=ghp_xxxxxxxxxxxxxxxx"
参照パスの確認:
op read "op://Claude Code MCP/GitHub MCP Token/credential"
# 実際の値が返ってくれば正しい
アプローチ1: op run -- claude でClaude Code自体をラップする
最もシンプルで確実な方法。
MCPサーバーの設定ファイル(~/.claude.json や .mcp.json)には op:// を書かず、代わりに環境変数参照を書く。シークレットの解決は op run が起動前に行う。
環境変数ファイルを作成する:
# ~/.env.claude-mcp (このファイルはGitにコミットしてOK — 参照パスのみ)
GITHUB_TOKEN=op://Claude Code MCP/GitHub MCP Token/credential
SLACK_TOKEN=op://Claude Code MCP/Slack MCP Token/credential
LINEAR_API_KEY=op://Claude Code MCP/Linear MCP Token/credential
MCP設定ファイルには環境変数参照を書く:
~/.claude.json(ユーザースコープ)または.mcp.json(プロジェクトスコープ):
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
}
},
"slack": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-slack"],
"env": {
"SLACK_BOT_TOKEN": "${SLACK_TOKEN}"
}
}
}
}
起動コマンド:
op run --env-file ~/.env.claude-mcp -- claude
op run が ~/.env.claude-mcp の op:// 参照を解決して実際の値を環境変数にセットし、その状態で claude を起動する。Claude Codeが ~/.claude.json の ${GITHUB_TOKEN} を読む時点では、既に環境変数に実値がセットされている。
エイリアスに登録しておく:
# ~/.zshrc または ~/.zprofile に追加
alias claude-dev='op run --env-file ~/.env.claude-mcp -- claude'
これで claude-dev を叩くだけで、1Passwordでシークレットを解決した状態のClaude Codeが起動する。
アプローチ2: .mcp.json の ${VAR} 展開を使う(プロジェクトスコープ)
Claude Code CLIは .mcp.json 内の ${VAR} および ${VAR:-default} 形式の環境変数展開をサポートしている。
これを使うと、チームでリポジトリを共有しながら、各自のローカル環境変数からシークレットを注入できる。
プロジェクトルートの .mcp.json:
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
}
},
"linear": {
"command": "npx",
"args": ["-y", "@linear/mcp-linear"],
"env": {
"LINEAR_API_KEY": "${LINEAR_API_KEY}"
}
}
}
}
このファイルはGitにコミットしてOK。値は書いていない。
各開発者の環境でシークレットをセットする方法は2つある。
方法A: op run でClaude Code自体を起動する(アプローチ1と組み合わせ)
# ~/.env.claude-mcp
GITHUB_TOKEN=op://Claude Code MCP/GitHub MCP Token/credential
LINEAR_API_KEY=op://Claude Code MCP/Linear Token/credential
op run --env-file ~/.env.claude-mcp -- claude
方法B: シェル統合で環境変数を恒常的にエクスポート
1Passwordのシェルプラグインを使うと、特定のCLIコマンドを実行するたびに自動でVaultから取得してくれる。
# 初期化(fish/zshどちらかを選ぶ)
op plugin init zsh
~/.zshrc に追加される設定で、以降はシェル起動時に1Passwordから自動取得する。
ただし、シェル統合はインタラクティブセッション専用と考えた方が良い。CI/CDや自動化スクリプトでは op run を明示的に使う。
アプローチ3: MCPサーバー側で1Password MCPを使う
1Passwordが公式に提供しているMCPサーバー(op-mcp)を使う方法もある。
これは「Claude Code → 1Password MCP → Vault」という構成で、Claude Codeのセッション中に動的にVaultからシークレットを取得できる。
インストール:
npm install -g @1password/mcp-server
# または
brew install op-mcp
設定:
{
"mcpServers": {
"1password": {
"command": "op",
"args": ["mcp", "start"],
"env": {}
}
}
}
op-mcp は1Password CLIの認証状態(デスクトップアプリのロック解除)を使って動作する。サービスアカウントトークンを設定ファイルに書く必要がない。
このアプローチでできること:
Claude Codeのセッション中に、1password MCPツール経由でVaultの操作ができる:
Vaultに保存されているGitHubトークンを使って、
リポジトリの一覧を取得してください。
こういう指示を出すと、Claude Codeが1Password MCPを経由してVaultからトークンを取得し、GitHubのAPIを叩く。セッション中の動的なシークレット取得に向いている。
一方、「起動時に特定のAPIキーを環境変数として渡す」という用途にはアプローチ1・2の方が適している。
アプローチ4: Hooks で「使う瞬間だけ」Vaultから読む(最もセキュア)
アプローチ1〜3には共通の弱点がある。op run でラップする方式(1・2)は、展開された平文シークレットがセッション中ずっと環境変数に居座る。同じセッションで動く全スキル・全フック・全サブプロセスから読めてしまう。これは GitHub Issue #23642 のコメント欄でも実際に指摘されている弱点だ。
そこで出てきたのが、Claude Code の Hooks を使って「シークレットが必要になった瞬間にだけ Vault から取得する」パターン。セッション開始時に全部 env へ流し込むのではなく、ツール実行やスキル実行のタイミングでフックが op read を走らせて、その都度だけ値を渡す。終わったら env には残らない。
settings.json のフック例(イメージ):
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": "export GITHUB_TOKEN=$(op read 'op://Dev/GitHub/token')" }
]
}
]
}
}
上は考え方を示すための例で、フックのイベント種別や環境変数の渡し方は Claude Code の Hooks 公式仕様に合わせて実装する(バージョンで挙動が変わるため、最新ドキュメントを確認)。重要なのは構造で「シークレットの寿命を、セッション全体 → 実行時だけ、に縮める」こと。実際 Issue #23642 でも、ユーザーが「shell alias で事前解決する方式から、フックで実行時にVaultから読む方式に乗り換えた(セッション中ずっと env に置かないため)」と報告している。op:// ネイティブ対応が来るまでの、現時点で最もセキュアな方向性と言える。
手間は増えるので、個人の開発環境ならアプローチ1で十分/チーム・本番に近い環境や、複数スキルが同時に走る構成ならアプローチ4、という使い分けになる。
スコープ設計: どの設定ファイルに何を書くか
Claude Code CLIのMCPスコープは3種類ある。
| スコープ | 保存場所 | 対象 |
|---|---|---|
| ローカル | ~/.claude.json(プロジェクトパス単位) | 現在のプロジェクトのみ、自分だけ |
| プロジェクト | .mcp.json(プロジェクトルート) | チーム共有、バージョン管理する |
| ユーザー | ~/.claude.json(グローバル) | 全プロジェクトで使うサーバー |
シークレット管理の観点での選択指針:
ローカルスコープ → 個人の開発環境固有のシークレットを含む設定。チームに公開したくない場合。claude mcp add(デフォルト)で追加すると ~/.claude.json のプロジェクトパス配下に保存される。
プロジェクトスコープ → .mcp.json として git commit する。シークレット本体は ${VAR} 参照で環境変数から取る。チームメンバー全員が同じMCP設定を使う場合。
ユーザースコープ → 全プロジェクトで使う汎用サーバー(例: GitHub、Slack)を設定。claude mcp add --scope user で追加。
典型的な分割パターン:
.mcp.json(プロジェクト、Git管理)
└── ${VAR} 参照のみ。サーバー定義はここ
~/.env.claude-mcp(ホームディレクトリ、Git管理外)
└── op:// 参照。op runで解決する
~/.claude.json(個人のローカルスコープ)
└── チームに公開しないMCPサーバー
claude mcp add で追加したシークレットの問題
claude mcp add --env KEY=value でサーバーを追加すると、KEY=value の値が ~/.claude.json にそのまま書き込まれる。
# これをやると...
claude mcp add --env GITHUB_TOKEN=ghp_actual_token -- github npx -y @modelcontextprotocol/server-github
# ~/.claude.json に平文で保存される
{
"projects": {
"/path/to/project": {
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_TOKEN": "ghp_actual_token" ← 平文
}
}
}
}
}
}
~/.claude.json はGitには入らない。でも、Dotfilesとしてバックアップしている場合、TimeMachineのバックアップ先、他デバイスへの設定転送時にシークレットが漏洩する。
正しい手順:
# 環境変数参照のみを書く
claude mcp add \
--env GITHUB_PERSONAL_ACCESS_TOKEN='${GITHUB_TOKEN}' \
--transport stdio github \
-- npx -y @modelcontextprotocol/server-github
'${GITHUB_TOKEN}' をシングルクォートで囲むことで、シェルが展開する前にリテラル文字列として設定ファイルに書き込まれる。実行時に環境変数から展開される。
実運用でのセットアップ手順(まとめ)
環境のゼロから整備する場合の手順。
Step 1: 1Password CLIのセットアップ
brew install 1password-cli
# 1Passwordアプリで「CLIとの統合を許可」を有効化
op vault list # 確認
Step 2: MCPシークレット専用Vaultの作成
op vault create "Claude Code MCP"
Step 3: シークレットをVaultに登録
# GitHub
op item create \
--category "API Credential" \
--title "GitHub MCP Token" \
--vault "Claude Code MCP" \
"credential[password]=ghp_xxxxxxxxxxxxxxxx"
# Linear
op item create \
--category "API Credential" \
--title "Linear MCP Token" \
--vault "Claude Code MCP" \
"credential[password]=lin_api_xxxxxxxxxxxxxxxx"
Step 4: 環境変数ファイルを作成
cat > ~/.env.claude-mcp << 'EOF'
GITHUB_TOKEN=op://Claude Code MCP/GitHub MCP Token/credential
LINEAR_API_KEY=op://Claude Code MCP/Linear MCP Token/credential
SLACK_TOKEN=op://Claude Code MCP/Slack MCP Token/credential
EOF
Step 5: プロジェクトの .mcp.json を作成
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
}
},
"linear": {
"command": "npx",
"args": ["-y", "@linear/mcp-linear"],
"env": {
"LINEAR_API_KEY": "${LINEAR_API_KEY}"
}
}
}
}
Step 6: 起動エイリアスの設定
# ~/.zshrc に追加
alias claude-dev='op run --env-file ~/.env.claude-mcp -- claude'
Step 7: 動作確認
claude-dev
# Claude Codeが起動したら
/mcp
# 接続済みMCPサーバーの一覧が表示される
トラブルシュート
${GITHUB_TOKEN} が展開されない
症状: MCPサーバーが $GITHUB_TOKEN is not set エラーで起動しない。
原因1: op run なしで claude を起動している。
# NG
claude
# OK
op run --env-file ~/.env.claude-mcp -- claude
原因2: .mcp.json の展開構文が間違っている。${VAR} の形式でなければならない。$VAR や %VAR% は展開されない。
// NG
"env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "$GITHUB_TOKEN" }
// OK
"env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}" }
[ERROR] authorization prompt dismissed
症状: op run 実行時にこのエラーが出てClaude Codeが起動しない。
原因: 1Passwordアプリがロックされている。macOSのスリープ後などにロックされる。
対処:
# 1Passwordアプリをアンロックしてから再実行
op vault list # アンロック確認
op run --env-file ~/.env.claude-mcp -- claude
設定 → セキュリティ → 自動ロックの時間を長めに設定するか「画面ロック後にロック」に変更すると発生頻度を下げられる。
op:// 参照パスが見つからない
症状: could not find item "GitHub MCP Token" in vault "Claude Code MCP" エラー。
# Vault内のアイテム一覧で正確な名前を確認
op item list --vault "Claude Code MCP"
# フィールド名の確認
op item get "GitHub MCP Token" --vault "Claude Code MCP" --format json | jq '.fields[] | {id, label}'
Vault名・アイテム名・フィールド名は大文字小文字を区別する。スペースを含む場合はダブルクォートで囲む。
.mcp.json のプロジェクトスコープサーバーが承認を求めてくる
仕様。セキュリティ上の理由で、.mcp.json からのプロジェクトスコープサーバーは初回起動時に承認が必要。
# インタラクティブモードで起動して承認する
claude
# /mcp コマンドで一覧を確認 → Pending approval のサーバーを承認
または設定で自動承認:
// .claude/settings.json
{
"enableAllProjectMcpServers": true
}
チームでリポジトリを共有する場合は、この設定を .claude/settings.json にコミットしておくと各自が毎回承認しなくて済む。
よくある質問
Q1. op:// をClaude Code settings.jsonに直接書く方法はないのですか?
現時点(2026年6月)ではできません。GitHub Issue #23642 でネイティブサポートのリクエストが出ていますが、未実装のまま open ステータスです。現時点では op run -- claude のラッパー起動が唯一の選択肢です。
Q2. .env.claude-mcp ファイルをGitに入れても大丈夫ですか?
大丈夫です。op:// 参照が書かれているだけで実際のパスワードやAPIキーは含まれません。チームでリポジトリを共有する場合、.env.claude-mcp をコミットしておけば各自がVaultに同じアイテムを登録するだけで使えます。ただし ~/.env.claude-mcp のようにホームディレクトリに置く個人設定はリポジトリには入れない方が良いです。
Q3. claude mcp add コマンドで追加するとシークレットが設定ファイルに平文で保存されますか?
--env KEY=actualvalue の形で実値を渡した場合、~/.claude.json に平文で書き込まれます。--env KEY='${ENV_VAR_NAME}' のようにシングルクォートで環境変数参照を書けば、設定ファイルには参照文字列のみが残ります。
Q4. CI/CDでも同じ設定を使えますか?
使えます。CI環境(GitHub Actionsなど)では op run にService Accountトークンを使います。
- name: Run with 1Password secrets
env:
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }}
run: |
op run --env-file .env.claude-mcp -- claude --print "コード品質をチェックして"
Service Accountは特定Vaultへの読み取り権限のみ付与できるので、最小権限の原則を守りやすいです。
Q5. 複数プロジェクト間でシークレットを使い分けたい場合は?
プロジェクトごとに .env.mcp ファイルを作り、参照するVaultを変えます。op run --env-file .env.mcp -- claude のように起動するので、プロジェクトルートに .env.mcp を置いておけば切り替えが楽です。Vault名を Claude Code MCP (Project-Alpha) のように分けておくと管理しやすいです。
Q6. シェルを起動するたびに op run を前に付けないといけないのは面倒では?
エイリアス1行で解決します。alias claude-dev='op run --env-file ~/.env.claude-mcp -- claude' を ~/.zshrc に追加すると、claude-dev コマンドで起動するだけです。プロジェクト固有の設定が必要な場合は Makefile の make dev ターゲットに書いておくのも手です。
Q7. 1PasswordのどのプランでCLIと op run を使えますか?
個人(Individual)プランから使えます。Business以上でないと使えない機能は「チームVaultの共有」「Service Accounts」「監査ログ」などです。フリーランス・個人開発者は個人プラン($2.99/月)で十分です。
まとめ
Claude Code CLIでの1Password MCP × シークレット管理の要点:
op://のネイティブ解決はClaude Code CLIではまだ非対応(2026年6月時点)op run --env-file ~/.env.claude-mcp -- claudeがメインのアプローチ.mcp.jsonの${VAR}展開と組み合わせて、設定ファイルには参照のみ書くclaude mcp add --env KEY=valueで実値を渡すと設定ファイルに平文保存されるので注意- チームで
.mcp.jsonを共有 + 個人でop runで起動、が実用的なパターン
設定が完了すると、~/.claude.json にも .mcp.json にも平文のAPIキーが一切残らなくなる。
1Passwordはフリーランス・個人開発者でも個人プランから使え、CLIとの統合も個人プランで問題ない。MCPサーバーが増えるほど、Vault一元管理の価値が上がっていく。
関連記事



