=== MCP Abilities - Polylang ===
Contributors: basicus
Tags: polylang, multilingual, mcp, abilities api, translation
Requires at least: 6.9
Tested up to: 7.0
Requires PHP: 8.0
Stable tag: 0.1.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Comprehensive, fail-closed Polylang language, inventory, coverage, and Translation Set management through authenticated MCP abilities.

== Description ==

MCP Abilities - Polylang keeps Polylang authoritative for languages and translation relationships while exposing a deep authenticated ability surface for multilingual maintenance.

The plugin covers configured languages, managed post types and taxonomies, localized home/front/blog identities, stable-cursor post and term inventories, Translation Set planning and inspection, translation lookup, registered-string lookup, coverage and graph-integrity audits, and explicit post/term relationship mutations.

Relationship mutations default to dry-run, require site-administrator capability, compare exact expected state, refuse to drop existing siblings, require an exact confirmation value, and read back the result. A failed Translation Set verification attempts to restore the prior sets.

The plugin also shares Polylang translation siblings with MCP Abilities - Elementor so guarded Elementor writes can protect every linked language version.

== Requirements ==

* WordPress 6.9 or newer with the Abilities API available
* Polylang or Polylang Pro
* MCP Adapter and MCP Expose Abilities for MCP access

== Abilities ==

= Language Registry =

* `polylang/get-status`
* `polylang/list-languages`
* `polylang/list-translatable-types`
* `polylang/get-site-presentation`

= Translation Graph reads =

* `polylang/list-posts`
* `polylang/get-post-translation-set`
* `polylang/plan-post-translation`
* `polylang/list-terms`
* `polylang/get-term-translation-set`
* `polylang/plan-term-translation`
* `polylang/resolve-translation`
* `polylang/translate-registered-string`

= Coverage and integrity =

* `polylang/audit-post-translation-coverage`
* `polylang/audit-term-translation-coverage`
* `polylang/audit-translation-graph`

= Translation Graph writes =

* `polylang/set-post-language`
* `polylang/save-post-translations`
* `polylang/set-term-language`
* `polylang/save-term-translations`

== Safety and ownership ==

* Every ability requires authenticated editorial access; graph writes require `manage_options` as well as per-object or per-taxonomy permission.
* Language assignment compares the exact expected language and Translation Set and refuses to change the language of an already linked object.
* Translation Set merging compares every expected set and refuses to omit existing siblings.
* Every mutation defaults to dry-run and requires the ability name as its exact confirmation value.
* Applied relationships are read back and verified; failed set verification attempts compensation.
* Inventories and audits use stable ID cursors and explicitly do not claim whole-site exhaustion from one bounded page.
* A source-modified-after-target result is advisory, not proof that translated content is stale.
* Language/settings administration, string editing, unlink/replace, menu mutation, route migration, SEO writes, and content copying are intentionally outside this plugin's ownership.

== Changelog ==

= 0.1.0 =
* Initial public release with 19 abilities across Language Registry, Translation Graph, stable inventory, coverage/integrity, registered-string lookup, post/term mutations, and Elementor sibling protection.
