Changelog
0.0.18 (2026-09-10)
Features
- Agents receive the store's policy pages, typed — An AI agent asked "can I send it back if it doesn't fit?" had nothing to answer with: responses carried no terms and no page to point the shopper at. A new Policies and links section (Stores Configuration Mirasvit Extensions Agentic Commerce) maps the store's existing CMS pages to the refund, shipping, terms and privacy link types, and cart responses now carry them as typed links with the page titles. The FAQ type can point at a CMS page, or at the Knowledge Base and its categories on stores running that extension. Nothing is published until a page is selected, and a page that is disabled or not assigned to the store view is never sent, so an agent is never handed a URL that answers 404. Store-view scoped.
- Agents receive the return and warranty terms themselves, not just a link — Selecting a CMS page as the return or warranty policy publishes its text on every catalogue and cart response, typed so a platform can present it. The text is the merchant's own page, sanitised the same way agent-facing product descriptions are; nothing is summarised, reworded or generated. A product can carry its own terms instead of the store-wide ones through a configurable product attribute naming a different page.
- Terms can be published as must-show — Each policy type carries a Require buyer display setting, on by default, which tells an agent platform it must show that page's text to the buyer rather than merely knowing it. Turning it off keeps the terms published and drops the obligation. The whole terms layer has its own switch: the protocol field carrying it belongs to a version later than the one this store advertises, so it can be turned off without a release if a platform will not accept it, and the typed links are unaffected either way.
- Agents can now cancel a cart they created — There was no way for an AI agent to clean up after itself: every abandoned cart sat on the store until the cleanup cron ran. The new
cancel_cartretires a cart the shopper decided against and answers with its final contents, so the agent can say what was dropped. The response carries no link back to the cart and no expiry date, because neither is true of a cart that is gone; the cart id stops working afterwards, and cancelling twice returns exactly the same answer as the first time. A cart the shopper has already opened in the browser is refused — from that point it is theirs, and an agent holding the old link must not be able to empty it. Cancelled carts are now picked up by the existing cleanup cron instead of lingering. - Choose separately which product text agents see in search results — A new Description field priority (listings) setting (Stores Configuration Mirasvit Extensions Agentic Commerce General) controls which attribute the short summary in search and lookup results is taken from, independently of the existing setting used on single-product responses. It defaults to Short Description, then Meta Description, then Description, so a store that keeps its summary in a custom attribute just says so. Store-view scoped.
- Agent responses are now signed — The store publishes an ES256 public key in its
/.well-known/ucpprofile, which is how the protocol lets an AI agent confirm it is really talking to this store, but nothing was ever signed with it: the key advertised a guarantee the answers did not carry. Every/agent/mcpresponse now ships the RFC 9421Signature,Signature-InputandContent-Digestheaders, so an agent can check both that the answer came from this store and that nothing altered it on the way — using the key it already fetched. Stores without a keypair, or with the profile document switched off, keep answering exactly as before, unsigned: a signature is never allowed to turn an answer into an error.
Improvements
- ⚠️ Agent messages are now objects, as the protocol requires —
messagescarried plain strings, which no platform can act on: the schema has required an object with a type, a machine-readable code and the text since before the version this store advertises, and a string could only ever be printed. Each message now states whether it is a warning, what kind it is, and how it must be presented — which is also what lets a compelled policy disclosure say which term it refers to. An integration readingmessagesas a list of strings must read thecontentfield of each entry instead. - Search results no longer carry the whole product page — Every product in a
search_catalogorlookup_catalogresult carried its full description — on a typical catalogue that is roughly nine thousand characters each, so ten results spent a fifth of an AI agent's working memory before it had even chosen a product. Results now carry a short plain-text summary instead, trimmed to 400 characters, with the full description still returned byget_product. Variants also stop repeating the product's own image list when it is identical to the product's, which on a search page was another quarter of the response;get_productstill returns every variant complete. Measured on a real catalogue, a ten-product search response dropped by 72%. - Cart responses now state when the cart expires — The response carries
expires_at, the moment an un-picked-up agent cart is cleaned up (its last update plus the configured lifetime), so an agent coming back later knows whether the link it holds is still good. A cart the shopper has already opened in the browser states no expiry, because from that point it lives by the store's ordinary cart lifetime rather than this one. - ⚠️ Each cart line now carries its own totals — Line items reported a single
costamount, which the UCP cart schema does not define; that field is gone, replaced by thetotalsbreakdown the schema requires. A line now reports its subtotal, its share of an automatic discount, its tax and its total — so an agent can tell the shopper which line the discount applied to, not just that the cart total is lower than the sum of its parts. An integration readingcostoff a line item must readtotalsinstead. - Building a large agent cart takes fewer database queries — Product options were queried again for every line item, up to 200 extra queries on a 100-item
create_cart; they are now read from the product the extension has already loaded. - Cart and option messages are translated — All the wording added by this release — the per-line total labels (Subtotal, Discount, Tax, Total), the cancelled-cart, picked-up-cart and missing-cart messages, the "no product matched" and unreadable-cursor notices, the retry-key refusal, and every custom-option error an agent can hit — is translated in all 16 locales the extension ships, so it no longer reads as English islands next to Magento's own translated totals.
- The cart tools take their arguments where the protocol says they are —
get_cart,update_cartandcancel_cartadvertised the cart id insidecart, while the UCP method signature puts it at the top level. The store had already started accepting both, but the advertised shape is what a conformant agent validates its own request against — so a strict client refused to send the call at all, and three of the four cart operations were unreachable from it. The schemas now describe exactly what UCP describes:get_cart(id),cancel_cart(id),update_cart(id, cart). Clients written against the older shape keep working:cart.idis still accepted. - ⚠️ A retry no longer builds a second cart — Agent clients send a
meta.idempotency-keywith every call that changes something, precisely so a lost response can be retried safely; this extension ignored it, so a retriedcreate_cartleft the shopper with two carts and a retriedupdate_cartapplied its change twice. The key is now honoured: repeating a call with the same key replays the first answer instead of acting again, and reusing a key for a different request is refused rather than quietly doing something the agent did not intend. Keys are remembered for 24 hours and cleared by the existing hourly cleanup. Adds a newmst_agentic_idempotencytable (applied onsetup:upgrade). lookup_catalognames the ids it could not find — Ids that matched nothing were dropped from the answer without comment, so an agent that mistyped one SKU got a shorter list with no way to tell "this product does not exist" apart from "you asked for six and got five". Unmatched ids are now reported inmessages.- ⚠️ One rule for what an agent can find —
search_catalogapplied two different visibility rules depending on the request: a call with filters and no search words listed products that the very same tool refused to return for any wording, because it mirrored the storefront's split between a category page and the search box. An AI agent has no category page to browse — every call it makes is a search — so a product hidden from search is now hidden from the agent as well, whichever way it asks. Stores that keep superseded products visible in the catalogue but out of search will see those products leave agent results; they remain fully available by SKU, which is how an agent reaches a product a shopper named.
Fixed
- Products with required custom options can finally be added to an agent cart — Magento custom options (Edition, Licence type, Support plan, and the like) were invisible to AI agents and absent from the cart request the extension built, so
create_cartcame back reporting success with an empty cart and the note "The product's required option(s) weren't entered". On a catalogue where every product carries a required option, no product could be bought through an agent at all. The catalogue tools now list each custom option with its selectable values, and expand the required ones into real purchasable variants — one per choice, each with its own price including the option's price modifier, soprice_rangefinally spans what the product actually sells for. Adding a variant to a cart carries that choice through; referencing the bare SKU takes each required option's default. The cart echoes the full choice back inline_items.item.idand spells it out in the item title, so an agent replaying a cart intoupdate_cartrebuilds the same one instead of silently falling back to the defaults. - Products with a required text option (engraving, gift message) can be bought by an agent — An option the shopper types rather than picks has no value list, so it could not be answered and its product was refused outright. An agent can now answer it: the text travels inside the variant id alongside any chosen values,
get_productreports the option with its input type and character limit, and a required one left blank is refused by name with the exact syntax that answers it. Date and file-upload options still cannot be answered through an agent and say so. - An expired or unknown cart id now says so, instead of looking like a store failure — Replaying a cart id that no longer resolves — never created, already ordered, or cleaned up after its lifetime — answered with an opaque "Internal error" that an AI agent could not tell apart from the store being broken, so it had no way to know that simply starting a new cart would work. It now returns a distinct "Cart not found" error naming the id, while a missing or malformed argument keeps its own separate error as before.
- Cart totals now show the discount, so the numbers add up —
totalscarried only a subtotal and a total, so an automatic cart price rule (or tax, or a store-credit total) appeared as an unexplained difference between the two and an AI agent had nothing to tell the shopper about it. Every total Magento collects is now reported, with discounts as their own negative entry named after the rule that applied them, and the breakdown is guaranteed to add up to the total the agent quotes. Zero-valued tax and shipping lines are left out rather than implying "no tax" / "free shipping" before the shopper has given an address. - A cart that could not be built no longer reports success — When none of the requested line items could be added, the cart tools answered
successwith zero items and buried the reason inmessages, which reads to an AI agent as "added to the shopper's cart". Such a request now fails with the actual reason, and anupdate_cartthat resolves to nothing leaves the shopper's existing cart untouched instead of emptying it. - ⚠️ A cart the shopper has picked up now says so — Opening the continue_url hands the cart to the shopper's browser and ends the agent's access to it, which is deliberate. But the agent was then told the cart "no longer exists" — the same words a cart that was never created gets — so its only sensible move was to build another one. It is now told what actually happened, and the cart tools state up front that handing over the continue_url is a one-way transfer. Adds an
agentic_masked_idcolumn and a supporting index to thequotetable (applied onsetup:upgrade), which is what lets the two cases be told apart after the handoff. - A pagination cursor that cannot be read no longer looks like paging — An unreadable
pagination.cursorquietly restarted the listing at page one, so an agent walking a large result set was served the same page over and over while believing it was making progress. The restart still happens — page one is the only page that can be trusted at that point — but the response now says so. - A product the store does not sell is no longer described to an agent —
get_productreturned disabled products (marked unavailable, but described in full) and would let one into a cart, whilelookup_catalogof the same SKU returned nothing — the same product, two answers. The listing tools were always store-scoped; the by-SKU ones went straight to the product repository, which filters nothing. Disabled products, and products belonging to another website, are now refused on every path. Visibility is deliberately not part of this: naming a SKU is a direct reference, so a Catalog only product is still returned and still purchasable, exactly as it is from its own product page. - An unknown SKU says so, instead of looking like a store failure — Asking
get_productfor a SKU that does not exist answered with an opaque "Internal error" and a correlation id, which an AI agent cannot tell apart from the store being broken — so it had no way to know that suggesting something else was the right move. It now returns a distinct "Resource not found" naming the id, the same treatment an expired cart id already had. - Price filters in agent search now actually narrow the results —
search_catalog'sprice_minandprice_maxwere ignored outright: on a catalogue of $20/$32/$34/$45 products, asking for everything under $10 returned all four, and so did asking for everything over $1,000. An agent asked for "bags under $10" therefore offered the shopper $45 bags as matches, with nothing in the answer to suggest the budget had been dropped. Both bounds are now applied as a real price range, so a price-constrained request returns only products inside it. - An unusable cart quantity is refused instead of quietly becoming 1 — A quantity of
0— which is how an agent client says "drop this line" — and a malformed one such as"two"were both silently rounded up to a quantity of one, so a client-side mistake turned into a real order for an amount nobody asked for. Such a request is now rejected, naming the line item at fault and pointing atupdate_cartfor removals, so the agent can correct itself instead of confirming a purchase the shopper did not want. Leaving the quantity out still means one, as the tool has always documented. get_productno longer looks like a product with no description — Search and lookup results carry the description asdescription.plain, but the single-product tool returned onlydescription.html, so a client that read the plain text off a listing and then asked for the full detail found the key missing and reported the product as having no description at all — the detail tool looking emptier than the search that led to it.get_productnow returns both forms, with the plain text complete and untrimmed (the 400-character summary exists to keep ten product pages out of one search response, which does not apply to a single product).- In-browser (WebMCP) tool results are no longer delivered as broken data — The storefront WebMCP bootstrap cut every tool result to 1,500 characters. Because each result is a JSON document, cutting it left invalid text the in-browser agent could not read at all, so any
get_producton a product with a media gallery (around 9,000 characters on a typical catalogue) failed outright rather than arriving shortened. Browser results are now built to fit rather than cut: the store leaves out the HTML copy of the description, then the product and variant images beyond the first, then shortens the description to a summary, and names inmessageswhat it left out - so what the agent receives is always complete, valid JSON, and it knows to follow the product'surlfor the full version. Nothing an agent needs in order to sell is ever removed: a product view keeps its whole variant list, and no product is ever dropped from a page of search results, because the agent's next page would start past it. A search asked for more products than fit says so and points atpagination.limit. The size is a new WebMCP output budget (characters) setting (Stores Configuration Mirasvit Extensions Agentic Commerce HTTP surfaces, store-view scoped), defaulting to 1500 because that is Google's recommended limit for one in-browser tool output; raise it to give agents more detail per product, lower it to give them less, or set 0 to send everything. Direct/agent/mcpresponses are unchanged unless the client asks for a size of its own. - A mistake in the agent-instructions template now produces one readable error — Outputting a collection variable such as
categories.alldirectly — which the field's own help text encouraged — raised the same "Array to string conversion" warning once per category, so saving or previewing the template produced a wall of 35–50 identical lines that buried the one sentence explaining the mistake. Repeated warnings are now collapsed and the summary capped at three distinct problems (with a "+N more" marker; the full list still goes to the log), and the actionable advice comes first with the raw engine error after it. The field's help text has also been rewritten to separate the variables you output directly from the collection variables that must be looped with% for %, with a worked example for each and a link to the variables manual. - The published signing key is now always valid — Roughly one store in a hundred and twenty-eight ended up with a public key in its
/.well-known/ucpprofile that was a byte short, because of how the key material was encoded. An AI agent reading that profile could not use the key: with this release signing responses, it would have rejected every answer the store gave as unverifiable. Affected stores are fixed by upgrading, with no need to regenerate the key. - A search with no words and no filters now browses the catalogue instead of failing —
search_catalogdescribes its query, filters and pagination as optional, then refused any call that used none of them. That is exactly the call an indexing agent makes to pull the catalogue a page at a time, so a feed crawler read zero products from a fully stocked store and had no way to tell that from an empty catalogue. Such a request is now answered as a browse of the store's root category — the same listing the JSON API returns — and the schema says plainly that all three are optional. - Tool results are now returned in the structured field as well as the text one — An agent tool answer carried its result only as JSON text. A client reading
structuredContent, which the protocol defines as the structured form of a tool's output, found nothing there and read zero products from a search that had in fact succeeded. Both forms are now produced in a single pass, so they can never disagree, and an over-budget notice appears in each.
0.0.17 (2026-08-12)
Fixed
- Compatibility with PHP 8.5 — The bounded HTTP client no longer calls the deprecated curl_close() function, which PHP 8.5 reports on every outbound request.
0.0.15 (2026-08-06)
Fixed
/llms.txtnow contains links on a fresh install, out of the box — The default agent-instructions template only produced links in its "Store Policies" section, which is empty until an admin manually configures Policy Pages. On a fresh install — or any store that hadn't touched that setting —/llms.txttherefore rendered with zero links and failed PageSpeed's "the llms.txt file should contain links" recommendation, the very check the extension is meant to satisfy. The default template now also lists your storefront's active product categories as markdown links, which need no configuration, so/llms.txtgives AI agents a usable catalogue map and passes the PageSpeed check by default. Stores with a customised template are unaffected.- The list of available template variables is no longer blank in the admin — Under Stores Configuration Mirasvit Extensions Agentic Commerce Agent Instructions, the LLMs template field's "Available variables" hint rendered as a bare row of commas with every variable name missing, and the Policy Pages hint lost the name of the variable it referred to. Both hints now show their variable names as intended.
0.0.14 (2026-07-28)
Fixed
- Agents no longer receive category links that lead nowhere — The category list attached to each product in the agent JSON API and MCP tool responses included every category a product was assigned to, even ones a shopper can't reach on your storefront: disabled categories, and categories that live under a different root category tree (commonly the dynamic "brand" categories created by third-party modules such as Magefan, which are generated in the default tree rather than the store's own). An AI agent following those links landed on a 404, or got a category with no usable link at all. Only enabled categories inside the store's own root tree are now listed, on both product listings and single-product responses — unreachable ones are left out rather than shown with a broken link. If a product's only categories were disabled or out of tree, its category list will now be empty, which correctly reflects that it isn't browsable in a category on your storefront.
0.0.13 (2026-07-27)
Fixed
- Fixed module installation failing on stores whose default attribute set isn't named "Default" — If your default product attribute set had been renamed — common after a Magento 1 → 2 migration or on Mage-OS builds, where it is often called something like "Generic" —
setup:upgradeaborted with "The attribute set ID is incorrect" while adding the module's agent-instructions product attribute, which made the module impossible to install at all. The default set is now looked up by ID instead of by name, so installation works whatever yours is called. - Fixed broken and relative links given to agents — Category links in the agent JSON and MCP responses were emitted as bare relative paths (for example
brands/tokina) while product links were absolute, so an agent had no reliable way to open a category. Worse, when a product or category had no generated URL rewrite — for instance a category with an empty URL key — the link fell back to the stored URL path, which doesn't route and returned a 404. Every product and category link is now a full absolute URL, and entities without a rewrite fall back to a link that always resolves, so agents no longer receive dead category links. - Agents now quote the same tax-inclusive price shoppers see and pay — On stores configured to display prices with tax included (for example, VAT-inclusive pricing in the UK and EU), the JSON product API and the MCP catalogue tools (
search_catalog,lookup_catalog,get_product) reported the raw catalog price excluding tax, so an AI agent quoted a price lower than the storefront shows and lower than the shopper is charged at checkout — a 20% VAT store, for instance, was under-quoting by 20%. Prices sent to agents now come from the same pricing pipeline the storefront uses, so they honour your tax display setting along with any active special price or catalog price rule. Stores that display prices excluding tax are unaffected.
0.0.12 (2026-07-22)
Fixed
- Fixed broken product and category links given to agents on stores with a custom or empty URL suffix — The agent JSON API and MCP tools built product and category links by hand, always tacking on a
.htmlsuffix and, for categories, using the internal category path instead of the storefront's own URL. On any store whose configured URL suffix is empty or something other than.html, every link an agent received pointed at a 404. Links are now read from the store's generated URL rewrites — the same URLs the storefront serves — so they honor your configured suffix and any custom rewrites, per store view. Stores that have no generated rewrites fall back to the url key plus your configured suffix, and product list pages resolve all their links in a single query.
0.0.11 (2026-07-20)
Features
- Regenerate or recover the UCP signing key on demand — The keypair that signs your UCP merchant profile (
/.well-known/ucp) is created automatically during upgrade, but until now there was no way to recover it if it went missing or to rotate it. A new Agentic Commerce → UCP signing key admin section shows whether a key exists and when it was generated, with a Regenerate button; the same is available on the command line viabin/magento mst:agentic:ucp:signing-key(add--regenerateto rotate). Regenerating rotates the published key id, so agents that pinned the old key will re-fetch the profile.
Fixed
- Agent search returned no results on OpenSearch / ElasticSuite — Every agent catalogue search (
search_catalog,lookup_catalog, and the JSON catalog routes) added a store filter on a field those search engines don't index, so it matched zero products and came back empty. The redundant filter was removed; per-store results still come from the correct store index, so standard Elasticsearch installs are unaffected. - The signing key is no longer created on a public request — The UCP signing keypair used to be generated lazily on the first anonymous visit to
/.well-known/ucp, writing to configuration and clearing the config cache during ordinary bot traffic. It is now generated once duringsetup:upgrade. - Discovery endpoints could be flooded with traffic —
/llms.txt,/agents.md,/.well-known/ucp, and the agent sitemap had no rate limit, so crawler traffic could drive unbounded log and database writes. They now share the same per-client rate limit as the rest of the agent surface and return a non-cacheable HTTP 429 when it's exceeded. - Anonymous agent endpoints no longer start a PHP session — The discovery, MCP, and JSON API endpoints set a
PHPSESSIDcookie on every request, which flooded the session store under crawler traffic and prevented a CDN or shared cache from caching these otherwise-cacheable responses. These paths no longer start a session; the "continue in browser" cart handoff still keeps its session as before. - Less log noise in production — The Agentic Commerce log channel defaulted to DEBUG, writing a line to
agentic_commerce.logon every discovery hit and agent tool call. It now defaults to INFO, so those per-request lines are dropped in production while warnings and errors still log. - Product descriptions now fail safely if text filtering errors — When the CMS/Page Builder filter threw an error, the raw, unsanitized product text (including
scriptandstylecontent) was returned to agents as a fallback. On a filter error the module now strips all directives and HTML and returns plain text instead.
0.0.10 (2026-07-17)
Fixed
- Fixed 404s on the version-pinned UCP profile URLs — The UCP merchant profile at
/.well-known/ucpadvertises version-pinned URLs in itssupported_versionsmap (e.g./.well-known/ucp/2026-04-08), but requesting those URLs returned Magento's 404 page, so an agent following the UCP version-discovery flow hit a dead link. Every advertised versioned URL now resolves and serves the profile withucp.versionpinned to the requested version; unknown versions still return 404, and no redirects are introduced. Works with store-code-in-URL setups as well.
0.0.9 (2026-07-13)
Features
- Control how long shared caches keep your agent discovery files — A new "Discovery Shared-Cache TTL" setting (Stores → Configuration → Agentic Commerce → HTTP Surfaces) lets you decide how long a CDN or Varnish shared cache may store the discovery endpoints (
/llms.txt,/agents.md,/.well-known/ucp, and the agent sitemap). Leave it at 0 (the default) so every request reaches Magento and agent-visit telemetry stays exact, or raise it (up to 3600 seconds) to offload repeat requests to your shared cache in exchange for sampled telemetry. The setting is store-view scoped.
Improvements
- Much faster
/llms.txtand/agents.mdrendering — The category list embedded in these files used to fire two extra queries for every category (a URL lookup and a product count), so a store with many categories could add hundreds of queries to a cold render. Both values are now batch-loaded, cutting those per-category queries to zero. The rendered URLs and counts are unchanged. - Faster Agent Activity dashboard on large stores — The admin dashboard previously scanned the orders table three times per render and grouped searches on unindexed columns. Order aggregates are now computed once per render, and two supporting database indexes were added, so the dashboard loads faster. ⚠️ Adds indexes to the
sales_orderandmst_agentic_eventtables (applied onsetup:upgrade). - Fewer queries when agents view or search products — The
get_producttool and searches that return configurable products issued extra per-variant and per-parent queries that survived the earlier batching work. These are now batched too, so a search page's query count no longer grows with the number of configurable products it returns. The responses are byte-identical. - Faster, cheaper single-product and collection URL lookups — The JSON routes for one product (
/agent/products/url_key.json) and for a collection's products (/agent/collections/url_key/products.json) resolved the URL key with an unindexed attribute scan whose cost grew with catalogue size (and which an anonymous caller could use to drive expensive uncached requests). They now resolve through the indexed URL-rewrite table, falling back to the old lookup only on stores without generated rewrites, so results are never worse than before. - Self-test traffic is now visible for debugging — "Test with an agent" self-test requests used to be discarded entirely. They are now recorded and flagged as test events, so they still stay out of every dashboard metric but remain visible in the underlying event log.
- ⚠️ Agent rate-limit settings moved — Because the rate limit now covers every agent tool call (MCP and the JSON routes), not just cart creation, its configuration moved from
agentic_commerce/cart/rate_limitandagentic_commerce/cart/rate_limit_windowtoagentic_commerce/mcp/rate_limitandagentic_commerce/mcp/rate_limit_window. Update anyapp/etc/env.phpoverrides to the new paths.
Fixed
- Closed several abuse vectors on the anonymous agent MCP endpoint — The public
/agent/mcpendpoint could be tricked into fetching an attacker-supplied "agent profile" URL — including internal or private network addresses (SSRF) — and returned raw internal error detail to callers. The profile fetch now refuses private/non-public hosts, pins the vetted address to block DNS-rebinding, streams and caps the response body so an oversized profile can't exhaust server memory, and limits how long a remote profile result may be cached. Internal errors now return a generic message plus a correlation id (with the detail logged server-side) instead of leaking internals. - All agent endpoints now share one rate limit — Previously only cart creation was throttled, so the JSON catalog routes and other MCP tools could be flooded with expensive uncached requests. A single per-client rate limit now applies to every agent tool call and JSON route; a request over the limit is rejected with a non-cacheable HTTP 429 before any search or product load runs.
- Bounded oversized agent search input — Over-long search queries, oversized
lookup_catalogid lists, and deep pagination cursors are now capped at a single shared point before reaching the search engine, preventing the errors and rising cost that crafted requests could otherwise cause on the unauthenticated path. Raw search-engine error detail is no longer passed back to callers. - Blocked cross-store and mismatched-currency cart access — An agent cart handle created for one store view could be read or changed under another store view's context, and a request asking for a currency other than the store's was silently ignored. Cart operations now reject a store mismatch, and a mismatched-currency request is rejected outright (the module does not convert currencies).
- Fixed agents seeing stale collection listings — When a product was added to a category, the cached
/agent/collections/url_key/products.jsonlisting was not refreshed until its cache lifetime expired. The listing now carries the category's product-list cache tag, so it updates immediately when a product is added to or removed from that category. - MCP notifications no longer receive an unexpected response body — A JSON-RPC notification (a request sent with no id) now correctly returns an empty
204as the spec requires, instead of a JSON body. Each store view also now reports its own store name in MCP responses instead of the global default. - Fixed the
mst:agentic:cartCLI command failing with "Area code is not set" — The command now sets up the store and area context before running, so it can be used to exercise the agent cart tools from the command line.
0.0.8 (2026-07-08)
Features
- Choose which product text feeds the agent description — A new "Description Field Priority" setting (Stores → Configuration → Agentic Commerce → General) lets you control which product text attribute AI agents receive as the product description, and in what order agents fall back between them. Out of the box it reads Description first, then Short Description, then Meta Description — the first one with content wins. You can now also add any of your own custom text attributes to the list, and drag rows by their grip handle to reorder them. The setting is store-view scoped, so different store views can prefer different fields. Applies to both the JSON API and every MCP tool.
- Separate on/off switches for the robots.txt block and the agentic sitemap — The single "Enable Agent Discovery in Sitemap and Robots" toggle has been split into two independent settings under HTTP Surfaces: "Enable Agent Block in robots.txt" and "Enable Agentic Discovery Sitemap". You can now, for example, keep the robots.txt agent block while turning off the agentic sitemap if you manage your sitemap with a third-party SEO module. ⚠️ The old configuration path
agentic_commerce/surfaces/sitemap_robots_enabledhas been replaced byrobots_agent_block_enabledandagentic_sitemap_enabled. Both default to Yes, so a fresh install behaves as before; but a store that had explicitly turned the old combined toggle off will have both surfaces switched back on after upgrading — re-check this setting if you had disabled it.
Improvements
- Faster catalogue responses for agents — The JSON product API (used by
search_catalogandlookup_catalog) previously ran one product load plus several follow-up queries for every result, so a single search could fire hundreds or thousands of queries. It now loads a whole page of results with a small, fixed set of batched queries, dramatically cutting the query count on catalogue searches. - Agent catalogue responses are now cached — JSON API responses are stored in Magento's Full Page Cache and re-served instead of re-running the search each time, and cached entries are automatically cleared the moment a relevant product or category is saved (so agents never see stale data). Very deep pagination requests are also capped to stay within the search engine's result window, avoiding the errors and rising cost that deep page numbers used to cause.
- Anonymous agent cart endpoint hardened against abuse — The public agent cart endpoint now limits how many carts a single client can create in a short window, caps the number of line items and the per-item quantity a single request can add, and automatically prunes abandoned agent-built guest carts (older than 24 hours by default) via an hourly cron job, so they no longer pile up in the database. The rate-limit window, request rate, and cart lifetime are tunable for operators via
app/etc/env.phpconfig overrides. ⚠️ This adds anis_agenticcolumn and a supporting index to thequotetable (applied onsetup:upgrade).
Fixed
- Closed a security gap where an agent could keep accessing a shopper's cart after handoff — When a shopper followed a "continue in browser" link, the agent's cart handle stayed valid, so the agent (or anyone who received the link) could keep reading or silently changing items in the shopper's live checkout cart. The agent's cart handle is now invalidated at handoff, so it stops working once the cart is passed to the shopper.
- Fixed store views sharing each other's agent instructions — On multi-store setups, the
/llms.txtand/agents.mdinstruction files could serve the first store's content (its name, base URLs, categories, and language) to every other store view for up to an hour after a cache flush. Each store view now gets its own correctly cached content. - Fixed the agentic sitemap URL being doubled — The agent-discovery sitemap entry in
sitemap.xmlhad the store base URL prepended twice, producing a brokenloc. The link is now generated correctly.
0.0.7 (2026-07-03)
Fixed
- Fixed Page Builder inline CSS (
styleblocks) and JavaScript (scriptblocks) leaking into the rendered description output. When a block or widget is built with Page Builder, the rendered HTML includes inlinestyletags with scoped CSS selectors. These blocks and their contents are now stripped from the description before it is returned, so AI agents do not receive raw CSS or JS as part of the product text.
0.0.6 (2026-07-03)
Fixed
- Fixed product descriptions containing Magento CMS block directives (
block ...,widget ...) appearing as raw template code in the JSON API (/agent/products/url_key.json) and MCP tool responses (get_product,search_catalog,lookup_catalog). Descriptions are now passed through Magento's CMS template filter before being serialised, so AI agents receive the rendered HTML content instead of the directive markup.
Features
- In-browser agent tools (WebMCP) — Your storefront can now expose its catalogue tools (product search, lookup, and view) directly to a shopper's in-browser AI agent, so an agent acting on the open page can find and inspect your products without a separate connection. Turn it on under Stores → Configuration → Agentic Commerce → HTTP Surfaces → "Enable In-Browser WebMCP Tools" (off by default). The tools are read-only — they can browse the catalogue but never change the cart — and the storefront search box is automatically advertised to agents that support it. Works the same on both Luma and Hyvä themes, and does nothing in browsers that don't support WebMCP. Since WebMCP is currently a Chrome origin trial, an optional "WebMCP Origin Trial Token" field lets you paste your per-store token so it works for shoppers without them turning on a browser flag.
0.0.5 (2026-06-24)
Fixed
- The "Test with an agent" self-test no longer produces an empty test cart. It now runs against the live agent endpoint, so the test cart persists and its continue_url opens a populated cart. (Real agent carts were unaffected.)
0.0.4 (2026-06-23)
Improvements
- The activity dashboard's tables (Endpoint usage, Top agent queries, Top agents) now use Magento's standard admin grid styling, so they look and behave like the rest of the admin's listing pages.
- The Agent Activity dashboard labels are now translatable.
Fixed
- Fixed the agent-built cart disappearing for signed-in shoppers. When a logged-in customer opened a "continue in browser" link, their own session cart took over and the items the agent had added were lost. The agent cart is now merged into the shopper's cart, so those items carry through to checkout.
- Fixed the activity dashboard failing to display on stores with Content Security Policy enabled. The dashboard's styles and scripts were embedded inline in the page, which CSP blocked; they have been moved into proper stylesheet and script files so the dashboard renders correctly.
0.0.3 (2026-06-19)
Fixed
- Fixed an error when an AI agent browsed the catalogue without a search term. Requesting the product feed with no query (for example
/agent/products.jsonwith no?q=, or thesearch_catalogtool with an empty query) returned a server error instead of products. These requests now list your full catalogue, while searches that include a query term work exactly as before.
Changelog
0.0.2 (2026-06-19)
Improvements
- The module now installs and runs on Magento 2.4.x (in addition to the previous release line), so a wider range of stores can use it.
Fixed
- Fixed a crash during module installation. On some setups, running
setup:install/setup:upgradefailed because the module's command-line tools tried to load catalog, search, and cart services before the database was ready; those services are now loaded only when a command is actually run. - Fixed compatibility with the latest Magento platform updates (PHP 8.4 and the newer logging library), so the module works correctly on freshly updated stores.
0.0.1 (2026-06-18)
Features
- Initial release of Agentic Commerce v1
- Core catalogue domain with ProductMapper, SearchService, ContextResolver
- Three catalogue tools: search_catalog, lookup_catalog, get_product
- Generic MCP transport at /agent/mcp endpoint
- Public JSON read API endpoints
- /.well-known/ucp discovery profile with ES256 signing keys
- Liquid-templated llms.txt and agents.md generation
- Phase-2 stubs: AgenticUcp and AgenticAcp modules