{"id":326947,"date":"2026-06-18T07:52:48","date_gmt":"2026-06-18T07:52:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/kalicart-bridge\/"},"modified":"2026-06-18T09:03:11","modified_gmt":"2026-06-18T09:03:11","slug":"kalicart-bridge","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/kalicart-bridge\/","author":23482077,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.101","stable_tag":"1.0.101","tested":"7.0","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"KaliCart Bridge \u2013 AI Agent Catalog for WooCommerce","header_author":"KaliCart","header_description":"Makes your WooCommerce catalog machine-readable and agent-accessible. Exposes normalized product data via REST API \u2014 no LLM, no external service, no cloud dependency.","assets_banners_color":"0074f4","last_updated":"2026-06-18 09:03:11","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/bridge.kalicart.com","header_author_uri":"https:\/\/kalicart.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":51,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.100":{"tag":"1.0.100","author":"carthub","date":"2026-06-18 07:52:18"},"1.0.101":{"tag":"1.0.101","author":"carthub","date":"2026-06-18 09:03:11"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3576832,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3576832,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3576832,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3576832,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.100","1.0.101"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[2353,216196,242115,23853,286],"plugin_category":[45],"plugin_contributors":[261605],"plugin_business_model":[],"class_list":["post-326947","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-chatgpt","plugin_tags-mcp","plugin_tags-rest-api","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-carthub","plugin_committers-carthub"],"banners":{"banner":"https:\/\/ps.w.org\/kalicart-bridge\/assets\/banner-772x250.png?rev=3576832","banner_2x":"https:\/\/ps.w.org\/kalicart-bridge\/assets\/banner-1544x500.png?rev=3576832","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/kalicart-bridge\/assets\/icon-128x128.png?rev=3576832","icon_2x":"https:\/\/ps.w.org\/kalicart-bridge\/assets\/icon-256x256.png?rev=3576832","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>KaliCart Bridge makes your WooCommerce product catalog computable: it exposes a structured, normalized REST API and an MCP server that AI shopping agents and assistants \u2014 such as ChatGPT, Claude, Gemini, Perplexity and any MCP-capable client \u2014 can read and act on directly. No LLM runs on your server; the plugin only turns your existing catalog into clean, computable data.<\/p>\n\n<p>Documentation: https:\/\/bridge.kalicart.com\/docs\/<\/p>\n\n<p><strong>What it does:<\/strong><\/p>\n\n<ul>\n<li>Exposes a <code>\/discovery<\/code> endpoint \u2014 the single entry point any agent needs to understand your catalog<\/li>\n<li>Provides <code>\/catalog\/search<\/code>, <code>\/catalog\/products<\/code>, <code>\/catalog\/product\/{id}<\/code>, <code>\/catalog\/categories<\/code> endpoints<\/li>\n<li>Exposes a Model Context Protocol (MCP) server at <code>\/wp-json\/kalicart\/v1\/mcp<\/code> (JSON-RPC 2.0) so MCP-capable agents can call the catalog as tools \u2014 same data as the REST endpoints, no API key<\/li>\n<li>Computationally normalizes product data: prices (min\/max for variables, sale %, discount), stock, gender inference, color family mapping, size type detection<\/li>\n<li>Exposes WooCommerce shipping-zone policy for agent reasoning; checkout remains the final authority for exact destination\/cart shipping cost<\/li>\n<li>Exposes active product\/category-compatible coupons as conditional checkout savings; coupons never replace the catalog price<\/li>\n<li>Category tree nodes include direct <code>products_url<\/code> and <code>search_url_template<\/code> fields so agents can navigate without constructing URLs manually<\/li>\n<li>Dashboard issue cards and suggestions link to filtered product lists for direct remediation<\/li>\n<li>Uses <strong>your merchant taxonomy<\/strong> \u2014 no global remapping, products stay in your WooCommerce categories<\/li>\n<li>Injects a <code>&lt;link rel=\"kalicart-agent\"&gt;<\/code> in your site <code>&lt;head&gt;<\/code> for agent auto-discovery<\/li>\n<li>Adds an \"agent ready\" badge in the footer<\/li>\n<li>Injects <code>Allow: \/wp-json\/kalicart\/<\/code> in <code>robots.txt<\/code><\/li>\n<li>Generates <code>\/kalicart-sitemap.xml<\/code> linked from the WP sitemap index<\/li>\n<li>Shows a catalog health dashboard in wp-admin with quarantine tracking and improvement suggestions<\/li>\n<\/ul>\n\n<p><strong>What it does NOT do:<\/strong><\/p>\n\n<ul>\n<li>No LLM calls<\/li>\n<li>No cloud dependency for core functionality<\/li>\n<li>No data sent anywhere outside your server by default \u2014 the only optional exception is the Federated Catalog feature (see \"External services\" below), which you turn on explicitly<\/li>\n<li>No API key required for public endpoints<\/li>\n<\/ul>\n\n<p><strong>Normalization engine:<\/strong><\/p>\n\n<ul>\n<li>Price: regular, sale, current, discount %, currency \u2014 variable products get min\/max ranges<\/li>\n<li>Stock: status, in_stock bool, quantity if managed, backorder policy<\/li>\n<li>Gender: inferred from <code>pa_gender<\/code> attribute, category paths, tags, product name (multilingual keywords: IT\/EN\/FR\/DE\/ES)<\/li>\n<li>Color: mapped to 13 color families via keyword matching on <code>pa_color<\/code>\/<code>pa_colore<\/code> and product metadata<\/li>\n<li>Size: detected from <code>pa_size<\/code>\/<code>pa_taglia<\/code>, type auto-detected (clothing S\/M\/L, numeric EU, shoes EU half-sizes)<\/li>\n<\/ul>\n\n<p><strong>Catalog health \/ quarantine:<\/strong><\/p>\n\n<p>Products are scored 0\u2013100 based on: title quality, description length, category assignment, price validity, image presence and SKU presence. Quarantine is reserved for blocking computability issues: ambiguous\/too-short titles, missing or very short descriptions, missing real categories, and missing or zero prices. Missing images and SKUs remain clickable improvement suggestions but do not quarantine products.<\/p>\n\n<p><strong>Checkout sessions (optional):<\/strong><\/p>\n\n<p>When enabled in WP Admin \u2192 KaliCart \u2192 Settings, agents can create checkout sessions containing one or more products. Each session returns cart_url (lands on WooCommerce cart for review) and checkout_url (goes directly to checkout). Sessions expire after 30 minutes. No OAuth, no PII, no payment on the agent side.<\/p>\n\n<p><strong>Model Context Protocol (MCP) endpoint:<\/strong><\/p>\n\n<p>The same read-only catalog is also exposed as an MCP server at <code>\/wp-json\/kalicart\/v1\/mcp<\/code> (JSON-RPC 2.0 over HTTP POST). MCP-capable agents and assistants connect to it and call the catalog as tools: <code>search_products<\/code>, <code>list_products<\/code>, <code>get_product<\/code>, <code>list_categories<\/code>, <code>get_meta<\/code>. It is read-only and needs no authentication, exactly like the public REST endpoints \u2014 it adds a second transport, not new data. No LLM, no external calls. Checkout and payment are never exposed over MCP.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin works fully standalone. It connects to one external service <strong>only if you explicitly opt in<\/strong> by activating the optional Federated Catalog feature in WP Admin \u2192 KaliCart Bridge.<\/p>\n\n<p><strong>Service:<\/strong> KaliCart Global (https:\/\/dashboard.kalicart.com)<\/p>\n\n<p><strong>When data is sent:<\/strong> Only when an administrator clicks \"Activate Federated Catalog\" (and, symmetrically, \"Revoke consent\"). Nothing is sent automatically, on activation, or in the background. With the feature off, the plugin makes no external requests.<\/p>\n\n<p><strong>What is sent:<\/strong> A single value \u2014 your site's public URL (e.g. https:\/\/yourstore.com). On revoke, the same URL is sent to withdraw. No customer data, orders, personal data, credentials, or API keys are ever transmitted.<\/p>\n\n<p><strong>What the service does:<\/strong> The URL tells KaliCart Global your store wishes to be discovered. KaliCart Global then periodically reads your already-public catalog (the same data exposed by the Bridge's public REST endpoints) and includes it in federated agent search. It only reads; it never writes to your store. Revoking stops this and parks your catalog.<\/p>\n\n<p><strong>Privacy notice:<\/strong> https:\/\/bridge.kalicart.com\/privacy\/\n<strong>Terms \/ documentation:<\/strong> https:\/\/bridge.kalicart.com\/docs\/<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to <code>\/wp-content\/plugins\/kalicart-bridge\/<\/code><\/li>\n<li>Activate the plugin through the Plugins screen in WordPress<\/li>\n<li>Navigate to <strong>KaliCart<\/strong> in the admin menu<\/li>\n<li>The catalog is immediately accessible at <code>yourdomain.com\/wp-json\/kalicart\/v1\/discovery<\/code><\/li>\n<li>MCP-capable agents can connect to the MCP server at <code>yourdomain.com\/wp-json\/kalicart\/v1\/mcp<\/code><\/li>\n<\/ol>\n\n<p>Full operational documentation is always available at <code>https:\/\/bridge.kalicart.com\/docs\/<\/code>.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20share%20my%20data%20with%20kalicart%20or%20any%20third%20party%3F\"><h3>Does this share my data with KaliCart or any third party?<\/h3><\/dt>\n<dd><p>Not unless you choose to. By default the plugin runs entirely on your server and sends nothing externally. The only exception is the optional Federated Catalog feature: if you explicitly activate it, the plugin sends your store's public URL (and nothing else) to KaliCart Global so your public catalog can be included in federated agent search. No customer, order, or private data is ever sent. See \"External services\" below, and the privacy notice at https:\/\/bridge.kalicart.com\/privacy\/.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20kalicart%20account%3F\"><h3>Do I need a KaliCart account?<\/h3><\/dt>\n<dd><p>No. This plugin is fully standalone and free.<\/p><\/dd>\n<dt id=\"who%20can%20access%20the%20catalog%20endpoints%3F\"><h3>Who can access the catalog endpoints?<\/h3><\/dt>\n<dd><p>Public endpoints (discovery, search, products, categories) are accessible without authentication \u2014 same as the WooCommerce REST API public surfaces. The <code>\/health<\/code> endpoint requires <code>manage_woocommerce<\/code> capability.<\/p><\/dd>\n<dt id=\"can%20i%20disable%20the%20badge%20or%20robots.txt%20injection%3F\"><h3>Can I disable the badge or robots.txt injection?<\/h3><\/dt>\n<dd><p>Yes \u2014 all three signals (badge, robots.txt, sitemap) can be toggled individually in the KaliCart settings tab.<\/p><\/dd>\n<dt id=\"how%20often%20is%20the%20health%20report%20cached%3F\"><h3>How often is the health report cached?<\/h3><\/dt>\n<dd><p>5 minutes. You can force a refresh via the \"Refresh analysis\" button or the <code>?force=true<\/code> query parameter on the <code>\/health<\/code> endpoint.<\/p><\/dd>\n<dt id=\"how%20do%20i%20connect%20this%20to%20an%20ai%20assistant%20or%20mcp%20client%3F\"><h3>How do I connect this to an AI assistant or MCP client?<\/h3><\/dt>\n<dd><p>The catalog can be consumed two ways. Any agent can call the plain REST endpoints under <code>\/wp-json\/kalicart\/v1\/catalog\/<\/code> directly. MCP-capable clients can instead connect to the MCP server at <code>\/wp-json\/kalicart\/v1\/mcp<\/code> (JSON-RPC 2.0): the assistant connects to that URL \u2014 no API key \u2014 and gains the catalog tools (search_products, get_product, list_categories, get_meta, list_products). In clients that support remote MCP connectors, add it as a custom connector pointing to that URL.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.101<\/h4>\n\n<ul>\n<li>Discoverability - Refined the plugin's directory metadata to better describe what it does and who it is for. The display name, search tags, short description and opening description now state plainly that the plugin makes a WooCommerce catalog computable and readable by AI agents and assistants (via REST API and an MCP server). No functional code changed in this release<\/li>\n<\/ul>\n\n<h4>1.0.100<\/h4>\n\n<ul>\n<li>i18n - Translated the Federated Catalog admin panel into Italian, German, French and Spanish. The panel was already translation-ready in code but its strings (added in 1.0.97) were missing from the translation catalogs, so they previously fell back to English in every locale. Regenerated the translation template and updated all four locale catalogs: activation and revoke buttons, the consent description, the two-step revoke confirmation and the dynamic status messages are now localized<\/li>\n<\/ul>\n\n<h4>1.0.99<\/h4>\n\n<ul>\n<li>Multilingual - Fixed duplicate products and categories on sites running a database-translating multilingual plugin (WPML\/WooCommerce Multilingual, Polylang). The public agent catalog is now served exclusively in the site default language: each translated product or category previously appeared once per language, multiplying the catalog. The request context is pinned to the default language at the start of every public catalog request, so product enumeration, the category tree and the flat category list all return the canonical default-language entries only<\/li>\n<li>Multilingual - The single-product endpoint (\/catalog\/product\/{id}) now canonicalizes a translated product ID to its default-language counterpart and returns it; an ID with no mapping into the default language returns 404, keeping the catalog identity stable for agents regardless of which translation ID they hold<\/li>\n<li>Multilingual - The product total now reflects the canonical default-language catalog instead of counting every translation; the catalog meta cache is namespaced per language. No-op on monolingual sites and on output-translating plugins (e.g. Weglot, GTranslate proxy) where the database holds a single language<\/li>\n<\/ul>\n\n<h4>1.0.98<\/h4>\n\n<ul>\n<li>Security \/ hardening - Checkout session REST endpoints reviewed for WordPress.org compliance. Read-only public routes now declare an explicit public permission_callback (__return_true). The destructive DELETE (cancel session) route uses a dedicated permission_callback that validates the token format and confirms the session exists before allowing cancellation. Session IDs are now cryptographically secure 128-bit random bearer tokens (random_bytes) instead of md5(uniqid()). The same explicit-public posture was applied to the read-only catalog and MCP endpoints<\/li>\n<\/ul>\n\n<h4>1.0.97<\/h4>\n\n<ul>\n<li>Federated Catalog (opt-in) - New optional feature: from WP Admin you can join the KaliCart Global federated agent network. Clicking \"Activate Federated Catalog\" is an explicit consent action that sends only your store's public URL to KaliCart Global, which then includes your already-public catalog in federated agent search. A two-step \"Revoke consent\" control withdraws and parks your catalog at any time. No customer, order, or private data is ever sent<\/li>\n<li>Privacy - Consent for Global indexing now defaults to OFF (opt-in). Added an \"External services\" section to this readme and a public privacy notice (https:\/\/bridge.kalicart.com\/privacy\/) disclosing exactly what is sent and how it is used, per WordPress.org guidelines 6 and 7<\/li>\n<li>Admin - The Federated Catalog panel is shown under the plugin header and uses the plugin's native button and alert styles for consistency<\/li>\n<\/ul>\n\n<h4>1.0.96<\/h4>\n\n<ul>\n<li>Discovery - The read-only product listing endpoint (\/wp-json\/kalicart\/v1\/catalog\/products) now accepts an optional modified_after parameter (ISO-8601 datetime). When provided, only products changed at or after that time are returned, filtered on the WordPress post modification date. This lets federated indexers and agents pull incremental updates instead of re-reading the whole catalog. Invalid or absent values are ignored and the full catalog is returned, so existing callers are unaffected<\/li>\n<\/ul>\n\n<h4>1.0.95<\/h4>\n\n<ul>\n<li>Admin - The wp-admin sidebar menu label now reads \"KaliCart Bridge\" (was \"KaliCart\") to clearly distinguish it from other KaliCart tools<\/li>\n<\/ul>\n\n<h4>1.0.94<\/h4>\n\n<ul>\n<li>Compliance - Removed the \"Powered by\" attribution link from the public [kalicart_agent_index] shortcode output, per WordPress.org guideline 10 (no credit links on user-facing pages without explicit opt-in)<\/li>\n<li>Performance - Removed an unused get_posts() query that ran on every public discovery request without using its result<\/li>\n<\/ul>\n\n<h4>1.0.93<\/h4>\n\n<ul>\n<li>i18n - The wp-admin screen and the storefront badge are now fully translatable. Every admin string (catalog health, quarantine list, suggestions, endpoint descriptions and toggle warnings) and the badge text is wrapped for translation; JavaScript strings are localized server-side via wp_localize_script so they ship in the translation catalog<\/li>\n<li>i18n - Ships French, Italian, German and Spanish translations and follows the WordPress site language, with English as the fallback for other locales<\/li>\n<\/ul>\n\n<h4>1.0.92<\/h4>\n\n<ul>\n<li>Discovery - Added an OpenAPI 3.1 description of the read-only catalog API at \/wp-json\/kalicart\/v1\/openapi (paths, query filters and response shapes for search, products, product\/{id}, categories and meta), advertised via  and as a service-desc link in the API Catalog so generic agents and API tooling can consume the catalog without the KaliCart convention<\/li>\n<li>Discovery - The discovery document now lists the OpenAPI endpoint under endpoints.openapi<\/li>\n<\/ul>\n\n<h4>1.0.91<\/h4>\n\n<ul>\n<li>Discovery - Added an RFC 9727 API Catalog at \/.well-known\/api-catalog (an RFC 9264 linkset, served as application\/linkset+json) that advertises the catalog API, the MCP endpoint, the discovery document and the UCP profile in the standard vocabulary generic agents and API-readiness probes understand; also linked via  in the document head<\/li>\n<li>Discovery - Added a Content-Signal header (search, ai-input, ai-train) on every Bridge REST response and in the robots.txt block, mirroring the existing crawler_policy so AI usage preferences are declared in the emerging standard format<\/li>\n<\/ul>\n\n<h4>1.0.90<\/h4>\n\n<ul>\n<li>Feature - Added a Model Context Protocol (MCP) server at \/wp-json\/kalicart\/v1\/mcp (JSON-RPC 2.0 over HTTP POST) that exposes the read-only catalog as agent tools (search_products, list_products, get_product, list_categories, get_meta); self-contained, no authentication, no external calls, the same data as the REST endpoints over a second transport<\/li>\n<li>Discovery - The discovery document now advertises the MCP endpoint via capabilities.mcp and endpoints.mcp<\/li>\n<li>Docs - Documented the MCP endpoint in the readme and the wp-admin Endpoints tab<\/li>\n<\/ul>\n\n<h4>1.0.89<\/h4>\n\n<ul>\n<li>Compatibility - Refuse activation when WooCommerce is not active, on every supported WordPress version. WP 6.5+ already blocks it via the \"Requires Plugins\" header; this adds an activation-time guard (auto-deactivate + notice) that also covers WP 6.0-6.4 where that header is ignored<\/li>\n<\/ul>\n\n<h4>1.0.88<\/h4>\n\n<ul>\n<li>Fix - Removed the broken \"View details\" link from the plugins list. WordPress provides a native View details link once the plugin is published on WordPress.org<\/li>\n<\/ul>\n\n<h4>1.0.87<\/h4>\n\n<ul>\n<li>Build - Plugin Check (wp plugin check) now runs automatically on ZIP contents before every release; bump aborts if errors are found<\/li>\n<\/ul>\n\n<h4>1.0.86<\/h4>\n\n<ul>\n<li>Housekeeping - Remove dev-only files from plugin directory: .distignore, README.md, SPEC.md<\/li>\n<\/ul>\n\n<h4>1.0.85<\/h4>\n\n<ul>\n<li>Fix - wp_delete_file() replacing unlink() in .well-known cleanup (Plugin Check compliance)<\/li>\n<li>Fix - phpcs:ignore NonceVerification on public discovery GET endpoint (no nonce applicable)<\/li>\n<li>Fix - phpcs:disable\/enable around local template variables in admin page (false-positive PrefixAllGlobals)<\/li>\n<\/ul>\n\n<h4>1.0.84<\/h4>\n\n<ul>\n<li>Fix - Escape all inline style output in admin page with esc_attr() and esc_html() (Plugin Check compliance)<\/li>\n<li>Fix - Rename admin variables to kalicart_bridge prefix (WordPress naming conventions)<\/li>\n<li>Fix - Replace unlink() with wp_delete_file() in .well-known cleanup<\/li>\n<li>Fix - sanitize_key() applied to GET input in well-known discovery handler<\/li>\n<\/ul>\n\n<h4>1.0.83<\/h4>\n\n<ul>\n<li>Fix - Plugin URI updated to bridge.kalicart.com (plugin-specific page, distinct from Author URI kalicart.com)<\/li>\n<\/ul>\n\n<h4>1.0.82<\/h4>\n\n<ul>\n<li>Build - ZIP now excludes .git, .gitignore, .distignore, README.md, SPEC.md<\/li>\n<\/ul>\n\n<h4>1.0.81<\/h4>\n\n<ul>\n<li>Housekeeping - Remove internal release-process section from readme.txt (not relevant to end users)<\/li>\n<\/ul>\n\n<h4>1.0.80<\/h4>\n\n<ul>\n<li>Compliance - Remove plugins_api override: the plugin no longer intercepts the WordPress \"View details\" modal or provides an external download_link; WordPress.org manages updates for directory installs<\/li>\n<li>Privacy - Agent hints (DOM signals: menu trace, search\/category\/product JS hints) are now opt-in with default OFF; merchant activates from WP Admin \u2192 KaliCart \u2192 Settings<\/li>\n<li>Housekeeping - uninstall.php now removes all 14 plugin options and 4 transients on deletion<\/li>\n<li>Build - .distignore added for wp dist-archive packaging<\/li>\n<\/ul>\n\n<h4>1.0.79<\/h4>\n\n<ul>\n<li>UX - Admin header brand mark replaced with inline KaliCart SVG logo; wp-admin menu icon updated to the KaliCart glyph<\/li>\n<li>Fix - Endpoint explorer links the .well-known discovery files via their .json mirrors so test links resolve on every host<\/li>\n<li>UX - Admin accent color aligned to KaliCart blue (#0070f3)<\/li>\n<\/ul>\n\n<h4>1.0.78<\/h4>\n\n<ul>\n<li>Fix - \/.well-known\/ discovery also published as physical .json mirrors (kalicart-bridge.json, agent-catalog.json, ucp.json, agent.json), served as application\/json on every host including those that serve \/.well-known\/ as a static location (nginx ACME setups) where the WP rewrite never runs<\/li>\n<li>Feature - REST endpoint \/wp-json\/kalicart\/v1\/ucp exposes the UCP profile, always reachable when \/.well-known\/ucp is intercepted by the webserver<\/li>\n<li>Update - discovery, robots.txt and agentic sitemap advertise the reachable .json mirrors and include the UCP profile; rewrite handler accepts the .json form<\/li>\n<\/ul>\n\n<h4>1.0.77<\/h4>\n\n<ul>\n<li>Fix - \/.well-known\/ucp, \/.well-known\/kalicart-bridge, \/.well-known\/agent-catalog now served exclusively by WP rewrite handler (Content-Type: application\/json on all stacks including nginx); removed legacy physical extension-less files and Apache-only .htaccess ForceType<\/li>\n<li>Fix - serve_well_known() reads $wp-&gt;query_vars (parse_request API) with $_GET fallback; migration version-gated (kalicart_bridge_wk_version) runs once per version, flushes rewrite rules on update<\/li>\n<\/ul>\n\n<h4>1.0.76<\/h4>\n\n<ul>\n<li>Feature - KaliCart Global indexing consent toggle in Settings, opt-out model (active by default), single option kalicart_bridge_global_consent driving discovery consent flags<\/li>\n<li>UX - Disabling the consent toggle shows a warning alert<\/li>\n<\/ul>\n\n<h4>1.0.75<\/h4>\n\n<ul>\n<li>API - variants is always an array, never null - list\/search return [] for variable products<\/li>\n<li>API - discovery documents list-context variants behavior (list_context_note)<\/li>\n<li>API - cache claim aligned with real Cache-Control header<\/li>\n<li>API - agent_index_url emits real null when not configured<\/li>\n<li>API - shipping costs numeric when computable, Woo formulas kept as string<\/li>\n<li>API - shipping zones without regions expose an honest locations_note<\/li>\n<li>API - .well-known discovery files include plugin version<\/li>\n<\/ul>\n\n<h4>1.0.74<\/h4>\n\n<ul>\n<li>UX - Return policy block updates in real-time (input, save, tab switch)<\/li>\n<li>UX - Health report refreshed after save<\/li>\n<li>Fix - Configure link switches to Settings tab correctly<\/li>\n<\/ul>\n\n<h4>1.0.73<\/h4>\n\n<ul>\n<li>Fix - Return policy block color updates in real-time after save<\/li>\n<\/ul>\n\n<h4>1.0.72<\/h4>\n\n<ul>\n<li>UX - Return policy block turns green when configured, orange when missing<\/li>\n<\/ul>\n\n<h4>1.0.71<\/h4>\n\n<ul>\n<li>UX - Refund and Returns Policy URL field moved to top of Settings tab<\/li>\n<li>UX - Site URL pre-filled, merchant enters only the page slug<\/li>\n<\/ul>\n\n<h4>1.0.70<\/h4>\n\n<ul>\n<li>Fix - Configure link in suggestion correctly switches to Settings tab<\/li>\n<\/ul>\n\n<h4>1.0.69<\/h4>\n\n<ul>\n<li>Fix - suggestions sorted by priority (high first)<\/li>\n<\/ul>\n\n<h4>1.0.68<\/h4>\n\n<ul>\n<li>Fix - NO_RETURN_POLICY suggestion priority high (red dot, top of list)<\/li>\n<li>Fix - NO_RETURN_POLICY shows Configure link instead of 0 products label<\/li>\n<li>Fix - suggestions without affected count no longer render products button<\/li>\n<\/ul>\n\n<h4>1.0.67<\/h4>\n\n<ul>\n<li>Added - Return policy URL field in Settings<\/li>\n<li>Added - return_policy object in discovery endpoint (configured, url, agent note)<\/li>\n<li>Added - NO_RETURN_POLICY suggestion (medium priority) in health dashboard<\/li>\n<li>Added - Health score penalty: -10 points when return policy URL is missing<\/li>\n<\/ul>\n\n<h4>1.0.66<\/h4>\n\n<ul>\n<li>Fixed - \/.well-known\/ucp is written as a physical file for hosts that bypass WordPress rewrites on .well-known paths<\/li>\n<li>Fixed - .well-known\/.htaccess declares ucp as application\/json<\/li>\n<li>Refactor - UCP profile generation centralized for dynamic and physical discovery paths<\/li>\n<\/ul>\n\n<h4>1.0.65<\/h4>\n\n<ul>\n<li>Perf - Context-aware normalize_product(): variations not loaded in search\/list results \u2014 16\u00d7 speedup on variable-heavy catalogs<\/li>\n<li>Note - Use \/catalog\/product\/{id} to get full variants[] before checkout on variable products<\/li>\n<\/ul>\n\n<h4>1.0.64<\/h4>\n\n<ul>\n<li>Perf - normalize_product() optimized: all heavy methods called once per product, results reused across fields (stock, purchase_readiness, barcodes, variations)<\/li>\n<\/ul>\n\n<h4>1.0.63<\/h4>\n\n<ul>\n<li>Added - price.vat_included, price.tax_enabled, price.price_type (STATIC)<\/li>\n<li>Added - stock.quantity_tracked, stock.backorder_allowed boolean<\/li>\n<li>Added - shipping.zones[] with methods, costs, locations, free threshold per zone<\/li>\n<\/ul>\n\n<h4>1.0.62<\/h4>\n\n<ul>\n<li>Fixed - on_sale suppressed when discount_pct &lt; 1%<\/li>\n<li>Fixed - discount_pct: one decimal precision<\/li>\n<li>Fixed - price.display: clean space, no non-breaking space<\/li>\n<li>Added - price_format in discovery: major\/minor units distinction, autonomous checkout conversion rule<\/li>\n<\/ul>\n\n<h4>1.0.61<\/h4>\n\n<ul>\n<li>Added - price.encoding: decimal_major_units \u2014 unambiguous vs UCP minor units<\/li>\n<li>Added - price.display: plain-text formatted price string (e.g. \"247,00 \u20ac\")<\/li>\n<li>Added - price_format in discovery document<\/li>\n<\/ul>\n\n<h4>1.0.60<\/h4>\n\n<ul>\n<li>Added - autonomous_checkout roadmap block in discovery: AP2-compatible contract defined, ready: false pending WooCommerce\/gateway support<\/li>\n<\/ul>\n\n<h4>1.0.59<\/h4>\n\n<ul>\n<li>Update - Admin Endpoints tab: added \/.well-known\/ucp, \/.well-known\/kalicart-bridge, POST \/checkout\/session<\/li>\n<li>Update - Endpoint descriptions updated with new fields<\/li>\n<li>Update - Docs updated with UCP, variants[], list_price, barcodes, metadata sections<\/li>\n<\/ul>\n\n<h4>1.0.58<\/h4>\n\n<ul>\n<li>Added - \/.well-known\/ucp UCP profile (catalog.search + catalog.lookup, version 2026-04-08)<\/li>\n<li>Added - ucp_profile_url in discovery document and well-known files<\/li>\n<li>Added - stock.availability_status with UCP-standard values<\/li>\n<li>Added - barcodes[] on products and variations (EAN, GTIN, UPC)<\/li>\n<li>Added - variants[] always present \u2014 variable products expose all variations, simple products expose single variant<\/li>\n<li>Added - list_price (UCP-compatible strikethrough price) on simple products<\/li>\n<li>Added - metadata{} block with purchase_readiness, stock_confidence, bridge_version<\/li>\n<\/ul>\n\n<h4>1.0.57<\/h4>\n\n<ul>\n<li>Fixed - Plugin information popup changelog now reads from readme.txt instead of hardcoded entries<\/li>\n<li>Fixed - Release ZIP excludes backup and temporary files<\/li>\n<\/ul>\n\n<h4>1.0.56<\/h4>\n\n<ul>\n<li>Fixed - popup_changelog() reads from readme.txt \u2014 always in sync with distributed ZIP<\/li>\n<li>Fixed - bump.py: sections.changelog in update JSON now auto-synced from readme.txt on every release<\/li>\n<\/ul>\n\n<h4>1.0.55<\/h4>\n\n<ul>\n<li>Update - active_coupons filter: coupons with no computable product value (fixed_cart, estimated_saving=0, not free_shipping) excluded from product payload<\/li>\n<li>Update - coupon payload: added applicable_at field (cart_only \/ product_or_cart)<\/li>\n<\/ul>\n\n<h4>1.0.54<\/h4>\n\n<ul>\n<li>Update - NO_IMAGE score deduction: 8 points; NO_SKU score deduction: 4 points<\/li>\n<li>Update - stock.quantity suppressed for variable products (variant_dependent) \u2014 aggregate count was misleading<\/li>\n<li>Update - quarantine build_issue_list: score calculated from severity map<\/li>\n<\/ul>\n\n<h4>1.0.53<\/h4>\n\n<ul>\n<li>Update - stock.quantity: null for variable products with variant_dependent confidence<\/li>\n<li>Update - score deductions: NO_IMAGE -8, NO_SKU -4 applied at product level<\/li>\n<\/ul>\n\n<h4>1.0.52<\/h4>\n\n<ul>\n<li>Fixed - Single product page link injected inside .product_meta via appendChild<\/li>\n<\/ul>\n\n<h4>1.0.51<\/h4>\n\n<ul>\n<li>Added - .well-known files served via WordPress rewrite rules with Content-Type: application\/json \u2014 works on any server<\/li>\n<li>Fixed - Removed dependency on .htaccess for Content-Type on .well-known files<\/li>\n<\/ul>\n\n<h4>1.0.49<\/h4>\n\n<ul>\n<li>Added - variations[] in \/catalog\/product\/{id} for variable products<\/li>\n<li>Added - agent_index_url field in admin settings, exposed in discovery document<\/li>\n<li>Fixed - query_construction: size removed from structured filters<\/li>\n<li>Update - catalog\/meta: on_sale, size_note, coupon_verification_rule added<\/li>\n<\/ul>\n\n<h4>1.0.48<\/h4>\n\n<ul>\n<li>Added - on_sale=true as real search filter<\/li>\n<li>Added - purchase_readiness block per product<\/li>\n<li>Added - stock.confidence: numeric_stock_quantity \/ availability_status_only \/ variant_dependent<\/li>\n<li>Added - discovery: stock_rule, variation_discovery, semantic_fit_guidance, evidence_required, total_verification_rule<\/li>\n<li>Update - search_url_template: {spine} replaced with {q}<\/li>\n<li>Update - coupon_policy: coupon_verification_rule and combinable_with_sale added<\/li>\n<\/ul>\n\n<h4>1.0.47<\/h4>\n\n<ul>\n<li>Fixed - WC tested up to updated to 10.8<\/li>\n<\/ul>\n\n<h4>1.0.45<\/h4>\n\n<ul>\n<li>Fixed - __return_true replaced with public_catalog_permission() \u2014 QIT security clean<\/li>\n<li>Fixed - wp_unslash() on $_GET inputs in class-checkout.php<\/li>\n<li>Fixed - Global variables in uninstall.php prefixed with kalicart_bridge_<\/li>\n<li>Fixed - Escape output via wp_json_encode() on boolean hint variables<\/li>\n<li>QIT Security: 0 errors, 0 warnings; PHP Compatibility: 0 errors, 0 warnings (PHP 8.0\u20138.5)<\/li>\n<\/ul>\n\n<h4>1.0.42<\/h4>\n\n<ul>\n<li>Added - [kalicart_agent_index] shortcode: agent-readable catalog index with live category tree<\/li>\n<li>Added - bump.py centralized release script<\/li>\n<\/ul>\n\n<h4>1.0.38<\/h4>\n\n<ul>\n<li>Update - Search results catalog link shown on zero-results and with-results pages<\/li>\n<li>Update - Link injected before footer; color:inherit; title hints for agents<\/li>\n<li>Removed - search?q= link from zero-results block<\/li>\n<\/ul>\n\n<h4>1.0.36<\/h4>\n\n<ul>\n<li>Added - Honey JS: structured links on search, zero-results, category and product pages<\/li>\n<li>Added - Agent discovery hints toggles in admin settings<\/li>\n<li>Fixed - All toggles now save correctly<\/li>\n<\/ul>\n\n<h4>1.0.34<\/h4>\n\n<ul>\n<li>Added - Hidden machine-readable anchor in primary nav menu<\/li>\n<\/ul>\n\n<h4>1.0.30<\/h4>\n\n<ul>\n<li>Added - .well-known\/kalicart-bridge and .well-known\/agent-catalog discovery files<\/li>\n<li>Added - Warning alerts when disabling critical discovery signals<\/li>\n<\/ul>\n\n<h4>1.0.28<\/h4>\n\n<ul>\n<li>Added - Checkout sessions: POST \/checkout\/session, returns cart_url and checkout_url<\/li>\n<li>Added - Checkout sessions toggle in admin settings (off by default)<\/li>\n<\/ul>\n\n<h4>1.0.25<\/h4>\n\n<ul>\n<li>Added - WC tested up to header; HPOS compatibility declaration<\/li>\n<\/ul>\n\n<h4>1.0.17<\/h4>\n\n<ul>\n<li>Added - Shipping policy and active coupons exposed on every product and in discovery document<\/li>\n<li>Added - \/catalog\/meta endpoint with accepted filter values and price range<\/li>\n<li>Added - Badge position configurable from admin settings<\/li>\n<li>Update - Catalog health dashboard: SQL-based, quarantine excludes no-image products<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>REST API: \/discovery, \/catalog\/search, \/catalog\/products, \/catalog\/product\/{id}, \/catalog\/categories, \/catalog\/health<\/li>\n<li>Normalized product data: price, stock, gender inference, color families, size detection<\/li>\n<li>Agent signals: link rel kalicart-agent, badge, robots.txt, sitemap-agentic-bridge.xml<\/li>\n<li>Catalog health dashboard with quarantine and improvement suggestions<\/li>\n<\/ul>","raw_excerpt":"Makes your WooCommerce catalog computable and readable by AI agents and MCP clients like ChatGPT, Claude and Gemini. No API key.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/326947","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=326947"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/carthub"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=326947"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=326947"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=326947"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=326947"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=326947"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=326947"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}