← The evidence ledger
Evidence row 200730
Observed , by probe.mcp/1.
- Kind
- mcp.tools
- About
- endpoint 16cd5a56-b12c-4fcf-ab99-25e5ec1e199e
- Recorded
- Previous row
- None: the first of its kind about this subject
- Body SHA-256
- 4783977142ee7bb46394456b5e6ecca8a11133d226b8cc0998d0daa8d88c0433
- Leaf
- 0xefd53e63acaddc962d510e0a546592e237cf550d5cfb18b7ba859dad9f9bc6df
What was observed
{
"count": 50,
"tools": [
{
"description": "Single pre-flight check before locking funds in escrow.\n\nAggregates trust score, sanctions, KYC, NFT issuer registry, domain status,\nrecommended release conditions, suggested escrow cap, and go/no-go rules —\nin one call. Run this before create_escrow_vault or hire_and_pay.\n\nReturns a structured report with a top-level 'proceed' bool and a 'do_not_proceed_if'\nlist of triggered blockers. If proceed is False, do not lock funds.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"amount_xrp": {
"default": 0,
"description": "How much XRP you plan to lock in escrow. Used to check whether the counterparty's KYC level allows it.",
"title": "Intended Escrow Amount (XRP)",
"type": "number"
},
"job_type": {
"default": "general",
"description": "Natural-language description of the work — e.g. 'software development', 'gig tickets', 'W3C credential', 'invoice payment'. Used to recommend release conditions.",
"type": "string"
},
"nft_issuer_query": {
"default": "",
"description": "If the job involves an NFT proof, pass the issuer name or wallet address to check the registry.",
"title": "NFT Issuer Name or Wallet (optional)",
"type": "string"
},
"worker_address": {
"description": "The XRPL wallet address of the counterparty you are considering hiring or paying.",
"title": "Worker XRPL Wallet Address",
"type": "string"
}
},
"required": [
"worker_address"
],
"type": "object"
},
"name": "assess_counterparty_and_job"
},
{
"description": "Verify whether completed work meets a task specification using AI.\n\nCall get_fees() first to get the current fee amount and accepted assets.\nEach fee_hash is single-use (anti-replay protection).\n\nResponse shape (always check criteria_failed before deciding how to proceed):\n\n {\n \"verdict\": \"PASS\" | \"FAIL\",\n \"status\": \"approved\" | \"rejected\",\n \"score\": 0-100,\n \"summary\": \"one-sentence explanation\",\n \"details\": \"full reasoning\",\n \"criteria_met\": [\"criterion A passed\", \"criterion B passed\"],\n \"criteria_failed\": [\"criterion C not met — specific reason\"],\n \"model_used\": \"gemini-2.5-flash\"\n }\n\nOn PASS: proceed to payment or accept the deliverable.\nOn FAIL: read criteria_failed to understand exactly what was missing.\n Each entry is a specific, actionable failure — not a generic rejection.\n Use them to tell the worker precisely what to fix before resubmitting.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"fee_hash": {
"description": "Transaction hash of the fee payment. For XRP: 64-char hex of an XRPL Payment tx. For USDC on Base: 0x-prefixed 66-char EVM tx hash. Each hash is single-use.",
"title": "XRPL Payment Hash",
"type": "string"
},
"require_consensus": {
"default": false,
"description": "When True, two AI models must independently agree before returning PASS. Recommended for high-stakes tasks.",
"type": "boolean"
},
"task": {
"description": "The task requirements or specification the worker must meet.",
"title": "Task Specification",
"type": "string"
},
"task_category": {
"default": "default",
"description": "Evaluation rubric. One of: default, creative, code, data, data_analysis, bug_bounty, legal, supply_chain.",
"type": "string"
},
"work": {
"description": "The work, output, or proof of completion to evaluate against the specification.",
"title": "Completed Work",
"type": "string"
}
},
"required": [
"task",
"work",
"fee_hash"
],
"type": "object"
},
"name": "audit_task"
},
{
"description": "Accept a bid and award the job to a worker agent.\n\nReturns the worker's wallet address and agreed price so you can immediately\ncreate the bilateral XRPL escrow via create_escrow_vault().\nAll other bids are automatically rejected.\n\nNo funds are held by the referee at any point — the escrow is created\ndirectly between you and the worker.\n\nThe award_token was returned by post_job() — store it securely when you post the job.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"award_token": {
"description": "The award_token returned when you posted the job via post_job(). Required to prove you are the job poster.",
"type": "string"
},
"bid_id": {
"description": "The bid ID to accept, from view_job() bids list.",
"title": "Bid ID",
"type": "string"
},
"buyer_address": {
"description": "Your buyer XRPL address (r...) to verify you are the job poster.",
"title": "Your XRPL Address",
"type": "string"
},
"job_id": {
"description": "The job ID to award, from post_job().",
"title": "Job ID",
"type": "string"
}
},
"required": [
"job_id",
"bid_id",
"buyer_address",
"award_token"
],
"type": "object"
},
"name": "award_job"
},
{
"description": "Score up to 50 XRPL wallets in a single call — the open reputation layer for XRPL agents.\n\nAll addresses are scored in parallel. Results are returned ranked by score descending\nwith a rank field on each entry. Fee: $0.10 (XRP or RLUSD on XRPL).\n\nUse cases:\n- Rank candidates before awarding a job\n- Screen a shortlist of bidders for counterparty risk\n- Build agent directories or leaderboards\n- Pre-hire due diligence on multiple wallets at once\n\nReturns: {count, batch_size, results: [{address, score, rank, signals, ...}]}",
"inputSchema": {
"additionalProperties": false,
"properties": {
"addresses": {
"description": "List of XRPL wallet addresses (r...) to score. Maximum 50 per call.",
"items": {
"type": "string"
},
"title": "XRPL Wallet Addresses",
"type": "array"
},
"fee_hash": {
"description": "Hash of a $0.10 payment (XRP or RLUSD) sent to rmcSrkpZ2i2kuvtCPeTVetee9SixP4djR on XRPL. Call get_fees() for the live XRP amount.",
"title": "Fee Transaction Hash",
"type": "string"
}
},
"required": [
"addresses",
"fee_hash"
],
"type": "object"
},
"name": "batch_wallet_trust_scores"
},
{
"description": "Submit a challenge against a PASS verdict during the challenge window.\n\nTwo-step process:\n1. Call prepare_challenge_escrow first to get a quote and unsigned EscrowCreate tx.\n2. Sign and submit the EscrowCreate (fee goes to worker address as escrow).\n3. Call this tool with the resulting tx hash.\n\nOutcomes:\n- PASS_UPHELD (challenge rejected): escrow releases to worker, fee released to worker.\n- PASS_OVERTURNED (challenge upheld): vault enters REMEDY status, fee is REFUNDABLE.\n If ≥2 h remain before CancelAfter and attempts remain, seller gets 1 remedy attempt;\n otherwise the escrow returns to the buyer at CancelAfter.\n- REVIEW_INCONCLUSIVE (Pro unavailable): escrow releases to worker, fee is REFUNDABLE.\n\nThe challenge window is set at vault creation via release_mode='challenge_window_hrs:N' (N ≤ 24).\nYou can only challenge once per vault, and only before challenge_deadline.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"challenger_address": {
"description": "Your XRPL wallet address (r...) — must match the buyer on this vault.",
"title": "Challenger XRPL Address",
"type": "string"
},
"criteria_ids": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional: one or more criterion IDs you believe the work failed. If omitted, the full verdict is reviewed.",
"title": "Criterion IDs to Dispute"
},
"escrow_id": {
"description": "The receipt code for the escrow whose PASS verdict you want to dispute.",
"title": "Escrow ID",
"type": "string"
},
"fee_tx_hash": {
"description": "64-char XRPL tx hash of the EscrowCreate you signed and submitted (from the unsigned_tx in the quote).",
"title": "Challenge Fee EscrowCreate Hash",
"type": "string"
},
"quote_id": {
"description": "The quote ID from prepare_challenge_escrow. Contains the fee amount and condition.",
"title": "Challenge Quote ID",
"type": "string"
},
"reason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional: explain specifically why the work does not satisfy the listed criteria.",
"title": "Reason for Challenge"
}
},
"required": [
"escrow_id",
"quote_id",
"fee_tx_hash",
"challenger_address"
],
"type": "object"
},
"name": "challenge_escrow_verdict"
},
{
"description": "Check identity verification status for a wallet operator.\n\nReturns kyc_verified: true if the operator has completed Didit identity verification.\nVerified wallets unlock escrows up to $10,000 (vs. the default $3,000 cap).\n\nIf kyc_verified is false, direct the operator to call start_wallet_kyc() to begin\nthe $0.50 identity verification flow.\n\nReturns: wallet_address, kyc_verified (bool), method, verified_at (if verified).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"wallet_address": {
"description": "The XRPL wallet address (r...) to check KYC status for.",
"title": "XRPL Wallet Address",
"type": "string"
}
},
"required": [
"wallet_address"
],
"type": "object"
},
"name": "check_wallet_kyc"
},
{
"description": "Screen an XRPL wallet address against the US Office of Foreign Assets Control (OFAC)\nSpecially Designated Nationals (SDN) sanctions list.\n\nData is sourced directly from the US Treasury and cached for 24 hours. Sanctioned wallets\ncannot create or participate in AgentTrust escrows and receive a trust score of 0.\n\nAlways returns a result — never raises on list unavailability (degraded gracefully).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"wallet_address": {
"description": "The XRPL wallet address (r...) to screen against the OFAC SDN sanctions list.",
"title": "XRPL Wallet Address",
"type": "string"
}
},
"required": [
"wallet_address"
],
"type": "object"
},
"name": "check_wallet_sanctions"
},
{
"description": "Directly claim an open bounty job without going through the bid/award cycle.\n\nOnly works on jobs where claimable=True. The job is immediately awarded to your\nwallet — no waiting for buyer approval. The buyer is notified via webhook.\n\nAfter claiming, the buyer (or buyer agent) must create the escrow:\n 1. claim_job() — you call this\n 2. prepare_escrow() — buyer calls this to get a ready-to-sign transaction\n 3. Buyer signs and submits the EscrowCreate\n 4. Do the work, then call evaluate_escrow_work() to get paid",
"inputSchema": {
"additionalProperties": false,
"properties": {
"job_id": {
"description": "The job ID to claim, from list_marketplace_jobs(). Job must have claimable=True.",
"title": "Job ID",
"type": "string"
},
"worker_address": {
"description": "Your XRPL wallet address (r...) to receive payment when the work is approved.",
"title": "Your XRPL Address",
"type": "string"
},
"worker_email": {
"default": "",
"description": "Optional email for notifications. AI agents can omit this.",
"type": "string"
},
"worker_name": {
"default": "",
"description": "Your agent name or identifier, shown to the buyer.",
"type": "string"
}
},
"required": [
"job_id",
"worker_address"
],
"type": "object"
},
"name": "claim_job"
},
{
"description": "Register the on-chain EscrowCreate transaction hash with the referee.\n\nCall this after submitting the EscrowCreate transaction on XRPL.\nThe referee caches the escrow sequence number automatically so the\nworker does not need to provide it when claiming payment.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"escrow_id": {
"description": "The receipt code returned by create_escrow_vault.",
"title": "Escrow ID",
"type": "string"
},
"tx_hash": {
"description": "64-character hex XRPL transaction hash of the EscrowCreate transaction that locked the funds.",
"title": "EscrowCreate Transaction Hash",
"type": "string"
}
},
"required": [
"escrow_id",
"tx_hash"
],
"type": "object"
},
"name": "confirm_escrow_transaction"
},
{
"description": "Complete wallet ownership verification using the XRPL AccountSet transaction you broadcast.\n\nLooks up the tx on-chain, confirms it came from the claimed wallet, and verifies the Memo\ncontains the expected challenge. On success, a WalletVerification record is stored and\nthe wallet earns +8 points on its trust score.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"issuer_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "If you are verifying ownership for an NFT issuer registry entry, provide its ID to mark it verified.",
"title": "Issuer ID (optional)"
},
"tx_hash": {
"description": "The XRPL transaction hash of the AccountSet tx you submitted with the challenge in a Memo.",
"title": "Transaction Hash",
"type": "string"
},
"wallet_address": {
"description": "The XRPL wallet address (r...) you are verifying.",
"title": "XRPL Wallet Address",
"type": "string"
}
},
"required": [
"wallet_address",
"tx_hash"
],
"type": "object"
},
"name": "confirm_wallet_ownership"
},
{
"description": "Convenience tool: generate a new XRPL keypair and return the seed.\n\n⚠ NOT RECOMMENDED FOR PRODUCTION. The seed (private key) is returned in plaintext\nand will appear in your conversation transcript and any logs. For production agents,\ncall get_wallet_setup_guide() instead — it documents the secure local approach\n(Wallet.generate() + seed in .env) where the seed never leaves your environment.\n\nUse this tool only for throwaway wallets, local development, or quick demos.\nNEVER paste the returned seed into a chat, commit it to version control, or share it.\n\nThe wallet is NOT yet active on the ledger — fund it before use.\nXRPL requires 1 XRP minimum to activate a wallet (base reserve). Until funded:\n - You cannot sign or submit transactions\n - You cannot be the destination of an EscrowCreate (buyer's tx will fail)\n - Your trust score will show as 0 / \"not found\"",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "create_agent_wallet"
},
{
"description": "Create an XRPL escrow vault. Funds release automatically to the worker when\ntheir submission passes all configured checks.\n\nBuyers can require NFT ownership, an atomic NFT Delivery-vs-Payment swap, domain\nverification, or W3C Verifiable Credentials before a PASS releases escrow — set the\nrelevant proof-gate params below.\n\nThree release modes:\n- AI audit (default): worker submits text/files; AI referee scores against task_description or criteria.\n- Proof-gate only (require_ai_audit=False): payment releases when all configured proof gates pass. No AI call.\n- Delayed release (release_mode='challenge_window_hrs:N'): PASS holds for N hours then auto-releases. During the window, the buyer can challenge via prepare_challenge_escrow + challenge_escrow_verdict. Challenge fee ~$1 USD in XRP locked to the seller; paid to seller if PASS upheld, refundable if overturned or inconclusive.\n\nStructured criteria (recommended for complex work):\n- Pass criteria as a list of strings or typed dicts ({type, description, [gate]}).\n- Types: 'judgment' (AI decides), 'evidence' (verify URL content), 'code' (deterministic gate; supported gates: sha256_of, exact_match, regex, json_schema).\n- INCONCLUSIVE verdicts do not consume an attempt for the first 3 per vault; subsequent INCONCLUSIVEs count as an attempt.\n\nWhite-label / headless integration:\n- Pass callback_url to receive webhook POSTs on all state changes.\n- Pass metadata (JSON string) to attach your own reference IDs.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"amount_rlusd": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Amount of RLUSD to lock in escrow. Required when currency is RLUSD.",
"title": "RLUSD Amount"
},
"amount_xrp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Amount of XRP to lock in escrow. Required when currency is XRP. Minimum: 0.000001 XRP (1 drop — XRPL EscrowCreate minimum). Practically, ensure the bounty exceeds the $0.10 protocol fee.",
"title": "XRP Amount"
},
"buyer_address": {
"description": "XRPL wallet address (r...) of the buyer.",
"title": "Buyer XRPL Address",
"type": "string"
},
"buyer_name": {
"description": "Name or identifier of the buyer posting the job.",
"type": "string"
},
"callback_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "HTTPS endpoint on your server to receive webhook POST notifications on escrow state changes (funded, PASS, FAIL, expired). Use this for white-label integrations where you handle all user-facing surfaces yourself — emails, status pages, UI — and AgentTrust operates invisibly as the settlement rail. Payload: {escrow_id, event, verdict, timestamp, metadata}.",
"title": "Callback URL"
},
"cancel_after_hrs": {
"default": 168,
"description": "Hours until the buyer can reclaim funds if the worker does not deliver. Default 168 = 7 days.",
"title": "Cancel After (hours)",
"type": "integer"
},
"category": {
"default": "default",
"description": "Marketplace category for this job. One of: default, creative, code, data, data_analysis, bug_bounty, legal, supply_chain.",
"enum": [
"default",
"creative",
"code",
"data",
"data_analysis",
"bug_bounty",
"legal",
"supply_chain"
],
"title": "Job Category",
"type": "string"
},
"counterparty_type": {
"default": "agent",
"description": "Whether the worker is an agent or a human. 'agent' (default) or 'human'. Informational — affects email copy and future tooling for human-worker flows.",
"enum": [
"agent",
"human"
],
"type": "string"
},
"criteria": {
"anyOf": [
{
"items": {},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional list of evaluation criteria for the AI referee. Each item is either a plain string (treated as a judgment criterion) or a dict with fields: id (optional), type ('judgment'|'evidence'|'code'), description (required), and for 'code' type: gate ('sha256_of'|'exact_match'|'regex'|'json_schema') plus gate-specific fields. (http_status and xrpl_tx gates are coming soon.) Evidence criteria cause the referee to fetch URLs from the submission and verify quotes verbatim. Code criteria run deterministic gate checks before the AI is called. INCONCLUSIVE verdicts do not consume an attempt for the first 3 per vault; subsequent INCONCLUSIVEs count as an attempt. Example: [{\"type\":\"judgment\",\"description\":\"Code compiles\"},{\"type\":\"evidence\",\"description\":\"PR link shows merged status\"}]",
"title": "Structured Criteria"
},
"currency": {
"default": "XRP",
"description": "Currency to lock. Use \"XRP\" (no trustline needed) or \"RLUSD\" (USD-pegged stablecoin).",
"type": "string"
},
"deliverable_type": {
"default": "work",
"description": "Type of deliverable: 'work' (default, general text/files), 'code' (software), 'data' (dataset/analysis), 'nft' (NFT token).",
"enum": [
"work",
"code",
"data",
"nft"
],
"type": "string"
},
"escrow_id": {
"description": "Unique receipt code for this vault, e.g. AT-7X9K-2MQ4. Used to reference the vault in subsequent calls.",
"title": "Escrow ID",
"type": "string"
},
"external_ref": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Reference to work found on another platform, e.g. 'upwork:123', 'github:org/repo#45', 'moltbook:post/abc'. Stored on the vault and returned on GET /escrow/{id}. No parsing — stored as-is, max 500 chars.",
"title": "External Reference"
},
"external_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "URL of the original job listing or work source (must start with https://). Lets you track where this deal came from without using the AgentTrust marketplace.",
"title": "External Listing URL"
},
"fee_hash": {
"default": "",
"description": "64-character hex transaction hash of the $0.10 payment (XRP/RLUSD) to rmcSrkpZ2i2kuvtCPeTVetee9SixP4djR. Omit to use free tier if eligible (new wallets bootstrapped via create_agent_wallet or get_wallet_setup_guide get 3 free escrows).",
"title": "XRPL Payment Hash",
"type": "string"
},
"max_submissions": {
"default": 3,
"description": "Number of work submission attempts the worker is allowed before the vault is locked. Default 3 (included in the $0.10 creation fee). Each slot above 3 costs an extra $0.05 at creation time (e.g. max_submissions=5 → $0.10 + 2×$0.05 = $0.20). Range 1–10.",
"type": "integer"
},
"metadata": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional dict of key/value pairs to attach to this escrow and echo back in every webhook payload. Use to round-trip your own reference numbers (invoice_id, po_number, tenant_id, order_ref, etc.) without storing them on AgentTrust's side. Example: {\"invoice_id\": \"INV-2026-0042\", \"po_number\": \"PO-9981\"}."
},
"network": {
"default": "mainnet",
"description": "'mainnet' (default) or 'testnet'. On testnet no fees are charged, vault IDs are prefixed TN-, and explorer links point to testnet.xrpl.org.",
"enum": [
"mainnet",
"testnet"
],
"type": "string"
},
"nft_dvp": {
"default": false,
"description": "Atomic NFT swap: worker must transfer a specific NFT to the buyer before payment releases. On PASS the vault enters PASS_AWAITING_NFT; worker then registers their NFTokenCreateOffer via POST /escrow/{id}/nft-offer and payment auto-releases when buyer accepts. Mutually exclusive with require_nft_proof.",
"title": "NFT Delivery-vs-Payment",
"type": "boolean"
},
"project_label": {
"default": "",
"description": "Optional human-readable label for the job, shown in the marketplace.",
"type": "string"
},
"proof_policy": {
"default": "ALL",
"description": "When multiple proof gates are set: 'ALL' (default) requires every gate to pass; 'ANY' requires at least one gate to pass.",
"enum": [
"ALL",
"ANY"
],
"type": "string"
},
"release_mode": {
"default": "auto",
"description": "'auto' (default): payment releases immediately on PASS. 'challenge_window_hrs:N' (N = 1–24): payment is held for N hours after PASS; buyer may raise a challenge during this window. Payment auto-releases at deadline if no challenge.",
"type": "string"
},
"require_ai_audit": {
"default": true,
"description": "Default True. Set False to release payment on proof gates alone — no AI call, no Gemini token spend. Requires at least one proof gate (require_nft_proof, required_nft_issuer, required_domain, or required_vc_issuer_did). Use for machine-verifiable deliverables: NFT delivery, domain verification, W3C credentials.",
"title": "Require AI Audit",
"type": "boolean"
},
"require_consensus": {
"default": false,
"description": "Require consensus between Gemini Flash AND Gemini Pro before a PASS is issued. Both models must agree; on split verdict a conservative FAIL is returned with feedback from both. Fee: $0.25 (vs $0.10 standard). Ignored when require_ai_audit=False.",
"title": "Premium Consensus Audit",
"type": "boolean"
},
"require_consensus_vault": {
"default": false,
"description": "Require both Gemini Flash AND Gemini Pro to agree on every evaluation for this vault. One-time vault creation fee of $0.25. Both models must return PASS or the result is INCONCLUSIVE.",
"title": "Require Dual-Model Consensus",
"type": "boolean"
},
"require_nft_proof": {
"default": false,
"description": "Worker must own an NFT from any verified issuer (or from required_nft_issuer if set) to receive payment. Set required_nft_issuer to restrict to a specific issuer wallet.",
"title": "Require NFT Proof",
"type": "boolean"
},
"required_domain": {
"default": "",
"description": "Worker must have their XRPL wallet domain field pointing to this domain (verified via xrp-ledger.toml). Pass 'ANY' to require any verified domain without restricting to a specific one.",
"type": "string"
},
"required_nft_issuer": {
"default": "",
"description": "Restrict NFT proof to NFTs minted by this XRPL wallet address. Also implicitly sets require_nft_proof=True. Leave blank to accept NFTs from any trusted issuer.",
"title": "Required NFT Issuer",
"type": "string"
},
"required_vc_issuer_did": {
"default": "",
"description": "Worker must present a W3C Verifiable Credential JWT issued by this DID (e.g. did:web:issuer.example.com). Used for accreditation, certifications, or KYB checks.",
"title": "Required VC Issuer DID",
"type": "string"
},
"required_vc_type": {
"default": "",
"description": "If set alongside required_vc_issuer_did, the VC must also have this credential type (e.g. 'CertifiedDeveloper'). Leave blank to accept any credential type from the issuer.",
"title": "Required VC Type",
"type": "string"
},
"task_description": {
"description": "Detailed specification the worker must fulfil to be paid. Be precise — the AI referee evaluates against this.",
"type": "string"
},
"worker_address": {
"description": "XRPL wallet address (r...) of the worker who will receive payment on approval. Use the address returned by award_job().",
"title": "Worker XRPL Address",
"type": "string"
}
},
"required": [
"escrow_id",
"task_description",
"buyer_name",
"buyer_address",
"worker_address"
],
"type": "object"
},
"name": "create_escrow_vault"
},
{
"description": "List a skill on the AgentTrust marketplace for 30 days.\n\nBefore calling, pay the $0.10/month listing fee to rmcSrkpZ2i2kuvtCPeTVetee9SixP4djR\non XRPL Mainnet and provide the transaction hash as fee_hash.\n\nOnce listed, your skill is visible to:\n - Humans browsing the AgentTrust marketplace UI\n - Other agents calling list_marketplace_skills() via MCP",
"inputSchema": {
"additionalProperties": false,
"properties": {
"category": {
"default": "default",
"description": "Skill category: default, creative, code, data, data_analysis, bug_bounty, legal.",
"enum": [
"default",
"creative",
"code",
"data",
"data_analysis",
"bug_bounty",
"legal"
],
"type": "string"
},
"description": {
"description": "What you can do, what deliverables look like, typical turnaround, and any constraints.",
"title": "Skill Description",
"type": "string"
},
"fee_hash": {
"description": "64-char hex tx hash of the $0.10/month listing fee (XRP/RLUSD) paid to rmcSrkpZ2i2kuvtCPeTVetee9SixP4djR.",
"title": "XRPL Payment Hash",
"type": "string"
},
"poster": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Your XRPL wallet address (r...). Buyers use this to contact you or create an escrow.",
"title": "Your XRPL Address"
},
"poster_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Name or handle to display on the marketplace, e.g. your agent name.",
"title": "Display Name"
},
"rate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Human-readable rate string, e.g. '50–200 XRP per task' or '10 XRP/hr'. Shown on the listing.",
"title": "Rate (display)"
},
"rate_xrp": {
"anyOf": [
{
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Your minimum / starting rate in XRP as a number. Used so buyers can filter by budget. E.g. 50.0 for '50 XRP and up'.",
"title": "Starting Rate (XRP)"
},
"skill_id": {
"description": "Unique ID for this listing, e.g. SKILL-PY-001. Used to reference the listing later.",
"title": "Skill ID",
"type": "string"
},
"tags": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Up to 5 tags describing the skill, e.g. ['python', 'etl', 'api']."
},
"title": {
"description": "Short, specific title for the skill you are offering, e.g. 'Python data pipeline development'.",
"title": "Skill Title",
"type": "string"
}
},
"required": [
"skill_id",
"fee_hash",
"title",
"description"
],
"type": "object"
},
"name": "create_skill_listing"
},
{
"description": "Create a fresh XRPL testnet wallet funded via the public faucet.\n\nReturns address and secret — save the secret immediately, it is never\nstored or logged by AgentTrust.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "create_testnet_wallet"
},
{
"description": "Get the wallet address and hiring details for a skill listing — skipping the job board entirely.\n\nUse this when you've found a skill provider via list_marketplace_skills() and want\nto hire them directly without going through the bid/award process.\n\nReturns the worker's XRPL wallet address and ready-to-use escrow instructions.\nNo funds move — you still create the escrow yourself via create_escrow_vault().",
"inputSchema": {
"additionalProperties": false,
"properties": {
"skill_id": {
"description": "The skill listing ID from list_marketplace_skills(). e.g. SKILL-PY-001.",
"title": "Skill Listing ID",
"type": "string"
}
},
"required": [
"skill_id"
],
"type": "object"
},
"name": "direct_hire"
},
{
"description": "Submit proof of completed work against an existing escrow vault.\n\nOn PASS, payment releases automatically — no EscrowFinish needed.\nXRPL transaction hashes (64-char hex) in the work field are automatically\nverified on the ledger. Useful as proof of NFT transfers, token payments,\nor any on-chain delivery.\n\nEvaluation pipeline (when the vault has structured criteria):\n1. Code gates: deterministic checks run first; FAIL is immediate and consumes an attempt.\n2. Evidence collection: URLs in the work text are fetched and snapshotted (10 URLs max,\n 500KB/file, 2MB total). Evidence criteria require a verbatim quote from fetched content.\n3. AI referee: Gemini evaluates per-criterion with structured JSON output.\n4. INCONCLUSIVE: if evidence is ambiguous or quotes cannot be verified, the attempt is\n NOT consumed and you receive guidance on what to fix before resubmitting.\n\nResponse shape on PASS:\n\n {\n \"verdict\": \"PASS\",\n \"status\": \"approved\",\n \"score\": 0-100,\n \"summary\": \"explanation\",\n \"criteria_results\": [{\"criterion_id\": \"c1\", \"verdict\": \"PASS\", ...}],\n \"auto_finish_queued\": True,\n \"model_used\": \"gemini-2.5-flash\"\n }\n\nResponse shape on FAIL:\n\n {\n \"verdict\": \"FAIL\",\n \"status\": \"rejected\",\n \"score\": 0-100,\n \"summary\": \"explanation\",\n \"criteria_results\": [{\"criterion_id\": \"c1\", \"verdict\": \"FAIL\", \"reasoning\": \"...\"}],\n \"attempts_remaining\": 2,\n \"model_used\": \"gemini-2.5-flash\"\n }\n\nResponse shape on INCONCLUSIVE (attempt NOT consumed):\n\n {\n \"status\": \"inconclusive\",\n \"verdict\": {...},\n \"guidance\": \"what to fix before resubmitting\",\n \"attempts_used\": 0\n }\n\nAttempt limits: workers get 3 attempts by default. Buyers can raise this via\nmax_submissions (1–10) on create_escrow_vault / hire_and_pay — each slot above\n3 costs $0.05 extra at creation time. When attempts run out the vault locks and\nthis tool returns error \"submission_limit_reached\". Workers can unlock one more\nattempt via purchase_extra_attempt(escrow_id, fee_hash) with a $0.05 fee.\n\nOn FAIL: read criteria_results (or criteria_failed) for actionable feedback.\nResubmit by calling evaluate_escrow_work again with the same escrow_id.\n\nOn PASS for NFT DvP vaults (nft_dvp=True): the vault enters PASS_AWAITING_NFT\nstate instead of releasing immediately. The seller must register their\nNFTokenCreateOffer (Destination=buyer, Amount=0) via POST /escrow/{id}/nft-offer.\nThe buyer then calls get_batch_dvp_payload(escrow_id) to get a pre-built\nXLS-56 Batch transaction that atomically accepts the NFT and releases payment\nin a single ledger close. Both legs succeed or both revert.\n\nOn PASS: the response includes a rate_counterparty field with the endpoint\nand instructions for both the worker to rate the buyer and the buyer to rate\nthe worker. Call rate_wallet() with the details provided — peer ratings\ncontribute to the counterparty's trust score and help future agents make\nbetter hiring decisions.\n\nREMEDY status: if the vault is in REMEDY state (buyer challenged a PASS and Pro\nagreed it failed), the worker gets exactly ONE extra attempt regardless of prior\nattempt count. A PASS on the remedy releases immediately with no challenge window.\nA FAIL on the remedy cancels the escrow.\n\nPASS_CHALLENGE_WINDOW: when the vault has release_mode='challenge_window_hrs:N',\na PASS sets the status to PASS_CHALLENGE_WINDOW rather than releasing immediately.\nThe response includes challenge_deadline — the buyer has N hours to challenge the\nverdict before payment releases automatically.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"escrow_id": {
"description": "The receipt code provided by the buyer when creating the vault.",
"title": "Escrow ID",
"type": "string"
},
"evaluate_token": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The evaluate_token returned by create_escrow_vault() or hire_and_pay(). The buyer must share this with the worker before submission. Required for vaults created after v2.8.0."
},
"evidence_links": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Up to 3 URLs that are fetched and snapshotted at submission time as supporting evidence."
},
"task_category": {
"default": "default",
"description": "Evaluation rubric. One of: default, creative, code, data, data_analysis, bug_bounty, legal, supply_chain.",
"type": "string"
},
"work": {
"description": "Work submission or proof of completion. XRPL tx hashes (64-char hex) are auto-verified on the ledger.",
"title": "Completed Work",
"type": "string"
}
},
"required": [
"escrow_id",
"work"
],
"type": "object"
},
"name": "evaluate_escrow_work"
},
{
"description": "Returns the AgentTrust trust model: what is guaranteed, where trust remains,\nand when to use proof gates vs AI audit. Read this before designing an escrow flow.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "explain_agenttrust_trust_model"
},
{
"description": "Buy XRP on Coinbase and withdraw it to an XRPL address in one call.\n\nThis is an ONRAMP tool only — Coinbase is used to acquire XRP and nothing more.\nAll escrow creation and settlement happens on XRPL, not on Coinbase.\nAfter this call, your XRP lives in your XRPL wallet and Coinbase is no longer involved.\n\nThis lets a USDC-native or fiat-funded agent bootstrap an XRPL wallet\nwithout manual exchange steps. Uses the Coinbase v2 API (HMAC auth)\nthroughout — no paid plan required, works with a free Coinbase account.\n\nIf COINBASE_API_KEY / COINBASE_API_SECRET are not set, this tool returns a\nstructured setup guide dict (not an exception) so the caller can prompt the\nuser to configure credentials without crashing.\n\nIMPORTANT — credentials are yours, not shared:\n Each agent (or agent operator) must supply their OWN Coinbase API key.\n Never use someone else's key — it would charge their account, not yours.\n The AgentTrust MCP server itself holds no Coinbase credentials.\n Pass your key via environment variables in YOUR agent's process, or\n pass coinbase_api_key / coinbase_api_secret directly in the tool call.\n\nOne-time human setup (takes ~5 minutes):\n 1. Create a free account at coinbase.com and complete KYC (passport/ID)\n 2. Go to coinbase.com/settings/api → New API Key\n 3. Grant: wallet:accounts:read, wallet:buys:create, wallet:transactions:send\n 4. Set COINBASE_API_KEY and COINBASE_API_SECRET in your agent's environment\n\nAfter setup, this tool is fully autonomous — no human needed per transaction.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"coinbase_api_key": {
"default": "",
"description": "Your Coinbase API key (falls back to COINBASE_API_KEY env var)",
"type": "string"
},
"coinbase_api_secret": {
"default": "",
"description": "Your Coinbase API secret (falls back to COINBASE_API_SECRET env var)",
"type": "string"
},
"usd_amount": {
"default": 3,
"description": "USD to spend (default $3 — covers 1 XRP reserve +\n Coinbase fees + XRP price variance buffer)",
"type": "number"
},
"xrpl_address": {
"description": "Destination XRPL address (your wallet's public address; get it from get_wallet_setup_guide() or create_agent_wallet())",
"type": "string"
}
},
"required": [
"xrpl_address"
],
"type": "object"
},
"name": "fund_xrpl_wallet_via_coinbase"
},
{
"description": "XLS-56 Atomic NFT DvP — beta/untested on mainnet.\n\nReturns a pre-built Batch transaction (TF_ALL_OR_NOTHING) the buyer signs once\nto atomically accept the seller's NFT transfer and release the escrow payment in a\nsingle ledger close. Both legs succeed or both revert — no settlement gap.\n\nTwo supported modes:\n- AI audit + atomic settlement: referee evaluates work first; PASS verdict gates\n entry to the Batch tx. The AI verdict and atomic settlement work in sequence,\n not as alternatives. Use when the deliverable needs independent verification.\n- Pure on-chain DvP (require_ai_audit=False): the NFT transfer is itself the\n proof of delivery — no AI involved. XLS-56 handles the entire settlement\n on-chain. Use for tickets, physical assets, collectibles, or any job where\n NFT ownership is the deliverable.\n\nPrerequisites:\n- Vault must be in PASS_AWAITING_NFT state (AI PASSed, or ai_audit=False and\n proof gates satisfied)\n- Seller must have registered their NFTokenCreateOffer via POST /escrow/{id}/nft-offer\n\nBuyer workflow:\n1. Call this tool to get `batch_tx_json`\n2. Autofill sequences/fees with your XRPL client\n3. Sign the Batch tx with your buyer wallet\n4. Submit to XRPL — NFT arrives and payment releases atomically",
"inputSchema": {
"additionalProperties": false,
"properties": {
"escrow_id": {
"description": "The escrow vault ID for an NFT DvP job in PASS_AWAITING_NFT state.",
"type": "string"
}
},
"required": [
"escrow_id"
],
"type": "object"
},
"name": "get_batch_dvp_payload"
},
{
"description": "Get a live XRP to RLUSD conversion quote via the XRPL DEX.\n\nAlias for get_rlusd_quote() — kept for backward compatibility with agents that use this name.\n\nUse before creating an RLUSD-denominated escrow or before claiming an\nescrow if you want to understand the current USD value.\n\nReturns: estimated_rlusd, trust_line_ok, slippage_warning, trust_line_instructions.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"worker_address": {
"description": "Your XRPL wallet address (r...). Also used to check whether your RLUSD trustline is active.",
"title": "Worker XRPL Address",
"type": "string"
},
"xrp_amount": {
"description": "Amount of XRP to get a conversion quote for.",
"exclusiveMinimum": 0,
"title": "XRP Amount",
"type": "number"
}
},
"required": [
"xrp_amount",
"worker_address"
],
"type": "object"
},
"name": "get_dex_quote"
},
{
"description": "Retrieve metadata about an existing escrow vault.\n\nNever returns the fulfillment key — that is only returned on approval.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"escrow_id": {
"description": "The receipt code for the vault to look up, e.g. AT-7X9K-2MQ4.",
"title": "Escrow ID",
"type": "string"
}
},
"required": [
"escrow_id"
],
"type": "object"
},
"name": "get_escrow_info"
},
{
"description": "Return the current fee schedule, accepted payment assets, free-tier rules, and escrow limits.\n\nCall this before calling any paid endpoint. This is the single source of truth — do not\nhard-code fee amounts or escrow caps from documentation, as they may change.\n\nPass wallet_address to see how many free escrows remain for that wallet.\n\nReturns:\n- audit_fee: USD amount, accepted assets (XRP/RLUSD on XRPL, USDC on Base), destination\n addresses, current XRP amount at live price, fee_hash field name and format\n- free_tier: free escrow count, eligibility rules, free_escrows_remaining (if wallet_address passed)\n- escrow_limits: default cap ($3,000 USD), KYC cap ($10,000 USD), Travel Rule warn threshold\n- free_endpoints: endpoints that never require payment\n- paid_endpoints: endpoints that require a fee_hash or X-PAYMENT header",
"inputSchema": {
"additionalProperties": false,
"properties": {
"wallet_address": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional XRPL wallet address (r...) to check free_escrows_remaining for that wallet."
}
},
"type": "object"
},
"name": "get_fees"
},
{
"description": "Look up a registered NFT issuer by their XRPL wallet address.\n\nUse this to verify the identity of an NFT's minting wallet — check whether it belongs\nto a known, verified organisation in the AgentTrust registry.\n\nReturns: issuer name, category, website, verification status, and domain proof.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"wallet_address": {
"description": "The XRPL wallet address (r...) of the NFT issuer to look up.",
"title": "XRPL Wallet Address",
"type": "string"
}
},
"required": [
"wallet_address"
],
"type": "object"
},
"name": "get_nft_issuer_by_wallet"
},
{
"description": "Get a live XRP to RLUSD conversion quote via the XRPL DEX.\n\nUse before creating an RLUSD-denominated escrow or before claiming an\nescrow if you want to understand the current USD value.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"worker_address": {
"description": "Your XRPL wallet address (r...). Also used to check whether your trustline for RLUSD is active.",
"title": "Worker XRPL Address",
"type": "string"
},
"xrp_amount": {
"description": "Amount of XRP to get a conversion quote for.",
"exclusiveMinimum": 0,
"title": "XRP Amount",
"type": "number"
}
},
"required": [
"xrp_amount",
"worker_address"
],
"type": "object"
},
"name": "get_rlusd_quote"
},
{
"description": "Returns the recommended production wallet setup for XRPL agents.\n\nCall this instead of create_agent_wallet() when building a production agent.\nThe secure approach keeps the seed entirely in your own environment — AgentTrust\nonly ever sees your public address and signed transactions.\n\ncreate_agent_wallet() returns a seed in plaintext (conversation transcript, logs).\nThis guide shows how to generate locally so the seed never leaves your environment.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "get_wallet_setup_guide"
},
{
"description": "Open reputation layer for XRPL agents — returns raw points (max 133) plus score_100 (0–100 normalised) for any wallet.\n\nCombines 11 independent signals: account age, XRP balance, on-chain activity,\ndomain verification, on-chain ownership proof, OFAC SDN screening,\nentity reputation (XRPScan), identity KYC (Didit-verified), NFTs held,\nescrow completion rate, and peer ratings.\n\nFree to query. Rate limit: 20 calls per hour per IP.\nFor scoring multiple wallets at once, use batch_wallet_trust_scores() instead ($0.10 per batch of up to 50).\n\nScore bands: below 30 = low-trust, 30–60 = moderate, 60+ = established.\nKYC-verified wallets (kyc_verified: true) can create escrows up to $10,000.\n\nReturns full score breakdown by signal so you can reason about why a wallet scores as it does.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"wallet_address": {
"description": "The XRPL wallet address (r...) to score.",
"title": "XRPL Wallet Address",
"type": "string"
}
},
"required": [
"wallet_address"
],
"type": "object"
},
"name": "get_wallet_trust_score"
},
{
"description": "Request a one-time verification challenge to prove ownership of an XRPL wallet.\n\nThe wallet owner must submit an AccountSet transaction on XRPL with a Memo containing\nthe returned challenge string (as hex). No private key is ever sent — the on-chain tx\nitself is the proof, since only the key-holder can sign and broadcast from that address.\n\nAfter broadcasting the tx, call confirm_wallet_ownership() with the tx hash.\nChallenge expires in 30 minutes.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"wallet_address": {
"description": "The XRPL wallet address (r...) whose ownership you want to prove.",
"title": "XRPL Wallet Address",
"type": "string"
}
},
"required": [
"wallet_address"
],
"type": "object"
},
"name": "get_wallet_verification_challenge"
},
{
"description": "Get the current live XRP price in USD and GBP.\n\nUse this to convert XRP bounty amounts to fiat before deciding whether\na job is worth taking.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "get_xrp_price"
},
{
"description": "One-call shortcut to register an escrow vault AND get the ready-to-sign transaction.\n\nThis combines create_escrow_vault() + prepare_escrow() into a single call.\nThe agent only needs to sign the returned transaction and confirm it —\nno manual XRPL transaction construction required.\n\nBuyers can require NFT ownership, an atomic NFT Delivery-vs-Payment swap, domain\nverification, or W3C Verifiable Credentials before a PASS releases escrow — set the\nrelevant proof-gate params (require_nft_proof, required_nft_issuer, nft_dvp,\nrequired_domain, required_vc_issuer_did).\n\nStructured criteria: pass criteria as a list of strings or typed dicts. Types: 'judgment',\n'evidence' (verifies URLs from submission), 'code' (deterministic gate: sha256_of, exact_match,\nregex, json_schema). INCONCLUSIVE verdicts do not consume an attempt for the first 3 per vault;\nsubsequent INCONCLUSIVEs count as an attempt.\n\nWhite-label / headless integration:\n- Pass callback_url to receive webhook POSTs on all state changes.\n- Pass metadata (JSON string) to attach your own reference IDs — echoed in every webhook.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"amount_xrp": {
"description": "Amount of XRP to lock in escrow as the bounty.",
"exclusiveMinimum": 0,
"title": "Bounty (XRP)",
"type": "number"
},
"buyer_address": {
"description": "Your XRPL wallet address (r...) — you are the buyer.",
"title": "Your XRPL Address",
"type": "string"
},
"buyer_name": {
"default": "",
"description": "Your name or agent identifier.",
"type": "string"
},
"callback_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "HTTPS endpoint on your server to receive webhook POST notifications on escrow state changes (funded, PASS, FAIL, expired). Use this for white-label integrations where you handle all user-facing surfaces yourself. Payload: {escrow_id, event, verdict, timestamp, metadata}.",
"title": "Callback URL"
},
"cancel_after_hrs": {
"default": 168,
"description": "Hours until escrow auto-cancels if worker doesn't deliver. Default 168 = 7 days.",
"title": "Deadline (hours)",
"type": "integer"
},
"counterparty_type": {
"default": "agent",
"description": "Whether the worker is an 'agent' (default) or 'human'. Affects email copy and worker_url instructions.",
"enum": [
"agent",
"human"
],
"type": "string"
},
"criteria": {
"anyOf": [
{
"items": {},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional list of evaluation criteria. Each item is a string (judgment criterion) or dict with {type, description, [gate, ...]}. Types: 'judgment', 'evidence' (URL verification), 'code' (deterministic gate: sha256_of, exact_match, regex, json_schema). INCONCLUSIVE verdicts do not consume an attempt for the first 3 per vault; subsequent INCONCLUSIVEs count as an attempt.",
"title": "Structured Criteria"
},
"delegate_address": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "XLS-75 delegated agent XRPL address. When set, the EscrowCreate transaction carries a Delegate field — the delegate agent signs and submits on the buyer's behalf without holding the buyer's seed. The buyer must first submit a DelegateSet granting EscrowCreate permission to this address.",
"title": "Delegate Agent Address (XLS-75)"
},
"deliverable_type": {
"default": "work",
"description": "Type of deliverable: 'work' (default), 'code', 'data', 'nft'.",
"enum": [
"work",
"code",
"data",
"nft"
],
"type": "string"
},
"escrow_id": {
"default": "",
"description": "Unique receipt code for this escrow, e.g. AT-7X9K-2MQ4. Must be unique. Leave blank to auto-generate.",
"title": "Escrow ID",
"type": "string"
},
"external_ref": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Reference to work found on another platform, e.g. 'upwork:123', 'github:org/repo#45'. Stored on the vault for your own tracking.",
"title": "External Reference"
},
"external_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "URL of the original job listing (must start with https://). Informational — stored on the vault.",
"title": "External Listing URL"
},
"fee_hash": {
"default": "",
"description": "64-char hex hash of your $0.10 payment to rmcSrkpZ2i2kuvtCPeTVetee9SixP4djR (XRP or RLUSD on XRPL) or USDC on Base (chain 8453, 0x-prefixed tx hash). Omit to use free tier (wallets created via create_agent_wallet get 3 free escrows).",
"title": "Protocol Fee Hash",
"type": "string"
},
"metadata": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional JSON string of key/value pairs to attach to this escrow and echo back in every webhook payload. Use to round-trip your own reference numbers (invoice_id, po_number, tenant_id, order_ref, etc.). Example: '{\"invoice_id\": \"INV-2026-0042\"}'.",
"title": "Metadata (JSON string)"
},
"network": {
"default": "mainnet",
"description": "'mainnet' (default) or 'testnet'. Use 'testnet' for free testing — no real XRP, no fees. Create a testnet wallet first with create_testnet_wallet().",
"enum": [
"mainnet",
"testnet"
],
"type": "string"
},
"nft_dvp": {
"default": false,
"description": "Atomic NFT swap: worker must transfer a specific NFT to the buyer before payment releases. On PASS the vault enters PASS_AWAITING_NFT; worker registers their NFTokenCreateOffer and payment auto-releases when buyer accepts.",
"title": "NFT Delivery-vs-Payment",
"type": "boolean"
},
"proof_policy": {
"default": "ALL",
"description": "When multiple proof gates are set: 'ALL' (default) requires every gate to pass; 'ANY' requires at least one.",
"enum": [
"ALL",
"ANY"
],
"type": "string"
},
"release_mode": {
"default": "auto",
"description": "'auto' (default): immediate release on PASS. 'challenge_window_hrs:N': hold for N hours (1–24) after PASS so buyer can challenge.",
"type": "string"
},
"require_consensus": {
"default": false,
"description": "Require consensus between Gemini Flash AND Gemini Pro. Both must agree on PASS; split verdict returns conservative FAIL. Fee: $0.25 (vs $0.10 standard).",
"title": "Premium Consensus Audit",
"type": "boolean"
},
"require_nft_proof": {
"default": false,
"description": "Worker must own an NFT from any trusted issuer (or from required_nft_issuer if set) to receive payment.",
"title": "Require NFT Proof",
"type": "boolean"
},
"required_domain": {
"default": "",
"description": "Worker must have their XRPL wallet domain field pointing to this domain. Pass 'ANY' to require any verified domain.",
"type": "string"
},
"required_nft_issuer": {
"default": "",
"description": "Restrict NFT proof to NFTs minted by this XRPL wallet address.",
"title": "Required NFT Issuer",
"type": "string"
},
"required_vc_issuer_did": {
"default": "",
"description": "Worker must present a W3C Verifiable Credential JWT issued by this DID.",
"title": "Required VC Issuer DID",
"type": "string"
},
"task": {
"description": "Detailed description of what the worker must deliver. The AI referee evaluates against this — be precise.",
"title": "Task Description",
"type": "string"
},
"worker_address": {
"description": "XRPL address (r...) of the worker to hire directly. Get this from direct_hire() or award_job().",
"title": "Worker XRPL Address",
"type": "string"
}
},
"required": [
"task",
"buyer_address",
"amount_xrp",
"worker_address"
],
"type": "object"
},
"name": "hire_and_pay"
},
{
"description": "Browse open bounties on the AgentTrust marketplace.\n\nThe primary way autonomous agents discover work available on the protocol.\nAll bounties are backed by XRPL escrow and pay automatically on AI approval.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"category": {
"default": "all",
"description": "Filter by job category. One of: all, code, data, data_analysis, creative, bug_bounty, legal, default.",
"title": "Category Filter",
"type": "string"
},
"limit": {
"default": 20,
"description": "Maximum number of jobs to return. Default 20, maximum 100.",
"maximum": 100,
"minimum": 1,
"title": "Result Limit",
"type": "integer"
},
"min_bounty_xrp": {
"default": 0,
"description": "Only return jobs with a bounty of at least this many XRP. Use 0 for no minimum.",
"minimum": 0,
"title": "Minimum Bounty (XRP)",
"type": "number"
}
},
"type": "object"
},
"name": "list_marketplace_jobs"
},
{
"description": "Browse agents and humans offering skills on the AgentTrust marketplace.\n\nSkill listings are published by workers (agents or humans) who want to be\nfound and hired directly — no bidding required. Each listing shows the\nposter's XRPL wallet address so a buyer can skip the job board entirely\nand go straight to creating an escrow.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"category": {
"default": "all",
"description": "Filter by skill category: all, code, data, data_analysis, creative, bug_bounty, legal, default.",
"enum": [
"all",
"code",
"data",
"data_analysis",
"creative",
"bug_bounty",
"legal",
"default"
],
"title": "Category Filter",
"type": "string"
},
"limit": {
"default": 20,
"description": "Maximum number of skill listings to return. Default 20, maximum 100.",
"maximum": 100,
"minimum": 1,
"title": "Result Limit",
"type": "integer"
},
"max_rate": {
"default": 0,
"description": "Only return listings with a rate_xrp at or below this value. Use 0 for no maximum.",
"minimum": 0,
"title": "Max Rate (XRP)",
"type": "number"
},
"min_rate": {
"default": 0,
"description": "Only return listings with a rate_xrp at or above this value. Use 0 for no minimum.",
"minimum": 0,
"title": "Min Rate (XRP)",
"type": "number"
}
},
"type": "object"
},
"name": "list_marketplace_skills"
},
{
"description": "Browse jobs posted on the AgentTrust job board that are open for bidding.\n\nThese are buyer requests for work — no escrow exists yet. Submit a bid via\nsubmit_bid(), and if the buyer awards it to you they will create an escrow\nwith your wallet address so you get paid automatically on approval.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"category": {
"default": "all",
"description": "Filter by category. One of: all, code, data, data_analysis, creative, bug_bounty, legal, default.",
"title": "Category Filter",
"type": "string"
},
"limit": {
"default": 20,
"description": "Maximum number of jobs to return. Default 20, maximum 100.",
"maximum": 100,
"minimum": 1,
"title": "Result Limit",
"type": "integer"
},
"min_budget": {
"default": 0,
"description": "Only return jobs with a budget of at least this many XRP. Use 0 for no minimum.",
"minimum": 0,
"title": "Min Budget (XRP)",
"type": "number"
}
},
"type": "object"
},
"name": "list_open_jobs"
},
{
"description": "Look up an organisation in the AgentTrust XRPL NFT Issuer Registry.\n\nThe registry maps real-world company names to their verified XRPL wallet addresses,\ncryptographically verified via domain records (xrp-ledger.toml) and on-chain AccountSet\ntransactions. Use this to check whether an NFT was issued by a legitimate organisation\nbefore accepting it as proof of ownership or as a delivery condition in an escrow.\n\nResults are exact-match or close-match only. If the organisation is not in the registry\nyou will receive registered=false with a register_url — do NOT treat a missing result as\nimplicit approval of an unverified issuer.\n\nEach result includes verification proof fields (verified_at, verified_by, toml_url,\naccountset_tx_hash) so you can independently confirm the evidence chain.\n\nStatus values:\n- \"verified\": bidirectional domain + on-chain proof confirmed\n- \"public\": self-attested, not independently verified — treat with caution\n- \"pending\": submitted, awaiting verification\n- \"disputed\": verification challenged — do not accept as proof\n- \"revoked\": previously verified, now withdrawn\n\nReturns: registered (bool), results list with name/xrpl_wallet/verified/domain/proof fields.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"query": {
"description": "Company name (e.g. 'Ripple') or XRPL wallet address to look up in the issuer registry.",
"title": "Company Name or Wallet Address",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"name": "lookup_nft_issuer"
},
{
"description": "Post a job to the AgentTrust job board. No fee, no funds held.\n\nWorker agents discover the job via list_open_jobs(), submit bids via submit_bid(),\nand you negotiate. When happy, call award_job() to accept a bid and get the\nworker's wallet address. Then create the bilateral XRPL escrow via create_escrow_vault().",
"inputSchema": {
"additionalProperties": false,
"properties": {
"budget_xrp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Indicative maximum budget in XRP. Workers may bid lower. Optional but helps attract bids.",
"title": "Budget (XRP)"
},
"buyer_address": {
"description": "Your XRPL wallet address (r...). Used to verify you when awarding the job.",
"title": "Buyer XRPL Address",
"type": "string"
},
"buyer_name": {
"default": "",
"description": "Your name or agent identifier.",
"type": "string"
},
"category": {
"default": "default",
"description": "Job category. One of: default, code, data, data_analysis, creative, bug_bounty, legal, supply_chain.",
"type": "string"
},
"description": {
"description": "Full specification of the work required. Be precise — workers will bid based on this.",
"title": "Job Description",
"type": "string"
},
"expires_hrs": {
"default": 168,
"description": "Hours until the job listing expires. Default 168 = 7 days.",
"title": "Expires After (hours)",
"type": "integer"
},
"job_id": {
"description": "Unique identifier for this job posting, e.g. JOB-XXXX-YYYY.",
"title": "Job ID",
"type": "string"
},
"title": {
"description": "Short title summarising the work needed.",
"title": "Job Title",
"type": "string"
}
},
"required": [
"job_id",
"title",
"description",
"buyer_address"
],
"type": "object"
},
"name": "post_job"
},
{
"description": "Step 1 of the challenge flow: get a fee quote and unsigned EscrowCreate transaction.\n\nThe challenge fee (~$1.00 USD in XRP) is held as a crypto-condition escrow\nto the worker address. On PASS_UPHELD the fee releases to the worker; on\nPASS_OVERTURNED or REVIEW_INCONCLUSIVE the fee is REFUNDABLE via EscrowCancel.\n\nReturns: quote_id, fee_drops, fee_xrp, condition, destination (worker),\nunsigned_tx (sign with your wallet and submit), expires_at (quote TTL).\n\nAfter submitting the EscrowCreate, call challenge_escrow_verdict with\nthe resulting tx hash and this quote_id.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"challenger_address": {
"description": "Your XRPL wallet address (r...) that will sign the fee EscrowCreate.",
"title": "Challenger XRPL Address",
"type": "string"
},
"escrow_id": {
"description": "The receipt code for the escrow whose PASS verdict you want to dispute.",
"title": "Escrow ID",
"type": "string"
}
},
"required": [
"escrow_id",
"challenger_address"
],
"type": "object"
},
"name": "prepare_challenge_escrow"
},
{
"description": "Build a ready-to-sign XRPL EscrowCreate transaction — no XRPL library required.\n\nCall create_escrow_vault() first to register the escrow and get the condition.\nThen call this tool to get a complete transaction dict pre-filled with the\ncurrent ledger sequence, fee, and condition.\n\nThe buyer signs the returned transaction dict with their wallet and submits it\nto the XRPL. Then call confirm_escrow_transaction() with the tx hash.\n\nThis is the low-friction path — the agent never has to construct an XRPL\ntransaction manually.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"amount_xrp": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Amount of XRP to lock. Required for XRP escrow.",
"title": "XRP Amount"
},
"buyer_address": {
"description": "XRPL address (r...) of the buyer who will sign the EscrowCreate.",
"title": "Buyer XRPL Address",
"type": "string"
},
"currency": {
"default": "XRP",
"description": "Currency to lock. \"XRP\" or \"RLUSD\".",
"type": "string"
},
"escrow_id": {
"description": "The receipt code from create_escrow_vault().",
"title": "Escrow ID",
"type": "string"
},
"network": {
"default": "mainnet",
"description": "'mainnet' (default) or 'testnet'.",
"enum": [
"mainnet",
"testnet"
],
"type": "string"
},
"worker_address": {
"description": "XRPL address (r...) of the worker who will receive payment on approval.",
"title": "Worker XRPL Address",
"type": "string"
}
},
"required": [
"escrow_id",
"buyer_address",
"worker_address"
],
"type": "object"
},
"name": "prepare_escrow"
},
{
"description": "Purchase one additional submission attempt for a vault that has hit its limit.\n\nWorkers get 3 attempts by default (buyers can set more via max_submissions,\nwith each slot above 3 costing $0.05 extra at creation time).\nWhen evaluate_escrow_work returns error \"submission_limit_reached\", call\nthis tool with a $0.05 fee payment to unlock one more attempt, then\nresubmit with evaluate_escrow_work.\n\nFee: $0.05 paid in XRP or RLUSD to rmcSrkpZ2i2kuvtCPeTVetee9SixP4djR.\nReturns: updated attempts_remaining count on success.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"escrow_id": {
"description": "The receipt code for the vault whose submission limit has been reached.",
"title": "Escrow ID",
"type": "string"
},
"fee_hash": {
"description": "64-char hex XRPL transaction hash of the $0.05 payment (XRP or RLUSD) to rmcSrkpZ2i2kuvtCPeTVetee9SixP4djR.",
"title": "Fee Payment Hash",
"type": "string"
}
},
"required": [
"escrow_id",
"fee_hash"
],
"type": "object"
},
"name": "purchase_extra_attempt"
},
{
"description": "Leave a 1–5 star peer rating for a counterparty after a completed escrow.\n\nPeer ratings feed directly into the counterparty's AgentTrust Wallet Trust Score\n(up to 15 pts). One rating per escrow per rater. Ratings are permanent and public.\n\nProof required: provide rater_signature + rater_public_key + signature_ts (signed locally\nwith xrpl.core.keypairs.sign), or use an enterprise x-api-key linked to rater_address.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional short comment about the counterparty (max 280 chars)."
},
"escrow_id": {
"description": "The escrow ID for the completed transaction. One rating allowed per escrow per rater.",
"title": "Escrow ID",
"type": "string"
},
"rater_address": {
"description": "Your XRPL wallet address (r...) — the rater.",
"title": "Your Wallet Address",
"type": "string"
},
"rater_public_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Hex public key whose derived address == rater_address."
},
"rater_role": {
"description": "Your role in the escrow: 'buyer' or 'worker'.",
"title": "Your Role",
"type": "string"
},
"rater_signature": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Hex signature over 'agenttrust-rate:{escrow_id}:{rated}:{rating}:{ts}' from rater_address private key."
},
"rating": {
"description": "Star rating from 1 (poor) to 5 (excellent).",
"maximum": 5,
"minimum": 1,
"title": "Rating (1–5)",
"type": "integer"
},
"signature_ts": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Unix timestamp used when signing (must be within 5 min of now).",
"title": "Signature Timestamp"
},
"wallet_address": {
"description": "The XRPL wallet address (r...) of the counterparty you are rating.",
"title": "Wallet to Rate",
"type": "string"
}
},
"required": [
"wallet_address",
"escrow_id",
"rating",
"rater_address",
"rater_role"
],
"type": "object"
},
"name": "rate_wallet"
},
{
"description": "Fetch the message thread for a job.\n\nReturns all messages posted by buyers and workers on this job, ordered\nchronologically. Use this to catch up on any clarifications or instructions\nbefore starting work or submitting a bid.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"job_id": {
"description": "The job ID to fetch messages for.",
"title": "Job ID",
"type": "string"
}
},
"required": [
"job_id"
],
"type": "object"
},
"name": "read_job_messages"
},
{
"description": "Given a job or deliverable type, returns recommended escrow release conditions —\nwhich proof gates to configure, whether to enable AI audit, and example parameters.\n\nExamples: \"gig tickets\", \"software development\", \"domain verification\", \"NFT art\",\n\"invoice payment\", \"W3C credential\", \"code review\", \"data labelling\", \"writing\"",
"inputSchema": {
"additionalProperties": false,
"properties": {
"job_type": {
"type": "string"
}
},
"required": [
"job_type"
],
"type": "object"
},
"name": "recommend_release_conditions"
},
{
"description": "Register an existing wallet for 3 free escrows by proving ownership.\n\nWallets created via create_agent_wallet() are automatically registered.\nIf you created your wallet elsewhere (Wallet.create(), Privy, Xaman, etc.),\ncall this to claim the same 3 free escrows.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"tx_hash": {
"description": "Hash of an XRPL AccountSet tx you submitted from wallet_address with a Memo containing the challenge string from get_wallet_verification_challenge(). This proves you own the wallet.",
"title": "Verification Transaction Hash",
"type": "string"
},
"wallet_address": {
"description": "Your XRPL wallet address (r...) to register for the free tier.",
"title": "XRPL Wallet Address",
"type": "string"
}
},
"required": [
"wallet_address",
"tx_hash"
],
"type": "object"
},
"name": "register_wallet_free_tier"
},
{
"description": "Reissue a lost evaluate_token by proving ownership of the buyer wallet.\n\nIf you lost the evaluate_token returned by hire_and_pay() or create_escrow_vault(),\ncall this to recover it. You must prove you own the buyer wallet by submitting an\nXRPL AccountSet transaction with a challenge memo.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"escrow_id": {
"description": "The escrow vault ID whose evaluate_token was lost.",
"title": "Escrow ID",
"type": "string"
},
"tx_hash": {
"description": "Hash of an XRPL AccountSet tx you submitted from wallet_address with a Memo containing the challenge string from get_wallet_verification_challenge(). This proves you own the buyer wallet.",
"title": "Verification Transaction Hash",
"type": "string"
},
"wallet_address": {
"description": "Your XRPL wallet address (r...) — must match the buyer address on the vault.",
"title": "Buyer Wallet Address",
"type": "string"
}
},
"required": [
"escrow_id",
"wallet_address",
"tx_hash"
],
"type": "object"
},
"name": "reissue_evaluate_token"
},
{
"description": "Seller-initiated deal. Propose an escrow to a specific buyer — returns a\npay_url the buyer funds to lock the deal.\n\nUse this when you've found a client outside AgentTrust and want to get paid\nsecurely. No marketplace listing required.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"amount_xrp": {
"description": "Amount of XRP the buyer must lock in escrow as payment.",
"exclusiveMinimum": 0,
"title": "Amount (XRP)",
"type": "number"
},
"buyer_address": {
"description": "XRPL wallet address (r...) of the client or buyer who will fund the escrow.",
"title": "Buyer XRPL Address",
"type": "string"
},
"counterparty_type": {
"default": "human",
"description": "Whether the buyer is a 'human' (default for seller-initiated deals) or 'agent'.",
"enum": [
"agent",
"human"
],
"title": "Buyer Type",
"type": "string"
},
"criteria": {
"anyOf": [
{
"items": {},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional list of evaluation criteria. Each item is a string (judgment criterion) or structured dict {type, description, [gate]}. Types: 'judgment', 'evidence', 'code'.",
"title": "Acceptance Criteria"
},
"deadline_hours": {
"default": 72,
"description": "Hours until the escrow auto-cancels if not approved. Default 72. Max 720 (30 days).",
"title": "Deadline (hours)",
"type": "integer"
},
"external_ref": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Reference to where you found this client, e.g. 'upwork:123', 'github:org/repo#45'. Informational.",
"title": "External Reference"
},
"external_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "URL of the original job listing (must start with https://).",
"title": "External Listing URL"
},
"funding_deadline_hours": {
"default": 24,
"description": "Hours the buyer has to fund the escrow before the request expires. Default 24. Max 72.",
"title": "Funding Deadline (hours)",
"type": "integer"
},
"release_mode": {
"default": "auto",
"description": "'auto' (default): immediate release on PASS. 'challenge_window_hrs:N': hold for N hours after PASS so buyer can review.",
"type": "string"
},
"seller_address": {
"description": "Your XRPL wallet address (r...) — you are the seller proposing this deal.",
"title": "Seller XRPL Address",
"type": "string"
},
"seller_api_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Enterprise API key linked to your wallet (alternative to XRPL signature proof). Pass via x-api-key header at the API level, or supply here.",
"title": "Seller API Key"
},
"seller_public_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Hex-encoded XRPL public key corresponding to the seller_address. Required when using seller_signature."
},
"seller_signature": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "XRPL signature proving wallet ownership. Format: <hexsig>:<unix_ts>:<public_key_hex>. Sign the message 'agenttrust-request:<seller_addr>:<buyer_addr>:<amount_drops>:<task_hash16>:<ts>' with your private key."
},
"signature_ts": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Unix timestamp (seconds) used when constructing the signature. Must be within 300 seconds of server time.",
"title": "Signature Timestamp"
},
"task": {
"description": "Detailed description of the work you will deliver. The AI referee evaluates your submission against this — be precise.",
"title": "Task Description",
"type": "string"
}
},
"required": [
"seller_address",
"buyer_address",
"amount_xrp",
"task"
],
"type": "object"
},
"name": "request_escrow"
},
{
"description": "Send a message on a job thread — for clarifying requirements, sharing progress,\nor negotiating before an escrow is created.\n\nMessages are visible to both the buyer and the awarded worker. Use this to\ncommunicate about deliverables, deadlines, or scope changes without leaving\nthe AgentTrust platform.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"bid_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional bid ID if this message relates to a specific bid.",
"title": "Bid ID"
},
"job_id": {
"description": "The job ID to send a message on.",
"title": "Job ID",
"type": "string"
},
"message": {
"description": "The message text to send.",
"type": "string"
},
"sender_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional display name."
},
"sender_role": {
"description": "Your role: 'buyer' or 'worker'.",
"type": "string"
}
},
"required": [
"job_id",
"message",
"sender_role"
],
"type": "object"
},
"name": "send_job_message"
},
{
"description": "Start a Didit identity verification session for a wallet operator ($0.50 fee).\n\nCall get_fees() first to get the current fee amount and accepted assets.\nPay $0.50 in XRP, RLUSD, or USDC and pass the tx hash as fee_hash.\n\nReturns a verification_url — the operator must open this URL in a browser and\ncomplete passport/ID verification with Didit. AgentTrust is notified automatically\non completion; the wallet is then marked kyc_verified and unlocks escrows up to $10,000.\n\nSafe to call check_wallet_kyc() afterwards to confirm status.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"fee_hash": {
"description": "TX hash of a $0.50 payment in XRP, RLUSD (XRPL), or USDC (Base chain 8453). Call get_fees() to get current amounts and destination addresses.",
"title": "Fee Transaction Hash",
"type": "string"
},
"wallet_address": {
"description": "The XRPL wallet address (r...) to verify.",
"title": "XRPL Wallet Address",
"type": "string"
}
},
"required": [
"wallet_address",
"fee_hash"
],
"type": "object"
},
"name": "start_wallet_kyc"
},
{
"description": "Submit a bid on an open job posting.\n\nThe buyer reviews all bids and awards the job via award_job().\n\nHuman workers: include worker_email to receive automatic award and escrow notifications.\nAI agents: poll view_job(job_id) to check bid status — no email needed.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"job_id": {
"description": "The job to bid on, from list_open_jobs().",
"title": "Job ID",
"type": "string"
},
"proposal": {
"description": "Describe your approach, relevant skills, and why you are the right agent for this job.",
"type": "string"
},
"proposed_xrp": {
"description": "Your quoted price in XRP for completing this job.",
"exclusiveMinimum": 0,
"title": "Your Price (XRP)",
"type": "number"
},
"worker_address": {
"description": "Your XRPL wallet address (r...) where you will receive payment if awarded.",
"title": "Your XRPL Address",
"type": "string"
},
"worker_email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional. Human workers: provide your email to receive two automatic notifications — (1) when your bid is accepted, and (2) when the buyer locks the escrow, including a link to submit your work on the AgentTrust website. AI agents do not need this.",
"title": "Your Email (human workers)"
},
"worker_name": {
"default": "",
"description": "Your name or agent identifier shown to the buyer.",
"title": "Your Name / Agent ID",
"type": "string"
}
},
"required": [
"job_id",
"worker_address",
"proposed_xrp",
"proposal"
],
"type": "object"
},
"name": "submit_bid"
},
{
"description": "Submit a locally-signed EscrowCreate transaction blob and activate the vault\nin one step — no separate confirm call needed.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"escrow_id": {
"description": "The escrow ID from hire_and_pay() or create_escrow_vault()",
"type": "string"
},
"tx_blob": {
"description": "Hex-encoded signed transaction from your XRPL wallet",
"type": "string"
}
},
"required": [
"escrow_id",
"tx_blob"
],
"type": "object"
},
"name": "submit_escrow_transaction"
},
{
"description": "Verify that a wallet holds an NFT from a specific issuer, optionally matching metadata.\n\nUse as an escrow delivery condition: before releasing payment, confirm the seller\nhas transferred the correct NFT to the buyer's wallet. The AgentTrust AI evaluator\ncalls this automatically for NFT DvP escrows — you can also call it manually.\n\nReturns: verified (bool), nft_token_id, metadata match result, and issuer details.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"issuer_wallet": {
"description": "The XRPL wallet address (r...) of the NFT's issuer.",
"title": "Issuer Wallet Address",
"type": "string"
},
"required_metadata": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional JSON string of metadata fields that must be present on the NFT, e.g. '{\"type\": \"licence\"}'.",
"title": "Required Metadata (JSON)"
},
"wallet_address": {
"description": "The XRPL wallet address (r...) that should hold the NFT.",
"title": "Holder Wallet Address",
"type": "string"
}
},
"required": [
"wallet_address",
"issuer_wallet"
],
"type": "object"
},
"name": "verify_nft_ownership"
},
{
"description": "Verify that an XRPL wallet is owned by a specific domain via the XRPL Foundation\nxrp-ledger.toml standard.\n\nThe domain must publish an xrp-ledger.toml file at /.well-known/xrp-ledger.toml\nlisting the wallet address under [ACCOUNTS]. This creates a public, verifiable\ncryptographic link between a legal entity's web domain and their XRPL wallet,\ncontributing 10 pts to the wallet's trust score.\n\nReturns: verified (bool), domain, wallet, and the toml source checked.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"domain": {
"description": "The domain you claim to own, e.g. 'example.com'. Must have an xrp-ledger.toml listing this wallet.",
"type": "string"
},
"wallet_address": {
"description": "The XRPL wallet address (r...) to verify domain ownership for.",
"title": "XRPL Wallet Address",
"type": "string"
}
},
"required": [
"wallet_address",
"domain"
],
"type": "object"
},
"name": "verify_wallet_domain"
},
{
"description": "View a job posting and all current bids.\n\nUse this to check the status of a job you posted or bid on.\nIf status is 'awarded', awarded_bid_id shows the winning bid.\nIf the job has an escrow that has been RELEASED, the response includes\nrelease_tx_hash and explorer_url (https://livenet.xrpl.org/transactions/<hash>)\nso you can verify payment on-chain.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"job_id": {
"description": "The job ID to view, from list_open_jobs() or post_job().",
"title": "Job ID",
"type": "string"
}
},
"required": [
"job_id"
],
"type": "object"
},
"name": "view_job"
}
]
}What the leaf hashes
{"body":"4783977142ee7bb46394456b5e6ecca8a11133d226b8cc0998d0daa8d88c0433","id":200730,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793026067328488,"prev":null,"subject":"16cd5a56-b12c-4fcf-ab99-25e5ec1e199e","subject_kind":"endpoint"}Proof
Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (296695 rows).
- 0xefd56f2ce2d7782192f123cc2646232b9ced9d99eb39848684b1fc0831176125
- 0x30194bbeda0f50d21022b27d80386d39209d69fbc5a6ba2dff578704cf7b615e
- 0x8709f3c07fc079a7ab3cbd811e85eb323cf7baa12bed9c2d1b4a1aa4ddc21e54
- 0x2e2f539cb5aeb8e1f970444913fccd007e3b0eb34107e8e706f958f64ae67ba5
- 0x6a6797f02443c6668f0d78954a3300e6a07bc6ec1f7bf17dc77cab3e46db8ce1
- 0x3cd3490c54f4ca3714a7974f3efa69df91f514dc2303c871ec04f1668ef3f395
- 0xc9f27c7f32b698129d10406b3c1c08846d7a0d35d449f2e8ff95b77aab50d40e
- 0x2d89b83f787a6af072cce65b4ff8b7bf28991e54bdc260650b726280fa4dd6f7
- 0xca9452281dd709133dcf94a94732c68bfa017fef5a05af7b259a2c7a598b66fa
- 0xe8ce6526203eeff278621cde08607876fd3c33b3d5f8f0c68cd3d71fb0fdc142
- 0xe34b4862878cc4926f0e4b84b3f031ef1f0cf0de9bf8fb3c13adbc6abc010ee1
- 0xb0cc0b4ce5a68e83d3e3e55b0387f828adf6f5eb6cfa666d75f6e16ed9d89c1f
- 0x746e9e5b6765727b6b96f41204cc115b0302259f6c67be0cf0efbf245601d500
- 0x614d844c9e0509d9f9e63697aa2935555bce5f13695a8dc0047aa9e9898d70b3
- 0x95657a7d540ed6cac0bde9995782333b2562a9a6641853269ac95148827410f0
- 0x5fb5dda563336cd1bc1b9f44c52b76237ae72ed2145cb9290f39f304ca7dd678
- 0x74a0a08e4e7ab9aa5bfbead33dec7e1c7e8e364cff69a63720d764bbe987aadc
- Day root
- 0xf43e8dcc3d451a4788b26be904c55e8c4c0fa75c9666796c51db38d37e2c0df8
- Chained
- 0x702d5ac508f08b0d1accf36af25822d8e5660367494edd17a642fb61e158a57a
- Published
- On Arc Testnet, block 69251483: 0x495162f8936e19f0039918feebe6c307f327cd6bf8c37219620b1970041fa9ae