apiv3), no extra gateway and (in the current phase)
no credentials required for the public tools.
Discovery doc (live):
This page is grounded in the live tool registry
(
McpToolRegistryService). The discovery doc at
/.well-known/mcp.json is always the canonical source of truth for the exact
tool names, descriptions, and JSON-schema input shapes — if this page and the
discovery doc disagree, the discovery doc wins.Transport + protocol
The backend speaks MCP over HTTP. See MCP Server for the full transport reference. In short:
All
/mcp/v1/* routes accept both a flat body ({ name, arguments }) and a
JSON-RPC 2.0 envelope ({ jsonrpc: "2.0", id, method, params }) — the shape every official
MCP client sends. The response mirrors the request shape. The advertised protocolVersion is
2024-11-05.
The tool registry
The registry currently exposes 25 tools. Tools are read-only unless marked write. Three observability/diagnostic tools are admin-gated: they require an_adminKey argument
that matches the server’s MCP_ADMIN_SECRET.
Catalog + discovery (read-only)
Merchant discovery — opt-in only (read-only, except where noted)
These tools only surface merchants who have setagenticDiscoveryEnabled: true. See
Merchant Discovery Rules.
Cart + order (write, except reads)
Trust + financing (read-only)
Observability / diagnostics (admin-gated, read-only)
Tool annotations (preview)
The MCP spec lets a server tag each tool with behavioural hints so a client can reason about safety before calling —readOnlyHint (does not mutate state), destructiveHint (may perform
an irreversible update), and openWorldHint (touches an external system). These annotations ship
alongside the Streamable HTTP transport (gated
behind MCP_STREAMABLE_HTTP_ENABLED, preview) — the current /mcp/v1/* tools/list response
does not yet include them, so treat this table as the planned classification:
findInventory and getInventoryDrift additionally carry openWorldHint: true (they reach
Impact / the Shopify Admin API).
About findInventory
findInventory is the cart-composition + multi-brand discovery primitive — it queries across
inventory sources and returns each match with stock state, price, image, and a buyable product
URL, so an agent can build a cart across results.
The source argument selects the inventory source: native, impact_brand, rakuten, or
any (union, deduplicated by SKU):
native— the Droplinked catalog (published, visible, purchasableProductV2/ProductSkuV2). Always live.impact_brand— the live multi-brand discovery path. WhenIMPACT_LIVE_SEARCH_ENABLED=true,findInventoryproxies Impact’s liveCatalogs/ItemSearchendpoint over the full multi-brand advertiser catalog (keyword-matched asName~"<query>"), with a thin ~6h per-keyword cache and zero bulk replication. This is how an agent reaches brands like Walmart or Lids through the samefindInventorycall. The path is fail-open: on a rate-limit (Impact’s quota is hourly) or any upstream error it serves a stale cache hit if present, otherwise degrades to native results — it never breaks the call. With the flag off,impact_brandreturns no live rows and the call falls back to native results.rakuten— reserved for the Rakuten feed; returns no rows until that source is wired.
intentId (from recordAgenticIntent) is supplied and IMPACT_ATTRIBUTION_ENABLED is
on, each impact_brand result is enriched with a Model-A trackedBuyUrl — a tracked
deep-link the agent should drive the buyer to, so the advertiser’s pixel credits Droplinked
(publisher), tagged subId1=dl-agentic:{intentId}. Enrichment is per-item fail-open: a
link-gen failure returns the product without a trackedBuyUrl rather than dropping it. See
Attribution + Commission.
The per-item attestation field is a privacy-redacted status (unattested by default for
external impact_brand items, which carry no native attestation) and respects each merchant’s
attestation policy for native items, so it never over-discloses.
When DISCOVERY_RANKER_ENABLED=true, results are re-ordered by their merchant’s
attestation-weighted trust score (and each item carries a trustScore). With the flag off,
results come back in source order.
Multi-brand Impact catalog
The large multi-brand affiliate catalog (Flatlay × Impact Partner REST) is reachable two ways:- Through
findInventory(source: impact_brand/any) — the public MCP path. WhenIMPACT_LIVE_SEARCH_ENABLED=truethis proxies Impact’s liveCatalogs/ItemSearchover the whole multi-brand advertiser catalog (keywordName~"<query>"), query-time, never bulk-replicated, with a thin ~6h per-keyword cache. This is the primary agent-facing path and is described in AboutfindInventoryabove. - Through a merchant-authenticated connector — a separate, not public surface for a merchant to manage their own Impact connection. It is read-only, query-time (never bulk-replicated), and rate-limited per merchant.
All four connector endpoints require a merchant JWT (PRODUCER role). The connector never
exposes write methods, even when the token carries RW scope.
Privacy + cost-efficiency
Inventory + attestation tools respect each merchant’sMerchantAttestationPolicy:
- Default: private — merchants who have not opted in see a redacted attestation status.
lenders_onlyscope — visible to allowlisted lenders.publicscope — visible to anyone.
searchMerchants, getMerchantDirectory,
getMerchantCatalogSummary, recordAgenticIntent) hard-filter on agenticDiscoveryEnabled —
non-opted merchants are invisible, and recordAgenticIntent returns opt_in_required rather
than writing a ledger row.
Where to go next
- MCP Server — full transport reference + how to connect Claude / ChatGPT / Cursor
- Attribution + Commission — how agentic conversions settle
- Merchant Discovery Rules — opt-in + tiering
- Storefront MCP Discovery — per-shop discovery doc
- InventoryOS concept — the architectural model underneath