Claude Media
Claude Codeの1Passwordプラグインで.envから秘密情報を外す

Claude Codeの1Passwordプラグインで.envから秘密情報を外す

1PasswordプラグインはClaude Codeに.envの取り込みとマウントを任せます。平文の.envが消え、Claudeには変数名とパスだけが渡ります。導入手順、使えない環境、マウントの落とし穴まで。

1Passwordのプラグインを入れると、プロジェクトの平文の.envを1PasswordのEnvironmentに取り込み、同じパスに「読まれたときだけ中身が返るファイル」を置き直す作業をClaude Codeに任せられます。ディスクに秘密情報が残らず、Claudeに渡るのは変数名とマウント先のパスだけです。

ここではClaude Codeでの導入、取り込みの流れ、使えない環境、マウント後に起きやすいつまずきを順に説明します。

このプラグインが入れ替えるもの

プラグインは2つの部品でできています。1つは1Passwordのデスクトップアプリが提供するローカルのMCPサーバーへの接続設定(.mcp.json)、もう1つは1password-environmentsというエージェント向けのスキルです。

部品置き場所役割
MCP設定置き場所.mcp.json役割1password-mcpコマンドでデスクトップアプリのMCPサーバーに接続する
スキル置き場所skills/1password-environments/SKILL.md役割取り込み、マウント、Environment管理の手順をClaudeに与える
リファレンス置き場所skills/1password-environments/reference.md役割セットアップとマウントのトラブルシュート

READMEは、MCP設定だけを手で書いて使うのではなく、プラグインとして入れるよう勧めています。MCPサーバー側の組み込みドキュメントは基本的なツールの説明にとどまり、取り込みとマウントの手順を含まないためです。その手順を持っているのが同梱のスキルです。

仕組みの核は1PasswordのEnvironmentです。秘密情報をEnvironmentに保存し、そこから.envのパスへローカルマウントを作ります。マウントされた.envは通常のファイルではありません。UNIXの名前付きパイプ(FIFO)で、読み取るプロセスが現れたときに1Passwordが中身を流し込みます。

導入前に確認すること

要件は次のとおりです。

  • 1Passwordのサブスクリプション
  • macOSまたはLinuxの1Passwordデスクトップアプリ
  • Claude Code
  • デスクトップアプリの「設定 > Developer」で「Integrate with MCP clients」をオンにできること

「Integrate with MCP clients」のチェックボックスが見当たらないときは、アカウントにai-local-mcp-serverの機能フラグが付いていない可能性があります。管理者が無効にしている場合は、管理者に「Policies > Sharing and permissions > Agentic permissions > Local MCP server」を確認してもらう必要があります。

導入手順

手順

1Passwordプラグインを動かすまで

  1. 1

    Environmentを作り、.envの置き場所を決める

    1Passwordで秘密情報を入れるEnvironmentを作ります。ローカルの.envマウントは、デスクトップアプリのEnvironment画面の「Connect to」にある「Local .env file」から設定する方法もありますが、このプラグインを使うなら取り込みごとClaudeに任せられます。

  2. 2

    プラグインを追加する

    ClaudeのデスクトップアプリかWebで「Customize > Plugins > Discover」を開き、1Passwordを探して追加します。追加したプラグインは、同じClaudeアカウントでサインインしたClaude Codeのセッションに、次回起動時に同期されます。

  3. 3

    1PasswordでMCP連携をオンにする

    デスクトップアプリの「設定 > Developer」で「Integrate with MCP clients」を有効にします。これでプラグインの.mcp.jsonがサーバーに繋がります。

  4. 4

    Claude Codeで接続を確かめる

    /pluginでプラグインの導入とMCPサーバーの接続状態を見ます。

手元のチェックアウトで試すだけなら、次のようにディレクトリを指定して起動できます。

claude --plugin-dir /path/to/1password-claude-plugin

プラグインの読み込み経路そのものは、複数ディレクトリを渡すCLAUDE_CODE_PLUGIN_DIRSの解説と、プラグインの環境変数とパスの解決ルールが詳しい資料です。

.envを取り込んでマウントする流れ

使い方は自然文の依頼です。READMEには、次のような例が載っています。

  • 「Create an Environment from my project .env file」
  • 「Import .env into 1Password and mount it here」
  • 「Mount my staging Environment as .env in this repo」
  • 「What variables are in my production Environment?」

「プロジェクトの.envを1Passwordに取り込んで、ここにマウントして」と日本語で頼んでも、スキルのdescriptionには取り込み、マウント、Environmentの一覧と作成、変数の確認と追加、APIキーなどの保存が対象として書かれているので、同じ流れに乗るはずです。

スキルが定める取り込みの手順は次の順です。

  1. .envをReadツールで読み、キーと値を取り出す(値はMCPにだけ渡し、チャットには書かない)
  2. authenticateでaccountIdを得る
  3. list_environmentsで同名のEnvironmentがないか確かめる
  4. create_environmentで作成し、append_variablesで全変数を追加する
  5. .envがGit管理下にあれば、いったん止めて削除とコミットを求める
  6. list_local_env_filesで既存のマウントを確かめ、なければcreate_local_env_fileで元の.envの絶対パスにマウントし、もう一度list_local_env_filesで検証する

6のマウントは、利用者が「マウントしない」と明示した場合を除いて必須の手順として書かれています。Environmentを作って変数を入れただけで終わると、手順としては未完了です。スキルは「マウントしますか」と聞き返すことも禁じています。

変数のconcealedは自動で振り分けられる

append_variablesでは、変数ごとにconcealed(値を伏せるか)を指定します。スキルの基準は次のとおりです。

種類concealed
APIキー、トークン、パスワード、秘密鍵、認証情報つきの接続文字列concealedtrue
ポート、公開URL、機能フラグなどの非機密の設定concealedfalse
判断がつかないものconcealedtrue

非機密だと思った値が伏せ字になっていても、1Password側で設定を変えられます。迷うものは伏せる側に倒す設計です。

同名のEnvironmentがあるとき

create_environmentの前にlist_environmentsで同名を探し、あれば勝手に選ばず利用者に聞く決まりです。選択肢は「既存のものを使う」「別の名前にする」「中止」の3つです。同じ名前で取り込み直したいときも、既存のEnvironmentには利用者の判断なしに手が入りません。

Claudeに見えるものと見えないもの

READMEが述べる設計は「秘密の値は1Passwordに残り、エージェントが見るのは変数名とマウントパス」というものです。MCPのツールを見ると、この線引きがよく分かります。

ツール説明
authenticate説明デスクトップアプリで認証し、accountIdを返す
list_environments説明アカウントのEnvironmentを一覧する
create_environment説明Environmentを作る
rename_environment説明名前を変える
list_variables説明変数名を一覧する(値は返らない)
append_variables説明変数を追加・更新する
create_local_env_file説明Environmentを.envとしてマウントする
list_local_env_files説明既存のマウントを一覧する

MCPのツール一覧に、値を読み出すツールはありません。変数の中身を確かめたいときも、スキルはlist_variablesで名前だけを見るよう定めています。

ただし、取り込みの瞬間は例外です。手順1のとおり、平文の.envをClaudeが一度Readで読みます。この間、値はモデルのコンテキストに入ります。取り込みを済ませた.envは、ディスクから消えて以後は渡らない、という構図です。

そのため、スキルの側が「マウントしたパスは読まない。変数の確認はlist_variablesを使う」と指示しています。これはスキルを読み込んだClaudeの振る舞いの話で、強制ではありません。強制したいなら、Read denyで.envを読ませない設定を併用します。ここで1点だけ注意があります。取り込み(手順1)はReadツールで.envを読む前提なので、Read(./.env)をdenyにしていると取り込みで止まります。取り込みの間だけdenyを外すか、取り込みを手元で済ませてからClaudeにマウントを頼む運用が現実的です。

マウントを使い始めてからのつまずき

Git管理下の.envが残っている

すでにGitで追跡されている.envのパスには、マウントを作る前に、ファイルを削除してコミットしておく必要があります。スキルも、削除とコミットが済むまでマウントへ進まないよう定めています。

済ませずにマウントすると、Gitの操作が「1Passwordが作ったファイルが追跡されている」と失敗することがあります。ファイルの中身がステージされることはなく、秘密が漏れる経路にはなりません。ただしgit statusには、元の.envの削除が変更として出続けます。

Viteなどで開発サーバーが再起動を繰り返す

FIFOは、開く・閉じる・読むといった操作でファイルシステムのイベントを出します。値が変わっていなくても、Viteのように.envを積極的に監視するツールは、それを変更と受け取って開発サーバーを再起動し続けることがあります。

.envの変更に反応させる必要がなければ、監視から外します。1Passwordの文書にあるvite.config.tsの例は次のとおりです。

import { defineConfig } from 'vite'
 
export default defineConfig({
  server: {
    watch: {
      ignored: ['**/.env'], // マウントしたファイル名に合わせる
    },
  },
})

複数のプロセスが同時に読む

マウントされた.envは並行アクセスを想定していません。IDEで.envを開いたまま別のプロセスが読むと、最初に読んだ側だけが成功し、ほかは失敗することがあります。ターミナルやアプリが読めないときは、IDEのタブを閉じてから試します。

オフラインの挙動と数の上限

オフライン中に読めるのは、デバイスに最後に同期された内容か、手元で変更した内容です。オンラインに戻ると、1Password側の最新の保存内容に追いつきます。有効にできるローカル.envは1デバイスにつき10個までです。

ほかのライブラリは大丈夫か

1Passwordの文書で「互換」とされているのは、DotNetEnv(C#)、Docker Compose、godotenv(Go)、dotenv-java、dotenv(Node.js)、phpdotenv、python-dotenv(v1.1.2以降)、dotenv(Ruby)、dotenvy(Rust)です。dotenvy v0.15.7はファイル名・パス・内容を直接渡す必要があります。

周辺の対策との使い分け

プラグインが解くのは、平文の.envがディスクに残る問題です。別の層の対策とは重なりません。

守りたいもの手段
ディスク上の平文の.env手段このプラグイン(Environmentのマウント)
Claudeに.envを読ませる経路手段Read deny
秘密情報のコミット手段gitleaksのフック
シェルに渡す環境変数手段direnvの設定

ブラウザやアプリにログインする認証情報をClaudeに見せずに使う連携は、プラグインとは別の仕組みで、Claudeの1Password連携にまとめています。

プラグインの更新が届くタイミング

リポジトリのREADMEによると、Anthropicのマーケットプレイスは特定のコミットからこのプラグインをインストールします。リリースを出しても利用者に届くのは、Anthropicが審査してマーケットプレイスを新しいコミットへ更新したあとです。Claude Codeはバージョン文字列が変わったときだけ更新を案内するので、mainに入っただけの変更は既存の利用者には届きません。

マーケットプレイスの掲載ページには「Anthropic verified」の表示があります。手元で動く版を固定したいときは、--plugin-dirでチェックアウトを指す方法が前述のとおり使えます。

まとめ

導入の入口はClaudeアカウント側のプラグイン追加と、1Passwordの「Integrate with MCP clients」の2つだけです。それを済ませれば、.envの取り込みとマウントは依頼1つで終わります。確認が要るのは3点です。Windowsでは使えないこと、取り込みの瞬間は平文がモデルに見えること、マウント後は1Passwordを解錠している間どのプロセスにも読めることです。この3点を踏まえて、Read denyやgitleaksと組み合わせて層を重ねます。

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