get_product (live price, stock, images and variants via WooCommerce, plus an agentPurchase policy the agent must respect), get_sections (a page outline plus one bounded section per call), get_structured_data (typed JSON-LD blocks), check_agent_access (reads the result of the owner's latest agent-access self-test) and request_expert_call (a human-only expert intake, annotated readOnlyHint:false and refused server-side for AI callers with error code human_only). 1.5.0 also registers the enabled tools through the experimental WebMCP browser API when the site owner opts in and the browser exposes that API, and through the WordPress Abilities API on WordPress 6.9 or newer.
What it does
The plugin provides three separate surfaces, with one implementation behind all of them:
/llms.txt with a structured overview of selected public content. An optional, bounded /llms-full.txt export can be enabled in settings.document.modelContext, including explicit per-tool annotations. Serving the bridge does not enable WebMCP in every browser: a compatible browser/client and, where applicable, current trial enrollment or a development flag are also required.document.modelContext) through which a page offers tools to an AI agent running in the browser: Chrome with WebMCP enabled, or an agent client with built-in support such as ChatGPT's in-app browser. With Corsen Context, your WordPress site offers in the page the same read-only tools it already serves over MCP: search_site, get_page_content, list_content, get_sitemap, plus any extension tool you enable.
readOnlyHint and untrustedContentHint annotations, and the human-only expert tool is marked consequentialHint so a browser agent asks before calling it; the bridge stays same-origin, sends no cookies, visitor credentials or API key, and refuses to register inside frames. Tool errors reach the agent as structured results (error_code, message, handoff URL) rather than a bare exception.chrome://flags/#enable-webmcp-testing, the Chrome origin trial that runs from Chrome 149 to 156, or an agent client with built-in support); check typeof document.modelContext === 'object' in DevTools; then ask the agent to search the site and read one page. WebMCP is experimental and browser support changes; the browser setup guide tracks the current paths.
Key Features
/llms.txt, a read-only MCP endpoint, and opt-in WebMCP in-page tools expose the same owner-selected content; the heavier /llms-full.txt export and the WebMCP bridge are opt-in.document.modelContext with per-tool annotations, same-origin and credential-free; optional origin-trial token setting.initialize, ping, tools/list, tools/call, resources/list, resources/read, and notifications/initialized. The endpoint returns JSON responses and does not provide server-sent event streaming.search_site, get_page_content, list_content, get_sitemap; every other surface tool is an opt-in extension, off by default.MCP: line containing the canonical endpoint URL generated by WordPress<link rel="mcp"> link element added automatically/llms.txt remains available to clients that know the convention/llms.txt path to WordPress. Pretty permalinks are recommended for this static path. The MCP REST endpoint itself uses WordPress's canonical URL and can use the ?rest_route=/corsen-context/v1/mcp form with Plain permalinks.packages/wordpress-plugin/corsen-context in the public repository at tag v1.5.18.corsen-context folder with corsen-context.php, includes/, uninstall.php, and readme.txt; do not upload the monorepo ZIP./llms.txt — Visit https://yoursite.com/llms.txt to see it/llms-full.txt is not enabled by default. WebMCP is also opt-in and requires a compatible browser/client in addition to the WordPress setting.
Important: Do not construct the MCP endpoint by appending /wp-json/. WordPress commonly returns https://yoursite.com/wp-json/corsen-context/v1/mcp, but Plain permalinks can return https://yoursite.com/?rest_route=/corsen-context/v1/mcp, and a site can filter the REST prefix. Use the URL displayed by the plugin or published in robots.txt, the HTML <link rel="mcp">, or the generated /llms.txt when MCP is enabled. If the separate /llms.txt path is unavailable, review the site's rewrite and permalink configuration.MCP (Model Context Protocol) lets an AI client outside the page call your site's tools over HTTP. WebMCP is the browser-side counterpart: the page registers tools with document.modelContext, and an agent running inside the browser calls them. Corsen Context serves the same read-only tools on both; WebMCP adds no write access and no new data.
Model Context Protocol is an open protocol for communication between AI applications and external systems. Corsen Context targets the 2025-11-25 protocol version for its read-only JSON-RPC endpoint.
A proposed convention where websites place a /llms.txt file containing a structured Markdown overview. Support varies by client and search engine, so it should be treated as an additional publishing surface rather than an indexing guarantee.
The plugin limits output to selected public post types and rejects draft, pending, private, password-protected, trashed, or excluded content. Site owners can also veto individual posts with the corsen_context_can_expose_post filter. As with any public export, review the selected post types and exclusions before enabling it on a site with membership or conditional-visibility plugins.
When MCP is enabled, normal pages receive a small discovery link. When WebMCP is also enabled, the plugin emits an origin-trial meta tag if configured, a short inline configuration with the tool definitions, and one deferred script file that browsers cache. Generated metadata may use bounded WordPress transients for anonymous requests that carry no WordPress session cookie (consent, analytics or CDN cookies do not disable that cache). Rendered page content is not placed in the shared MCP cache, and /llms-full.txt uses item, byte, and generation-lock limits. Measure representative pages on your own hosting rather than assuming zero impact.
By default, Corsen Context reads stored public content without executing the_content, dynamic blocks, or shortcodes. This avoids accidentally exporting personalized output. Site owners can opt into full rendering with the corsen_context_render_mode filter; full-rendered output is never stored in the shared content cache. Compatibility depends on the page builder and should be tested on the site.
Yes. In Settings > Corsen Context you can:
The standard public product post type can be selected. The plugin exports its stored public content under the same rendering and exclusion rules as other post types. Themes, product add-ons, memberships, prices, variations, and dynamic shortcodes can change what a visitor sees, so test the required WooCommerce fields and visibility rules on the target site before claiming compatibility. When you enable it, the get_product extension tool additionally serves live price, sale, stock, image, and (for variable products) variant data through WooCommerce APIs; it requires WooCommerce to be active and the product post type to be selected.
You can set an API key by defining CORSEN_CONTEXT_API_KEY in your wp-config.php:
define('CORSEN_CONTEXT_API_KEY', 'your-secret-key-here');
Server-side requests must then include X-MCP-Key: your-secret-key-here or Authorization: Bearer your-secret-key-here.
The supplied WebMCP bridge intentionally sends no key, cookies, or visitor credentials. Do not embed the key in page source. Use either a public, read-only, rate-limited endpoint for WebMCP or a key-protected endpoint for configured server-side MCP clients with WebMCP disabled.
Enable WebMCP in Settings > Corsen Context, then use a browser and agent/client that implement the experimental API. Serving the registration script alone is not enough. For local Chrome testing, follow the current documented flag. For a public trial, enroll the exact HTTPS origin and use its current, unexpired token. See the browser setup and verification guide.
An origin-trial token is delivered to browsers and is not an MCP credential. Successful registration also does not prove the endpoint or content policy: execute search_site, pass one result to get_page_content, and inspect the grounded answer.
Not unless you ask for it. The "Powered by Corsen Context" line is off by default and only appears in /llms.txt and /llms-full.txt after you check "Show Credit" in Settings > Corsen Context. Installs that still had the earlier default are switched off once by this update; the checkbox turns it back on.
/llms.txt and /llms-full.txt is now opt-in and off by default, and the X-Powered-By header is gone from plugin responses (plugin directory guideline 10). Existing installs are switched off once; the "Show Credit" checkbox turns the line back on.OperationError; the human-only expert tool carries consequentialHint: true; every tool has a title; the settings page and the Control Center say that WebMCP needs HTTPS and name the Chrome 149 to 156 origin trial.tools/list uses the MCP annotation vocabulary and advertises outputSchema; tool errors carry the extension's extra fields in structuredContent; the OPTIONS preflight is only answered while MCP is enabled.llms.txt reads naturally (no more escaped periods, hyphens or parentheses) and follows the llmstxt.org layout.corsen_context_shared_cache_safe filter); the list, search and sitemap queries are lighter; the settings upgrade check no longer runs on every request.mcp, webmcp, abilities) and the error code of every call, with per-transport and per-tool totals in the Control Center; any tool can be hidden from in-page agents while staying on MCP; an optional corsen_context_webmcp_output_budget filter bounds in-page page results./llms.txt and /llms-full.txt rewrite rules are registered only while the corresponding surface is enabled, stale rules are dropped from the generated rule set, and the rules are refreshed when the setting changes. A disabled /llms.txt previously kept owning the route and could answer 404 in place of another plugin's llms.txt. Reported with a fix by suhakaralar (#10, #11).llms.txt, MCP endpoint, in-page WebMCP tools) with setup and verification steps; tags updated.agentPurchase is allowed, an agent acting for its user may complete the store's ordinary checkout, including creating the customer account it requires; everything outside those explicit per-product permissions stays human-only, and the agent is told to stop and report the page URL to its user. The same sentence is rendered in llms.txt, the [corsen_agent_policy] page, the machine-readable policy JSON, the get_product description, and the default per-product reason.pre_handle_404, inside WP::main() and before the wp action, instead of on template_redirect. The previous hook returned the right status but SEO plugins and wp_get_document_title() had already resolved the author, so the 404 page's <title> and Open Graph tags still printed the author's nicename and archive URL. The queried user is also dropped from the main query, and the integration test now asserts the document title, is_author(), and the queried object.get_structured_data now uses WordPress's safe HTTP transport, refuses redirects, and caps the loopback response while downloading it. Stored markup is capped before parsing, JSON-LD clips stay valid UTF-8, multi-type entities are counted correctly, duplicate blocks no longer create a false truncation flag, and every returned block now stays within the documented byte budget.search_site declares rank, sitemap fields reflect its actual payload, nullable product values are explicit, and the section and structured-data schemas include their real optional fields.top entry and ignore heading-like lines inside fenced code. The expert handoff requires an owner-configured same-origin form URL, and uninstall/purge removes the complete private expert inbox (including trashed requests), agent-access snapshot, lock, and product policy metadata.auth_callback no longer calls edit_post_meta (which re-entered itself for registered protected meta) and checks edit_post instead, as Core documents. The agent head banner renders only when the MCP channel is actually enabled — a disabled channel is never advertised. Long owner reasons are truncated without requiring mbstring. llms.txt opens with "START HERE for AI agents" and its policy block now distinguishes the server-enforced expert handoff (human_only) from the per-product agentPurchase contract instruction; the plugin exposes no purchase tool and never intercepts human checkout. The human-only form notice is generated from the same table ([corsen_human_only_notice]), so the form copy is the wire copy.llms.txt, an HTML head banner for parsers, and the [corsen_agent_policy] page. request_expert_call becomes human-only by policy: it stays advertised so an agent can read the rule, but every schema-valid invocation is refused with error code human_only plus a handoff URL before any throttle or storage side effect. get_product output carries agentPurchase (allowed|forbidden) and agentPurchaseReason from owner-set product meta, and the tool description states that a forbidden product must be handed to a human, never checked out by the agent. OPTIONS preflight matching also tolerates rest_route and atypical permalink prefixes.tools/list now emits WebMCP annotations (readOnlyHint per tool; request_expert_call is explicitly readOnlyHint: false) on the MCP transport, so SECURITY.md's claim is backed on the wire and not only in the in-page bridge. get_sections documents "top" and now always lists and resolves it, even as a zero-byte intro. When "Hide user enumeration" is on, /?author=N and /author/{login} archives also answer 404 to anonymous visitors instead of leaking logins through the classic doors. The MCP route's OPTIONS preflight is answered by the plugin (POST, OPTIONS, no credentials) instead of core advertising every verb.get_product(slug) integrity: slug lookups verify the stored post_name and apply the same owner exposure policy as URL lookups. A stale or excluded slug now returns not-found instead of silently serving a different product (found by external live audit).get_sections outline integrity: outline entries are an index (id, level, heading, bytes) and no longer embed each section's markdown, which had made the "cheap" outline larger than get_page_content of the same page. Section ids are collision-free even against literal -N suffixes, and byte-budget chunks never split a UTF-8 codepoint.hide_user_enumeration and credit explicitly (they were silently switched off by every Control Center save), and a deliberately empty content-type selection persists as "expose nothing" instead of silently reverting to post,page.Allow header: the 405 GET answer now advertises POST only. WordPress Core was overwriting it with the route's registered methods (POST, GET, OPTIONS); a rest_post_dispatch filter at priority 20 now wins after core's own filter.Content-Type: application/json, Accept, MCP-Protocol-Version) so the endpoint answers 200 instead of 415; a test asserts the probe's own headers so the fix cannot silently vanish again.check_agent_access routing fix: the MCP server's tool-call switch now dispatches the tool (it was advertised by tools/list but returned "Tool not found" on call); a server-level regression test covers end-to-end routing for the tool.get_sections and get_structured_data had no card, so saving the Control Center form dropped them from the enabled set - a real owner-footgun, now covered by a regression test that fails if any tool lacks its card.check_agent_access: agents read the owner's latest same-site loopback result using representative ClaudeBot, ChatGPT-User and GPTBot User-Agent strings. A pass requires the expected llms.txt marker or a valid MCP tools/list response. It is a read-only snapshot with zero arguments and never triggers egress itself.get_product extension tool — live price, sale, stock status/quantity, images, categories and up to 20 variants via WooCommerce APIs, behind the site's post-type policy and publish/password checks. Off by default; not part of the cross-runtime manifest contract.request_expert_call accepted private owner-side submissions. Since 1.5.12, MCP and WebMCP execution is human-only and every schema-valid call is refused with human_only plus a handoff URL before any side effect.the_content, dynamic blocks, or shortcodes by default; full rendering is explicit opt-in and never shared-cacheable./llms.txt and /llms-full.txt free of canonical trailing-slash redirects and refreshes rewrite rules once per plugin version.initialize, ping, notifications/initialized supporttools/list, tools/call, resources/list, resources/read<link rel="mcp"> link element in HTML head