Skip to main content
Glama
Kura

Kura

Kura

AI 에이전트를 위한 로컬 코인 지갑 — Base, Arc, x402, AI, MCP Mac에서 Claude 같은 AI가 인터넷 결제(x402)를 할 때, 사람이 비밀번호로 승인하는 지갑이에요.

  • 사람용 지갑(메타마스크 등)이 아니라 AI 에이전트용

  • 클라우드 SaaS 아님 — 로컬에서만 돌아가요. 키는 이 컴퓨터를 떠나지 않아요.

  • AI가 결제를 요청 → 사람이 비밀번호로 승인 → 실행

  • 체인은 Base(이더리움 L2, 수수료 거의 0). 기본은 메인넷 — 연습용 테스트넷(Base Sepolia)으로 설정에서 전환할 수 있어요

  • Arc(Circle L1)도 고를 수 있어요 — 메인넷과 테스트넷 둘 다. 가스도 USDC로 내는 체인이라 «가스용 ETH가 따로 필요한» 문제가 없어요. Arc에선 x402 결제를 지갑이 직접 체인에 올려요(정산해 줄 페이실리테이터가 없어도 되는 대신, 결제액과 수수료가 같은 잔액에서 나가요)

In English: README.en.md


한눈에 보기

[ AI 앱 (Claude Code / 데스크톱) ]
        │  MCP로 "결제해줘" 요청
        ▼
[ Kura 데스크톱 앱 ]  ← 승인 팝업 → 사람이 비밀번호 입력
        │  서명 (키는 이 앱 안에서만)
        ▼
[ Base · Arc 체인 / x402 ]  ← 실제 결제

비밀번호는 Kura 앱의 입력칸에서만 받아요. 채팅창·MCP·설정 파일 어디에도 들어가지 않아요.


Related MCP server: cardzero-mcp

설치

Apple Silicon Mac (macOS 11 이상)

(A) Homebrew

brew install --cask dinggi5/tap/kura

(B) DMG 직접 내려받기

Releases에서 Kura_<버전>_aarch64.dmg를 받아 열고, Kura를 Applications 폴더로 끌어다 놓으세요.

열쇠를 맡기는 앱이니, 받은 앱이 진짜 내가 만든 것인지 확인하는 법은 SECURITY.md에 명령까지 적어 뒀어요.

(C) 소스에서 빌드

사전 준비: Rust, Node.js(20.19+ 또는 22.12+ — Vite 7 요구), macOS.

git clone https://github.com/dinggi5/kura.git
cd kura
git checkout v0.5.2   # 배포본과 같은 소스. 빼면 개발 중인 최신 코드가 받아져요
npm ci                # package-lock.json 그대로 설치 (install 은 버전이 올라갈 수 있어요)

# 개발 모드로 바로 실행
npm run tauri dev

# 앱으로 빌드해 /Applications에 설치
npm run tauri build -- --bundles app --no-sign
ditto src-tauri/target/release/bundle/macos/Kura.app /Applications/Kura.app
open /Applications/Kura.app

업데이트

앱이 스스로 업데이트해요.
설정 → 정보에서 버전과 바뀐 내용을 확인하고 지금 설치하고 다시 시작을 누르세요.

  • 확인만 자동이고 설치는 항상 직접 눌러야 해요.

  • 받은 파일은 서명이 맞는지 검사한 뒤에만 설치돼요(서명 검증은 끌 수 없어요). 자세한 건 SECURITY.md의 "업데이트" 절에 적어 뒀어요.

  • 자동 업데이트 확인 통신이 싫으면 설정 → 정보 → 시작할 때 확인을 끄세요.

지우기

⚠️ 앱을 지워도 지갑은 지워지지 않아요. 키·설정·거래 내역은 앱 바깥의 ~/.jigap 폴더에 있어서, 앱만 지우면 그대로 남아요 — 실수로 자산을 날리지 않게 일부러 그렇게 뒀어요(brew uninstall --zap으로도 안 지워요).

# 앱만 제거 (지갑은 남음 — 나중에 다시 설치하면 그대로 이어서 써요)
brew uninstall --cask dinggi5/tap/kura   # 또는 /Applications/Kura.app 을 휴지통으로

이 맥에서 지갑까지 완전히 지우려면, 순서를 꼭 지키세요:

  1. 12단어 복구 문구가 손에 있는지 먼저 확인하세요. 앱의 헤더 열쇠 버튼에서 다시 볼 수 있어요.

  2. 잔액이 남아 있다면 다른 지갑으로 옮기세요.

  3. Kura를 완전히 종료하세요 (메뉴바 아이콘 우클릭 → 종료). 켜져 있으면 몇 초마다 ~/.jigap에 상태 파일을 쓰기 때문에, 지운 폴더가 곧바로 다시 생겨요.

  4. Kura MCP를 붙여 둔 AI 도구(Claude Code 등)도 종료하세요.

  5. 자동 시작을 켜 뒀다면 꺼 두거나 rm ~/Library/LaunchAgents/Kura.plist (앱을 휴지통으로 지우면 이 파일은 남아요. brew uninstall --cask 로 지우면 같이 내려가요).

  6. 그다음에 rm -rf ~/.jigap

12단어 없이 마지막 rm -rf ~/.jigap 를 하면 그 지갑의 자산은 누구도 되찾을 수 없어요.


첫 실행

Kura는 메뉴바에 살아요. 실행하면 화면 위쪽 메뉴바에 열쇠구멍 아이콘(◉)이 생기고, 창은 그 아이콘을 눌렀을 때만 아래로 펼쳐져요. 다른 곳을 클릭하면 닫히고, 앱은 백그라운드에 남아 AI 결제 요청을 계속 기다려요. 내역·설정을 넓게 보고 싶으면 아이콘 우클릭 → 창으로 열기(또는 펼친 창 오른쪽 위 ⤢)로 보통 창을 띄울 수 있어요 — 결제 승인은 그때도 메뉴바 창에서 받아요. 완전히 끄려면 아이콘을 우클릭 → 종료. (지갑이 아직 없는 첫 실행에는 창이 저절로 열려요.)

  1. 지갑 만들기 — 송금할 때마다 입력할 비밀번호(8자 이상)를 정해요. 이 비번으로 키가 암호화돼 저장돼요(~/.jigap/wallet.enc).

  2. 시드 백업 — 12개 단어가 나와요. 이게 자산의 진짜 소유 증명이라 종이나 비밀번호 관리자에 적어두세요. 비밀번호를 잊어도 12단어만 있으면 되찾을 수 있어요: 앱을 종료하고 12단어가 손에 있는지 먼저 확인한 뒤, ~/.jigap/wallet.enc를 지우고 앱을 다시 실행하면 첫 화면의 가져오기로 복구돼요(다른 표준 BIP-39 지갑에 넣어도 돼요). 단, 12단어 없이 이 파일을 지우면 자산을 영영 잃어요.

  3. 환영 투어 — 충전·안전장치를 짚어 주고, 중간에 「Claude와 연결할까요?」 를 한 번 물어요. 이 맥에서 찾은 Claude(데스크톱·Code)와 로그인 시 자동 시작을 「연결하기」 한 번에 끝내요. 헤더의 ⓘ 도움말에서 언제든 다시 볼 수 있어요.


돈 채우기 (USDC)

결제하려면 지갑에 USDC(디지털 달러)가 있어야 해요.

  • 앱에서 받기를 누르면 주소와 QR이 나와요.

  • 거래소·다른 지갑에서 보낼 땐 받기 화면에 적힌 네트워크(Base 또는 Arc)를 그대로 고르세요. 다른 네트워크로 보내면 자금을 잃어요.

  • 메인넷(기본) 은 실제 돈이에요 — 운영 예산만 소액 충전하세요. 먼저 연습하고 싶으면 설정에서 테스트넷으로 바꾸면 받기 화면의 Faucet 버튼으로 공짜 테스트 코인을 받을 수 있어요.

  • Base에선 ETH가 선택이에요 — x402 결제는 수수료를 페이실리테이터가 대신 내서 ETH가 0이어도 돼요. 앱의 보내기로 직접 송금할 때만 가스용 ETH가 조금 필요해요(1센트 안팎).

  • Arc에선 USDC 하나면 돼요 — 가스도 USDC라, 송금이든 x402 결제든 수수료가 USDC 잔액에서 나가요.


AI(Claude) 연결하기

한 번 연결하면 끝이에요. MCP 엔 늘 켜져 있는 연결이 따로 없어요 — Claude 를 켤 때 Claude 가 Kura 를 띄워요. 그래서 한 번 등록해 두면 다시 누를 일이 없고, Kura 가 꺼져 있어도 결제를 요청할 때 Claude 가 깨워요. 앱 안에 MCP 서버가 들어 있어서 소스 클론이나 Rust 설치 없이 연결할 수 있어요.

메인 화면 위쪽 배지가 지금 상태를 말해요:

  • Claude 쓰는 중 — Claude 가 지금 이 지갑을 물고 있어요.

  • 준비됨 · Claude를 켜면 자동으로 붙어요 — 연결은 끝나 있어요. 할 일 없음.

  • AI 연결 필요 — 아직 연결 전이에요. 이때만 눌러서 연결하면 돼요.

앱을 옮기거나 업데이트해서 Claude Code 등록이 옛 경로를 가리키면, Kura 가 켤 때 알아서 지금 앱으로 고쳐요(등록이 아예 없으면 새로 만들진 않아요 — 처음 한 번은 직접 고르세요).

제일 쉬운 길 — 앱 안 "AI 연결" 화면

첫 실행 투어에서 건너뛰었다면, 메인 화면 위쪽의 "AI 연결 필요" 배지를 누르면 연결 화면이 열려요.

  • Claude 데스크톱 — "연결" 버튼을 누르면 Claude에 확장 설치 창이 떠요. '설치'만 누르면 끝.

  • Claude Code — 버튼 한 번으로 등록돼요(claude mcp add를 앱이 대신 실행). 다음 claude 실행부터 어느 폴더에서든 연결돼요.

아래는 같은 일을 손으로 하는 방법이에요.

Claude 데스크톱 — 확장 파일 하나로 끝

릴리스 페이지에서 kura-<버전>.mcpb를 받아 더블클릭하면 Claude 데스크톱이 설치를 물어봐요. (또는 Claude 설정 → 확장 → 파일 선택.)

확장 안에는 실행 파일이 없어요 — 설치된 Kura.app 안의 서명·공증된 MCP 서버를 서명 확인 후 실행하는 런처만 들어 있어요. 그래서 Kura 앱을 먼저 설치해야 해요.

Claude Code · 다른 MCP 앱

앱 안의 바이너리를 절대경로로 등록하면 돼요:

claude mcp add --scope user kura -- /Applications/Kura.app/Contents/MacOS/kura-mcp

(--scope user는 "이 폴더만"이 아니라 어디서든 쓰이게 하는 옵션이에요. 한 프로젝트에서만 쓸 거면 빼도 돼요.)

다른 MCP 앱은 설정에 아래처럼 적어요:

{
  "mcpServers": {
    "kura": {
      "command": "/Applications/Kura.app/Contents/MacOS/kura-mcp"
    }
  }
}

소스에서 개발 중이라면

리포 루트의 .mcp.json이 이미 들어 있어요. 이 폴더에서 claude를 실행하면 자동으로 잡혀요(처음엔 서버를 쓸지 묻는데 승인하면 돼요). 여기 적힌 mcpb/server/kura-mcp는 설치된 Kura.app의 서명을 확인하고 그 안의 MCP 서버를 실행하는 런처예요 — 배포본이 쓰는 것과 같은 파일이라, 앱만 설치돼 있으면 빌드 없이 바로 붙어요.

kura-mcp 소스를 고치는 중이라면 그 변경은 설치된 앱에 없으니, .mcp.json을 잠깐 이렇게 바꿔서 쓰세요 — 대신 target/이 비어 있으면 첫 빌드에 30초 넘게 걸려 AI 앱이 연결을 포기할 수 있어요(그땐 cargo build를 먼저 한 번 돌리고 AI 앱을 재시작하세요).

{ "mcpServers": { "kura": { "command": "cargo", "args": ["run", "--quiet", "--manifest-path", "./kura-mcp/Cargo.toml"] } } }

AI가 쓸 수 있는 도구: get_wallet_status · get_balances · get_history(읽기 전용) · request_payment(결제 요청 → 앱 승인 팝업) · x402_fetch(402 결제가 걸린 URL·API 호출 — GET 또는 POST 등 + JSON body, 이미지 같은 파일 응답은 저장) · x402_resubmit(지갑이 직접 올린 결제의 증거를 다시 내기 — 새 결제 없음) · lookup_agent(ERC-8004 에이전트 신원 조회 — 온체인 읽기 전용).

MCP 도구를 바꾸면 AI 앱을 재시작해야 반영돼요(서버가 세션 시작 때 1회 로드).


Kura로 이런 일을 할 수 있어요

x402로 값을 받는 서비스라면, AI가 Kura로 건마다 결제하고 결과를 받아와요. 가입·API 키 없이 쓸 수 있는 곳이 많아요. 아래 서비스 이름은 예시예요 — 값·네트워크·주소는 서비스마다 다르고 바뀔 수 있으니 각 서비스 문서를 확인하세요. Base 메인넷 USDC로 받는 곳이 많아요.

  • 자료 찾기 — 예: Exa. AI가 POST https://api.exa.ai/search에 {"query": "…"} 같은 JSON을 보내고, 402가 오면 검색 한 번 값을 승인받아 같은 질문을 그대로 다시 보내요.

  • 이미지 만들기 — 예: AiSpace. 이미지 생성 요청을 결제하고, 받은 이미지는 ~/Downloads/Kura/에 파일로 저장돼요(저장 경로는 결과의 saved_file). 3MB 이하 PNG·JPEG·GIF·WebP는 AI에게 이미지로도 바로 붙어요.

"Exa로 x402 최신 자료 5개 찾아줘"           → x402_fetch(url, method:"POST", body:{query, numResults:5})
"AiSpace로 바닷가 고양이 그림 만들어줘"     → x402_fetch(판매처 문서의 주소, method:"POST", body:{prompt…})

결제 헤더를 실은 재요청은 첫 요청과 같은 method·헤더·body로 나가요(승인한 결제와 다른 걸 사지 않게). 결제 헤더가 붙은 요청은 리다이렉트를 따라가지 않아요. method·헤더·body를 준 요청은 첫 요청부터 리다이렉트를 따라가지 않고, 옮겨 간 주소를 알려 줘요.


결제는 이렇게 흘러가요

  1. AI가 결제를 요청해요.

  2. Kura 창이 떠서 얼마를, 어디로 보내는지 보여줘요(창이 숨어 있어도 자동으로 떠요).

  3. 비밀번호를 넣고 승인해요.

  4. 결제가 실행되고 결과가 AI에게 돌아가요. 5분 안에 승인 안 하면 자동 거부.

체인에 올라갔는지 바로 확인이 안 되면 내역에 확인 필요로 남아요. 앱이 체인에서 다시 확인해 보냄이나 되돌려짐(돈은 안 나가고 수수료만)으로 바꿔 줘요. AI에게도 이런 결제는 스스로 다시 하지 말고 사람에게 알리라고 일러 둬요.


보안 모델

  • 비밀번호 승인 — 기본값은 매 결제마다 비밀번호 승인이에요(자율 결제를 켜면 아래 조건에서만 예외). 키는 암호화(Argon2id + AES-256-GCM)돼 저장되고, 결제할 때만 복호화해 바로 지워요(자율 결제 세션을 켜면 잠금 해제 동안에만 메모리에 보관).

  • 한도 — 한 번에 / 하루에 얼마까지 보낼지 설정에서 정해요(기본 단일 5 · 일일 20 USDC). 넘으면 막혀요.

  • 긴급 잠금 — 헤더 방패 버튼을 켜면 모든 송금이 즉시 차단돼요.

  • 신뢰 주소 · 자율 결제 — 비번 없이 자동 승인하려면 세션 잠금 해제 + 소액 한도 + 신뢰 주소 셋 다 맞아야 해요. 그 외엔 항상 비번. 같은 곳에 같은 금액을 10분 안에 또 보내려 하면 자율 결제여도 사람에게 물어요.

  • 계정 여러 개 — 12단어 하나에서 계정을 여러 개 만들 수 있어요. AI는 지금 고른 계정만 보고, 계정을 바꾸는 건 앱에서 사람만 해요.

  • 거래 내역 — 받은 돈·보낸 송금·차단된 시도·서명을 전부 기록해요. 받은 돈은 앱이 RPC 에서 직접 찾아요(처음엔 90일 전까지). 결말이 불확실한 기록은 앱이 체인에서 다시 확인해 바로잡고, 되돌려지거나 만료돼 안 나간 돈은 같은 날이면 한도에서 돌려줘요.

  • 로컬 우선 — 키(~/.jigap/)는 리포 밖에 있고 git에 올라가지 않아요.

  • 분석·폰트 CDN 없음 — 앱이 스스로 인터넷에 연결하는 건 셋뿐이에요. ①잔액 조회·입금 찾기·송금에 쓰는 RPC 서버 ②AI가 요청한 x402 주소 ③업데이트 확인(깃허브). 사용 기록은 어디로도 보내지 않고, 글꼴도 앱 안에 들어 있어서 오프라인에서도 화면은 그대로 떠요.

  • 업데이트 확인은 끌 수 있어요 — 앱을 켤 때 깃허브에 새 버전이 있는지 물어봐요(그쪽엔 접속 IP와 현재 버전이 남아요). 설정 → 정보 → 시작할 때 확인에서 끄면 이 통신도 없어져요. 확인을 켜 두든 끄든 설치는 직접 눌러야 진행돼요 — 몰래 바뀌는 일은 없어요.


개발자용

CLI kura로도 같은 지갑을 다룰 수 있어요(MCP 서버와 코어 로직 공유). 설치된 앱에 이미 들어 있어서, PATH에 한 줄 걸면 바로 써요:

sudo mkdir -p /usr/local/bin
sudo ln -sf /Applications/Kura.app/Contents/MacOS/kura-cli /usr/local/bin/kura
kura status

소스에서 돌리려면:

cargo run --manifest-path ./kura-mcp/Cargo.toml --bin kura -- status
cargo run --manifest-path ./kura-mcp/Cargo.toml --bin kura -- balance
cargo run --manifest-path ./kura-mcp/Cargo.toml --bin kura -- history --limit 10
cargo run --manifest-path ./kura-mcp/Cargo.toml --bin kura -- pay <주소> <금액> --token usdc
cargo run --manifest-path ./kura-mcp/Cargo.toml --bin kura -- fetch <URL>

pay/fetch는 비번을 CLI로 받지 않아요 — Kura 앱이 떠 있어야 하고, 승인 팝업에서 사람이 비번을 넣어요.

테스트:

(cd src-tauri && cargo test)        # 백엔드(지갑·암호화·한도·송금)
(cd kura-mcp && cargo test)         # MCP/CLI 어댑터
npx tsc --noEmit && npx vite build  # 프론트

배포본(서명·공증된 DMG)을 만드는 절차는 docs/RELEASE.md 에 있어요. Apple Developer 계정과 1회 설정이 필요하고, 그다음부터는 한 줄이에요:

./scripts/release.sh

기술 스택

데스크톱

Tauri (Rust + 웹 프론트)

프론트

React + Tailwind CSS, Framer Motion, Lucide, Pretendard

체인

Base · Arc / alloy-rs

결제

x402 (EIP-3009 서명 — Base 는 페이실리테이터가 정산, Arc 는 지갑이 직접 제출)

AI 연결

MCP 서버 (rmcp)

구조: [Rust 코어(src-tauri)] ← MCP / CLI 어댑터(kura-mcp). 키 접근(서명)은 GUI 프로세스만 — 그게 최종 방어선이에요.

언어

앱은 한국어·영어 두 벌이에요. 설정 → 앱 → 언어에서 고르고, 고른 적 없으면 macOS 시스템 언어를 따라가요. 고르면 창이 그 언어로 다시 열려요.

CLI(kura)도 같은 설정을 따라가요 — 한 번만 다르게 쓰려면 KURA_LANG=en.

MCP 서버는 일부러 영어 한 벌이에요. 그 글을 읽는 건 사람이 아니라 모델이고(에이전트는 당신 언어로 답해요), 도구 설명이 컴파일 타임 상수라 런타임 전환이 안 돼요.


라이선스 · 상태

MIT 라이선스 — 열쇠와 돈을 다루는 코드라, 직접 읽고 검증하고 고쳐 쓸 수 있어야 한다고 봐요.

취약점을 발견하셨다면 이슈로 올리기 전에 SECURITY.md 의 비공개 경로로 알려주세요. 같은 문서에 Kura가 막지 못하는 것도 적어뒀어요.

함께 담긴 Pretendard 글꼴은 SIL Open Font License 1.1이에요(전문).

1순위 사용자는 본인 — Apple Silicon Mac에서 로컬 LLM/Claude로 결제하는 한국 개발자·창작자를 위한 지갑이에요. 아직 초기 버전이라, 메인넷에는 잃어도 되는 만큼만 넣으시고 — 익숙하지 않으면 설정에서 테스트넷으로 바꿔 먼저 연습해 보세요.

Available Tools

7 tools
get_balancesBalancesA
Read-only

Reads the active account's USDC (for payments) and gas-token balances on the active network (Base mainnet, Arc mainnet, Base Sepolia, or Arc testnet, per the user's setting). The eth field is the gas balance and is ABSENT on chains where gas is paid in USDC itself (Arc) — there the USDC balance already covers gas, so never add the two together. Errors if there is no wallet.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered; the description goes further by disclosing the no-wallet error case and a critical cross-field caveat (the `eth` gas field is absent on Arc and must never be added to the USDC balance). It does not cover rate limits or refresh/freshness behavior, so it stops short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core read action, followed by the field caveat and the error case. The parenthetical enumeration of the four networks is slightly heavy but genuinely useful since it defines the valid scope; nearly every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and no output schema, the description carries the burden of explaining the return shape, and it does so reasonably: it names the two balance types, flags the missing `eth` field per chain, and states the error case. Minor gap is freshness/caching and what happens across multiple networks at once.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. The description's field-level discussion (USDC vs `eth` gas balance and their relationship on Arc) concerns returned values rather than inputs, but it does add interpretive value that the empty schema cannot.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Reads') and resource (USDC and gas-token balances) for the active account, and pins the scope to the active network with named chains. An agent can immediately distinguish this from get_wallet_status or get_history without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the purpose but never stated as when-to-use or when-not-to-use, and no sibling tool is named as an alternative. The only routing signal is the failure condition ('Errors if there is no wallet'), which is a precondition rather than guidance on choosing this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_historyHistoryA
Read-only

Returns the active account's recent transaction attempts, newest first. status is one of sent, blocked, failed, signed (x402 signed, awaiting settlement), settled (x402 settled, settle_tx is the settlement tx), settle_failed, unknown (a signed transaction was submitted but the wallet couldn't confirm the chain received it — detail is its tx hash; it may have gone through, so never resend on the strength of this entry alone; the wallet app later rechecks it on-chain and turns it into sent or reverted), reverted (mined but reverted on-chain — no money moved, only gas), expired (an x402 signature that was never used before it expired — no money moved), or received (money that came in — to is the sender, detail the tx hash; both are empty for ETH a contract sent; found on-chain by the wallet app while it runs, back to 90 days). Use limit to cap how many come back (default 20).

NameRequiredDescriptionDefault
limitNoHow many recent entries to return (default 20, max 200).

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint and openWorldHint; the description carries substantial extra behavior: per-status meaning, which statuses mean no money moved (reverted, expired), that 'unknown' may have gone through and the wallet rechecks it on-chain, that 'received' comes from an app-driven on-chain scan back to 90 days. This is exactly the context annotations cannot supply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded and every clause carries information — the status enumeration is necessary because there is no output schema. It loses a point because the status glossary is delivered as one very dense run-on sentence rather than a scannable list.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and only one optional parameter, the description fully covers what the agent needs: return ordering, default limit, and the complete semantics of every status value including financial and safety implications. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single 'limit' parameter, so the schema already documents default 20 and max 200; the description only restates the default. Baseline 3 applies since the schema does the heavy lifting and the description adds no new parameter syntax.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Returns the active account's recent transaction attempts, newest first' — including scope (active account) and ordering. The resource is unmistakably distinct from siblings like get_balances and get_wallet_status, so an agent can route without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the resource and by the embedded warning 'never resend on the strength of this entry alone', which quietly steers the agent away from acting on 'unknown' entries via x402_resubmit. However, it never explicitly says when to call this versus alternatives, nor states prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_wallet_statusWallet statusA
Read-only

Returns the wallet's state and address. state is encrypted (normal), legacy, or none. address is the ACTIVE account's address; accounts lists every account in the wallet (index, address, label) and account is the active index. Balances, history, and payment requests all use the active account, and only the user can switch accounts, in the wallet app. No password needed — read only.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description goes well beyond them: it enumerates the state values (encrypted/legacy/none), clarifies that address is the ACTIVE account while accounts lists all accounts, and discloses that only the user can switch accounts in the wallet app. It also reassures no password is needed, which is actionable auth context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then structured field-by-field. Every sentence carries information, though the trailing 'No password needed — read only' partially restates the readOnlyHint annotation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With zero parameters, no output schema, and annotations covering safety, the description supplies exactly the missing pieces: what fields come back, what the state values mean, and how the active-account concept relates to sibling tools. Nothing an agent needs to call this correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. The description additionally documents the shape of the returned object (index, address, label, active index), which is useful given no output schema exists, though these are return values rather than input semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Returns the wallet's state and address') and enumerates the exact fields returned (state, address, accounts, account). The sibling set (get_balances, get_history, request_payment) is clearly distinct, and the description anchors its scope to the active account rather than those other resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: it explains that balances, history, and payment requests all key off the active account, which tells the agent why it might call this first, but it never explicitly says when to use this tool versus get_balances/get_history, nor names an alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookup_agentLook up an agent (ERC-8004)A
Read-only

Reads an agent's ERC-8004 record from the registry on the active network (read-only, on-chain only — the wallet never fetches the agent's website). Give it agent_id, the agent's number in the Identity Registry. Returns: registered, owner, wallet (the registered agentWallet), token_uri and the uri_domain read from it, declared_name (what the record calls itself), and feedback_clients (how many addresses left feedback). Pass pay_to and/or resource to also get a comparison: whether the address equals the registered wallet and whether the resource's domain equals the domain listed on-chain. IMPORTANT: registration is permissionless — anyone can register any name, domain, or wallet, and anyone can leave feedback. Being registered is NOT proof of safety. Only a mismatch is a strong signal, and only when the agent number came from a source you trust (the service's own docs), not from the payment response itself.

NameRequiredDescriptionDefault
pay_toNoOptional: an address to compare against the agent's registered wallet.
agent_idYesThe agent's ERC-8004 number (agentId — the Identity Registry NFT token id).
resourceNoOptional: a resource URL whose domain is compared with the domain listed on-chain.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, and the description goes well beyond them: it discloses that nothing is fetched off-chain, that registration is permissionless, and that being registered is not evidence of safety. This is exactly the kind of adversarial-context caveat an agent needs before treating the result as a trust signal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action, then the return fields, then the comparison behavior, then the safety caveat. The enumerated return list is long but every item earns its place given there is no output schema. Slightly dense, but no filler sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully enumerates the returned fields (registered, owner, wallet, token_uri, uri_domain, declared_name, feedback_clients) plus the conditional comparison outputs. For a read-only lookup with three parameters, nothing an agent needs to call or interpret it is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds real semantics: agent_id is the number in the Identity Registry, and pay_to/resource exist specifically to produce address and domain comparisons. That comparison behavior is not derivable from the terse schema property descriptions alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: reads an agent's ERC-8004 record from the on-chain registry on the active network. It immediately scopes what the tool does not reach ("the wallet never fetches the agent's website"), which separates it cleanly from the payment/wallet siblings. An agent can tell what this returns without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete invocation guidance (supply agent_id; optionally pass pay_to and/or resource to trigger a comparison) and states the condition under which the result is trustworthy (mismatch only matters when the agent number came from a source you trust). No sibling alternative is named, but the siblings are unrelated domains so the omission is minor. Clear context without explicit when-not-to-call routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

request_paymentRequest a paymentA
Destructive

Asks the user to make a payment. The wallet app opens an approval window, and the payment is only sent once the user approves it with their password (it waits up to 5 minutes). The one exception is autopay, which the user turns on themselves — only then can a payment be approved automatically, and only within an unlocked session, a small limit, and a trusted address. Arguments: to (recipient address), amount (decimal string), token (USDC by default, or ETH), memo (what the payment is for — the user reads it to decide, so always fill it in), and optionally agent_id (the recipient's ERC-8004 number, if a service told you one — the wallet then shows the user whether the address matches that agent's registered wallet). Per-payment and daily limits and the emergency lock are enforced by the app. Never send a password as an argument — the user types it in the app. Returns: status, tx_hash, detail, and an explorer link. status is approved (the chain accepted the transfer), rejected or failed (nothing was sent — safe to ask again), or unknown: the user approved but the wallet couldn't confirm whether the transfer reached the chain (tx_hash is set when known). unknown means it MAY have been sent — never ask again on your own; tell the user and have them check the history or the tx.

NameRequiredDescriptionDefault
toYesRecipient address (42 characters, starting with 0x).
memoNoWhat the payment is for — the user reads this in the approval window, so fill it in.
tokenNoToken: "USDC" (default) or "ETH".
amountYesAmount as a decimal string, for example "1.5".
agent_idNoOptional: the recipient's ERC-8004 agent number, if you know it from the service's own documentation or agent card. The wallet reads that agent's on-chain record and tells the user whether the address you are paying is the one registered for that agent. A mismatch is the useful part — a match is not proof of anything, since anyone can register. Leave it out if you don't know it; a wrong number just produces a "no such agent" note.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds far more: a 5-minute approval timeout, password-entry-only-in-app, app-enforced per-payment/daily limits and emergency lock, autopay preconditions (unlocked session, small limit, trusted address), and the semantics of approved/rejected/failed/unknown including the no-retry rule on unknown. That is exactly the behavioral disclosure a payment tool needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then arguments, then return semantics in a logical order. It is long, but the length is justified by the absence of an output schema and the high stakes of an irreversible transfer; each section earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully documents the return contract (status, tx_hash, detail, explorer link) and the three status branches, plus the critical unknown-may-have-been-sent caveat. Nothing needed to invoke or handle the result is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds operative meaning beyond the schema: 'USDC by default', the instruction to always fill in memo because the user reads it, and a caution that agent_id mismatch is the useful signal while a match proves nothing. It largely restates the schema fields, but the added rationale has real value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Asks the user to make a payment') and immediately distinguishes it from read-only siblings like get_balances/get_history by describing the approval-window flow. An agent can tell this is the mutating spend path without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use and when-not-to-act guidance: the approval window is the normal path, autopay is the only auto-approval exception and only under user-enabled conditions, and on 'unknown' the agent must never retry on its own but hand off to the user. This is actionable routing logic, not vague context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

x402_fetchFetch a paid URL (x402)A
Destructive

Calls an x402 paid API or URL. It sends the request first — GET by default, or the given method (POST, PUT, PATCH, DELETE) with optional headers and a JSON object body; if the server answers 402 Payment Required, it asks the user to approve the required payment (exact scheme, the active network, that chain's USDC) in the wallet app, then sends the SAME request (same method, headers and body) again with the payment header and returns the content. If no payment is required (no 402), it just returns the response. Redirects are not followed once a payment header is attached (nor at all when method, headers or body are given) — a redirect comes back as an error with the new address. Text and JSON come back in body. Binary responses (images, PDF, audio) are saved to a file whose path is in saved_file (with content_type); a PNG/JPEG/GIF/WebP image up to 3 MB is also attached as an image. Text longer than 100,000 characters is cut in body and kept whole in saved_file. If saving takes too long (macOS asking for Downloads access), the result comes back first and saving_file names where the file will appear. Settlement takes one of two shapes, chosen by the server's requirement: a facilitator settles the signed EIP-3009 authorization (no gas from this wallet), or — where gas is paid in USDC itself and the server asks for eip3009-client-broadcast — the wallet broadcasts the transfer itself, so the price AND its gas leave this balance. Approval works exactly as in request_payment (password by default; automatic only when the user has turned autopay on), and the app enforces per-payment and daily limits and the emergency lock. Never send a password as an argument. Arguments: url (required), method, headers, body (JSON object), memo (what the payment is for — the user reads it to decide), agent_id. Returns: payment, paid, status, http_status, body, and amount/pay_to/settlement when paid; on a chain where the wallet broadcasts the payment itself, tx and explorer point at that transaction (both are empty on the facilitator-settled path, where settlement_tx/settlement_explorer carry the transaction the seller reports in its receipt — the seller's word, not checked on-chain by the wallet). IMPORTANT — decide on payment, which says where the money is: "none" = nothing was paid, trying again is safe (declined, no 402, or "reverted": the chain rejected the transfer and only gas was spent); "confirmed" = the money left the wallet; "unknown" = it MAY have left (status pending/unknown, or settlement_failed on the facilitator path, where the server's refusal doesn't prove the facilitator didn't settle). For confirmed and unknown without content, asking again can pay a second time — stop and tell the user, showing the tx (when a tx came back without content, x402_resubmit re-sends its proof without paying again). paid is kept for older callers and is simply payment != "none". Read notice when present, and never retry on an HTTP status alone: after the money moved the server may answer with a fresh 402 challenge that reads as if the payment never happened.

NameRequiredDescriptionDefault
urlYesURL of the paid resource to fetch (http/https).
bodyNoJSON object sent as the request body (not allowed with GET). Content-Type defaults to application/json. The paid retry sends exactly the same body.
memoNoWhat the payment is for — the user reads this in the approval window, so fill it in.
methodNoHTTP method: GET (default), POST, PUT, PATCH or DELETE. Many paid APIs (search, image generation) take POST with a JSON body. The paid retry uses the same method.
headersNoExtra request headers as a JSON object of name → value. Payment headers, Host, Content-Length and connection headers are set by the wallet and are refused here. The paid retry sends the same headers.
agent_idNoOptional: the seller's ERC-8004 agent number, if you know it from the service's own documentation or agent card. The wallet then reads that agent's on-chain record and shows the user whether the payment address and the resource domain match what is registered. Leave it out if you don't know it — a wrong number just produces a "no such agent" note.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say destructive/openWorld/non-idempotent, while the description discloses far more: the retry-safety semantics of the `payment` field ('none'/'confirmed'/'unknown'), the double-payment hazard, facilitator vs eip3009-client-broadcast gas behavior, redirect handling under a payment header, the 100k truncation and saved_file behavior, and the warning never to retry on HTTP status alone. This is exactly the value-beyond-annotations the dimension rewards, and the destructiveHint is consistent with money leaving the wallet.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The basic request flow is front-loaded before the settlement and retry-safety detail, and nearly every sentence carries operational or safety weight. It is nevertheless very long for a single tool, with some density that could be tightened, so it stops short of a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the full burden of explaining returns — and it does: payment/paid/status/http_status/body/amount/pay_to/settlement, tx/explorer vs settlement_tx, and notice. For a 6-param destructive payment tool, an agent has everything needed to call it and interpret the result safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains memo is what the user reads to decide, agent_id drives an on-chain ERC-8004 verification note, and it warns never to pass a password as an argument. These are semantic additions beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence gives a specific verb and resource ('Calls an x402 paid API or URL') and the whole description keeps the scope tight around paid HTTP fetching. It distinguishes itself from request_payment by reference ('Approval works exactly as in request_payment') and from x402_resubmit by naming it as the no-pay-again path. An agent can separate it from every sibling without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly states the triggering condition (server answers 402 → user approval → same request resent), when the tool is a plain fetch (no 402), and routes to x402_resubmit when a tx came back without content. It does not give an explicit 'prefer X over request_payment when...' decision rule, but the surrounding context is strong enough to infer usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

x402_resubmitResubmit an x402 payment proofA
Idempotent

Resubmits the on-chain proof of an x402 payment this wallet already broadcast itself, to get the content it paid for. Use it when x402_fetch returned a tx without content (status pending, unknown or undelivered, or settlement_failed with a tx). No new money moves and no approval is asked: the wallet re-sends the same proof (the tx plus the saved challenge values) to the same URL. It first checks the tx on-chain — if it isn't mined yet you get status pending (wait and call again), if it reverted you get reverted (payment none: nothing was paid, so paying again is a new decision). Sellers keep proofs acceptable only for a while (the reference server: 10 minutes), so a late resubmit can be refused — that is settlement_failed with a notice; do not pay again then, tell the user and show the tx. Proofs are kept for 7 days. Returns the same shape as x402_fetch.

NameRequiredDescriptionDefault
txYesThe `tx` that x402_fetch returned for a payment the wallet broadcast itself (status pending, unknown or undelivered, or settlement_failed with a tx).

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Far exceeds the annotations: it states no new money moves and no approval is requested, describes the on-chain pre-check and each resulting status (pending, reverted with payment none), and discloses the seller acceptance window (~10 minutes on the reference server) and 7-day proof retention. The idempotent/read-only nature is confirmed in prose rather than left to the hints alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first clause, followed by the usage trigger and then the behavioral detail. The length is justified by the number of distinct outcomes (pending, reverted, refused) that the agent must handle correctly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although there is no output schema, the description states the return shape matches x402_fetch and enumerates every status the caller may encounter along with the correct reaction to each. Nothing an agent needs to invoke or interpret this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: the tx must be one the wallet broadcast itself and is re-sent together with the saved challenge values to the same URL. That provenance and pairing context goes beyond the schema's bare field description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (resubmits the on-chain proof of an x402 payment this wallet already broadcast) plus the goal (to get the content it paid for). It also distinguishes itself from the sibling x402_fetch by explicitly framing itself as the follow-up for a tx that came back without content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the trigger condition: 'Use it when x402_fetch returned a `tx` without content (status pending, unknown or undelivered, or settlement_failed with a tx).' It also names the alternative (x402_fetch) and warns against paying again in the settlement_failed/refused cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev0.5.0
    • Changedx402_fetch3 fields changed
      • addedInput schema / properties / body
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "JSON object sent as the request body (not allowed with GET). Content-Type defaults to\napplication/json. The paid retry sends exactly the same body.",
        +  "type": "object"
        +}
      • addedInput schema / properties / headers
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "Extra request headers as a JSON object of name → value. Payment headers, Host,\nContent-Length and connection headers are set by the wallet and are refused here.\nThe paid retry sends the same headers.",
        +  "type": "object"
        +}
      • addedInput schema / properties / method
        Added value: +{
        +  "description": "HTTP method: GET (default), POST, PUT, PATCH or DELETE. Many paid APIs (search, image\ngeneration) take POST with a JSON body. The paid retry uses the same method.",
        +  "type": "string"
        +}
  2. 1 tool updatev0.4.3
    • Addedx402_resubmit
  3. 4 tool updatesv0.4.1
    • Changedget_history2 fields changed
      • removedInput schema / properties / limit / default
        Removed value: -null
      • removedInput schema / properties / limit / nullable
        Removed value: -true
    • Changedlookup_agent4 fields changed
      • removedInput schema / properties / pay_to / default
        Removed value: -null
      • removedInput schema / properties / pay_to / nullable
        Removed value: -true
      • removedInput schema / properties / resource / default
        Removed value: -null
      • removedInput schema / properties / resource / nullable
        Removed value: -true
    • Changedrequest_payment6 fields changed
      • removedInput schema / properties / agent_id / default
        Removed value: -null
      • removedInput schema / properties / agent_id / nullable
        Removed value: -true
      • removedInput schema / properties / memo / default
        Removed value: -null
      • removedInput schema / properties / memo / nullable
        Removed value: -true
      • removedInput schema / properties / token / default
        Removed value: -null
      • removedInput schema / properties / token / nullable
        Removed value: -true
    • Changedx402_fetch4 fields changed
      • removedInput schema / properties / agent_id / default
        Removed value: -null
      • removedInput schema / properties / agent_id / nullable
        Removed value: -true
      • removedInput schema / properties / memo / default
        Removed value: -null
      • removedInput schema / properties / memo / nullable
        Removed value: -true
  4. 1 tool updatev0.4.0
    • Changedrequest_payment1 field changed
      • addedInput schema / properties / agent_id
        Added value: +{
        +  "default": null,
        +  "description": "Optional: the recipient's ERC-8004 agent number, if you know it from the service's own\ndocumentation or agent card. The wallet reads that agent's on-chain record and tells the\nuser whether the address you are paying is the one registered for that agent. A mismatch\nis the useful part — a match is not proof of anything, since anyone can register.\nLeave it out if you don't know it; a wrong number just produces a \"no such agent\" note.",
        +  "format": "uint64",
        +  "minimum": 0,
        +  "nullable": true,
        +  "type": "integer"
        +}
  5. 2 tool updatesv0.3.0
    • Addedlookup_agent
    • Changedx402_fetch1 field changed
      • addedInput schema / properties / agent_id
        Added value: +{
        +  "default": null,
        +  "description": "Optional: the seller's ERC-8004 agent number, if you know it from the service's own\ndocumentation or agent card. The wallet then reads that agent's on-chain record and shows\nthe user whether the payment address and the resource domain match what is registered.\nLeave it out if you don't know it — a wrong number just produces a \"no such agent\" note.",
        +  "format": "uint64",
        +  "minimum": 0,
        +  "nullable": true,
        +  "type": "integer"
        +}
  6. 5 tool updatesv0.2.0
    • First observedget_balances
    • First observedget_history
    • First observedget_wallet_status
    • First observedrequest_payment
    • First observedx402_fetch

TDQS

A4.3/5.0

Scored across 7 tools

Disambiguation4/5

Most tools are clearly distinct (request_payment, get_wallet_status, get_balances, get_history, lookup_agent). The only partial overlaps are request_payment vs x402_fetch (both trigger payments) and x402_fetch vs x402_resubmit, though the descriptions clearly delineate direct transfer vs paid API call vs proof resubmission without new money.

Naming Consistency4/5

Consistent snake_case verb_noun pattern (request_payment, get_wallet_status, get_balances, get_history, lookup_agent), with x402_fetch and x402_resubmit using a coherent namespace prefix. Minor deviation from pure verb_noun but overall predictable.

Tool Count5/5

7 tools is well-scoped for a wallet/payment server, with each tool earning its place. No redundant or filler tools.

Completeness4/5

Covers the core wallet lifecycle: payments, status/accounts, balances, history, x402 paid fetches with resubmission, and agent registry lookup. Minor gaps like account-switching (explicitly user-only) or explicit cancellation are reasonable omissions, but no major workflow dead ends.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Gives AI agents a smart-contract wallet on Base (USDC) with 10 stdio tools: create wallets, send USDC payments, pay x402-protected HTTP resources, and run ERC-8183 escrow Jobs for A2A service delivery.
    10
    13 npm
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    A budget-bound x402 payment wallet for AI agents: it autonomously pays HTTP 402 payment-gated URLs across every major chain (EVM, Solana, and many non-EVM families). Self-custodial and backendless, your key, your RPC, with spend caps enforced before any on-chain send.
    8
    9
    MIT