Non-custodial HTTP-402 crypto payments for AI agents. Exposes the agent SELLER surface as Model Context Protocol tools, allowing AI agents to manage their own pay.u.cash account: configure receive wallets, create priced resources, view 402 challenges, and read settlement history.
27 tools with consistent naming (verb_noun pattern: get_, set_, create_, delete_, update_) and detailed descriptions (avg 180 chars, well above 10-char minimum). All tools have input schemas with type declarations. However, parameter descriptions are sparse or missing in many schemas, most params lack inline descriptions explaining constraints, formats, or dependencies. Output schemas are undocumented (no return type specs visible). Error handling is implicit (REST API responses passed through) with no recovery guidance. Security-sensitive tools (uxc_set_stripe, uxc_create_subagent_key) lack explicit permission/scope declarations. Composition is sound, tools are single-responsibility and chainable, but some parameter relationships (e.g., confirmations policy structure in uxc_set_settings) are underspecified.
Disconnect the agent Stripe account (disables card payments).
Create a priced resource (a tool, data, or service the agent sells). Returns {id, name, description, price_usd, created_at}. The agent can then view the 402 challenge a buyer would see with uxc_view_door.
Create a scoped API key for a subagent (RBAC). Pass a name, optional resource_ids (list of resource ids the subagent can sell), and optional permissions (list of permission strings like 'read:settlements', 'write:resources'). Returns {key, name, resource_ids, permissions, created_at}. The key is shown once.
Remove a custom token by its code.
Delete a priced resource.
Remove a coin's receive address (stop accepting it).
Output schemas undocumented. No return type specifications visible for any tool. LLMs cannot plan downstream calls or extract required fields (e.g., what fields does uxc_create_resource return? Does uxc_get_settlements return pagination metadata?).
Parameter descriptions sparse or missing in JSON schemas. Most params (e.g., 'code' in uxc_delete_custom_token, 'id' in uxc_view_door, nested objects in uxc_set_settings) lack inline descriptions explaining format, constraints, or valid values. LLMs cannot infer parameter semantics from names alone.
No error recovery guidance. Tools return REST API responses directly (success/error_code/message) with no actionable next steps. E.g., if uxc_set_custom_token fails with 'Invalid contract address', the LLM has no guidance on how to recover or what to try next.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Show the agent account snapshot: activation state, non-withdrawable credit balance (USD), configured per-asset receive wallets, webhook URL, and an earnings summary (settlements count + total earned).
List the custom tokens the agent has configured.
List the agent's priced resources.
Read the agent safe settings: confirmations policy (default + per-coin + value-increase), webhook url + signing secret, default currency, payment preferences, notification email, and branding.
Read a single settlement by id. Returns {id, resource_id, buyer_id, amount_usd, asset, tx_hash, confirmed_at, settled_at}.
Read the agent's settlement history (payments received). Returns a list of {id, resource_id, buyer_id, amount_usd, asset, tx_hash, confirmed_at, settled_at}.
Show the agent Stripe configuration (masked) and the webhook endpoint URL to register in the Stripe dashboard.
List the agent's subagent API keys (masked).
The agent's receive wallet map {asset: address} (where buyer funds land). Pass {all:true} to include disabled coins too (each as {asset, address, active}).
Read the settlement webhook config (masked): {url, has_secret, secret_last4}.
Revoke a subagent API key by its id.
Rotate the HMAC webhook signing secret; returns {secret} (shown once).
Add a custom token (ERC-20/TRC-20/SPL/TON Jetton/Robinhood-20) the agent accepts. type is one of erc-20, bep-20, base-20, polygon-20, arb-20, op-20, avax-20, trc-20, spl, ton-jetton, robinhood-20. After adding, set a receive address for it with uxc_set_wallet (asset = the code) so buyers can pay it. Custom tokens are auto-detected on-chain like the built-in coins.
Partially update the agent safe settings. Pass any subset of {confirmations:{default?, coins:{<code>:n}?}, webhook:{url?, rotate_secret?}, currency?, address_reuse_cooldown?, payment_preferences?, notification_email?, branding:{name?, logo_url?, color?}}. Returns the updated settings.
Connect the agent own Stripe account so it can accept card payments (the redirect rail). Pass the Stripe secret key, a one-time product id, and the webhook signing secret. The key + product are verified against Stripe before saving. Non-custodial - card payments settle direct to the agent own Stripe account.
Set the agent's own receive address for an asset (where buyer funds land).
Enable or disable a coin without losing its address (the dashboard on/off toggle). active is true/false.
Set the settlement webhook URL. Auto-generates the HMAC signing secret on first set; the response returns {url, secret} (secret shown ONCE - store it to verify X-Webhook-Signature). Use uxc_rotate_webhook_secret to rotate, uxc_get_webhook to read it masked.
Update a resource's name, description, or price. Pass the resource id and any subset of {name, description, price_usd}.
Verify an incoming settlement webhook HMAC signature (constant time). Pure local check - no network. Mirrors the server scheme: HMAC-SHA256 of "<t>.<raw_body>" keyed with the webhook secret, from the X-Webhook-Signature header "t=<unix>,v1=<hex>". Pass the EXACT raw body (do not re-encode). Returns {valid:bool, age_seconds?:int}. Deduplicate by event_id separately.
View the 402 challenge a buyer would see for a resource (the HTTP-402 Payment Required response). Pass the resource id. Returns the raw 402 envelope: {status, headers, body} so the agent can inspect what buyers face.
Security-sensitive tools lack explicit permission/scope declarations. uxc_set_stripe, uxc_create_subagent_key, uxc_revoke_subagent_key, and uxc_delete_resource are destructive or high-privilege but do not declare required scopes (e.g., 'write:stripe', 'admin:subagents'). No audit trail or permission-gate pattern visible.
Pagination and result limits undocumented. uxc_get_settlements accepts limit/offset but no max limit is stated; uxc_get_resources, uxc_get_wallets, uxc_get_custom_tokens have no pagination params visible. Large result sets could exhaust context windows.