protogrid

Search / io.escrova/escrova

Escrova

R0· no sign-in

Search Amazon, eBay, Walmart and more. Agents prepare orders; you approve and pay on Escrova.

v1.0.1 · active · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality78good
Trust83of 100
Uptime, 30 days100%
Latency p50628 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "escrova": {
      "type": "http",
      "url": "https://www.escrova.io/api/mcp"
    }
  }
}
claude mcp add --transport http escrova https://www.escrova.io/api/mcp
[mcp_servers.escrova]
url = "https://www.escrova.io/api/mcp"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "escrova": {
      "type": "remote",
      "url": "https://www.escrova.io/api/mcp",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "escrova": {
      "type": "http",
      "url": "https://www.escrova.io/api/mcp"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=escrova&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vd3d3LmVzY3JvdmEuaW8vYXBpL21jcCJ9"
}
{
  "servers": {
    "escrova": {
      "type": "http",
      "url": "https://www.escrova.io/api/mcp"
    }
  }
}
{
  "mcpServers": {
    "escrova": {
      "httpUrl": "https://www.escrova.io/api/mcp"
    }
  }
}
extensions:
  "escrova":
    enabled: true
    name: "escrova"
    type: streamable_http
    uri: "https://www.escrova.io/api/mcp"
    timeout: 300

Quality 78 / 100good

protocol75 · weight 25
  • warn
    protocol.modernnewest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
  • n/a
    protocol.statelessonly applies to 2026-07-28 servers
  • pass
    protocol.transportstreamable HTTP
  • n/a
    protocol.list_ttlonly applies to 2026-07-28 servers
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene94 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • warn
    tools.description_length1 tools have descriptions over 1,024 characters, which crowds the context
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations18 of 18 tools declare readOnlyHint or destructiveHint
  • pass
    tools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
  • pass
    tools.token_costabout 5,929 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
  • pass
    tools.hidden_textno hidden text in tool names, descriptions, schemas or annotations
stability50 · weight 15
  • warn
    stability.changes25 tool changes in 30 days
  • fail
    stability.rug_pull1 tools kept their name but changed most of their description in 30 days; review before trusting them
  • pass
    stability.new_linksno tool change named a new site
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

18 tools, about 5,929 tokens to load them all · tool set 58282d9cf311 · tools last changed 2026-11-13 · checked 2026-11-14 07:03 UTC

Tool changes

  • prepare_checkoutchangeddescription
    before

    Prices a basket of store items for the person whose grant you hold and saves it for them to review. THIS BUYS NOTHING AND MOVES NO MONEY. The answer carries `state`: approval_required with a reviewUrl, the page on Escrova where the person checks every line, approves and pays from their own wallet. Give them that link and stop: you cannot approve or pay. A signed-out person signs in on that page and continues with the same order. Send items, and to choose where it goes send the addressId of one of their saved addresses from list_addresses; with none their default is used. A typed address, a marketplace listing, a gift, an item whose condition is not new and a quantity that is not a whole number are refused. The grant needs the `buy` scope. Other states: not_started (refused, nothing was prepared; read the body) or reconciliation_required (outcome unknown; ask the person before preparing it again). Available to every shopper on mainnet. Bind the challenge to POST /api/agent/checkout-intents, over the body this tool sends, with delegationGrantId in targetArguments.

    after · 94% of words in common

    Prices a basket of store items for the person whose grant you hold and saves it with its pricing model, shipping, store tax estimate, fee and total. for them to review. THIS BUYS NOTHING AND MOVES NO MONEY. The answer carries `state`: approval_required with a reviewUrl, the page on Escrova where the person checks every line, approves and pays from their own wallet. Give them that link and stop: you cannot approve or pay. A signed-out person signs in on that page and continues with the same order. Send items, and to choose where it goes send the addressId of one of their saved addresses from list_addresses; with none their default is used. A typed address, a marketplace listing, a gift, an item whose condition is not new and a quantity that is not a whole number are refused. The grant needs the `buy` scope. Other states: not_started (refused, nothing was prepared; read the body) or reconciliation_required (outcome unknown; ask the person before preparing it again). Available to every shopper on mainnet. Bind the challenge to POST /api/agent/checkout-intents, over the body this tool sends, with delegationGrantId in targetArguments.

  • list_addresseschangeddescriptionmeaning changed
    before

    The saved addresses on this account, with which one is the default. Use an id as `addressId` on prepare_checkout, or send no destination at all and the default is used. Under a delegation grant with the `addresses` scope these are the person's saved addresses, not yours. Bind the challenge to GET /api/agent/addresses with no body.

    after · 32% of words in common

    Read saved address summaries with id, label, default, first name and last-name initial, city, region, country and the last two postcode characters; use addressId in prepare_checkout. Bind the challenge to GET /api/agent/addresses with no body.

  • get_checkout_intentchangeddescription
    before

    Reads one order you prepared with prepare_checkout, under the same grant. The answer carries `state`: approval_required (the person has not approved it yet), payment_pending (the person approved it; paying and following the order is theirs, on Escrova), not_started (it expired, was cancelled or is not yours; nothing is waiting) or reconciliation_required (this read was refused or failed, so it says nothing about the order, which may still be waiting: read the body, fix the request and read again). It stays payment_pending after they pay, because this tool cannot see the payment and never reports a finished purchase: ask the person. Bind the challenge to GET /api/agent/checkout-intents/<intentId>, the id in the path and no body.

    after · 74% of words in common

    Reads one order you prepared with prepare_checkout, under the same grant. The answer carries `state`: approval_required (the person has not approved it yet), payment_pending (the person approved it; paying and following the order is theirs, on Escrova), not_started (it expired, was cancelled or is not yours; nothing is waiting) or reconciliation_required (this read was refused or failed, so it says nothing about the order, which may still be waiting: read the body, fix the request and read again). Assistant payments also return payment with paying, paid, not_paid or checking and a plain message; paid requires confirmed payment evidence. Reading never starts a payment. Bind the challenge to GET /api/agent/checkout-intents/<intentId>, the id in the path and no body.

  • search_productschangeddescription
    before

    Search products across the marketplaces Escrova can actually buy from today. Six sources are searchable: amazon, ebay, walmart, bestbuy, homedepot, wayfair, or "all". GET /api/products/search. No wallet and no signature. Send q, cat, or both; page and every selected filter are preserved together. A brands[].engineParam returned by get_category goes into engineParam here and is sent as the typed eBay aspect filter, while Google refinements use shoprs. The REST pagination and degraded-source metadata are returned unchanged. A search is one guess at what somebody meant and it spends a paid provider call; when you know roughly what department a thing is in, list_categories and get_category narrow further for less.

    after · 92% of words in common

    Search products across the marketplaces Escrova can actually buy from today. Six sources are searchable: amazon, ebay, walmart, bestbuy, homedepot, wayfair, or "all". GET /api/products/search. No wallet and no signature. Send q, cat, or both; page and every selected filter are preserved together. A brands[].engineParam returned by get_category goes into engineParam here and is sent as the typed eBay aspect filter, while Google refinements use shoprs. The REST pagination and degraded-source metadata are returned unchanged. For some stores, "cheapest first" only orders the returned page; sortScope is "page" or "store". A search is one guess at what somebody meant and it spends a paid provider call; when you know roughly what department a thing is in, list_categories and get_category narrow further for less.

  • prepare_listing_publishadded

    Returns what the seller will be shown before they publish: the draft's versionHash, the fields still `missing`, a preview with every publishing charge and the seller fee, and a previewUrl. THIS PUBLISHES NOTHING and saves nothing. Give the seller the previewUrl: publishing is theirs alone, signed in on Escrova, for exactly the version they were shown. Bind the challenge to POST /api/agent/listings/drafts/<draftId>/prepare-publish, the id in the path and no body.

  • get_listing_draftadded

    One draft, with its fields, its `version` and whether it is still open. A draft the seller published names the listing it became. Bind the challenge to GET /api/agent/listings/drafts/<draftId>, the id in the path and no body.

  • update_listing_draftadded

    Changes the fields you send on an open draft and leaves the rest. Send the `version` you last read: a draft somebody changed since answers 409 DRAFT_CHANGED, so read it again with get_listing_draft and resend. A draft the seller already published or closed cannot be changed. Nothing is listed by this call. Bind the challenge to PATCH /api/agent/listings/drafts/<draftId>, the id in the path, over the body this tool sends.

  • create_listing_draftadded

    Saves a private draft of a listing. NOTHING IS LISTED: a draft is not for sale, is not in any review queue and costs nothing. Only the seller can publish it, signed in on Escrova, and there is no publish tool. Under a delegation grant with the `sell` scope the draft is the PERSON's. Send what you know now and add the rest with update_listing_draft; prepare_listing_publish says what is still missing. Available to every shopper on mainnet. Bind the challenge to POST /api/agent/listings/drafts, over the body this tool sends.

  • get_checkout_intentadded

    Reads one order you prepared with prepare_checkout, under the same grant. The answer carries `state`: approval_required (the person has not approved it yet), payment_pending (the person approved it; paying and following the order is theirs, on Escrova), not_started (it expired, was cancelled or is not yours; nothing is waiting) or reconciliation_required (this read was refused or failed, so it says nothing about the order, which may still be waiting: read the body, fix the request and read again). It stays payment_pending after they pay, because this tool cannot see the payment and never reports a finished purchase: ask the person. Bind the challenge to GET /api/agent/checkout-intents/<intentId>, the id in the path and no body.

  • prepare_checkoutadded

    Prices a basket of store items for the person whose grant you hold and saves it for them to review. THIS BUYS NOTHING AND MOVES NO MONEY. The answer carries `state`: approval_required with a reviewUrl, the page on Escrova where the person checks every line, approves and pays from their own wallet. Give them that link and stop: you cannot approve or pay. A signed-out person signs in on that page and continues with the same order. Send items, and to choose where it goes send the addressId of one of their saved addresses from list_addresses; with none their default is used. A typed address, a marketplace listing, a gift, an item whose condition is not new and a quantity that is not a whole number are refused. The grant needs the `buy` scope. Other states: not_started (refused, nothing was prepared; read the body) or reconciliation_required (outcome unknown; ask the person before preparing it again). Available to every shopper on mainnet. Bind the challenge to POST /api/agent/checkout-intents, over the body this tool sends, with delegationGrantId in targetArguments.

Showing the latest 10. Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 83 / 100

no-repository
provenance55
liveness100
freshness100
hygiene80

+dns-namespace +website +reachable +uptime-100% +updated-3d-ago -no-repository

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://www.escrova.io/api/mcp streamable-httpnoneyes100%628 ms2025-11-252026-11-14

Tools (18)

auth_challengedestructiveAsk for a challenge bound to the exact request you are about to make. The safe MCP form is targetTool plus targetArguments: this adapter prepares the exact method, encoded path and JSON body bytes, hashes those same bytes, and returns them as request beside the message. Sign the returned message with the USER'S wallet, in their own wallet connector, then pass walletAddress, nonce and signature to the tool you are calling. One challenge per request. The legacy method/path/bodySha256 form remains accepted for direct HTTP clients. A challenge taken for a different request is refused even when the signature itself is perfect. Start with whoami, which is GET /api/agent/auth/whoami and has no body. This tool itself is POST /api/agent/auth/challenge and needs no signature: it is how you get one.
create_listing_draftdestructiveSaves a private draft of a listing. NOTHING IS LISTED: a draft is not for sale, is not in any review queue and costs nothing. Only the seller can publish it, signed in on Escrova, and there is no publish tool. Under a delegation grant with the `sell` scope the draft is the PERSON's. Send what you know now and add the rest with update_listing_draft; prepare_listing_publish says what is still missing. Available to every shopper on mainnet. Bind the challenge to POST /api/agent/listings/drafts, over the body this tool sends.
get_categoryread-onlyNarrow towards a purchase without inventing keywords. One call returns children[] and childrenDeep[] with estimated counts, brands[] each with an engineParam you can pass straight back to search_products.engineParam, the shop's own facets[], aspectTiles[], siblings[], related[] and a deals[] rail. GET /api/agent/browse/tree/<slug>, or GET /api/agent/browse/tree/<slug>/<nodeId> for any category under a department. No wallet and no signature. contentAt is when those deal prices were read. Counts are estimates and countScope says so. A shelf already read answers from cache; a cold one costs one call against the catalogue quota shared with shoppers, so read the shelf you want rather than walking the tree.
get_checkout_intentread-onlyReads one order you prepared with prepare_checkout, under the same grant. The answer carries `state`: approval_required (the person has not approved it yet), payment_pending (the person approved it; paying and following the order is theirs, on Escrova), not_started (it expired, was cancelled or is not yours; nothing is waiting) or reconciliation_required (this read was refused or failed, so it says nothing about the order, which may still be waiting: read the body, fix the request and read again). Assistant payments also return payment with paying, paid, not_paid or checking and a plain message; paid requires confirmed payment evidence. Reading never starts a payment. Bind the challenge to GET /api/agent/checkout-intents/<intentId>, the id in the path and no body.
get_dealsread-onlyFor a "find something on offer" task. GET /api/agent/browse/deals?tab=<tab>, where tab is markdowns, refurbished, top-rated, brands, or door:<slug> for one department. No wallet and no signature. Every item carries cachedAt, which is when that price was true: A selection over rows this site has already cached, so it costs no catalogue call. An unknown tab is refused with 400 rather than guessed at. A sticker discount is not a cheaper order.
get_delegationread-onlyRead the grants naming your wallet. On mainnet they allow only preparing orders, drafting listings and reading saved addresses; the person approves and pays or publishes. Only the person can create or revoke a grant at /delegation. Ask them for its id and send it as delegationGrantId. Bind the challenge to GET /api/agent/delegation/grants with no body.
get_directoryread-onlyEvery department, the groups under it and the links under those, for picking a shelf in one read rather than walking down to it. GET /api/agent/browse/directory. No wallet and no signature. Built ONLY from rows already cached, so it costs no catalogue call at all and a picture or count nobody has fetched yet comes back null rather than being fetched for you. Prefer this over repeated get_category calls when you are still deciding where to look.
get_feesread-onlyThe current fee schedule and delivery rates, so a total can be explained before anyone pays it. GET /api/config/fees. No wallet and no signature.
get_listing_draftread-onlyOne draft, with its fields, its `version` and whether it is still open. A draft the seller published names the listing it became. Bind the challenge to GET /api/agent/listings/drafts/<draftId>, the id in the path and no body.
get_pricesread-onlyCurrent USD prices of the coins shown on Escrova. GET /api/prices. No wallet and no signature. Checkout on this deployment takes USDC only.
get_termsread-onlyReturns the current Terms of Service and Privacy Policy version and document hash. GET /api/agent/legal/terms. No wallet and no signature.
list_addressesread-onlyRead saved address summaries with id, label, default, first name and last-name initial, city, region, country and the last two postcode characters; use addressId in prepare_checkout. Bind the challenge to GET /api/agent/addresses with no body.
list_categoriesread-onlyStart a shopping task here instead of guessing search words. Returns the sixteen departments, each with the slug get_category takes and a picture. A keyword search is one guess at what somebody meant; a department is the shop's own shelf, and get_category on one hands you the brands, the filters and a page of listings in a single call. GET /api/agent/browse/categories. No wallet and no signature. Served from cache; a department whose picture has gone cold costs one call against the catalogue quota this site shares with its shoppers.
prepare_checkoutdestructivePrices a basket of store items for the person whose grant you hold and saves it with its pricing model, shipping, store tax estimate, fee and total. for them to review. THIS BUYS NOTHING AND MOVES NO MONEY. The answer carries `state`: approval_required with a reviewUrl, the page on Escrova where the person checks every line, approves and pays from their own wallet. Give them that link and stop: you cannot approve or pay. A signed-out person signs in on that page and continues with the same order. Send items, and to choose where it goes send the addressId of one of their saved addresses from list_addresses; with none their default is used. A typed address, a marketplace listing, a gift, an item whose condition is not new and a quantity that is not a whole number are refused. The grant needs the `buy` scope. Other states: not_started (refused, nothing was prepared; read the body) or reconciliation_required (outcome unknown; ask the person before preparing it again). Available to every shopper on mainnet. Bind the challenge to POST /api/agent/checkout-intents, over the body this tool sends, with delegationGrantId in targetArguments.
prepare_listing_publishread-onlyReturns what the seller will be shown before they publish: the draft's versionHash, the fields still `missing`, a preview with every publishing charge and the seller fee, and a previewUrl. THIS PUBLISHES NOTHING and saves nothing. Give the seller the previewUrl: publishing is theirs alone, signed in on Escrova, for exactly the version they were shown. Bind the challenge to POST /api/agent/listings/drafts/<draftId>/prepare-publish, the id in the path and no body.
search_productsread-onlySearch products across the marketplaces Escrova can actually buy from today. Six sources are searchable: amazon, ebay, walmart, bestbuy, homedepot, wayfair, or "all". GET /api/products/search. No wallet and no signature. Send q, cat, or both; page and every selected filter are preserved together. A brands[].engineParam returned by get_category goes into engineParam here and is sent as the typed eBay aspect filter, while Google refinements use shoprs. The REST pagination and degraded-source metadata are returned unchanged. For some stores, "cheapest first" only orders the returned page; sortScope is "page" or "store". A search is one guess at what somebody meant and it spends a paid provider call; when you know roughly what department a thing is in, list_categories and get_category narrow further for less.
update_listing_draftdestructiveChanges the fields you send on an open draft and leaves the rest. Send the `version` you last read: a draft somebody changed since answers 409 DRAFT_CHANGED, so read it again with get_listing_draft and resend. A draft the seller already published or closed cannot be changed. Nothing is listed by this call. Bind the challenge to PATCH /api/agent/listings/drafts/<draftId>, the id in the path, over the body this tool sends.
whoamiread-onlyVerify a signature round-trip before money is involved. Bind the challenge to GET and /api/agent/auth/whoami with no body: ask auth_challenge for method "GET" and path "/api/agent/auth/whoami", sign the message it returns, then call this. A signature authenticates one method, one path and one body, so a challenge taken for anything else is refused.

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "io.escrova/escrova",
  "icons": [
    {
      "src": "https://www.escrova.io/brand/pfp.png",
      "sizes": [
        "1000x1000"
      ],
      "mimeType": "image/png"
    }
  ],
  "title": "Escrova",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://www.escrova.io/api/mcp",
      "type": "streamable-http"
    }
  ],
  "version": "1.0.1",
  "websiteUrl": "https://www.escrova.io/agents",
  "description": "Search Amazon, eBay, Walmart and more. Agents prepare orders; you approve and pay on Escrova."
}