# Use the ProtocolSoup Wallet Harness

This origin (https://wallet.protocolsoup.com) is an OID4VCI issuer client and OID4VP holder. It is not Looking Glass and not an MCP server. MCP is https://protocolsoup.com/mcp and is read-only catalog/decode; it does not drive this wallet.

Human UI: https://wallet.protocolsoup.com/
Machine recipes: https://wallet.protocolsoup.com/llms-full.txt (this file)
Runtime contract: https://docs.protocolsoup.com/deploy/services/wallet/
Reviewed template: https://github.com/ParleSec/ProtocolSoup/blob/master/backend/cmd/walletharness/agent-skills/use-wallet-harness.md

The skills index at https://wallet.protocolsoup.com/.well-known/agent-skills/index.json publishes a `sha256` digest of the exact bytes served for this artifact (after origin substitution). Pin the git SHA of the template, or verify the served digest, before ingesting it.

## Capabilities

- Issue `mso_mdoc` and SD-JWT VC credentials from a live issuer.
- Present stored credentials to a live verifier (`direct_post` / `direct_post.jwt`, including HAIP).
- Isolate demo runs with `X-Wallet-Session` on API calls. The browser UI uses an HttpOnly cookie instead. Looking Glass runs also accept `looking_glass_session_id` in the JSON body.
- Return the current store as JSON from `GET https://wallet.protocolsoup.com/api/session`.

QR scanning and `openid4vp://` / `openid-credential-offer://` deeplinks are human handoffs. Agents use the HTTP surface below.

`GET https://wallet.protocolsoup.com/authorize` is an OID4VP protocol hop for a live `request_uri`. It is not a documentation page.

## Protocol artifacts

This file is first-party. It does not contain live offers, request objects, or credentials. Those are returned by the JSON APIs below as the wallet received and stored them.

## Health

    GET https://wallet.protocolsoup.com/health

JSON `{"status":"ok"}`. Optional `commit` is the deployed source SHA.

## Issue a credential (OID4VCI)

Bootstrap against the configured ProtocolSoup issuer:

    POST https://wallet.protocolsoup.com/api/issue
    Content-Type: application/json
    X-Wallet-Session: {opaque-id}

    {
      "credential_format": "mso_mdoc",
      "credential_configuration_id": "MobileDrivingLicenceMsoMdoc"
    }

Omitted `credential_format` uses the wallet default (`mso_mdoc`). `force_issue: true` mints a new credential when the session already has one.

Redeem an offer (Looking Glass pre-authorized path):

    POST https://wallet.protocolsoup.com/api/import
    Content-Type: application/json
    X-Wallet-Session: {opaque-id}

    {
      "offer": "openid-credential-offer://?credential_offer=...",
      "tx_code": "optional",
      "looking_glass_session_id": "optional-lg-session"
    }

Exactly one of `offer`, `credential`, `credential_issuer`, or `discovery_url`+`resource_endpoint`+`scope`.

A successful import returns the stored credential plus `_protocol_exchanges` (wallet-to-issuer HTTP hops) and `_looking_glass_events`. An `authorization_code` grant includes `authorization_url`; the issuer then redirects to `GET https://wallet.protocolsoup.com/api/oid4vci/callback`.

HAIP configurations require attester JWKs on this process. Without them import returns HTTP 400 with `error` `invalid_request` explaining that the configuration requires HAIP attestation material.

## Present a credential (OID4VP)

One-click submit (Looking Glass / automation):

    POST https://wallet.protocolsoup.com/submit
    Content-Type: application/json

    {
      "request_id": "{verifier-request-id}",
      "request": "{signed-request-jwt-or-omit-if-request_uri-already-resolved}",
      "mode": "one_click",
      "looking_glass_session_id": "optional-lg-session"
    }

`mode=one_click` bootstraps a matching credential if the store has no DCQL match, builds the presentation, and POSTs to the verifier `response_uri`. For `direct_post.jwt` the wallet encrypts the Authorization Response.

Stepwise alternative: `mode=stepwise` with `step` of `bootstrap`, `issue_credential`, `build_presentation`, or `submit_response`.

Resolve then present (wallet UI path):

    POST https://wallet.protocolsoup.com/api/resolve
    {"request_uri": "https://verifier.example/request/...", "request_uri_method": "post"}

    POST https://wallet.protocolsoup.com/api/present
    {"request_id": "...", "approve_external_trust": false}

## Errors

API errors are JSON objects with a stable `error` token and a prose `error_description`. They are not RFC 9457 Problem Details. Common tokens: `invalid_request`, `method_not_allowed`, `server_error`, `wallet_submission_failed`. This origin does not currently send `Retry-After` or advertise a published rate-limit.

## Related hosts

- Looking Glass: https://protocolsoup.com/looking-glass
- Protocol catalog: https://protocolsoup.com/api/protocols
- Site llms.txt: https://protocolsoup.com/llms.txt
- Docs llms.txt: https://docs.protocolsoup.com/llms.txt
- Agent skills on the main site: https://protocolsoup.com/.well-known/agent-skills/index.json
- This host does not serve `/mcp`.
