Is your feature request related to a problem? Please describe.
Sim wires external MCP servers into canvas workflows and executes their tools. In execute-tool.ts (apps/sim/lib/internal/mcp/execute-tool.ts), a successful tool call returns { success: true, data: { success: true, output: result.output } } — the MCP server's tool output is passed straight through to the workflow.
A pay-per-call x402 MCP server is a normal MCP server that answers a tool call with a pending-payment result instead of data: it returns HTTP 200 with result content of the form {"status":"payment_required", "payment_challenge": {"price_xno": 0.0001, ...}}. When a Sim workflow calls such a tool through mcp-tool-selector, result.output is that JSON blob, and the canvas shows raw JSON instead of a confirm-and-pay step. This has been verified against a live pay-per-call merchant MCP (Vend API Merchant at extract.paypercall.dev/mcp): initialize returns 200 with correct tools, but tools/call returns 200 whose result content is a payment_required envelope.
This is the one missing client-side behaviour for zero-signup pay-per-call tools to be usable from a Sim workflow — they already work at the MCP protocol level.
Describe the solution you'd like
In the MCP tool-call path, detect a payment_required / x402 payment_challenge result structurally (not as raw JSON passthrough) and:
- surface a per-call confirmable payment step — price,
pay_to, scheme — so the operator can pay and retry from the canvas/UI, and/or
- support an optional per-credential "payer" config so admin-added pay-per-call tools settle automatically under approval control.
Security invariant: no money moves unless the challenge parses AND the operator (or a configured, approved payer) approves.
Describe alternatives you've considered
- Keep raw JSON passthrough for paid tools. Works, but a workflow that dumps
payment_challenge JSON to the user is not usable for pay-per-call tools.
- Build a separate x402 proxy outside Sim. Adds ops overhead and defeats the purpose of a visual MCP workflow.
- Use a custom extraction tool that pre-encodes the payment. Very platform-specific and doesn't leverage the growing x402 catalogue.
Additional context
A working reference:
- Vend API Merchant MCP manifest: https://extract.paypercall.dev/.well-known/mcp
- x402 settlement manifest: https://extract.paypercall.dev/.well-known/x402
- 9 MCP tools (web extract, link check, geoip, web search, youtube transcript, etc.), single calls ~0.0001 XNO, no signup, no API keys, per-call settlement in Nano (XNO) via nano:mainnet.
- A bare probe returns 402 with the full challenge:
curl -i https://extract.paypercall.dev/api/v1/extract?url=https://example.com
This is a first — Sim had zero x402 / pay-per-call coverage before this issue (GitHub search confirmed).
Is your feature request related to a problem? Please describe.
Sim wires external MCP servers into canvas workflows and executes their tools. In
execute-tool.ts(apps/sim/lib/internal/mcp/execute-tool.ts), a successful tool call returns{ success: true, data: { success: true, output: result.output } }— the MCP server's tool output is passed straight through to the workflow.A pay-per-call x402 MCP server is a normal MCP server that answers a tool call with a pending-payment result instead of data: it returns HTTP 200 with result content of the form
{"status":"payment_required", "payment_challenge": {"price_xno": 0.0001, ...}}. When a Sim workflow calls such a tool throughmcp-tool-selector,result.outputis that JSON blob, and the canvas shows raw JSON instead of a confirm-and-pay step. This has been verified against a live pay-per-call merchant MCP (Vend API Merchant at extract.paypercall.dev/mcp):initializereturns 200 with correct tools, buttools/callreturns 200 whose result content is apayment_requiredenvelope.This is the one missing client-side behaviour for zero-signup pay-per-call tools to be usable from a Sim workflow — they already work at the MCP protocol level.
Describe the solution you'd like
In the MCP tool-call path, detect a
payment_required/ x402payment_challengeresult structurally (not as raw JSON passthrough) and:pay_to, scheme — so the operator can pay and retry from the canvas/UI, and/orSecurity invariant: no money moves unless the challenge parses AND the operator (or a configured, approved payer) approves.
Describe alternatives you've considered
payment_challengeJSON to the user is not usable for pay-per-call tools.Additional context
A working reference:
curl -i https://extract.paypercall.dev/api/v1/extract?url=https://example.comThis is a first — Sim had zero x402 / pay-per-call coverage before this issue (GitHub search confirmed).