mcpField
O
op-cli

op-cli

github.com/alleneubankセキュリティ50177 回インストール18 週間前に更新
リポジトリ

op-cli について

1Password CLI(`op`)で秘密情報を取得・転送し、会話出力に値を表示しないためのスキルです。アイテム検索、スラッシュを含むタイトル、安全な検証方法も扱います。

主な機能

  1. 01秘密情報を直接コマンドへパイプ
  2. 02アイテムとフィールドを安全に検索
  3. 03スラッシュを含むアイテム名に対応
  4. 04値を表示せずに検証

活用シーン

  1. 01秘密情報をwranglerに渡す
  2. 021PasswordからKubernetesシークレットを作成
  3. 03秘密情報の存在や一致を確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/alleneubank/claude-code --skill op-cli

インストール後、Claude Code で/op-cliを入力して読み込まれたか確認します。

詳細

1Password CLI (op) — 安全な取り扱い

基本ルール:シークレットを出力しない

シークレットの値が会話に出力されるような op コマンドは、絶対に使用しないでください。必ず、使用するツールに直接パイプするか、値を露出させずに確認するために wc -c またはマスキングを使用してください。

# WRONG — would print secret to stdout (do not run)
# op item get ITEM_ID --vault VAULT --fields label=PASSWORD --reveal

# RIGHT — pipe directly to consumer
op item get ITEM_ID --vault VAULT --fields label=PASSWORD --reveal | \
  wrangler secret put SECRET_NAME --env ENV

# RIGHT — verify a value exists without exposing it
op item get ITEM_ID --vault VAULT --fields label=PASSWORD --reveal 2>/dev/null | wc -c

スラッシュを含むアイテムタイトル

多くの 1Password アイテムでは、パス形式のタイトルが使われています(例:pool-party/testnet-pool-party-public/credentials)。op:// URI 形式では / を区切り文字として使用するため、これらのタイトルでは正しく処理できません。

# BROKEN — too many '/' segments
op read "op://pool-party-testnet/pool-party/testnet-pool-party-public/credentials/PASSWORD"
# ERROR: too many '/': secret references should match op://<vault>/<item>[/<section>]/<field>

# WORKS — use item ID instead (avoid printing values)
op item get ITEM_ID --vault VAULT --fields label=FIELD --reveal 2>/dev/null | wc -c
検索ワークフロー

アイテム ID がわからない場合:

# 1. List items in a vault to find the title and ID
op item list --vault VAULT_NAME

# 2. Use the ID (first column) for all subsequent reads
op item get ITEM_ID --vault VAULT_NAME --fields label=FIELD_NAME --reveal 2>/dev/null | wc -c

1 つのアイテムから複数のフィールドを読み取る

# Verify which fields exist (safe — shows labels not values)
op item get ITEM_ID --vault VAULT_NAME --format json 2>/dev/null | \
  python3 -c "import json,sys; [print(f['label']) for s in json.load(sys.stdin).get('fields',[]) for f in [s] if f.get('label')]"

# Pipe each field to its destination
op item get ITEM_ID --vault VAULT --fields label=USERNAME --reveal | consumer_cmd ...
op item get ITEM_ID --vault VAULT --fields label=PASSWORD --reveal | consumer_cmd ...

よく使うパイプパターン

Cloudflare Workers(wrangler)
op item get ITEM_ID --vault VAULT --fields label=PASSWORD --reveal | \
  npx wrangler secret put POOL_PARTY_PUBLIC_PASSWORD --env testnet
環境変数(サブシェル)
SECRET="$(op item get ITEM_ID --vault VAULT --fields label=TOKEN --reveal 2>/dev/null)"
# Use $SECRET in subsequent commands within the same shell — it won't appear in output
kubectl
op item get ITEM_ID --vault VAULT --fields label=PASSWORD --reveal | \
  kubectl create secret generic my-secret --from-file=password=/dev/stdin

値を露出させずに確認する

# Check a value is non-empty (char count)
op item get ITEM_ID --vault VAULT --fields label=PASSWORD --reveal 2>/dev/null | wc -c

# Compare two sources match (exit code only)
if cmp -s <(op item get ID1 --vault V --fields label=F --reveal 2>/dev/null) \
        <(op item get ID2 --vault V --fields label=F --reveal 2>/dev/null); then
  echo "match"
else
  echo "differ"
fi

トラブルシューティング

エラー原因対処方法
too many '/'アイテムタイトルにスラッシュが含まれており、op:// で解析できないop item get でアイテム ID を使用する
could not find itemボールトが間違っているか、タイトルが一致していないop item list --vault VAULT を実行して検索する
出力が空--reveal フラグがない--reveal を追加し、使用するツールにパイプする(または `
not signed inセッションの有効期限が切れているeval "$(op signin)" を実行する(セッショントークンを出力しないこと)

コメント