<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Donny Nguyen (Donny Diamond Hands)</title>
    <description>The latest articles on DEV Community by Donny Nguyen (Donny Diamond Hands) (@donnywin85).</description>
    <link>https://dev.to/donnywin85</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4014232%2F32cf1cdd-943d-4526-8fac-eeeb7eeac967.jpg</url>
      <title>DEV Community: Donny Nguyen (Donny Diamond Hands)</title>
      <link>https://dev.to/donnywin85</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/donnywin85"/>
    <language>en</language>
    <item>
      <title>Give your AI agent a cross-DEX spread tool it pays for itself (x402 + MCP, no account, no key)</title>
      <dc:creator>Donny Nguyen (Donny Diamond Hands)</dc:creator>
      <pubDate>Fri, 03 Jul 2026 23:52:48 +0000</pubDate>
      <link>https://dev.to/donnywin85/give-your-ai-agent-a-cross-dex-spread-tool-it-pays-for-itself-x402-mcp-no-account-no-key-1jo5</link>
      <guid>https://dev.to/donnywin85/give-your-ai-agent-a-cross-dex-spread-tool-it-pays-for-itself-x402-mcp-no-account-no-key-1jo5</guid>
      <description>&lt;p&gt;AI agents are starting to pay for data directly. The x402 protocol lets an HTTP&lt;br&gt;
endpoint answer a request with &lt;code&gt;402 Payment Required&lt;/code&gt;, the client signs a small&lt;br&gt;
USDC payment, and the same request is retried and served. No signup, no API key&lt;br&gt;
to request, no invoice — the agent just pays a cent and gets the data.&lt;/p&gt;

&lt;p&gt;I put a real endpoint behind that protocol and wrapped it as an MCP tool. This&lt;br&gt;
post covers what it returns, why an agent would want it, and how to plug it in.&lt;/p&gt;
&lt;h2&gt;
  
  
  What the endpoint does
&lt;/h2&gt;

&lt;p&gt;The endpoint sells one thing: &lt;strong&gt;real-time cross-DEX price and spread data for&lt;br&gt;
PancakeSwap v2 and v3 on BNB Smart Chain (BSC).&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://x402.donnyautomation.com/call?pair=WBNB/USDC
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Given a token pair (&lt;code&gt;SYM/SYM&lt;/code&gt;, first symbol is the USD-priceable side) and an&lt;br&gt;
optional PancakeSwap v3 fee tier, it returns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;per-venue mid prices across PancakeSwap v2 and v3 pools,&lt;/li&gt;
&lt;li&gt;the best buy and best sell venue,&lt;/li&gt;
&lt;li&gt;the gross cross-DEX spread in basis points,&lt;/li&gt;
&lt;li&gt;per-venue and total liquidity (TVL), and&lt;/li&gt;
&lt;li&gt;the source block number.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A trimmed response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pair"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WBNB/USDC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"network"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bsc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"chainId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"blockNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;107562007&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"nativeUsd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;546.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pricesByVenue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"venue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pancake"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"surface"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;546.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"tvlUsd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1234567&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bestBuy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"venue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pancakeV3:500"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bestSell"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"venue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"biswap"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"midSpreadBps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;27.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"crossDex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"grossSpreadBps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;14.05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"buyVenue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"sellVenue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"surface"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v2v3"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"liquidity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"venues"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"totalTvlUsd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-01T..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rpc"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It costs &lt;strong&gt;$0.01 USDC per call on Base mainnet&lt;/strong&gt;. The seller holds no private&lt;br&gt;
key — payment settlement is handled by a facilitator, and the endpoint only&lt;br&gt;
proxies to its BSC reader once payment is verified.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why an agent needs cross-DEX spread data
&lt;/h2&gt;

&lt;p&gt;Cross-DEX spread is the raw signal behind several agent tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Arbitrage detection&lt;/strong&gt; — a positive gross spread across venues, net of fees,
is the entry condition for a two-leg trade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best-execution routing&lt;/strong&gt; — which venue to buy from and which to sell to,
right now, at this block.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slippage and liquidity checks&lt;/strong&gt; — per-venue TVL tells an agent whether a
given size will move the price.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The alternative is for every agent to run BSC RPC infrastructure, maintain pool&lt;br&gt;
addresses across v2 and v3 fee tiers, and re-derive constant-product and&lt;br&gt;
concentrated-liquidity math. Most agents should not. One tool call, one cent, a&lt;br&gt;
fresh block-stamped answer.&lt;/p&gt;
&lt;h2&gt;
  
  
  Using it from an MCP client
&lt;/h2&gt;

&lt;p&gt;The endpoint is wrapped as a Model Context Protocol server so any MCP-capable&lt;br&gt;
agent (Claude Desktop, Claude Code, and others) can call it as a tool. Install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; bsc-dex-spread-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is also available via &lt;a href="https://smithery.ai/servers/donnywin85/bsc-dex-spread-mcp" rel="noopener noreferrer"&gt;Smithery&lt;/a&gt;&lt;br&gt;
and the official MCP registry (&lt;code&gt;io.github.donnywin85/bsc-dex-spread&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Then add it to your MCP client config, supplying your own buyer wallet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"bsc-dex-spread"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bsc-dex-spread-mcp"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"EVM_PRIVATE_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xYOUR_BASE_MAINNET_BUYER_KEY"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A note on the wallet model, because it matters: &lt;strong&gt;you supply the key; the package&lt;br&gt;
ships none.&lt;/strong&gt; The server signs each payment with the key in &lt;code&gt;EVM_PRIVATE_KEY&lt;/code&gt;,&lt;br&gt;
which you set in your own config. Fund that wallet with a few dollars of USDC on&lt;br&gt;
Base and nothing else — the x402 &lt;code&gt;exact&lt;/code&gt; scheme uses EIP-3009&lt;br&gt;
&lt;code&gt;transferWithAuthorization&lt;/code&gt;, so the facilitator broadcasts the transfer and pays&lt;br&gt;
the gas. A zero-ETH wallet settles fine. Treat it as a disposable, low-balance&lt;br&gt;
spending wallet.&lt;/p&gt;

&lt;p&gt;Once configured, the agent has a &lt;code&gt;get_dex_spread(pair, fee?)&lt;/code&gt; tool and pays&lt;br&gt;
$0.01 USDC each time it calls it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proof it is live
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Live usage/telemetry page: &lt;a href="https://x402.donnyautomation.com/stats" rel="noopener noreferrer"&gt;https://x402.donnyautomation.com/stats&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;First real mainnet settlement (self-payment, to prove the path end to end):
&lt;a href="https://basescan.org/tx/0x0c3ceda02f8aa36d48da392330e5bdcc9f34632a5dba2366a1663d6e7a301733" rel="noopener noreferrer"&gt;&lt;code&gt;0x0c3ceda02f8aa36d48da392330e5bdcc9f34632a5dba2366a1663d6e7a301733&lt;/code&gt;&lt;/a&gt;
— Base mainnet, receipt status success. The transaction was submitted by the
facilitator, confirming the buyer paid zero gas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;/stats&lt;/code&gt; page shows challenge-versus-paid counts and recent settlements, so&lt;br&gt;
you can watch real demand accrue rather than take my word for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;If you are building agents that touch on-chain markets, this is a small, honest&lt;br&gt;
example of the pattern worth copying: a narrow, useful data endpoint, priced per&lt;br&gt;
call, discoverable and payable by machines without a human in the loop. The&lt;br&gt;
protocol is x402; the packaging is MCP; the price is a cent.&lt;/p&gt;

</description>
      <category>web3</category>
      <category>mcp</category>
      <category>ai</category>
      <category>defi</category>
    </item>
  </channel>
</rss>
