Skip to main content
Glama

proofport-ai

ZKProofport를 위한 에이전트 네이티브 ZK 증명 인프라입니다. AWS Nitro Enclave 내에서 종단간 암호화(E2E)를 통해 영지식 증명을 생성하고 검증하는 독립형 서비스입니다. 서버는 블라인드 릴레이(blind relay) 역할을 하며 증명 입력값을 절대 볼 수 없습니다.

아키텍처

Client (AI Agent / SDK)
  │
  │  1. POST /api/v1/prove  →  402 { nonce, price, teePublicKey }
  │  2. Sign EIP-3009 USDC payment
  │  3. Encrypt inputs with TEE X25519 public key (ECIES)
  │  4. POST /api/v1/prove + X-Payment-TX + X-Payment-Nonce + encrypted_payload
  │
  ▼
┌─────────────────────────────────────┐
│  Node.js Server (port 4002)        │
│  ─ Verify USDC payment on-chain    │
│  ─ Blind relay: pass encrypted     │
│    payload to enclave via vsock     │
│  ─ Return proof + TEE attestation  │
└────────────┬────────────────────────┘
             │ vsock
             ▼
┌─────────────────────────────────────┐
│  AWS Nitro Enclave                  │
│  ─ X25519 key pair (bound to NSM)  │
│  ─ Decrypt inputs (AES-256-GCM)    │
│  ─ bb prove (Barretenberg CLI)     │
│  ─ NSM attestation of proof hash   │
└─────────────────────────────────────┘

주요 특징:

  • E2E 암호화 — X25519 ECDH + AES-256-GCM. nitro 모드에서는 일반 텍스트 입력이 거부됩니다.

  • 블라인드 릴레이 — Node.js 호스트는 증명 입력값을 읽을 수 없습니다. 오직 인클레이브(enclave)만이 복호화합니다.

  • x402 결제 — 단일 단계 흐름: 402 챌린지 → USDC 결제 → 증명 생성. 미들웨어가 없습니다.

  • 하드웨어 증명(Attestation) — NSM 증명 문서는 TEE 공개 키를 인클레이브 측정값(PCR)에 바인딩합니다.

Related MCP server: AgentStamp

디렉토리 구조

proofport-ai/
├── src/
│   ├── index.ts                  # Express server entry (port 4002)
│   ├── logger.ts                 # Pino logger
│   ├── swagger.ts                # OpenAPI spec
│   ├── tracing.ts                # OpenTelemetry tracing
│   ├── a2a/
│   │   ├── agentCard.ts          # /.well-known/agent.json, agent-card.json
│   │   ├── proofportExecutor.ts  # A2A task executor
│   │   └── redisTaskStore.ts     # Redis-backed task persistence
│   ├── chat/
│   │   ├── geminiClient.ts       # Gemini API client
│   │   ├── llmProvider.ts        # LLM provider interface
│   │   ├── multiProvider.ts      # Multi-provider routing
│   │   └── openaiClient.ts       # OpenAI API client
│   ├── circuit/
│   │   └── artifactManager.ts    # Circuit artifact download/cache
│   ├── config/
│   │   ├── index.ts              # Environment config
│   │   ├── circuits.ts           # Circuit metadata
│   │   └── contracts.ts          # Deployed contract addresses
│   ├── identity/
│   │   ├── agentAuth.ts          # Agent JWT authentication
│   │   ├── autoRegister.ts       # ERC-8004 auto-registration
│   │   ├── register.ts           # Identity registration
│   │   └── reputation.ts         # Reputation management
│   ├── input/
│   │   ├── attestationFetcher.ts # EAS GraphQL attestation fetch
│   │   ├── inputBuilder.ts       # Circuit input construction
│   │   └── merkleTree.ts         # Merkle tree builder
│   ├── mcp/
│   │   ├── server.ts             # StreamableHTTP MCP server
│   │   └── stdio.ts              # stdio MCP server (local use)
│   ├── payment/
│   │   └── freeTier.ts           # Payment mode config
│   ├── proof/
│   │   ├── proofRoutes.ts        # x402 single-step proof API
│   │   ├── guideBuilder.ts       # Dynamic proof generation guide
│   │   ├── paymentVerifier.ts    # On-chain USDC payment verification
│   │   ├── sessionManager.ts     # Proof session/nonce management
│   │   └── types.ts
│   ├── prover/
│   │   ├── bbProver.ts           # bb CLI direct prover
│   │   ├── tomlBuilder.ts        # Prover.toml builder
│   │   └── verifier.ts           # On-chain verification (ethers v6)
│   ├── redis/
│   │   ├── client.ts             # Redis client
│   │   ├── cleanupWorker.ts      # Expired data cleanup
│   │   ├── constants.ts          # Redis key prefixes
│   │   ├── proofCache.ts         # Proof result caching
│   │   ├── proofResultStore.ts   # Proof result persistence
│   │   └── rateLimiter.ts        # Rate limiting
│   ├── skills/
│   │   ├── skillHandler.ts       # Skill routing
│   │   └── flowGuidance.ts       # Step-by-step flow guidance
│   ├── tee/
│   │   ├── index.ts              # TEE mode config
│   │   ├── attestation.ts        # NSM attestation validation (COSE Sign1)
│   │   ├── detect.ts             # TEE environment detection
│   │   ├── enclaveBuilder.ts     # Enclave image builder
│   │   ├── enclaveClient.ts      # Nitro Enclave vsock client
│   │   ├── encryption.ts         # AES-256-GCM encryption utilities
│   │   ├── teeKeyExchange.ts     # X25519 ECDH key exchange
│   │   └── validationSubmitter.ts # TEE validation on-chain
│   └── types/
│       └── index.ts
├── packages/
│   ├── sdk/                      # @zkproofport-ai/sdk (npm)
│   └── mcp/                      # @zkproofport-ai/mcp (npm)
├── aws/
│   ├── enclave-server.ts         # TypeScript TEE prover (Nitro Enclave)
│   ├── Dockerfile.enclave        # Enclave image
│   ├── deploy-blue-green.sh      # Zero-downtime deployment
│   ├── boot-active-slot.sh       # Systemd boot script
│   ├── stop-active-slot.sh       # Systemd stop script
│   ├── build-enclave.sh          # Enclave build helper
│   ├── ec2-setup.sh              # EC2 instance setup
│   ├── Caddyfile                 # Reverse proxy config
│   ├── docker-compose.aws.yml    # AWS Docker Compose
│   ├── vsock-bridge.py           # vsock-to-TCP bridge
│   └── systemd/                  # Systemd service files
├── sign-page/                    # Next.js signing page (WalletConnect)
├── tests/
│   ├── e2e/                      # Full E2E tests (REST, MCP, A2A, proof, verify)
│   ├── a2a/                      # A2A unit tests
│   ├── identity/                 # ERC-8004 identity tests
│   ├── integration/              # Integration tests
│   ├── payment/                  # Payment tests
│   ├── tee/                      # TEE tests
│   └── *.test.ts                 # Unit tests
├── docker-compose.yml            # Local dev: server + redis
├── docker-compose.test.yml       # Test stack: + a2a-ui + Phoenix
├── Dockerfile                    # Node.js server image
└── README.md

빠른 시작

npm (개발)

npm install
npm run dev          # Hot reload with tsx
npm run build        # Build TypeScript
npm start            # Production
npm test             # Run tests
npm run test:e2e     # E2E tests against Docker stack

Docker Compose (로컬)

docker compose up --build     # Start redis + server
docker compose down           # Stop
docker compose down -v        # Reset data
  • 포트 4002: Node.js 서버

  • 포트 6380 (호스트) → 6379 (컨테이너): Redis

E2E 암호화 (블라인드 릴레이)

증명 입력값은 클라이언트와 Nitro Enclave 간에 종단간 암호화됩니다. Node.js 서버는 암호화된 블롭(blob)을 읽지 않고 전달만 합니다.

프로토콜: X25519 ECDH + AES-256-GCM (ECIES 패턴)

  1. TEE는 시작 시 X25519 키 쌍을 생성하고 공개 키를 NSM 증명에 바인딩합니다.

  2. 클라이언트는 402 응답에서 TEE 공개 키를 가져와 증명을 검증합니다.

  3. 클라이언트는 일회용 X25519 키 쌍을 생성하고, ECDH 공유 비밀을 계산하며, SHA-256을 통해 AES 키를 도출합니다.

  4. 클라이언트는 AES-256-GCM으로 입력값을 암호화하고 { ephemeralPublicKey, iv, ciphertext, authTag, keyId }를 전송합니다.

  5. 서버는 vsock을 통해 암호화된 봉투를 인클레이브로 전달합니다(블라인드 릴레이).

  6. 인클레이브는 복호화 후 증명을 생성하고, 증명 + NSM 증명 문서를 반환합니다.

강제 사항: nitro 모드에서는 일반 텍스트 입력 시 PLAINTEXT_REJECTED 오류가 발생합니다.

x402 결제 흐름

미들웨어나 세션이 없는 단일 단계 원자적 흐름:

POST /api/v1/prove { circuit, inputs }
  ↓
402 { nonce, price, payTo, teePublicKey }
  ↓
Client signs EIP-3009 TransferWithAuthorization (USDC)
  ↓
POST /api/v1/prove { circuit, encrypted_payload }
  + X-Payment-TX: <txHash>
  + X-Payment-Nonce: <nonce>
  ↓
200 { proof, publicInputs, proofWithInputs, attestation, timing, verification }

결제 모드:

모드

네트워크

효과

disabled

없음

모든 요청 무료

testnet

Base Sepolia

USDC 결제 필요 (테스트넷)

mainnet

Base Mainnet

USDC 결제 필요 (프로덕션)

REST 엔드포인트

엔드포인트

메서드

목적

/health

GET

상태 확인 + TEE 상태 + 결제 모드

/api/v1/prove

POST

x402 단일 단계 증명 생성

/api/v1/guide/:circuit

GET

동적 증명 생성 가이드 (JSON)

/mcp

POST

StreamableHTTP MCP 엔드포인트

/a2a

POST

A2A JSON-RPC 엔드포인트

/.well-known/agent.json

GET

OASF 에이전트 카드

/agent-card.json

GET

A2A 에이전트 카드

/.well-known/mcp.json

GET

MCP 검색

/docs

GET

Swagger UI

/openapi.json

GET

OpenAPI 사양

MCP 도구

/mcp (StreamableHTTP) 또는 로컬 @zkproofport-ai/mcp 패키지(stdio)를 통해 사용 가능:

도구

목적

generate_proof

올인원 증명 생성 (x402 결제 + E2E 암호화 자동 감지)

verify_proof

온체인 증명 검증

get_supported_circuits

사용 가능한 회로 목록

request_challenge

402 챌린지 요청 (단계별 흐름)

make_payment

x402 USDC 결제 (단계별 흐름)

submit_proof

증명 입력값 제출 (단계별 흐름)

prepare_inputs

회로 입력값 준비 (단계별 흐름)

npm 패키지

@zkproofport-ai/sdk   — TypeScript SDK for proof generation (ethers v6)
@zkproofport-ai/mcp   — Local MCP server for AI agents (stdio transport)

로컬 AI 에이전트 사용을 위해 MCP 서버를 설치하세요:

npm install @zkproofport-ai/mcp
npx zkproofport-mcp    # Starts stdio MCP server

가이드 시스템

GET /api/v1/guide/:circuit은 클라이언트 AI 에이전트가 모든 증명 입력값을 준비할 수 있도록 포괄적인 JSON 가이드를 반환합니다. 포함 내용:

  • 코드 예제가 포함된 단계별 지침

  • 상수 (증명자 키, 컨트랙트 주소, EAS 스키마 UID)

  • 공식 (널리파이어 계산, 신호 해시, 머클 트리 구성)

  • 유형 및 설명이 포함된 입력 스키마

  • EAS GraphQL 쿼리 템플릿

회로는 별칭을 사용합니다: coinbase_kyccoinbase_attestation, coinbase_countrycoinbase_country_attestation, oidc_domainoidc_domain_attestation.

A2A 프로토콜

POST /a2a의 A2A v0.3 JSON-RPC 엔드포인트:

메서드

목적

message/send

증명 작업 제출 (차단)

message/stream

증명 작업 제출 (SSE 스트리밍)

tasks/get

작업 상태 쿼리

tasks/cancel

실행 중인 작업 취소

tasks/resubscribe

작업 이벤트 재구독

/.well-known/agent.json의 에이전트 카드는 ERC-8004 온체인 신원 및 기능 검색을 제공합니다.

TEE 통합 (AWS Nitro Enclave)

모드

동작

disabled

표준 Linux, TEE 없음, 일반 텍스트 허용

nitro

AWS Nitro Enclave, 하드웨어 증명, E2E 암호화 강제

인클레이브는 aws/enclave-server.ts(dist/aws/enclave-server.js로 컴파일됨)를 실행하며, 이는 --oracle_hash keccak(Solidity 검증기 호환성을 위해 필요) 옵션과 함께 bb prove를 실행합니다. NSM 증명은 증명 해시와 TEE 공개 키를 인클레이브 측정값(PCR0/PCR1/PCR2)에 바인딩합니다.

증명 검증 체인: AWS Nitro Root CA → Regional → Zonal → Instance → Leaf 인증서, COSE ES384 서명으로 검증됨.

지원되는 회로

Coinbase KYC (coinbase_attestation)

보유자가 Coinbase KYC 검증을 통과했음을 증명합니다.

  • 별칭: coinbase_kyc, coinbase_attestation

  • 공개 입력값: address, scope

  • 널리파이어: 예 (개인정보 보호, 재전송 방지)

Coinbase Country (coinbase_country_attestation)

보유자의 KYC 국가가 증명과 일치함을 증명합니다.

  • 별칭: coinbase_country, coinbase_country_attestation

  • 공개 입력값: address, country, scope

  • 널리파이어: 예 (개인정보 보호, 재전송 방지)

OIDC Domain (oidc_domain_attestation)

OIDC JWT 검증을 통해 보유자가 특정 도메인의 이메일 주소를 소유하고 있음을 증명합니다.

  • 별칭: oidc_domain, oidc_domain_attestation

  • 입력 유형: OIDC JWT (Google 등의 id_token)

  • 공개 입력값: domain hash, scope

  • 널리파이어: 예 (개인정보 보호, 재전송 방지)

컨트랙트 주소

Base Sepolia (테스트넷)

컨트랙트

주소

KYC Verifier

0x0036B61dBFaB8f3CfEEF77dD5D45F7EFBFE2035c

Country Verifier

0xdEe363585926c3c28327Efd1eDd01cf4559738cf

ERC-8004 Identity

0x8004A818BFB912233c491871b3d84c89A494BD9e

ERC-8004 Reputation

0x8004B663056A597Dffe9eCcC1965A193B7388713

Base Mainnet (프로덕션)

컨트랙트

주소

ERC-8004 Identity

0x8004A169FB4a3325136EB29fA0ceB6D2e539a432

ERC-8004 Reputation

0x8004BAa17C55a88189AE136b182e5fdA19dE9b63

ERC-8004 에이전트 신원

에이전트는 시작 시 ERC-8004 Identity 컨트랙트를 통해 온체인에 자동 등록됩니다. 평판 점수는 증명 생성 성공 시마다 증가합니다.

환경 변수

필수

변수

설명

REDIS_URL

Redis 연결 문자열

BASE_RPC_URL

Base 체인 RPC 엔드포인트

CHAIN_RPC_URL

증명 검증용 RPC

EAS_GRAPHQL_ENDPOINT

증명 쿼리를 위한 EAS GraphQL 엔드포인트

PROVER_PRIVATE_KEY

에이전트 지갑 개인 키 (64 16진수 문자, 0x 제외)

PAYMENT_MODE

disabled / testnet / mainnet

A2A_BASE_URL

공개 서비스 URL (에이전트 카드용)

선택 사항

변수

기본값

설명

PORT

4002

Express 서버 포트

NODE_ENV

development

노드 환경

BB_PATH

bb

Barretenberg CLI 경로

NARGO_PATH

nargo

Nargo CLI 경로

CIRCUITS_DIR

/app/circuits

회로 아티팩트 디렉토리

CIRCUITS_REPO_URL

(GitHub raw URL)

회로 아티팩트 다운로드 URL

TEE_MODE

disabled

disabled / nitro

ENCLAVE_CID

Nitro Enclave CID (TEE_MODE=nitro일 때 필수)

ENCLAVE_PORT

5000

Nitro Enclave 포트

TEE_ATTESTATION

false

증명 검증 활성화

PAYMENT_PAY_TO

운영자 지갑 (결제 활성화 시 필수)

PAYMENT_PROOF_PRICE

$0.10

증명당 가격 (USD)

ERC8004_IDENTITY_ADDRESS

ERC-8004 Identity 컨트랙트

ERC8004_REPUTATION_ADDRESS

ERC-8004 Reputation 컨트랙트

GEMINI_API_KEY

채팅용 Gemini API 키

OPENAI_API_KEY

채팅용 OpenAI API 키

PHOENIX_COLLECTOR_ENDPOINT

추적용 Phoenix OTLP 엔드포인트

AGENT_VERSION

1.0.0

에이전트 버전 문자열

배포 (AWS Nitro Enclave)

proofport-ai는 Nitro Enclave를 지원하는 AWS EC2에 배포됩니다. 배포는 무중단 서비스를 위해 블루-그린 슬롯 전환을 사용합니다.

블루-그린 배포

aws/deploy-blue-green.sh
  • 두 개의 슬롯: 블루(포트 4002/3200) 및 그린(포트 4003/3201)

  • /opt/proofport-ai/active-slot에서 활성 슬롯 추적

  • Caddy 리로드(재시작 아님)로 트래픽 전환

  • 전환 전 진행 중인 요청 처리(증명 생성 시 최대 660초)

  • 새 컨테이너 상태 확인 실패 시 자동 롤백

인프라

  • Caddy — HTTPS를 사용하는 리버스 프록시 (Cloudflare Full SSL)

  • systemd — 서비스: proofport-ai, proofport-ai-redis, proofport-ai-enclave, vsock-bridge

  • CloudWatch — 로그 드라이버 awslogs, 30일 보관

  • GitHub Actionsdeploy-ai-aws.yml 워크플로우 (GCP용인 deploy.yml 아님)

부팅 / 중지

aws/boot-active-slot.sh    # Start active slot containers
aws/stop-active-slot.sh    # Stop active slot containers

테스트

npm test                # Unit tests
npm run test:e2e        # E2E against Docker stack
npm run test:watch      # Watch mode

A2A 테스트 (a2a-ui + Phoenix)

docker compose -f docker-compose.yml -f docker-compose.test.yml up --build -d

서비스

URL

목적

proofport-ai

http://localhost:4002

에이전트 서버

a2a-ui

http://localhost:3001

A2A 웹 테스트 UI

Phoenix

http://localhost:6006

추적 시각화

버전 잠금

도구

버전

bb (Barretenberg)

v1.0.0-nightly.20250723

nargo

1.0.0-beta.8

ethers

^6.13.0

@modelcontextprotocol/sdk

^1.0.0

Node.js

20 LTS

라이선스

Apache 2.0

Available Tools

8 tools
deposit_to_gatewayA

Deposit USDC into Circle Gateway on Arc, so later proofs can be paid for with nanopayments (pay_on: "arc-testnet-nano").

Do this ONCE, not per proof. The deposit is the only on-chain step and it costs gas; every payment drawn against the balance costs almost none. Paying with "arc-testnet-nano" against an empty Gateway balance is refused.

Requires PAYMENT_PRIVATE_KEY -- the buyer signs authorizations with it and never sends a transaction per payment.

RETURNS: whether a deposit was made, its transaction hash, and the Gateway balance afterwards (in USDC's smallest units, so 1000000 is one USDC).

ParametersJSON Schema
NameRequiredDescriptionDefault
amountYesHow much USDC to deposit, in whole USDC as a decimal string, e.g. "5" or "0.5".
rpc_urlNoArc RPC. Defaults to https://rpc.testnet.arc.io.
at_leastNoSkip the deposit if the Gateway balance already covers this, in USDC's smallest units (1000000 = 1 USDC). Omitted deposits unconditionally.

TDQS

A4.5/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so well. It discloses that this is the only on-chain step, that it costs gas, that it should happen once, that empty balances cause payment refusal, and what the return values are. This is far beyond a bare 'deposit' statement.

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?

The description is efficiently structured: clear purpose paragraph, workflow guidance, prerequisite, and a returns summary. Every sentence adds useful information and nothing feels like filler or tautology.

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?

For a 3-parameter tool with no output schema, the description is complete: it explains the purpose, the workflow position, gas implications, the private key requirement, parameter nuances, and the exact return fields including units. An agent has enough to invoke it correctly and interpret the result.

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 coverage is 100%, so the schema already documents amount, rpc_url, and at_least with units and defaults. The description reinforces the decimal-string format and USDC smallest-unit convention, but mostly repeats what the schema already provides. Baseline 3 is appropriate.

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 description opens with a specific verb and resource: 'Deposit USDC into Circle Gateway on Arc', and immediately states the downstream purpose (paying for proofs via nanopayments). This clearly distinguishes it from the sibling tools like gateway_balance and generate_proof, which serve different steps in the workflow.

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?

The description gives explicit when-to-use guidance: 'Do this ONCE, not per proof' and explains why, including gas cost and refusal of payments against an empty balance. It also notes the PAYMENT_PRIVATE_KEY requirement. It does not explicitly name an alternative sibling, but the situational guidance is concrete enough to route an agent correctly.

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

gateway_balanceA

What the buyer currently holds inside Circle Gateway on Arc — the balance nanopayments are drawn against. Amounts are in USDC's smallest units (1000000 = 1 USDC). Requires PAYMENT_PRIVATE_KEY.

ParametersJSON Schema
NameRequiredDescriptionDefault
rpc_urlNoArc RPC. Defaults to https://rpc.testnet.arc.io.

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and does meaningful work: it discloses that the operation reads a current balance, specifies USDC base units, and states the required private key. It does not explicitly say the call is read-only, but the wording strongly implies a non-mutating balance lookup.

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?

Two compact sentences with no filler: the first states the tool's purpose and its relationship to nanopayments, and the second packs in unit semantics and an authentication requirement. Every sentence earns its place.

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

Completeness3/5

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

For a one-optional-parameter read tool, the description covers purpose, units, and auth. However, because there is no output schema, it does not specify the exact response shape or field name, and it does not address edge cases like an invalid key or missing gateway balance.

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?

The only parameter, rpc_url, is fully documented in the schema with its type and default value, so schema coverage is 100%. The description adds no parameter-specific detail, which aligns with the baseline score for high schema coverage.

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

Purpose4/5

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

The description clearly identifies the tool as reporting the buyer's current balance inside Circle Gateway on Arc and notes this is the balance nanopayments draw against. It distinguishes itself from deposit_to_gateway and proof-flow siblings, though it lacks an explicit imperative verb like 'get' or 'fetch'.

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: call this when you need the current balance that nanopayments draw against. It also states a prerequisite (PAYMENT_PRIVATE_KEY), but it never explicitly says when to use this instead of deposit_to_gateway or other alternatives, nor provides exclusions.

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

generate_proofA

All-in-one ZK proof generation. Handles: prepare inputs, request challenge, and submit proof in a single call. Use this when you want the simplest path to a proof. For fine-grained control over each step, use prepare_inputs, request_challenge, and submit_proof individually.

CIRCUITS:

  • "coinbase_kyc": Proves the user passed Coinbase KYC verification.

  • "coinbase_country": Proves the user's country of residence is (or is not) in a given list. Requires country_list and is_included.

  • "oidc_domain": Proves the user authenticated via OIDC and their email belongs to a specific domain. Requires jwt and scope.

  • "arc_eligibility": Coinbase KYC, optionally binding the wallet's signature to ONE EIP-712 action. Without action it signs the request signal hash. The proof carries that action's hash, so a contract can check WHICH instruction was authorised -- not merely that somebody eligible signed something. Verified on Arc Testnet (chain 5042002).

  • "giwa_attestation": GIWA attestation, optionally binding one EIP-712 action. Uses a GIWA-attested wallet; verified on GIWA Sepolia (chain 91342).

RETURNS: Full ProofResult with proof bytes, public inputs, and timing information. Use verify_proof separately to verify on-chain.

ParametersJSON Schema
NameRequiredDescriptionDefault
jwtNoOIDC JWT token (id_token) for oidc_domain circuit
scopeNoScope string for nullifier derivation. Defaults to "proofport" if omitted. For oidc_domain circuit, this is the domain scope string.
actionNoThe EIP-712 action to authorise. Optional for arc_eligibility and giwa_attestation; rejected for other circuits. Any structure is provable: the circuit hashes it without reading it, so a deposit, a grant of authority or an agreement in prose all work. The wallet signs exactly these fields, and the proof carries their hash.
pay_onNoWhich chain to pay on: a CAIP-2 id ("eip155:5042002") or a plain name ("arc-testnet", "arc-testnet-nano", "base-sepolia"). Call request_challenge to see what a service offers. Omitted takes the first chain offered. The payer signs an authorization and the service settles it, so no gas or native balance is needed on the paying chain -- only USDC. "arc-testnet-nano" is Arc nanopayments: the authorization goes to Circle Gateway, which verifies it off chain in under a second and settles it later in a batch with thousands of others, so the gas per payment approaches zero. It requires a Gateway balance -- deposit first with the deposit_to_gateway tool -- and is the right choice for an agent buying many proofs. "arc-testnet" settles each payment on chain immediately and costs gas every time.
circuitYesWhich circuit to use
pay_withNoWhich wallet pays, when the service charges. "arc" is an Arc agent wallet — Circle holds it, it carries spending policies the agent cannot ignore, and Circle CLI signs with it (install: npm i -g @circle-fin/cli, then circle wallet login <email> --testnet). "key" signs with PAYMENT_PRIVATE_KEY. "cdp" uses a Coinbase CDP server wallet (CDP_API_KEY_ID, CDP_API_KEY_SECRET, CDP_WALLET_SECRET). "circle" uses a Circle developer-controlled wallet (CIRCLE_API_KEY, CIRCLE_ENTITY_SECRET, CIRCLE_WALLET_ID) when that wallet supports the selected offer. Omit it and the single configured wallet is used; omit it with none configured against a paying service and the error names what to set. Wallet and chain are separate choices; both must support the actual offered signing domain.
providerNoOIDC provider. "google" (default) for Google Workspace, "microsoft" for Microsoft 365.
is_includedNotrue = prove country IS in list, false = prove NOT in list. Required for coinbase_country circuit.
max_paymentNoMaximum USDC proof fee allowed by the user.
country_listNoISO 3166-1 alpha-2 country codes. Required for coinbase_country circuit.
approved_paymentNoExact user-approved terms. For direct EIP-3009 set extra.verifyingContract to the offer asset; for Gateway copy its required extra.verifyingContract. Changed fee, recipient, token, chain or signing domain is rejected before signing.

TDQS

A4.8/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It discloses the one-call bundling behavior, per-circuit requirements, optional EIP-712 action binding, and the fact that the proof carries the action's hash. It does not detail failure modes or rate limiting, but the behavioral disclosure is strong.

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?

The description is long but appropriately structured with a summary, routing guidance, a circuit section, and a returns section. Every paragraph earns its place given the complexity of 11 parameters and five circuits; there is no filler.

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?

Despite having no output schema or annotations, the description covers the operation, when to use it, all circuits, payment/chain nuances, EIP-712 action semantics, nanopayments, and return type. It is unusually complete for a complex tool and leaves little for an agent to infer.

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

Parameters5/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 substantial value by linking parameters to circuits: country_list and is_included for coinbase_country, jwt and scope for oidc_domain, and optional/rejected action for arc_eligibility and giwa_attestation. It also explains defaults for pay_on and pay_with, materially improving correct invocation.

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 description opens with 'All-in-one ZK proof generation' and explicitly says it handles prepare inputs, request challenge, and submit proof in a single call, clearly distinguishing it from the individual sibling tools. It then enumerates five distinct circuits with their exact guarantees, making the tool's operation unmistakable.

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?

It states 'Use this when you want the simplest path to a proof. For fine-grained control over each step, use prepare_inputs, request_challenge, and submit_proof individually', providing explicit when-to-use guidance and named alternatives. It also routes verification to verify_proof separately and tells the caller to use request_challenge to see what a service offers.

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

get_supported_circuitsA

List all ZK circuits supported by ZKProofport, including verifier addresses and authorized signers. No parameters required. Call this first to discover available circuits before starting proof generation.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

No annotations provided, so description must disclose behavior. It mentions no parameters required but does not state if it's read-only or any side effects. Minimal behavioral info, but acceptable for a simple listing tool.

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?

Two sentences, no wasted words. Efficiently conveys purpose, output contents, and usage order.

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?

Given the tool has zero parameters and no output schema, the description adequately covers purpose and guidance. Could mention output format or safety of repeated calls, but it's mostly complete.

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?

No parameters defined; description adds value by explicitly stating 'No parameters required,' which reassures the agent. Baseline 4 for zero-parameter tools with coverage.

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?

Clearly states the tool lists all ZK circuits with specific details (verifier addresses and authorized signers). Distinguishes from siblings by being a discovery step before proof generation.

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?

Explicitly says 'Call this first to discover available circuits before starting proof generation,' which guides when to use it. Could be improved by specifying when not to use it or naming alternatives, but it's clear for a discovery tool.

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

prepare_inputsA

Step 1 of the step-by-step flow: Prepare all circuit inputs. Arc and GIWA optionally sign the exact validated EIP-712 action; without action they sign the signal hash. Coinbase signs the signal hash. Queries EAS, builds the Merkle proof, and returns private witness inputs including the Arc domain_separator and action_hash. Handle these inputs only in trusted local code, never expose them to the dApp, model or logs. Call this BEFORE request_challenge. For oidc_domain circuit, provide jwt and scope instead of Coinbase-specific parameters.

ParametersJSON Schema
NameRequiredDescriptionDefault
jwtNoOIDC JWT token (id_token) for oidc_domain circuit
scopeNoScope string for nullifier derivation. Defaults to "proofport" if omitted. For oidc_domain circuit, this is the domain scope string.
actionNoThe EIP-712 action to authorise. Optional for arc_eligibility and giwa_attestation; rejected for other circuits. Any structure is provable: the circuit hashes it without reading it, so a deposit, a grant of authority or an agreement in prose all work. The wallet signs exactly these fields, and the proof carries their hash.
circuitYesWhich circuit to use
providerNoOIDC provider. "google" (default) for Google Workspace, "microsoft" for Microsoft 365.
is_includedNotrue = prove country IS in list, false = prove NOT in list. Required for coinbase_country circuit.
country_listNoISO 3166-1 alpha-2 country codes. Required for coinbase_country circuit.

TDQS

A4.6/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full behavioral burden. It discloses signing behavior for Arc/GIWA versus Coinbase, the EAS query, Merkle proof construction, private output contents, and a security warning about never exposing inputs to the dApp, model, or logs. It could say more about side effects or failure behavior, but it is substantially transparent.

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?

The description is six sentences long, and every sentence carries distinct information: step identity, signing behavior, EAS/proof/output behavior, security handling, call ordering, and circuit-specific parameter guidance. It is front-loaded with the core purpose and contains no filler.

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?

Given there is no output schema, the description reasonably names the returned artifacts ('private witness inputs including the Arc domain_separator and action_hash') and covers sequencing, security, and circuit variants. It does not fully enumerate all outputs or edge cases, but for a preparation step it is largely complete.

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% with detailed parameter descriptions, so the baseline is 3. The description adds cross-parameter guidance beyond the schema: jwt/scope replace Coinbase-specific parameters for oidc_domain, and the action signing behavior differs by signer. This is meaningful value over the schema 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?

The description states a specific verb and resource: 'Prepare all circuit inputs', and grounds it in concrete behavior ('Queries EAS, builds the Merkle proof, and returns private witness inputs'). It positions itself as 'Step 1 of the step-by-step flow', which distinguishes it from later siblings like generate_proof and request_challenge.

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?

The description gives explicit sequencing: 'Call this BEFORE request_challenge'. It also provides circuit-specific routing: 'For oidc_domain circuit, provide jwt and scope instead of Coinbase-specific parameters', which tells the agent exactly when to use which parameter set.

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

request_challengeA

Step 2 of the step-by-step flow: Request a challenge from the server. Pass inputs: {} to discover the live payment offers, nonce and optional TEE key without transmitting private witness inputs. You MUST pass the returned "nonce" to submit_proof — without it the server just issues another challenge. MCP submit_proof does not sign payments or encrypt inputs; use generate_proof or the SDK for paid/encrypted orchestration.

ParametersJSON Schema
NameRequiredDescriptionDefault
inputsYesUse {} to discover the nonce, payment offers and optional TEE key without transmitting private witness inputs. Also accepts a JSON string or object from trusted local code; any supplied witness is sent to the selected prover and must stay out of model context, dApp/UI and logs.
circuitYesWhich circuit to use

TDQS

A5/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden. It discloses security-relevant behavior: that the tool does not sign payments or encrypt inputs, and that '{}' prevents transmission of private witness data. It also highlights the server-side nonce issuance and its necessity for subsequent steps.

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?

The description is concise yet information-dense, with critical points front-loaded: step indication, the recommendation to use '{}', and the nonce requirement. Every sentence earns its place, covering purpose, usage, and security implications without redundancy.

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?

Given the tool's moderate complexity (2 params, no output schema), the description provides comprehensive guidance on what the tool does, when to use it, how to use it safely, and what to do with the result (pass nonce to submit_proof). It also covers the alternative for paid/encrypted use, making it self-sufficient for an agent.

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

Parameters5/5

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

Even though schema coverage is 100%, the description adds crucial meaning: it explains that '{}' is sufficient for anonymous discovery, warns that providing witness data sends it to the prover and must be kept out of context/logs, and clarifies the circuit enum's purpose. This goes well beyond the schema's minimal descriptions.

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 description clearly states it is 'Step 2 of the step-by-step flow: Request a challenge from the server' and specifies the resource and action. It distinguishes itself from siblings like submit_proof by explaining its role and the critical dependency on the returned nonce.

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?

It explicitly recommends passing '{}' to avoid transmitting private data, warns against using submit_proof for signing, and directs to generate_proof or the SDK for paid/encrypted flows. This provides clear when-to-use and when-not-to-use guidance with specific alternatives.

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

submit_proofA

Step 3 of the step-by-step flow: Submit prepared inputs to generate the ZK proof. The TEE server runs the Noir circuit and returns the UltraHonk proof. This step may take 30-90 seconds. The TEE server builds Prover.toml from these inputs.

You MUST pass the nonce returned by request_challenge. POST /api/v1/prove answers every request that arrives without that nonce with a fresh 402 challenge, so a submission that omits it can never produce a proof.

ParametersJSON Schema
NameRequiredDescriptionDefault
nonceYesThe "nonce" field from the request_challenge response. Single-use and bound to the circuit it was issued for — request a new challenge for every submission and for every circuit.
inputsYesFull ProveInputs object from prepare_inputs. Accepts a JSON string or a structured object.
circuitYesWhich circuit to use

TDQS

A4/5.0
Behavior4/5

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

Discloses substantial runtime behavior: the server runs the Noir circuit, builds Prover.toml from inputs, returns UltraHonk proof, and takes 30-90 seconds. It also warns about 402 challenge responses when nonce is omitted, providing a concrete failure mode. With no annotations, the description carries the burden and does so well, though it doesn't describe the exact success/error response envelope.

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?

Description is compact and front-loaded: purpose, server behavior, latency, and nonce warning in four sentences. The only slightly extra detail is the internal endpoint path, but it reinforces the nonce requirement.

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?

Grounds the tool in a step-by-step flow, specifies runtime duration, and warns about the one critical mistake. For a 3-param synchronous tool with no output schema, this is nearly complete; it could add an explicit success/error response format or a note that proof should be passed to verify_proof.

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?

Input schema covers all 3 params with complete descriptions, so the high-coverage baseline applies. The description adds workflow provenance (nonce from request_challenge, inputs from prepare_inputs) and notes Prover.toml construction, but most of this repeats schema descriptions and does not substantially deepen parameter meaning.

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

Purpose4/5

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

States a specific action ('Submit prepared inputs to generate the ZK proof') and identifies position as 'Step 3' in the flow, with the TEE server running the Noir circuit. However, it never distinguishes itself from the sibling 'generate_proof', which could plausibly perform the same action.

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?

Positions itself clearly as Step 3 and states the requirement to pass the nonce from request_challenge, giving an agent a precondition to check before calling. It doesn't explicitly say when to prefer this over generate_proof or mention exclusions, but the step context and nonce dependency are clear.

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

verify_proofA

Step 4 (optional): Verify a ZK proof on-chain against the deployed verifier contract. Pass the full generate_proof result object directly — verification info (verifierAddress, chainId, rpcUrl) is extracted automatically. Returns { valid: true } if the proof is valid.

ParametersJSON Schema
NameRequiredDescriptionDefault
resultYesFull result object from generate_proof — pass it directly without extracting fields

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description must disclose all behavioral traits. It states the tool verifies on-chain and returns a success object, but does not mention potential gas costs, network dependencies, failure responses, or side effects.

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?

The description is three sentences with no wasted words. It front-loads the purpose and incrementally adds context on how to use the tool and what to expect.

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

Completeness3/5

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

Given the nested object parameter and lack of output schema, the description effectively covers the main use case and expected return for a valid proof. However, it omits error handling, edge cases, and a full return structure description.

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?

The input schema has 100% coverage with descriptions for all properties. The description adds value by explaining to pass the result object directly, but it reinforces usage rather than adding new semantic meaning beyond the schema.

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 description clearly states the tool's action ('Verify a ZK proof on-chain'), the specific resource ('against the deployed verifier contract'), and its place in a workflow ('Step 4 (optional)'). It distinguishes itself from siblings like generate_proof and submit_proof.

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?

The description instructs users to 'Pass the full generate_proof result object directly,' providing clear how-to guidance. It frames the tool as an optional step after proof generation, but lacks explicit when-not-to-use or mention of alternatives.

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. 4 tool updatesv0.2.44
    • Changedgenerate_proof3 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"The EIP-712 action to authorise. Required for arc_eligibility and rejected for every other circuit. Any structure is provable: the circuit hashes it without reading it, so a deposit, a grant of authority or an agreement in prose all work. The wallet signs exactly these fields, and the proof carries their hash."New value: +"The EIP-712 action to authorise. Optional for arc_eligibility and giwa_attestation; rejected for other circuits. Any structure is provable: the circuit hashes it without reading it, so a deposit, a grant of authority or an agreement in prose all work. The wallet signs exactly these fields, and the proof carries their hash."
      • changedInput schema / properties / approved_payment / description
        Previous value: -"Exact user-approved terms. The SDK rejects any changed fee, recipient, token, chain or Gateway signing domain before signing the actual challenge."New value: +"Exact user-approved terms. For direct EIP-3009 set extra.verifyingContract to the offer asset; for Gateway copy its required extra.verifyingContract. Changed fee, recipient, token, chain or signing domain is rejected before signing."
      • changedInput schema / properties / circuit / enum
        Previous value: -[
        -  "coinbase_kyc",
        -  "coinbase_country",
        -  "oidc_domain",
        -  "arc_eligibility"
        -]New value: +[
        +  "coinbase_kyc",
        +  "coinbase_country",
        +  "oidc_domain",
        +  "arc_eligibility",
        +  "giwa_attestation"
        +]
    • Changedprepare_inputs2 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"The EIP-712 action to authorise. Required for arc_eligibility and rejected for every other circuit. Any structure is provable: the circuit hashes it without reading it, so a deposit, a grant of authority or an agreement in prose all work. The wallet signs exactly these fields, and the proof carries their hash."New value: +"The EIP-712 action to authorise. Optional for arc_eligibility and giwa_attestation; rejected for other circuits. Any structure is provable: the circuit hashes it without reading it, so a deposit, a grant of authority or an agreement in prose all work. The wallet signs exactly these fields, and the proof carries their hash."
      • changedInput schema / properties / circuit / enum
        Previous value: -[
        -  "coinbase_kyc",
        -  "coinbase_country",
        -  "oidc_domain",
        -  "arc_eligibility"
        -]New value: +[
        +  "coinbase_kyc",
        +  "coinbase_country",
        +  "oidc_domain",
        +  "arc_eligibility",
        +  "giwa_attestation"
        +]
    • Changedrequest_challenge1 field changed
      • changedInput schema / properties / circuit / enum
        Previous value: -[
        -  "coinbase_kyc",
        -  "coinbase_country",
        -  "oidc_domain",
        -  "arc_eligibility"
        -]New value: +[
        +  "coinbase_kyc",
        +  "coinbase_country",
        +  "oidc_domain",
        +  "arc_eligibility",
        +  "giwa_attestation"
        +]
    • Changedsubmit_proof1 field changed
      • changedInput schema / properties / circuit / enum
        Previous value: -[
        -  "coinbase_kyc",
        -  "coinbase_country",
        -  "oidc_domain",
        -  "arc_eligibility"
        -]New value: +[
        +  "coinbase_kyc",
        +  "coinbase_country",
        +  "oidc_domain",
        +  "arc_eligibility",
        +  "giwa_attestation"
        +]
  2. 6 tool updatesv0.2.43
    • Addeddeposit_to_gateway
    • Addedgateway_balance
    • Changedgenerate_proof6 fields changed
      • addedInput schema / properties / action
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The EIP-712 action to authorise. Required for arc_eligibility and rejected for every other circuit. Any structure is provable: the circuit hashes it without reading it, so a deposit, a grant of authority or an agreement in prose all work. The wallet signs exactly these fields, and the proof carries their hash.",
        +  "properties": {
        +    "domain": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "chainId": {
        +          "type": "number"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "verifyingContract": {
        +          "type": "string"
        +        },
        +        "version": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "name",
        +        "version",
        +        "chainId",
        +        "verifyingContract"
        +      ],
        +      "type": "object"
        +    },
        +    "message": {
        +      "additionalProperties": {},
        +      "type": "object"
        +    },
        +    "primaryType": {
        +      "type": "string"
        +    },
        +    "types": {
        +      "additionalProperties": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "name": {
        +              "type": "string"
        +            },
        +            "type": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "name",
        +            "type"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "domain",
        +    "types",
        +    "primaryType",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / approved_payment
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Exact user-approved terms. The SDK rejects any changed fee, recipient, token, chain or Gateway signing domain before signing the actual challenge.",
        +  "properties": {
        +    "amount": {
        +      "pattern": "^\\d+$",
        +      "type": "string"
        +    },
        +    "asset": {
        +      "type": "string"
        +    },
        +    "extra": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "name": {
        +          "type": "string"
        +        },
        +        "verifyingContract": {
        +          "type": "string"
        +        },
        +        "version": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "name",
        +        "version",
        +        "verifyingContract"
        +      ],
        +      "type": "object"
        +    },
        +    "network": {
        +      "type": "string"
        +    },
        +    "payTo": {
        +      "type": "string"
        +    },
        +    "scheme": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "network",
        +    "scheme",
        +    "amount",
        +    "asset",
        +    "payTo",
        +    "extra"
        +  ],
        +  "type": "object"
        +}
      • changedInput schema / properties / circuit / enum
        Previous value: -[
        -  "coinbase_kyc",
        -  "coinbase_country",
        -  "oidc_domain"
        -]New value: +[
        +  "coinbase_kyc",
        +  "coinbase_country",
        +  "oidc_domain",
        +  "arc_eligibility"
        +]
      • addedInput schema / properties / max_payment
        Added value: +{
        +  "description": "Maximum USDC proof fee allowed by the user.",
        +  "pattern": "^\\d+(\\.\\d{1,6})?$",
        +  "type": "string"
        +}
      • addedInput schema / properties / pay_on
        Added value: +{
        +  "description": "Which chain to pay on: a CAIP-2 id (\"eip155:5042002\") or a plain name (\"arc-testnet\", \"arc-testnet-nano\", \"base-sepolia\"). Call request_challenge to see what a service offers. Omitted takes the first chain offered. The payer signs an authorization and the service settles it, so no gas or native balance is needed on the paying chain -- only USDC. \"arc-testnet-nano\" is Arc nanopayments: the authorization goes to Circle Gateway, which verifies it off chain in under a second and settles it later in a batch with thousands of others, so the gas per payment approaches zero. It requires a Gateway balance -- deposit first with the deposit_to_gateway tool -- and is the right choice for an agent buying many proofs. \"arc-testnet\" settles each payment on chain immediately and costs gas every time.",
        +  "type": "string"
        +}
      • addedInput schema / properties / pay_with
        Added value: +{
        +  "description": "Which wallet pays, when the service charges. \"arc\" is an Arc agent wallet — Circle holds it, it carries spending policies the agent cannot ignore, and Circle CLI signs with it (install: npm i -g @circle-fin/cli, then circle wallet login <email> --testnet). \"key\" signs with PAYMENT_PRIVATE_KEY. \"cdp\" uses a Coinbase CDP server wallet (CDP_API_KEY_ID, CDP_API_KEY_SECRET, CDP_WALLET_SECRET). \"circle\" uses a Circle developer-controlled wallet (CIRCLE_API_KEY, CIRCLE_ENTITY_SECRET, CIRCLE_WALLET_ID) when that wallet supports the selected offer. Omit it and the single configured wallet is used; omit it with none configured against a paying service and the error names what to set. Wallet and chain are separate choices; both must support the actual offered signing domain.",
        +  "enum": [
        +    "key",
        +    "cdp",
        +    "circle",
        +    "arc"
        +  ],
        +  "type": "string"
        +}
    • Changedprepare_inputs2 fields changed
      • addedInput schema / properties / action
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The EIP-712 action to authorise. Required for arc_eligibility and rejected for every other circuit. Any structure is provable: the circuit hashes it without reading it, so a deposit, a grant of authority or an agreement in prose all work. The wallet signs exactly these fields, and the proof carries their hash.",
        +  "properties": {
        +    "domain": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "chainId": {
        +          "type": "number"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "verifyingContract": {
        +          "type": "string"
        +        },
        +        "version": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "name",
        +        "version",
        +        "chainId",
        +        "verifyingContract"
        +      ],
        +      "type": "object"
        +    },
        +    "message": {
        +      "additionalProperties": {},
        +      "type": "object"
        +    },
        +    "primaryType": {
        +      "type": "string"
        +    },
        +    "types": {
        +      "additionalProperties": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "name": {
        +              "type": "string"
        +            },
        +            "type": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "name",
        +            "type"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "domain",
        +    "types",
        +    "primaryType",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • changedInput schema / properties / circuit / enum
        Previous value: -[
        -  "coinbase_kyc",
        -  "coinbase_country",
        -  "oidc_domain"
        -]New value: +[
        +  "coinbase_kyc",
        +  "coinbase_country",
        +  "oidc_domain",
        +  "arc_eligibility"
        +]
    • Changedrequest_challenge2 fields changed
      • changedInput schema / properties / circuit / enum
        Previous value: -[
        -  "coinbase_kyc",
        -  "coinbase_country",
        -  "oidc_domain"
        -]New value: +[
        +  "coinbase_kyc",
        +  "coinbase_country",
        +  "oidc_domain",
        +  "arc_eligibility"
        +]
      • changedInput schema / properties / inputs / description
        Previous value: -"Full ProveInputs object from prepare_inputs. Accepts a JSON string or a structured object."New value: +"Use {} to discover the nonce, payment offers and optional TEE key without transmitting private witness inputs. Also accepts a JSON string or object from trusted local code; any supplied witness is sent to the selected prover and must stay out of model context, dApp/UI and logs."
    • Changedsubmit_proof3 fields changed
      • changedInput schema / properties / circuit / enum
        Previous value: -[
        -  "coinbase_kyc",
        -  "coinbase_country",
        -  "oidc_domain"
        -]New value: +[
        +  "coinbase_kyc",
        +  "coinbase_country",
        +  "oidc_domain",
        +  "arc_eligibility"
        +]
      • addedInput schema / properties / nonce
        Added value: +{
        +  "description": "The \"nonce\" field from the request_challenge response. Single-use and bound to the circuit it was issued for — request a new challenge for every submission and for every circuit.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "circuit",
        -  "inputs"
        -]New value: +[
        +  "circuit",
        +  "inputs",
        +  "nonce"
        +]

TDQS

A4.2/5.0

Scored across 8 tools

Disambiguation4/5

Most tools target distinct actions: deposit, balance, discovery, verification, and the three explicit proof steps are clearly separated. The only overlap is generate_proof versus the step-by-step prepare/request/submit flow, but the descriptions explicitly position generate_proof as the all-in-one alternative.

Naming Consistency4/5

The majority follow a consistent snake_case verb_noun pattern: generate_proof, verify_proof, request_challenge, prepare_inputs, submit_proof, get_supported_circuits. Minor deviations are gateway_balance (missing a get_ prefix) and deposit_to_gateway (prepositional form), but these are not confusing.

Tool Count5/5

Eight tools is well-scoped for a ZK proof service covering discovery, payment setup, proof generation, and verification. Each tool earns its place without redundancy or bloat.

Completeness4/5

The core lifecycle is covered: discover circuits, fund the gateway, check balance, generate proofs via either path, and verify on-chain. Minor gaps exist such as no explicit withdrawal/refund tool for unused gateway funds, but agents can complete the primary proof-generation workflow without dead ends.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    MCP server for on-chain attestation and wallet trust profiles across 31 EVM chains and Solana. Privacy-preserving boolean verification, ECDSA-signed responses, compliance templates.
    27
    149 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server for agentic commerce, enabling AI agents to discover services, make x402 payments with USDC across multiple chains, and manage crypto wallets and token swaps.
    335 npm
    1
    MIT