Skip to main content
skill Claude Code CX Codex Cursor GitHub Copilot

use-link-identity — Claude Code skill: what it does, how to install

Tells the agent how to fetch a Link Agent Attestation Token or signed claims and send them to a service that asked for them.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add stripe/link-cli --skill use-link-identity -a claude-code
Open on GitHub

What use-link-identity does

The skill maps the identity commands of Link CLI onto whatever the service wants. An AAT request becomes identity attestations pop; a claims request becomes identity credentials present. Each command prints JSON, and one field from it goes into one HTTP header.

A table in the skill spells out that mapping, along with what to do when things go wrong. ATTESTATION_POOL_EMPTY means request a batch, then pop. Only entries with storage: "pool" can be popped. Capture output with --format json, parse it with jq, and pass the proof through untouched — retyping or re-encoding a token breaks it.

These commands are beta and need Link Agent Wallet v0.27.0 or later. Run link-cli --version first; if it is missing or older, npm install -g @stripe/link-cli@latest. No preview flag is involved. One catch worth knowing: the commands exist in the CLI, not in the MCP tools, so the agent has to shell out for them. Cached identity also belongs to the home directory, and logging in as a different user will not switch it — give each user a separate home directory.

What it helps with

  • pop an AAT after a WWW-Authenticate: PrivateToken challenge
  • disclose the email claim alone to a verifier
  • pass the authorization field through to the HTTP client unchanged
  • recover from ATTESTATION_POOL_EMPTY by requesting a batch first
  • keep two users' cached credentials apart with separate home directories

Example prompts for the agent

  • The service asked for Link attestation — pop an AAT with `link-cli identity attestations pop --format json` and send its `authorization` value as the `Authorization` header.
  • Check the inventory before requesting anything new, and if `expires_at` has passed, get a fresh credential.
  • Present only the `email` claim for the audience and nonce from the service challenge.

How to install use-link-identity

1Skills CLI (Vercel)

npx skills add stripe/link-cli --skill use-link-identity -a claude-code

2Manually: put the files in place

~/.claude/skills/use-link-identity/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/use-link-identity/

From the same set3

The whole set →

Similar

Hooks Automation ruvnet A hooks system that automatically coordinates Claude Code operations, formats code, and learns from development patterns. Manages agents, persists session context, and integrates with MCP tools. Claude Code CX Codex Cursor +1 1,100installs V3 DDD Architecture ruvnet Splits the claude-flow v3 orchestrator into five bounded contexts and wires them back together through a microkernel and a domain event bus. Claude Code CX Codex Cursor +1 1,100installs hive-mind-advanced ruvnet Multi-agent coordination system with a queen coordinator, consensus mechanisms, and shared memory. Enables complex projects where tasks are distributed across specialized workers. Claude Code CX Codex Cursor +1 1,100installs mem0-test-integration mem0ai Checks the Mem0 integration that /mem0-integrate left behind: installs dependencies, runs the test suite and a live smoke flow, then prints a scorecard. Claude Code CX Codex Cursor +1 323installs scenes phaserjs A Phaser 4 scene reference for your coding agent: lifecycle order, transitions, parallel scenes, and the ScenePlugin queue that fires a frame later. Claude Code CX Codex Cursor +1 942installs cli-anything-blender HKUDS A skill that adds a stateful command-line interface for editing Blender 3D scenes. Use it when an agent needs to assemble a scene, assign materials, or render a frame without manual clicking. Claude Code CX Codex Cursor +1 941installs setup-matt-pocock-skills Matt Pocock This skill configures a repository for Matt Pocock's engineering skills by setting its issue tracker, triage labels, and domain docs layout. Run it before using the other skills. Claude Code 1,052,851installs to-tickets Matt Pocock Turns a plan, spec, or conversation into small end-to-end tickets with explicit blockers. Use it to agree on the work breakdown before tickets go to a tracker. Claude Code 711,230installs

Questions about use-link-identity

How do I install use-link-identity in Claude Code?

Run npx skills add stripe/link-cli --skill use-link-identity -a claude-code. The skill lands at ~/.claude/skills/use-link-identity/SKILL.md.

What does use-link-identity do?

It walks the agent through Link CLI identity work: acquiring attestation tokens, getting a credential, and presenting selected claims to a verifier. Headers are built from the JSON the commands return.

Do the identity commands need a Link login?

Only request does. list, pop and present read local files and need no authentication.

Source text

SKILL.md · MIT
---
name: use-link-identity
description: Use Link CLI's identity commands when a service requests a Link Agent Attestation Token (AAT) or signed user claims such as email. Covers acquiring and managing attestations, obtaining identity credentials, and presenting selected claims to a verifier through an HTTP client or browser automation.
allowed-tools:
  - Bash(link-cli:*)
  - Bash(npx --yes @stripe/link-cli:*)
  - Bash(npm install -g @stripe/link-cli:*)
license: Complete terms at https://github.com/stripe/link-cli/blob/main/LICENSE
metadata:
  author: stripe
  url: link.com/agents
---

# Link identity

These commands are in **beta** and appear in `link-cli identity --help` without a preview flag. Use them when a service accepts Link attestations or signed user claims.

| Service requests | Command | JSON field → HTTP header |
|---|---|---|
| A Link Agent Attestation Token (AAT), often via `WWW-Authenticate: PrivateToken` | `identity attestations pop` | `authorization` → `Authorization` |
| Signed claims, often via `WWW-Authenticate: Identity-Presentation` | `identity credentials present` | `presentation` → `Identity-Presentation` |

An AAT proves issuance by Link without disclosing user claims. A presentation discloses selected claims and proves possession of the credential's holder key for an audience and nonce. If the service requires both, send both headers.

## Setup and handling

Use **Link Agent Wallet v0.27.0 or later**. Check `link-cli --version`; if older or missing, install or update with `npm install -g @stripe/link-cli@latest`. No `LINK_IDENTITY_COMMANDS` flag is needed. See [wallet setup](https://link.com/agents#get-started-section); reuse the [create-payment-credential skill](https://github.com/stripe/link-cli/blob/main/skills/create-payment-credential/SKILL.md)'s authentication guidance.

- Identity commands are available through the CLI, not its MCP tools.
- Only `request` needs Link authentication. `list`, `pop`, and `present` use local files. Requests return paths and metadata; `pop` and `present` return proofs.
- Capture stdout with `--format json`, parse it programmatically with a JSON parser or `jq`, and pass the exact proof to the HTTP client or browser automation. **Never manually transcribe, reconstruct, or re-encode tokens or presentations.** Keep proofs, private keys, and claim values out of transcripts and logs; use restrictive permissions for handoff files.
- Cached identity files belong to the home directory. Changing `--auth` or logging in as another user does not switch the cached identity. Use separate home directories for different users.

## Attestations

```bash
# Inspect inventory.
link-cli identity attestations list --format json

# Refill only when needed. Count is required: 1–100.
link-cli identity attestations request --count 10 --format json

# Pop a token when ready to use it.
link-cli identity attestations pop --format json
```

Check `errors` and `attestations`. Only entries with `storage: "pool"` are available to `pop`; `total_token_count` also includes exports. Requests append to `~/.link-cli/identity/attestations/pool.json`.

Example `pop` output:

```json
{
  "issuer": "https://api.link.com",
  "token_key_id": "<issuer-key-id>",
  "token": "<token>",
  "authorization": "PrivateToken token=\"<token-with-header-padding>\""
}
```

Use `authorization` verbatim, including its scheme and quoting. `pop` removes the token locally; server reuse rules belong to the service. Keep the same AAT for retries tied to an existing interaction, and use a fresh one for a new service. Do not return popped tokens to the pool.

For agent-managed allocation, export a batch instead:

```bash
link-cli identity attestations request --count 10 --output-file ./aats.json --format json
```

Use a new file outside `~/.link-cli/identity/attestations`. Read its `tokens` array and each entry's `authorization` programmatically. Exported tokens never enter the CLI pool; the caller owns allocation, concurrency, and cleanup.

## Credentials and presentations

```bash
# Check errors, expired, expires_at, and claim_names.
link-cli identity credentials list --format json

# Request only if no usable credential exists for the intended user.
link-cli identity credentials request --format json
```

Issuance replaces `~/.link-cli/identity/credentials/current.json` and creates or reuses `~/.link-cli/identity/holder-key.jwk`. Keep both local. Choose claims with `present`:

```bash
link-cli identity credentials present \
  --aud 'https://service.example' \
  --nonce '<nonce-from-challenge>' \
  --claim email \
  --format json
```

Use the service challenge's exact audience and nonce after checking that they belong to the intended service. All three options are required. Repeat `--claim` only for additional requested claims authorized by the user's task. Pass challenge values as individual process arguments or quote them safely in a shell.

Example output:

```json
{"presentation":"<issuer-jwt>~<email-disclosure>~<key-binding-jwt>"}
```

`present` signs locally with the saved holder key and leaves the files unchanged. Send the presentation promptly. Reuse the underlying credential until expiry, but obtain a fresh challenge after a nonce is consumed or expires.

## Send and recover

Set headers only for the intended endpoint. Preserve the challenged operation's method, body, session, interaction identifiers, and any required AAT. Avoid global browser headers or redirects that forward proofs to another origin. Report success only after the service accepts the request.

- `ATTESTATION_POOL_EMPTY`: request a batch, then pop a token.
- Errors in `list`: inspect the reported file/error instead of treating storage as empty.
- Unavailable claim: check `claim_names`; do not disclose extra claims or the raw credential.
- Missing or mismatched holder key: preserve the files and restore the correct key or explicitly obtain a new credential.
- Audience or nonce rejection: check the intended service and its current challenge before presenting again.

© stripe · MIT · stripe/link-cli

See also

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor