{"id":284847,"date":"2026-03-06T12:05:19","date_gmt":"2026-03-06T12:05:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/whisper\/"},"modified":"2026-03-16T13:35:52","modified_gmt":"2026-03-16T13:35:52","slug":"mescio-for-agents","status":"publish","type":"plugin","link":"https:\/\/twd.wordpress.org\/plugins\/mescio-for-agents\/","author":16166350,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.6.5","stable_tag":"1.6.5","tested":"6.9.4","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"Mescio for Agents","header_author":"Mescio","header_description":"Mescio for Agents serves your posts, pages and WooCommerce products as clean Markdown to AI agents and GPT crawlers \u2014 using HTTP content negotiation (Accept: text\/markdown). Human visitors never notice a thing.","assets_banners_color":"367378","last_updated":"2026-03-16 13:35:52","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/mescio-for-agents\/","header_author_uri":"https:\/\/mescio.it\/","rating":0,"author_block_rating":0,"active_installs":20,"downloads":482,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.3":{"tag":"1.2.3","author":"vinsmach","date":"2026-03-06 12:05:18"},"1.3.0":{"tag":"1.3.0","author":"vinsmach","date":"2026-03-09 06:28:02"},"1.4.0":{"tag":"1.4.0","author":"vinsmach","date":"2026-03-10 17:41:34"},"1.5.0":{"tag":"1.5.0","author":"vinsmach","date":"2026-03-11 08:25:04"},"1.6.0":{"tag":"1.6.0","author":"vinsmach","date":"2026-03-11 11:41:07"},"1.6.1":{"tag":"1.6.1","author":"vinsmach","date":"2026-03-11 11:58:47"},"1.6.2":{"tag":"1.6.2","author":"vinsmach","date":"2026-03-11 12:32:44"},"1.6.3":{"tag":"1.6.3","author":"vinsmach","date":"2026-03-11 13:48:20"},"1.6.4":{"tag":"1.6.4","author":"vinsmach","date":"2026-03-11 14:57:12"},"1.6.5":{"tag":"1.6.5","author":"vinsmach","date":"2026-03-16 13:35:52"}},"upgrade_notice":{"1.6.0":"<p>Adds rate limiting and sensitive data protection for custom fields. Recommended for all sites exposed to public AI agents.<\/p>","1.5.0":"<p>Custom fields and ACF data now automatically included in Markdown front matter.<\/p>","1.4.0":"<p>Adds \/agents.txt endpoint following the IETF draft standard for AI agent access policy.<\/p>","1.3.0":"<p>Major update: new REST endpoints, pagination, improved caching, and better Markdown output for page builder sites.<\/p>","1.1.0":"<p>Adds multilingual support and significantly improved Markdown output quality for page builder sites. Upgrade recommended for all users.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3476362,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3476362,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3476362,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3476362,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.3","1.3.0","1.4.0","1.5.0","1.6.0","1.6.1","1.6.2","1.6.3","1.6.4","1.6.5"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Settings page \u2014 post types and language configuration","2":"Example Markdown output with YAML front matter","3":"WooCommerce product rendered as Markdown with product details table"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[15643,2353,226124,4608,23853],"plugin_category":[],"plugin_contributors":[257333],"plugin_business_model":[],"class_list":["post-284847","plugin","type-plugin","status-publish","hentry","plugin_tags-agents","plugin_tags-ai","plugin_tags-llm","plugin_tags-markdown","plugin_tags-rest-api","plugin_contributors-vinsmach","plugin_committers-vinsmach"],"banners":{"banner":"https:\/\/ps.w.org\/mescio-for-agents\/assets\/banner-772x250.png?rev=3476362","banner_2x":"https:\/\/ps.w.org\/mescio-for-agents\/assets\/banner-1544x500.png?rev=3476362","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/mescio-for-agents\/assets\/icon-128x128.png?rev=3476362","icon_2x":"https:\/\/ps.w.org\/mescio-for-agents\/assets\/icon-256x256.png?rev=3476362","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Mescio for Agents<\/strong> makes your WordPress site AI-ready by silently serving posts, pages and WooCommerce products as clean, structured Markdown to any AI agent or LLM pipeline that requests it \u2014 using the standard HTTP <code>Accept: text\/markdown<\/code> content negotiation header.<\/p>\n\n<p>Human visitors using a browser are <strong>completely unaffected<\/strong>. Mescio for Agents only activates when an AI agent or crawler explicitly asks for Markdown.<\/p>\n\n<h4>Why Markdown?<\/h4>\n\n<p>Feeding raw HTML to an AI is expensive and noisy. A heading like <code>## About Us<\/code> costs ~3 tokens in Markdown vs 12\u201315 tokens as HTML \u2014 before accounting for <code>&lt;div&gt;<\/code> wrappers, navigation bars and script tags that carry zero semantic value. This blog post you are reading takes 16,180 tokens in HTML and 3,150 tokens in Markdown. That is an 80% reduction.<\/p>\n\n<p>Markdown has become the <em>lingua franca<\/em> for AI systems. Mescio for Agents lets your site speak it natively, at zero cost to your human visitors.<\/p>\n\n<h4>How it works<\/h4>\n\n<p>When an HTTP client sends a request with <code>Accept: text\/markdown<\/code>, Mescio for Agents intercepts the WordPress request lifecycle before any template is rendered, converts the post content to clean Markdown, and returns it with the correct <code>Content-Type: text\/markdown<\/code> header.<\/p>\n\n<pre><code>curl https:\/\/yoursite.com\/your-post\/ \\\n  -H \"Accept: text\/markdown\"\n<\/code><\/pre>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>Zero configuration<\/strong> \u2014 works out of the box on any singular post, page or custom post type<\/li>\n<li><strong><code>\/llms.txt<\/code> endpoint<\/strong> \u2014 auto-generated index of all your content in the <a href=\"https:\/\/llmstxt.org\">llmstxt.org<\/a> standard format, so AI agents can discover what's on your site<\/li>\n<li><strong><code>\/llms-full.txt<\/code> endpoint<\/strong> \u2014 full site content in a single Markdown file, ready for RAG pipelines<\/li>\n<li><strong>WooCommerce support<\/strong> \u2014 product pages include price, SKU, stock status, rating, attributes and gallery; products are grouped by category in <code>llms.txt<\/code><\/li>\n<li><strong>YAML front matter<\/strong> \u2014 every document includes structured metadata (title, description, URL, date, categories, tags, featured image)<\/li>\n<li><strong>Multilingual<\/strong> \u2014 detects language via WPML, Polylang, TranslatePress or WordPress locale; emits <code>Content-Language<\/code> and <code>Link: rel=alternate<\/code> headers<\/li>\n<li><strong>REST API endpoint<\/strong> \u2014 <code>\/wp-json\/mescio-for-agents\/v1\/markdown?id=&lt;post_id&gt;<\/code> or <code>?url=&lt;permalink&gt;<\/code><\/li>\n<li><strong>Page builder cleanup<\/strong> \u2014 aggressively strips Elementor, Divi, WPBakery and Beaver Builder layout noise<\/li>\n<li><strong>Token count header<\/strong> \u2014 <code>X-Markdown-Tokens<\/code> tells AI pipelines how large the document is before processing<\/li>\n<li><strong>Content Signals<\/strong> \u2014 emits <code>Content-Signal: ai-train=yes, search=yes, ai-input=yes<\/code><\/li>\n<li><strong>Correct HTTP caching<\/strong> \u2014 <code>Vary: Accept<\/code> ensures CDNs cache HTML and Markdown versions separately<\/li>\n<\/ul>\n\n<h4>Response headers<\/h4>\n\n<ul>\n<li><code>Content-Type: text\/markdown; charset=utf-8<\/code><\/li>\n<li><code>Content-Language: it<\/code> (or detected language)<\/li>\n<li><code>Vary: Accept<\/code><\/li>\n<li><code>X-Markdown-Tokens: 725<\/code><\/li>\n<li><code>Content-Signal: ai-train=yes, search=yes, ai-input=yes<\/code><\/li>\n<li><code>Link: &lt;url&gt;; rel=\"alternate\"; hreflang=\"en\"<\/code> (when translations available)<\/li>\n<\/ul>\n\n<h4>Multilingual plugin support<\/h4>\n\n<ul>\n<li><strong>WPML<\/strong> \u2014 reads language and available translations automatically<\/li>\n<li><strong>Polylang<\/strong> \u2014 reads language and links to translated post IDs<\/li>\n<li><strong>TranslatePress<\/strong> \u2014 reads <code>trp_language<\/code> post meta<\/li>\n<li><strong>Manual<\/strong> \u2014 configure primary language and additional languages in Settings \u2192 Mescio for Agents<\/li>\n<\/ul>\n\n<h4>REST API<\/h4>\n\n<pre><code>GET \/wp-json\/mescio-for-agents\/v1\/markdown?id=42\nGET \/wp-json\/mescio-for-agents\/v1\/markdown?url=https:\/\/yoursite.com\/my-page\/\n<\/code><\/pre>\n\n<h4>Developer hooks<\/h4>\n\n<p><strong>Filter: <code>mescio_enabled_post_types<\/code><\/strong> \u2014 add or remove post types dynamically.<\/p>\n\n<p><strong>Filter: <code>mescio_pre_convert_content<\/code><\/strong> \u2014 modify the HTML before conversion to Markdown.<\/p>\n\n<p><strong>Filter: <code>mescio_post_convert_content<\/code><\/strong> \u2014 modify the Markdown after conversion.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>This plugin does not collect, store or transmit any personal data. It does not set cookies. It does not make external HTTP requests.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>mescio-for-agents<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install directly from the WordPress plugin directory.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>Optionally configure it at <strong>Settings \u2192 Mescio for Agents<\/strong>.<\/li>\n<li>Test it: <code>curl https:\/\/yoursite.com\/any-post\/ -H \"Accept: text\/markdown\"<\/code><\/li>\n<\/ol>\n\n<p>No API keys, no external services, no additional dependencies required.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20this%20affect%20my%20site%27s%20seo%20or%20how%20google%20crawls%20it%3F\"><h3>Will this affect my site's SEO or how Google crawls it?<\/h3><\/dt>\n<dd><p>No. The plugin only responds with Markdown when an HTTP client sends <code>Accept: text\/markdown<\/code>. Standard browsers and Googlebot never send this header, so they receive the normal HTML page. The Markdown responses include <code>X-Robots-Tag: noindex<\/code> to be safe.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20the%20gutenberg%20block%20editor%3F\"><h3>Does it work with the Gutenberg block editor?<\/h3><\/dt>\n<dd><p>Yes. The plugin applies WordPress's <code>the_content<\/code> filter, which fully processes Gutenberg blocks into HTML before conversion.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20elementor%2C%20divi%20or%20other%20page%20builders%3F\"><h3>Does it work with Elementor, Divi or other page builders?<\/h3><\/dt>\n<dd><p>Yes. The HTML cleaner aggressively strips layout wrapper elements, data attributes and icon-only links produced by visual page builders, resulting in clean semantic Markdown.<\/p><\/dd>\n<dt id=\"does%20it%20work%20without%20woocommerce%3F\"><h3>Does it work without WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. WooCommerce is completely optional. Without it, the plugin works normally for posts and pages.<\/p><\/dd>\n<dt id=\"does%20it%20require%20wpml%20or%20polylang%3F\"><h3>Does it require WPML or Polylang?<\/h3><\/dt>\n<dd><p>No. Both are optional. Without them, Mescio for Agents detects the site language from the WordPress locale setting. You can also configure languages manually in Settings \u2192 Mescio for Agents.<\/p><\/dd>\n<dt id=\"can%20i%20add%20custom%20post%20types%3F\"><h3>Can I add custom post types?<\/h3><\/dt>\n<dd><p>Yes, either from the settings page or via the <code>mescio_enabled_post_types<\/code> filter:<\/p>\n\n<pre><code>add_filter( 'mescio_enabled_post_types', function( $types ) {\n    $types[] = 'my_cpt';\n    return $types;\n});\n<\/code><\/pre><\/dd>\n<dt id=\"is%20there%20a%20%22powered%20by%22%20link%20added%20to%20my%20site%3F\"><h3>Is there a \"powered by\" link added to my site?<\/h3><\/dt>\n<dd><p>No. The plugin adds no frontend links, scripts or styles to your site.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.6.5<\/h4>\n\n<ul>\n<li>Security: added two-layer burst protection to rate limiter<\/li>\n<li>Layer 1 \u2014 burst guard: IPs sending more than 20 requests in 5 seconds are auto-blocked for 10 minutes; block checked with a single transient read before any WordPress processing<\/li>\n<li>Layer 2 \u2014 sustained limits unchanged: 10 req\/60s for llms-full.txt, 20 for REST search, 30 for other REST, 60 default<\/li>\n<li>All burst thresholds filterable via <code>mescio_burst_limit<\/code>, <code>mescio_burst_window<\/code>, <code>mescio_block_duration<\/code><\/li>\n<li>REST 429 responses now include <code>Retry-After<\/code>, <code>X-RateLimit-Remaining<\/code>, <code>X-RateLimit-Reset<\/code> headers<\/li>\n<li>Consolidated REST rate limit logic into <code>Mescio_For_Agents_Rate_Limiter::check_for_rest()<\/code> (handles both burst + sustained in one call)<\/li>\n<li>Removed duplicate <code>get_request_ip()<\/code> from main class \u2014 now uses <code>Rate_Limiter::get_ip()<\/code> throughout<\/li>\n<\/ul>\n\n<h4>1.6.3<\/h4>\n\n<ul>\n<li>Fix: shortcode builder tags (WPBakery, WoodMart, ecc.) rimossi anche dagli excerpt nel llms.txt index<\/li>\n<li>Fix: llms.txt ora serve titoli, excerpt e permalink nella lingua corretta su siti multilingua (WPML\/Polylang)<\/li>\n<li>Fix: llms-full.txt ora serve il contenuto completo dei post nella lingua corretta (WPML\/Polylang)<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>Fixed 404 on multilingual sites using WPML or Polylang: <code>llms.txt<\/code> and <code>llms-full.txt<\/code> now resolve correctly under language-prefixed URLs (e.g. <code>\/it\/llms.txt<\/code>, <code>\/en\/llms-full.txt<\/code>)<\/li>\n<li>Added <code>parse_request<\/code> early intercept (priority 1) as fallback for language plugins that rewrite REQUEST_URI before WordPress rewrite rules run<\/li>\n<li>Added rewrite rule variant matching <code>\/xx\/llms.txt<\/code> and <code>\/xx-XX\/llms.txt<\/code> patterns<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Added rate limiting: per-IP request throttling on all endpoints via WordPress transients<\/li>\n<li><code>llms-full.txt<\/code> limited to 10 req\/60s, REST search to 20, other REST to 30, default to 60<\/li>\n<li>Returns 429 Too Many Requests with <code>Retry-After<\/code> header when limit exceeded<\/li>\n<li>Respects Cloudflare, nginx and standard <code>X-Forwarded-For<\/code> proxy headers<\/li>\n<li>Added sensitive meta key filter: fields containing <code>password<\/code>, <code>token<\/code>, <code>email<\/code>, <code>phone<\/code>, <code>iban<\/code> and similar patterns are never exposed in Markdown front matter<\/li>\n<li>Both rate limiting and sensitive key filter are filterable by developers<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Added automatic custom fields support in Markdown front matter<\/li>\n<li>If ACF is active, uses <code>get_fields()<\/code> with label-keyed, typed values; nested groups and repeaters flattened to dot notation (e.g. <code>group.field<\/code>)<\/li>\n<li>Without ACF, exposes plain post meta \u2014 skipping internal keys (<code>_<\/code> prefix), serialized data, JSON blobs and known plugin internals<\/li>\n<li>Added <code>mescio_custom_meta<\/code> filter for developer overrides<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Added <code>\/agents.txt<\/code> endpoint following IETF draft-srijal-agents-policy-00<\/li>\n<li>SHA-256 hash computed automatically from directive content<\/li>\n<li>Configurable directives (path, ALLOW\/DISALLOW, optional params) via admin settings<\/li>\n<li>Live preview of generated file with hash in settings page<\/li>\n<li>Default directives: <code>\/ ALLOW<\/code>, <code>\/wp-admin DISALLOW<\/code>, <code>\/wp-login.php DISALLOW<\/code><\/li>\n<li>Added <code>\/agents.txt<\/code> link in Quick Links table<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Refactored monolith into modular architecture (6 separate class files)<\/li>\n<li>Added REST endpoint <code>\/wp-json\/mescio-for-agents\/v1\/context<\/code> \u2014 site metadata + llms.txt in JSON for MCP servers<\/li>\n<li>Added REST endpoint <code>\/wp-json\/mescio-for-agents\/v1\/search<\/code> \u2014 full-text search with Markdown output<\/li>\n<li>Added REST endpoint <code>\/wp-json\/mescio-for-agents\/v1\/page<\/code> \u2014 page by slug or ID<\/li>\n<li>Added REST endpoint <code>\/wp-json\/mescio-for-agents\/v1\/openapi<\/code> \u2014 OpenAPI 3.1 schema<\/li>\n<li>Added <code>llms-full.txt<\/code> pagination via <code>?limit=N&amp;offset=N<\/code> with <code>X-LLMS-Next<\/code> header<\/li>\n<li>Improved caching: real <code>Last-Modified<\/code> from content timestamp, <code>ETag<\/code> from body hash, full 304 support<\/li>\n<li>Fixed excess blank lines in Markdown output from Elementor and other page builders<\/li>\n<li>Expanded admin API Examples panel with 8 tabs and copy buttons<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added <code>\/llms.txt<\/code> endpoint \u2014 auto-generated site index in the llmstxt.org standard format<\/li>\n<li>Added <code>\/llms-full.txt<\/code> endpoint \u2014 full site content in a single Markdown file for RAG pipelines<\/li>\n<li>Products in <code>llms.txt<\/code> grouped by WooCommerce category with price and stock status<\/li>\n<li>Added <code>mescio_llms_txt_posts_limit<\/code>, <code>mescio_llms_txt_products_limit<\/code>, <code>mescio_llms_full_txt_limit<\/code> filters<\/li>\n<li>Added flush rewrite rules on plugin activation\/deactivation<\/li>\n<li>Added <code>\/llms.txt<\/code> and <code>\/llms-full.txt<\/code> clickable links in the settings test panel<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added multilingual support: WPML, Polylang, TranslatePress and manual configuration<\/li>\n<li>Added <code>Content-Language<\/code> and <code>Link: rel=alternate<\/code> response headers<\/li>\n<li>Improved HTML to Markdown converter with aggressive page builder noise removal<\/li>\n<li>Added UTF-8 and mojibake encoding auto-correction<\/li>\n<li>Improved whitespace normalisation<\/li>\n<li>Added 27-language selector in admin with flags and native names<\/li>\n<li>Added plugin detection badges in settings page<\/li>\n<li>Added test panel with ready-to-use curl and Python examples<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Content negotiation via <code>Accept: text\/markdown<\/code> header<\/li>\n<li>YAML front matter with post metadata<\/li>\n<li>WooCommerce product support<\/li>\n<li>REST API endpoint <code>\/wp-json\/mescio-for-agents\/v1\/markdown<\/code><\/li>\n<li><code>X-Markdown-Tokens<\/code> header with token count estimate<\/li>\n<li><code>Content-Signal<\/code> header<\/li>\n<li><code>Vary: Accept<\/code> for correct HTTP caching<\/li>\n<\/ul>","raw_excerpt":"Mescio for Agents serves your WordPress content as clean Markdown to AI agents and GPT crawlers. Human visitors never notice a thing.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/284847","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=284847"}],"author":[{"embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/vinsmach"}],"wp:attachment":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=284847"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=284847"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=284847"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=284847"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=284847"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=284847"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}