<?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: Eidon Ze</title>
    <description>The latest articles on DEV Community by Eidon Ze (@eidon_ze_598ff4e987ed54d2).</description>
    <link>https://dev.to/eidon_ze_598ff4e987ed54d2</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%2F4057898%2F5ab22102-d2b1-4a61-8340-96932aea426d.jpg</url>
      <title>DEV Community: Eidon Ze</title>
      <link>https://dev.to/eidon_ze_598ff4e987ed54d2</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eidon_ze_598ff4e987ed54d2"/>
    <language>en</language>
    <item>
      <title>State of the MCP Registry, week of 2026-10-19</title>
      <dc:creator>Eidon Ze</dc:creator>
      <pubDate>Mon, 19 Oct 2026 07:57:41 +0000</pubDate>
      <link>https://dev.to/eidon_ze_598ff4e987ed54d2/state-of-the-mcp-registry-week-of-2026-10-19-2fpb</link>
      <guid>https://dev.to/eidon_ze_598ff4e987ed54d2/state-of-the-mcp-registry-week-of-2026-10-19-2fpb</guid>
      <description>&lt;p&gt;State of the MCP Registry, week of 2026-10-19&lt;br&gt;
by ka, mcpreflight&lt;/p&gt;

&lt;p&gt;Every Monday we re-scan the whole official MCP Registry with a read-only check. We send an initialize request, then a tools/list request. We never call a tool, never use a credential, never attempt a payment, and never retry a failing endpoint into apparent health. Everything below is reproducible with one open-source command, and the per-server reports and raw JSON are published.&lt;/p&gt;

&lt;p&gt;Headline&lt;br&gt;
Of 9,991 remote endpoints in the official registry, 4,783 complete a clean anonymous handshake. That is 47.9 percent. The remaining 5,208 split into three groups that are not the same thing and should stop being reported as one number.&lt;/p&gt;

&lt;p&gt;3,171 endpoints require authentication by design. They answer an anonymous request with 401 and a WWW-Authenticate header, and several publish RFC 9728 protected-resource metadata. These are not broken. We report them as AUTH_GATED as a first-class status.&lt;br&gt;
1,984 endpoints give no anonymous response at all. Some are auth-gated without advertising it, some are simply down. From outside we cannot separate those two, and we say so rather than guess.&lt;br&gt;
53 endpoints fail outright.&lt;br&gt;
The published figure from earlier in October was 4,879 clean handshakes, or 48.8 percent. That number was computed before authentication was split out as its own status, so endpoints that require a login were counted as having given no anonymous handshake. Both numbers are correct for the status scheme in force when they were produced, and the weekly series now uses the split scheme.&lt;/p&gt;

&lt;p&gt;Paid endpoints and the shape of the 402 challenge&lt;br&gt;
We also probe the x402 payment endpoints found in the registry, read-only, and fingerprint the challenge each one returns. Two numbers are reported on purpose and must not be conflated. Real 402 counts endpoints whose paid resource answered with a 402 status at all. A valid challenge counts only those whose 402 also named the scheme, the network, the amount and where to pay.&lt;/p&gt;

&lt;p&gt;Cohort of 293 endpoints, two consecutive weeks:&lt;/p&gt;

&lt;p&gt;week    cohort  clean handshake rate    auth gated  no response failed&lt;br&gt;
2026-10-15  293 218 74.4%   0   74  1&lt;br&gt;
2026-10-19  293 212 72.4%   2   78  1&lt;br&gt;
The same seller cohort lost two points of handshake success in one week. A 402 status on its own is not a working challenge, and a single handshake pass rate hides that gap, which is why we report the challenge shape separately.&lt;/p&gt;

&lt;p&gt;What a server costs you before you ask it anything&lt;br&gt;
On a reachable endpoint, the tools/list payload is what a client loads into context before the user has typed anything.&lt;/p&gt;

&lt;p&gt;Median: 1,663 tokens&lt;br&gt;
Heaviest observed: 245,006 tokens, on a server advertising 281 tools&lt;br&gt;
Endpoints above 10,000 tokens: 479&lt;br&gt;
Endpoints above 20,000 tokens: 138&lt;br&gt;
Method limit, stated plainly: tokens are estimated as payload bytes divided by four, because we do not run a model tokenizer. Treat these as an order of magnitude, not a precise count.&lt;/p&gt;

&lt;p&gt;Method and limits&lt;br&gt;
Read-only. initialize and tools/list, or a discovery request. No tool is invoked, no credential is used, no payment is attempted.&lt;br&gt;
Endpoints behind authentication are classified, never counted as failures.&lt;br&gt;
Discovery of paid x402 resources is partial by design, because /.well-known/x402 is not universal, so the paid cohort covers only endpoints that publish their paid resources.&lt;br&gt;
A single week can include transient network failures. The weekly series is the signal, not any individual scan.&lt;br&gt;
Reproduce&lt;/p&gt;

&lt;p&gt;Plain Text&lt;/p&gt;

&lt;p&gt;1&lt;br&gt;
2&lt;br&gt;
npx @eidonze/mcpreflight schema &lt;br&gt;
npx @eidonze/mcpreflight baseline &lt;br&gt;
Per-server reports and JSON: &lt;a href="https://xka0085-byte.github.io/mcpreflight/trust/" rel="noopener noreferrer"&gt;https://xka0085-byte.github.io/mcpreflight/trust/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Citation&lt;br&gt;
ka, mcpreflight, "State of the MCP Registry, week of 2026-10-19", &lt;a href="https://xka0085-byte.github.io/mcpreflight/state-of-mcp-2026-10.html" rel="noopener noreferrer"&gt;https://xka0085-byte.github.io/mcpreflight/state-of-mcp-2026-10.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you quote these figures, cite mcpreflight. The weekly cadence is the point: this is a time series, not a one-off audit, and the two-week x402 movement above is only visible because the same cohort is re-probed every week.&lt;/p&gt;

</description>
      <category>mcp</category>
    </item>
    <item>
      <title>How a GET probe makes working x402 endpoints look broken</title>
      <dc:creator>Eidon Ze</dc:creator>
      <pubDate>Sat, 17 Oct 2026 09:32:23 +0000</pubDate>
      <link>https://dev.to/eidon_ze_598ff4e987ed54d2/how-a-get-probe-makes-working-x402-endpoints-look-broken-11m8</link>
      <guid>https://dev.to/eidon_ze_598ff4e987ed54d2/how-a-get-probe-makes-working-x402-endpoints-look-broken-11m8</guid>
      <description>&lt;p&gt;A census of x402 endpoints is only as good as the request it sends. Send the wrong one and a perfectly healthy payment server reads as dead.&lt;/p&gt;

&lt;p&gt;We run a read-only census of the MCP registry every Monday, and we separate the x402 payment endpoints inside it from the rest. While building the drift check for that cohort, we hit a false negative class that is worth writing down, because it inflates almost every number in this space.&lt;/p&gt;

&lt;h2&gt;
  
  
  what we found
&lt;/h2&gt;

&lt;p&gt;Take verifi.cloud. It publishes &lt;code&gt;/.well-known/x402&lt;/code&gt;, which is the discovery document that tells an agent where its paid resources live. It lists two resources, &lt;code&gt;/verify&lt;/code&gt; and &lt;code&gt;/verify-unlock&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Probe either one with GET and you get a 404. &lt;code&gt;Cannot GET /verify&lt;/code&gt;. If you stop there, you record a working payment service as broken.&lt;/p&gt;

&lt;p&gt;Probe the same URL with POST and you get a clean 402, with proper x402 v2 headers. The &lt;code&gt;PAYMENT-REQUIRED&lt;/code&gt; header decodes to a full challenge document with an &lt;code&gt;accepts&lt;/code&gt; array listing two assets, one USDC and one EURC, each with its network, amount, payTo address and a max timeout. That is a healthy, spec-aware endpoint.&lt;/p&gt;

&lt;p&gt;Same URL. Same second. Two answers, and only one of them is the truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  why it happens
&lt;/h2&gt;

&lt;p&gt;An x402 challenge often depends on the request body. The price can be a function of what the caller asks for, so the server refuses to quote before it sees the body, and its routing only mounts the POST handler. That is a legitimate design, not a bug.&lt;/p&gt;

&lt;p&gt;It is also common. the402.dev publishes a directory of 16,322 endpoints and reports 7,423 of them answer only to POST. Nearly half.&lt;/p&gt;

&lt;p&gt;So any census that probes with a single method will misclassify a large slice of this ecosystem. The failure runs in both directions. A GET only probe calls POST only servers broken. A POST only probe misses the ones that quote on GET.&lt;/p&gt;

&lt;h2&gt;
  
  
  what we changed
&lt;/h2&gt;

&lt;p&gt;We now try GET first, and fall back to POST when GET does not produce a challenge, and we record which method actually returned the 402. When neither does, we say so instead of guessing. Endpoints with a templated path, like &lt;code&gt;/tx/:hash&lt;/code&gt;, cannot be probed without inventing a value, so they are marked as not probed rather than scored.&lt;/p&gt;

&lt;p&gt;That is the difference between a number and a measurement.&lt;/p&gt;

&lt;h2&gt;
  
  
  the part that is actually useful to an operator
&lt;/h2&gt;

&lt;p&gt;A one time census tells you where you stand. It does not tell you when you break. The thing that fails silently on a payment endpoint is drift.&lt;/p&gt;

&lt;p&gt;A refactor, a dependency bump, a new asset added to the accepts list. The endpoint still answers, the price is still quoted, and one field quietly changed shape, which is enough for an agent to stop paying. You find out when a customer tells you, or you find out on your own schedule.&lt;/p&gt;

&lt;p&gt;So we added two commands to mcpreflight. &lt;code&gt;baseline&lt;/code&gt; reads your paid endpoint once and writes a small json file with the challenge shape. &lt;code&gt;drift&lt;/code&gt; re-reads it and exits 1 when that shape has moved, printing a field level diff of exactly what changed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @eidonze/mcpreflight baseline https://your-api.example/paid &lt;span class="nt"&gt;--method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;POST
npx @eidonze/mcpreflight drift https://your-api.example/paid &lt;span class="nt"&gt;--method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;POST
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Commit the baseline file, run the drift check on every push through the GitHub Action, and a broken challenge fails the build before it reaches a buyer.&lt;/p&gt;

&lt;p&gt;The fingerprint is semantic. It compares the normalized &lt;code&gt;accepts&lt;/code&gt; fields and the dialect, so whitespace, key order or a rotating signature in the raw response is never reported as drift.&lt;/p&gt;

&lt;h2&gt;
  
  
  what this is not
&lt;/h2&gt;

&lt;p&gt;Read only. No wallet, no signing, no settlement, no payment, no retries. We never complete a payment, so nothing here proves that paying returns a resource. We also do not certify pricing, security or content quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  why the method matters more than the number
&lt;/h2&gt;

&lt;p&gt;Every census in this space reports a health percentage. Almost none of them publish which request they sent, which means the percentages are not comparable and the differences are not signal. We publish the method, the cohort definition and the per endpoint result, so anyone can re-derive the number instead of trusting it.&lt;/p&gt;

&lt;p&gt;The weekly drift table is here and it updates every Monday.&lt;/p&gt;

&lt;p&gt;x402 cohort and drift tracking: &lt;a href="https://xka0085-byte.github.io/mcpreflight/x402-endpoint-inspector.html" rel="noopener noreferrer"&gt;https://xka0085-byte.github.io/mcpreflight/x402-endpoint-inspector.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Registry census: &lt;a href="https://xka0085-byte.github.io/mcpreflight/state-of-mcp-2026-10.html" rel="noopener noreferrer"&gt;https://xka0085-byte.github.io/mcpreflight/state-of-mcp-2026-10.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://github.com/xka0085-byte/mcpreflight" rel="noopener noreferrer"&gt;https://github.com/xka0085-byte/mcpreflight&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you quote these figures, cite mcpreflight. The point of re-running the cohort weekly is that the number keeps moving, and a moving number needs a named source.&lt;/p&gt;

</description>
      <category>api</category>
      <category>backend</category>
      <category>mcp</category>
    </item>
    <item>
      <title>mcpreflight scanned all 293 x402 payment endpoints in the MCP registry. They pass handshakes at 74.4%, well above the rest.</title>
      <dc:creator>Eidon Ze</dc:creator>
      <pubDate>Sat, 17 Oct 2026 02:56:04 +0000</pubDate>
      <link>https://dev.to/eidon_ze_598ff4e987ed54d2/mcpreflight-scanned-all-293-x402-payment-endpoints-in-the-mcp-registry-they-pass-handshakes-at-5k0</link>
      <guid>https://dev.to/eidon_ze_598ff4e987ed54d2/mcpreflight-scanned-all-293-x402-payment-endpoints-in-the-mcp-registry-they-pass-handshakes-at-5k0</guid>
      <description>&lt;p&gt;mcpreflight scanned all 293 x402 payment endpoints in the MCP registry. They pass handshakes at 74.4%, well above the rest.&lt;/p&gt;

&lt;p&gt;This is the second report from mcpreflight, a read-only checker for MCP servers and x402 endpoints. The first one covered the whole registry. This one zooms into the payment corner of it, because that corner behaves differently and nobody has the numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  what we measured
&lt;/h2&gt;

&lt;p&gt;We took every remote endpoint in the official MCP Registry whose title, description, or URL mentions x402 or HTTP-402. That gave 293 endpoints. Then we sent each one two anonymous JSON-RPC requests over HTTP, initialize and tools/list, and validated the tool schemas that came back. We never called a tool, never signed anything, never touched a wallet.&lt;/p&gt;

&lt;p&gt;Result. 218 of 293 pass a clean anonymous handshake. That is 74.4%. The registry-wide baseline from the same weekly scan is 48.8%. So the payment cohort is roughly 25 points healthier than average. One endpoint fails outright, and 74 give no anonymous response at all.&lt;/p&gt;

&lt;p&gt;One note on what 74.4% measures, because it is easy to read too much into it. It is a clean anonymous MCP handshake, initialize plus tools/list. It is not a verdict on the x402 payment challenge itself. We parse the challenge document as a separate and stricter check, and that number is not in this post. So read 74.4% as endpoint reachability and protocol health, not as payment correctness.&lt;/p&gt;

&lt;h2&gt;
  
  
  why the gap
&lt;/h2&gt;

&lt;p&gt;The gap has a mechanical explanation and it is not flattering to anyone. A payment server with a malformed challenge fails its first agent transaction, which means it fails in public, in front of a paying customer. So this cohort has a hard commercial reason to keep the handshake spec-clean that a free weather API does not have. The pressure comes from money, not from tooling maturity.&lt;/p&gt;

&lt;p&gt;That also means the number is fragile. Once agent payment volume grows, the endpoints that pass today are exactly the ones under the most change pressure. Challenge shape drift is the failure mode to watch, and it is cheap to watch if you re-run the check every week.&lt;/p&gt;

&lt;h2&gt;
  
  
  what to do with this if you run an x402 endpoint
&lt;/h2&gt;

&lt;p&gt;Two things, both small.&lt;/p&gt;

&lt;p&gt;If your endpoint is in the registry and passes, there is nothing to fix. There is a public report page for it in the mcpreflight trust directory, and a status badge you can drop into a readme.&lt;/p&gt;

&lt;p&gt;If you want to catch the deploy that quietly breaks the challenge, run the same check in CI. One read-only block on every push, no credentials involved:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;xka0085-byte/mcpreflight@v1&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://your-api.example/paid&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;inspect&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also run it by hand before you ship anything: &lt;code&gt;npx @eidonze/mcpreflight inspect https://your-api.example/paid --method=POST&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  what this is not
&lt;/h2&gt;

&lt;p&gt;Anonymous handshake only. Servers behind auth are not broken, they just do not answer strangers, and we now classify 401 plus WWW-Authenticate as AUTH_GATED instead of lumping it with dead servers. Two requests per endpoint, one point in time. PASS means we saw a well-formed challenge document, not that anyone paid successfully and not that your pricing is fair.&lt;/p&gt;

&lt;h2&gt;
  
  
  why this number is worth keeping fresh
&lt;/h2&gt;

&lt;p&gt;Other censuses of the MCP registry exist and they report similar handshake rates. Most of them are one-time snapshots. mcpreflight re-runs the full registry every Monday and keeps the history, so the number has a trend instead of just a value. If you want the raw data or a per-server page, everything is public and open source.&lt;/p&gt;

&lt;p&gt;Registry census: &lt;a href="https://xka0085-byte.github.io/mcpreflight/state-of-mcp-2026-10.html" rel="noopener noreferrer"&gt;https://xka0085-byte.github.io/mcpreflight/state-of-mcp-2026-10.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Per-server reports: &lt;a href="https://xka0085-byte.github.io/mcpreflight/trust/" rel="noopener noreferrer"&gt;https://xka0085-byte.github.io/mcpreflight/trust/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://github.com/xka0085-byte/mcpreflight" rel="noopener noreferrer"&gt;https://github.com/xka0085-byte/mcpreflight&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you quote these figures, cite mcpreflight. The whole point of running it weekly is that the number keeps moving, and a moving number needs a named source.&lt;/p&gt;

</description>
      <category>api</category>
      <category>mcp</category>
      <category>security</category>
    </item>
    <item>
      <title>Five read-only diagnostic CLIs for AI agents on Web3 (x402, MCP, Solana)</title>
      <dc:creator>Eidon Ze</dc:creator>
      <pubDate>Sun, 27 Sep 2026 04:46:46 +0000</pubDate>
      <link>https://dev.to/eidon_ze_598ff4e987ed54d2/five-read-only-diagnostic-clis-for-ai-agents-on-web3-x402-mcp-solana-31l4</link>
      <guid>https://dev.to/eidon_ze_598ff4e987ed54d2/five-read-only-diagnostic-clis-for-ai-agents-on-web3-x402-mcp-solana-31l4</guid>
      <description>&lt;p&gt;AI agents are starting to pay for things (x402, USDC per call on Solana and Base). That creates two failure modes nobody has good tooling for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The endpoint answers the wrong thing.&lt;/strong&gt; An x402 endpoint that returns &lt;code&gt;400&lt;/code&gt; instead of &lt;code&gt;402&lt;/code&gt;, or a payment document missing &lt;code&gt;payTo&lt;/code&gt;, breaks every agent that touches it — usually silently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nobody can prove what was delivered.&lt;/strong&gt; An agent pays, gets a response, and has no independent evidence of what the seller actually delivered.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I kept running into both, so I built a suite of &lt;strong&gt;five read-only diagnostic CLIs&lt;/strong&gt; — and released them all on npm this week. They share one philosophy: &lt;strong&gt;CLI-first, no private keys, no auto-payments, JSON output, &lt;code&gt;PASS / FAIL / UNKNOWN&lt;/code&gt;, and every tool documents what it does &lt;em&gt;not&lt;/em&gt; cover.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suite index with all commands:&lt;/strong&gt; &lt;a href="https://xka0085-byte.github.io/evidence-tools/" rel="noopener noreferrer"&gt;https://xka0085-byte.github.io/evidence-tools/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The five tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. mcpdoctor — is your MCP/x402 endpoint discoverable?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @eidonze/mcpdoctor inspect https://your-endpoint/mcp &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parses the HTTP 402 payment document (headers and body, x402 v1 &lt;code&gt;accepts[]&lt;/code&gt; and v2 &lt;code&gt;x402.accepts&lt;/code&gt;) and checks the &lt;code&gt;/.well-known/mcp/server.json&lt;/code&gt; and &lt;code&gt;/.well-known/x402&lt;/code&gt; discovery manifests, with a SHA-256 of the response. &lt;strong&gt;It does not speak the MCP protocol — no &lt;code&gt;initialize&lt;/code&gt;, no &lt;code&gt;tools/list&lt;/code&gt;.&lt;/strong&gt; One real bug it caught during development: an endpoint advertising a vendor hint header with no &lt;code&gt;accepts[]&lt;/code&gt; — which shadowed the real payment document.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. x402-reconcile — what does an x402 endpoint demand?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx x402-reconcile inspect https://api.example.com/paid &lt;span class="nt"&gt;--method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;POST &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parses the 402 challenge: scheme (&lt;code&gt;exact&lt;/code&gt;/&lt;code&gt;base&lt;/code&gt;), network (CAIP-2), asset, amount, &lt;code&gt;payTo&lt;/code&gt;, timeout — plus response latency and a SHA-256 of the raw response bytes. Verified against a real public endpoint (a notary service returning 402 / exact / USDC / amount 1000). It never signs or pays anything — settlement and delivery stay explicitly &lt;code&gt;NOT_TESTED&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. oauthdoctor — can an agent even discover your OAuth metadata?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx oauthdoctor inspect https://mcp.example.com/mcp &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Walks the MCP authorization discovery flow: unauthenticated request → 401 challenge → &lt;code&gt;WWW-Authenticate&lt;/code&gt; &lt;code&gt;resource_metadata&lt;/code&gt; → Protected Resource Metadata → Authorization Server Metadata → PKCE &lt;code&gt;S256&lt;/code&gt; declaration. Discovery-only by design: no login, no token exchange, no stored credentials.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. wallet-evidence — what does one Solana RPC actually see?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx wallet-evidence inspect &amp;lt;signature&amp;gt; &lt;span class="nt"&gt;--rpc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://api.mainnet-beta.solana.com &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Slot, block time, execution error, parsed instructions, fee — and a SHA-256 of the raw RPC response so the report is re-checkable. The interesting finding while testing: &lt;strong&gt;the same transaction signature was visible on one public RPC and &lt;code&gt;not found&lt;/code&gt; on another.&lt;/strong&gt; The tool therefore returns &lt;code&gt;UNKNOWN&lt;/code&gt; when an RPC can't see a transaction — it never conflates that with "the transaction does not exist."&lt;/p&gt;

&lt;h3&gt;
  
  
  5. crosschain-incident — normalize a cross-chain incident export
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx crosschain-incident inspect &lt;span class="nt"&gt;--input&lt;/span&gt; ./message.json &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Takes operator-supplied source/destination status JSON and produces a conservative evidence report. Missing fields stay &lt;code&gt;UNKNOWN&lt;/code&gt;; failures become machine-readable findings. Protocol APIs (LayerZero/Hyperlane) are the roadmap — today it's an offline formatter and says so.&lt;/p&gt;




&lt;h2&gt;
  
  
  The honest part
&lt;/h2&gt;

&lt;p&gt;Only parts of this stack have real-world validation so far, and the tools label their own coverage. Examples: &lt;code&gt;x402-reconcile&lt;/code&gt; has parsed one real public 402 challenge but has never verified a settlement; &lt;code&gt;oauthdoctor&lt;/code&gt; passes local positive/negative fixtures but hasn't met a public OAuth-protected MCP endpoint yet. The &lt;a href="https://github.com/xka0085-byte/agenttoll" rel="noopener noreferrer"&gt;ReceiptRail&lt;/a&gt; MCP service behind the suite has its declared core (&lt;code&gt;initialize&lt;/code&gt;, &lt;code&gt;ping&lt;/code&gt;, &lt;code&gt;tools/list&lt;/code&gt;) passing the official MCP conformance tests — not full-conformance, and it doesn't claim to be.&lt;/p&gt;

&lt;p&gt;Every README has a &lt;strong&gt;"NOT covered"&lt;/strong&gt; section. If a claim isn't backed by a test or a real observation, it's not in the report.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;All five are one &lt;code&gt;npx&lt;/code&gt; away, MIT licensed, zero runtime dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @eidonze/mcpdoctor inspect https://your-endpoint/mcp &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The suite grew out of &lt;a href="https://github.com/xka0085-byte/agenttoll" rel="noopener noreferrer"&gt;ReceiptRail&lt;/a&gt; — on-chain x402 delivery receipts on Solana (SHA-256 digest anchored to a PDA after settlement, verifiable offline with zero trust), live MCP endpoint at &lt;code&gt;https://agenttoll-receipts.app.workbuddy.host/mcp&lt;/code&gt;, npm &lt;code&gt;receiptrail-mcp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Suite index: &lt;a href="https://xka0085-byte.github.io/evidence-tools/" rel="noopener noreferrer"&gt;https://xka0085-byte.github.io/evidence-tools/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you run an x402 endpoint and want a human inspection of the full payment-to-delivery path (not just the challenge), that's the manual service the suite grew out of: &lt;a href="https://xka0085-byte.github.io/evidence-tools/" rel="noopener noreferrer"&gt;https://xka0085-byte.github.io/evidence-tools/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>web3</category>
      <category>ai</category>
      <category>solana</category>
      <category>npm</category>
    </item>
    <item>
      <title>Your x402 endpoint is probably answering 400 instead of 402 — here's a one-command check</title>
      <dc:creator>Eidon Ze</dc:creator>
      <pubDate>Wed, 23 Sep 2026 07:54:24 +0000</pubDate>
      <link>https://dev.to/eidon_ze_598ff4e987ed54d2/your-x402-endpoint-is-probably-answering-400-instead-of-402-heres-a-one-command-check-57o1</link>
      <guid>https://dev.to/eidon_ze_598ff4e987ed54d2/your-x402-endpoint-is-probably-answering-400-instead-of-402-heres-a-one-command-check-57o1</guid>
      <description>&lt;p&gt;&lt;em&gt;ReceiptRail: &lt;a href="https://github.com/xka0085-byte/agenttoll" rel="noopener noreferrer"&gt;github.com/xka0085-byte/agenttoll&lt;/a&gt; · listed on &lt;a href="https://smithery.ai/server/xka0085/ReceiptRail" rel="noopener noreferrer"&gt;Smithery&lt;/a&gt; and the official MCP Registry · mcpdoctor: &lt;a href="https://www.npmjs.com/package/@eidonze/mcpdoctor" rel="noopener noreferrer"&gt;npm&lt;/a&gt; · &lt;a href="https://github.com/xka0085-byte/mcp-doctor" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>x402</category>
      <category>mcp</category>
      <category>solana</category>
      <category>web3</category>
    </item>
    <item>
      <title>How to Convert Tailwind HTML to Structured, Semantic CSS (Without a Full Rewrite)</title>
      <dc:creator>Eidon Ze</dc:creator>
      <pubDate>Sat, 08 Aug 2026 07:40:19 +0000</pubDate>
      <link>https://dev.to/eidon_ze_598ff4e987ed54d2/how-to-convert-tailwind-html-to-structured-semantic-css-without-a-full-rewrite-15m1</link>
      <guid>https://dev.to/eidon_ze_598ff4e987ed54d2/how-to-convert-tailwind-html-to-structured-semantic-css-without-a-full-rewrite-15m1</guid>
      <description>&lt;p&gt;How to Convert Tailwind HTML to Structured, Semantic CSS (Without a Full Rewrite)&lt;br&gt;
I've been using Tailwind for about two years across a handful of projects. It's fast, it's predictable, and once the muscle memory kicks in you can style things without switching files.&lt;br&gt;
But here's what I kept running into:&lt;br&gt;
That component you built six months ago? The one with ⁠flex items-center justify-between p-4 bg-white rounded-lg shadow-md⁠ on the outer div, plus another half-dozen classes on each child element? When you come back to refactor it, you're reading styling before you're reading structure. And if you want to move that component into a project that doesn't use Tailwind — or hand it off to someone who doesn't know the utility vocabulary — you're stuck.&lt;br&gt;
The tooling gap&lt;br&gt;
I went looking for something that could take a chunk of Tailwind-styled HTML and give me back clean, semantic CSS. Not one-to-one class translation (there are a dozen tools that do ⁠px-4 → padding: 1rem⁠). I wanted something that understood the component structure — that a button inside a card should become ⁠.card-button⁠, not ⁠.element-4⁠.&lt;br&gt;
What I found:&lt;br&gt;
 One-to-one converters — great if you just need to know what ⁠gap-4⁠ compiles to, but they output ⁠.element {}⁠ ⁠.div {}⁠ flat rules with no hierarchy&lt;br&gt;
 StyleLens (VSCode) — finds duplicate utility patterns and suggests refactoring into ⁠&lt;a class="mentioned-user" href="https://dev.to/apply"&gt;@apply&lt;/a&gt;⁠, but it's an editor workflow, not an export tool&lt;br&gt;
 Tailwind's own ⁠&lt;a class="mentioned-user" href="https://dev.to/apply"&gt;@apply&lt;/a&gt;⁠ — moves the problem from the HTML to the CSS file but doesn't change the naming problem&lt;br&gt;
None of them did what I actually wanted: paste some HTML, get back component-level CSS with meaningful class names.&lt;br&gt;
What I ended up building&lt;br&gt;
Since I couldn't find it, I put together a minimal tool that does exactly that. The idea is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Parse the HTML tree&lt;/li&gt;
&lt;li&gt;Translate every Tailwind class to its CSS equivalent&lt;/li&gt;
&lt;li&gt;Group declarations by component (the tree structure tells you what belongs where)&lt;/li&gt;
&lt;li&gt;Name things based on what they are — semantic tags like ⁠h2⁠ become ⁠.card-title⁠, buttons become ⁠.card-button⁠, etc.
Here's what it looks like in practice.
Input:

&amp;lt; img class="w-full h-48 object-cover" src="img.jpg" /&amp;gt;

&lt;h2&gt;Card Title&lt;/h2&gt;
&lt;p&gt;Description goes here.&lt;/p&gt;

  Get Started



Output:
.card {
max-width: 24rem;
margin-left: auto;
margin-right: auto;
background-color: #ffffff;
border-radius: 0.75rem;
box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);
overflow: hidden;
}&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;.card-image {&lt;br&gt;
  width: 100%;&lt;br&gt;
  height: 12rem;&lt;br&gt;
  object-fit: cover;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.card-body {&lt;br&gt;
  padding: 1.5rem;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.card-title {&lt;br&gt;
  font-size: 1.25rem;&lt;br&gt;
  font-weight: 700;&lt;br&gt;
  color: #111827;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.card-description {&lt;br&gt;
  margin-top: 0.5rem;&lt;br&gt;
  color: #4b5563;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.card-button {&lt;br&gt;
  margin-top: 1rem;&lt;br&gt;
  padding-left: 1rem;&lt;br&gt;
  padding-right: 1rem;&lt;br&gt;
  padding-top: 0.5rem;&lt;br&gt;
  padding-bottom: 0.5rem;&lt;br&gt;
  background-color: #2563eb;&lt;br&gt;
  color: #ffffff;&lt;br&gt;
  border-radius: 0.25rem;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.card-button:hover {&lt;br&gt;
  background-color: #1d4ed8;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fydxguqyxxusveb4kp5d7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fydxguqyxxusveb4kp5d7.png" alt=" " width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tailwindcss</category>
      <category>css</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What happens when 4 competing products all stumble at the same time</title>
      <dc:creator>Eidon Ze</dc:creator>
      <pubDate>Sun, 02 Aug 2026 04:47:49 +0000</pubDate>
      <link>https://dev.to/eidon_ze_598ff4e987ed54d2/what-happens-when-4-competing-products-all-stumble-at-the-same-time-pja</link>
      <guid>https://dev.to/eidon_ze_598ff4e987ed54d2/what-happens-when-4-competing-products-all-stumble-at-the-same-time-pja</guid>
      <description>&lt;p&gt;I've been researching the freelancer client portal space for a side project, and I stumbled into something I didn't expect.&lt;/p&gt;

&lt;p&gt;In the last 12 months:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HoneyBook raised prices and got flooded with 1-star reviews for crashing&lt;/li&gt;
&lt;li&gt;Fiverr shut down AND.CO entirely — tens of thousands of users had to leave&lt;/li&gt;
&lt;li&gt;Dubsado's setup process is so complex people hire $500+ consultants&lt;/li&gt;
&lt;li&gt;Bonsai got acquired and went radio silent on product updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Four products, four different problems, all happening at once.&lt;/p&gt;

&lt;p&gt;It got me thinking — if you were going to build a client portal today, what would you actually include? I've been talking to freelancers and the answer keeps coming back to like four features: project status, file sharing, invoices, messages. That's it. No CRM pipelines, no workflow automations, no "enterprise plan."&lt;/p&gt;

&lt;p&gt;So I threw up a landing page to see if anyone cares. It's called ClientDash — one link per client, $49 one-time, no subscription.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://peppy-pegasus-d7ec4a.netlify.app/" rel="noopener noreferrer"&gt;https://peppy-pegasus-d7ec4a.netlify.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm not sure if this is a real window or just a coincidence I'm reading too much into. Curious what people here think — is the client portal space actually underserved, or are freelancers just fine with Google Docs + email?&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>freelance</category>
    </item>
    <item>
      <title>ReceiptRadar — Auto-extract every receipt from your Gmail inbox</title>
      <dc:creator>Eidon Ze</dc:creator>
      <pubDate>Sat, 01 Aug 2026 11:38:46 +0000</pubDate>
      <link>https://dev.to/eidon_ze_598ff4e987ed54d2/receiptradar-auto-extract-every-receipt-from-your-gmail-inbox-510h</link>
      <guid>https://dev.to/eidon_ze_598ff4e987ed54d2/receiptradar-auto-extract-every-receipt-from-your-gmail-inbox-510h</guid>
      <description></description>
      <category>ai</category>
    </item>
  </channel>
</rss>
