zkproofport-ai
Provides reverse proxy configuration for the Node.js server, enabling secure HTTPS routing and load balancing in AWS deployments.
Enables containerized deployment of the server, Redis, and AWS Nitro Enclave components through Docker Compose configurations for local development and AWS production environments.
Provides on-chain proof verification capabilities and USDC payment processing through Ethereum smart contract interactions using ethers v6 library.
Serves as the web server framework for REST API endpoints including proof generation, health checks, and integration endpoints for MCP and A2A protocols.
Enables fetching of EAS (Ethereum Attestation Service) attestations for circuit input construction through GraphQL queries.
Provides a Next.js-based signing page with WalletConnect integration for user authentication and transaction signing.
Serves as the runtime environment for the main server application, handling API requests, payment verification, and blind relay operations to the TEE enclave.
Provides package management for the server and client SDKs, including the @zkproofport-ai/sdk and @zkproofport-ai/mcp packages for proof generation and AI agent integration.
Provides LLM capabilities through OpenAI API client for chat functionality and multi-provider routing in the proof generation system.
Enables distributed tracing and observability for monitoring server performance and debugging proof generation workflows.
Provides structured logging for server operations, enabling detailed monitoring and debugging of proof generation and payment processing.
Provides data persistence for proof caching, rate limiting, task management, and session storage through Redis-backed implementations.
Provides API documentation through OpenAPI specification and Swagger UI for exploring REST endpoints and proof generation workflows.
Enables configuration of prover settings through TOML file generation for the Barretenberg CLI proof generation system.
Serves as the primary programming language for the server implementation, SDK development, and type-safe API definitions.
Enables wallet connectivity for user authentication and transaction signing through the Next.js signing page interface.
proofport-ai
Agent-native ZK proof infrastructure for ZKProofport. A standalone service that generates and verifies zero-knowledge proofs inside an AWS Nitro Enclave with end-to-end encryption — the server acts as a blind relay and never sees proof inputs.
Architecture
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 │
└─────────────────────────────────────┘Key properties:
E2E encryption — X25519 ECDH + AES-256-GCM. In
nitromode, plaintext inputs are rejected.Blind relay — The Node.js host cannot read proof inputs. Only the enclave decrypts.
x402 payment — Single-step flow: 402 challenge → USDC payment → proof generation. No middleware.
Hardware attestation — NSM attestation document binds TEE public key to enclave measurement (PCRs).
Related MCP server: AgentStamp
Directory Structure
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.mdQuick Start
npm (Development)
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 stackDocker Compose (Local)
docker compose up --build # Start redis + server
docker compose down # Stop
docker compose down -v # Reset dataPort 4002: Node.js server
Port 6380 (host) → 6379 (container): Redis
E2E Encryption (Blind Relay)
Proof inputs are end-to-end encrypted between the client and the Nitro Enclave. The Node.js server passes the encrypted blob without reading it.
Protocol: X25519 ECDH + AES-256-GCM (ECIES pattern)
TEE generates X25519 key pair on startup, binds public key to NSM attestation
Client fetches TEE public key from 402 response, verifies attestation
Client generates ephemeral X25519 keypair, computes ECDH shared secret, derives AES key via SHA-256
Client encrypts inputs with AES-256-GCM, sends
{ ephemeralPublicKey, iv, ciphertext, authTag, keyId }Server passes encrypted envelope to enclave via vsock (blind relay)
Enclave decrypts, generates proof, returns proof + NSM attestation
Enforcement: In nitro mode, plaintext inputs are rejected with PLAINTEXT_REJECTED.
x402 Payment Flow
Single-step atomic flow — no middleware, no sessions:
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 }Payment modes:
Mode | Network | Effect |
| None | All requests free |
| Base Sepolia | Require USDC payment (testnet) |
| Base Mainnet | Require USDC payment (production) |
REST Endpoints
Endpoint | Method | Purpose |
| GET | Health check + TEE status + payment mode |
| POST | x402 single-step proof generation |
| GET | Dynamic proof generation guide (JSON) |
| POST | StreamableHTTP MCP endpoint |
| POST | A2A JSON-RPC endpoint |
| GET | OASF Agent Card |
| GET | A2A Agent Card |
| GET | MCP discovery |
| GET | Swagger UI |
| GET | OpenAPI spec |
MCP Tools
Available via /mcp (StreamableHTTP) or the local @zkproofport-ai/mcp package (stdio):
Tool | Purpose |
| All-in-one proof generation (x402 payment + E2E encryption auto-detect) |
| On-chain proof verification |
| List available circuits |
| Request 402 challenge (step-by-step flow) |
| Make x402 USDC payment (step-by-step flow) |
| Submit proof inputs (step-by-step flow) |
| Prepare circuit inputs (step-by-step flow) |
npm Packages
@zkproofport-ai/sdk — TypeScript SDK for proof generation (ethers v6)
@zkproofport-ai/mcp — Local MCP server for AI agents (stdio transport)Install the MCP server for local AI agent usage:
npm install @zkproofport-ai/mcp
npx zkproofport-mcp # Starts stdio MCP serverGuide System
GET /api/v1/guide/:circuit returns a comprehensive JSON guide for client AI agents to prepare all proof inputs. Includes:
Step-by-step instructions with code examples
Constants (attester keys, contract addresses, EAS schema UIDs)
Formulas (nullifier computation, signal hash, Merkle tree construction)
Input schema with types and descriptions
EAS GraphQL query templates
Circuits use aliases: coinbase_kyc → coinbase_attestation, coinbase_country → coinbase_country_attestation, oidc_domain → oidc_domain_attestation.
A2A Protocol
A2A v0.3 JSON-RPC endpoint at POST /a2a:
Method | Purpose |
| Submit proof task (blocking) |
| Submit proof task (SSE streaming) |
| Query task status |
| Cancel a running task |
| Resubscribe to task events |
Agent Card at /.well-known/agent.json provides ERC-8004 on-chain identity and capability discovery.
TEE Integration (AWS Nitro Enclave)
Mode | Behavior |
| Standard Linux, no TEE, plaintext allowed |
| AWS Nitro Enclave, hardware attestation, E2E encryption enforced |
The enclave runs aws/enclave-server.ts (compiled to dist/aws/enclave-server.js) which executes bb prove with --oracle_hash keccak (required for Solidity verifier compatibility). NSM attestation binds the proof hash and TEE public key to the enclave measurement (PCR0/PCR1/PCR2).
Attestation validation chain: AWS Nitro Root CA → Regional → Zonal → Instance → Leaf certificate, verified with COSE ES384 signature.
Supported Circuits
Coinbase KYC (coinbase_attestation)
Proves holder has passed Coinbase KYC verification.
Aliases:
coinbase_kyc,coinbase_attestationPublic Inputs: address, scope
Nullifier: Yes (privacy, replay prevention)
Coinbase Country (coinbase_country_attestation)
Proves holder's KYC country matches attestation.
Aliases:
coinbase_country,coinbase_country_attestationPublic Inputs: address, country, scope
Nullifier: Yes (privacy, replay prevention)
OIDC Domain (oidc_domain_attestation)
Proves holder owns an email address at a specific domain via OIDC JWT verification.
Aliases:
oidc_domain,oidc_domain_attestationInput type: OIDC JWT (
id_tokenfrom Google, etc.)Public Inputs: domain hash, scope
Nullifier: Yes (privacy, replay prevention)
Contract Addresses
Base Sepolia (Testnet)
Contract | Address |
KYC Verifier |
|
Country Verifier |
|
ERC-8004 Identity |
|
ERC-8004 Reputation |
|
Base Mainnet (Production)
Contract | Address |
ERC-8004 Identity |
|
ERC-8004 Reputation |
|
ERC-8004 Agent Identity
The agent auto-registers on-chain at startup via the ERC-8004 Identity contract. Reputation score increments after each successful proof generation.
Environment Variables
Required
Variable | Description |
| Redis connection string |
| Base chain RPC endpoint |
| RPC for proof verification |
| EAS GraphQL endpoint for attestation queries |
| Agent wallet private key (64 hex chars, no 0x) |
|
|
| Public-facing service URL (for Agent Card) |
Optional
Variable | Default | Description |
|
| Express server port |
|
| Node environment |
|
| Barretenberg CLI path |
|
| Nargo CLI path |
|
| Circuit artifacts directory |
| (GitHub raw URL) | Circuit artifacts download URL |
|
|
|
| — | Nitro Enclave CID (required when |
|
| Nitro Enclave port |
|
| Enable attestation verification |
| — | Operator wallet (required when payment enabled) |
|
| Price per proof (USD) |
| — | ERC-8004 Identity contract |
| — | ERC-8004 Reputation contract |
| — | Gemini API key for chat |
| — | OpenAI API key for chat |
| — | Phoenix OTLP endpoint for tracing |
|
| Agent version string |
Deployment (AWS Nitro Enclave)
proofport-ai deploys to AWS EC2 with Nitro Enclave support. Deployment uses blue-green slot switching for zero downtime.
Blue-Green Deployment
aws/deploy-blue-green.shTwo slots: blue (ports 4002/3200) and green (ports 4003/3201)
Active slot tracked in
/opt/proofport-ai/active-slotCaddy reload (not restart) switches traffic
In-flight request drain before switching (up to 660s for proof generation)
Automatic rollback if new container health check fails
Infrastructure
Caddy — Reverse proxy with HTTPS (Cloudflare Full SSL)
systemd — Services:
proofport-ai,proofport-ai-redis,proofport-ai-enclave,vsock-bridgeCloudWatch — Log driver
awslogs, 30-day retentionGitHub Actions —
deploy-ai-aws.ymlworkflow (NOTdeploy.ymlwhich is GCP)
Boot / Stop
aws/boot-active-slot.sh # Start active slot containers
aws/stop-active-slot.sh # Stop active slot containersTesting
npm test # Unit tests
npm run test:e2e # E2E against Docker stack
npm run test:watch # Watch modeA2A Testing (a2a-ui + Phoenix)
docker compose -f docker-compose.yml -f docker-compose.test.yml up --build -dService | URL | Purpose |
proofport-ai |
| Agent server |
a2a-ui |
| A2A web test UI |
Phoenix |
| Trace visualization |
Version Locks
Tool | Version |
bb (Barretenberg) |
|
nargo |
|
ethers |
|
@modelcontextprotocol/sdk |
|
Node.js | 20 LTS |
License
Apache 2.0
Available Tools
6 toolsgenerate_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.
RETURNS: Full ProofResult with proof bytes, public inputs, and timing information. Use verify_proof separately to verify on-chain.
| Name | Required | Description | Default |
|---|---|---|---|
| jwt | No | OIDC JWT token (id_token) for oidc_domain circuit | |
| scope | No | Scope string for nullifier derivation. Defaults to "proofport" if omitted. For oidc_domain circuit, this is the domain scope string. | |
| circuit | Yes | Which circuit to use | |
| provider | No | OIDC provider. "google" (default) for Google Workspace, "microsoft" for Microsoft 365. | |
| is_included | No | true = prove country IS in list, false = prove NOT in list. Required for coinbase_country circuit. | |
| country_list | No | ISO 3166-1 alpha-2 country codes. Required for coinbase_country circuit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It describes the tool as a single-call proof generator and mentions the return value, but does not disclose behavioral traits such as authentication requirements, potential side effects, error handling, or any prerequisites (e.g., user login). The description is adequate but lacks depth in behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a one-sentence summary, a usage guideline sentence, a bulleted circuit list, and a returns line. Each part is essential and front-loaded. No redundant phrases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (6 parameters, 3 circuits) and no output schema, the description is thorough. It explains the all-in-one nature, lists circuits with their required inputs, and specifies the return value and the need for separate verification via verify_proof. This covers all key aspects for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the baseline is 3. The description adds value by grouping parameters per circuit (e.g., 'Requires jwt and scope' for oidc_domain, 'Requires country_list and is_included' for coinbase_country) and noting defaults (scope defaults to 'proofport'). This provides contextual meaning beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it is an 'All-in-one ZK proof generation' and lists the three circuits: coinbase_kyc, coinbase_country, and oidc_domain. It explicitly distinguishes the tool from the step-by-step siblings (prepare_inputs, request_challenge, submit_proof), making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: '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.' This clearly tells the agent when to use this tool versus alternatives.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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. Computes signal hash, signs it with the attestation wallet, queries EAS for attestation data, builds Merkle proof, and returns all inputs needed for proof generation. Call this BEFORE request_challenge. For oidc_domain circuit, provide jwt and scope instead of Coinbase-specific parameters.
| Name | Required | Description | Default |
|---|---|---|---|
| jwt | No | OIDC JWT token (id_token) for oidc_domain circuit | |
| scope | No | Scope string for nullifier derivation. Defaults to "proofport" if omitted. For oidc_domain circuit, this is the domain scope string. | |
| circuit | Yes | Which circuit to use | |
| provider | No | OIDC provider. "google" (default) for Google Workspace, "microsoft" for Microsoft 365. | |
| is_included | No | true = prove country IS in list, false = prove NOT in list. Required for coinbase_country circuit. | |
| country_list | No | ISO 3166-1 alpha-2 country codes. Required for coinbase_country circuit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description discloses the multi-step process (signing, querying EAS, building Merkle proof) which implies non-trivial behavior. However, it does not mention side effects, idempotency, rate limits, or authentication requirements, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, well-structured paragraph front-loads the purpose ('Step 1'), then details actions, sequencing, and conditional parameters. Every sentence contributes essential information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, 3 circuit variants, and no output schema, the description covers the overall process, sequencing, and circuit-specific requirements. However, it lacks a description of the return value structure, which would be helpful for downstream use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with parameter descriptions, but the description adds value by explaining conditional usage (e.g., jwt/scope for oidc_domain, is_included/country_list for coinbase_country) and defaults like provider defaulting to 'google'. This reduces ambiguity beyond the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it is step 1 of a step-by-step flow, explicitly listing the actions (compute hash, sign, query EAS, build Merkle proof) and outputs (all inputs for proof generation). It distinguishes between circuit types (oidc_domain vs Coinbase-specific), making the tool's specific role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to call this tool BEFORE request_challenge, providing clear sequencing. Also specifies when to provide jwt/scope for oidc_domain circuit versus other parameters, giving contextual usage guidance for different circuits.
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 (after prepare_inputs): Request a challenge from the server. Sends circuit + inputs to POST /api/v1/prove. Server returns nonce and TEE key information. You MUST call prepare_inputs first to get the inputs parameter.
| Name | Required | Description | Default |
|---|---|---|---|
| inputs | Yes | Full ProveInputs object from prepare_inputs. Accepts a JSON string or a structured object. | |
| circuit | Yes | Which circuit to use |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It explains the network request and that the server returns nonce and TEE key information. Lacks details on side effects, error behavior, or authentication requirements, but covers the core interaction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler. Front-loaded with purpose and flow position. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (2 params, no output schema), the description is complete. It covers prerequisite, endpoint, input format, and server response. An agent can invoke this tool correctly with the given information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already describes both parameters with 100% coverage. The description adds value by clarifying that 'inputs' is the full ProveInputs object from prepare_inputs and accepts JSON string or object. This provides critical format and origin context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 a flow and requests a challenge from the server via a specific endpoint. It names the verb 'request' and the resource 'challenge', and positions itself relative to siblings like 'prepare_inputs' and 'generate_proof'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states it must be called after 'prepare_inputs' and specifies the endpoint. Provides clear sequencing but lacks explicit when-not-to-use scenarios or alternatives. However, for a step in a defined flow this is sufficient.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| inputs | Yes | Full ProveInputs object from prepare_inputs. Accepts a JSON string or a structured object. | |
| circuit | Yes | Which circuit to use |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and discloses execution duration (30-90 sec), internal circuit execution (Noir), and output type (UltraHonk proof). However, it omits error conditions, idempotency, and whether the operation is destructive or reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences. The first sentence front-loads the purpose and step, the second adds technical detail, and the third covers timing. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and missing annotations, the description does not detail the return format beyond 'UltraHonk proof', nor does it explicitly state prerequisites like the need for a challenge from request_challenge. While it mentions 'prepared inputs', the flow dependencies are implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by linking the 'inputs' parameter to the 'prepare_inputs' sibling tool ('Full ProveInputs object from prepare_inputs'), providing context beyond the schema for one parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as Step 3 of a flow, uses a specific verb ('submit prepared inputs'), and specifies the resource ('ZK proof'). It distinguishes from siblings like prepare_inputs (step 2) and verify_proof (step 5) by its position in the sequence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description positions the tool in a step-by-step flow ('Step 3') and mentions timing (30-90 sec), but does not explicitly state when to avoid it or contrast with siblings like generate_proof. Usage guidance is implied but not fully explicit.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes | Full result object from generate_proof — pass it directly without extracting fields |
TDQS
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.
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.
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.
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.
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.
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.
TDQS
Each tool has a distinct purpose: discovery, all-in-one generation, step-by-step generation (three sequential steps), and verification. The descriptions clearly differentiate generate_proof from the step-by-step trio, and the sequential tools are well-documented with ordering instructions, leaving no ambiguity.
All tool names use snake_case with a consistent verb_noun pattern (generate_proof, get_supported_circuits, prepare_inputs, request_challenge, submit_proof, verify_proof). The naming is predictable and follows a logical flow, enhancing usability.
Six tools is well-scoped for a ZK proof server. It covers essential operations: discovery, all-in-one generation, step-by-step generation, and verification. The count is neither too few (missing no critical features) nor too many (each tool is justified).
The tool surface covers the core workflow: discover circuits, generate proofs (both simple and step-by-step), and verify on-chain. One minor gap is the lack of proof history or status polling for asynchronous scenarios, but the synchronous step-by-step flow covers the main use case.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
A paid remote MCP for ZeroID, built to return verdicts, receipts, usage logs, and audit-ready JSON.
MCP server for verifying EUDI/Talao wallet data via OIDC4VP (pull) for AI agents.
Confidential compute and inference sold to agents over x402 USDC, plus an agent wallet over MCP.
Tenzro Network MCP server: wallet, identity, payments, inference, staking, bridges, verification.
Related MCP Servers
- AlicenseAqualityAmaintenanceMCP server for on-chain attestation and wallet trust profiles across 31 EVM chains and Solana. Privacy-preserving boolean verification, ECDSA-signed responses, compliance templates.271931MIT
- AlicenseAqualityDmaintenanceTrust intelligence MCP server for AI agents. 19 tools for identity stamps, reputation scoring (0-100), agent registry, forensic audit trails, ERC-8004 bridge, and A2A passports via x402 USDC micropayments.191Apache 2.0
- AlicenseNot gradedqualityDmaintenanceMCP Server for AI agent identity and authorization. Create, verify, and manage agent identities with trust scores and scoped authorization tokens.MIT
- AlicenseNot gradedqualityDmaintenanceAn 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.3901MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/zkproofport/proofport-ai'
If you have feedback or need assistance with the MCP directory API, please join our Discord server