Skip to content

MCP: output schemas and structured content on every tool - #58

Merged
Fizzl13 merged 27 commits into
mainfrom
claude/x402-agents-solana-payments-nceg9b
Oct 9, 2026
Merged

Fizzl13 merged 27 commits into
mainfrom
claude/x402-agents-solana-payments-nceg9b

Conversation

@Fizzl13

@Fizzl13 Fizzl13 commented Oct 9, 2026

Copy link
Copy Markdown
Owner

Same change as presign-guard#122, ichimoku-signal#129 and x402-doctor#189, for PlainText's MCP server (Smithery scores output schemas).

  • check_wallet_approvals and explain_approval declare an outputSchema with verdict (SAFE, CAUTION or RISK) and explanation, and answer with structuredContent next to the unchanged VERDICT: explanation text, which the usage log parses.
  • feedback gets mcpOutputShape(z) and structuredContent for a received report, as in the other services.
  • Every schema allows extra fields. All three tools are free, and their errors are text-only, so the client's check only applies to successful answers.
  • npm test: 30/30. Ran it locally: tools/list shows the three object schemas, and a feedback call returns structuredContent.received: true.

🤖 Generated with Claude Code

https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48


Generated by Claude Code

claude added 27 commits October 4, 2026 16:57
mpp-pay from x402-doctor (#139): the agent sends USDC.e on Tempo with the MPP
memo and answers with the transaction hash, checked on a Tempo RPC; the 402
then carries an evm and a tempo challenge and /openapi.json lists both offers.
Off until MPP_TEMPO_RECIPIENT is set.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
A 402 with a payment that was refused now logs network (from the x402
payment header, or the MPP credential's method: evm = base, tempo = Tempo),
so the usage log can show which network traffic comes from.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
On mainnet the paid routes also accept the same dollar price in RLUSD on
the XRP Ledger, to XRPL_PAY_TO (default Frits's account with the RLUSD
trust line; XRPL_PAY_TO=off turns it off), verified and submitted by an
in-process facilitator from @x402/xrpl, as in the other Fizzl services.
The usage log counts RLUSD in dollars.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
Agents built on t54's x402-xrpl / Xrpl.X402 SDK (most of the XRPL AI Hub)
sign with the x402 SourceTag 804681468, bind the invoice in Memos and send
{ signedTxBlob, invoiceId }. @x402/xrpl refuses Memos, so those payments now
go to t54's hosted facilitator, which verified and settled such a payment
on testnet; standard @x402/xrpl payments stay in-process (also re-tested on
testnet with the SourceTag in the requirements). Every XRPL accept now
carries extra.sourceTag. XRPL_T54_URL=off keeps everything local.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
Google crawled the homepage but has not indexed it yet; these give it
a clear signal which URL to index.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
A refused MPP credential is logged as payment_failed with protocol mpp;
it now also carries reason (the problem detail sent back, max 160
characters), so a client that can't pay us shows what went wrong.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
With ALGORAND_PAY_TO set (an Algorand account with the USDC opt-in), both
paid routes also offer the same dollar price in USDC (ASA 31566704) on
Algorand mainnet, settled by GoPlausible's public facilitator, which pays
the Algorand fee. It sits before the URL facilitator and offers only
Algorand, so PayAI never claims it. Off without the variable or with "off".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
GoPlausible's x402 catalog reads the x402-merchant extension (name,
website, logo, categories) when it settles a payment and shows it on the
merchant, one per pay-to address. Both paid routes now carry it, the same
on every fizzl.eu service.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
check_wallet_approvals and explain_approval declare an outputSchema
(verdict, explanation) and answer with structuredContent next to the
same "VERDICT: explanation" text (which the usage log reads); feedback
does too. Extra fields are allowed, so new ones never break a call.
MCP directories such as Smithery score output schemas.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
@Fizzl13
Fizzl13 merged commit d1e59cd into main Oct 9, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants