{"id":397920,"date":"2026-11-06T18:49:01","date_gmt":"2026-11-06T18:49:01","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/advocate-structured-data\/"},"modified":"2026-11-06T18:48:27","modified_gmt":"2026-11-06T18:48:27","slug":"advocatemcp-structured-data","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/advocatemcp-structured-data\/","author":23561868,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.5.0","stable_tag":"2.5.0","tested":"7.1.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Advocate MCP Structured Data","header_author":"Advocate MCP LLC","header_description":"Publishes your Advocate business profile as structured data and points AI assistants to your business details.","assets_banners_color":"070505","last_updated":"2026-11-06 18:48:27","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/advocatemcp.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":46,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.5.0":{"tag":"2.5.0","author":"cameronjmcewan","date":"2026-11-06 18:48:27","revision":3788560}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3788560,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3788560,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3788560,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3788560,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.5.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[2516,211937,1117,186,1121],"plugin_category":[55],"plugin_contributors":[291247],"plugin_business_model":[],"class_list":["post-397920","plugin","type-plugin","status-publish","hentry","plugin_tags-json-ld","plugin_tags-localbusiness","plugin_tags-schema","plugin_tags-seo","plugin_tags-structured-data","plugin_category-seo-and-marketing","plugin_contributors-cameronjmcewan","plugin_committers-cameronjmcewan"],"banners":{"banner":"https:\/\/ps.w.org\/advocatemcp-structured-data\/assets\/banner-772x250.png?rev=3788560","banner_2x":"https:\/\/ps.w.org\/advocatemcp-structured-data\/assets\/banner-1544x500.png?rev=3788560","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/advocatemcp-structured-data\/assets\/icon-128x128.png?rev=3788560","icon_2x":"https:\/\/ps.w.org\/advocatemcp-structured-data\/assets\/icon-256x256.png?rev=3788560","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Search engines and AI assistants read structured data to understand what a\nbusiness is, where it is, and what it offers. This plugin puts your Advocate\nbusiness profile into your site's <code>&lt;head&gt;<\/code> as JSON-LD, server-side, so crawlers\nthat do not run JavaScript can read it.<\/p>\n\n<p>You maintain one profile on Advocate. This site follows it \u2014 there is nothing to\nre-enter here when your hours, address, or services change.<\/p>\n\n<p><strong>Background profile updates.<\/strong> The profile is fetched in the background,\nnever while a visitor is waiting for a page. If Advocate is unreachable and a\nprofile was downloaded successfully before, the plugin uses it for up to 24\nhours from its last validated download. It then pauses structured data until a\nvalid download succeeds. Unknown-age caches from older versions also pause\nuntil refreshed. Your site keeps working.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to Advocate (https:\/\/app.advocatemcp.com), a service run by\nAdvocate MCP LLC. An Advocate account and a published business profile are\nrequired to publish structured data. Advocate offers paid service plans; review\ncurrent plans at https:\/\/app.advocatemcp.com\/pricing before subscribing. Installing\nor connecting this plugin does not subscribe you or charge you.<\/p>\n\n<p><strong>Account connection.<\/strong> Only after an administrator clicks Connect Advocate,\nthe browser opens Advocate with this website's public address, its WordPress\nadmin return address, and a random temporary state value. You sign in or create\nan account, choose your business, and confirm. WordPress receives only the public\nbusiness identifier and website, never your Advocate password or account token.\nA new business stays private until you complete onboarding and choose to publish.\nHTTPS is required, and the public website and WordPress admin must have the same\norigin (their paths may differ). Manual setup remains available.<\/p>\n\n<p>The following profile and page-view requests require a configured Business ID.\nDirectory packages make no plugin-initiated Advocate request before connection\nor configuration. Self-hosted ZIP packages additionally check the public update\nmanifest described below, independently of configuration.<\/p>\n\n<p><strong>1. Fetching your profile.<\/strong> On a background refresh, about hourly, the plugin\nrequests <code>https:\/\/app.advocatemcp.com\/api\/biz\/&lt;your-business-id&gt;\/jsonld<\/code>. Only\nyour Business ID is sent. The reply is the JSON-LD this plugin prints. It is\ndata, not code \u2014 nothing is downloaded and run. This never happens while a\nvisitor is waiting for a page.<\/p>\n\n<p><strong>2. Reporting page views.<\/strong> After a page has finished sending, the plugin posts\nto <code>https:\/\/app.advocatemcp.com\/api\/edge\/plugin-beacon<\/code> to report that one page\nview happened. It sends your Business ID, your site's hostname, the path of the\npage viewed with the query string removed, the visitor's browser or crawler\nuser-agent string, the installed plugin version, and a SHA-256 hash of the\nvisitor's IP address. A hash is not a guarantee of anonymity. The raw IP\naddress is never sent. The request does not block, so it cannot delay or break a\npage. This is what lets your Advocate dashboard show visits and AI-crawler reads\non your own site.<\/p>\n\n<p>Directory packages do not load a remote page script.<\/p>\n\n<p>The plugin also adds a few tags to your pages' <code>&lt;head&gt;<\/code> (and a <code>Link<\/code> response\nheader) naming Advocate's MCP endpoint for your business, and sends requests\nfor your site's <code>\/.well-known\/mcp.json<\/code> to Advocate's description of it, only\nwhen your site would otherwise answer that address with a \"not found\" page.\nThese are data; nothing is sent anywhere.<\/p>\n\n<p>To stop profile fetching and page-view reporting, clear the\nBusiness ID or deactivate the plugin. Turning publishing off also stops\nscheduled page-view reporting. Page\/CDN cache hits do not run PHP and are not\nmeasured by this plugin.<\/p>\n\n<p><strong>Self-hosted distribution updates.<\/strong> Direct ZIP packages contain an updater\nthat periodically requests <code>https:\/\/app.advocatemcp.com\/wordpress-plugin\/advocatemcp-structured-data.json<\/code>\nwith the plugin version in its user-agent, even before a Business ID is set.\nA copy installed before 2.5.0 lives in the <code>advocate-agent<\/code> folder and requests\n    https:\/\/app.advocatemcp.com\/wordpress-plugin\/advocate-agent.json instead; both\naddresses offer this same release.\nThe manifest can offer a plugin ZIP from the same service. Directory packages\nomit this updater and use WordPress.org's standard plugin update mechanism.<\/p>\n\n<p>Advocate's terms of service: https:\/\/app.advocatemcp.com\/terms\nAdvocate's privacy policy: https:\/\/app.advocatemcp.com\/privacy<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate Advocate MCP Structured Data. If using a directory release,\nuse Plugins \u2192 Add New. If using a downloaded ZIP, use Upload Plugin.<\/li>\n<li>Open Settings \u2192 Advocate and choose <strong>Connect Advocate<\/strong>. Sign in or create\nyour Advocate account, choose the business, and confirm the website.<\/li>\n<li>Complete onboarding in Advocate if your business is new. Publication and any\nsubscription are separate choices; connecting the plugin does not publish.<\/li>\n<li>For a published profile, open WordPress setup in Advocate and select\n<strong>Check connection<\/strong> to observe whether the latest profile is on your site.<\/li>\n<\/ol>\n\n<p>A download prepared in your Advocate account can still configure a matching\nwebsite automatically. Existing settings are kept, including disabled publishing.\nTo use manual setup, enter the Business ID (the final part of the Advocate profile\nURL) in Settings \u2192 Advocate. Automatic connection preserves an existing disabled\npublishing setting; enable it explicitly when you are ready.<\/p>\n\n<p>A connection attempt expires after two hours. If it expires, your WordPress\naccount\/site changes, or somebody edits these plugin settings while you are away,\nstart Connect Advocate again. Existing settings are kept on a refused callback.\nThe first profile update runs in the background; Refresh now retries it.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20can%20i%20get%20help%3F\"><h3>Where can I get help?<\/h3><\/dt>\n<dd><p>Use the contact form at https:\/\/app.advocatemcp.com\/contact or email\nsupport@advocatemcp.com.<\/p><\/dd>\n<dt id=\"i%20already%20use%20yoast%20or%20rank%20math.%20should%20i%20use%20both%3F\"><h3>I already use Yoast or Rank Math. Should I use both?<\/h3><\/dt>\n<dd><p>Probably not both for the same business. Two descriptions of one business on one\npage can confuse crawlers. The settings page warns you when it detects another\nSEO plugin \u2014 ask Advocate which one to keep.<\/p><\/dd>\n<dt id=\"how%20quickly%20does%20a%20profile%20edit%20reach%20my%20site%3F\"><h3>How quickly does a profile edit reach my site?<\/h3><\/dt>\n<dd><p>The plugin checks for updates about once an hour. Choose Refresh now to check\nsooner. Cached pages may need to be cleared before they show the update.<\/p>\n\n<p>Automatic checks run through WordPress scheduled tasks (WP-Cron), which only\nrun when your site is visited or when your host triggers them, so there is no\nfixed delivery deadline. \"Refresh now\" checks immediately; a successful check\nupdates this plugin's own copy of the profile, not caches in front of your site.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20advocate%20is%20down%3F\"><h3>What happens if Advocate is down?<\/h3><\/dt>\n<dd><p>The saved profile can appear on newly generated pages for up to 24 hours after\nits last validated download. Failed retries do not extend that time. After\nthat, publishing pauses until a valid download succeeds. The settings page\nshows the pause and offers Refresh now. This uses the WordPress server clock;\nkeep it synchronized. It does not guarantee a deadline across clock changes.<\/p>\n\n<p>Page\/CDN caches may still contain older HTML and must be cleared separately.\nThis is an outage-age limit, not an authenticated remote withdrawal signal.\nUpdating the downloadable ZIP does not update existing installed copies;\nreplace the installed plugin through your normal WordPress update procedure.<\/p><\/dd>\n<dt id=\"does%20this%20support%20wordpress%20multisite%3F\"><h3>Does this support WordPress multisite?<\/h3><\/dt>\n<dd><p>Activate and configure Advocate separately on each site. New network activation\nis refused, and one business is never configured for all sites. Public website\npath and nondefault port must match as well as hostname. Deactivation clears\nthat site's refresh tasks and cached profile while preserving its settings;\nreactivation needs a fresh download. Uninstall removes plugin settings too.\nWhen two copies of the plugin are installed (see the 2.5.0 changelog), the\nnotice appears on each site's own Plugins screen, not on the network Plugins\nscreen. A network-wide delete of the earlier copy restores settings only when\nthis copy is loaded in that Network Admin request, that is, active on the main\nsite; if it is active only on sub-sites, nothing is saved anywhere.<\/p>\n\n<p>Legacy network deactivation cleans the current network, while uninstall checks\nall networks because plugin files are shared. Automatic cleanup is limited to\n100 sites. A larger scope is refused before any site is changed. A database or\ncache failure stops cleanup with an error; resolve it and retry. Completed\nsites may already be cleaned. Neither operation purges existing page\/CDN HTML.<\/p><\/dd>\n<dt id=\"how%20does%20an%20administrator%20remove%20advocate%20from%20more%20than%20100%20sites%3F\"><h3>How does an administrator remove Advocate from more than 100 sites?<\/h3><\/dt>\n<dd><p>Use a maintenance window and a verified backup. Stop incoming PHP\/cron work and\ndrain existing workers first; older plugin code does not honor the new inactive\nmarker. Inventory every site across every network. Use WP-CLI with\n    --skip-plugins=advocatemcp-structured-data to deactivate the plugin on every network and\nany separately active site without loading its bounded automatic hooks. Keep\nthe plugin files in place until every site's cleanup is verified.<\/p>\n\n<p>For each site URL in that inventory, run the following with the current source\ninstalled (a copy installed before 2.5.0 uses the <code>advocate-agent<\/code> folder and\nmain file name in both places). Replace the example URL. This reuses the plugin's per-site cleanup,\nthen removes settings only after that cleanup succeeds. Stop on any error:<\/p>\n\n<pre><code>wp --url='https:\/\/example.com\/site\/' --skip-plugins=advocatemcp-structured-data eval '\nrequire WP_PLUGIN_DIR . \"\/advocatemcp-structured-data\/advocatemcp-structured-data.php\";\nadvocate_deactivate_site();\n$missing = new stdClass();\nforeach ( [ \"advocate_agent_settings\", \"advocate_setup_import\", \"advocate_setup_notice\", \"advocate_connect_attempt\", \"advocate_lifecycle\" ] as $key ) {\n    delete_option( $key );\n    if ( get_option( $key, $missing ) !== $missing ) {\n        WP_CLI::error( \"Cleanup failed for \" . $key . \"; resolve storage errors and retry.\" );\n    }\n}\nWP_CLI::success( \"Advocate data and refresh tasks cleared for this site.\" );'\n<\/code><\/pre>\n\n<p>Retain a successful receipt for every site and verify that no Advocate refresh\ntask or plugin data remains. Only then remove the shared plugin directory and\nclear page\/CDN caches. A site-level Delete button does not bypass the global\n100-site uninstall preflight. This operator procedure still requires a staging\nrehearsal for your WordPress\/WP-CLI and cache configuration.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.5.0<\/h4>\n\n<ul>\n<li>Renamed to Advocate MCP Structured Data (slug <code>advocatemcp-structured-data<\/code>)\nfor the WordPress.org plugin directory. A copy that updates in place keeps\nits settings, cached profile and scheduled refreshes unchanged. Switching\nfrom the earlier <code>advocate-agent<\/code> folder to this one by deactivating the old\ncopy clears its cached profile and refresh schedule, as any deactivation\ndoes; this copy downloads the profile again within a minute of activation.<\/li>\n<li>Values read from the request (the visitor's user agent, address and path,\nand the account connection callback's method and query) pass through\nWordPress sanitizers before use. Translations load through WordPress itself.<\/li>\n<li>A site holding both the earlier <code>advocate-agent<\/code> folder and this one can\nactivate only one; the active copy says so on the Plugins screen. Switch in\nthis order: deactivate the earlier copy, activate this one, and only then\ndelete the earlier copy \u2014 while this copy is active it puts back anything\nthe earlier copy's uninstall removes. Deleting the earlier copy before this\none is active removes the settings. Deleting this copy while the earlier one\nis installed leaves the settings for it.<\/li>\n<\/ul>\n\n<h4>2.4.0<\/h4>\n\n<ul>\n<li>Publishes a per-business pointer to Advocate's MCP server alongside the\nstructured data: <code>&lt;link&gt;<\/code>\/<code>&lt;meta&gt;<\/code> discovery tags, a schema.org WebAPI block,\nand a <code>Link<\/code> response header. The render path still performs no I\/O.<\/li>\n<li>Directory packages do not load a remote page script.<\/li>\n<li><code>\/.well-known\/mcp.json<\/code> on this site redirects to Advocate's manifest for\nthis business, only when nothing else on the site answers that address.<\/li>\n<\/ul>\n\n<h4>2.3.0<\/h4>\n\n<ul>\n<li>Connect an Advocate account without copying a Business ID; preserve disabled\npublishing and refuse stale, expired, wrong-user or wrong-site callbacks.<\/li>\n<li>Consume each connection and apply settings together; replay cannot overwrite\nlater local settings. Keep new business profiles private through onboarding.<\/li>\n<li>Prepare an explicit directory package without the self-hosted update channel\nor business-specific setup data; preserve direct-distribution compatibility.<\/li>\n<li>Describe account connection, plugin-version reporting, service plans and update\nrequests accurately. Compatibility metadata reflects tested versions only.<\/li>\n<\/ul>\n\n<h4>2.2.2<\/h4>\n\n<ul>\n<li>Self-hosted update channel: the plugin now carries an <code>Update URI<\/code> header and\nchecks Advocate's version manifest for new releases, so WordPress offers\nupdates without a WordPress.org listing. Update packages are requested only\nfrom app.advocatemcp.com over HTTPS.<\/li>\n<li>The traffic beacon reports the installed plugin version so Advocate can show\nwhich version each site runs.<\/li>\n<\/ul>\n\n<h4>2.2.1<\/h4>\n\n<ul>\n<li>Pause newly generated structured data after 24 hours without a validated\nprofile download, including unknown-age legacy caches; show the pause in\nsettings. Failed refreshes cannot renew the deadline.<\/li>\n<li>Validate the public site path and port on downloaded and cached profiles,\nincluding every supplied identity anchor.<\/li>\n<li>Refuse new network activation, bound legacy multisite cleanup, clear every\nrefresh event and fence late refresh workers across deactivation\/reactivation.<\/li>\n<li>Preserve cleanup retry state and report storage failures before uninstall can\nremove the inactive marker. Page\/CDN cache removal remains an operator step.<\/li>\n<\/ul>\n\n<h4>2.2.0<\/h4>\n\n<ul>\n<li>Downloads prepared in Advocate can configure the business automatically on\nthe matching website. Existing business settings and disabled publishing are\npreserved. Generic downloads still support manual setup.<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>After a page has been sent, the plugin now tells Advocate one page view\nhappened (which page, which browser or crawler), so your Advocate dashboard\ncan show visits and AI-crawler reads on your own site. The visitor's IP\naddress never leaves your server \u2014 only a one-way hash is sent. Nothing\nabout this waits on Advocate or can slow a visitor down.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>The profile is now fetched in the background. Earlier versions could make a\nvisitor wait up to five seconds when the cache was cold.<\/li>\n<li>Failed fetches are remembered briefly instead of retried on every page view.<\/li>\n<li>The block is no longer added to 404, search, or feed pages.<\/li>\n<li>Warns when another SEO plugin is already publishing business schema.<\/li>\n<li>Refuses to publish a profile that is anchored to a domain other than this one.<\/li>\n<li>The settings page reports what was last published and when.<\/li>\n<li>Setup is one field. The Agent Query URL and Business Name fields are gone.<\/li>\n<li>Removed <code>\/.well-known\/mcp.json<\/code>. It advertised endpoints that no longer exist.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Structured data injection.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Publishes your Advocate business profile as LocalBusiness JSON-LD in your site's head, refreshed automatically.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/397920","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=397920"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/cameronjmcewan"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=397920"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=397920"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=397920"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=397920"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=397920"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=397920"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}