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:
/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./llms.txt and the public read-only endpoint are enabled; the heavier /llms-full.txt export and WebMCP bridge are opt-in.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.16.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.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 and an inline registration script. Generated metadata may use bounded WordPress transients for anonymous, cookie-free requests. 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.
Yes. Uncheck "Show Credit" in Settings > Corsen Context. However, the credit helps grow the open-source ecosystem and we appreciate keeping it enabled.
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