How to check RankReady is working
Verify every RankReady endpoint with a browser and curl, and know what to do when one of them returns 404 or 403.
Last updated August 25, 2026
This page gives you a checkable pass or fail for each RankReady feature. Run it after install, after you change any toggle, and after any host or caching change. It takes about five minutes and it replaces guessing.
Check 1: The endpoints load in a browser
Open each of these on your own site. Only test the ones you have turned on.
/llms.txt, the AI-readable index of the site/llms-full.txt, the full corpus in one file/index.md, the homepage as Markdown/{post-slug}.mdfor a real published post/okf/, the Open Knowledge Format bundle/.well-known/mcp.json, the WebMCP manifest
A pass is a 200 with the expected body. Markdown URLs should show YAML frontmatter at the top.
Check 2: The robots.txt block is present
Open /robots.txt. You are looking for a managed block between # BEGIN RankReady and # END RankReady. Everything outside those markers belongs to WordPress or another plugin and RankReady leaves it alone.
Inside the block you should see your choices for the 29 named AI crawlers and your Content Signals directives: ai-train, search and ai-input.
You will also see a mirrored group for Googlebot and Facebook’s link crawler that repeats your existing User-agent: * rules. That is expected. It exists so scanners can see those agents named explicitly. It does not change their permissions.
Check 3: Content negotiation on the canonical URL
This is the part a browser cannot show you, so use curl.
curl -sI -H "Accept: text/markdown" https://yoursite.com/your-post/
curl -sI -H "Accept: text/html" https://yoursite.com/your-post/
curl -sI -H "Accept: application/x-nonsense" https://yoursite.com/your-post/
Expected results on the canonical post URL:
Accept: text/markdownreturns Markdown.Accept: text/htmlreturns HTML.- An unsupported type returns 406.
Now test the distinct Markdown URL:
curl -sI -H "Accept: text/html" https://yoursite.com/your-post.md
This still returns Markdown. That is deliberate. Distinct .md URLs always serve Markdown regardless of the Accept header, because a URL whose body changes with a header is unsafe to cache. If you were expecting HTML back, the plugin is behaving correctly and your expectation was wrong.
Check 4: ETag and 304
/llms.txt and /okf/ support ETag. Fetch the ETag, then send it back:
curl -sI https://yoursite.com/llms.txt | grep -i etag
curl -sI -H 'If-None-Match: "PASTE_THE_ETAG_HERE"' https://yoursite.com/llms.txt
The second request should return 304 Not Modified with no body. If it returns 200 every time, a proxy or caching layer in front of your site is probably stripping the header.
Check 5: Insights shows real crawler activity
Open RankReady, Insights (tab=insights). This is where AI crawler hits and AI referrals are logged. It works with no API key.

Read this screen carefully. A crawler hit proves your page was fetched. It does not prove it was quoted, cited, or used in any answer. If the log is empty shortly after install, that is normal. Crawlers arrive on their own schedule.
When an endpoint returns 404
The usual cause is stale rewrite rules. Go to Settings, Permalinks and click Save Changes without changing anything. That regenerates the rules.
Some stacks intercept rewrites before RankReady sees them, LiteSpeed running with Rank Math being one reported combination. Version 1.3.0 added a raw request-path fallback for exactly this, so 404s from that cause are much less common than they were. Re-saving Permalinks still resolves any stale rules left over from an older version.
Also worth knowing: in earlier versions, turning a feature off could leave a raw 404 behind. Version 1.3.0 clears the stale rules when you toggle a feature off.
When /.well-known/mcp.json returns 403
This one is almost always the server, not the plugin. Nginx blocks dotfile paths by default, so /.well-known/ returns 403 before the request ever reaches PHP. No plugin can override that.
The fix is in the nginx site config:
location ^~ /.well-known/ {
allow all;
default_type text/plain;
try_files $uri $uri/ /index.php?$args;
}
Send that to your host if you cannot edit nginx yourself. Every other RankReady endpoint is unaffected by this. A 403 here does not mean your install is broken.
Check 6: Schema on a post
View source on a post that has a generated summary and look for JSON-LD. You should find Article, and FAQPage if you generated FAQs.
If Article is missing, check the summary first. Article schema requires a generated AI summary on that post. It builds its description from the summary and returns early when there is none, so a post with schema on but no summary emits no Article JSON-LD.
If Yoast, Rank Math, AIOSEO or SEOPress is active, RankReady merges into their graph rather than emitting a second block. Exactly one Article entry on the page is the correct result.
Quick pass list
/llms.txtreturns 200./robots.txtcontains the RankReady block.- A post
.mdURL returns Markdown with frontmatter. - Canonical URL returns 406 for an unsupported Accept type.
/llms.txtreturns 304 on a matchingIf-None-Match.- A post with a summary emits exactly one Article JSON-LD.