arbitova-mcp-server
The arbitova-mcp-server enables AI agents to manage non-custodial USDC escrow payments with integrated AI arbitration on the Base blockchain.
Create Escrow (
arbitova_create_escrow): Lock USDC into the EscrowV1 smart contract, specifying seller, amount, delivery/review deadlines, and averificationURIdefining delivery criteria.Mark Delivered (
arbitova_mark_delivered): Sellers signal completion by submitting a stable public URL for the deliverable — hashed and stored on-chain.Confirm Delivery (
arbitova_confirm_delivery): Buyers confirm satisfactory delivery, releasing funds to the seller (minus a 0.5% protocol fee).Dispute a Delivery (
arbitova_dispute): Buyer or seller opens a dispute citing unmet criteria, triggering AI arbitration to resolve the payment.Cancel Undelivered Escrow (
arbitova_cancel_if_not_delivered): Buyer reclaims a full refund if the seller misses the delivery deadline.Escalate Expired Review (
arbitova_escalate_if_expired): Any address can permissionlessly escalate a stalledDELIVEREDescrow toDISPUTEDafter the review window expires.Get Escrow State (
arbitova_get_escrow): Query on-chain state including buyer/seller info, amount, deadlines, status (CREATED,DELIVERED,RELEASED,DISPUTED,RESOLVED,CANCELLED), and delivery hash.
Funds are held by the smart contract (non-custodially), and the protocol supports direct integration with AI agents (e.g., Claude, LangGraph, CrewAI) for trustless agent-to-agent payment settlement.
Integrates with Circle's USDC stablecoin on Base to facilitate non-custodial escrow payments.
Enables CrewAI agent crews to execute escrow-based transactions with on-chain settlement and arbitration.
Provides tools for building LangGraph-based agent workflows that include escrow creation, delivery, and dispute resolution using Arbitova.
Arbitova
Non-custodial USDC escrow + AI arbitration for agent-to-agent payments on Base.
Two agents lock USDC into a contract, one delivers, the other confirms or disputes, and a neutral AI arbiter resolves. Arbitova never holds the money — the contract does.
No API keys. No registration. No custody. Your Ethereum address is your identity.
Contract:
EscrowV1at0xA8a031bcaD2f840b451c19db8e43CEAF86a088fCon Base Sepolia — verified on Basescan, mainnet launching after auditSpec:
A2A-ESCROW-RFC-v0.1Machine-readable descriptor:
/.well-known/arbitova.jsonPer-case verdict dashboard: arbitova.com/verdicts
Integration paths: arbitova.com/integrate (raw contract / reference SDKs / agent-native)
Reference UI (non-canonical, for humans): arbitova.com/pay
15-minute tutorial:
docs/tutorials/15-min-paid-agent.md
Why this exists
Every A2A / agent-commerce spec in the wild — MCP, Google's A2A, ERC-7683, Coinbase's Agent Commerce — defines how agents talk. None of them define how money moves when the agents don't trust each other.
Arbitova is the missing settlement primitive:
Deterministic state machine.
createEscrow → markDelivered → {confirmDelivery | dispute → resolve | cancel}. No hidden branches, no admin override.No auto-release after timeout. Review windows expire into
DISPUTED, not into seller payout. Silence is safer than a wrong confirmation.Content-hash pinned on-chain. Sellers can't swap the delivery file after the buyer inspects.
Per-case verdict transparency. Every arbiter decision is a signed JSON blob; its
keccak256is stored on-chain. The full verdict history is queryable at/verdicts— no aggregation, no delay.
This is not a marketplace. There is no Arbitova account, no listing fee, no Pro tier. The protocol is the whole product.
Related MCP server: cardzero-mcp
Quick start — Node.js SDK
npm install @arbitova/sdk ethersimport { Arbitova } from '@arbitova/sdk';
const buyer = await Arbitova.fromPrivateKey({ privateKey: process.env.BUYER_PK });
const { escrowId, txHash } = await buyer.createEscrow({
seller: process.env.SELLER_ADDRESS,
amount: '5.00',
deliveryHours: 24,
reviewHours: 24,
verificationURI: 'https://example.com/spec.json',
});
console.log(`Escrow #${escrowId} locked — ${buyer.explorerTx(txHash)}`);Seller-side, arbiter-side, browser wallet integration: see packages/sdk-js/README.md.
Quick start — Python SDK
pip install "arbitova[path_b]"from arbitova import path_b
result = path_b.arbitova_create_escrow(
seller="0x...",
amount=5.00,
verification_uri="https://example.com/spec.json",
)
print(result)Quick start — Claude / any MCP client
{
"mcpServers": {
"arbitova": {
"command": "npx",
"args": ["-y", "@arbitova/mcp-server"],
"env": {
"ARBITOVA_RPC_URL": "https://sepolia.base.org",
"ARBITOVA_ESCROW_ADDRESS": "0xA8a031bcaD2f840b451c19db8e43CEAF86a088fC",
"ARBITOVA_USDC_ADDRESS": "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
"ARBITOVA_AGENT_PRIVATE_KEY": "0x..."
}
}
}
}Six tools: arbitova_create_escrow, arbitova_mark_delivered, arbitova_confirm_delivery, arbitova_dispute, arbitova_cancel_if_not_delivered, arbitova_get_escrow. All sign locally via ethers v6. Your private key never leaves the process.
Omit ARBITOVA_AGENT_PRIVATE_KEY for read-only introspection mode (useful for observability).
Lifecycle
┌──────────────────┐
│ CREATED │ buyer locked USDC
└────────┬─────────┘
│
▼ seller.markDelivered()
┌──────────────────┐
│ DELIVERED │ deliveryHash on-chain
└────────┬─────────┘
│
buyer.confirmDelivery()│ │ buyer.dispute()
│ │ or seller.dispute()
▼ ▼
┌─────────────┐ ┌──────────┐
│ RELEASED │ │ DISPUTED │ waiting for arbiter
└─────────────┘ └────┬─────┘
│ arbiter.resolve(bps split + verdictHash)
▼
┌──────────┐
│ RESOLVED │
└──────────┘Two terminal states not drawn: CANCELLED (buyer calls cancelIfNotDelivered after delivery window) and auto-escalation into DISPUTED if the review window expires without confirmation.
Framework reference agents
Three end-to-end A2A demos on Base Sepolia with a live AI arbiter:
Claude Agent SDK — in-process MCP tools
LangGraph — ReAct agent, buyer + seller + arbiter
CrewAI — Agent + Task + Crew
Each demo runs the full CREATED → DELIVERED → CONFIRMED (or DISPUTED → RESOLVED) flow with real on-chain transactions.
Packages
Package | Purpose |
Node.js / browser SDK ( | |
Python SDK, install with | |
MCP server (6 on-chain tools) for Claude Desktop, Claude Code, any MCP client |
Each ships the same six-entrypoint surface so an agent using the Python SDK can settle with an agent using the MCP server — they're hitting the same contract.
Fees
When | Fee | Paid by |
| 0.5% | deducted from seller payout |
Arbiter resolves a dispute | 2% | split per arbiter verdict |
Fees accrue in the contract. The protocol runs on them; there is no subscription.
Networks
Network | Status | Contract |
Base Sepolia | live, real Circle USDC |
|
Base mainnet | pending audit + multisig arbiter | TBA |
Watch the Dev Log for mainnet launch.
Legacy (Path A)
v2.x of the SDKs and v3.4.0 of the MCP server were a custodial HTTP client against api.arbitova.com. That architecture had four structural problems (DB-vs-onchain drift, custody wallet gas, single ADMIN_KEY, single WALLET_ENCRYPTION_KEY point of failure) and was deprecated in favor of Path B — the non-custodial on-chain design described above.
Migration for SDK users:
sdk/MIGRATION_PATH_A_TO_B.mdMigration for MCP users:
mcp-server/MIGRATION.md
Old packages remain on npm/PyPI but are deprecated.
License
MIT
Available Tools
7 toolsarbitova_cancel_if_not_deliveredA
Buyer cancels an escrow after the delivery deadline has passed and the seller has not marked delivery. Full USDC refund to buyer. Only callable by the buyer, only after deliveryDeadline has elapsed, and only when escrow is still in CREATED state. Call arbitova_get_escrow first to verify the deadline has passed and status is CREATED before calling this.
| Name | Required | Description | Default |
|---|---|---|---|
| escrowId | Yes | The escrow ID to cancel |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description fully discloses the action (cancellation with refund), preconditions (caller, time, state), and a recommendation to check status. It could mention error behavior if conditions not met, but overall transparency 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with three sentences: action, conditions, and advice. It is front-loaded with the primary action, and every sentence adds necessary context 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?
For a simple cancellation tool with one parameter and no output schema, the description provides all necessary context: behavior, preconditions, and a recommended prior step. No critical information is missing for an agent to use it 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?
The input schema already covers the single parameter (escrowId) with a clear description. The tool description adds no additional parameter-level detail, so baseline score of 3 is appropriate given 100% schema 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?
The description clearly states the tool cancels an escrow when delivery is not marked after the deadline, refunding the buyer in USDC. It uses specific verbs and resources, distinguishing it from sibling tools like dispute or escalate.
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 explicitly specifies when to use the tool: only by the buyer, after deliveryDeadline has passed, and when escrow is in CREATED state. It also advises to verify conditions via get_escrow first, providing practical guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
arbitova_confirm_deliveryA
Confirm that the seller has delivered and the output meets ALL criteria in the escrow's verificationURI. ONLY call after you have: (1) fetched the delivery payload, (2) fetched and parsed the verificationURI criteria document, (3) compared the payload against EVERY criterion, (4) are fully confident every criterion is satisfied. If anything is missing, wrong, ambiguous, incomplete, or the seller did not deliver the agreed output — DO NOT call this. Call arbitova_dispute instead with a specific reason citing the failed criterion. Silence is safer than a wrong confirmation: if you do not confirm within the review window, funds auto-escalate to AI arbitration, which protects the buyer by independently evaluating delivery.
| Name | Required | Description | Default |
|---|---|---|---|
| escrowId | Yes | The escrow ID to confirm delivery for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Discloses consequence of wrong confirmation (funds auto-escalate to arbitration) and that silence is safer. Lacks explicit mention of idempotency or reversibility, but sufficient for safety-critical action.
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?
Description is longer than average but each sentence adds value: purpose, prerequisites, alternatives, consequences. Front-loaded with main action. Could condense the list of prerequisites slightly, but no wordiness.
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 complexity (high-stakes confirmation with verification criteria), the description thoroughly covers preconditions, alternatives, and consequences of misuse. No output schema, but return value is not critical for decision-making.
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?
Only one parameter (escrowId) with schema description. Description adds context (confirms delivery for that escrow) but does not materially extend beyond schema. Schema coverage is 100%, so baseline 3 is appropriate.
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?
Specific verb ('confirm') and resource ('delivery') with clear condition (output meets verificationURI criteria). Distinguishes from sibling arbitova_dispute by stating when not to call.
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 lists 4 prerequisites before calling, provides clear when-not-to-use (any missing/wrong), and names alternative tool (arbitova_dispute). Also advises on escalation path if uncertain.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
arbitova_create_escrowA
Buyer locks USDC into the Arbitova EscrowV1 smart contract. Calls USDC.approve() then createEscrow() on-chain. Requires USDC balance >= amount. deliveryWindowHours = how long the seller has to deliver (default 24). reviewWindowHours = how long the buyer has to verify after delivery is marked (default 24). verificationURI must point to a publicly fetchable JSON document listing every criterion the delivery will be checked against. If the review window expires without confirmation or dispute, funds auto-escalate to arbitration. Silence protects the buyer — you do NOT need to confirm promptly.
| Name | Required | Description | Default |
|---|---|---|---|
| seller | Yes | Seller Ethereum address (0x-prefixed) | |
| amount | Yes | USDC amount to lock (human-readable, e.g. 50 for 50 USDC) | |
| deliveryWindowHours | No | Hours the seller has to deliver (default 24) | |
| reviewWindowHours | No | Hours the buyer has to review after delivery (default 24) | |
| verificationURI | Yes | Publicly fetchable URL of a JSON document listing every delivery criterion (e.g. {"criteria": ["word count >= 1000", "includes executive summary"]}) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility. It details on-chain steps (approve, createEscrow), prerequisites (USDC balance), and consequences (auto-escalation on review expiry). It also clarifies that silence protects the buyer, which is a non-obvious behavioral trait.
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 one coherent paragraph without wasted words. It front-loads the purpose and flows logically through parameters and consequences. Could be slightly more structured (e.g., bullet points) but remains efficient.
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 complexity (on-chain escrow creation) and lack of output schema, the description completely covers the process, prerequisites, and outcomes. Sibling tools handle subsequent actions, so this tool's context is sufficiently self-contained.
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 baseline is 3. The description adds value by explaining the practical impact of deliveryWindowHours and reviewWindowHours (auto-escalation), and emphasizes that verificationURI must be publicly fetchable, which is not fully captured in the schema's description.
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 verb ('locks USDC') and resource ('Arbitova EscrowV1 smart contract'), and it distinguishes itself from sibling tools that handle cancellation, confirmation, dispute, etc. It is specific about the buyer's action.
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 explains when to use (buyer initiating escrow) and provides default values for windows. However, it does not explicitly exclude other scenarios or mention alternatives among siblings, though the action is unique enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
arbitova_disputeA
Open a dispute when delivery is missing, incorrect, incomplete, or violates the verification criteria. Disputes trigger AI arbitration which independently evaluates the delivery and can split funds fairly. Call this whenever arbitova_confirm_delivery feels uncertain — when in doubt, dispute. The reason field MUST cite specific criteria from verificationURI that were not met, e.g. "Delivery at [URI] is missing criterion 3: word count is 400 but spec requires >= 1000." Either the buyer OR the seller can open a dispute.
| Name | Required | Description | Default |
|---|---|---|---|
| escrowId | Yes | The escrow ID to dispute | |
| reason | Yes | Specific reason citing which verification criteria were not met. Include the criterion text and what was observed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, description adds valuable context: disputes trigger AI arbitration that evaluates delivery and can split funds, and reason must cite criteria. Lacks details on side effects like reversibility.
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?
Concise, front-loaded with purpose, no unnecessary words, efficient communication.
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 simple parameters and no output schema, description covers purpose, usage, parameter behavior, and the AI arbitration mechanism, leaving no major gaps.
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?
Adds meaning beyond schema: reason must cite specific criteria from verificationURI with an example, clarifying format and requirements.
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 opens a dispute for delivery issues, specifies triggers like missing or incorrect delivery, and distinguishes from siblings like confirm_delivery.
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 advises calling when arbitova_confirm_delivery feels uncertain, and mentions both buyer or seller can open, providing clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
arbitova_escalate_if_expiredA
Permissionlessly escalate a DELIVERED escrow to DISPUTED after the review window has expired. Any address can call this — buyer, seller, or an independent watcher. Use when the buyer went silent past reviewDeadline: this unblocks the seller and routes the escrow into arbitration instead of leaving funds stuck. Only valid when status is DELIVERED and block.timestamp > reviewDeadline. Call arbitova_get_escrow first to verify status and deadline before calling this.
| Name | Required | Description | Default |
|---|---|---|---|
| escrowId | Yes | The escrow ID to escalate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description fully carries the burden. It discloses permissionless access, required status (DELIVERED), time condition (block.timestamp > reviewDeadline), and effect (status change to DISPUTED). No contradictions.
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?
Four sentences, front-loaded with action and constraints, every sentence adds value. No redundancy or unnecessary 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 the complexity of the tool (on-chain state change), the description covers preconditions, permissible callers, consequences, and a prerequisite check. No output schema, but the state change is clearly explained.
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?
Input schema has 100% coverage with one parameter described. The description adds context about the parameter's role (escalate escrow) and suggests verifying with another function, but the meaning is already clear from 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 action: escalate a DELIVERED escrow to DISPUTED after the review window expires. It distinguishes from siblings by specifying the condition of expiration, separating it from other operations like cancel, confirm, or dispute.
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 when to use (buyer went silent past reviewDeadline), who can call (any address), and what it achieves (unblocks seller, routes to arbitration). Also advises calling arbitova_get_escrow first to verify status and deadline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
arbitova_get_escrowA
Fetch the current on-chain state of an escrow: buyer, seller, amount, deadlines, status, verificationURI, and deliveryHash. Use this to check whether delivery has been marked before fetching the payload, and to verify the reviewDeadline before deciding to confirm or dispute. Status values: CREATED (awaiting delivery), DELIVERED (seller marked done, review window open), RELEASED (funds released to seller), DISPUTED (in arbitration), RESOLVED (arbiter resolved), CANCELLED.
| Name | Required | Description | Default |
|---|---|---|---|
| escrowId | Yes | The escrow ID to query |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but the description fully describes the returned data and its meaning. It implies a read-only operation without side effects. A higher score would require explicit statement of read-only nature.
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 concise sentences plus a list of statuses. Front-loaded with purpose, no redundant information. Every sentence adds value.
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?
For a simple fetch tool with one parameter and no output schema, the description provides all necessary context: what fields are returned, status meanings, and usage guidance. It is 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?
Input schema has 100% coverage with one parameter. The description does not add extra meaning beyond what the schema provides, meeting the baseline for high 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?
The description specifies the verb 'Fetch' and resource 'on-chain state of an escrow' with a clear list of fields. It distinguishes itself from sibling action tools (cancel, confirm, dispute) by being a read-only query.
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 when to use: 'check whether delivery has been marked before fetching the payload' and 'verify the reviewDeadline before deciding to confirm or dispute'. Provides decision-making context and references sibling tools implicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
arbitova_mark_deliveredA
Called by the SELLER after completing the work and uploading the deliverable to a stable URL. deliveryPayloadURI must point to the completed, publicly fetchable deliverable — the contract hashes this URI on-chain. Do NOT call before work is actually done. Do NOT use a temporary or expiring URL. The arbiter will fetch this URI during dispute resolution — a broken or mismatched URL counts as non-delivery. Before calling: complete all work to spec, upload to a stable URL (IPFS or persistent storage), and verify the content matches every criterion in verificationURI.
| Name | Required | Description | Default |
|---|---|---|---|
| escrowId | Yes | The escrow ID returned by arbitova_create_escrow | |
| deliveryPayloadURI | Yes | Stable public URL pointing to the completed deliverable |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Discloses that contract hashes URI on-chain and arbiter fetches it during disputes. Warns about broken URL counting as non-delivery. Missing details on return value or permissions beyond seller.
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?
Concise but slightly long; every sentence adds value. Well-structured: purpose first, then constraints and prerequisites. No fluff, but could be slightly tighter.
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?
Complete for a simple action tool. Covers preconditions, stability, and dispute resolution. Missing return behavior or confirmation after calling, but no output schema exists to explain. References sibling tool create_escrow.
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?
Adds significant meaning beyond schema: explains deliveryPayloadURI must be stable, publicly fetchable, and on-chain hashed. Describes escrowId as from create_escrow. Schema coverage is 100%, but description enriches each 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?
Clearly states the tool is called by the seller after completing work and uploading a deliverable. Identifies the actor (seller) and context, distinguishing from sibling tools like confirm_delivery (buyer action).
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 when to call (after work done, upload stable URL) and when NOT to call (before work done, temporary URL). Provides prerequisites and warns about consequences of broken URL.
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.
7 tool updates
v0.1.0- First observed
arbitova_cancel_if_not_delivered - First observed
arbitova_confirm_delivery - First observed
arbitova_create_escrow - First observed
arbitova_dispute - First observed
arbitova_escalate_if_expired - First observed
arbitova_get_escrow - First observed
arbitova_mark_delivered
TDQS
Scored across 7 tools
Each tool targets a unique action in the escrow lifecycle (create, get, mark delivered, confirm, cancel, dispute, escalate). No two tools have overlapping purposes, and descriptions clarify exactly when each should be used.
All tools follow the pattern 'arbitova_<verb>_<condition>', using snake_case consistently. The names are descriptive and predictable, making it easy to infer the tool's action from its name.
7 tools is an ideal size for an escrow management server. Each tool serves a necessary function in the lifecycle without unnecessary redundancy or bloat.
The tool set covers the full escrow lifecycle: creation, status retrieval, delivery marking, confirmation/cancellation, dispute opening, and escalation. There are no obvious gaps that would hinder an agent from managing an escrow end-to-end.
Maintenance
Related MCP Connectors
Agent-to-agent escrow on Base. Post quests with ETH/USDC bounties and settle on-chain.
Escrow protection for agent payments on Base — USDC held in smart contract until job completion.
Escrow protection for agent payments on Base — USDC held in smart contract until job completion.
Trust-minimized USDC escrow for autonomous agent transactions
Related MCP Servers
- FlicenseAqualityNot gradedmaintenanceTrust infrastructure for AI agents on Base. DEX Spread Oracle (live Uniswap V3 prices), on-chain escrow, insurance pool, and collective knowledge base. 7 smart contracts. Pay-per-query via x402 micropayments in USDC.6-
- AlicenseAqualityDmaintenanceGives AI agents a smart-contract wallet on Base (USDC) with 10 stdio tools: create wallets, send USDC payments, pay x402-protected HTTP resources, and run ERC-8183 escrow Jobs for A2A service delivery.106 npmMIT
- FlicenseNot gradedqualityBmaintenanceSettlement rails for AI labor — USDC escrow on Base Mainnet, 1% protocol fee, designed for autonomous agents. 10 MCP tools covering the full escrow lifecycle: * Quoting calldata for create-intent, submit-proof, release-funds (broadcast gated) * Single-call x402 payment binding (replaces the 5-step x402 dance with one HMAC-signed POST) * Server-side reputation from on-chain event scan * Li-
- AlicenseAqualityAmaintenancePrivate escrow for AI agent work on Beam mainnet an agent locks payment, the worker locks collateral, and delivery settles on hash match or review, with M of N arbitrator voting and slashable worker bonds as the dispute backstop. 22 tools cover the full contract lifecycle, and dispute voting is deliberately not an agent tool, so an agent can never rule in its own favour.26MIT