Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
제작자가 쓴 설명(영어 원문)
Safe to sign? EVM/Solana/XRPL/Algorand/Stellar txs, permits, tokens; OFAC screen: green/orange/red
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.
필요한 것
어떤 앱을 쓰세요?
위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.
웹, 데스크톱, 모바일의 Claude에서 쓸 수 있어요:
https://presign-guard.fizzl.eu/mcp터미널에서 이 명령어를 실행하세요
claude mcp add --transport http presign-guard https://presign-guard.fizzl.eu/mcp프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요
{
"mcpServers": {
"presign-guard": {
"url": "https://presign-guard.fizzl.eu/mcp"
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"servers": {
"presign-guard": {
"type": "http",
"url": "https://presign-guard.fizzl.eu/mcp"
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요:
https://presign-guard.fizzl.eu/mcp메뉴 이름은 요금제나 시기에 따라 조금 다를 수 있어요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.
아직 이 서버의 도구 목록을 읽지 않았어요. 엔드포인트는 차례대로 돌아가며 점검해요.
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 7일 점검
레지스트리 이름이 GitHub 계정 Fizzl13 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 점검하지 않았어요. 엔드포인트는 차례대로 돌아가며 점검해요
아직 점검하지 않았어요. 엔드포인트는 차례대로 돌아가며 점검해요
아직 점검하지 않았어요. 엔드포인트를 점검할 때 도구 목록을 읽어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
레지스트리에 필수 키가 나와 있지 않아요. 다만 처음 쓸 때 로그인을 요구하는 서버도 있어요.
제작자의 클라우드에서 실행돼요. 설치 없이 인터넷으로 연결하지만, 보내는 내용은 제작자의 서버를 거쳐요.
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(1.9.0)은 11일 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. URL로 연결되기 때문에, 원격 MCP 서버를 지원하는 앱(예: 개발자 모드의 ChatGPT)에서도 쓸 수 있어요.
같은 카테고리에는: Spec Driven Development, Remote Desktop Commander, EmbeddedCI BenchPod
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
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.
Drive a BenchPod hardware-in-the-loop bench: power, flash, UART, I2C, CAN, analog and logic.
제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.
· Live status ·
A pre-sign risk check for AI agents. Before an agent signs a transaction, approval, or EIP-712 signature, it pays a few cents per call over x402 and gets back a green / orange / red verdict with machine-readable reason codes. Optionally, it also gets a plain-language explanation in Dutch or English.
Watch the 1-minute explainer: presign-guard.fizzl.eu/media/explainer.mp4
New: the token verdict in 45 seconds: presign-guard.fizzl.eu/media/token.mp4
Part of Fizzl.
The problem. On NEAR an AI agent can be given a function-call key: it can only call the methods it names on one contract, without a deposit, within a gas allowance. That is the right sandbox for an agent with money. But the transactions and NEAR Intents messages an agent signs can take that sandbox apart: a full-access key added, the account deleted, code deployed over the wallet, a key added to NEAR Intents, a swap that gives far more than it gets, a deposit into a look-alike of intents.near. An agent reading a tool result or a web page can be talked into signing any of them.
What we built for NEAR (in the hackathon window). presign-guard, an existing pre-sign check for EVM, Solana, XRPL, Algorand and Stellar, now checks NEAR before an agent signs:
type: "near"): base64 borsh (unsigned or signed), wallet-selector JSON or several transactions; every action judged, meta transactions by their inner actions. Red for a full-access key added, the account deleted, code deployed over the wallet, the last full-access key deleted (read from the account), add_public_key on intents.near, a forced storage_unregister, fake USDC/USDT/wNEAR (ft_metadata), look-alike accounts. Details: NEAR transactions.nep413): the message an agent signs to trade, also inside execute_intents. Red for a token_diff that only gives, or gives back less than half its value at NEAR Intents' own 1Click prices (orange under 90%), a key added, fake tokens received, look-alike receivers; orange for another verifier than intents.near or a deadline days away.presign_check, presign_quick_check).The NEAR code: src/near-tx.js, test/near-tx.test.mjs, near/demo.mjs, and the wiring in src/presign-guard.js, src/mcp.js and src/discovery.js. Pull requests #259, #260 and #261; everything before them is the existing product (baseline). Libraries: @near-js/transactions and @near-js/utils (decoding only), FastNEAR's public RPC, NEAR Intents' 1Click API (dry quotes and token prices).
Try it (no keys, no money):
npm install && node near/demo.mjs: an agent gets a real NEAR Intents quote (1 wNEAR to USDC, dry: true), builds the message it would sign, and checks it and five attacks. See: the honest swap green; a quote tampered to 30% of the value red (NEAR_INTENTS_BAD_PRICE); a key slipped into the swap red (NEAR_INTENTS_KEY_ADDED); a deposit into intents-near.near red (NEAR_LOOKALIKE_ACCOUNT); a prompt-injected full-access key red (NEAR_FULL_ACCESS_KEY_ADDED); a function-call key for intents.near only green. Each case also shows the live server's verdict.curl -s -X POST https://presign-guard.fizzl.eu/v1/check/quick -H 'content-type: application/json' -d '{"type":"near","tx":{"signerId":"alice.near","receiverId":"alice.near","actions":[{"type":"DeleteAccount","params":{"beneficiaryId":"thief.near"}}]}}' and see "verdict":"red".npm test: the NEAR rules against a stand-in RPC (test/near-tx.test.mjs).The full answer with reason codes (POST /v1/check) costs $0.01 over x402; the verdict-only /v1/check/quick and MCP presign_quick_check are free (10 an hour).
presign-guard-walletFor agents on viem, the npm package presign-guard-wallet wraps the wallet so every sendTransaction, writeContract and signTypedData is checked first: green signs, orange stops (or asks), red never signs. Each verdict's signed receipt is verified before the wallet acts.
import { guardWallet } from "presign-guard-wallet";
const wallet = guardWallet(walletClient, { pay, onOrange: "stop" }); // pay = an x402 fetch, $0.01 per check await wallet.writeContract({ address: token, abi, functionName: "approve", args: [spender, amount] });
npm install presign-guard-wallet viem @x402/fetch @x402/evm · source and options
| Route | Price | Returns |
|---|---|---|
POST /v1/check | $0.01 USDC | Verdict, reason codes, decoded subject |
POST /v1/check/explain | $0.03 USDC | The same, plus a plain-language explanation (lang: "nl" or "en") |
GET /v1/token?chain=…&address=… | $0.01 USDC | Token verdict: grade, reason codes, one-line summary, market data (see below) |
GET /v1/approvals?chain=…&address=… | $0.02 USDC | Wallet approval audit: every open token approval (EVM) or token delegation (Solana), its spender, and which to revoke (see below) |
GET /v1/screen?address=… | $0.01 USDC | Wallet screen: any chain's address against the OFAC SDN list, plus theft and phishing reports for EVM (see below) |
POST /v1/injection | $0.01 USDC | Prompt-injection check: is a text your agent received (page, email, tool result, API answer, another agent's message) a trap? (see below) |
POST /v1/injection/quick | free, shares the 10 calls/hour | The prompt-injection verdict only, for texts up to 8,000 characters |
POST /v1/check/quick | free, shares the 10 calls/hour | The pre-sign verdict only, for the same body as POST /v1/check (as the MCP tool presign_quick_check) |
GET /v1/sanctions | free | Open data: every digital currency address on the OFAC SDN list with its entry (name, programs, currency), the list's publish date; refreshed every 6 hours. Solana addresses also carry their USDC and USDT token accounts, because a token transfer names that account and not the owner (ready for a denylist such as a Privy condition set). For screening locally, e.g. with presign-guard-payer-screen |
GET /v1/credits/100, /v1/credits/1000 | $0.80 / $7.00 USDC | A pack of prepaid credits (20% / 30% off): see Credit packs |
GET /v1/credits | free | Pack prices, credit cost per call, and your balance (with the x-credit-key header) |
POST /mcp | free / paid | MCP server (Streamable HTTP): see below |
POST /mcp/free | free | The same MCP server with only the free checks |
POST /feedback | free | Report a bug or a missing feature: see Feedback |
GET /health | free | Liveness |
GET /openapi.json | free | OpenAPI 3.1 spec with prices (x-payment-info) |
GET /.well-known/x402 | free | x402 discovery manifest |
Payment is x402 v2 with the exact scheme, on every paid route in USDC on Base, Solana, Monad, Polygon, Arbitrum, Avalanche, Algorand or Stellar, in USD₮0 on X Layer (eip155:196, token 0x779d…3736, settled by PayAI's facilitator), or in RLUSD on the XRP Ledger (xrpl:0, the same dollar amount, issuer rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De; the payer signs an XRPL Payment with the challenge's extra.invoiceId as InvoiceID, see @x402/xrpl, and the server verifies and submits it itself). The 402 carries Bazaar discovery metadata (input example, input and output schema), and the challenge is mirrored into the JSON body for clients that don't read the PAYMENT-REQUIRED header. You are never charged for an error. Invalid requests (400) and upstream outages (503) cancel settlement, and they always return verdict: null, never a guessed verdict.
USDC on Polygon (eip155:137), Arbitrum (eip155:42161) and Avalanche C-Chain (eip155:43114) goes to PAY_TO, the same wallet as on Base; Coinbase's facilitator settles it where it lists the network, PayAI's otherwise (EXTRA_EVM_FACILITATOR_URL replaces PayAI). POLYGON_PAY_TO, ARBITRUM_PAY_TO and AVALANCHE_PAY_TO override the wallet, and off leaves that network out.
Agents that call presign-guard often can prepay: one x402 payment of $0.80 for 100 credits or $7.00 for 1000 credits (20% and 30% off), valid for a year. A credit is $0.01 of checks: POST /v1/check, GET /v1/token, GET /v1/screen and POST /v1/injection cost 1, GET /v1/approvals 2, POST /v1/check/explain 3.
# 1. Buy a pack (any x402 client); the answer holds your key
GET /v1/credits/100 -> { "credit_key": "pgc_…", "credits": 100, "expires_at": "…" }
curl -X POST https://presign-guard.fizzl.eu/v1/check -H 'x-credit-key: pgc_…' -H 'content-type: application/json' -d '{…}'
curl https://presign-guard.fizzl.eu/v1/credits -H 'x-credit-key: pgc_…'
A call that fails (400 or 5xx) gives its credits back. With no key, a malformed or unknown key, or too few credits, the call gets the normal 402 (x-credit-status says why), so a client can always fall back to paying per call. Keep the key secret: anyone who has it can spend the credits, and it cannot be recovered (only a SHA-256 of it is stored). Credits work over HTTP; MCP tools are paid per call.
Packs are only offered when balances persist: set CREDITS_REDIS_URL (a persistent Redis, for example a free Upstash database; Render only). Without it the credit routes don't exist.
OWS (MoonPay's wallet standard for agents, used by Ripple's XRPL AI Starter Kit) checks policies before it decrypts a key for an agent token (ows_key_…). Its built-in rules cover chains and expiry; anything that looks inside the transaction needs a custom executable, and OWS ships none. presign-guard is one: POST /v1/check also takes the PolicyContext OWS writes to the policy's stdin, and answers with the PolicyResult OWS reads from stdout, { "allow": …, "reason": … }, next to the usual verdict and reasons.
# ~/.ows/plugins/policies/presign-guard.sh (examples/ows/presign-guard.sh), chmod +x
exec curl -s --max-time 4.8 -X POST https://presign-guard.fizzl.eu/v1/check \ -H 'content-type: application/json' -H "x-credit-key: $(cat "$HOME/.ows/presign-guard.key")" --data-binary @-
Buy the credits with OWS itself: ows pay request pays our x402 402 (USDC on Base) and prints the credit key. Run it as the wallet's owner (with the wallet passphrase, not the agent token: the agent token's policy needs the credits first).
key=$(ows pay request --wallet my-wallet https://presign-guard.fizzl.eu/v1/credits/100 | jq -er 앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요