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
Environmentを作り、.envの置き場所を決める
1Passwordで秘密情報を入れるEnvironmentを作ります。ローカルの
.envマウントは、デスクトップアプリのEnvironment画面の「Connect to」にある「Local .env file」から設定する方法もありますが、このプラグインを使うなら取り込みごとClaudeに任せられます。 - 2
プラグインを追加する
ClaudeのデスクトップアプリかWebで「Customize > Plugins > Discover」を開き、1Passwordを探して追加します。追加したプラグインは、同じClaudeアカウントでサインインしたClaude Codeのセッションに、次回起動時に同期されます。
- 3
1PasswordでMCP連携をオンにする
デスクトップアプリの「設定 > Developer」で「Integrate with MCP clients」を有効にします。これでプラグインの
.mcp.jsonがサーバーに繋がります。 - 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キーなどの保存が対象として書かれているので、同じ流れに乗るはずです。
スキルが定める取り込みの手順は次の順です。
.envをReadツールで読み、キーと値を取り出す(値はMCPにだけ渡し、チャットには書かない)authenticateでaccountIdを得るlist_environmentsで同名のEnvironmentがないか確かめるcreate_environmentで作成し、append_variablesで全変数を追加する.envがGit管理下にあれば、いったん止めて削除とコミットを求める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と組み合わせて層を重ねます。