All abilities are read-only and are called with GET, passing input as input[...] query parameters: seoryco-wpmd/list-posts — posts modified after a given time (modified_after, e.g. 2026-09-01T00:00:00Z), oldest change first seoryco-wpmd/list-post-ids — every post ID with its status and modified time, including trashed items, in ID order, for detecting deletions seoryco-wpmd/get-post-markdown — one post as Markdown with front matter, the same format as a file in the ZIP export (with mode=rendered, embeds are not fetched and stay as plain URLs; mode=raw requires permission to edit the post) seoryco-wpmd/list-external-links — links to other domains with anchor text, rel, target, and surrounding text. At most 200 links are listed per post (truncated), and only the first 1 MB of each post's rendered HTML is scanned (content_truncated, content_truncated_post_ids; developers can change the size with the seoryco_wpmd_links_max_html_bytes filter) The list abilities are paged with cursors: pass next_cursor (list-posts, list-external-links) or next_after_id (list-post-ids) from one response as cursor / after_id in the next request, with the other input unchanged, until it is null. Posts edited or deleted while you page through do not cause others to be skipped. "Modified time" is the effective modified time: post_modified_gmt, or, when that is 0000-00-00 00:00:00 (drafts inserted directly by some importers), post_modified converted to GMT with the site's current UTC offset. Known limitation: if the site's time zone switches between daylight saving and standard time while you page through list-posts or list-external-links, such posts can move by an hour and be missed in that run. A periodic full comparison with list-post-ids (for example monthly) picks them up. Permissions are checked at two levels: Per request: requests limited to published posts need only a logged-in user (the read capability). Requests that include drafts, pending, scheduled, private, or trashed posts require edit_others_posts (Editors and Administrators by default). list-post-ids always requires edit_others_posts. Developers can change this request-level capability with the seoryco_wpmd_ability_permission filter. Per post: only publicly viewable post types are served, and a post is included only if the user can read it (read_post, for published and private posts) or edit it (edit_post, for drafts, pending, scheduled, and trashed posts). Post types with their own capabilities are checked with those capabilities. The filter above cannot widen this. Raw content: get-post-markdown with mode=raw also requires permission to edit the post (edit_post), like content.raw in the standard REST API. Raw content skips the the_content filters, which membership and other content-restriction plugins often use to hide content. Users who cannot edit the post use mode=rendered, where those restrictions apply. Password-protected posts are never returned as Markdown or scanned for links.