Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
Live truck GPS: create loads, read position, ETA, driver state, trip stats. API key or USDC x402.
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
PINGPOINT_AGENT_KEY, PINGPOINT_WALLET_KEY_FILE, PINGPOINT_NETWORK, PINGPOINT_BASE_URL, PINGPOINT_RPC_URLค่าที่ติดป้ายความลับคือกุญแจของบัญชีคุณ อย่าส่งให้ใคร และอย่าวางในแชต
ต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"pingpoint": {
"command": "npx",
"args": [
"-y",
"@suverselabs/pingpoint-mcp"
],
"env": {
"PINGPOINT_AGENT_KEY": "ใส่ค่าของคุณ",
"PINGPOINT_WALLET_KEY_FILE": "ใส่ค่าของคุณ",
"PINGPOINT_NETWORK": "ใส่ค่าของคุณ",
"PINGPOINT_BASE_URL": "ใส่ค่าของคุณ",
"PINGPOINT_RPC_URL": "ใส่ค่าของคุณ"
}
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add pingpoint --env PINGPOINT_AGENT_KEY='ใส่ค่าของคุณ' --env PINGPOINT_WALLET_KEY_FILE='ใส่ค่าของคุณ' --env PINGPOINT_NETWORK='ใส่ค่าของคุณ' --env PINGPOINT_BASE_URL='ใส่ค่าของคุณ' --env PINGPOINT_RPC_URL='ใส่ค่าของคุณ' -- npx -y @suverselabs/pingpoint-mcpเติมค่าที่เว้นว่างไว้ก่อนรัน
วางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"pingpoint": {
"command": "npx",
"args": [
"-y",
"@suverselabs/pingpoint-mcp"
],
"env": {
"PINGPOINT_AGENT_KEY": "ใส่ค่าของคุณ",
"PINGPOINT_WALLET_KEY_FILE": "ใส่ค่าของคุณ",
"PINGPOINT_NETWORK": "ใส่ค่าของคุณ",
"PINGPOINT_BASE_URL": "ใส่ค่าของคุณ",
"PINGPOINT_RPC_URL": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"pingpoint": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@suverselabs/pingpoint-mcp"
],
"env": {
"PINGPOINT_AGENT_KEY": "ใส่ค่าของคุณ",
"PINGPOINT_WALLET_KEY_FILE": "ใส่ค่าของคุณ",
"PINGPOINT_NETWORK": "ใส่ค่าของคุณ",
"PINGPOINT_BASE_URL": "ใส่ค่าของคุณ",
"PINGPOINT_RPC_URL": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
PINGPOINT_NETWORK envPINGPOINT_BASE_URL envPINGPOINT_RPC_URL envค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 6 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub sudzikcoin ซึ่งเป็นเจ้าของ repo
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
ต้องใส่ค่าเหล่านี้: PINGPOINT_AGENT_KEY, PINGPOINT_WALLET_KEY_FILE
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.5.1) เข้า registry 2 เดือนที่ผ่านมา
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Node.js ในเครื่องด้วย
ในหมวดเดียวกันมี Spec Driven Development, Remote Desktop Commander, Apify MCP Server
server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว
อ่านการ์ด:★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Extract data from any website with thousands of scrapers, crawlers, and automations on Apify Store ⚡
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
MCP server that gives an AI agent a live truck GPS position: create a freight load, PingPoint texts the driver an app link (onboarding takes about a minute — no ELD provider, no corporate account, no annual contract), then read live position, GPS track, stop timeline and ETA, and cancel a load you no longer need.
No account yet? A sandbox key is published at https://pingpoint.suverse.io/docs/#sandbox: same endpoints, no signup, and the load drives itself through the full cycle in about 20 minutes. Or skip keys entirely and pay per call with USDC from a wallet on Arc, Base or Solana.
Claude Code, one line:
claude mcp add pingpoint --env PINGPOINT_AGENT_KEY=sup_agent_… -- npx -y @suverselabs/pingpoint-mcp
Or add to your MCP config (Claude Desktop: claude_desktop_config.json; Claude Code: .mcp.json; any MCP-capable agent works the same way):
{
"mcpServers": { "pingpoint": { "command": "npx", "args": ["-y", "@suverselabs/pingpoint-mcp"], "env": { "PINGPOINT_AGENT_KEY": "sup_agent_…" } } } }
Restart the agent and the tools appear.
Clients that speak MCP Streamable HTTP can connect straight to
https://pingpoint.suverse.io/mcp
Authorization: Bearer sup_agent_…
Claude Code: claude mcp add --transport http pingpoint https://pingpoint.suverse.io/mcp --header "Authorization: Bearer sup_agent_…".
The server is stateless and keeps no credentials: each request runs with the key it carries. Listing tools works without a key; calling one without it answers HTTP 401. Same tools, same prices. Wallet mode (pay per call with USDC) is available only when you run the package yourself.
| Tool | What it does | Returns | Price |
|---|---|---|---|
create_load | Creates a freight load (multi-stop supported); PingPoint texts the driver app link to driverPhone | loadNumber, public trackingLink, driver web/app links, dedup flag | $0.65 |
get_load_position | Live state of a load by load number | status, driver tracking state (driverTracking) with invite/open/decline timestamps, GPS track (last 500 points), stops with arrive/depart timestamps, distance covered, on-time flag, dwell times, ETA block | $0.02 |
get_trip_stats | Post-trip summary over the whole GPS trip (best on a DELIVERED load) | stats with distance, duration, avg/max speed, hard accel/brake counts, city/highway/parked/night shares, GPS coverage, first/last ping | $0.02 |
cancel_load | Cancels the load: status CANCELLED, tracking stops, nothing deleted, no refund | { ok, loadNumber, previousStatus, status, cancelledAt, trackingEndedAt } | free |
update_load_status | Not part of the API — statuses are GPS-verified, see below | HTTP 501 OPERATION_NOT_AVAILABLE | — |
get_pricing | Current USD price list for agent operations | { currency, prices } | free |
get_balance | Prepaid balance that pays for creates and position reads | { currency, balanceUsd } | free |
Why `update_load_status` answers 501. PingPoint drives load statuses itself, from driver GPS and geofence events, so external status writes don't exist. Treat that as a data-integrity guarantee: a status you read was never hand-set by anyone; it is backed by actually recorded position. The tool is kept only so an agent that tries it gets a clear answer instead of a mystery. Delivery confirmation is likewise not a vendor operation — it belongs to the carrier flow, where the carrier files the BOL over Telegram.
Stops. A load carries 1–2 pickups and 1–3 deliveries; array order is the stop sequence. Each stop takes an optional window: date (start) and dateTo (end). onTime is measured against the dateTo of the last delivery, so without it that field stays null. Stops are fixed at creation — there is no add-stop tool.
Required to create a load: driverPhone (E.164 — the driver app link is sent to that number) plus pickups and deliveries arrays; every stop needs address, city, state, zip. Everything else is optional. customerRef doubles as a dedup key; pass the same idempotencyKey on retries so the balance is charged at most once.
get_load_position with { "loadNumber": "LD-2026-042317" } returns:
{
"loadNumber": "LD-2026-042317", "pingpointLoadId": "6f1c2d3e-8a45-4b9c-9d10-2e5f7a8b9c01", "status": "IN_TRANSIT", "createdAt": "2026-08-18T14:02:11.000Z", "deliveredAt": null, "driverTracking": "REPORTING", "inviteSentAt": "2026-08-18T14:02:12.000Z", "linkOpenedAt": null, "declinedAt": null, "distanceMiles": 412.7, "onTime": null, "delayMinutes": null, "pickupDwellMinutes": 38, "deliveryDwellMinutes": null, "stops": [ { "type": "PICKUP", "sequence": 1, "city": "Claremore", "state": "OK", "windowFrom": "2026-08-18T15:00:00.000Z", "windowTo": "2026-08-18T19:00:00.000Z", "arrivedAt": "2026-08-18T15:47:31.000Z", "departedAt": "2026-08-18T16:25:09.000Z" }, { "type": "DELIVERY", "sequence": 2, "city": "Charlotte", "state": "NC", "windowFrom": "2026-08-20T12:00:00.000Z", "windowTo": "2026-08-20T16:00:00.000Z", "arrivedAt": null, "departedAt": null } ], "gpsTrack": [ { "lat": 36.3126, "lng": -95.6161, "speed": null, "heading": null, "ts": "2026-08-18T16:25:09.000Z" }, { "lat": 35.4676, "lng": -94.3579, "speed": null, "heading": null, "ts": "2026-08-18T18:55:42.000Z" } ], "pingCount": 214, "eta": { "nextStop": { "type": "DELIVERY", "sequence": 2, "city": "Charlotte", "state": "NC" }, "receivingWindow": { "from": "2026-08-20T12:00:00.000Z", "to": "2026-08-20T16:00:00.000Z" }, "distanceToNextStopMi": 611.4, "driveTimeHours": 11.2, "moving": true, "stoppedForMinutes": null, "etaWindow": { "from": "2026-08-20T13:05:00.000Z", "to": "2026-08-20T15:40:00.000Z" }, "tracking": { "state": "pinging", "noDataForMinutes": null }, "reason": null } }
(gpsTrack shortened here; the API returns up to the last 500 points.)
get_load_position answers "where is the truck now"; get_trip_stats answers "how did the finished trip go". On a DELIVERED load, get_trip_stats with { "loadNumber": "LD-2026-648319" } returns:
{
"loadNumber": "LD-2026-648319", "loadId": "927741bc-dfd0-41ba-9e99-5c5031c756f9", "stats": { "dataPoints": 4785, "durationSeconds": 69329, "estimatedDistanceMiles": 486.591, "avgSpeedMph": 25.27, "maxSpeedMph": 88.22, "hardAccelCount": 280, "hardBrakeCount": 168, "cityMilesPct": 9.96, "highwayMilesPct": 88.65, "parkedTimePct": 53.65, "nightPct": 44.7, "coveragePct": 100, "firstAt": "2026-08-18T16:53:25.000Z", "lastAt": "2026-08-19T12:08:54.000Z" } }
Distances are miles, speeds are mph, percentages are 0–100, timestamps are UTC.
driverTracking in the get_load_position answer is the same word the PingPoint cabinet shows, so the agent can explain a silent load without guessing from an empty track:
driverTracking | Meaning | Look at |
|---|---|---|
NOT_BOUND | Driver link never opened in the app | inviteSentAt (SMS went out?), linkOpenedAt (opened in a browser but app not installed) |
BOUND_SILENT | App bound to the load, no position yet | wait for the first ping |
DECLINED | Driver tapped "Not now" on the location-consent screen | declinedAt; cleared once the driver agrees |
REPORTING | Positions arriving | gpsTrack, eta |
PAUSED_BY_DRIVER | Sharing paused from the app | eta.tracking.state === "driver_paused" |
null means the load has no driver yet.
Push notifications (pingpoint.load.created, pingpoint.load.updated, pingpoint.status.changed, pingpoint.load.completed, pingpoint.exception.raised, pingpoint.exception.resolved — the last two for LATE / NO_SIGNAL / LONG_DWELL) are configured in the cabinet, not through MCP tools: https://pingpoint.suverse.io/docs/webhooks
No account, no key: point the server at a wallet and every paid tool call is settled from it in USDC over x402 (HTTP 402 + a signed USDC transfer). PingPoint's relayer submits the transfer and pays the gas; the server only signs. Pick the chain with PINGPOINT_NETWORK:
PINGPOINT_NETWORK | Key file holds | USDC |
|---|---|---|
arc-mainnet | EVM private key, 0x + 64 hex | USDC on Arc 0x3600…0000 |
arc-testnet (default) | EVM private key, 0x + 64 hex | Arc testnet USDC 0x3600…0000 (faucet) |
base-mainnet | EVM private key, 0x + 64 hex | Circle USDC on Base 0x8335…2913 |
solana-mainnet | Solana secret key — the 64-byte JSON array written by solana-keygen, or base58 | Circle USDC mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v |
# EVM (Arc testnet / Base)
echo "0x<64 hex private key>" > ~/.pingpoint-wallet.key && chmod 600 ~/.pingpoint-wallet.key claude mcp add pingpoint --env PINGPOINT_WALLET_KEY_FILE=$HOME/.pingpoint-wallet.key --env PINGPOINT_NETWORK=base-mainnet -- npx -y @suverselabs/pingpoint-mcp
solana-keygen new --outfile ~/.pingpoint-wallet.json # or point at an existing keypair file claude mcp add pingpoint --env PINGPOINT_WALLET_KEY_FILE=$HOME/.pingpoint-wallet.json --env PINGPOINT_NETWORK=solana-mainnet -- npx -y @suverselabs/pingpoint-mcp
{
"mcpServers": { "pingpoint": { "command": "npx", "args": ["-y", "@suverselabs/pingpoint-mcp"], "env": { "PINGPOINT_WALLET_KEY_FILE": "/home/me/.pingpoint-wallet.json", "PINGPOINT_NETWORK": "solana-mainnet", "PINGPOINT_RPC_URL": "https:// " } } } }
Fund the wallet with USDC on that network (ask get_balance — it returns the address and the balance), then use the tools as usual. On Solana the wallet needs no SOL: PingPoint's relayer is the transaction fee payer. Paid results carry a payment block with the transaction hash (EVM) or signature (Solana) and an explorer link:
{ "loadNumber": "LD-2026-111417", "trackingLink": "https://pingpoint.suverse.io/track/…",
"payment": { "transaction": "0x97f738e3…", "network": "base-mainnet", "payer": "0xE958…dB2E", "amountUsdc": "0.65", "explorerUrl": "https://basescan.org/tx/0x97f738e3…" } }
| Tool | Price (USDC) | Notes |
|---|---|---|
create_load | 0.65 | per wallet and network: 2 loads per 24 hours on a testnet, 20 on a mainnet; a driver phone used by another wallet within the hour is refused |
get_load_position | 0.02 per call | only loads created by this wallet (another wallet's load → 403) |
get_trip_stats | 0.02 per call | same ownership rule |
cancel_load | free | zero-value signature proves ownership, no transaction |
get_pricing | free | reads the server's 402 offers, nothing signed |
get_balance | free | one RPC read of the wallet's USDC (ERC-20 balanceOf or the Solana token account); PINGPOINT_RPC_URL overrides the public RPC |
A refused call (403, 404, 429, invalid input, PaymentFailed INSUFFICIENT_BALANCE, 503 X402_RELAYER_LOW_GAS) costs nothing: ownership, limits, balance and the relayer's gas are checked before settlement. EVM offers live 300 s with a one-time nonce per signature; a Solana transaction lives as long as its blockhash (about a minute). The SDK refuses offers above 1 USDC or on another asset or network before signing. Keep the key file private (chmod 600) — a wallet holding just enough USDC for the day is the sensible setup. Public RPC endpoints (Base, Solana) rate-limit; set PINGPOINT_RPC_URL to your provider for steady use.
ตัดมาแค่ช่วงต้น อ่านต่อใน repo