pop-pay — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited pop-pay (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Gives your OpenClaw agent the ability to pay at any online store using your own existing credit card. The card number is stored in a local encrypted vault (AES-256-GCM) and is never placed in the agent's context window. When a payment is approved, credentials are injected directly into the checkout form via Chrome DevTools Protocol (CDP) in a separate local process — if the agent is compromised by prompt injection, the attacker cannot steal the card it never saw.
Tagline: _it only takes 0.1% of hallucination to drain 100% of your wallet._
All payment logic runs on your machine. There are no Point One Percent / A Hundred Percent Inc. servers in the payment path.
| Component | Default | Data stays |
|---|---|---|
| Card credentials | Local encrypted vault (~/.config/pop-pay/vault.enc) | Your machine only |
| Spend policy | ~/.config/pop-pay/.env | Your machine only |
| Guardrail engine | keyword mode (zero API calls) | Your machine only |
| Guardrail engine (optional) | llm mode — uses your own API key | Your chosen provider |
Install from npm (https://www.npmjs.com/package/pop-pay):
# No install needed — run on demand via npx
npx -y pop-pay pop-init-vaultOr install globally:
npm install -g pop-pay
pop-init-vaultFor stronger protection (recommended — blocks any agent with shell access):
npx -y pop-pay pop-init-vault --passphrase # one-time setup
npx -y pop-pay pop-unlock # run once before each sessionAdd to your OpenClaw MCP config (or ~/.openclaw/mcp_servers.json):
{
"mcpServers": {
"pop-pay": {
"command": "npx",
"args": ["-y", "pop-pay", "launch-mcp"],
"env": {
"POP_CDP_URL": "http://localhost:9222"
}
}
}
}Or via the OpenClaw CLI:
openclaw mcp add pop-pay -- npx -y pop-pay launch-mcpThen launch Chrome with CDP:
npx -y pop-pay launch| Bin | Purpose |
|---|---|
pop-pay | Main CLI entry (subcommands: launch-mcp, launch, pop-init-vault, pop-unlock) |
pop-launch | Shortcut for pop-pay launch (starts Chrome with CDP) |
pop-init-vault | Initialize the encrypted credential vault |
pop-unlock | Unlock the vault with your passphrase for the current session |
request_virtual_cardWhen to call: You are on a checkout/payment page and credit card input fields are visible.
Parameters:
requested_amount (number, USD) — exact amount shown on screentarget_vendor (string) — e.g. "Amazon" (NOT a URL)reasoning (string) — why this purchase should happenpage_url (string) — current checkout page URLBehavior:
approved (with last 4 digits) or rejected (with reason)After approval: click Submit / Place Order. Card has already been filled.
request_purchaser_infoWhen to call: You are on a billing/contact form with name, email, phone, or address fields but no credit card fields yet.
Parameters:
target_vendor (string)page_url (string)reasoning (string)Injects name, email, phone, address from the user's stored profile. Does NOT issue a card, does NOT charge, does NOT affect the budget.
request_x402_paymentWhen to call: Paying for an API call that returns HTTP 402 under the x402 protocol.
Parameters:
endpoint (string) — the API URL that returned 402amount (number, USD)reasoning (string)Handles the x402 handshake and payment without exposing credentials to the agent.
Agent navigates to product page
↓
Clicks "Checkout" / "Proceed to payment"
↓
[If billing page first]
→ request_purchaser_info(vendor, page_url, reasoning)
→ click Continue
↓
[Payment/card fields visible]
→ request_virtual_card(amount, vendor, reasoning, page_url)
(injection scan runs inside this call)
↓
[Approved]
→ click Submit / Place Order| Layer | Defense |
|---|---|
| Context isolation | Card credentials never enter the agent's context window or logs |
| Encrypted vault | AES-256-GCM with XOR-split salt and native scrypt key derivation (Rust, via napi-rs) |
| TOCTOU guard | Domain verified at the moment of CDP injection — blocks redirect attacks |
| Repr redaction | Automatic masking (****-4242) in all MCP responses, logs, and tracebacks |
| Prompt-injection scan | Automatic on every request_virtual_card / request_purchaser_info call |
Full STRIDE analysis: THREAT_MODEL.md
| Env var | Default | Description |
|---|---|---|
POP_CDP_URL | http://localhost:9222 | Chrome DevTools Protocol endpoint |
POP_ALLOWED_CATEGORIES | ["aws","cloudflare"] | JSON array of allowed vendor categories |
POP_MAX_PER_TX | 100.0 | Max USD per transaction |
POP_MAX_DAILY | 500.0 | Max USD per day |
POP_GUARDRAIL_ENGINE | keyword | keyword (zero-cost) or llm (semantic) |
POP_AUTO_INJECT | true | Enable CDP card injection |
POP_BLOCK_LOOPS | true | Block hallucination/retry loops |
Full reference: ENV_REFERENCE.md
| Provider | Description |
|---|---|
| BYOC (default) | Bring Your Own Card — encrypted vault + local CDP injection |
| Stripe Issuing | Real virtual cards via Stripe API (POP_STRIPE_KEY) |
| Lithic | Multi-issuer adapter |
| Mock | Test mode for development |
Priority: Stripe Issuing → BYOC Local → Mock.
io.github.100xPercent/pop-pay~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.