
Research
/Security News
OpenAPI React Query Codegen Compromised in Mini Shai-Hulud npm Supply Chain Attack
Ten malicious OpenAPI React Query Codegen versions were published to npm in the Mini Shai-Hulud attack, all with valid provenance.
@furlpay/agent-trust
Advanced tools
Trusted-Agent-Protocol-aligned trust layer for agentic payments — Ed25519 agent identity, user-signed spend mandates (budget/MCC/expiry/single-use), replay-safe booking tokens, and RFC 9421 HTTP message signatures. Zero dependencies.
A Trusted-Agent-Protocol-aligned trust layer for agentic payments: Ed25519 agent identity, user-signed spend mandates, replay-safe booking tokens, and RFC 9421 HTTP message signatures. Zero dependencies.
Visa's Trusted Agent Protocol reached live production transactions in July 2026. Its premise: an agent-initiated payment must carry cryptographic proof of who the agent is, that the user consented, and what the agent is allowed to do. This package implements that trust chain so any FurlPay rail — the travel MCP server, an HTTP API, an x402 facilitator — can gate spend behind it.
user key (uk_…) agent key (ak_…) verifier
│ │ │
│ issueMandate() │ │
│ cap · MCC · expiry ─────────►│ │
│ │ createBookingToken() │
│ │ signs ONE exact intent ─►│
│ │ │ verifyBookingToken()
│ │ │ ① agent key registered + signed this intent
│ │ │ ② user key registered + signed this mandate
│ │ │ ③ mandate names THIS agent
│ │ │ ④ claims == signed intent (amount/mcc/source)
│ │ │ ⑤ cap, per-booking cap, MCC, source, expiry
│ │ │ ⑥ nonce never seen (replay-safe)
The agent can never widen its own permissions — only the user's key can sign a mandate. A verifier can never be tricked into charging more than the token says — the claims it is about to execute must equal the signed intent byte-for-byte.
import { AgentTrust, generateKeypair, issueMandate, createBookingToken } from "@furlpay/agent-trust";
// Identities
const user = generateKeypair("user"); // uk_…
const agent = generateKeypair("agent"); // ak_…
// Verifier (held by the payment rail)
const trust = new AgentTrust();
trust.registerUser(user.publicKeyPem);
trust.registerAgent(agent.publicKeyPem);
// 1. User grants a mandate: $500 trip budget, lodging + airlines only, 7 days
const mandate = issueMandate({
userPrivateKeyPem: user.privateKeyPem,
userPublicKeyPem: user.publicKeyPem,
agentKeyId: agent.keyId,
constraints: {
maxTotalUsd: 500,
maxPerBookingUsd: 400,
mccAllowlist: ["7011", "4511"],
expiresAt: new Date(Date.now() + 7 * 864e5).toISOString(),
},
});
// 2. Agent signs one exact booking intent
const token = createBookingToken({
mandate,
agentPrivateKeyPem: agent.privateKeyPem,
agentPublicKeyPem: agent.publicKeyPem,
intent: { amountUsd: 320, source: "legacy", mcc: "7011", merchant: "Hotel CDMX" },
});
// 3. Rail verifies the full chain before issuing a credential
const decision = await trust.verifyBookingToken(token, { amountUsd: 320, mcc: "7011", source: "legacy" });
// → { ok: true, agentKeyId: "ak_…", mandateId: "mnd_…", remainingUsd: 180 }
AgentTrust structurally implements @furlpay/travel-mcp's MandateVerifier — plug it straight in and travel_authorize_booking refuses any call without a valid token:
import { TravelClient } from "@furlpay/travel-mcp";
const client = new TravelClient({ trust }); // every booking now requires mandateToken
The same identity keys authenticate raw HTTP calls (TAP's transport binding — @method, @target-uri, content-digest covered components, tag="agent-payment"):
import { signRequest, verifyRequest } from "@furlpay/agent-trust";
const headers = signRequest({ method: "POST", url, body, keyId: agent.keyId, privateKeyPem: agent.privateKeyPem });
// → { "content-digest", "signature-input", "signature" }
const { keyId } = verifyRequest({ method: "POST", url, body, headers, resolvePublicKey });
| Export | Purpose |
|---|---|
generateKeypair(role) | Ed25519 keypair; keyId is a role-prefixed SPKI fingerprint |
issueMandate(params) | User signs constraints binding one agent key |
verifyMandate(sm, userPem) | Decode + verify a signed mandate |
createBookingToken(params) | Agent wraps the mandate around one signed intent (fresh nonce) |
AgentTrust | Stateful verifier: key registry, budget decrement, single-use consumption, replay set |
signRequest / verifyRequest | RFC 9421 HTTP message signatures |
NonceStore | Pluggable replay store (in-memory default; back with Redis SETNX across instances) |
ok: false with a specific reason — nothing throws into a rail's happy path.NonceStore on Redis (add → SETNX) and persist budgets.MIT © FurlPay
FAQs
Trusted-Agent-Protocol-aligned trust layer for agentic payments — Ed25519 agent identity, user-signed spend mandates (budget/MCC/expiry/single-use), replay-safe booking tokens, and RFC 9421 HTTP message signatures. Zero dependencies.
We found that @furlpay/agent-trust demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Research
/Security News
Ten malicious OpenAPI React Query Codegen versions were published to npm in the Mini Shai-Hulud attack, all with valid provenance.

Security News
Socket joins more than 100 technology, cybersecurity, and financial organizations calling for a global surge in cyber defense.

Product
Enterprise security teams can now detect malware, credential theft, suspicious network activity, and risky updates across Microsoft Edge extensions.