mcp.jsonにAPIキーを書きたくない!1Password CLIを使ってセキュアに環境変数を渡す方法

mcp.jsonにAPIキーを書きたくない!1Password CLIを使ってセキュアに環境変数を渡す方法

2025.12.10

はじめに

アノテーション株式会社 DevOpsチームの草竹です。

ClaudeやVS CodeでMCPサーバーを利用する際、mcp.json という設定ファイルにAPIキーなどの認証情報を記述する必要がありますよね。

ただ、APIキーをそのままファイルに書いてしまうと、Git管理下に含めないよう気を配ったり、他の人と共有したりするときに、シークレット情報が丸見えになってしまいセキュリティ的にちょっと心配です。

今回は、1Password公式ブログ で紹介されていた、1Password CLI (op コマンド) を使って、コマンド実行時に動的にシークレット情報を注入する構成を試してみました!

https://1password.com/blog/securing-mcp-servers-with-1password-stop-credential-exposure-in-your-agent

この記事で得られること

  • mcp.json から平文のAPIキーをなくす方法
  • 1Password CLI を使って、安全に認証情報を管理する具体的な手順
  • 設定ファイルをGitで管理しても安心な状態を保つノウハウ

想定読者

  • VS CodeのMCP機能を利用している方
  • 設定ファイルにAPIキーを直接書きたくない方
  • 1Password CLIの便利な使い方を探している方

前提条件・環境

この記事では、以下の環境を前提としています。

  • OS: macOS
  • エディタ: VS Code
  • ツール:
    • 1Password アプリがインストール済み
    • 1Password CLI (op) がインストール済みで、サインインしていること
    • Node.js, Docker など対応するMCPサーバーの起動コマンド
  • 検証対象MCPサーバー: nulab/backlog-mcp-server (あくまで一例です。他のMCPサーバーでも応用できます)

1. 1Password側の準備

まずは、1PasswordでAPIキーを管理し、CLIから呼び出せるように準備します。

1Password CLIの確認

はじめに、1Password CLI (op) が正しくセットアップされているか確認しておきましょう。ターミナルで以下のコマンドを実行します。

op --version

バージョン番号(例: 2.32.0)が表示されればOKです。

シークレットの格納と参照URIの取得

次に、MCPサーバーで利用するAPIキーを1Passwordに保存します。

  1. 1Passwordアプリで、APIキーを保存したい保管庫(Vault)を選択します。
  2. 「API認証情報」や「ログイン」などの適切なカテゴリで新しいアイテムを作成し、APIキーを保存します。
  3. 保存したAPIキーのフィールドの横にある をクリックし、「参照をコピー」を選択します。

1Password 秘密参照のコピー

これで、op://<保管庫名>/<アイテム名>/<フィールド名> という形式の Secret Reference(参照URI) がクリップボードにコピーされます。これが、後で使う大切な情報になります。

2. VS Code (MCP設定) の構築

ここからが本番です。VS Codeの設定を書き換えて、1Passwordと連携させていきます。

.env ファイルの作成

まず、任意のディレクトリに .env というファイルを作成します。このファイルに、先ほどコピーした1Passwordの参照URIを記述します。mcp.json と同じディレクトリが管理しやすいかと思います。

.env
# .env
BACKLOG_API_KEY="op://<保管庫名>/<アイテム名>/<フィールド名>"

backlog-mcp-serverBACKLOG_API_KEY という環境変数からAPIキーを読み込むように作られているため、このような変数名にしています。お使いのMCPサーバーに合わせて変数名は変更してください。

mcp.json の編集

次に、mcp.json を編集して、MCPサーバーを起動するコマンドを op run でラップするように変更します。

op run コマンドは、--env-file で指定したファイル内の op:// から始まる参照URIを実際のシークレット値に解決し、環境変数として後続のコマンドに渡してくれます。

変更前 (通常の設定)

npx:

mcp.json
{
  "servers": {
    "backlog": {
      "command": "npx",
      "args": [
        "backlog-mcp-server"
      ],
      "env": {
        "BACKLOG_API_KEY": "xxxx"
      }
      "type": "stdio"
    }
  }
}

docker:

mcp.json
{
  "servers": {
    "backlog": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "--pull", "always",
        "-e", "BACKLOG_API_KEY",
        "-i",
        "ghcr.io/nulab/backlog-mcp-server"
      ],
      "env": {
        "BACKLOG_API_KEY": "xxxx"
      }
      "type": "stdio"
    }
  }
}

変更後 (1Password連携)

npx:

mcp.json
{
  "servers": {
    "backlog": {
      "command": "op",
      "args": [
        "run",
        // "--env-file", "${userHome}/Library/Application Support/Code/User/.env", // ユーザーレベルの mcp.json と同階層に置く場合
        "--env-file", "${workspaceFolder}/.vscode/.env", // ワークスペースの .vscode/mcp.json と同階層に置く場合
        "--",
        "npx",
        "backlog-mcp-server"
      ],
      "type": "stdio"
    }
  }
}

docker:

mcp.json
{
  "servers": {
    "backlog": {
      "command": "op",
      "args": [
        "run",
        // "--env-file", "${userHome}/Library/Application Support/Code/User/.env", // ユーザーレベルの mcp.json と同階層に置く場合
        "--env-file", "${workspaceFolder}/.vscode/.env", // ワークスペースの .vscode/mcp.json と同階層に置く場合
        "--",
        "docker",
        "run",
        "--rm",
        "--pull", "always",
        "-e", "BACKLOG_API_KEY",
        "-i",
        "ghcr.io/nulab/backlog-mcp-server"
      ],
      "type": "stdio"
    }
  }
}

3. 動作確認

設定が完了したら、実際にVS CodeからMCPサーバーに接続してみましょう。

VS Codeのコマンドパレット (Cmd+Shift+P) から「MCP: List Servers」などを実行し、設定したサーバー(この例では backlog)を選択します。

成功した場合

  • 1Passwordがロックされている場合、指紋認証やパスワードを求められます。
  • 認証後、エラーが出ずにサーバーが起動し、エージェント機能が利用できるようになります。
  • 実際にBacklogなどの対象サービスの情報が取得できれば成功です!

VSCode 1Password 認証ダイアログ

プロセスの確認 (任意)

実際にプロセスを確認してみましょう。MCPサーバーが起動している状態で、ターミナルから以下のコマンドを実行すると、関連するプロセスを一覧で確認できます。

ps aux | grep backlog-mcp-server

実行結果の例は以下のようになります。

実行結果
kusatake.daisuke     15217   0.0  0.2 436747504  32320   ??  S     2:04PM   0:00.06 op run --env-file /Users/kusatake.daisuke/Library/Application Support/Code/User/.env.backlog -- npx backlog-mcp-server

COMMAND の部分に npx backlog-mcp-server と表示されており、コマンドラインの引数にはAPIキーなどのシークレット情報が含まれていないことが確認できます。

シークレットは op によって安全に環境変数としてプロセスに渡されているため、外部から覗き見されるリスクがグッと減って安心ですね。

4. MCP利用

MCPツールが動作しているか確認してみましょう。

🙋‍♂️: backlog mcp でプロフィールを取得してみて

🤖: `get_myself` を実行しました - backlog (MCP サーバー)
---
{
  "id": 000000000,
  "userId": "xxxxxxxxx",
  "name": "草竹 大輔",
  # 省略
}

Backlog MCPの場合は、プロフィール情報の取得などで簡易的に動作確認できるかと思います。

まとめ

今回は、1Password CLI を活用して、VS CodeのMCP設定から平文のAPIキーを排除する方法を紹介しました。

  • mcp.json から平文のAPIキーをなくし、代わりに .env ファイルに1Passwordの参照URIを記述しました。
  • op run --env-file コマンドでMCPサーバーの起動コマンドをラップすることで、実行時にのみシークレットを環境変数として注入しました。
  • これにより、設定ファイルをGitで管理しても安全な状態を保てるようになりました。

この方法を使えば、セキュリティを確保しつつ、開発の快適さを損なうこともありません。認証が必要な時だけ1Passwordがよしなに計らってくれるので、とっても安心感がありますよね!

この記事がお役に立てば幸いです。それでは、快適な開発ライフを!

参考リンク

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。
サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイト をぜひご覧ください。

この記事をシェアする

FacebookHatena blogX

関連記事