https://mcp.getagentmall.com. Every tool needs an organization API key. Inputs are snake_case. Walmart only (mrc_walmart). Prices and totals are integer cents.
Auth failures (unauthorized, invalid_key), the 15 requests a second per key limit (rate_limited), and the search cap (daily_limit_reached) are in Auth and keys. A missing cart or checkout id is session_not_found. A cart that timed out, was cancelled or was checked out is session_expired (HTTP 410): start a new cart with create_cart.
Returns and refunds are not available. commit_unknown means the order may have been placed: call get_order and do not retry.
Catalog
search_catalog
Keyword search. Default source is oxylabs: Walmart’s result page, reranked, about 5 seconds. Channel3 is asked at the same time; when its titles match and it answers first, the response is source: "catalog" in about 1 second. source: "catalog" is that index only. source: "merchant" reads Walmart search in the session browser and needs session_id.
A repeat of the same oxylabs or catalog query within 15 minutes returns cached_at. Merchant search is not cached. An empty default search falls back to Channel3 with relevance: "low".
Returns up to 10
products: id, merchant_id, title, brand, url, image_url, price, currency, availability (in_stock, out_of_stock, or null). oxylabs and catalog also return relevance (ok or low) and a hint when relevance is low. Check titles before using a result.
get_product
Reads one product page. Returns product in the search shape, plus reviews (rating, count) when the page has them. When the product has selectable options (size, colour, pack count), the response includes options and variants.
options is the list of axes: [{ name, values: [{ label, available }] }]. variants is every combination: [{ id, url, options: [{ name, label }], price, unit_price, availability, featured }]. price and unit_price are integer cents when the merchant provides per-variant pricing, otherwise null. The variant the url pointed at is featured: true. Use the variant id in update_cart line_items[].item.id and its url in line_items[].item.url.
lookup_catalog
Reads up to 10 pages in one call, one after another. Each id is a search id or url. A Walmart item id reads https://www.walmart.com/ip/<id>.
Returns
products and failed ({ id, error } per page). One bad page does not fail the call. An id that is neither an item id nor a product url fails the call with invalid_input before any page opens. merchant_unavailable if the merchant is not Walmart.
Cart
A cart keeps one browser across its cart and checkout calls, including after a failedcreate_checkout. If that browser is gone, the call runs in a new one, which may be signed out with a different merchant cart, and the result or error has browser_released: true. Call get_cart before going on.
create_cart
Starts an empty cart. The cart id is the id for later calls.
guest (default) is a new browser. Sign in with Evervault-encrypted email and password (ev:…). platform reuses the seeded signed-in AgentMall Walmart context and clears that shared cart.
cart_clear_failed means the clear stopped partway. The error has removed and left. Call create_cart again to keep clearing.
get_cart
Reads the live merchant cart. session_id is the cart id.
Returns { id, merchant_id, currency, line_items, totals }. A line is { id, item, quantity, totals }. item is { id, title, price, url }. totals is merchandise only (subtotal and total). A line the merchant marks as currently unavailable carries available: false and a zero price. Remove it before checkout. A block page in place of the cart is merchant_blocked. Wait and retry. update_cart returns the same error when the clear hits that page.
update_cart
Replaces the cart: clear, add each line, then read. An empty line_items only clears. A failed add stops the call. Each add has a 90-second server-side deadline. If the merchant does not respond in time the call returns timeout.
Each line is
{ item: { id, url }, quantity, options }. url is the product page. quantity is a whole number from 1 to 12. options is optional and names the size, colour, or pack, for example { "Clothing Size": "M" }. List each product once.
cart_clear_failed means the clear stopped partway, before any add. The error has removed and left. Call again to keep clearing.
cancel_cart
Returns the cart as last stored, then releases the browser. Pass id, the cart id.
Sign-in
sign_in
On a guest cart, pass email and password as Evervault ev: ciphertext (from pnpm manager credentials collect). Never send plaintext. A guest call without encrypted credentials returns invalid_input and does not open the browser. A platform cart uses WALMART_EMAIL / WALMART_PASSWORD as ev: ciphertext. With no encrypted platform account it returns sign_in_unavailable (retry: "never", next: "create_checkout").
Returns { signed_in: true }, or { status: "challenge_required" } when Walmart needs an SMS code. A challenge is a result, not an error. Then call submit_sign_in_otp.
submit_sign_in_otp
Submits the SMS code after a challenge. Pass cart_id and code. Returns { signed_in: true }.
sign_out
Signs the merchant account out. Pass session_id (the cart id).
Checkout
create_checkout, get_checkout, update_checkout, and cancel_checkout use the cart id. Checkout id and cart_id are that same id.
fulfillment.delivery_date is the date parsed from the delivery line already on the checkout: { earliest, latest, text }. latest is null for one day. The field is null when that line has no readable date, and it is not part of review_hash.
create_checkout
Opens checkout and returns it: status, line_items, totals, fulfillment.methods, review_hash. Nothing is placed.
out_of_stock means Walmart sent checkout back to the cart. unavailable_items lists the lines it flagged as { id, title }. It is missing when those lines could not be read.
totals_unstable means the checkout total could not be verified against the line breakdown. totals has unreadable (the label that could not be parsed) or the subtotal, tax, fees, and total that were read, with null for any row that was missing.
get_checkout
Re-reads the open checkout. Does not change the page. Pass id.
update_checkout
Writes an address, selects shipping, delivery, or pickup, or adds a vaulted card. Pass id and at least one of fulfillment.address, fulfillment.method, or payment.instruments. Returns the checkout, including a new review_hash and fulfillment.methods.
To show estimated shipping and tax before asking for a card, call create_checkout, then update_checkout with only fulfillment.address (and optionally fulfillment.method). The returned totals include subtotal, tax, and total with no card. Treat those as estimates until complete_checkout. status stays incomplete until payment is also set. get_checkout re-reads the same figures.
fulfillment.address is a US postal address: street_address, address_locality, address_region, postal_code, address_country, plus optional first_name, last_name, extended_address, phone_number. One of the names is required.
fulfillment.method is { id, kind, label }. kind is shipping, delivery, or pickup. Use an id from fulfillment.methods. Time slots are not listed.
A card instrument is { id, handler_id: "dev.agentmall.card", type: "card", selected, credential: { type: "ciphertext", value } } (Evervault ev:…). Collect cards in the console /vault page. The call does not take a raw card number.
cancel_checkout
Leaves checkout without placing. Pass id. Returns the checkout with status: "canceled". The cart stays open.
complete_checkout
Places the order when review_hash and total_minor still match the live review. One approval, one merchant commit. Not retried after submit may have happened.
Returns the checkout with
status: "completed", order.id and test. The cart session ends. With a test key (am_test_), the review is still read and checked, but nothing is submitted to the merchant: the order is stored as placed with test: true, order.permalink_url is empty, and there is no fee. A live key (am_live_) returns test: false.
review_changed also carries review (the live review), reason and changes. Each part of the review is hashed. changes lists the parts whose hash differs, as { field, before, after }. field is items, quantities, address, delivery, payment or total. reason is the first part that differs, in this order:
A price moves whenever an item, address or delivery moves, so
price_changed is only the reason when nothing else changed. Read changes for every part that moved.
Order
get_order
Reads an order by platform id from complete_checkout. No session. Totals are cents. When the page has no total, or there is no merchant order to open, the stored order total is used. A failed live read is an error, not the stored row.
Returns { id, checkout_id, merchant_id, status, merchant_status, currency, totals, permalink_url, test }. status is completed or canceled once placed, pending while the order is being placed, failed when the order was not placed, and unknown when the outcome is not yet known. merchant_status is the page text when the page has one. test is true for an order placed with a test key. A test order is returned as stored and the merchant is not opened.