ต้นแบบ · รุ่นทดลอง: มีทุก server ในทะเบียนทางการ อัปเดตทุก 30 นาที รีวิวและบัญชีผู้ใช้จะมาในขั้นถัดไป
PopNx MCPที่รวม MCP สำหรับคนใช้ AI · อธิบายเป็นภาษาคน

vet402-check

โดย kzmttkcรุ่น 0.2.0i★ 0iรันบนเครื่อง
ชื่อใน registryio.github.kzmttkc/vet402-check

ติดตั้ง

ภาพรวม

คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)

Before your agent pays an x402 API, check if vet402 bought it with its own money and what came back.

สามเสาของ PopNx MCP

สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน

ใช้ทำอะไรได้

ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry

  • การเชื่อมต่อ: รันบนเครื่อง
  • ช่องทาง (transport): stdio
  • หมวด: อื่น ๆ

ติดตั้ง

เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง

ก่อนติดตั้ง

ต้องเตรียมก่อน

  • npmติดตั้ง Node.js (มีคำสั่ง npx) ในเครื่อง

คุณใช้แอปไหน

เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”

เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json

{
  "mcpServers": {
    "vet402-check": {
      "command": "npx",
      "args": [
        "-y",
        "@vet402/check",
        "--mcp"
      ]
    }
  }
}

พิมพ์คำสั่งนี้ใน Terminal

claude mcp add vet402-check -- npx -y @vet402/check --mcp

เปิดใน Cursor

หรือคัดลอกค่าตั้งเอง

วางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json

{
  "mcpServers": {
    "vet402-check": {
      "command": "npx",
      "args": [
        "-y",
        "@vet402/check",
        "--mcp"
      ]
    }
  }
}

เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง

เปิดใน VS Code

หรือคัดลอกค่าตั้งเอง

วางในไฟล์ .vscode/mcp.json ของโปรเจกต์

{
  "servers": {
    "vet402-check": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@vet402/check",
        "--mcp"
      ]
    }
  }
}

เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง

ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น

ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี

ค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README

ใช้กับโปรแกรมไหนได้

ดูจากแบบการต่อของ server ตัวนี้ และเอกสารของผู้ทำโปรแกรมแต่ละตัว ตรวจเมื่อ 10 พ.ย. 2569

ติดตั้งบนเครื่องได้ใน

ClaudeGooseLM StudioMsty StudioCherry StudioCursorVS Code + GitHub CopilotVisual StudioWindsurf (Devin Desktop)ZedKiroClineContinueJetBrains AI AssistantClaude CodeCodex CLIGemini CLIOpenCodenodecodeWarpLibreChatRaycast

ดูโปรแกรมทั้งหมดพร้อมข้อดีข้อเสีย →

ทำอะไรได้บ้าง

รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง

ผลตรวจเบื้องต้นi

เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 10 พ.ย. 2569

  • ✓ ผ่าน

    ตัวตนผู้ทำตรงกับ repo

    ชื่อใน registry ยืนยันด้วยบัญชี GitHub kzmttkc ซึ่งเป็นเจ้าของ repo

  • ✓ ผ่าน

    ยังมีคนดูแล

    มีการแก้โค้ดล่าสุด วันนี้

  • … ยังไม่ตรวจ

    มีสัญญาอนุญาต (license)

    ยังไม่ได้อ่านข้อมูล repo จาก GitHub

  • – ไม่เกี่ยว

    endpoint ตอบ

    ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต

  • – ไม่เกี่ยว

    ล็อกอินแบบ OAuth

    ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน

  • … ยังไม่ตรวจ

    คำอธิบายเครื่องมือไม่มีคำสั่งแอบแฝง

    รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต

เทียบกับตัวอื่นในหมวด อื่น ๆi

  • ดาวมากกว่า 0% ของอีก 19103 ตัวในหมวดนี้
  • ส่งรุ่นใหม่เข้า registry ล่าสุดกว่า 58% ของอีก 19103 ตัวในหมวดนี้
  • ผลตรวจเบื้องต้นดีกว่าหรือเท่ากับ 100% ของอีก 19103 ตัวในหมวดนี้

เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo

คำถามที่พบบ่อย

vet402-check ปลอดภัยไหม?

จากการตรวจเบื้องต้นของเรา ผ่าน 2 จาก 2 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น

ต้องใช้กุญแจหรือรหัสอะไรบ้าง?

registry ไม่ได้ระบุว่าต้องใช้กุญแจ แต่บางตัวจะขอให้ล็อกอินตอนใช้ครั้งแรก

ตัวนี้รันบนเครื่องหรือบนคลาวด์?

รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)

ยังมีคนดูแลอยู่ไหม?

repo บน GitHub มีการแก้โค้ดล่าสุด วันนี้ และส่งรุ่นล่าสุด (0.2.0) เข้า registry 33 วันที่ผ่านมา

ใช้กับโปรแกรมไหนได้บ้าง?

โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Node.js ในเครื่องด้วย

มีตัวไหนใช้แทนได้บ้าง?

ในหมวดเดียวกันมี World Monitor, Claude Flow, Tldraw

ตัวที่ใช้แทนได้

server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว

อ่านการ์ด:↓ ดาวน์โหลดต่อสัปดาห์i★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi

World Monitor

Real-time global intelligence on conflict, markets, energy, trade, shipping and cyber. 102 tools.

โดย koala73ใช้กันมาก★ 90.4Kอัปเดต 5 วันที่ผ่านมา

รันบนคลาวด์✓ worldmonitor.app

Claude Flow

AI orchestration with hive-mind swarms, neural networks, and 87 MCP tools for enterprise dev.

โดย ruvnetใช้กันมาก↓ 13.5K/สัปดาห์★ 81.4Kอัปเดต 14 เดือนที่ผ่านมา

รันบนเครื่อง

Tldraw

Draw and visually collaborate with your agents on tldraw's canvas.

โดย tldrawใช้กันมาก★ 51.4Kอัปเดต 8 เดือนที่ผ่านมา

รันบนคลาวด์

README จากผู้ทำ

เปิดอ่าน README

ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ

@vet402/check (command: vet402-check)

Look an x402 or MPP seller up in vet402's public record before an agent pays it.

This package reads the public record of vet402's own purchases (the vet402-delivery repository). It is separate from @vet402/mcp-server, the MCP tools for vet402's scoring API.

vet402 buys from x402 and MPP sellers with its own money on Solana, Tempo and Base (and Algorand, on its own page), checks each payment on chain, and publishes what came back: a ranking (rank.json) and signed records whose daily Merkle root is written into a Solana memo. vet402-check reads that record. It returns facts: how many purchases vet402 tried from the seller, how many settled, how many came back with an answer, the newest purchase and its tx, the failures counted against the seller and the ones that are not, the grade as rank.json prints it (measuring while there are too few purchases), and the signed records for that seller. When vet402 has never bought from the seller, the answer is "vet402 has no record of this seller". What to do with the facts is up to the caller.

Reads only public files: rank.json and records/ .json on the public site, and data/records/index.json in this repository. Verifying a record also reads public RPC. No key, no wallet, no payment, no write.

Try it in 60 seconds

Node 22 or newer. The first run downloads the package from npm (@vet402/check); later runs start at once.

npx -y @vet402/check https://api.xona-agent.com/token/pumpfun-trending

Verify the newest signed record of that seller as well (signature, Merkle proof, payment on chain, Solana memo anchor):

npx -y @vet402/check https://api.xona-agent.com/token/pumpfun-trending --verify

As an MCP server in Claude Code (run the line above once first, so the install is cached before the client starts the server):

claude mcp add vet402-check -- npx -y @vet402/check --mcp

Without Node: Python and curl

The same lookup over HTTP, free and with no key: GET https://vet402-delivery.vercel.app/v1/check?url= (optional chain and payTo). The answer starts with verdict and why (what the verdict means).

  • Python, standard library only: examples/python/check_before_paying.py. A command, a pay_after_check(url, pay) function, and a hook for the x402 Python HTTP client (x402HTTPClientSync(client).on_payment_required(vet402_on_payment_required)) that looks up the requested URL on every 402, before the client signs.
  • curl, one line each with jq and without: use.html#curl.

The command line

vet402-check <url> [--chain solana|tempo|base|algorand|<CAIP-2>] [--pay-to <address>] [--amount <atomic units>] [--asset <address>] [--explain] [--verify] [--offline] [--json]

vet402-check verify [--offline] [--json] vet402-check diagnose --url [--chain solana|base] [--status ] [--json] vet402-check --mcp

  • --chain limits the answer to one chain (eip155:8453 is Base, eip155:4217 is Tempo).
  • --pay-to compares the payTo in the 402 you hold with the payTo addresses vet402 recorded for that seller.
  • --amount and --asset compare the 402's amount (atomic units, as x402 writes it) and asset with what vet402 paid that seller (see Compare the 402 with what vet402 paid).
  • --explain lists the purchases the answer rests on, newest first, each with its date, chain, result, HTTP status and tx, and the payments in the seller's signed records (amount, asset, payTo).
  • --json prints the whole result: sellers[] (one per page the seller is on), records, payTo, asOf, sources.
  • Exit 0 after a lookup, found or not; 1 when a record fails verification; 2 on bad input or unreadable data.

From a clone: npm ci, then npm run check-before-paying -- .

MCP tools

Three read-only tools (stdio, newline-delimited JSON-RPC):

ToolInputReturns
check_before_payingurl, optional chain, pay_to, amount, asset, explain, verify_newest_recordthe facts above and the named reasons, as text and as structuredContent
verify_recordrecord (id or https URL), optional offlineOK, OK_NOT_ANCHORED, OK_OFFLINE or FAIL, one line per check
diagnose_failed_paymenttx, url, optional chain, statusseller_side, facilitator_side, buyer_side or undetermined, with reasons, and an evidence pack for seller_side

Claude Desktop (claude_desktop_config.json):

{ "mcpServers": { "vet402-check": { "command": "npx", "args": ["-y", "@vet402/check", "--mcp"] } } }

At the payment: the x402 fetch hook

Wrap the fetch an x402 client pays through. Every 402 is looked up before the client signs:

import { wrapFetchWithPayment } from "@x402/fetch";

import { wrapFetchWithCheck } from "@vet402/check"; // npm install @vet402/check

const fetchWithPay = wrapFetchWithPayment( wrapFetchWithCheck(fetch, { onCheck: (e) => { console.log(e.checks.map((c) => c.summary).join("\n")); // The rule is yours. To stop the payment, throw here: // if (e.checks.some((c) => c.sellers.some((s) => s.settled > 0 && s.delivered === 0))) throw new Error("not paying"); }, }), client, );

The hook goes under the payment wrapper because @x402/fetch calls the fetch it was given and creates the payment only after that returns 402. The hook reads the 402 through a clone (x402 accepts from the body or the PAYMENT-REQUIRED header, and an MPP WWW-Authenticate: Payment challenge), runs check_before_paying for each chain and payTo it offers, passes the result to onCheck, and returns the 402 unchanged. It never sees a key or a signer and changes no header. A request that already carries a payment (X-PAYMENT, PAYMENT-SIGNATURE, Authorization: Payment) is the client's retry and passes straight through. If vet402's record cannot be read, onCheck gets error set and no checks.

rank.json and the records index are read once and kept in memory for 10 minutes (new PublicData({ ttlMs })), so a busy agent does not download them for every 402. The signed records read to compare amounts are kept the same way.

Named reasons and a policy

Every answer carries reasons[], each with one sentence and the purchases or records it rests on. They are facts next to the verdict and never change it.

ReasonWhen
paid_not_deliveredvet402's newest paid purchase from the seller settled and came back with no answer (rank.json's seller-side rules after a settled payment). Said only for a seller vet402 has told about its results, the same condition the verdict uses.
payto_differsThe payTo in the 402 is not one vet402 paid this seller (and vet402 recorded at least one).
price_jumpThe 402 asks more than 10 times the highest amount vet402 paid for the same URL in the same asset. 10 times exactly is not a price_jump.
asset_unseenThe 402 asks for an asset vet402 never paid this seller in on that chain.
never_boughtvet402 has no purchase from this seller (on the asked chain).
stalevet402's newest purchase from this seller is more than 7 days old.

price_jump and asset_unseen come from the seller's signed records (the newest 8 on that chain, those for the same URL first). With no record to compare with, neither is said.

Give the hook a policy to decide per reason:

const fetchWithPay = wrapFetchWithPayment(

wrapFetchWithCheck(fetch, { policy: { paid_not_delivered: "block", payto_differs: "block", price_jump: "block", asset_unseen: "ask_human", never_bought: "warn" }, askHuman: async (e) => confirmWithPerson(e.reasons), // true pays, anything else stops }), client, );

  • block throws a CheckBlockedError before the client signs; its reasons names what stopped it.
  • ask_human calls askHuman(event) and pays only when it returns true. With no askHuman, it stops with a CheckNeedsApprovalError (a CheckBlockedError).
  • warn and allow go on. A reason the policy leaves out is allow.
  • onCheck gets event.reasons and event.decision (the action per reason and the strictest one) before any of this.
  • Without policy, the hook decides and waits exactly as in 0.1.2: event.reasons holds the reasons that come from rank.json alone, and no signed record is read, so price_jump and asset_unseen are not looked for.
  • When vet402's record cannot be read, event.error is set, there are no reasons, and the payment goes on, as in 0.1.2.

Compare the 402 with what vet402 paid

npx -y @vet402/check https://api.xona-agent.com/token/pumpfun-trending --chain solana --amount 1000000 --asset EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v

The answer adds comparison: the signed records read, the assets vet402 paid this seller in, the highest amount vet402 paid for this URL with its record and tx, and the ratio of the 402's amount to it. With a policy, the hook makes the same comparison for every x402 offer in a 402.

Diagnose a payment that brought no answer

npx -y @vet402/check diagnose <tx signature or hash> --url <seller URL> --status 500

From TypeScript: diagnose({ tx, url, status }, new PublicData()). As an MCP tool: diagnose_failed_payment.

  1. Reads the payment from public RPC (Solana or Base; SOLANA_RPC_URL and BASE_RPC_URL point it at other RPCs): settled or not, the payTo, the amount, the asset, the time. Nothing is signed or sent.
  2. Classifies the attempt with vet402's own fault rules (the same code rank.json is built with).
  3. Lists vet402's own purchases from the same seller on the same chain within 24 hours of the payment, or the nearest ones when there are none. rank.json keeps the newest purchases per seller, so an older payment may have none in its window.

The answer is fault with reasons[]:

  • seller_side only when all of these hold: the payment settled on chain, to a payTo vet402 paid this seller, in an asset vet402 paid it in and not below the least vet402 paid; the HTTP status is one vet402's rules put on the seller after a settled payment (5xx, 402 again); rank.json's list of the seller's newest purchases reaches back past the start of the window; vet402's own paid purchases from the seller within 24 hours also settled and came back with no answer, with none delivered; and no signed record of those days shows a delivered purchase from the seller.
  • buyer_side only for a payment that failed on chain because the paying token account lacked the funds.
  • facilitator_side only for a payment that failed on chain for another reason while vet402's own payments to the seller in the window also failed before settling.
  • undetermined for everything else: the RPC could not be read, no such transaction, no status given, a 4xx, a payTo vet402 never paid, an asset vet402 never paid the seller in, an amount below the least vet402 paid, vet402 got an answer from the seller in the window (in rank.json or in a signed record of those days), rank.json's list does not reach back to the window, or vet402 has no purchase in the window. A seller is not named on less than the full test.

For seller_side, evidence holds a pack to hand to the seller, as JSON and as Markdown: the tx and its explorer link, payer, payTo, amount and asset, the HTTP status the buyer reported, vet402's rule said of this payment, vet402's purchases in the window with their tx, and the signed records of those days (the payment itself left out when it is one of vet402's own). It is printed, not sent.

Framework examples

examples/ in this folder (not in the npm package): Coinbase AgentKit,

ตัดมาแค่ช่วงต้น อ่านต่อใน repo