An MCP connection can change your website, so LIYANS MCP treats every call as untrusted until it has passed identity, scope and capability checks — and it makes the safe outcome the default outcome everywhere else, too.
Token secrets are shown exactly once at creation and stored only as hashes. Tokens are scoped, can carry an expiry, and can be revoked instantly from wp-admin. An invalid token fails hard — there is no fallback to browser session cookies, and session cookies do not authenticate the endpoint unless an administrator explicitly turns that setting on.
Off by default, switched on by the site owner. Authorisation codes are single-use, expire after 10 minutes, are stored only as SHA-256 hashes and are bound to the client, redirect URI, scopes, consenting user and a PKCE S256 challenge. Refresh tokens rotate; re-presenting a retired refresh token — or re-using a code — revokes the whole grant. RFC 7009 revocation covers access and refresh tokens, and revoking a client cascades to its grants. Clients may be public or confidential: a confidential client receives a secret exactly once (only its hash is stored) and must authenticate before any exchange, so failed attempts never consume a code. Authorisation responses carry the RFC 9207 iss parameter, and the token endpoint validates the RFC 8707 resource indicator.
A token’s power is the intersection of its eight possible scopes (read, write, publish, media, commerce, seo, devices, settings) and the live WordPress capabilities of the account that owns it. Consequences you can rely on:
insufficient_scope.not_found for unpublished content, including from verification tools.New and rebuilt content is a draft by default. A post_status smuggled into tool arguments is stripped — publishing only happens through the plugin’s explicit, scope-gated paths.
The page-removal tool moves content to the WordPress Trash. The plugin contains no permanent-delete path for your content, and its uninstaller removes only the plugin’s own options and tables.
Layout rebuilds and element edits snapshot the previous state first. Restore is byte-identical, verified against real installs.
Every call is logged locally — tool, caller, outcome — with configurable retention and CSV export hardened against spreadsheet formula injection. Argument payloads are logged only if you enable content logging.
27 named errors with safe details. Internal exception messages are logged, never returned, so responses cannot leak internals.
Settings writes pass a strict allowlist; device overrides accept exactly three keys; image import uses WordPress’ safe remote fetch (loopback and private targets refused), an image MIME allowlist and a 10 MB cap.
No telemetry. No tracking pixels. No remote fonts or CDN assets. No licence or usage phone-home — there is no vendor server in the design at all. The only outbound requests the plugin makes are the ones your own work requires: fetching your own site’s published pages during a render check, and downloading an image when you explicitly invoke the import tool with its URL.