Fabrement
Server Details
Your AI agent builds native Gutenberg blocks, pages and templates on your WordPress design system.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 97 tools
Each tool targets a distinct resource+action and the descriptions actively cross-reference potential confusions (e.g. list-archives vs list-archive-pages vs list-archive-records, get-fields vs list-post-type-fields vs get-field-values, save-content vs save-synced-pattern). The boundaries are genuinely subtle in the archive/fields/template clusters, but the explicit 'not to be confused with' guidance keeps selection mostly unambiguous.
Names follow a strict fabrement-<verb>_<noun> snake_case pattern throughout (create-/get-/save-/delete-/list-/update-/set-/assign-/import-/upload-). Verb semantics are even differentiated deliberately (save = idempotent upsert vs create/update). No mixing of conventions.
97 tools is far beyond the 50+ extreme-mismatch threshold and well past what an agent can navigate reliably, even if each tool is non-redundant. The surface would be far more usable split across multiple scoped servers (content, SEO, design, assets).
Near-total CRUD/lifecycle coverage across every declared domain: blocks, content, templates, synced patterns, post types, taxonomies, terms, fields, options pages, menus, icons, media, forms, SEO and design system all have create/read/update/delete. Reads are paired with writes and even includes verification (preview) and rollback, leaving no obvious dead ends.
Available Tools
97 toolsfabrement-assign-template-archiveAssign template to archiveAInspect
Bind a site template to an archive view (context from list-archives: "archive:" | "blog-home" | "tax" | "tax:" | "tax::"); templateId 0 unbinds. The template's contentSource wants a rule for the same context (save-archive-page + save-template); without one the slot shows the archive record's own blocks, and is empty only where no record exists (a term, author, date view). Rules: get-skill-doc {id:"template-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | "archive:<postType>", "blog-home", "tax", "tax:<taxonomy>" or "tax:<taxonomy>:<termId>" (see list-archives). A single term is named by its ID and nothing else — a slug is renamed, and a binding keyed on one stops matching with nothing to say so. Ids come from list-terms or list-archives. | |
| templateId | Yes | Template id to bind; 0 unbinds. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| note | No | Present when the call changed nothing — an unbind of a view that was not bound. |
| bound | Yes | |
| context | Yes | |
| templateId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it does disclose real side-effect behavior: templateId 0 unbinds, and without a matching rule the slot falls back to the archive record's own blocks and is empty only where no record exists. It omits permissions/auth and reversibility, but the fallback semantics are genuinely useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then the context enumeration, then the fallback and rules. It is dense and the parenthetical is heavy, but each clause carries operational information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. For a two-param binding tool the description covers the format, the unbind convention, the fallback behavior, and the prerequisite doc; only permission/error behavior is left unstated, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already fully documented in the schema, including the 0-unbind convention and the context format. The description mostly restates those values; its only added value is pointing at list-archives as the source of the context value. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Bind a site template to an archive view.' This is clearly separable from the sibling fabrement-assign-template-pages (archive views vs. pages), so an agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use context: the template's contentSource 'wants a rule for the same context (save-archive-page + save-template)', and explicitly directs reading the template-contract skill doc before the first call. It does not, however, explicitly contrast with the sibling assign-template-pages, so the alternative is only implicitly distinguished.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-assign-template-pagesAssign template pagesAInspect
Give records this template, or take it away. mode is required. add / remove touch only the ids you pass; replace makes pageIds the exact set and releases every other record that had it — use it when you know the whole set, and list-template-pages first. Works on a record of any public type, not just the ones that take a template by default. For a whole-type frame use set-default-template instead.
Rules: get-skill-doc {id:"template-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | Required — there is no default. replace: the set becomes exactly pageIds, and every other record picking this template is released — send it only when you know the whole set. add: these records take the template, everything else is left alone. remove: these records release it, everything else is left alone. | |
| pageIds | Yes | The ids this call is about. With mode replace this is the FULL set and anything missing from it loses the template; with add or remove it is only the records to change. | |
| templateId | Yes | Template id from list-templates. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | The mode this call ran in. |
| note | No | Present with tookFrom: what each record left, and how to put it back when that is possible. |
| cleared | Yes | Records released from THIS template. One that changed hands to another template is in `tookFrom`, not here. It counts records INCLUDING any in the trash, which `pageCount` never counts — so clearing a binned pick moves this and leaves `pageCount` where it was. |
| assigned | Yes | Records this call WROTE the template to. One that already carried it is not counted again. |
| tookFrom | No | Records that were carrying a DIFFERENT template and now carry this one. Absent when none did. |
| pageCount | Yes | How many records carry this template AFTER the call — the whole set, not just what this call wrote, so it is normally the larger of the two. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the key behavioral trait: replace is destructive — it 'releases every other record that had it'. It also notes the tool works on any public type, not just template-default ones. It stops short of stating permission requirements or rate limits, but the destructive semantics are clearly surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the required-mode constraint, then the destructive replace warning, then scope and alternatives. Dense but every clause carries information; the trailing Rules line is a useful prerequisite rather than filler. Slightly heavy for its size but well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, high-stakes mutation tool with no annotations, the description covers purpose, destructive behavior of replace, scope, prerequisites, and the relevant siblings. An output schema exists, so return values need no explanation. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters, including the mode enum and the pageIds interpretation. The description reinforces the mode semantics but adds little beyond what the structured fields already say, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (assign/give/take away a template) acting on records, and immediately routes the agent to siblings by naming list-template-pages and set-default-template. An agent can distinguish this from set-default-template and list-template-pages without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use for replace ('use it when you know the whole set'), distinguishes add/remove vs replace, and names the alternative for the whole-type case ('use set-default-template instead'). It also states prerequisites: list-template-pages first and read the template-contract skill doc before the first call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-create-blockCreate blockAInspect
Create an EMPTY block record and get its ids; it renders nothing until submit-version. SEARCH FIRST, THEN DECIDE: list-blocks {search}. A block close to the ask is a question, not an answer — reusing it changes every page already placing it, a new one does not. Ask the person when it is ambiguous. A name already taken is refused and the answer names the block holding it. Say the TITLE when you report back, never the id — "Hero Split Dark", not "block 9321". Title: must start with an ASCII letter; letters, digits, spaces and hyphens. type "header"/"footer" makes a site-template part; "default" a content section. Rules: get-skill-doc {id:"block-contract"} for a content block; a header follows {id:"header-contract"}, a footer {id:"footer-contract"} — read the one for the block's type before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Block kind: "default" (content block, the default), "header" or "footer" (site-template parts). | |
| title | Yes | Human title (e.g. "Hero Split Dark"). It is slugified, and the SLUG is what is checked: it must start with an ASCII letter and hold only lowercase letters, digits and hyphens. So spaces and hyphens are fine, a leading digit is not, and a non-ASCII title has nothing to slugify to. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | WordPress block id — the blockId every other TOOL expects. Plumbing: never name a block by it when writing to a person. |
| type | Yes | |
| uuid | Yes | |
| title | Yes | What this block IS CALLED. Use it whenever you mention the block to a human. |
| kebabName | Yes | Slug half of the registered name ("fabrement/<kebabName>") — for markup, not for prose. |
| pascalName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses that the created record is empty, that it renders nothing until submit-version, that a taken name is refused with the holding block named in the response, and that title/slug validation applies. It also prescribes the reporting format (title, not id). This is unusually rich behavioral context for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries real information and the most critical constraint (empty record, search first) is front-loaded. However the density, non-standard '{search}' placeholder notation and heavy dash usage make it harder to parse than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and the description still covers creation semantics, collision behavior, validation, prerequisite contract docs, and reporting format. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters already carry detailed descriptions including the slugify rules and enum meanings, so the description is largely restating what the schema provides ('type "header"/"footer" makes a site-template part'). It adds no syntax or format detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create an EMPTY block record and get its ids') and immediately clarifies scope: the record renders nothing until submit-version. It distinguishes the tool from siblings like list-blocks and submit-version by naming them, so an agent can tell Create from List from Submit without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'SEARCH FIRST, THEN DECIDE: list-blocks {search}', plus a nuanced rule for when a similar existing block is a 'question, not an answer'. It names the alternative (reuse vs. new), states when to defer to the person ('Ask the person when it is ambiguous'), and lists prerequisites (read the matching skill doc before the first call).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-create-cf7-formCreate Contact Form 7 formAInspect
Create a Contact Form 7 form (CF7 must be active). YOU WRITE THE MARKUP: template is the CF7 form body — your HTML plus CF7 [tags] — so the layout is whatever the design asks for, not a column of generated paragraphs. The mail body, Reply-To and attachments are derived from the tags in it. Returns { form: { id, title, shortcode, fields } } — the id is the default of the form attribute of a block (FormField). LIST-FORMS FIRST: a duplicate title is NOT refused, so calling this twice leaves two forms with the same name and no way to tell which one a page renders. Reuse the existing form, or update it with update-cf7-form.
Rules: get-skill-doc {id:"forms-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Form title (admin label). | |
| subject | No | Notification email subject line. | |
| messages | No | CF7 "Messages" tab as {key: text} — mail_sent_ok, validation_error, invalid_required, invalid_email, … (get-cf7-form lists every key with its current text and default). Only the keys sent change; "" resets one to the default; unknown keys are refused. | |
| template | Yes | CF7 form markup — the layout is yours to write, tags included. One control per CF7 tag: [text* your-name], [email* your-email], [tel your-phone], [textarea your-message], [select your-topic "Sales" "Support"], [acceptance your-consent], [file your-cv filetypes:pdf|doc], and [submit "Send"] for the button — a trailing * means required. Everything around them is your HTML: rows, fieldsets, hints, a consent line with a link. Wrap each control in its own element and give it classes, because the CSS is written against YOUR wrappers (CF7 adds its own classes to the control itself at render time). WHAT IS DERIVED FROM THIS MARKUP: the notification mail body (one line per control), the Reply-To (the first REQUIRED email tag — an optional one is skipped, CF7 rejects a possibly-blank mailbox), and the file attachments (every file tag). A control named after a WordPress query var (name, search, author, page, day, order, term, …) is REFUSED, not renamed: prefix it the way CF7 does, your-name. At most 40 controls. | |
| recipient | No | Email address the submissions are sent to (default: site admin). |
Output Schema
| Name | Required | Description |
|---|---|---|
| form | Yes | |
| note | No | Present when another form already carries this title. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does so: it discloses the return shape, that duplicates are silently accepted, what is derived from the markup (mail body, Reply-To from the first required email tag, attachments), what is refused (query-var control names, unknown message keys), and a hard 40-control limit. These are non-obvious behaviors an agent cannot infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and mostly purposeful, but the highest-stakes warning (duplicate titles are not refused) is buried after a lengthy markup lecture, and the markup/derivation explanation substantially repeats what the schema's `template` property already says. Front-loading the duplicate warning would let the reader act on it before skimming.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Strong coverage for a mutation tool with no annotations and an output schema: prereqs, side effects, refusals, limits, and the follow-up call are all present. It stops short of stating permission/capability requirements or what failure looks like when CF7 is inactive, which an agent may still need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns a 4 by adding semantics the schema doesn't give — the returned form id is the default of a block's `form` attribute, and the markup drives derived mail/Reply-To/attachment behavior. It loses a point because much of the `template` guidance mirrors the schema's own long template description rather than adding to it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a Contact Form 7 form') plus the enabling precondition ('CF7 must be active'), and immediately distinguishes itself from update-cf7-form. An agent knows exactly what this does and which sibling handles the other case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use and when-not-to: 'LIST-FORMS FIRST' with the concrete consequence spelled out (duplicate titles are not refused, leaving two identical forms), and it names both alternatives — reuse the existing one or call update-cf7-form. It also gates first use on get-skill-doc {id:"forms-contract"}.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-create-design-systemCreate design systemAInspect
Create a NEW design system in the project and select it for this site — only when get-design-system reports hasDesignSystem:false; then fill it with save-design-system. Never to "start fresh" beside an existing one. Rules: get-skill-doc {id:"design-system-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human label shown in the design-system picker. | |
| copyCurrentTokens | No | Seed it with the tokens this site currently renders with (default false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| seeded | No | True when it was created holding the site's current tokens. |
| selected | Yes | True once this site paints with it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses a side effect (it selects the new design system for this site), a gating precondition, and a mandatory prerequisite read (get-skill-doc "design-system-contract" before the first call). It stops short of describing failure/conflict behavior or permissions, keeping it just below the top.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the precondition, follow-up tool, and exclusion in rapid order; every sentence carries routing or gating information. Slightly dense with em-dashes, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a creation tool with an output schema (so return values need no explanation), the description supplies the precondition, the mutation side effect, the follow-up tool, and the required contract doc. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both name and copyCurrentTokens are already documented in the schema; baseline is 3. The description adds workflow context but no additional meaning about the parameters themselves, so it does not exceed the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Create a NEW design system in the project") with the emphasized scope that it is a new/only-one entity. It also distinguishes itself from the get-design-system and save-design-system siblings, so an agent can place it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition (only when get-design-system reports hasDesignSystem:false), names the follow-up tool (then fill it with save-design-system), and states a hard exclusion ("Never to 'start fresh' beside an existing one"). When-to-use and when-not-to-use are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-create-post-typeCreate post typeAInspect
Register a NEW custom post type (Book, Project, Event…) — stored by Fabrement, re-registered on every request, no third-party plugin. list-post-types first. A public type with hasArchive gets an archive URL to dress with save-archive-page + assign-template-archive. Rules: get-skill-doc {id:"content-model-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Post-type key: 1-20 chars, lowercase, a-z 0-9 _ -, unique and not reserved. | |
| plural | No | Plural label (default: singular + "s"). | |
| public | No | Visible on the front end (default true). | |
| rewrite | No | URL base (default: slug). | |
| menuIcon | No | A dashicons-* class, e.g. "dashicons-book". | |
| singular | Yes | Singular label, e.g. "Book". | |
| supports | No | Editor features to enable. | |
| hasArchive | No | Gets an archive URL (default true). | |
| showInRest | No | Enable the block editor + REST (default true). | |
| taxonomies | No | Existing taxonomy slugs to attach (e.g. "category", "post_tag"). | |
| hierarchical | No | true = page-like: records nest under a parent (save-content `parent`, addresses /type/parent/child/); false = post-like (default). | |
| menuPosition | No | Admin menu position. |
Output Schema
| Name | Required | Description |
|---|---|---|
| postType | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden, and it does disclose meaningful traits: the type is stored by Fabrement and re-registered on every request rather than relying on a plugin, plus the archive-URL side effect for public types with hasArchive. It stops short of stating permissions, idempotency on slug collision, or whether registration is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the key prerequisite, then the rules. Dense and mostly waste-free, though the telegraphic 'to dress with' phrasing and stacked arrow-style references cost a little readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter creation tool (output schema present, so return values need no explanation), the description covers the storage model, the mandatory prerequisite doc, sibling routing, and a parameter-interaction side effect. Minor gaps remain around failure modes (duplicate/reserved slug) and reversibility, which the schema's uniqueness note only partly covers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning the schema does not: that 'public' combined with 'hasArchive' produces an archive URL that must be dressed via other tools. That interplay is genuine semantic value beyond the per-field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb ('Register a NEW custom post type') plus the resource, with concrete examples (Book, Project, Event). The emphasis on NEW cleanly distinguishes it from the sibling fabrement-update-post-type, and the storage/registration note differentiates it from any third-party plugin approach.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit sequencing is given: 'list-post-types first' before creating, and 'get-skill-doc {id:"content-model-contract"} — read it before the first call.' It also routes the agent onward for the archive case via save-archive-page + assign-template-archive, so the ordering of related tools is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-create-taxonomyCreate taxonomyAInspect
Register a NEW taxonomy (Genre, Region…) attached to post types — stored by Fabrement, no third-party plugin. hierarchical cannot be changed later. list-taxonomies FIRST: a second taxonomy meaning the same thing splits the content. Fill it with create-term.
Rules: get-skill-doc {id:"content-model-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Taxonomy key: 1-32 chars, lowercase a-z 0-9 _ -, unique and not reserved. | |
| plural | No | Plural label (default: singular + "s"). | |
| public | No | Front-end term archives (default true). A design decision: true for terms visited as pages (then dress them via "tax:*" contexts), false for terms that only filter blocks internally. | |
| rewrite | No | URL base for term archives (default: slug). | |
| singular | Yes | Singular label, e.g. "Genre". | |
| postTypes | No | Post types this classifies (from list-post-types). Each must exist. | |
| showInRest | No | Expose in REST / the block editor (default true). | |
| hierarchical | No | true = categories (parents, checkboxes); false = tags. Immutable after creation. | |
| showAdminColumn | No | Show a column in the post list table (default true). |
Output Schema
| Name | Required | Description |
|---|---|---|
| taxonomy | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers the most consequential trait: hierarchical is immutable after creation, and storage is first-party rather than plugin-backed. It does not cover permissions, rate limits, or failure behavior, but the irreversibility warning is the single fact an agent must know before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: the purpose and the immutability warning come first, then the dedup and sequencing guidance. The trailing 'Rules:' fragment is slightly clipped but still earns its space by pointing at the governing doc.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter creation tool with an output schema (which removes any need to describe return values), the description covers purpose, prerequisites, ordering, and the one irreversible design decision. Only operational concerns such as required capability or conflict handling are untouched.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each of the 9 parameters already carries a detailed description, including the same immutability note for hierarchical. The prose adds no parameter syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Register a NEW taxonomy') plus its scope ('attached to post types'), which cleanly separates it from update-taxonomy, create-term, and create-post-type. The NEW qualifier and the 'stored by Fabrement, no third-party plugin' clause pin down exactly what is made.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing: run list-taxonomies FIRST with the rationale (duplicate taxonomies split content), then fill the taxonomy with create-term, and read get-skill-doc {content-model-contract} before the first call. This is when-to-use, prerequisite, and follow-up guidance in one place.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-create-termCreate termAInspect
Add a term to any taxonomy (category and post_tag included). Idempotent: an existing name is returned with created:false. A parent that does not exist is refused. Rules: get-skill-doc {id:"content-model-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human name of the term, e.g. "Fiction". | |
| slug | No | URL slug (default: derived from the name). | |
| parent | No | Parent term id, slug or name — hierarchical taxonomies only. | |
| taxonomy | Yes | Taxonomy slug (see list-taxonomies). | |
| description | No | Optional description shown on term archives. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| name | Yes | |
| slug | No | |
| parent | No | |
| termId | Yes | |
| created | No | False when the term already existed. |
| taxonomy | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses idempotency ('an existing name is returned with created:false'), the refusal of a non-existent parent, and a required doc prerequisite. It omits permission/auth requirements and whether creation is reversible, keeping it short of 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences plus a one-line rule, with the core action front-loaded. The 'Rules:' line is slightly jarring in phrasing but earns its place by pointing at the prerequisite doc.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, yet the description still clarifies the created:false outcome. It covers the mutation's key behavioral facts (idempotency, parent validation, prerequisite) and is complete enough to call correctly, though explicit permission requirements are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented; baseline 3 applies. The description adds the validation semantic for 'parent' (nonexistent parent is refused), but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a term') plus the scope ('any taxonomy, category and post_tag included'), which clearly separates it from create-taxonomy (which makes the taxonomy itself) and update-term/delete-term. An agent can identify the correct tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete operating context: idempotent behavior on duplicate names, the prerequisite to read get-skill-doc {id:"content-model-contract"} before the first call, and the valid-parent condition. It does not explicitly contrast against update-term or set-post-terms, so 5 is not reached.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-delete-archive-pageDelete archive pageADestructiveInspect
Delete an archive bundle you authored (irreversible). A view whose rule still points at it renders an EMPTY slot — re-wire or unbind the template first. Rules: get-skill-doc {id:"archive-page-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Archive bundle reference from list-archive-pages. | |
| force | No | Delete even while a template rule still points at it — that view then renders an empty slot. |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond destructiveHint=true, it discloses irreversibility, the downstream consequence on views (an EMPTY slot), and the required prerequisite action, plus an ownership constraint. This is exactly the kind of context annotations cannot carry, so the description meaningfully extends the safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the verb, resource, and irreversibility in one sentence, then states the downstream risk and the prerequisite. No filler; every clause carries operational meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the destructive annotation is fully amplified by the description. Prerequisite, ownership scope, and consequence of forcing are all present, leaving nothing an agent needs to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, which sets the baseline at 3. The description adds a semantic layer by constraining the target to bundles 'you authored' and reinforcing the force-delete consequence (empty slot), giving slight value over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Delete an archive bundle') with an ownership scope ('you authored'), and the 'archive bundle' framing cleanly distinguishes it from the many sibling delete tools (delete-template, delete-content, delete-single-page). An agent can route to it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete prerequisite ('re-wire or unbind the template first') and mandates reading a contract doc via get-skill-doc before the first call. It stops short of explicitly contrasting itself with sibling delete tools, but the precondition is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-delete-blockDelete blockADestructiveInspect
Delete a block from the backend, the filesystem and this site at once (irreversible — its source goes too, so it has to be written again from nothing). REFUSED while any page places it or any template uses it as a header or footer, and the answer names them: remove it there first. There is no force — nothing can undo this one. Confirm with the user before calling. Rules: get-skill-doc {id:"block-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| blockId | Yes | The block record id (from list-blocks). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true; the description goes well beyond by disclosing that deletion is irreversible, that the block source is destroyed and must be rewritten from nothing, that the operation is refused rather than forced when in use, and that the refusal response names the blocking pages/templates. This is exactly the context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The irreversibility warning and the refusal condition are front-loaded and every sentence carries new information. Slightly dense with parentheticals, but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with no output schema, the description covers the safety profile, the blocking condition, the non-recoverability, the confirmation requirement, and the prerequisite doc read. Nothing an agent needs to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single parameter with 100% schema description coverage (blockId, including its origin from list-blocks), so the schema already does the work. The description adds no additional syntax or format detail, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (block) with scope — backend, filesystem, and site — which cleanly separates it from siblings like fabrement-delete-content or fabrement-delete-synced-pattern. An agent can identify it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-not conditions (refused while any page places it or a template uses it as header/footer), the remediation ('remove it there first'), the absence of any force override, and a required user confirmation before calling. It also names the prerequisite doc lookup, which is real routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-delete-cf7-formDelete Contact Form 7 formADestructiveInspect
Delete a Contact Form 7 form (irreversible); a block rendering it shows nothing afterwards. Confirm with the user first. Rules: get-skill-doc {id:"forms-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| formId | Yes | Form id from list-forms. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | No | |
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the description's job is to add specifics beyond that flag. It does: explicit irreversibility plus the downstream consequence that blocks rendering the deleted form render empty, which is real context an agent can't get from the annotation. It stops short of covering failure behavior (nonexistent id, forms in use elsewhere) or required capabilities.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences plus a one-line prerequisite rule, with the irreversible effect and the confirm-first caution both front-loaded before procedure. Nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with annotations and an output schema, this covers effect, irreversibility, confirmation, and the required skill doc. Only minor gaps remain, such as behavior when the id is unknown or the form is referenced elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single parameter with 100% schema coverage; the schema already says 'Form id from list-forms', and the description adds no format, sourcing, or validation detail beyond that. Baseline 3 is appropriate when the schema fully carries the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (delete a Contact Form 7 form) and immediately scopes the effect ('a block rendering it shows nothing afterwards'), which distinguishes it from update-cf7-form and the other delete-* siblings. An agent can tell what this does and what it touches without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete operating conditions: confirm with the user first, and read the forms-contract skill doc before the first call. It doesn't explicitly contrast with update-cf7-form, but the destructive-vs-modify distinction is self-evident from the name, so the missing alternative is low-cost.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-delete-contentDelete contentADestructiveInspect
Delete a page/post/custom record PERMANENTLY — requires force:true, and only when the user said so. To move it to the trash (recoverable) use set-content-status {status:"trash"} instead. Blocks used on the page are not deleted. Rules: get-skill-doc {id:"content-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Must be true: this deletes for good. For the trash use set-content-status. | |
| contentId | Yes | Content id (see list-content). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | No | |
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, so the safety profile is known; the description still adds real value beyond that: the force:true gate, the consent requirement, the cascade scope note that child blocks survive, and the content-contract prerequisite. It does not describe the failure/error behavior for a non-forced call, which would have pushed this higher.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences plus a rules line; the permanence/force constraint is front-loaded and the alternative is given in the same breath. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation; the description covers the destructive semantics, the alternative path, a side-effect caveat, and a prerequisite. Nothing an agent needs to invoke this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description reinforces force:true as a hard requirement tied to permanence and situates it against the trash alternative, adding contextual meaning beyond the schema's per-field text, though it largely restates what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (page/post/custom record) plus the critical scope modifier 'PERMANENTLY'. It explicitly contrasts itself with set-content-status, so an agent can distinguish it from the nearest sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions ('only when the user said so'), names the alternative tool and the exact call shape to use for the recoverable case (set-content-status {status:"trash"}), and points to the prerequisite skill doc before the first call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-delete-iconDelete iconADestructiveInspect
Delete an icon from the site library and the project copy. REFUSED while anything names it — an installed block, a render bundle, an icon field of a post type or an options page (its choices), or a live block version of the project — and the answer says which. force:true deletes anyway: every place naming it then renders nothing, and usedBy lists them. Confirm with the user before forcing.
Rules: get-skill-doc {id:"icons-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | <group>/<slug>, from list-icons. | |
| force | No | Delete even while it is used. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true, so the description carries real weight: it enumerates the exact dependency classes that block deletion, states that the answer names which one, and spells out the consequence of forcing ('every place naming it then renders nothing') plus the `usedBy` field that lists them. That is disclosure well beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then the refusal rule, then the force consequence, then the doc prerequisite — a logical order with no filler. The em-dash-heavy middle sentence is dense and takes a second read, which keeps it just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive two-parameter tool with no output schema, the description covers the blocking conditions, the override, the aftermath, the confirmation requirement, and the pre-call doc — the only return field an agent needs (`usedBy`) is even named.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema lacks: `force` isn't just 'delete even while it is used' — it explains the downstream render failure and the `usedBy` report, and it conditions `force` on user confirmation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Delete an icon from the site library and the project copy.' An agent can distinguish this from save-icon, get-icon and list-icons without opening any schema, and the description immediately names the effect on the project copy as well as the library.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-not conditions (refused while an installed block, render bundle, icon field, options page choices, or live block version names it) and the escape hatch (force:true) with the caveat 'Confirm with the user before forcing.' It also imposes a prerequisite: read the icons-contract skill doc before the first call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-delete-mediaDelete mediaADestructiveInspect
Delete a media item (permanent by default — media has no useful trash). It is deleted even while something still shows it — a block attribute, a featured image, the site icon: usedBy says where, and those places lose the image, so tell the user.
Rules: get-skill-doc {id:"site-assets-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Default true. False sends it to the trash if the site keeps media trash. | |
| mediaId | Yes | Attachment id (see list-media). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | No | |
| usedBy | No | Where it was still shown; those places have lost the image. |
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond destructiveHint=true, it discloses that deletion is permanent by default because media has no useful trash, that it succeeds even while referenced by a block attribute, featured image, or site icon, and that usedBy enumerates those references. This is exactly the behavioral context an agent needs before a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences and a rules line, with the permanence caveat front-loaded ahead of the in-use warning. Dense and largely waste-free, though the trailing 'Rules:' fragment reads slightly clipped.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists (covering usedBy return data), annotations carry the destructive hint, and the schema fully documents both parameters. The description adds the domain contract reference and the user-notification duty, leaving nothing an agent needs in order to call this safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: force's default-true/trash semantics and mediaId's 'see list-media' pointer are already documented in the schema. The description's 'permanent by default' phrasing echoes the schema rather than adding new syntax or format detail, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb+resource ("Delete a media item") and reinforces scope with the permanence-by-default parenthetical and the note that it fires even when the item is in use. An agent can distinguish it from the many other delete-* siblings (delete-icon, delete-block, delete-content) without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies a clear precondition (read the site-assets-contract skill doc before the first call) and a downstream action (tell the user which places lose the image). It does not, however, compare when to reach for this tool versus adjacent alternatives such as uploading a replacement or trashing instead of forcing, so exclusions are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-delete-options-pageDelete options pageADestructiveInspect
DESTRUCTIVE, cannot be undone: remove an options page AND every value stored on it, in every language. Its menu entry, fields and tabs are gone; a page created again under the same slug starts empty. Templates that still read its fields get null — check what reads it first (fabrement_get_option('…', '') in blocks, headers, footers, page bodies). To drop only some fields, save-options-page without them instead (their values are kept). Ask the user and name the page before calling this. Rules: get-skill-doc {id:"options-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The options page slug (list-options-pages); a-z, 0-9, _ and -, no "__". | |
| expectedRevision | Yes | The page's revision from get-options-page or list-options-pages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true; the description goes far beyond that by spelling out irreversibility, cascading loss of values, fields and tabs in all languages, the empty-state outcome of recreating the same slug, and the downstream null-read effect on templates. This is exactly the recovery/implication context an agent needs before a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the destructive warning and cascading effects, then alternatives, then prerequisites. Dense but each sentence carries a distinct constraint; the trailing 'Rules:' line is slightly bolted-on rather than integrated, which keeps it off a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive two-parameter tool with no output schema, the description covers irreversibility, blast radius, downstream effects, alternative tooling, and the mandatory skill-doc read. Nothing an agent needs to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both slug and expectedRevision are already documented in the schema; the description adds no syntax or format detail beyond what is there. Baseline 3 applies since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('remove an options page'), then extends the scope precisely: every value stored on it, in every language, plus its menu entry, fields and tabs. It also distinguishes itself from the sibling save-options-page by contrasting what each does with field values.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-not-to-use guidance ('To drop only some fields, save-options-page without them instead'), a pre-flight check ('check what reads it first', with the exact API call fabrement_get_option), a prerequisite skill doc rule, and a hard usage condition ('Ask the user and name the page before calling this' via expectedRevision).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-delete-post-typeDelete post typeADestructiveInspect
Unregister a custom post type Fabrement created and drop its definition. Its posts stay in the database (orphaned; back if the type is re-created under the SAME slug); its archive page and its Fabrement fields file are deleted with it (the field values stay on those posts). Called for a slug whose type is already gone, it deletes a fields file left behind. NOT a way to rename one: under a different slug the new type comes back empty and the posts stay orphaned under the old. To change what a type looks like, keep the slug and use update-post-type {rewrite} for its URL and {singular, plural} for its name. Core/plugin types are refused. Refused while posts of that type exist — they would stay in the database reachable from nowhere; pass force:true if that is meant. The archive template binding is dropped (it cannot survive), and the answer names what was left in place. Any render bundle that drew it is listed with renderFiles — check each before deleting it, one bundle can serve several types. Confirm with the user first. Rules: get-skill-doc {id:"content-model-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The custom post type slug (from list-post-types-custom). | |
| force | No | Delete even while posts of this type exist — they stay in the database, reachable from nowhere. |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | Yes | |
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
destructiveHint=true is already in annotations, but the description goes well beyond it: posts are orphaned rather than deleted (and recoverable only under the SAME slug), the archive page and fields file are deleted while field values persist, calling on an already-gone slug cleans up a leftover fields file, the archive template binding is dropped, and render bundles are surfaced via renderFiles with a warning that one bundle may serve several types. This is rich, non-obvious operational detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and somewhat parenthetical, but nearly every sentence carries a distinct constraint (orphaning, refusal, force, renderFiles, slug-stability). Front-loaded with the core delete action, though the parenthetical asides make it harder to scan than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, irreversible-feeling operation, the description covers consequences, refusal paths, recovery conditions, collateral artifacts (archive page, fields file, template binding, render bundles), and even lightly previews the response ('the answer names what was left in place'). An output schema exists, so return values need not be detailed, and nothing an agent needs to call this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description reinforces force's semantics ('pass force:true if that is meant') and the slug's origin, but adds essentially no syntax or format detail beyond what the schema already states for both parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Unregister a custom post type Fabrement created and drop its definition') and explicitly distinguishes itself from siblings: it is 'NOT a way to rename one' and points to update-post-type for that. An agent can pick it apart from create-post-type, update-post-type, and the other delete-* tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Extensive routing: when to use (existing Fabrement slug), when not to (renaming → update-post-type with {rewrite}/{singular,plural}), refusal conditions (core/plugin types, posts still existing), the force:true escape hatch, and a pre-flight instruction to read the skill doc and confirm with the user. This is the strongest category for this definition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-delete-single-pageDelete single pageADestructiveInspect
Delete a single-page bundle you authored (irreversible). A template still pointing at it falls back to the page's own content — check get-template first. Rules: get-skill-doc {id:"single-page-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Single-page bundle reference from list-single-pages. | |
| force | No | Delete even while a template rule still points at it — that view then renders an empty slot. |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
destructiveHint=true already flags the mutation, but the description adds value beyond it: the operation is irreversible, a referencing template degrades to the page's own content, and a contract document must be consulted first. It does not, however, cover auth/permission requirements or what the response returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with the irreversible consequence and the cascade behavior front-loaded, followed by a clearly delimited 'Rules:' directive. No filler and nothing buried mid-sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the destructive nature, the cross-entity fallout, the required prerequisite doc, and the ownership restriction. With 100% schema coverage, annotations present, and an output schema declared, nothing material is left for the description to carry.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning on top by explaining the state that the 'force' flag interacts with (a template still pointing at the page), complementing the field-level text about the empty slot that results.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) and a precisely scoped resource (a single-page bundle you authored), which tells the agent exactly which entity class is affected among the many delete-* siblings. Ownership scope ('you authored') further narrows the target.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions: check get-template first when a template points at the page, and read the single-page-contract skill doc before the first call. It stops short of naming a sibling alternative (e.g. delete-template vs delete-content) or stating when deletion is the wrong choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-delete-synced-patternDelete synced patternADestructiveInspect
Delete a global block (synced pattern) PERMANENTLY. A template's header/footer is never deleted while a template uses it — set another one with save-template first. Otherwise refused while any record places it — the answer lists them; remove the placements first, or send force:true (those places then render nothing). The blocks inside are not deleted. Rules: get-skill-doc {id:"synced-pattern-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Delete even while records place it. | |
| patternId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| title | No | |
| deleted | Yes | |
| orphaned | No | Records still placing it — they now render nothing there. |
| patternId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations supply destructiveHint=true, so the safety profile is already declared; the description adds substantial context beyond that — permanence, the two distinct dependency-based refusal conditions, the consequence of force:true (places render nothing), and that inner blocks survive. It stops short of stating auth/permission requirements, but the dependency semantics are unusually well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the destructive nature and the resource, then layers preconditions. Some sentences are dense (nested em-dash clauses around force:true), but nearly every clause carries distinct behavioral information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-format detail is unnecessary, and the description still notes that refusal responses list the blocking placements. Combined with covered preconditions, force semantics, and the skill-doc prerequisite, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%; the force param is documented in the schema, but the description adds real meaning beyond it by explaining the conditional effect ('those places then render nothing') rather than just 'delete even while records place it'. patternId is undescribed in both places, though it is an unambiguous identifier, so the gap is minor.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a global block (synced pattern) PERMANENTLY'), and the parenthetical alias plus the permanence qualifier distinguish it from generic sibling deleters like delete-block and delete-template. An agent can identify the target and the irreversibility without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly covers when-not-to-use: refused while a template's header/footer uses it (routed to save-template first) and refused while any record places it (routed to removing placements or force:true). It also names the prerequisite call, get-skill-doc, to run before the first invocation. This is about as prescriptive as usage guidance gets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-delete-taxonomyDelete taxonomyADestructiveInspect
Unregister a taxonomy Fabrement created (core/plugin ones are refused). Its terms stay in the database and return if it is re-created under the SAME slug; content just stops being classified by it. NOT a way to rename one: re-created under a different slug it comes back empty, because the terms are still filed under the old one — and nothing points at them any more. To change what a taxonomy looks like, keep the slug and use update-taxonomy {rewrite} for its URL and {singular, plural} for its name. Archive templates bound to it or to its terms are unbound and listed in the answer. Rules: get-skill-doc {id:"content-model-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The taxonomy slug (from list-taxonomies). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | What survived this delete and what to do about it — the kept pairing (with stillNamedBy) and the dropped archive bindings (with unbound), whichever applied. |
| slug | Yes | |
| deleted | Yes | |
| unbound | No | Archive contexts that were bound to it and are now unbound. |
| termsKept | No | How many terms were left in place. |
| stillNamedBy | No | Post types whose definition still names this slug — kept so re-creating it revives the attachment. Absent when none do. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply destructiveHint=true, so the description carries the disclosure burden and does well: terms persist in the DB and reappear on same-slug re-creation, different-slug re-creation leaves terms orphaned and the taxonomy empty, and bound archive templates get unbound and listed in the answer. It stops short of stating irreversibility or permission requirements, but the consequences of the mutation are clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and consequence, and every sentence adds distinct information (refusal rule, term persistence, rename pitfall, template unbinding). It is dense but slightly long, with the rename discussion spanning several clauses that could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive one-param tool with an output schema already covering the returned unbinding list, the description supplies everything needed: what is refused, what survives, the rename pitfall, and a required pre-read doc. No material gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single slug param, so baseline is 3; the description earns above baseline by attaching critical semantics to slug values (same slug preserves terms, a changed slug orphans them). That is genuinely additive to the schema's terse 'from list-taxonomies' note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (unregister) and resource (taxonomy) with an explicit scope constraint: only taxonomies Fabrement created, core/plugin ones refused. It is immediately distinguishable from sibling delete-term and update-taxonomy without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-not (core/plugin taxonomies are refused) and names the correct alternative for a different intent: keep the slug and use update-taxonomy {rewrite}/{singular,plural} to change URL or name. It also routes the agent to get-skill-doc before the first call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-delete-templateDelete templateADestructiveInspect
Delete a site template (irreversible). Pages that used it explicitly fall back to their post type's default and it stops being any type's default; its header/footer global blocks stay. Refused while anything still points at it, and the answer says what — pass force:true to delete anyway. Rules: get-skill-doc {id:"template-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Delete even while pages, post-type defaults or archive views still point at it. | |
| templateId | Yes | Template id from list-templates. |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes | |
| clearedPages | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply destructiveHint=true; the description goes well beyond that by disclosing exactly what is destroyed and what survives (pages fall back to post-type default, header/footer global blocks stay), the refusal behavior, and the force override. This is unusually rich for a delete tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the destructive action and its consequences in one dense sentence, then the refusal/force semantics, then the prerequisite rule. Every clause carries information, though the skill-doc rule adds a second call the agent must remember.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be detailed, and the description still notes the answer explains the refusal reason. Preconditions, irreversibility, and override are all covered for a destructive 2-param tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents both force and templateId, including the reference conditions force overrides. The description restates force's effect rather than adding new syntax or format detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Delete a site template") and immediately flags irreversibility, which distinguishes it cleanly from the many other delete-* siblings by resource type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the precondition clearly (refused while anything still points at it) and the escape hatch (force:true to delete anyway), plus a prerequisite to read the template-contract skill doc first. It doesn't name a sibling alternative, but the when-to-use condition is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-delete-termDelete termADestructiveInspect
Delete a term; posts just lose that label, children move up to the parent. Check count in list-terms first. Refused while a template is bound to its archive — unbind it first (assign-template-archive), because that binding would otherwise stay pointing at nothing. Refused too while a template draws a BODY for this term (a content-source rule): decide whether that body is still wanted, then remove the rule or pass force:true.
Rules: get-skill-doc {id:"content-model-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| term | Yes | Term id, slug or exact name. | |
| force | No | Delete even though a template draws a body for this term (a content-source rule), leaving that rule pointing at nothing. Not for the frame binding — that one is released with assign-template-archive and has no force. | |
| taxonomy | Yes | Taxonomy slug (see list-taxonomies). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | What survived the deletion and needs a decision: the orphaned rules above. |
| termId | Yes | |
| deleted | Yes | |
| taxonomy | Yes | |
| orphanedRules | No | Only with force:true — the content-source rules now naming a term id that no longer exists. Nothing renders them; drop them unless the body is wanted for another term. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
destructiveHint=true is already declared, but the description goes well beyond it: what survives a delete (posts, children), the two distinct blockages and why each exists ('that binding would otherwise stay pointing at nothing'), and that force leaves a rule dangling. This is exactly the context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the effect, then the refusal cases in order of escalation. Dense but every clause carries information; only the trailing 'Rules: get-skill-doc' line reads as an appended afterthought rather than part of the flow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, refusal-prone tool this covers side effects, pre-flight checks, both failure modes with remedies, and escalation via force. An output schema exists, so no return-value explanation is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description adds decision-level meaning to `force`: it applies only to a content-source body rule and explicitly does NOT cover the frame binding, which must be released via assign-template-archive. That scoping nuance is worth more than the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (delete a term) plus the exact consequences: posts lose the label, children re-parent upward. Those effects distinguish it from siblings like delete-taxonomy and delete-content without needing the schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit prerequisites (check `count` via list-terms, read get-skill-doc content-model-contract before the first call) and two named refusal conditions with prescribed remedies: unbind with assign-template-archive, or remove the content-source rule / pass force:true. An agent knows both when to call it and when it will be rejected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-get-archive-pageGet archive pageARead-onlyInspect
Read an archive bundle you authored: php, css, js, hooks, listing, plus description, logic, contexts, requires, history and hash. Read before save-archive-page; copy edits fragments from here.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Archive bundle reference from list-archive-pages. |
Output Schema
| Name | Required | Description |
|---|---|---|
| js | Yes | |
| css | Yes | |
| php | Yes | |
| hash | No | expectedHash for save-archive-page. |
| name | Yes | |
| path | Yes | |
| hooks | No | hooks.php source ("" when none). |
| logic | No | |
| title | No | |
| history | No | Recent saves, newest first: {at, summary}. |
| listing | No | listing.php source — the rows the archive-list block includes ("" when none). |
| contexts | No | |
| requires | No | |
| description | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds that the bundle is 'you authored' and lists returned components, which is useful context beyond annotations, though it omits auth requirements or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core action and followed by usage guidance. The internal field list is slightly verbose but remains purposeful and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not return values, and it covers purpose and usage well. It could be stronger by clarifying what 'edits' fragments are or any prerequisites, but it is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the single 'path' parameter fully documented as 'Archive bundle reference from list-archive-pages.' The description adds no extra parameter semantics beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read') and resource ('archive bundle you authored'), and enumerates the exact contents (php, css, js, hooks, listing, etc.). It distinguishes itself from siblings by naming save-archive-page as the write counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Read before save-archive-page' and 'copy edits fragments from here', providing clear context for when to use it. It names the alternative (save-archive-page) but does not state when not to use it or compare with other get-* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-get-block-sourceGet block sourceARead-onlyInspect
Read one block's CURRENT source for an update: its tokenised file bodies, registered name, shorthand attributes, backgroundColor, skills, description, tags and hash. Edit minimally (keep data-ui-id stable) and submit-version only what changes — edits per file + expectedHash.
Rules: get-skill-doc {id:"block-contract"} for a content block; a header follows {id:"header-contract"}, a footer {id:"footer-contract"} — read the one for the block's type before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | No | For a block the project has and this site does not (list-blocks installed:false, which has no blockId): read its code before deciding whether to import it. Pass one of the two. | |
| blockId | No | WordPress block id from list-blocks — for a block installed on this site. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hash | No | expectedHash for submit-version. |
| name | Yes | Registered block name — what save-content and set-post-type-starter-blocks take. |
| tags | Yes | |
| type | Yes | Which contract governs this block. |
| files | Yes | SOURCE form — the block's name is the literal {{nameKebab}} token. Send the token back; never substitute the real name. Empty string = the block has no such file. |
| icons | No | Library icon ids this version uses (fabrement_icon literals + iconPicker options). |
| skills | Yes | Resubmit these with submit-version or the runtime they provide is dropped. |
| summary | Yes | |
| attributes | Yes | Shorthand attribute contract; its keys are what save-content prefills by name. |
| description | Yes | |
| backgroundColor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description is consistent, adding real context: the source is 'CURRENT', it includes a hash used for optimistic concurrency (expectedHash), and editing must keep data-ui-id stable. It does not cover auth/rate-limit concerns, but the read-only nature plus the workflow detail is solid beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and return payload, followed by the editing guidance and contract rules. Dense but every clause earns its place; slightly jargon-heavy with tokenisation/hash references but still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since an output schema exists, return values need not be explained, yet the description helpfully summarizes them anyway. It also supplies the workflow (edit minimally, submit only changes) and the required contract read, leaving little for an agent to infer about how to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so uuid/blockId are already fully documented in the schema. The description mentions `edits` and expectedHash, but those belong to submit-version, not this tool's parameters, so it adds little parameter meaning. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Read one block's CURRENT source') and enumerates exactly what is returned (tokenised file bodies, registered name, shorthand attributes, backgroundColor, skills, description, tags, hash). It also names a related tool (get-skill-doc) so an agent can separate the source-read from the contract-read. This is far more specific than a sibling like list-blocks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear usage context: read the current source in order to update it, then edit minimally and submit-version only changes. It also directs the agent to read the relevant block-contract via get-skill-doc before the first call. No explicit 'when not to use', so 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-get-cf7-formGet Contact Form 7 formARead-onlyInspect
Read one Contact Form 7 form: title, raw template, mail recipient/subject, every message key (current, default, description), shortcode (page content only — a block uses the form id in its form attribute). Read before update-cf7-form.
Rules: get-skill-doc {id:"forms-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| formId | Yes | Form id from list-forms. |
Output Schema
| Name | Required | Description |
|---|---|---|
| form | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already covers the safety profile, but the description adds real context: the shortcode is page-content only and a block references the form via its `form` attribute, plus a mandatory skill-doc prerequisite. That is genuine behavioral value beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and resource, then field details, then rules. Dense but every clause carries information; the parenthetical shortcode clarification is the only slightly awkward insertion.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description still names the returned fields and the mandatory skill-doc prerequisite. Complete enough for a single-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter's description ('Form id from list-forms') already documents it. The description adds no syntax or format detail beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Read one Contact Form 7 form') and enumerates exactly what is returned (title, raw template, mail recipient/subject, message keys, shortcode). An agent can distinguish it from list-forms and get-content without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes sequencing: 'Read before update-cf7-form' and 'read get-skill-doc {id:"forms-contract"} before the first call.' Strong when-to-use guidance, though it does not state exclusions or when a different read tool is preferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-get-contentGet contentAInspect
Read ONE page/post/custom record in full: everything list-content reports plus slug, template, excerpt, featuredImage and blocks — its body as save-content takes it ({name, attributes} or {markup}), outline (block name per index) and hash. The step before editing a page: get-content → save-content {contentId, mode:"edit", edits, expectedHash: hash}.
Rules: get-skill-doc {id:"content-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| contentId | Yes | Record id from list-content. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| hash | No | expectedHash for save-content mode "edit". |
| slug | No | URL slug (post_name). |
| terms | No | |
| title | Yes | |
| blocks | Yes | In order, as save-content takes them back: {name, attributes} for a Fabrement block, {markup} for a core block. |
| parent | No | Parent record id; 0 = top level. |
| status | Yes | |
| editUrl | No | |
| excerpt | No | |
| outline | No | Block name at each index of `blocks` — the `index` + `name` of a save-content edit. |
| modified | No | |
| postType | Yes | |
| template | No | Site template slug in use, "" = the default for its type — as list-template-pages reports it; assign-template-pages changes it. |
| contentId | Yes | |
| menuOrder | No | |
| featuredImage | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does real work: it discloses that blocks come back in save-content's own format ({name, attributes} or {markup}), that outline is block-name-per-index, and that hash drives optimistic concurrency via expectedHash. It stops short of stating auth requirements, permissions, or mutation side-effects, so it is not fully comprehensive, but it is well beyond a bare read statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core read purpose, then the return payload, then the edit workflow, then the prerequisite rule. Dense but each clause (block format, hash, skill-doc) earns its place; the arrow-notation workflow compresses well.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be spelled out, yet the description usefully summarizes the payload and, critically, supplies the prerequisite contract doc and the downstream save-content linkage that structured fields cannot express. For a single-param read tool this is close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single contentId parameter is fully documented ('Record id from list-content.'). The description adds no format or sourcing detail for contentId beyond the workflow mention, so the schema does the heavy lifting and the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (read) plus resource (ONE page/post/custom record) with an explicit scope contrast against list-content: it returns 'everything list-content reports plus slug, template, excerpt, featuredImage and blocks'. An agent can distinguish it from the sibling list tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the when explicitly: 'The step before editing a page' with the exact chained call sequence get-content → save-content {contentId, mode:"edit", edits, expectedHash: hash}. It further names a prerequisite, get-skill-doc {id:"content-contract"}, to be read before the first call, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-get-design-systemGet design systemARead-onlyInspect
The design system THIS SITE paints with — colour tokens, typography, button variants, each with its live CSS variable / class — or hasDesignSystem:false when the site has not selected one. Call it before styling a block: use var(--fabrement-*) tokens and .fabrement-btn-- classes where they exist. Rules: get-skill-doc {id:"design-system-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Extra sections, omitted by default: "buttonStyles" gives each variant the full builder config that save-design-system patches; "buttonCss" gives the emitted stylesheet, which is already on the page and is needed only to read how a variant looks. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already declaring the safety profile, the description adds real behavioral context: the hasDesignSystem:false empty case and the note that buttonCss is already emitted on the page and only needed to read appearance. It does not describe pagination or sizing, but for a read-only token fetch this is solid added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences, front-loaded with what the tool returns before the usage rule. The "Rules:" clause is useful but slightly compresses a prerequisite and a how-to into the tail, leaving minor density.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-param, read-only getter with no output schema and a fully documented single parameter, the description covers return content, empty state, and consumption pattern. Only the absence of any check on when NOT to use it (e.g., before a design system exists) leaves a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already explains buttonStyles vs buttonCss in detail, so the description adds essentially nothing about the include parameter. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (the site's design system), then names the actual payload — colour tokens, typography, button variants with their CSS variable/class — plus the empty-state shape (hasDesignSystem:false). An agent can distinguish it from create-design-system/save-design-system without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Call it before styling a block" gives clear when-to-use context, and it prescribes how to consume results (use var(--fabrement-*) and .fabrement-btn--<variant>). It adds a prerequisite (read the design-system-contract skill doc first). No explicit when-not or named alternatives, which keeps it at 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-get-fieldsGet fieldsARead-onlyInspect
The custom fields defined for a post type (Fabrement fields): every field with its name and meta key (fab_), retired ones marked "retired": true, the form layout and the revision. Call it before save-fields (you need its revision and the existing fields) and before a template reads fields. revision 0 = no fields yet. Templates read values with fabrement_get_field('', $id), the record id passed explicitly, never get_post_meta. Site-wide settings: get-options-page. "problem" = the field file is broken: nothing can be saved until the user fixes or removes wp-content/fabrement/fields/; tell them, do not recreate the fields. Rules: get-skill-doc {id:"fields-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Post type slug, e.g. "project" or "page". | |
| type | Yes | Owner kind: "post", any post type with an admin screen (page, post, a Fabrement CPT, a plugin's type). Site-wide settings are not fields of a type: they are options pages (get-options-page / save-options-page). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint, and the description adds real behavioural context: retired fields are flagged, revision 0 means no fields exist yet, and the "problem" state means the field file is broken so nothing can be saved until the user fixes or removes wp-content/fabrement/fields/<file>, with an explicit instruction not to recreate the fields. That error-state guidance is exactly what annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the return contents, but it then stacks several concerns (workflow ordering, template read idiom, options-page redirect, problem-state handling) plus a trailing rules line about the skill doc. Dense but each sentence carries information; minor structural sprawl.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden and does so: it enumerates the returned shape (names, meta keys, retired markers, layout, revision), documents the empty case and the broken-file case, and states the upstream/downstream workflow. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented in the schema, including the slug pattern example and the "post" owner kind. The description only lightly reinforces this (site-wide settings are not fields of a type), so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: it returns the custom fields defined for a post type, enumerating name, meta key (fab_<name>), retired flag, form layout and revision. It explicitly demarcates itself from the options-page tools ("Site-wide settings: get-options-page"), but it never mentions the near-neighbour fabrement-list-post-type-fields, leaving that ambiguity for the agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit sequencing rules: call it before save-fields (because the caller needs the revision and existing fields) and before a template reads fields. It also names the read path for values (fabrement_get_field with an explicit record id, never get_post_meta) and mandates reading the fields-contract skill doc before the first call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-get-field-valuesGet field valuesARead-onlyInspect
The Fabrement field values of one record or of an options page, keyed by field name, in the shape set-field-values accepts; each repeater row carries "_row", its identity, to send back unchanged. "stored" says whether THIS record holds its own saved value (false = showing the default). Rules: get-skill-doc {id:"fields-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| postId | No | ID of the post, page or CPT record. Send this OR options. | |
| options | No | Slug of an options page (list-options-pages). Send this OR postId. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, but the description adds genuine behavioral context beyond that: the 'stored' flag semantics (false = showing default) and the '_row' identity that must be returned unchanged. That is useful non-obvious behavior an agent could not get from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the extra rule is kept short. The prose is a little dense and awkwardly worded, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-shape burden and does explain the keyed-by-field-name shape plus the 'stored' and '_row' fields. It also points to the fields-contract doc for deeper detail, leaving the definition reasonably complete for a read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented in the schema. The description reinforces 'one record or options page' but adds no format or selection syntax beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb+resource (get field values) and scopes it to 'one record or of an options page', tying directly to the postId/options parameters. It also names the sibling set-field-values to disambiguate, though the phrasing is slightly convoluted.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the counterpart tool set-field-values and gives a rule to read the fields-contract skill doc before the first call, which is real usage guidance. But it never contrasts against near siblings like get-fields or list-post-type-fields, so the when-to-use vs alternatives is only partially covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-get-figmaGet Figma designARead-onlyInspect
A Figma node as build-ready data: a clean HTML/CSS-in-JSON tree (tags, text, inlined icon svg, computed styles, resolved flex/grid) from a fileKey + nodeId. Without nodeId: the file outline — its pages and their top-level frames (id, name, size) — to pick the frame to read. A node too large to read at once returns {tooLarge, children}: read the children one by one. imageIds adds rendered image URLs (for eyeballing, and as upload-media sourceUrl for raster photos); raw:true gives the unprocessed node. Needs a Figma token on the site. Rules: get-skill-doc {id:"site-assets-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | true = the unprocessed Figma node tree (default false = the processed importer tree). | |
| nodeId | No | Node id, colon form (e.g. "12:34"). Omit for the file outline. | |
| fileKey | Yes | Figma file key from the URL. | |
| imageIds | No | Optional CSV of node ids to render as image URLs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds substantial behavioral context beyond that — the {tooLarge, children} overflow response with instructions to read children one by one, the token requirement ('Needs a Figma token on the site'), image URL rendering, and the raw flag. This is exactly the extra operational detail annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information is front-loaded with the primary return shape before the mode branches, and every sentence carries operational weight. It is dense and slightly run-on in the middle, but there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with no output schema, the description compensates by describing the return tree, the overflow object, and the auth prerequisite. An agent has everything needed to make a correct first call without a dedicated output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning: imageIds produces rendered URLs 'as upload-media sourceUrl for raster photos' and raw yields 'the unprocessed node,' which go beyond the terse schema text. The nodeId/fileKey semantics largely restate the schema, keeping it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource outcome: 'A Figma node as build-ready data: a clean HTML/CSS-in-JSON tree (tags, text, inlined icon svg, computed styles, resolved flex/grid).' It also disambiguates two distinct behaviors (node read vs file outline), so an agent can tell exactly what it will get. No sibling competes for Figma reading, and the scope is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes between modes: 'Without nodeId: the file outline ... to pick the frame to read,' and names the prerequisite 'get-skill-doc {id:"site-assets-contract"} — read it before the first call.' It also explains when to use imageIds and raw, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-get-global-cssGet global CSSARead-onlyInspect
Read the site-wide stylesheet (global.css): css, exists, bytes, url, hash. Read before save-global-css; pass hash back there as expectedHash.
Rules: get-skill-doc {id:"global-css-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| css | Yes | |
| url | No | |
| hash | No | |
| bytes | No | |
| exists | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is already declared, so the safety profile is covered. The description adds genuinely useful context the annotations cannot carry: the hash output is an optimistic-concurrency token to be returned as expectedHash, and a contract doc must be consulted first. It stops short of stating pagination/caching or how 'exists:false' behaves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and the returned fields in one compact sentence, then adds the workflow rule. Every clause carries information, though the trailing 'Rules:' line is slightly fragmentary and could be folded into the preceding sentence for cleaner structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the field list in the description is confirmatory rather than necessary, and the description still supplies the workflow context (read-before-write, hash round-trip, required contract doc) an agent needs to call this correctly in sequence.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero input parameters, so there is nothing for the description to clarify about inputs; the schema baseline of 4 applies. The mention of 'hash' and 'expectedHash' concerns the sibling tool's parameter, not this one's, so it does not raise or lower the input-semantics score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Read the site-wide stylesheet (global.css)') and even enumerates the returned fields (css, exists, bytes, url, hash). This clearly separates it from sibling fabrement-get-global-js and from the write counterpart fabrement-save-global-css without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Read before save-global-css; pass hash back there as expectedHash', naming the workflow dependency and the alternative it feeds. Adds a further prerequisite ('read get-skill-doc {id:"global-css-contract"} before the first call'), so when-to-use is fully specified with no inference needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-get-global-jsGet global JSARead-onlyInspect
Read the site-wide script (global.js): js, exists, bytes, url, hash. Read before save-global-js; pass hash back there as expectedHash.
Rules: get-skill-doc {id:"global-js-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| js | Yes | |
| url | No | |
| hash | No | |
| bytes | No | |
| exists | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds genuinely useful behavior beyond that: the hash field is an optimistic-concurrency token consumed by save-global-js as expectedHash, and a contract doc governs first use. Output schema carries the return shape, so no further transparency is needed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences plus a one-line rule, all front-loaded: what it reads, what it returns, the sequencing constraint, and the doc prerequisite. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values are documented elsewhere; listing js/exists/bytes/url/hash in the description is mild duplication. Everything an agent needs to call and sequence the tool is present, and the contract doc pointer covers deeper contract details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline is 4. The description goes slightly further by explaining the downstream meaning of the `hash` output value, though it does not (and need not) describe input syntax.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (read the site-wide global.js) and enumerates the returned fields (js, exists, bytes, url, hash). It is clearly distinguishable from its write sibling save-global-js and from get-global-css without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit ordering guidance: read this before save-global-js and pass `hash` back there as expectedHash, plus a prerequisite to read the global-js-contract skill doc before the first call. It stops short of naming an explicit 'when-not' case, but for a zero-param getter the routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-get-iconGet iconARead-onlyInspect
One library icon with its svg — as the site renders it (colours already turned into currentColor for mono/duotone). A block does not paste this: it calls fabrement_icon(''). Rules: get-skill-doc {id:"icons-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | <group>/<slug>, from list-icons. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already covers the safety profile, so the description's real addition is the return-behaviour detail that colours are pre-converted to currentColor for mono/duotone. That is genuinely useful, but it says nothing about error behaviour for an unknown id, whether removed icons 404, or caching. Adequate but thin beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause and the whole thing is three short sentences. The mid-sentence aside about blocks calling fabrement_icon and the oddly formatted 'Rules:' line cost a little clarity, but there is no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does well to say an SVG comes back with currentColor applied, and it points at the contract doc for the rest. Still, it leaves the agent uninformed about failure modes and about the practical step of getting a valid id, which list-icons (a sibling) presumably provides.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only the single id parameter exists and schema coverage is 100%, with the schema itself documenting '<group>/<slug>, from list-icons.' The description repeats the id shape via fabrement_icon('<id>') but adds no format or lookup detail beyond the schema. Baseline 3 applies when the schema carries the parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: fetching one library icon together with its SVG, which cleanly separates it from the sibling list-icons (plural, enumeration) and the save-icon/delete-icon mutations. The 'as the site renders it' phrasing adds a rendering-pipeline qualifier that helps scope it, though the aside about a block calling fabrement_icon is about a different surface and slightly muddies the subject.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite ('get-skill-doc {id:"icons-contract"} — read it before the first call') and an implicit when-not ('A block does not paste this: it calls fabrement_icon'). It never routes to list-icons for discovering ids or to delete-icon, but the context and prerequisite are clear enough to act on.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-get-options-pageGet options pageARead-onlyInspect
One options page (wp-admin → "Site General Settings"): its page settings (title, menu label, description, position, autoload), its fields with their names, its tabs (layout) and its revision. revision 0 = no such page yet. Call it before save-options-page (you need the revision and the existing fields) and before render code reads the page. Its values: get-field-values {options: slug}. Render code: fabrement_get_option('', ''). "problem" = the page's file is broken: nothing can be saved until the user fixes or removes wp-content/fabrement/fields/; tell them, do not recreate the fields. Rules: get-skill-doc {id:"options-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The options page slug, e.g. "site", "header", "footer" (list-options-pages); a-z, 0-9, _ and -, no "__", at most 32. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description goes well beyond, defining the revision sentinel (0 = no such page yet), the 'problem' state meaning the page file is broken, and the resulting constraint that nothing can be saved until the user fixes or removes the file — plus an explicit instruction not to recreate the fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool returns, then edge cases, then call-ordering rules; nearly every clause earns its place. The description is dense and somewhat run-on, packing return values, routing hints, and error semantics into a single block without clear separation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return-value burden — and it does, enumerating the page settings, fields, tabs, and revision. It also covers the 'problem' failure mode and the ordering relative to save-options-page, leaving nothing an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single slug parameter is fully documented in the schema (pattern, examples, character rules). The description adds no additional syntax or format detail for the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (fetch one options page) and enumerates exactly what it returns: page settings (title, menu label, description, position, autoload), fields with names, tabs, and revision. It clearly distinguishes itself from list-options-pages, get-field-values, and save-options-page by scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit sequencing: call before save-options-page because you need the revision and existing fields, and before render code reads the page. It also names the correct alternative for values (get-field-values) and the prerequisite skill doc (options-contract) to read before the first call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-get-seoGet SEO stateARead-onlyInspect
Read the SEO state: always yoast {active, version}; with contentId — the record's stored Yoast fields, effective output (title, description, canonical, robots) and the FULL schema graph it emits (and primaryTerms: the main term per taxonomy, for breadcrumbs); with termId — a term archive's stored and effective SEO; with archive (a post type) — its archive's stored and effective SEO; with postType — its defaults and schema template; with neither — the site settings and knowledge graph. Call it FIRST (is Yoast active?) and AFTER a write to verify.
Rules: get-skill-doc {id:"seo-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| termId | No | A term: the stored and effective SEO of its archive page. | |
| archive | No | A post type: the stored and effective SEO of its archive. | |
| postType | No | ||
| contentId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| site | No | |
| term | No | |
| yoast | Yes | |
| archive | No | |
| content | No | |
| postType | No | |
| typesWithSchema | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds real behavioral context beyond that — the stored-vs-effective distinction, the FULL schema graph emitted, primaryTerms for breadcrumbs, and the site settings/knowledge graph fallback. The FIRST/AFTER-write guidance and skill-doc prerequisite further clarify operational behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The selector list is front-loaded and dense but every clause carries information; the Rules sentence is separated out. It is a long single sentence with em-dash chaining, slightly heavy, but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return-shape detail is not required, and the description still covers per-selector behavior plus prerequisites. For a read-only inspection tool with a rich output schema, this is essentially complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 50% schema description coverage, the description compensates by explaining each selector's meaning — termId for a term archive, archive for a post type archive, postType for defaults/template, contentId for the record's Yoast fields, and 'neither' for site settings. This meaningfully exceeds what the schema documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Read/Get) and resource (SEO state) and enumerates exactly what is returned for each selector (contentId, termId, archive, postType, neither). It reads distinctly from write-oriented siblings like set-seo/set-seo-defaults, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear operational guidance: 'Call it FIRST (is Yoast active?) and AFTER a write to verify,' plus a prerequisite rule to read the seo-contract skill doc before the first call. It does not name a sibling to use instead in any case, so it stops short of explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-get-single-pageGet single pageARead-onlyInspect
Read a single-page bundle you authored: php, css, js, hooks, plus description, logic, contexts, requires, history and hash. Read before save-single-page; copy edits fragments from here. Theme files are not readable.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Agent single-page reference from list-single-pages. |
Output Schema
| Name | Required | Description |
|---|---|---|
| js | Yes | |
| css | Yes | |
| php | Yes | |
| hash | No | expectedHash for save-single-page. |
| name | Yes | |
| path | Yes | |
| hooks | No | hooks.php source ("" when none). |
| logic | No | |
| title | No | |
| history | No | Recent saves, newest first: {at, summary}. |
| contexts | No | |
| requires | No | |
| description | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already covers the safety profile, so the description's job is to add context. It does: it discloses the exact fields returned and the notable limitation that theme files cannot be read, which is behavior an agent cannot infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with verb+resource, then payload contents, then workflow cue, then limitation. Three tight sentences with no filler, though the field enumeration is dense and could be trimmed since an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no prose, and the description still covers purpose, workflow trigger, and a key limitation. For a single-parameter read tool this is essentially complete; only explicit sibling routing is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One parameter with 100% schema description coverage, where the schema already states 'Agent single-page reference from list-single-pages.' The description adds no syntax or format detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Read') plus resource ('single-page bundle you authored'), and it enumerates the returned payload (php, css, js, hooks, description, logic, contexts, requires, history, hash). It differentiates partly from siblings via the save-single-page relationship and the 'theme files are not readable' scope note, though it never contrasts against the other get-* readers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Read before save-single-page; copy `edits` fragments from here' gives an explicit workflow trigger, and 'Theme files are not readable' is a clear exclusion. It lacks a direct naming of alternatives (e.g. get-template / get-archive-page), but the when-to-use context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-get-site-settingsGet site settingsARead-onlyInspect
The site settings a build needs, as they are now — siteTitle, tagline, showOnFront, frontPage (the HOME page id), postsPage, notFoundPage, permalinkStructure, homeUrl, siteIcon. Change them with update-site-settings. Rules: get-skill-doc {id:"site-settings-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| settings | Yes | |
| codeWritable | No | false = DISALLOW_FILE_EDIT/MODS is set: tools that change block, page or global CSS/JS code are refused. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds genuinely new behavior: the values are live/current ('as they are now'), and there is a mandatory first-call prerequisite (get-skill-doc site-settings-contract) that the agent cannot learn from the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and its fields, then the sibling alternative, then the rule. The field enumeration is long but earns its place by defining the payload; only mild redundancy between 'site settings' phrasing and the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With readOnlyHint annotations, a 100%-covered schema, and an output schema that documents returns, the description only needs to add purpose, alternative routing, and the skill-doc prerequisite — all of which it supplies. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero input parameters, so the baseline is 4. To compensate, the description names the shape of the returned payload (the settings list), which orients the agent even though parameter semantics are trivially empty.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Identifies the exact resource (site settings) and enumerates the concrete fields it exposes (siteTitle, frontPage, permalinkStructure, etc.), which pins down what the caller receives. The read verb is only implied by 'as they are now' rather than stated, and it differentiates from its sibling update-site-settings, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes writes to update-site-settings ('Change them with update-site-settings'), which functions as the when-not condition, and adds a hard prerequisite ('read get-skill-doc before the first call'). Clear context and an alternative, but no explicit statement of the triggering scenario beyond that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-get-skill-docGet skill docARead-onlyInspect
Fetch one doc by id. Every tool that has rules names its contract in a "Rules:" line - read that doc before the first call. Some contracts open with WHAT TO FETCH: REQUIRED docs to read with them, PICK ONE groups, OPTIONAL docs for what the task needs and LATER docs for a later step, each with a one-line summary. Fetch several docs as parallel calls, one id each.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Doc id, e.g. "header-contract", "attributes", "header-panel-sheet". |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=true, so the description carries most of the burden and does add real behavior: docs can be fetched several at a time as parallel calls, one id per call. It does not mention rate limits or failure modes, but the read-before-first-call protocol is a meaningful disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, and the rest is spent on actionable protocol guidance rather than filler. The final run-on sentence listing WHAT TO FETCH categories is dense and slightly awkward, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value detail is unnecessary, and the description correctly focuses on how to consume the doc system. A single-parameter read tool with an output schema needs little more; only the terse category phrasing leaves minor ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the id property already carries a pattern and concrete examples, so the schema does the heavy lifting. The description only adds 'one id each', which restates single-value semantics rather than enriching them – baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch one doc by id') and immediately frames the resource type as a rules/contract doc, which cleanly separates it from the many content-oriented get_* siblings (get-content, get-template, get-fields). An agent can identify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger: read a tool's 'Rules:' contract doc before the first call, and explains the REQUIRED / PICK ONE / OPTIONAL / LATER grouping so the agent knows which docs to pull. No explicit when-not-to-use case, but no real alternative exists for this resource.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-get-synced-patternGet synced patternARead-onlyInspect
One global block (synced pattern) in full: title, blocks (its body as save-synced-pattern takes it: {name, attributes} or {markup}), outline, hash for an edit, foreign blocks, and usedBy — every record placing it, i.e. everything an edit changes. Read it before changing the pattern.
Rules: get-skill-doc {id:"synced-pattern-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| patternId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| hash | Yes | expectedHash for save-synced-pattern mode "edit". |
| kind | No | |
| title | Yes | |
| blocks | Yes | |
| status | No | |
| usedBy | Yes | |
| editUrl | No | |
| foreign | No | |
| outline | No | |
| patternId | Yes | |
| templates | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds substantial behavioral context: it enumerates the meaningful return fields and explains that `usedBy` is 'every record placing it, i.e. everything an edit changes'. It doesn't cover pagination or error behavior, but this is rich detail for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the return-field breakdown, then a rules line. Dense but every clause carries information; only the skill-doc pointer sits slightly apart from the main flow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values are already structured, yet the description still frames the key fields and their edit implications. Combined with the contract-doc pointer, an agent has enough to call and interpret the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single `patternId` parameter is never explained in the description text (format, where to source it). The parameter is a trivial positive integer, so the gap is minor, but the description does not compensate for the missing schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get one global block (synced pattern) in full') and resolves the domain jargon by equating 'synced pattern' with 'global block'. This clearly distinguishes it from list-synced-patterns and save-synced-pattern siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit usage context: 'Read it before changing the pattern' and the rule to consult the synced-pattern-contract skill doc before the first call. It stops short of naming a specific alternative tool, but the when-to-use condition is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-get-templateGet templateARead-onlyInspect
One template in full: parts, contentWidth, contentSource (the content-slot config; a rule that can no longer render carries problem), beforeSlot/afterSlot zones, header/footer {patternId, title} — each a GLOBAL BLOCK whose words are read and changed with get-synced-pattern / save-synced-pattern (every template placing it changes), archiveContexts. Read it before an UPDATE that touches the slot or a zone — save-template replaces what you pass.
| Name | Required | Description | Default |
|---|---|---|---|
| templateId | Yes | Template id from list-templates. |
Output Schema
| Name | Required | Description |
|---|---|---|
| template | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds real behavioral context beyond that: header/footer entries are GLOBAL BLOCKS whose words change in every template placing them, a stale rule surfaces as `problem`, and save-template is destructive-replacement so this read is a prerequisite to a safe update. It doesn't cover auth or rate-limit behavior, but for a read tool this is well above the bar.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the outcome ('One template in full:') followed by dense field enumeration, and the critical update warning is last, where it lands well. However the core is one long em-dash-chained run-on that requires re-reading to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return payload needn't be explained; the description instead spends its budget on the non-obvious parts — global-block coupling, the `problem` marker, and the read-before-write dependency. Complete enough for a single-parameter read tool, with little left that would cause a mis-call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single parameter with 100% schema description coverage ('Template id from list-templates'), so the schema already carries the semantics. The description adds nothing about templateId syntax or sourcing, which is the expected baseline-3 outcome when the schema does the lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('One template in full') and enumerates the payload shape: parts, contentWidth, contentSource, beforeSlot/afterSlot, header/footer, archiveContexts. This is immediately distinguishable from fabrement-list-templates and from fabrement-get-synced-pattern, which it explicitly names for a different concern.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger — 'Read it before an UPDATE that touches the slot or a zone' — with the reason ('save-template replaces what you pass'), and routes the reader to get-synced-pattern/save-synced-pattern for editing global block content. No explicit when-not or mention of list-templates for browsing, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-import-blockInstall or reapply a project block on this siteAInspect
Install or reapply the current PROJECT version on this site. Takes uuids from list-blocks as blockIds. Already installed blocks keep their WordPress ID; their files are rewritten without creating a backend version. Use this to retry after submit-version saved in the backend but failed to write locally. An imported block is indistinguishable from one built here: get-block-source reads it, submit-version changes it, list-versions has its history. Prefer this over building the same section again.
Rules: get-skill-doc {id:"block-discovery-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| blockIds | Yes | The `uuid` values from list-blocks, whether installed or not. NOT the numeric WordPress id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| skipped | No | One entry per id that did not, each with the reason. Read these — the rest of the batch still installed. |
| installed | No | One entry per block that landed: its WordPress blockId (preserved on reimport), title and the files written. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that installed blocks keep their WordPress ID, that files are rewritten without creating a backend version, and that the result is indistinguishable from a locally built block. It stops short of explicitly flagging that local file edits are overwritten (destructive potential) or any permission/auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and input source are front-loaded, and each clause (retry case, ID retention, equivalence to local blocks) earns its place. It is dense and slightly long for a one-parameter tool, but there is little filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description fully covers the operational context an agent needs: the correct input source, the retry scenario, and downstream behavior of the imported block. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents blockIds as uuid values from list-blocks, explicitly excluding the numeric WordPress id. The description reinforces this but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (install/reapply a project block on this site) and names the concrete input source (uuids from list-blocks as blockIds). It distinguishes itself from create-block and submit-version by describing what happens to already-installed blocks and by scoping to the 'current PROJECT version'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the triggering situation: 'Use this to retry after submit-version saved in the backend but failed to write locally.' It also gives a preference rule ('Prefer this over building the same section again') and clarifies the tool is not for fresh authoring. Alternatives are named concretely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-install-pluginInstall a plugin (allow-listed)AInspect
Install and activate a plugin from a closed allow-list — "wordpress-seo" (Yoast), when get-seo says yoast.active:false and the user wants SEO managed, and "contact-form-7", when list-forms says cf7.active:false and a form is needed. Needs install/activate capabilities and a writable host; a refusal names the reason. A translation plugin (WPML) is NOT on the list: ask the site owner to install and configure it, then reconnect — the language tools and the docs' language rules appear only once the site has languages. Rules: get-skill-doc {id:"seo-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| slug | Yes | |
| version | No | |
| activated | Yes | |
| installed | Yes | |
| alreadyPresent | No | Was on disk before this call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it discloses required capabilities (install/activate) and host preconditions (writable filesystem), failure behavior (a refusal names the reason), and an activation side effect. It does not address idempotency (what happens if already installed) or reversibility, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and each clause (allow-list, per-slug conditions, capability requirements, WPML exclusion, doc rule) earns its place. However, the middle section is dense and run-on with parenthetical asides, making it harder to scan than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, the description supplies prerequisites, decision criteria, an explicit exclusion with a workaround, and a pre-call documentation rule. An output schema exists, so return values need not be described. Nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the single parameter is an enum and the description richly explains the decision criterion for each value, going well beyond the bare allowed strings. It compensates for the coverage gap; only the absence of any note on invalid slugs keeps it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb pair (install and activate) and resource (plugin), immediately scoped as coming from a closed allow-list. It is unmistakable against siblings, none of which perform installs, and it enumerates the exact allowed slugs. An agent knows precisely what this tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use conditions per slug (wordpress-seo when get-seo reports yoast.active:false and SEO is wanted; contact-form-7 when list-forms reports cf7.active:false and a form is needed). It also names an exclusion — WPML is NOT on the list — and routes the agent to the alternative action (ask the site owner to install/configure, then reconnect). Prerequisite doc reading is called out too.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-archive-pagesList archive pagesARead-onlyInspect
The ARCHIVE bundles you authored: path (for contentSource rules with an archive/blog-home/tax context), label, description, and usedBy — the views actually rendering it. No usedBy means nothing points at it: an orphan, whatever its contexts claim. If nothing fits, save-archive-page.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| files | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already signals a safe read, so the bar is lower, and the description adds genuine interpretive context: it explains what usedBy means (the views actually rendering it) and the orphan inference when it is absent. It stops short of describing pagination or ordering behavior, but the added semantic depth is real.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key point — the archive bundles returned and their fields — is front-loaded in the first clause, followed by a useful clarification about usedBy. The phrasing is dense and the opening sentence is long, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because an output schema exists, the description need not enumerate return values, and it appropriately focuses on field semantics (usedBy, orphan meaning) and a fallback route. It is nearly complete for a zero-parameter list tool, falling just short of stating when to prefer it over sibling list tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. With no inputs to document, there is nothing the description needs to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description conveys that this returns archive-page bundles the user authored, along with their fields (path, label, description, usedBy). However, the verb 'list' is only implied via the title rather than stated, and it does not explicitly contrast itself with close siblings like list-archives or list-archive-records. Purpose is clear but sibling differentiation is weak.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides one indirect routing cue — 'If nothing fits, save-archive-page' — and explains an orphan-detection signal via the absence of usedBy. There is no explicit statement of when to reach for this versus the other list/get archive tools, leaving usage largely inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-archive-recordsList archive recordsARead-onlyInspect
The PAGE that describes each post-type archive — the record its title, SEO and schema live on: {postType, context, url, pageId, title, slug, status, hasContent}. Title and slug: set-archive-record. SEO: get-seo / set-seo {archive: postType}. Schema: set-schema on its pageId. hasContent says whether the record carries BLOCKS — an archive has its own content like any page, written with save-content {contentId: pageId}. Not to be confused with list-archive-pages, which lists the render bundles that draw the listing.
Rules: get-skill-doc {id:"seo-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| archives | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, so the description carries most of the behavioral burden — and it delivers non-obvious domain semantics: what hasContent means (a record carrying BLOCKS), that archive content is written via save-content {contentId: pageId}, and that the seo-contract skill doc must be read first. It stops short of covering pagination, ordering, or failure modes, but the output schema exists to carry return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and largely front-loaded: the resource definition and record shape come first, and the sibling disambiguation and prerequisite rule land at the end where they belong. It is written in clipped, jargon-heavy fragments ('the record its title, SEO and schema live on') and is longer than most definitions, costing a point on readability rather than waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description covers the harder gaps: what a record represents, how it relates to set-archive-record / set-schema / save-content, the hasContent flag, and the mandatory skill-doc read. Missing only operational details like ordering or paging behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to explain; baseline 4 applies. The description instead documents the returned field set and their downstream owners, which is where the value sits for this no-arg lister.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource ('the PAGE that describes each post-type archive') and enumerates the exact record shape {postType, context, url, pageId, title, slug, status, hasContent}. It also explicitly separates itself from a similarly named sibling, list-archive-pages, so an agent can pick between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit routing for follow-up work: title/slug edits go to set-archive-record, SEO to get-seo/set-seo {archive: postType}, schema to set-schema on the pageId. It names the conflicting sibling ('Not to be confused with list-archive-pages') and states a prerequisite ('get-skill-doc {id:"seo-contract"} — read it before the first call').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-archivesList archivesARead-onlyInspect
The archive views a template can be bound to: context ("archive:" | "blog-home" | "tax" | "tax:" | "tax::"), label, url, templateId bound at that level (term views resolve most-specific-first). Pick a context here → save-archive-page → contentSource rule → assign-template-archive.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| archives | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safe-read profile, and the description adds real behavioral context beyond it: the context string formats, that term views 'resolve most-specific-first', and that templateId is the binding at that level. It does not discuss ordering, pagination, or emptiness of the result, but the added semantics are substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Everything is packed into a single dense paragraph with inline quoted enums and arrow symbols, which makes it harder to scan than a short front-loaded statement plus a separate workflow note. The information is relevant, but the structure is cramped and the arrow chain is cryptic on first read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and no input parameters, the description only needs to frame what the tool is for and how it fits the workflow, which it does. The resolution-ordering note and the downstream chain cover the main ambiguities an agent would face.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema baseline is 4. The description's enumeration of context value shapes applies to returned data rather than inputs, so it adds nothing to parameter semantics, but there is no gap to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource precisely — the archive view contexts a template can be bound to — and enumerates the returned fields (context, label, url, templateId). It never states the verb 'list' explicitly, relying on the name and title, but the resource and scope are unambiguous and distinguishable from siblings like list-archive-pages and list-archive-records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete workflow position: 'Pick a context here → save-archive-page → contentSource rule → assign-template-archive', which tells the agent this is the entry point before save-archive-page. There is no explicit when-not guidance or named alternative, but the ordering context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-blocksList blocksARead-onlyInspect
List/search this project's blocks: id, name (the registered name other tools take), title, hasFiles (this site has the block's files; always false on installed:false rows — read importable there), type. Content blocks only by default; type "header"|"footer"|"all" for template parts. Paged (10, limit ≤25; read total/pages) — narrow with search or tags rather than scanning. Rows with installed:false are in the project but NOT on this site — install one with import-block rather than rebuilding it. availableTags lists every tag in use with counts: read it before tagging a block of your own.
Rules: get-skill-doc {id:"block-discovery-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, 1-based. Default 1. | |
| tags | No | Keep only blocks carrying ALL of these. Take the words from `availableTags` — a tag nobody used matches nothing. | |
| type | No | Which kind to list: "default" (content blocks, the default) | "header" | "footer" | "all". | |
| limit | No | Blocks per page (default 10). Values above 25 are capped, not refused — read `limit` in the response. | |
| search | No | Case-insensitive substring over title, kebabName, pascalName, description and tags (e.g. "hero", "bizcor foot"). | |
| refresh | No | Accepted for compatibility and has no effect: the project is always read fresh from the backend. | |
| installed | No | true = only what is on this site; false = only what the project has and this site does not. Omit for both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | No | |
| limit | No | Page size actually used — a `limit` above the ceiling is clamped to it. |
| pages | No | More than 1 means this response is partial. A `page` above it returns an empty list, not an error. |
| total | Yes | Blocks matching type + search across ALL pages. |
| blocks | Yes | |
| projectSync | No | "ok" fresh from the backend; "unavailable" it did not answer — then this list is THIS SITE ONLY and says nothing about the project. |
| availableTags | No | Every tag in use across the project for the `type` asked for (a header listing has the words headers carry), with how many blocks carry it. The site's own vocabulary — reuse these words when you tag a block, or the filter splits between "card" and "cards". |
| notInstalledCount | No | How many project blocks are not on this site, before any filter. Absent when projectSync is "unavailable" — nobody can count what they could not read. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint, so the description carries real weight and delivers: default page size of 10, a hard cap of 25 on limit (capped, not refused), semantics of installed:false rows ('in the project but NOT on this site'), the always-false hasFiles on those rows, and that `refresh` is a no-op. This is substantial behavior disclosure beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and return shape, then constraints, then rules. Dense but every clause carries information; the one redundancy is restating that refresh has no effect, which the schema already says.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and the description still covers paging, filtering strategy, the installed vs. project distinction, tag vocabulary, and a pointer to the governing contract doc. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds operational meaning: `name` is the registered name other tools take, `hasFiles` is unreliable on uninstalled rows, and `tags` values must come from `availableTags` or they match nothing. It slightly repeats the schema's `refresh` no-op note, keeping it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List/search this project's blocks') and immediately enumerates the returned fields (id, name, title, hasFiles, type). It carves out scope precisely: content blocks by default, template parts via type header/footer/all, which distinguishes it from siblings like list-content and list-templates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: narrow with `search`/`tags` rather than scanning paged results; rows with installed:false should be installed with import-block rather than rebuilt; read `availableTags` before tagging; and read the block-discovery-contract skill doc before the first call. When-to-use, when-not-to, and the alternative tool are all named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-block-usageList block usageARead-onlyInspect
Where a block is PLACED: the templates using it as a header or footer, and the pages, posts and template zones whose content holds it. Ask before editing a block — a submitted version replaces it everywhere, so this is the list of what your edit changes. Empty means nothing places it yet. Rules: get-skill-doc {id:"block-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max placements to return (default 50, cap 100). Content is searched with a LIKE over post_content, which no index covers, so this is a real bound rather than a page size. | |
| blockId | Yes | Block record id (from list-blocks). |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | Registered name ("fabrement/<kebab>"), the string searched for in content. |
| title | Yes | The block title — what to call it when you report back. |
| usedBy | Yes | Every placement found, most specific first: header/footer roles, then content placements. |
| blockId | Yes | |
| hasMore | Yes | True when placements were cut off by `limit` — raise it, or narrow the question. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds real behavioral context beyond that: the empty-result semantics ('Empty means nothing places it yet'), the consequence framing (a submitted version replaces it everywhere), and a skill-doc precondition. It does not discuss pagination behavior, but the output schema covers the return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the supporting sentences earn their place by explaining why to call it. Slightly dense with the trailing 'Rules:' line, but no wasted verbiage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and readOnly annotations provided, the description only needs to sell purpose and workflow. It covers scope, the empty case, and a precondition, leaving nothing important for the agent to infer before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are well documented in the schema itself, including the reason the limit is 'a real bound rather than a page size.' The description adds no parameter-level detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with precise scope: 'Where a block is PLACED: the templates using it as a header or footer, and the pages, posts and template zones whose content holds it.' This clearly distinguishes it from siblings like list-blocks (returns all blocks) or get-block-source (returns source for one block).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger condition: 'Ask before editing a block — a submitted version replaces it everywhere.' The rules line further directs reading block-contract before the first call. It stops short of naming explicit alternative tools or when-not-to-use conditions, so a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-contentList contentARead-onlyInspect
List content — pages, posts or any type — to find ids and see what exists: id, title, postType, status, url, editUrl, terms, parent, menuOrder. parent lists one level of a hierarchical type (0 = top level). title answers "does a page called X exist", slug is the exact lookup, search scans content too. Search BEFORE creating: a second "About" beside the existing one is the usual failure.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ONE record by id — the other filters are ignored, and `postType` defaults to "any". The lookup for a known page. | |
| slug | No | Exact URL slug (post_name) — the precise "does this exist" lookup. | |
| limit | No | ||
| title | No | Match the TITLE only (substring, case-insensitive). | |
| parent | No | Only the direct children of this record; 0 = only top-level records. Omit for every level. | |
| search | No | Match against title AND content — broad; use `title` when you mean the title. | |
| status | No | "any" (default), publish, draft, pending, private, trash. "any" never includes the trash — records deleted without force are found only with "trash". | |
| orderby | No | "modified" (default, newest first) | "menuOrder" (the site's own order of siblings, then title) | "title" (A→Z). | |
| postType | No | Public post type, or "any". Default "page". |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| total | Yes | Matches before the limit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already classifies the operation, and the description adds meaningful behavioral context: the return field set, the one-level semantics of `parent`, and the create-collision risk that motivates using it. Some of that (status/trash, orderby) duplicates the schema, so it does not reach the highest tier.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the search-before-create rule, and each filter is dispatched in a short clause. The enumerated return fields are somewhat redundant given an output schema exists, which keeps it out of the top tier.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations, an output schema and 89% parameter coverage already present, the description supplies exactly the missing pieces: when to use it, how to choose filters, hierarchy semantics, and the failure mode it prevents. An agent can call it correctly without opening anything else.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 89% schema coverage the baseline is 3, and the description earns a small upgrade by tying filters to intent ('`title` answers "does a page called X exist", `slug` is the exact lookup') rather than just restating field definitions. The remaining parameter sentences largely mirror the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (content — pages, posts or any type) and immediately narrows intent to finding ids and surveying what exists, enumerating the returned fields. This clearly separates it from get-content, list-media, list-terms and other list-* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit workflow guidance ('Search BEFORE creating: a second "About" beside the existing one is the usual failure') and spells out which filter answers which question (title for existence, slug for exact lookup, search for broader scans, parent for one level). It doesn't explicitly name a sibling alternative such as get-content, so there is minor inference left.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-fontsSearch fontsARead-onlyInspect
Search the Google Fonts catalogue and see the faces THIS SITE already has. Call it BEFORE naming a font in save-design-system: it confirms the family exists, and returns the weights it really ships so you never ask for one it does not have. siteFonts lists what is already installed here — those cost the page nothing extra.
Rules: get-skill-doc {id:"design-system-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Family name or part of one ("oswald", "serif"). Omit to list the most popular. | |
| limit | No | ||
| category | No | ||
| cyrillicOnly | No | Only families covering Cyrillic — required for Ukrainian or Russian copy. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already covers the safety profile, so the description's added value is the disclosure that results include real shipped weights and a siteFonts list of already-installed families (which cost nothing extra). It does not mention pagination or result-size behavior, but it does add meaningful return context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose in the first sentence and keeps the routing advice tight. The trailing "Rules:" line is a slightly awkward tack-on but is short and actionable, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does supply the key return shape (matching families, their weights, and a siteFonts set). For a read-only search tool with four optional parameters this is nearly complete; only the undocumented limit/category behavior is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%: q and cyrillicOnly are documented in the schema, while limit and category are not. The description adds no parameter-level meaning at all (no mention of paging, result caps, or category filtering), so it fails to compensate for the undocumented half.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (Google Fonts catalogue) plus a second scope (the fonts already installed on this site). It explicitly names the sibling save-design-system that consumes its output, so an agent can place it in the workflow without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger ("Call it BEFORE naming a font in save-design-system") and a prerequisite (read get-skill-doc design-system-contract first). There is no explicit when-not-to-use guidance, but the sequencing instruction is clear enough to select the tool correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-formsList formsARead-onlyInspect
The forms on this site (Contact Form 7, WPForms) with their ids. A block NEVER builds its own : it gets a form attribute (FormField) whose default is one of these ids, and styles the markup.
Rules: get-skill-doc {id:"forms-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| cf7 | Yes | |
| wpforms | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered structurally. The description adds genuinely useful behavioral context the annotations do not: which form providers are enumerated (CF7, WPForms), that the ids are consumed as a block's default `form` attribute, and a mandatory doc-read prerequisite. Return format is left to the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Compact and front-loaded — the resource and its id payload come first, followed by the contract rule. The block-facing sentence (
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not document the return shape; it covers purpose, the supported form sources, and the prerequisite doc. For a zero-param read tool this is close to complete, with only the absence of an explicit alternative routing keeping it below 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies; there are no arguments whose semantics the description needs to clarify. Nothing in the text misrepresents the (empty) input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource and scope precisely: "The forms on this site (Contact Form 7, WPForms) with their ids" — a specific artifact with an identifiable return payload. It distinguishes itself from siblings like get-cf7-form or create-cf7-form by being the enumeration of all forms. The trailing block-contract sentence is about consumption, not retrieval, which slightly dilutes the front-loaded purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite ("read [forms-contract] before the first call") and explains why the tool exists — a block's `form` attribute must be drawn from one of these ids. It does not state when-not to use it or name an alternative list tool, so it stops short of the 5 tier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-iconsList iconsARead-onlyInspect
The site's icon library: id (/, what fabrement_icon() takes), name, description, tags, colorMode (mono/duotone = paint with CSS color; original = drawn colours), url, usedBy. No markup — get-icon for that. availableTags lists the tags in use. List BEFORE drawing an icon or saving one: the usual failure is a second arrow beside the first.
Rules: get-skill-doc {id:"icons-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Keep icons carrying ALL of these. | |
| group | No | ||
| search | No | Substring of id, name, description or tags. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered, but the description adds real behavioral context: the id format ('<group>/<slug>', what fabrement_icon() takes), the meaning of colorMode values for CSS painting, the presence of a usedBy field, and the availableTags field. It does not mention pagination, result caps, or ordering, which is the only remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Highly front-loaded — the field list and the sibling distinction come first, prerequisites last. The telegraphic register ('No markup — get-icon for that', the 'second arrow' aside) is efficient but slightly compressed, and the field inventory is arguably schema-shaped rather than purpose-shaped.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of describing returns and does so comprehensively (id, name, description, tags, colorMode, url, usedBy, availableTags). Combined with the filter guidance and the mandatory skill-doc prerequisite, an agent has everything needed to call this correctly on the first attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%: tags and search carry inline descriptions, while group has an enum but no prose. The description does not explain how these three filters compose (AND semantics, substring matching) beyond what the schema says, and its mention of 'tags' refers to a return field rather than the filter parameter. Adequate but not additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('The site's icon library') and immediately enumerates the returned fields, so the agent knows exactly what this returns. It explicitly distinguishes itself from fabrement-get-icon ('No markup — get-icon for that') and is clearly the read-side counterpart to save-icon/delete-icon.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('List BEFORE drawing an icon or saving one') with the concrete failure mode it prevents ('a second arrow beside the first'), names the alternative tool for markup, and states a prerequisite skill doc to read before the first call. When/when-not/alternative are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-mediaList mediaARead-onlyInspect
Search the media library (title, filename, alt text; kind image/video/audio/document), newest first: id, url, mimeType, altText, width, height. Use it before upload-media and when the user refers to an existing image. Rules: get-skill-doc {id:"site-assets-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Media kind filter; default "image". | |
| page | No | Page number (24 per page), newest first. Default 1. | |
| search | No | Substring over title, filename and alt text (e.g. "logo", "hero"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | No | |
| items | Yes | |
| pages | No | |
| total | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds ordering semantics (newest first), returned fields, and an authorization/workflow prerequisite via the skill doc, which is genuine context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and filters are front-loaded in the first sentence, with usage and the prerequisite following. It is fairly dense with parenthetical enumerations, but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, listing return fields is mildly redundant, but the prerequisite skill-doc rule and the usage routing make the definition complete enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with per-parameter descriptions and an enum, so the schema already documents kind, page, and search. The description restates the kind values and default but adds no syntax or edge-case detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It names a specific verb (Search) and resource (the media library) and enumerates the searchable fields and returned fields, so an agent can distinguish it from siblings like upload-media or delete-media without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use it (before upload-media, when the user refers to an existing image) and names the related sibling, plus gives a mandatory prerequisite (read the site-assets-contract skill doc first).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-options-pagesList options pagesARead-onlyInspect
The options pages of the site (wp-admin → "Site General Settings"): site-wide settings such as a phone, an address, social links or footer text, kept once for the whole site. Each: slug, title, menuTitle, description, position, autoload, revision and how many active fields it has. Look here before creating one: a setting that fits an existing page belongs there. Read or change a page's fields and tabs with get-options-page / save-options-page {slug}; its values with get-field-values / set-field-values {options: slug}; templates read them with fabrement_get_option('', ''). Rules: get-skill-doc {id:"options-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safe-read profile is covered. The description adds real value beyond that: the exact shape of each returned record (slug, title, menuTitle, position, autoload, revision, active field count) and a required pre-call step (read the options-contract skill doc).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource definition and implications, then the sibling routing, then the contract rule. It is dense and slightly long, but every sentence carries distinct information (record shape, routing, required doc), so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by enumerating the returned record fields. It also covers the required contract doc and points to the sibling tools needed for follow-up actions, making it complete for an agent to call and act on it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 per the rubric. There are no arguments to disambiguate, and the description's field enumeration concerns return values rather than inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific resource (options pages / site-wide settings in wp-admin) and elaborates what it means with concrete examples (phone, address, social links, footer text). It clearly distinguishes the tool from get-options-page, save-options-page, and get-field-values by naming them for other tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Look here before creating one: a setting that fits an existing page belongs there,' and names the correct alternatives for reading/changing fields, tabs, and values. When-to-use and which sibling to pick instead is stated, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-post-type-fieldsList post type fieldsARead-onlyInspect
Every custom field a post type declares, and the PHP to read each one in render code: source "fabrement" (our fields: read with fabrement_get_field('', $post_id), never get_post_meta), "acf" (ACF field groups on the type: group, returnFormat, choices, sub-fields; read with get_field) and "registered" (register_post_meta). Call it before a single-page/archive bundle or a block prints anything beyond title/content/excerpt/featured image/terms, so keys come from the site, not a guess. "fabrementFields" at the end is the full definition of our fields, the same as get-fields (use get-fields to change them). It reads declarations only, not the database: meta nobody declared is not listed (query-database shows raw rows). Empty = the type declares no custom fields; do not invent keys. Rules: get-skill-doc {id:"content-model-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| postType | Yes | Post type slug, e.g. "course" or "page" (list-post-types). | |
| includeInternal | No | Include underscore-prefixed and core registered keys. Default false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fields | Yes | |
| postType | Yes | |
| fabrementFields | No | How to read Fabrement fields, and their definitions as get-fields returns them. Absent when the type has none. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide readOnlyHint=true, and the description goes well beyond that: it states it reads declarations only and not the database, that undeclared meta is absent, that empty output means the type declares no fields, and warns not to invent keys. This discloses real scope-of-return behavior that the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but purposeful – each clause (source semantics, usage trigger, declaration-vs-DB scope, empty case, prerequisite) carries distinct information. It leads with return structure rather than the core action, which is slightly awkward, and it is longer than strictly necessary, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lister of moderate complexity, the definition covers routing, prerequisites, scope of the returned data, and the empty-result case, and an output schema exists to carry return shape. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters, so the baseline is 3. The description explains the source semantics of returned data rather than elaborating on postType or includeInternal, adding little parameter meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: lists every custom field a post type declares, and breaks the result into three named sources (fabrement, acf, registered) with the PHP idiom for each. It also distinguishes itself from get-fields (for editing) and query-database (raw rows), so an agent can route without opening the sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use: call it before a single-page/archive bundle or a block renders anything beyond title/content/excerpt/featured image/terms, so keys come from the site rather than a guess. It also names the alternatives and a prerequisite (get-skill-doc with id 'content-model-contract' before the first call).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-post-typesList post typesARead-onlyInspect
Post types on the site: available (every public type, with fabrement:true on the ones created here) and defaults (post type -> the template its records wear automatically, with its title and whether it is ready). Any public type can be given one with set-default-template; a record of any type can also pick a template for itself, which outranks the default. starterBlocks (post type -> the blocks a NEW record opens with in the editor, set with set-post-type-starter-blocks) is the read-back of that setting — the editor template, not the site template.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| defaults | Yes | Post type -> { templateId, title, ready }: the template records of that type wear unless they picked one themselves. Empty when no type has a default. |
| available | Yes | |
| starterBlocks | Yes | Post type -> { blocks:[{name, attributes}], lock }: what a NEW record of that type opens with in the editor (set-post-type-starter-blocks). Empty when no type has one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds meaningful context that `starterBlocks` is a read-back of an existing setting (the editor template, not the site template) and that a per-record template outranks the default, but says nothing about auth, scoping, or freshness of the listing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a dense, single-paragraph definition that front-loads the resource and groups the three response sections logically. No filler, and every clause adds semantic content. 5 is appropriate for a definition this compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero params, a read-only annotation, and an output schema present, the description need not explain return structure — yet it goes further and clarifies the semantics of each section. The only gap is the failure to position it against the sibling `list-post-types-custom`.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters (empty object schema), so the baseline is 4. The description introduces no parameter syntax and needs none.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource (post types on the site) and enumerates the data it exposes (`available`, `defaults`, `starterBlocks`), so an agent can tell what it returns. However, it never plainly states the verb and never distinguishes itself from the sibling `fabrement-list-post-types-custom`, which is a likely source of confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It references the counterpart setters `set-default-template` and `set-post-type-starter-blocks`, which helps the agent understand the lifecycle, but these are setters rather than alternatives. There is no explicit when-to-use guidance and no exclusion versus `list-post-types-custom` or `list-post-type-fields`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-post-types-customList Fabrement post typesARead-onlyInspect
The custom post types Fabrement created — the only ones update/delete-post-type work on. list-post-types shows every type.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| postTypes | Yes | Only types Fabrement registered — the ones update-post-type and delete-post-type accept. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already declaring a safe read, the description adds genuinely useful domain context: that these are the exclusive targets of update/delete-post-type. It doesn't disclose return shape or pagination, but the output schema covers return values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short front-loaded clauses with no waste: the scope and its exclusivity come first, the disambiguation from the sibling second. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-param, read-only listing tool with an output schema and readOnlyHint annotation, the description supplies exactly the missing piece — scope and sibling disambiguation. Nothing needed to invoke it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline for a parameterless tool applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (custom post types created by Fabrement), and explicitly distinguishes itself from the sibling fabrement-list-post-types by noting 'list-post-types shows every type.' An agent can route confidently without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit condition: these custom types are 'the only ones update/delete-post-type work on,' and names the alternative (list-post-types) with the rule that separates them. When-to-use and which-sibling is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-seoList SEOARead-onlyInspect
List what search engines see across the site — records (pages, posts, any type), post-type archives or terms — each with seo {title, metaDesc: "own"|"template"|"none", noindex, canonical}. filter narrows to what needs work: noMetaDesc (no description at all), noCustomTitle (the title is the type's template), noindex, canonicalElsewhere. A row kept out of search (noindex) is left out of every filter but noindex. Then get-seo opens one and set-seo writes it.
Rules: get-skill-doc {id:"seo-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | content (default): records; archive: post-type archives with a record; term: term archives. | |
| limit | No | Default 50. | |
| filter | No | All must hold. | |
| offset | No | ||
| status | No | kind content: default publish — what search engines can see. | |
| postType | No | kind content: one post type. Default: every public type. | |
| taxonomy | No | kind term: one taxonomy. Default: every public taxonomy. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| items | Yes | |
| total | Yes | Rows matching, before limit/offset. |
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, but the description goes well beyond that: it spells out the filter semantics, the metaDesc provenance enum (own|template|none), and a subtle edge case — a noindex row is excluded from every filter except noindex. That noindex behavior is exactly the kind of non-obvious trait annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the returned shape, and each sentence carries weight (filters, edge case, sibling routing, prerequisite). It is information-dense and multi-clause, which borders on crowded, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and it covers the remaining gaps: kinds, filter semantics, the noindex edge case, related tools, and the required skill doc. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 86%, so the schema already documents most parameters (baseline 3). The description adds genuine meaning on top: what `filter` narrows to per value (noMetaDesc = no description at all, noCustomTitle = title is the type's template) and the cross-filter noindex exclusion rule.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (what search engines see), then enumerates the three kinds it covers (records, archives, terms) and the exact seo fields returned. It also distinguishes itself from siblings by naming get-seo (opens one) and set-seo (writes it), so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context and explicit alternatives: get-seo to open a single record and set-seo to write it, plus a prerequisite rule to read the seo-contract skill doc before the first call. It lacks an explicit 'when not to use' or a stated trigger for choosing this over a generic list-content call, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-single-pagesList single pagesBRead-onlyInspect
What a template's content slot can render: path (for a contentSource rules[].file), label, source (theme file or a bundle you authored), description, ours (false = a theme file: rule-able, but not readable, editable or deletable here), and usedBy — the views actually rendering it. No usedBy means nothing points at it. If nothing fits, save-single-page.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| files | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint provided, the description carries useful extra behavioral weight: it explains what ours=false means (theme files are rule-able but not readable/editable/deletable here) and that usedBy identifies the views actually pointing at an item, so an empty usedBy signals an orphan. That is genuine operational context beyond the annotation, though it stops short of describing ordering or result size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is compact but structured as a dense, run-on field glossary rather than a front-loaded statement of purpose. The single most important sentence — what this tool does — is missing, so the reader must reconstruct it from the field list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complexity is low (read-only, no params) and an output schema exists, so the exhaustive enumeration of return fields is largely redundant. The description instead leaves the core gaps — a clear action statement and when-to-use routing versus get-single-page — partially open, making it only adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a no-argument tool applies. The field glossary instead duplicates the output schema, which does not help parameter selection.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a topic fragment ("What a template's content slot can render") and never states the action verb of listing single pages. The resource domain is gestured at via "path", "contentSource rules[].file" and "usedBy — the views actually rendering it", so an agent can infer it enumerates renderable single pages, but it is not clearly distinguished from siblings like get-single-page, list-template-pages, or save-single-page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is one latent routing hint ("If nothing fits, save-single-page") plus an implicit constraint that ours=false items are "not readable, editable or deletable here", which nudges the agent toward other tools for those items. However, there is no explicit statement of when to call this list versus get-single-page, nor any prerequisite or filtering guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-synced-patternsList synced patternsARead-onlyInspect
The GLOBAL BLOCKS on this site: synced patterns (edit once, every page placing one changes). Each with id, title, the blocks inside, usedBy (how many records place it) and foreign (blocks that are neither Fabrement nor core). Only patterns holding a Fabrement block by default; scope "all" lists every synced pattern. kind — its pattern category: "header" / "footer" (a template's header or footer, set with save-template headerPatternId / footerPatternId; templates lists the templates placing it) or "section" (placed on pages). Check here BEFORE saving a new one.
Rules: get-skill-doc {id:"synced-pattern-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| limit | No | ||
| scope | No | Default "fabrement". | |
| search | No | Title substring. |
Output Schema
| Name | Required | Description |
|---|---|---|
| patterns | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description goes well beyond by disclosing the default filter (only patterns holding a Fabrement block), the scope behavior, and the returned fields (usedBy, foreign, templates). It also imposes a prerequisite rule (read the synced-pattern-contract skill doc first), which is meaningful behavioral context the annotations do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core definition and return shape, then the scope/kind behavior, then the action rule. Dense but every clause earns its place, though the kind explanation is slightly long-tail for a list tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with an output schema and annotations already covering safety, the description supplies the missing pieces: filter defaults, scope semantics, and the skill-doc prerequisite. It is largely complete; the only untouched edge is pagination/limit behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50% and two parameters (kind, scope) have bare enum values. The description compensates strongly: it explains the header/footer/section categories, ties header/footer to save-template headerPatternId/footerPatternId, and clarifies scope. Only `limit` goes undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (synced patterns / global blocks), and even defines the concept ('edit once, every page placing one changes'). It enumerates the returned fields and distinguishes the filtering modes, so an agent knows exactly what this tool surfaces relative to siblings like get-synced-pattern.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit timing guidance ('Check here BEFORE saving a new one') and explains the scope default vs "all" routing. It stops short of naming the closest alternative (get-synced-pattern) or defining when-not to use it, so it is clear context without full exclusion logic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-taxonomiesList taxonomiesARead-onlyInspect
The taxonomies on this site: slug, label, hierarchical, public (false = terms classify content but have no pages of their own), postTypes, terms count, fabrement (created here). Call before create-taxonomy (reuse what exists) and before create-term.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| taxonomies | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, but the description adds semantic context beyond that: what 'public' means ('false = terms classify content but have no pages of their own') and what 'fabrement' marks ('created here'). These clarify the meaning of returned data in a way annotations cannot.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Structure is good: resource first, field list second, workflow instruction last. The parenthetical clarifications for 'public' and 'fabrement' earn their space by adding meaning, though the sentence is dense enough that it flirts with over-packing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a readOnly annotation and an existing output schema, the description needn't explain return structure, yet it still summarizes the fields helpfully. Combined with the pre-creation workflow guidance, an agent has what it needs to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to document at the argument level and the baseline is 4. The field list describes output shape rather than inputs, which is complementary but not required given an output schema exists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (taxonomies on this site) and enumerates the returned fields, making clear it is a read/inventory operation. The verb is only implicit in the description text (carried by the title 'List taxonomies'), so it falls just short of a self-contained verb+resource statement, but there's no ambiguity with siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit workflow guidance: 'Call before create-taxonomy (reuse what exists) and before create-term,' which tells the agent when to reach for it and why. It stops short of naming when not to use it or comparing against list-terms, so it is strong but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-template-pagesList template pagesARead-onlyInspect
List the records a template can be assigned to — every public type: id, title, status, postType, typeLabel, template (slug in use, "" = default), isFront. Use it to gather ids before assign-template-pages. templateId does not narrow the list; it only guarantees that the picks this template already holds are in it, whatever the search.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max rows (default 50). | |
| search | No | Title search filter (empty = first pages). | |
| templateId | No | Does NOT narrow the list; it only guarantees the picks this template already holds are in it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Present when something about this site keeps a page out of the ordinary rules — a classic theme with its own front-page.php, for one. |
| pages | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, so the description carries real weight and adds non-obvious behavior: templateId does NOT narrow the list and only guarantees the template's existing picks survive the search, and a template value of "" means default. This counterintuitive filter behavior is exactly the kind of trait an agent would otherwise mispredict.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the purpose before the field list and usage hint. Dense but every clause carries information (fields, workflow, filter quirk); the field enumeration is arguably slightly heavy given an output schema exists, keeping it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, workflow, and the filter semantics for a read-only list tool whose annotations already establish its safety profile and whose output schema documents the return shape. Nothing critical is missing; listing the return fields is mildly redundant against the output schema but not harmful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description goes beyond the per-parameter text by explaining the cross-parameter interaction: templateId guarantees picks are included 'whatever the search', clarifying how templateId and search compose. That is genuine added meaning over the schema's isolated field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and a precise resource (the records a template can be assigned to), then enumerates the returned fields (id, title, status, postType, typeLabel, template, isFront). This distinguishes it from near-siblings like list-template-pages vs list-archive-records or list-templates, so an agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit workflow guidance — 'Use it to gather ids before assign-template-pages' — which names the downstream alternative and the condition for choosing this tool. It does not state an explicit when-not case (e.g. when to prefer list-templates instead), so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-templatesList templatesARead-onlyInspect
List the site templates (header+footer frames): id, title, headerPatternId, footerPatternId (the global blocks placed as header/footer), headerBlockId, footerBlockId (the blocks inside them), contentWidth, ready, pageCount, defaultFor. Call FIRST when the user may mean an EXISTING template — update it by id instead of creating a duplicate.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| templates | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint already tells the agent this is a safe read, so the bar is lower. The description usefully enumerates what comes back (id, ready, pageCount, defaultFor) and distinguishes pattern vs block ids, but adds nothing about pagination, ordering, or volume limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, followed by field semantics and a routing hint. The long field enumeration is somewhat redundant with the published output schema, which is a minor cost, but every clause still carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A no-param, read-only list tool is well covered: purpose, output fields, and the create-vs-update routing decision are all present. Since an output schema exists, the field list is a bonus rather than a requirement, and nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero input parameters, so the baseline is 4 by rule. The description instead documents the shape of the returned entities, which usefully disambiguates headerPatternId/footerPatternId from headerBlockId/footerBlockId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('List the site templates') with a clarifying gloss ('header+footer frames') that implicitly separates it from fabrement-list-template-pages. It does not name or contrast any sibling explicitly, so differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use trigger ('Call FIRST when the user may mean an EXISTING template') and a downstream action ('update it by id instead of creating a duplicate'). No exclusions or alternatives are offered, e.g. when to reach for get-template or list-template-pages instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-termsList termsARead-onlyInspect
The terms of a taxonomy: termId, name, slug, parent, count, url. Call before create-term (extend the vocabulary, don't add "Sci-Fi" next to "Science Fiction") and before looping terms in a bundle.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| search | No | Filter by a substring of the term name. | |
| taxonomy | Yes | Taxonomy slug (see list-taxonomies). |
Output Schema
| Name | Required | Description |
|---|---|---|
| terms | Yes | |
| total | Yes | Terms in the taxonomy, ignoring search/limit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, and an output schema exists, so the field enumeration in the description is largely redundant. It adds little behavioral context beyond the annotations — no pagination, order, or limit behavior is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight clauses with no filler, front-loading what the tool returns before the usage notes. The 'and before looping terms in a bundle' clause is slightly awkward but still earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema covering the return shape and readOnlyHint covering safety, the description only needs to add scoping and routing context, which it does. The missing pieces — limit behavior and the tautology risk of the verbose create-term guidance — are minor for a simple list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67% (taxonomy and search documented; limit undocumented). The description only implies the taxonomy parameter via 'terms of a taxonomy' and says nothing about limit or search, so it neither compensates for the gap nor misleads; baseline sits between the high-coverage and low-coverage anchors.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The fragment 'The terms of a taxonomy: termId, name, slug, parent, count, url' plus the title 'List terms' communicates a specific verb+resource and enumerates the returned fields, so an agent knows this is a taxonomy term reader. It is clear but never states the verb explicitly in prose, leaving the purpose dependent on the title.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives two concrete call scenarios — 'Call before create-term' and 'before looping terms in a bundle' — and even supplies the rationale (avoid duplicate vocabularies like 'Sci-Fi' next to 'Science Fiction'). No explicit when-not or pagination guidance is offered, but the positive routing context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-list-versionsList versionsARead-onlyInspect
A block's saved versions, newest first: id (versionId for rollback-version), createdAt, isCurrent, summary.
| Name | Required | Description | Default |
|---|---|---|---|
| blockId | Yes | WordPress block id from list-blocks. |
Output Schema
| Name | Required | Description |
|---|---|---|
| versions | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes that this is a safe read. The description adds two things beyond that: the ordering guarantee ('newest first') and the identification of isCurrent, which the schema does not express. However, it repeats return fields that the output schema already documents and says nothing about limits, pagination, or how many versions a block retains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence, front-loaded with the resource and the ordering. The field enumeration slightly duplicates the output schema, which is the only waste, but the phrasing is efficient overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one fully documented parameter and an output schema present, the description does not need to explain return values, and it correctly does not attempt to. The main missing piece is operational guidance: whether versions are paginated or bounded, and how this tool pairs with rollback-version and submit-version.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and blockId is described as a 'WordPress block id from list-blocks', so the schema already carries the parameter semantics. The description only implies that blockId selects the block whose versions are listed, adding no format or constraint detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource (a block's saved versions), and the title supplies the verb 'List'. It also implicitly distinguishes itself from rollback-version by naming versionId as the input that tool expects. It stops short of an explicit verb+scope statement in the description itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance. The parenthetical 'versionId for rollback-version' implies the intended workflow (inspect versions, then roll back), but the agent has to infer that the tool is a prerequisite for rollback-version rather than being told so.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-previewPreviewARead-onlyInspect
A tokenized URL to see what you built, opened in your browser without a wp-admin session — the MANDATORY check after every save. target "content": a page/post/CPT record (drafts included) on its own address through its template. target "template": the whole assembled template (header, content slot, footer) on one record (contentId), a sample of a type (postType) or an archive (context). target "block": one block alone, optionally rendered ON a record (contentId) so it sees that record's fields. Private and password-protected records are never shown. Rules: get-skill-doc {id:"preview-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The record id (content), template id (template) or block id (block). | |
| target | Yes | What to preview: a record, a template or a block. | |
| context | No | template only: an ARCHIVE view — "archive:<postType>", "blog-home", "tax", "tax:<taxonomy>" or "tax:<taxonomy>:<termId>" (list-archives). | |
| postType | No | template only, without contentId: the type whose latest published record is the sample. Omitted: a type the template is the default for, else page. | |
| contentId | No | template / block: the record to show them ON (published or draft, never private). A template previews that record's page; a block renders as if placed there, so fabrement_get_field() and get_queried_object_id() see it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| status | No | content / contentId: the record's status (publish, draft…). |
| expiresIn | Yes | Seconds the URL stays valid. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond readOnlyHint=true: the URL is tokenized and works without an authenticated wp-admin session, private and password-protected records are never exposed, and a block rendered with contentId runs as if placed on that record so fabrement_get_field() and get_queried_object_id() resolve. That is exactly the context an agent needs and it is consistent with the read-only annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool produces, then target-by-target routing, then constraints and prerequisites — a sensible order with no filler. The prose is dense and runs long with em-dash clauses, which costs a little scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter preview tool with an output schema (so return shape needn't be documented), the description covers every mode, the privacy constraint, and the required first-call documentation. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the property descriptions already explain id, target, context, postType and contentId, including the omitted-postType default. The description's target paragraphs largely restate that mapping, adding only light framing ('drafts included', 'optionally rendered ON a record'). Baseline 3 for a fully documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and artifact: returns a tokenized URL that renders a build in the browser without a wp-admin session. It then enumerates the three preview modes (content, template, block) so an agent can tell exactly which resource shape it is producing, well beyond the tautological title 'Preview'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Declares the tool MANDATORY after every save and routes the agent per target: content for a record through its template, template for the assembled layout, block for an isolated block. It also sets a prerequisite ('get-skill-doc {id:"preview-contract"} — read it before the first call'). No explicit when-not-to-use or sibling alternative is named, which keeps it just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-query-databaseQuery database (read-only)ARead-onlyInspect
READ-ONLY SQL (one SELECT/SHOW/DESCRIBE/EXPLAIN; a LIMIT is added) to investigate what the site holds — counts, content and meta keys. Raw options, users, usermeta and sitemeta tables are not accessible because they contain credentials. Include meta_key when selecting meta_value; unidentified or sensitive values come back [redacted]. Comments and multiple statements are refused; SHOW is limited to TABLES/COLUMNS/INDEX/TABLE STATUS/CREATE TABLE; a statement is stopped after 10 seconds. Prefer the dedicated list-* tools where one exists; never a substitute for a write.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | One read-only statement (SELECT / SHOW / DESCRIBE / EXPLAIN). | |
| limit | No | Row cap (default 50, max 500). |
Output Schema
| Name | Required | Description |
|---|---|---|
| sql | No | The statement as executed (with the LIMIT applied). |
| rows | Yes | |
| columns | No | |
| rowCount | Yes | |
| truncated | No | True when the row cap was reached — narrow the query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, so the description carries real weight and delivers it: auto-added LIMIT, inaccessible credential tables, meta_key requirement, [redacted] values, refusal of comments/multiple statements, SHOW whitelist, and a 10s timeout. It stops short of describing the result shape, but the output schema covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the read-only statement types and constraints in a single dense paragraph with zero filler. It is packed tightly, but each clause (redaction, timeout, SHOW whitelist, list-* preference) earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only query tool with a rich output schema, the description covers safety, syntax restrictions, sensitive-data handling, timeout, and routing to siblings. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the sql and limit parameters are already documented. The description adds only marginal param-level detail (that a LIMIT is auto-added, and the meta_key pairing rule), which is the baseline-3 territory when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (execute read-only SQL to investigate what the site holds: counts, content, meta keys) and explicitly routes away from generic use toward the list-* siblings. An agent can distinguish it from every list-* and get-* tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (investigate counts/content/meta keys) and when-not ('Prefer the dedicated list-* tools where one exists; never a substitute for a write'), naming both the alternative tools and the excluded use case. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-rollback-versionRoll back to a versionAInspect
Make an EARLIER version (list-versions) the live one again and write its files to the site — only to undo a version that turned out wrong; submit-version already deploys. A version saved with mode "overwrite" left no checkpoint. Rules: get-skill-doc {id:"block-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| blockId | Yes | WordPress block id from list-blocks. | |
| versionId | Yes | Version uuid to roll back to (from list-versions). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| buildOk | No | |
| versionId | No | |
| filesWritten | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose real behavioral traits: it is a write/mutation that 'writes its files to the site', that a version saved with mode 'overwrite' left no checkpoint (so it may not be recoverable), and that it requires reading a contract doc first. It stops short of stating what is overwritten in the live site beyond the version's files, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the disambiguation from submit-version are front-loaded, and every clause carries information. The dense em-dash and parenthetical packaging makes it slightly harder to parse than it needs to be, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param write tool with an output schema (so return values need not be explained), the description covers prerequisites, the alternative sibling, and a key limitation. The 'overwrite leaves no checkpoint' caveat is useful but terse and could be clearer about recoverability.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already fully documented (blockId from list-blocks, versionId uuid from list-versions). The description references list-versions but adds no syntax or format semantics beyond what the schema provides. Baseline 3 is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Make an EARLIER version the live one again and write its files to the site') and explicitly contrasts itself with the sibling submit-version ('submit-version already deploys'). An agent can distinguish it from submit-version and list-versions without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the condition for use ('only to undo a version that turned out wrong'), the alternative that already covers the normal path (submit-version), the prerequisite doc to read before the first call (get-skill-doc {id:'block-contract'}), and where the versionId comes from. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-save-archive-pageSave archive pageAInspect
Create or change an ARCHIVE bundle — render.php looping the MAIN query (+ optional style.css, view.js, hooks.php, listing.php) — that fills a template's CONTENT area on an archive view. Send files whole, or change an existing bundle with edits (fragment replacements per file) + expectedHash from get-archive-page. summary is required on every save; description and logic on create and whenever php/js/hooks change. Returns the path for a contentSource rule; then assign-template-archive. listing.php is the OTHER way into the same bundle: the rows alone, included by the archive-list block wherever it sits in the archive record's content, so the rows land between blocks arranged in the editor. render.php reaches that file with fabrement_listing().
Rules: get-skill-doc {id:"archive-page-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| js | No | view.js contents (enqueued in the footer). Omit to keep; delete with remove. | |
| css | No | style.css contents (enqueued when present). Omit to keep; delete with remove. | |
| php | No | The complete render.php contents (loops the main query). Required when creating; omit to keep. | |
| name | Yes | Bundle slug (lowercase, hyphens; the folder name; unique across single AND archive bundles). | |
| edits | No | Fragment replacements per file of the EXISTING bundle, instead of re-sending it. A file is sent whole OR edited, not both. | |
| hooks | No | hooks.php — PHP run on `init` before render, on every FRONT-END request (never admin, REST, cron or WP-CLI): the only place to touch the MAIN query (pre_get_posts); every callback guards is_admin(), is_main_query() and the exact view. Omit to keep; delete with remove. | |
| logic | No | How it WORKS: the query it runs, the URL params it reads, the meta keys, what an empty result renders. This is what the next session reads instead of your PHP. | |
| title | No | Human name shown in the pickers (default: the slug). | |
| remove | No | Files to delete: css, js, hooks, listing. An EMPTY value ("") never deletes — it counts as not sent. render.php cannot be removed (delete the bundle instead). | |
| listing | No | listing.php — the ROWS ALONE, a second way into this bundle. The archive-list block, placed in the archive record's content, includes this file at its position, so the rows sit between blocks arranged in the editor instead of render.php owning the whole content area. It prints the listing and nothing around it: no page furniture, no fabrement_archive_content() — those are already drawn around it. render.php reaches the same file with fabrement_listing(), so write the rows here once rather than in both. Omit to keep; delete with remove. | |
| summary | Yes | REQUIRED on every save: what you did THIS save. Kept as the bundle history (last 10) — the next session reads it for context. | |
| contexts | No | Views this body was written for: "singular:post", "archive:project", "blog-home". A note for the next session and for list-*; nothing enforces it — the platform only checks singular-vs-archive when a rule is wired. | |
| requires | No | What it needs to work: {postTypes:[…], meta:[…]}. A note for whoever copies the bundle to another site; nothing checks it at runtime. | |
| description | No | What the page SHOWS — how the next session recognises it in a listing. | |
| expectedHash | No | `hash` from the get tool. If any file changed since, nothing is saved. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hash | No | Of the saved bundle — expectedHash for the next save. |
| name | Yes | |
| path | Yes | |
| hasJs | No | |
| logic | No | |
| title | No | |
| hasCss | No | |
| contexts | No | |
| hasHooks | No | |
| requires | No | |
| hasListing | No | |
| description | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses the optimistic-concurrency behavior ('if any file changed since, nothing is saved'), the edits all-or-none semantics, that summary is required on every save while description/logic are required on create and on php/js/hooks changes, and that hooks.php runs on every front-end request but never admin/REST/cron/WP-CLI.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and mode, then the file roles, then the contract-doc rule; every sentence carries information. It is dense and the listing.php explanation partly duplicates the schema's own listing description, so it is not maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter, nested-schema mutation tool with an output schema, the description covers the file model, the create-vs-edit decision, required metadata, hash conflict handling, and the workflow handoff. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains the whole-file-vs-edits choice, the required/conditional status of summary, description and logic, and the rule that render.php cannot be removed while an empty remove value counts as not sent. It stops short of restating the per-mode edit syntax, which the schema already covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create or change an ARCHIVE bundle') plus what it produces (fills a template's CONTENT area on an archive view) and which files it comprises. It also distinguishes the two entry points into the bundle (render.php vs listing.php) and names the sibling it hands off to (assign-template-archive) and the read tool (get-archive-page).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the two modes explicitly ('Send files whole, or change an existing bundle with edits + expectedHash'), states prerequisites ('read archive-page-contract before the first call'), and describes the follow-up step ('Returns the path for a contentSource rule; then assign-template-archive'). Alternatives and ordering are spelled out rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-save-contentSave contentAInspect
Create a page/post/custom-type record from deployed blocks, or UPDATE one by contentId. There is no status argument: a new record is always a DRAFT, an update keeps its status, and publishing is set-content-status, after the user agrees. mode is REQUIRED and has no default: create (new record, no contentId) · add (blocks are ADDED after the body already there) · replace (the body becomes exactly blocks) · edit (change part of it through edits). Title applies when given. blocks[] entries are {name: registered Fabrement block, attributes} or {markup: core-block markup for prose}. list-content BEFORE creating; get-content BEFORE changing a record. To change part of a body use mode "edit" with edits (update/text/insert/replace/remove/move by index + name) and expectedHash — never re-send every block for a small change. parent nests a record under another of a hierarchical type; menuOrder orders siblings.
Rules: get-skill-doc {id:"content-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | Required — there is no default. create: a NEW record; contentId must be absent. The other three act on an existing contentId. add: `blocks` are ADDED AFTER the body already there — this is how a record ends up holding two copies of itself when replace was meant. replace: the body becomes exactly `blocks`. edit: change part of the body through `edits`, without re-sending every block. | |
| slug | No | URL slug. Omitted: derived from the title on create, kept on update. Give it when the address matters. Also when the title is not Latin: a Cyrillic title becomes a percent-encoded URL. Changing it on a published record moves that page. | |
| edits | No | mode "edit" only. Applied in order to the body get-content returned; all or none. | |
| title | No | Title for the new record; on update (contentId set) renames it when given. | |
| blocks | No | Ordered list of blocks to insert. EMPTY creates an empty record — what the posts-index page needs, since WordPress replaces its content with the loop. | |
| parent | No | Parent record id — hierarchical types only (list-post-types `hierarchical`: pages, and custom types made hierarchical). The record then lives at /parent-slug/its-slug/. Same type, not in the trash, not the record itself or one of its children. 0 = top level. Create: default 0. Update: absent = kept. | |
| excerpt | No | Short plain-text summary for cards, archives and search — a body of Fabrement blocks yields NO automatic excerpt, so set it whenever the record will be listed. On update: given = replaced, "" = cleared, absent = kept. | |
| postType | No | Type for the NEW record — any public type from list-post-types; default "page". | |
| contentId | No | Existing record id (list-content) to UPDATE. Omit to create a new one. | |
| menuOrder | No | Place among records with the same parent (WordPress "Order"): lower first, ties by title. Page lists and list-content {orderby:"menuOrder"} follow it. Create: default 0. Update: absent = kept. | |
| expectedHash | No | mode "edit": `hash` from get-content. If the body changed since, nothing is saved. | |
| featuredImage | No | Attachment id (upload-media / list-media) for the featured image — the thumbnail cards and archives show. Must be an image; on update absent = kept. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Publicly reachable only when status is "publish". |
| note | Yes | |
| slug | No | The slug as stored — sanitised, and suffixed when the address was taken. |
| blocks | Yes | What was actually written, in order. |
| parent | No | Parent id AS STORED; 0 = top level. |
| status | Yes | Status AFTER the call, read back from WordPress: "draft" for a new record, unchanged on update. |
| editUrl | Yes | |
| excerpt | No | The summary as stored AFTER the call — empty means this record still has none. |
| contentId | Yes | New on create, the same one back on update. Feeds set-post-terms and update-site-settings. |
| menuOrder | No | |
| featuredImage | No | The featured image AFTER the call; id 0 = none is set. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so: new records are always DRAFT, updates keep their status, `mode` is REQUIRED with no default, `edit` is all-or-none and guarded by expectedHash, and `add` is flagged as the trap that duplicates a body. It even states the skill-doc read requirement before the first call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core create/update purpose, and the dense · separated clauses are efficient for a 12-parameter tool. There is some redundancy — the mode enumeration and semantics are re-explained in the schema — but little is wasted given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described. For a mutation tool with no annotations and 12 parameters, the description covers the safety-relevant behavior (draft status, hash guard, add-vs-replace pitfall), prerequisites, and nesting/ordering — nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond it: it explains what each mode does to the body, that `parent` nests under a hierarchical type, that `menuOrder` orders siblings, and that `title` applies when given. The mode semantics are largely restated from the schema, which caps this at 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource pair ('Create a page/post/custom-type record from deployed blocks, or UPDATE one by contentId') and distinguishes create from update in the first clause. It also carves out what this tool is NOT (publishing is set-content-status), separating it cleanly from siblings like set-content-status and get-content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit prerequisites are given ('list-content BEFORE creating; get-content BEFORE changing a record') and the correct mode is prescribed for the partial-change case ('To change part of a body use mode "edit" with `edits` ... never re-send every block for a small change'). It also routes publishing to the right sibling only 'after the user agrees', leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-save-design-systemSave design systemAInspect
Update the design system this site paints with: colours (the 16 canonical roles), typography, button variants. Sections you send MERGE over the current ones (replace:true swaps them); tokens go live on :root at once. Refused when the site has none selected. The save lands on THIS SITE first and is then copied to the project — synced:false means the site has it and the project does not (signed out, or the backend unreachable), which is not a failure to retry. get-design-system first.
Rules: get-skill-doc {id:"design-system-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| colors | No | Role → "#rrggbb", the 16 canonical roles only (design-system-contract §3). E.g. {"primary":"#c42b35","accent":"#ffa32b"}. | |
| buttons | No | Variant slug → {style} with the button builder's fields — padding, radius, border, font, hover*, mobile*, and colours as EITHER a hex #rrggbb OR a colour role name ("primary", "onPrimary", …). A role keeps the button following the site when that colour changes, so prefer it (design-system-contract §5). An existing variant keeps the fields you omit. | |
| replace | No | Replace each provided section wholesale instead of merging (default false). | |
| typography | No | {headingFont?, bodyFont?, displayFont?, accentFont?, weights?:{heading,body,display,accent}, loadWeights?:{heading:["500","400i"]}, scale?:{h1..h6,body,small}, scaleUnit?:"px"|"rem"|"em"}; a size is a CSS length or {desktop,tablet,mobile}. Omitted roles keep their size. display/accent are EXTRA faces — set them only when the design shows a third typeface; loadWeights adds cuts beyond the role's own weight, "400i" being the italic one — ask only for cuts the family actually HAS (design-system-contract §4). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| note | Yes | |
| synced | No | Whether the site's copy also reached the project. |
| syncNote | No | |
| savedColors | Yes | Written by THIS call — a role you sent that is missing here did not land. |
| savedButtons | Yes | |
| effectiveColors | Yes | All roles AFTER the merge, not just this call's. With replace:true, roles absent here were dropped. |
| savedTypography | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: merge-vs-replace semantics ('Sections you send MERGE... replace:true swaps them'), the immediate side effect on :root, the write path (site first, then copied to the project), and the meaning of a partial sync result. This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and merge semantics, with rules and prerequisites at the end. It is dense and packs parenthetical asides and backticked field references, making sentences long, but nearly every clause carries actionable information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-annotation mutation tool with nested objects, the description covers preconditions, merge/replace behavior, side effects, and result interpretation, and it points to the skill doc for the deep contract. An output schema exists, so return-value detail is correctly deferred.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents colors, buttons, replace (including merge vs wholesale), and typography in detail. The prose mostly restates that; it does add the merge default behavior framing and the 'tokens go live at once' effect, but no syntax or format detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb (Update) on a specific resource (the design system this site paints with) and enumerates the covered sections: colours (16 canonical roles), typography, and button variants. It is immediately distinguishable from the read sibling (get-design-system) and create-design-system.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a prerequisite ('get-design-system first'), a when-not condition ('Refused when the site has none selected'), and a required pre-read ('get-skill-doc {id:"design-system-contract"} — read it before the first call'). It even clarifies that a `synced:false` result 'is not a failure to retry', which is exactly the kind of guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-save-fieldsSave fieldsAInspect
Define the custom fields of a post type (fields, the form layout, or both; a section you leave out stays as it is). Editors then fill the values in the "Fabrement fields" box of the block editor (saved with Update); set-field-values sets them too. Site-wide settings are options pages: save-options-page. Read get-fields first and send its revision as expectedRevision. "fields" is the complete active list: start from get-fields, change it, send it all (without its "retired": true fields). Everything is checked before writing: on any error nothing is saved and the error starts with the path of the input to fix (e.g. "fields[2].sub_fields[0].name: ..."). Returns the stored fields. Rules: get-skill-doc {id:"fields-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Post type slug, e.g. "project" or "page". | |
| type | Yes | Owner kind: "post", any post type with an admin screen (page, post, a Fabrement CPT, a plugin's type). Site-wide settings are not fields of a type: they are options pages (get-options-page / save-options-page). | |
| fields | No | The COMPLETE list of active fields, as a whole. A field you leave out is retired (hidden, values kept), never deleted. get-fields lists retired ones with "retired": true: leave them out (they stay retired), or send one without "retired" to restore it. "key" may be left out. A field IS its name: a new name is a new, EMPTY field (there is no rename: to rename what editors see, change the label; a real name change is a migration, see fields-contract RENAMING). Each field, sub-fields included: {name, label (required, non-empty, ≤200: what editors see), description (required, non-empty, ≤2000: the hint editors see under the field), type (text|textarea|wysiwyg|number|true_false|select|icon|date_picker|date_time_picker|image|gallery|file|link|post_object|relationship|group|repeater), translation? (translate|copy|copy_once|ignore; what a language version gets: translate = its own words, seeded from the original and sent to translators (text/textarea/wysiwyg/link only); copy = one value for every language, locked in translations; copy_once = seeded once, then each language has its own (a price, a date or a picked record that differs per language); ignore = never touched. A repeater under copy takes its ROW LIST from the original, each sub-field following its own policy; a group under copy is one set whose sub-fields each follow their own policy (clearing it on the original clears only its copy sub-fields in translations). Omitted: translate for text/textarea/wysiwyg/link, copy for everything else; an existing field keeps its policy. It only matters once the site has several languages), required?, default?, format? (number: integer|decimal), min?/max? (number bounds; repeater/relationship/gallery item counts: max enforced, min only a hint shown in the form), choices? (select: [{value,label}]; icon: [{value: a library icon id from list-icons, e.g. "social/facebook", label}] — the editor picks one or uploads an image instead), postTypes? (post_object/relationship: the post type slugs that may be picked, e.g. ["project"]; omitted = any public type; see list-post-types), sub_fields? (group/repeater)}. name: a-z, digits, single underscores, starts with a letter, not with "fab_", at most 24 characters, no part only digits (step_2 is refused, step2 is fine); unique among siblings; templates read it with fabrement_get_field('name', $id). The type and number format of a name never change (a retired field keeps its name too): add a new field instead. The same top-level name on another post type is the same meta key, so it must have the same type and number format there. | |
| layout | No | Form layout only; never affects stored values. {tabs: [{label, items: [{field: <name or key of an active top-level field>, width?: 1/4|1/3|1/2|2/3|3/4|1, display?: block|row|table (repeater only)}]}]}. Fields not placed are shown after the tabs. Short numbers, dates and switches: 1/2 or 1/3; long text, wysiwyg and repeaters: 1. Omit layout for an automatic grid. | |
| expectedRevision | Yes | revision from get-fields; 0 for a post type without fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing atomic all-or-nothing validation ('on any error nothing is saved'), optimistic concurrency via expectedRevision, the deterministic error format ('fields[2].sub_fields[0].name: ...'), and partial-update semantics ('a section you leave out stays as it is'). With readOnlyHint=false and destructiveHint=false already set, this adds substantial non-obvious behavioral context about write safety.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long and dense, but the purpose is front-loaded in the first clause and the remaining sentences carry contract rules that an agent genuinely needs. The trailing 'Rules:' line is slightly buried and some nesting could be flattened, but there is little pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nested, 5-parameter mutation tool with no output schema, the description covers the missing pieces: return value ('Returns the stored fields'), concurrency contract, failure behavior, and partial-update semantics. An agent has everything needed to invoke this correctly on the first call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds procedural meaning the schema does not carry: that 'fields' is a complete replacement list, how retired fields should be omitted, and that expectedRevision comes from get-fields (0 for an unconfigured type). It stops short of syntax detail for layout beyond pointing at the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Define the custom fields of a post type (fields, the form layout, or both)'. It explicitly distinguishes itself from siblings — set-field-values ('sets them too') and save-options-page for site-wide settings — so an agent can route correctly without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States prerequisites explicitly ('Read get-fields first and send its revision as expectedRevision', 'Read get-skill-doc {id:"fields-contract"} before the first call') and names the alternatives for adjacent cases (set-field-values, save-options-page, get-fields). Nothing about when to reach for this tool is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-save-global-cssSave global CSSAInspect
Write the SITE-WIDE stylesheet (loaded on every page and in the editor) for rules no single block owns. Either css = the COMPLETE file (replaces; "" deletes) or edits = exact-fragment replacements of the current file — prefer edits for changes. Pass expectedHash from get-global-css. Block styles belong in the block.
Rules: get-skill-doc {id:"global-css-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| css | No | The COMPLETE stylesheet (replaces the current one). "" removes it. Not with `edits`. | |
| edits | No | Applied in order to one copy; all or none. `old` is an exact fragment (whitespace-insensitive fallback) that must match exactly once unless replaceAll. | |
| expectedHash | No | `hash` from get-global-css. If the file changed since, nothing is saved. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| hash | No | Of the saved file — use as expectedHash for the next save. |
| bytes | No | |
| saved | Yes | |
| exists | Yes | False after an empty save (the file was removed). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does so well: it discloses that `css` REPLACES the file, that "" deletes it, that edits are applied all-or-none in order to a single copy, that `old` must match exactly once unless replaceAll (with a whitespace-insensitive fallback), and that a stale expectedHash results in nothing being saved. What it omits is the authorization/permission profile and whether a save creates a restorable version (relevant given the sibling rollback-version/submit-version tools).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the highest-value fact (what this stylesheet is and when it applies) before the mode selection. Information density is very high for three sentences, though the heavy dash/em-dash punctuation and the trailing `Rules:` fragment make it slightly harder to parse than a cleaner two-block structure would.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description instead covers the things the schema cannot: mode selection, conflict handling, atomicity, and routing to the contract doc and to block-level style tools. It is close to complete; the reliance on an off-tool skill document to convey the full 'contract' is the only remaining gap for an agent operating without that doc.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters; the baseline would be 3. The description adds real meaning beyond it — the mutual exclusivity of `css` and `edits`, the preference order between them, and the provenance of expectedHash (from get-global-css) — which raises it above baseline without fully duplicating schema detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (write/save) and resource (the SITE-WIDE stylesheet, loaded on every page and in the editor), and immediately delimits scope: rules no single block owns. It names the counterpart tools (get-global-css for the hash) and explicitly routes block-level styles elsewhere, so an agent can distinguish it from the many other save-* siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit either/or operating mode (`css` = complete file, or `edits` = fragment replacements), states a preference (`prefer edits for changes`), specifies the prerequisite (pass expectedHash from get-global-css), and adds a when-NOT-to-use rule (block styles belong in the block). It even names a prerequisite read (get-skill-doc {id: "global-css-contract"}) and when to do it (before the first call).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-save-global-jsSave global JSAInspect
Write the SITE-WIDE script (front end only, deferred) for behaviour no single block owns. Either js = the COMPLETE file (replaces; "" deletes) or edits = exact-fragment replacements of the current file — prefer edits for changes. Pass expectedHash from get-global-js. Block behaviour belongs in the block's view.js.
Rules: get-skill-doc {id:"global-js-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| js | No | The COMPLETE script (replaces the current one). "" removes it. Not with `edits`. | |
| edits | No | Applied in order to one copy; all or none. `old` is an exact fragment (whitespace-insensitive fallback) that must match exactly once unless replaceAll. | |
| expectedHash | No | `hash` from get-global-js. If the file changed since, nothing is saved. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| hash | No | Of the saved file — use as expectedHash for the next save. |
| bytes | No | |
| saved | Yes | |
| exists | Yes | False after an empty save (the file was removed). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does it well: it discloses that this is a write/replace operation, that js replaces the whole file and "" deletes it, that edits are exact-fragment and applied all-or-none in order to one copy, and that a stale expectedHash means nothing is saved. What gets destroyed and the transactional/atomicity semantics are all stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the two modes, then the hash requirement, then the rule to read the contract doc. Dense and jargon-heavy, but every sentence carries distinct information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations it covers the essential gaps: destructive semantics, atomicity, concurrency guard, scope boundary versus blocks, and the required prerequisite document. An output schema exists, so return values need not be described, and no other material information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter-level details are already documented and the baseline is 3. The description still adds value beyond the schema by framing `js` and `edits` as a mutually exclusive either/or and stating a preference ('prefer `edits` for changes') plus the try-get-then-save hash workflow, though it repeats some schema content.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (write the site-wide script) and immediately bounds the scope: front end only, deferred, for behaviour no single block owns. It explicitly carves out what does NOT belong here (block behaviour -> the block's view.js), which is enough to distinguish it from siblings like save-global-css and the block tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('behaviour no single block owns'), when-not ('block behaviour belongs in the block's view.js'), an alternative for the common case ('prefer `edits` for changes'), and a required precondition (read get-skill-doc id=global-js-contract before the first call). The optimistic-concurrency step is tied to the sibling that produces the value (get-global-js).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-save-iconSave iconAInspect
Add an icon to the site library, or replace one, from EXACTLY ONE source: svg markup, or fileKey+nodeId of a Figma node (exported as vector). id = /, group one of brand, ui, feature, social, contact, flag; ids are permanent once a block names them. The markup is sanitised and its colours turned into CSS-driven paint per colorMode. list-icons FIRST.
Rules: get-skill-doc {id:"icons-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | <group>/<slug>, e.g. "ui/arrow-right". | |
| svg | No | The <svg> markup. Not with fileKey/nodeId. | |
| name | Yes | ||
| tags | No | ||
| nodeId | No | Figma node id, colon form ("12:34"). | |
| fileKey | No | Figma file key. With nodeId, instead of svg. | |
| colorMode | No | Default: original for brand/flag, mono otherwise. | |
| accentColor | No | duotone only, REQUIRED there: which of the icon's two colours (hex, as in the svg) is the accent. The other paints with CSS `color`. | |
| description | Yes | What it shows and where it fits — what list-icons shows the next session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses sanitisation of markup, color-to-CSS-paint conversion tied to colorMode, and that ids become permanent once a block references them. It omits what a replace does to existing consumers, error behavior on invalid source combinations, and the return shape, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then constraints, then rules. Dense but each sentence carries a distinct constraint. Slightly telegraphic styling ('Rules:', backticks, colons) costs a little readability but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A 9-parameter mutation tool with no annotations and no output schema is a demanding case, and the description covers source exclusivity, id semantics, color behavior, and a pointer to a contract doc. It stops short of stating return values or failure modes, leaving a modest gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 78% (high), so baseline is 3, but the description adds real semantics beyond the schema: the one-of relationship between svg and fileKey+nodeId, the enumerated group values for id, and the colorMode default logic. That is meaningful added meaning over the field-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'Add an icon to the site library, or replace one.' It further disambiguates by naming the two mutually exclusive input sources and the id format, so an agent can distinguish it from list-icons, get-icon, and delete-icon without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing and ordering rules: 'list-icons FIRST', 'read get-skill-doc {id:"icons-contract"} before the first call', and 'EXACTLY ONE source'. It also declares the permanence constraint on ids, which shapes when to be careful. This is unusually complete when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-save-options-pageSave options pageAInspect
Create or change an options page — site-wide settings such as contacts, social links, a header announcement or the footer, shown in wp-admin under "Site General Settings": its page settings, its fields and its tabs (a section you leave out stays as it is). Read get-options-page first and send its revision as expectedRevision; 0 with a new slug creates the page and needs page.title. "fields" is the complete active list, as in save-fields. Values are filled on the page, or with set-field-values {options: slug}. Everything is checked before writing; an error names the input to fix. Rules: get-skill-doc {id:"options-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | How the page shows in wp-admin. {title (required for a new page), menuTitle? (tab label, "" = title), description? (a line above the form), position? (0–1000, lower first among the tabs of Fabrement → Site General Settings; default 100), autoload? (true, the default: its values load with every request — right for what the header, footer or most pages show; false for a big page read on a few screens only)}. A property left out keeps its value. | |
| slug | Yes | The options page slug, e.g. "site", "header", "footer" (list-options-pages); a-z, 0-9, _ and -, no "__", at most 32. | |
| fields | No | The COMPLETE list of active fields, as a whole. A field you leave out is retired (hidden, values kept), never deleted. get-fields lists retired ones with "retired": true: leave them out (they stay retired), or send one without "retired" to restore it. "key" may be left out. A field IS its name: a new name is a new, EMPTY field (there is no rename: to rename what editors see, change the label; a real name change is a migration, see fields-contract RENAMING). Each field, sub-fields included: {name, label (required, non-empty, ≤200: what editors see), description (required, non-empty, ≤2000: the hint editors see under the field), type (text|textarea|wysiwyg|number|true_false|select|icon|date_picker|date_time_picker|image|gallery|file|link|post_object|relationship|group|repeater), translation? (translate|copy|copy_once|ignore; what a language version gets: translate = its own words, seeded from the original and sent to translators (text/textarea/wysiwyg/link only); copy = one value for every language, locked in translations; copy_once = seeded once, then each language has its own (a price, a date or a picked record that differs per language); ignore = never touched. A repeater under copy takes its ROW LIST from the original, each sub-field following its own policy; a group under copy is one set whose sub-fields each follow their own policy (clearing it on the original clears only its copy sub-fields in translations). Omitted: translate for text/textarea/wysiwyg/link, copy for everything else; an existing field keeps its policy. It only matters once the site has several languages), required?, default?, format? (number: integer|decimal), min?/max? (number bounds; repeater/relationship/gallery item counts: max enforced, min only a hint shown in the form), choices? (select: [{value,label}]; icon: [{value: a library icon id from list-icons, e.g. "social/facebook", label}] — the editor picks one or uploads an image instead), postTypes? (post_object/relationship: the post type slugs that may be picked, e.g. ["project"]; omitted = any public type; see list-post-types), sub_fields? (group/repeater)}. name: a-z, digits, single underscores, starts with a letter, not with "fab_", at most 24 characters, no part only digits (step_2 is refused, step2 is fine); unique among siblings; templates read it with fabrement_get_field('name', $id). The type and number format of a name never change (a retired field keeps its name too): add a new field instead. The same top-level name on another post type is the same meta key, so it must have the same type and number format there. | |
| layout | No | Form layout only; never affects stored values. {tabs: [{label, items: [{field: <name or key of an active top-level field>, width?: 1/4|1/3|1/2|2/3|3/4|1, display?: block|row|table (repeater only)}]}]}. Fields not placed are shown after the tabs. Short numbers, dates and switches: 1/2 or 1/3; long text, wysiwyg and repeaters: 1. Omit layout for an automatic grid. | |
| expectedRevision | Yes | revision from get-options-page; 0 creates a new page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: optimistic concurrency via expectedRevision, partial-update semantics ('a property left out keeps its value'), non-destructive omission behavior (fields are retired, never deleted), pre-write validation with errors naming the offending input, and the requirement to complete a contract skill-doc step first. The annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false) are consistent with this and the description adds substantial operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by prerequisites, cross-references, and validation behavior in a compact progression. A few clauses duplicate schema content (e.g. 'fields is the complete active list'), but no sentence is fully wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, nested, five-parameter mutation tool with no output schema, the description covers prerequisites, create-vs-update discrimination, validation behavior, and sibling delegation. It does not describe the success return shape, but the annotation and the contract-doc pointer cover most of what an agent needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents every parameter in depth (page, slug, fields, layout, expectedRevision). The description largely restates schema content and adds only cross-references (save-fields, set-field-values, fields-contract), which is the expected baseline when the schema carries the detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (create or change) and resource (an options page), scoped to site-wide settings shown under 'Site General Settings', with concrete examples (contacts, social links, header announcement, footer). It also enumerates the sub-parts it manages (page settings, fields, tabs), making it easy to distinguish from save-fields, save-content, or set-field-values.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit prerequisites and channels: read get-options-page first and pass its revision as expectedRevision; use 0 with a new slug to create (requiring page.title); read the options-contract skill doc before the first call. It also routes value entry to set-field-values {options: slug} and the field list convention to save-fields, so the agent knows when this tool applies versus its neighbors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-save-single-pageSave single pageAInspect
Create or change a single-page bundle — render.php + optional style.css, view.js, hooks.php — that fills a template's CONTENT area with a layout a block cannot express. Send files whole, or change an existing bundle with edits (fragment replacements per file) + expectedHash from get-single-page. summary is required on every save; description and logic on create and whenever php/js/hooks change. Returns the path a contentSource rule points at.
Rules: get-skill-doc {id:"single-page-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| js | No | view.js contents (enqueued in the footer). Omit to keep; delete with remove. | |
| css | No | style.css contents (enqueued when present). Omit to keep; delete with remove. | |
| php | No | The complete render.php contents. Required when creating; omit to keep. | |
| name | Yes | Bundle slug (lowercase, hyphens; the folder name). | |
| edits | No | Fragment replacements per file of the EXISTING bundle, instead of re-sending it. A file is sent whole OR edited, not both. | |
| hooks | No | hooks.php — PHP run on `init` before render, on every FRONT-END request (never admin, REST, cron or WP-CLI): the only place to touch the MAIN query (pre_get_posts); every callback guards is_admin(), is_main_query() and the exact view. Omit to keep; delete with remove. | |
| logic | No | How it WORKS: the query it runs, the URL params it reads, the meta keys, what an empty result renders. This is what the next session reads instead of your PHP. | |
| title | No | Human name shown in the pickers (default: the slug). | |
| remove | No | Files to delete: css, js, hooks. An EMPTY value ("") never deletes — it counts as not sent. render.php cannot be removed (delete the bundle instead). | |
| summary | Yes | REQUIRED on every save: what you did THIS save. Kept as the bundle history (last 10) — the next session reads it for context. | |
| contexts | No | Views this body was written for: "singular:post", "archive:project", "blog-home". A note for the next session and for list-*; nothing enforces it — the platform only checks singular-vs-archive when a rule is wired. | |
| requires | No | What it needs to work: {postTypes:[…], meta:[…]}. A note for whoever copies the bundle to another site; nothing checks it at runtime. | |
| description | No | What the page SHOWS — how the next session recognises it in a listing. | |
| expectedHash | No | `hash` from the get tool. If any file changed since, nothing is saved. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hash | No | Of the saved bundle — expectedHash for the next save. |
| name | Yes | |
| path | Yes | |
| hasJs | No | |
| logic | No | |
| title | No | |
| hasCss | No | |
| contexts | No | |
| hasHooks | No | |
| requires | No | |
| hasListing | No | |
| description | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the concurrency guard (expectedHash — nothing is saved if a file changed), the conditional requirements for summary/description/logic, and the return value. It still omits failure modes and whether an update is overwrite-in-place, but covers the key behavioral traits effectively.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then workflow, then a terse Rules line. Dense but every clause carries information (file list, edits mechanism, hash guard, return value, prerequisite). The opening sentence is long, which is the only structural cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter tool with nested edit objects, no annotations, and an output schema, the description supplies the missing workflow context: the read-before-write contract, the whole-vs-edit decision, and the hash precondition. Remaining gaps (failure behavior, idempotency) are minor given the rich schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema: it specifies that summary is required on every save and that description and logic are required on create and whenever php/js/hooks change, and it frames edits as mutually exclusive with whole-file sends.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (create or change) and a concrete resource (single-page bundle) with its constituent files, and articulates the intent: fills a template's CONTENT area with a layout a block cannot express. This explicitly distinguishes it from the block-oriented sibling fabrement-create-block.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use context (layout a block cannot express) and the conditional workflow: send files whole, or use `edits` + expectedHash from get-single-page for an existing bundle. It also names a prerequisite (read the single-page-contract skill doc before first call). It stops short of explicitly naming sibling alternatives to use instead, so a 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-save-synced-patternSave synced patternAInspect
Create a GLOBAL BLOCK (synced pattern) from deployed blocks, or change one by patternId — every page placing it changes with it. mode is REQUIRED and has no default: create (new pattern, no patternId) · replace (the body becomes exactly blocks) · edit (change part of it through edits). blocks[] as in save-content ({name, attributes} or {markup}); must hold at least one Fabrement block. Change part of an existing one with mode "edit" + edits + expectedHash from get-synced-pattern. Place it on a page with save-content {name:"core/block", attributes:{ref: patternId}}.
Rules: get-skill-doc {id:"synced-pattern-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | header / footer: a template's frame (save-template headerPatternId), filed under that pattern category. section (default on create): placed on pages. Omit on update to keep. | |
| mode | Yes | Required — there is no default. create: a NEW pattern; patternId must be absent. replace: the body of that pattern becomes exactly `blocks`. edit: change part of it through `edits`, without re-sending every block. | |
| edits | No | mode "edit" only. Applied in order to the body get-content returned; all or none. | |
| title | No | Required on create; the name admins pick it by. | |
| blocks | No | The whole body (create, or replace an existing one). | |
| patternId | No | Omit to create. | |
| allowForeign | No | Change a pattern that also holds blocks of a theme or another plugin (`foreign`). | |
| expectedHash | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | header / footer (placed by templates) or section (placed on pages). |
| title | Yes | |
| blocks | Yes | |
| usedBy | Yes | Records this change reached. |
| created | No | |
| editUrl | No | |
| patternId | Yes | |
| placement | No | The markup that places it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses that edits are all-or-none, that mode has no default, that blocks[] must hold at least one Fabrement block, and that changes propagate to every page using the pattern. It doesn't address permissions or recoverability explicitly, but the global-effect warning covers the key mutation risk.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph that front-loads purpose before enumerating modes and rules. Everything is relevant, though the mode list and rules sentence compress a lot, making it heavy for a first read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-param tool with a nested edits array, the description covers the mode workflow, the hash requirement, and points to the contract doc, and an output schema exists so return values need no explanation. The main omission is any explicit note on preconditions/permissions for mutating a globally shared pattern.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 88%, so the schema documents most parameters; the description still adds cross-parameter meaning the schema cannot, tying mode to whether patternId is absent, linking edit to expectedHash from get-synced-pattern, and restating the blocks[] shape. This is above the baseline-of-3 case for high-coverage schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (create/change) and resource (GLOBAL BLOCK / synced pattern), and distinguishes itself from save-content and save-template. The "every page placing it changes with it" framing makes the global scope of the object unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly enumerates when to use each mode (create=no patternId, replace=body becomes blocks, edit=change part via edits) and routes to get-synced-pattern for the hash and save-content for placement. It also mandates reading get-skill-doc {id:"synced-pattern-contract"} before the first call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-save-templateSave templateAInspect
Create a site template — a header+footer frame around pages — or UPDATE one by templateId; every field is omit-to-keep. Check list-templates first: edit the existing one rather than make a duplicate. The header and footer are GLOBAL BLOCKS: find one with list-synced-patterns {kind:"header"}, or make one with save-synced-pattern {title, kind:"header", blocks}, then pass its id as headerPatternId. Rules: get-skill-doc {id:"template-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Display name. Required on create; omit on update to keep. | |
| afterSlot | No | Blocks rendered BELOW the content on every page this template dresses. Read the current ones from get-template; a passed list REPLACES the zone, [] clears it, omitted keeps it. | |
| beforeSlot | No | Blocks rendered ABOVE the content on every page this template dresses. Read the current ones from get-template; a passed list REPLACES the zone, [] clears it, omitted keeps it. | |
| templateId | No | Template id to UPDATE (list-templates); omit to create. | |
| contentWidth | No | Width of the content area; "full" on create. | |
| contentSource | No | What the content slot renders: per-view `rules`. Without a rule for a view — or with contentSource omitted — the slot renders the page's own content. | |
| footerPatternId | No | The footer global block (list-synced-patterns {kind:"footer"}); same rules. | |
| headerPatternId | No | The header GLOBAL BLOCK (list-synced-patterns {kind:"header"}). Its words are changed with save-synced-pattern, never here. Create: omit = no header. Update: omit = keep, 0 = remove. |
Output Schema
| Name | Required | Description |
|---|---|---|
| template | Yes | |
| ruleWarnings | No | Rules you sent that were already stored and can no longer render (their view or file is gone). They were KEPT; leave one out of contentSource to remove it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it explains omit-to-keep semantics, the replace/clear/keep behaviour of the zone lists, that header/footer are global blocks edited elsewhere, and that a contract doc governs the operation. It does not cover failure modes, permissions, or reversibility, so it stops short of exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the create/update purpose, followed by the dedupe instruction and the global-block workflow, then a final rule line. Dense but each sentence earns its place for an 8-parameter tool with nested objects; only the density slightly taxes readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, 8-param nested-object mutation with an output schema (so return values need not be explained), the description covers the purpose, the omit-to-keep contract, the required prerequisite doc, and the header/footer global-block dependency. What remains thin is error/permission behaviour, but the operational essentials are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter (templateId, headerPatternId, beforeSlot/afterSlot, contentSource rules, etc.). The description mostly restates the create/update and global-block wiring rather than adding format or syntax details beyond the schema, which is the expected baseline when coverage is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (Create / UPDATE) on a clearly defined resource ('a site template — a header+footer frame around pages'), and explicitly tells the agent when it is a create vs an update via templateId. It also routes the reader to the relevant siblings (list-templates, save-synced-pattern), so it is distinguishable without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: 'Check list-templates first: edit the existing one rather than make a duplicate,' plus a hard prerequisite ('read [template-contract] before the first call') and the correct alternative path for building the header (list-synced-patterns / save-synced-pattern). Nothing about selecting this tool over alternatives is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-set-archive-recordSet archive recordAInspect
Edit the page that describes a post-type archive: its title (the archive's heading and the fallback of its SEO title) and slug. Addressed by {postType}. Its SEO (title, metaDesc, noindex, og…) is set-seo {archive: postType}. Its own words (an intro above the listing, an FAQ under it) are the page's BLOCKS, not a field here: save-content {contentId: pageId from list-archive-records}. WARNING: slug IS the archive address — changing it moves /books/, its pagination and its feed, and the old URL stops answering. Rules: get-skill-doc {id:"seo-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | THE ARCHIVE ADDRESS. Changing it moves the archive and 404s the old URL. | |
| title | No | The page title. The SEO title falls back to it when set-seo {archive} set none. | |
| postType | Yes | The type whose archive this describes (list-archive-records). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it warns that changing slug moves the archive, its pagination and feed, and 404s the old URL (a destructive consequence), clarifies title as the SEO-title fallback, and states blocks are not a field here. This is rich disclosure beyond any structured field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by alternatives, a WARNING, and a rule. It is dense with cross-references but every sentence earns its place; slightly packed for readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description supplies purpose, parameter meaning, destructive consequences, prerequisites, and sibling routing. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: slug IS the archive address, and title is both the heading and the SEO-title fallback. It reinforces and extends what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (set/edit) and resource (the page describing a post-type archive), and names exactly what it edits (title, slug). It explicitly distinguishes itself from siblings set-seo and save-content, so an agent can route without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes SEO fields to set-seo {archive: postType}, intro/FAQ content to save-content, and instructs reading get-skill-doc {id:"seo-contract"} before the first call. When-to-use and alternatives are both named with conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-set-content-statusSet content statusADestructiveInspect
Change a page/post/custom record's status — everything reversible: "publish", "draft" (unpublish), "trash" (recoverable), "restore" (out of the trash, with the status and address it had before; find trashed records with list-content {status:"trash"}). Records are created and edited as drafts with save-content; deleting for good is delete-content. ASK THE USER FIRST, IN THE SAME TURN, for "publish" and for "trash", and wait for the answer — naming the record and what will happen to it. PUBLISH puts the page in front of everyone and in front of search engines at once, and a crawled URL is not un-crawled by reverting the status; TRASH takes a live page off the site, so every link and every menu entry pointing at it breaks while it sits there. Neither is yours to decide. "Finish this page" is not consent to publish it; preview {target:"content"} shows a draft at its real address without making it public, which is what verifying looks like. Rules: get-skill-doc {id:"content-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Default "publish". "draft" unpublishes; "trash" moves to the trash; "restore" takes it out. | |
| contentId | Yes | Content id (see list-content). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| title | No | |
| status | Yes | Status AFTER the call, read back from WordPress. |
| changed | No | False when it already had that status. |
| postType | No | |
| contentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only destructiveHint=true in annotations, the description carries the safety burden well: it explains the side effects of PUBLISH (public at once, search-engine crawling that reverting does not undo) and TRASH (live links and menu entries break), plus the draft-by-default creation model and an authorization/consent requirement. The only soft spot is the opening claim "everything reversible," which the later text partially walks back, but the disclosure of what actually happens is unusually rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and status list are front-loaded, followed by sibling routing, consent requirements, and a rules pointer. It is longer than a 2-parameter tool normally warrants and repeats the publish warning, but nearly every sentence carries a safety-relevant distinction, so little is pure padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description still covers side effects, sibling routing, consent, and a prerequisite (read the content-contract skill doc first). Nothing an agent needs to call this destructively-correct is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes beyond the schema by explaining restore semantics (returns the record with its prior status and address) and by cautioning that reverting status does not reverse crawling. It adds real meaning over the enum definitions rather than restating them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Change a page/post/custom record's status") and enumerates all four enum values with plain-language definitions. It explicitly distinguishes this tool from save-content (creates/edits as drafts), delete-content (permanent removal), and list-content (finding trashed records), so an agent can separate it from siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use rules, names the alternatives for adjacent operations (save-content, delete-content, list-content), and adds a hard consent gate for "publish" and "trash" including a counter-example ("Finish this page" is not consent) and the verifying path (preview). This is as directive as usage guidance gets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-set-default-templateSet default templateAInspect
Make a template the DEFAULT frame for one post type (one default per type — replaces the previous one; 0 clears). This is the one call for a whole-site header/footer; assign-template-pages is for per-page exceptions. postType "404" = the frame of every not-found address (its body: a contentSource rule with context "404", else the notFoundPage). Rules: get-skill-doc {id:"template-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| postType | No | Post type the default applies to (default "page"), or "404" for the not-found view. | |
| templateId | Yes | Template id from list-templates; 0 clears the default. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Present only when something about this site keeps the default off a page it would otherwise wrap. |
| postType | Yes | |
| defaultFor | Yes | |
| templateId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden and does disclose the key mutation semantics: one default per post type, it replaces the previous default, and 0 clears it. It also explains the 404 special-case body rule. It does not cover auth/permission needs or what happens to posts currently relying on a replaced default, so it falls short of fully compensating for missing annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are front-loaded, and the sibling distinction is compact and useful. The trailing 404-body sentence and the skill-doc rule add value but make the text dense; wording like "its body: a contentSource rule with context 404" is cryptic and could be tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. The description covers scope, mutation/replacement behavior, the 404 special case, and the alternative tool, which is sufficient for an agent to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it clarifies that postType "404" maps to the frame of every not-found address and details that body's rules (contentSource with context "404", else notFoundPage). It reinforces the one-per-type and 0-clears semantics for templateId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (make default) and resource (template as the DEFAULT frame for one post type), and explicitly distinguishes itself from assign-template-pages. An agent can tell what this does and where it sits relative to siblings without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative (assign-template-pages) and the condition that selects it (per-page exceptions vs. whole-site default), and adds a required precondition (read the template-contract skill doc before the first call). Nothing about when to use this vs. alternatives is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-set-field-valuesSet field valuesAIdempotentInspect
Fill the Fabrement fields of one record (post, page or CPT item) or of an options page. Keys of "values" are field names from get-fields; fields you do not send stay as they are; null clears a field back to its default. Every value is checked first (type, choices, dates YYYY-MM-DD / date-times YYYY-MM-DDTHH:MM in the site's time zone, no offset, number bounds, allowed post types, existing media/records, safe link addresses, required) and one bad value rejects the whole call, with the path of the value to fix. Value shapes: text/textarea/wysiwyg/date → string; select → the choice's value (not its label); number → number; true_false → boolean; icon → {key: one of its choices, e.g. "social/facebook", media: {} or {id: an uploaded image}}; image/file/post_object → attachment or post ID (0 = none); relationship → list of post IDs, gallery → list of image IDs (both ordered, at most 50); link → {url, label?, newTab?} or {postId, label? | useRecordTitle: true} (send label or useRecordTitle:true, or the link shows no words); group → {subName: value}; repeater → the COMPLETE list of rows [{_row?, subName: value}]. Keep the "_row" that get-field-values gives each existing row: it is the row's identity. A row without "_row" is new while other rows carry one; with no "_row" at all rows are matched by position. A stored row you leave out is deleted. When something changed, a record is saved as with its Update button (modified date, SEO, caches). No conflict check: the last save wins. Rules: get-skill-doc {id:"fields-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| postId | No | ID of the post, page or CPT record. Send this OR options. | |
| values | Yes | field name => value. See the tool description for shapes. | |
| options | No | Slug of an options page (list-options-pages). Send this OR postId. | |
| valuesToken | No | Not used; leave it out. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already covering readOnly/destructive/idempotent hints, the description adds substantial non-obvious behavior: full validation pass with whole-call rejection and the failing path, row identity via '_row', positional matching fallback, deletion of stored rows that are omitted, the Update-button side effects (modified date, SEO, caches), and the absence of conflict checks ('last save wins'). The selective row deletion creates mild tension with destructiveHint=false, but it is disclosed rather than hidden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary action and the essential mental model, and nearly every sentence carries load-bearing detail (shapes, validation, row matching). It is a dense single block, though; the value-shape catalogue and the 'Rules:' line would read better as structured bullets, which slightly hurts scannability for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity nested-value mutation with no output schema, the description covers the write semantics, validation failure reporting, row lifecycle, and side effects. An agent has everything needed to construct a correct call without further lookup beyond the referenced skill doc.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes far beyond it with per-type value shapes (text/select/number/true_false/icon/image/relationship/link/group/repeater), the choice-value-not-label rule, ID-based media semantics, the 50-item cap, and the '_row' identity contract — all information the schema's generic 'field name => value' cannot convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fill the Fabrement fields of one record (post, page or CPT item) or of an options page'), plus the two target scopes (record vs options page). This cleanly separates it from sibling tools like save-fields (defines fields) and get-field-values (reads values).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells the agent where keys come from ('field names from get-fields'), that omitted fields are untouched, that null resets, and mandates reading get-skill-doc {id:"fields-contract"} before the first call. It stops short of an explicit when-to-use-this-vs-save-fields/set-post-terms routing statement, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-set-post-termsSet post termsAInspect
Classify one record: attach EXISTING terms (id|slug|name; create-term first) of ONE taxonomy. mode is REQUIRED and has no default: replace (the terms become exactly terms, anything else is dropped; [] clears) · add (these are added, the rest stay) · remove (these come off, the rest stay). The taxonomy must be attached to that post type. primary (Yoast SEO, hierarchical taxonomies) picks the main one among the terms of the record — the one its breadcrumbs and category URL use; 0 clears it.
Rules: get-skill-doc {id:"content-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | Required — there is no default. replace: the terms of this taxonomy on this record become exactly `terms`, so anything not listed is DROPPED and [] clears them. add: these terms are added, the rest stay. remove: these are taken off, the rest stay. | |
| terms | Yes | Term ids, slugs or exact names — each must already exist. | |
| primary | No | Optional, needs Yoast SEO: the MAIN term (id|slug|name) of a hierarchical taxonomy — one the record has after this call. Yoast uses it for the breadcrumb trail and the category in URLs; without it Yoast takes the deepest term. 0 clears it (back to the deepest term). | |
| taxonomy | Yes | Taxonomy slug (see list-taxonomies). | |
| contentId | Yes | The content id (list-content / save-content). |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | |
| terms | Yes | |
| primary | No | The main term id when one is set (Yoast); 0 = none. |
| taxonomy | Yes | |
| contentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden and does: it discloses that 'replace' DROPS unlisted terms and that [] clears, that 0 clears primary, that primary drives breadcrumbs and category URLs, and that the taxonomy must belong to the post type. Destructive consequences and a runtime dependency (Yoast SEO) are spelled out rather than left to inference.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and uses a '·' separator to compress the three modes into one line, which is efficient. It is dense and the 'Rules:' pointer is buried at the end, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-param mutation tool with no annotations, the description covers prerequisites, mode selection, destructive effects, and the optional Yoast-dependent primary parameter. An output schema exists, so return values need not be described, and nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents mode, terms, primary, taxonomy and contentId. The description largely mirrors that content (mode semantics, 'each must already exist', primary explanation); its value-add is cross-references like list-taxonomies and save-content rather than new parameter meaning, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Classify one record: attach EXISTING terms ... of ONE taxonomy') and immediately scopes it against the term-creation flow with 'create-term first'. An agent can tell this apart from create-term/update-term/delete-term without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear prerequisites (taxonomy must be attached to the post type; terms must already exist; primary needs Yoast SEO) and routes the agent to 'create-term first' when terms don't exist, plus a mandatory get-skill-doc read. It lacks explicit when-not-to-use framing versus other term tools, but the context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-set-post-type-starter-blocksSet post type starter blocksAInspect
Set the blocks a NEW record of a post type opens with in the editor (the editor template), with an optional lock. Affects records created after this call only; an empty list removes it. Names are registered block names from list-blocks or core ones like "core/heading". Rules: get-skill-doc {id:"content-model-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| lock | No | How firmly the starting blocks are held. Default "". | |
| blocks | Yes | Ordered blocks the editor starts with. Empty removes the template. | |
| postType | Yes | Registered post type (see list-post-types). |
Output Schema
| Name | Required | Description |
|---|---|---|
| lock | No | |
| blocks | Yes | |
| postType | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it discloses several non-obvious traits: only future records are affected, empty list clears the template, lock is optional, and a required skill-doc read precedes the first call. It omits permission/auth requirements and any failure behavior, but the mutation semantics are well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core effect and scope before the naming rule and prerequisite. Efficient overall, though the block-name guidance partially duplicates the schema's parameter description, which is mild waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation with an output schema (so return values need not be described) and no annotations, the description covers scope, lock, removal semantics, naming source, and a prerequisite doc. Adequate to call correctly; only auth/error behavior is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds that block names come from list-blocks or core names like 'core/heading' and that an empty list removes the template, but this largely repeats the schema's own 'name' and 'blocks' descriptions rather than adding new syntax or format detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb (set) plus the resource (the blocks a NEW record of a post type opens with / editor template), which an agent can distinguish from siblings like create-post-type or assign-template-pages without opening a schema. 'Affects records created after this call only' pins down the scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: it affects only records created afterward, and an empty list removes the template. It also names a prerequisite (read get-skill-doc 'content-model-contract' before the first call). It does not name a specific alternative tool, so it stops short of explicit when-not guidance, but the applicability boundary is well defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-set-schemaSet structured data (schema.org)AInspect
Attach schema.org JSON-LD nodes to ONE record {contentId, graph} or to EVERY record of a post type {postType, graph}. The node type is not an argument: it goes INSIDE graph, a list of nodes without @context — graph: [{"@type": "Event", "name": "{{title}}", …}]. Pieces of a post-type graph are a template with {{url}}, {{site_url}}, {{title}}, {{excerpt}}, {{featured_image}}, {{date_published}}, {{date_modified}} (Yoast's own values for the page), {{field:}} (a Fabrement field as the page shows it: default applied, image → URL, date-time → ISO with offset; group.sub, .label, .date, .title/.url/.fields. of a picked record), {{option:.}}, {{meta:}} (other plugins' fields), {{term:}} (a public one)… Unknown fields are refused; a protected meta key (leading "_") too; on a password-protected record excerpt, fields, meta and terms resolve empty. graph: [] removes them. The @id of a Yoast node (the page URL, #organization…) is refused: nodes are added to Yoast's graph, never swapped for its own. Refused when Yoast is not active. Returns the resolved preview and warnings — read both, then verify on the live page source.
Rules: get-skill-doc {id:"seo-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| graph | Yes | ||
| postType | No | ||
| contentId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| scope | Yes | |
| pieces | Yes | Nodes now stored for the scope (0 = removed). |
| preview | No | |
| postType | No | |
| warnings | No | Saved, but thinner than it looks: a property Google needs is missing, a token resolved EMPTY on the preview record (so it was dropped there), or a raw {{meta:fab_…}} where {{field:…}} fits. Absent when there is nothing to say. |
| contentId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does so richly: it lists refusal conditions (unknown fields, protected '_' meta keys, Yoast @id nodes, Yoast inactive), states that graph:[] removes nodes, and explains that password-protected records resolve fields/meta/terms as empty. It also notes nodes are added to Yoast's graph rather than replacing it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Core behavior is front-loaded in the first sentence and every clause is substantive, but the single dense paragraph with stacked parentheticals and ellipses is hard to scan. It is information-dense rather than padded, so it earns most of its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists (preview + warnings), and the description adds that the agent should read both and verify on live page source. Most edge cases are covered, though it never states what happens if both contentId and postType are supplied, leaving one ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate and it does: it explains the {contentId, graph} vs {postType, graph} modes, that node type lives inside graph (not as an argument), and enumerates the full template placeholder vocabulary ({{url}}, {{field:<name>}}, {{option:...}}, {{meta:...}}, {{term:...}}) with resolution rules.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource (attach schema.org JSON-LD nodes) and two distinct scopes: one record via {contentId, graph} or every record of a post type via {postType, graph}. This clearly separates it from siblings like fabrement-set-seo or fabrement-save-content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to fabrement-get-skill-doc {id:"seo-contract"} before the first call and states the precondition that Yoast must be active or the call is refused. It does not directly contrast against other SEO siblings, so it stops short of the 5 bar, but the operating context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-set-seoSet SEO for a recordAInspect
Set the Yoast fields of ONE record (contentId), ONE term archive (termId — a category, tag or term of a custom taxonomy) or ONE post-type archive (archive: the post type, e.g. "book" for /books/): title, metaDesc, focusKeyword, canonical, noindex/nofollow, robotsAdvanced, schemaPageType/ArticleType, og*/twitter*. A term takes title, metaDesc, focusKeyword, canonical, noindex, breadcrumbTitle, cornerstone, og*/twitter* only. Send only what changes; "" or null clears a field. Refused when Yoast is not active. Custom schema nodes go through set-schema. Verify with get-seo {contentId} / {termId} / {archive}. Rules: get-skill-doc {id:"seo-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| termId | No | A term (list-terms): the SEO of its archive page. | |
| archive | No | A post type (list-archive-records): the SEO of its archive — the record that describes it. | |
| noindex | No | ||
| ogTitle | No | ||
| metaDesc | No | ||
| nofollow | No | ||
| canonical | No | ||
| contentId | No | A page, post or custom record. Give this, termId OR archive. | |
| ogImageId | No | ||
| cornerstone | No | ||
| focusKeyword | No | ||
| twitterTitle | No | ||
| ogDescription | No | ||
| robotsAdvanced | No | ||
| schemaPageType | No | ||
| twitterImageId | No | ||
| breadcrumbTitle | No | ||
| schemaArticleType | No | ||
| twitterDescription | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| stored | No | |
| termId | No | |
| archive | No | |
| written | Yes | |
| warnings | No | |
| contentId | No | |
| effective | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does well: it discloses the partial-update contract ('Send only what changes'), the clearing semantics ('"" or null clears a field'), the refusal condition, and per-target field restrictions. It omits permission/auth requirements and any confirmation of reversibility, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the action and targets come first, field list second, then field-scoping, clearing semantics, refusal, routing, verification, and a rules line. Every sentence carries information; the single long paragraph is slightly heavy but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return values needn't be described, and the description covers targets, partial updates, clearing, refusal, and alternatives. For a 20-parameter mutation tool with zero annotations, permission/prerequisite detail is the remaining gap, but the skill-doc pointer offsets it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 15%, so the description must compensate and largely does: it names the settable fields (title, metaDesc, focusKeyword, canonical, noindex/nofollow, robotsAdvanced, schemaPageType/ArticleType, og*/twitter*) and constrains which apply to terms vs. records/archives. It still leaves value formats (schemaPageType values, robotsAdvanced items) unexplained, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Set) and resource (Yoast SEO fields) and enumerates the three mutually exclusive target modes (contentId, termId, archive). It also distinguishes itself from adjacent siblings by naming set-schema for custom schema nodes and get-seo for verification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent how to pick a target ('Give this, termId OR archive'), routes custom schema work to set-schema, states the refusal condition (Yoast inactive), gives a verification path, and mandates reading get-skill-doc {id:"seo-contract"} before the first call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-set-seo-defaultsSet SEO defaultsAInspect
Set Yoast DEFAULTS for exactly one scope — a postType (title/metaDesc templates, noindex, schema types; its ARCHIVE is set-seo {archive}), a taxonomy, or site:true (separator, website name, the knowledge graph: companyOrPerson/companyName/companyLogoId, facebookUrl/twitterUsername/socialProfiles, defaultOgImageId, home templates). Templates use Yoast variables (%%title%%, %%sitename%%, %%sep%%, %%fab_%% — a Fabrement field as a reader sees it, %%cf_%% — another plugin's raw field…); an unknown or empty variable is REMOVED from the output. Refused when Yoast is not active. Rules: get-skill-doc {id:"seo-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| site | No | ||
| noindex | No | ||
| postType | No | ||
| taxonomy | No | ||
| separator | No | ||
| companyName | No | ||
| facebookUrl | No | site: the Facebook page of the organisation (Organization sameAs, article:publisher). | |
| socialTitle | No | ||
| websiteName | No | ||
| personUserId | No | ||
| alternateName | No | ||
| companyLogoId | No | ||
| titleTemplate | No | ||
| schemaPageType | No | ||
| socialProfiles | No | site: every OTHER profile URL of the organisation (Instagram, LinkedIn, YouTube…) — the sameAs of the Organization node. Replaces the list; null clears it. | |
| companyOrPerson | No | ||
| twitterUsername | No | site: the X/Twitter handle ("fabrement", "@fabrement" or its profile URL). | |
| defaultOgImageId | No | site: the share image for pages with no image of their own (upload-media id). | |
| metaDescTemplate | No | ||
| homeTitleTemplate | No | ||
| schemaArticleType | No | ||
| socialDescription | No | ||
| breadcrumbsEnabled | No | ||
| homeMetaDescTemplate | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | No | |
| scope | Yes | |
| written | Yes | |
| defaults | No | |
| warnings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the load and does add real behavioral context: the refusal condition when Yoast is inactive, the fact that unknown or empty template variables are removed from output, and the exactly-one-scope constraint. It stops short of stating auth/permission needs, whether omitted fields are preserved or cleared on partial updates, or how the mutation takes effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the scope constraint and its three values lead, followed by per-scope enumerations, then variable syntax, then the refusal rule. Parenthetical detail is heavy but every clause carries information an agent needs, and nothing is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 24-param mutation tool with no annotations, the description supplies the scope model, refusal precondition, variable semantics, and a pointer to the seo-contract skill doc; an output schema exists so return values need not be explained. It is only incomplete in not documenting several individual parameters and in not clarifying preservation/replacement semantics for omitted fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 17% across 24 params, so the description must compensate, and it does so well by grouping parameters under their scope (postType: title/metaDesc templates, noindex, schema types; site: separator, website name, knowledge graph fields, defaultOgImageId, home templates) and explaining the %%...%% variable syntax. Gaps remain for ungrouped params such as socialTitle, socialDescription, alternateName, personUserId, breadcrumbsEnabled and the schema page/article types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set Yoast DEFAULTS') and enumerates the three mutually exclusive scopes it operates on (postType, taxonomy, site:true) with the concrete fields each covers. It also distinguishes itself from siblings by noting the archive variant is set-seo and that the scope must be exactly one, so an agent can tell it apart from set-seo/list-seo without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: exactly one scope per call, an explicit precondition ('Refused when Yoast is not active'), and a mandatory first step ('get-skill-doc {id:"seo-contract"} — read it before the first call'). It routes the archive case to set-seo, but does not contrast with set-seo for individual posts or with get-seo beyond that single mention.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-submit-versionSubmit versionAInspect
Submit a new version of a block: the backend builds block.json from the shorthand attributes, validates (PHP syntax, security, policy, esbuild) and on success writes the files to the site — then VERIFY with preview {target:"block", id: blockId}. On failure nothing is saved; fix what violations[] names and resubmit. A NEW block needs every field. An existing block takes only what changes: omitted fields keep the current version, and a file can be changed with edits (fragment replacements) instead of re-sent — pass expectedHash from get-block-source. summary is always required, and so is mode: "add" (a NEW version, the current one stays in history) or "replace" (replaces the current version in place, nothing left to roll back to).
Rules: get-skill-doc {id:"block-contract"} for a content block; a header follows {id:"header-contract"}, a footer {id:"footer-contract"} — read the one for the block's type before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | Required — there is no default. add: this becomes a NEW version and the current one stays in history, so it can be rolled back to. replace: the current version is replaced in place (iterative fixes) and there is nothing to roll back to. | |
| tags | No | REQUIRED for a new block: 2-6 lowercase tokens, the SECTION KIND first (get-skill-doc {id:"description-tags"} lists them; a wrong one is refused and the refusal names them all), then mechanics and composition. Check list-blocks `availableTags` and reuse the words already in use. | |
| edits | No | Fragment replacements per source file of the CURRENT version (as get-block-source returns it, {{nameKebab}} tokens included), instead of re-sending the file. A file is sent whole OR edited, not both. | |
| remove | No | Parts to DELETE from the block: viewJs, controlsJs, backgroundColor, skills. The only way to delete — an empty value ("" / [] / {}) is treated as not sent. | |
| skills | No | Technique skill ids you applied (must match the docs you followed). Omit to keep. | |
| viewJs | No | view.js source, whole (window.Fabrement.registerBlockView). Omit to keep; remove:["viewJs"] deletes it. | |
| blockId | Yes | WordPress block id from create-block / list-blocks. | |
| summary | Yes | REQUIRED changelog line: what changed / was built THIS submit (e.g. "bigger CTA, tighter hero spacing"). | |
| styleCss | No | style.css source, whole — `.e-*` selectors written flat (the backend scopes them to the block); only root-state heads carry .block-{{nameKebab}}. Omit to keep. | |
| renderPhp | No | render.php source, whole. Omit to keep, or change it with edits.renderPhp. | |
| attributes | No | SHORTHAND attributes map — every field needs "control" (get-skill-doc {id:"attributes"}). The WHOLE map when sent; omit to keep. | |
| controlsJs | No | controls.js source, whole (export function Controls, BlockModal). Omit to keep. | |
| description | No | REQUIRED for a new block: what it is and where it is used, how it looks and what is in it, any behaviour, and what it depends on. At least 25 words, at most 400 characters. get-skill-doc {id:"description-tags"} has the shape and an example. Omit on an edit to keep the stored one. | |
| expectedHash | No | `hash` from get-block-source. If the block got a newer version since, nothing is submitted. | |
| backgroundColor | No | Whole-section fill: hex or full CSS gradient string (headers: never). Omit to keep; remove it with remove:["backgroundColor"]. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| notice | No | Present only when the block changed and its description did not — something to check, not a failure. The version is saved either way. |
| buildOk | No | |
| warnings | No | Things to fix that did not stop the save: a site option read with a name that is not a literal string (block.json cannot list it). |
| versionId | No | |
| overwritten | No | true when this replaced the current version in place. |
| siteOptions | No | The site options this version reads, "<options page>.<field>", found in render.php and written into block.json. Absent when it reads none. |
| filesWritten | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses validation steps (PHP syntax, security, policy, esbuild), atomic failure ('nothing is saved'), success writes, the add vs replace rollback distinction, expectedHash conflict behavior, and the required preview verification.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, followed by behavioral and usage details in compact, information-dense sentences. Despite the tool's complexity, every sentence adds useful context and none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 15 parameters, nested objects, no annotations, and an output schema, the description is complete enough. It covers purpose, failure handling, verification, contract-reading prerequisites, and mode/edit semantics, while the output schema handles return-value explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds consolidated meaning beyond the per-parameter schema, including the global rule that a new block needs every field while an existing block only needs changed fields, that omitted fields keep current values, and how edits plus expectedHash work together.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Submit') and resource ('a new version of a block') and clearly differentiates the new-block case from the existing-block case. However, it does not explicitly distinguish this tool from sibling alternatives such as create-block or import-block, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context: read the block-type contract before the first call, verify with preview, and fix violations[] on failure before resubmitting. It does not name alternative tools for initial creation versus versioning, so the when-not/alternative dimension is only partially covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-update-cf7-formUpdate Contact Form 7 formAInspect
Update a Contact Form 7 form — send only what changes. template REPLACES the form body whole and re-derives the mail from the tags in it, so edit the markup get-cf7-form returns rather than sending a fragment: what you leave out is gone. messages patches only the keys sent ("" resets one to the default). get-cf7-form first.
Rules: get-skill-doc {id:"forms-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | New form title (omit to keep). | |
| formId | Yes | Form id from list-forms. | |
| subject | No | Notification email subject line. | |
| messages | No | CF7 "Messages" tab as {key: text} — mail_sent_ok, validation_error, invalid_required, invalid_email, … (get-cf7-form lists every key with its current text and default). Only the keys sent change; "" resets one to the default; unknown keys are refused. | |
| template | No | The FULL CF7 form markup, replacing what is there — get-cf7-form returns the current one to edit. Same rules as create-cf7-form: your HTML around CF7 [tags], [submit "…"] for the button, a reserved control name (name, search, author, page, …) refused rather than renamed, at most 40 controls. | |
| recipient | No | Email address the submissions are sent to. |
Output Schema
| Name | Required | Description |
|---|---|---|
| form | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral burden and does so well: it discloses that template REPLACES the body whole (destructive — 'what you leave out is gone'), that messages patches only sent keys, that empty string resets a key to default, and that unknown keys are refused. These are the exact semantics an agent needs to avoid data loss.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and default behavior, then the two tricky fields, then prerequisites. Every clause earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with six params and no annotations, the description covers merge/replace semantics, prerequisites, and hard constraints (reserved control names, 40-control cap, unknown-key refusal). An output schema exists, so return values need no explanation, making this complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema — the whole-replacement nature of template and the patch/reset semantics of messages reinforce and clarify the field-level docs. It does not add usage detail for title/subject/recipient, keeping it just below top.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Update) and resource (Contact Form 7 form) and immediately differentiates scope with 'send only what changes', which separates it from create-cf7-form and delete-cf7-form. An agent can identify the tool's operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: call get-cf7-form first to fetch current markup, and read the forms-contract skill doc before the first call. It also names the precondition for correct use (edit the returned markup rather than send a fragment), so when and how to invoke it is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-update-post-typeUpdate post typeAInspect
Update a custom post type Fabrement created — send only what changes; the slug identifies it and cannot change (delete + create to rename). Takes effect immediately. Rules: get-skill-doc {id:"content-model-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The custom post type slug (from list-post-types-custom). Immutable. | |
| plural | No | Plural label. | |
| public | No | ||
| rewrite | No | URL base. | |
| menuIcon | No | A dashicons-* class. | |
| singular | No | Singular label. | |
| supports | No | ||
| hasArchive | No | ||
| showInRest | No | ||
| taxonomies | No | ||
| hierarchical | No | ||
| menuPosition | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| postType | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses partial-update semantics, slug immutability and the rename workaround, and that changes take effect immediately. It omits permission/auth requirements and any rollback or validation-failure behavior, which keeps it out of 5 territory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight clauses, front-loaded with the action and mutation semantics, then the constraint, then the rule. No filler. Slightly compressed, but every sentence adds information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation tool with no annotations, it covers the critical facts: patch semantics, immutable identifier, immediate effect, and a required pre-read doc. An output schema exists so return values need not be described. Auth/permission expectations and validation failure behavior are the remaining gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 42% across 12 parameters, so the schema leaves roughly half the fields undocumented. The description compensates for the most important semantic (partial/patch behavior and slug immutability) but does not explain the remaining fields such as public, supports, taxonomies, hierarchical or menuPosition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Update a custom post type'), scoped to types 'Fabrement created'. It is distinguishable from the create/delete post-type siblings by the verb alone, though it never names them. Clear purpose, but no explicit sibling differentiation beyond the verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete operating instructions: send only what changes, the slug identifies the resource, and renaming requires delete + create. It also names a prerequisite (get-skill-doc content-model-contract) before the first call. It does not explicitly contrast with create-post-type/delete-post-type beyond the rename note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-update-site-settingsUpdate site settingsAInspect
Site-level settings a build needs — siteTitle, tagline, frontPage (the HOME page id; the step every homepage build ends with), postsPage, notFoundPage (the page shown for missing addresses), permalinkStructure, siteIcon (favicon attachment id). Send only what changes; to read them, use get-site-settings. Nothing else is settable here by design. Rules: get-skill-doc {id:"site-settings-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| tagline | No | The "blogdescription" line under the title. | |
| siteIcon | No | Attachment id of the favicon (upload-media first). Square PNG, 512×512 or larger. 0 removes it. | |
| frontPage | No | Published page id to show as the home page; 0 = latest posts. | |
| postsPage | No | Published page id that lists posts. | |
| siteTitle | No | ||
| notFoundPage | No | Published page id shown for every missing address (404 status kept); 0 = the theme's own 404. | |
| permalinkStructure | No | e.g. "/%postname%/". Empty string = plain ?p=123 links. |
Output Schema
| Name | Required | Description |
|---|---|---|
| changed | No | |
| settings | Yes | |
| warnings | No | Accepted, but worth telling the user about. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose real behavior: unsent fields are preserved (partial update), the settable surface is deliberately bounded, and a contract document governs the call. It does not address permissions, reversibility, or side effects such as breaking links when permalinkStructure changes, which is a meaningful gap for a mutation tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the field inventory, then the update/read rules in two short sentences, with zero filler. The field enumeration is somewhat dense but each gloss earns its place by disambiguating similar id-valued parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the schema covers most parameters with descriptions. The description supplies the missing behavioral frame (partial update, bounded scope, contract doc) needed to call this safely against a large sibling set, falling short only on permissions and side-effect disclosure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 86%, so the schema baseline is 3; the description adds genuine meaning on top by framing the ids as page/attachment ids and tying siteIcon to an upload-media prerequisite. It reinforces the semantic role of each field rather than merely listing names, though a few fields (siteTitle, tagline) only get restated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource (site-level settings) and enumerates exactly which settings are in scope, glossing each one (frontPage = home page id, notFoundPage = missing-address page). It explicitly separates itself from the read sibling get-site-settings and from other update-* tools by stating 'Nothing else is settable here by design.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative for the inverse operation ('to read them, use get-site-settings'), states the partial-update rule ('Send only what changes'), and draws an explicit boundary ('Nothing else is settable here by design'). It also flags a prerequisite read of the site-settings-contract skill doc before the first call, though it gives no broader when-in-the-build guidance beyond 'the step every homepage build ends with.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-update-taxonomyUpdate taxonomyAInspect
Update a taxonomy Fabrement created — send only what changes; postTypes is the FULL set (replaces). Existing terms stay where they are. The slug and hierarchical cannot change: the slug is the identifier every term row points at, and it is invisible to visitors anyway — what they see is rewrite (the URL) and singular/plural (the name), both editable here. Rules: get-skill-doc {id:"content-model-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The taxonomy slug (from list-taxonomies). Immutable. | |
| plural | No | ||
| public | No | ||
| rewrite | No | ||
| singular | No | ||
| postTypes | No | Full set of post types it classifies (replaces the current set). | |
| showInRest | No | ||
| showAdminColumn | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| taxonomy | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden, and it delivers real behavioral context: slug and hierarchical are immutable, existing terms are not relocated, and rewrite/singular/plural remain editable. It omits permissions, reversibility, and failure behavior, keeping it out of 5 territory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the key partial-update rule, but the middle clause rambles ('it is invisible to visitors anyway — what they see is rewrite...'), diluting focus with explanatory asides. Functional but not tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and the description covers mutation semantics and immutability. But it explicitly defers to get-skill-doc for rules and leaves three parameters undocumented, so it is not self-sufficient for a no-annotation mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 25%, so the description must compensate, and it does clarify slug (immutable identifier), postTypes (full replacement set), and rewrite/singular/plural roles. However, public, showInRest, and showAdminColumn are left undocumented in both schema and description, so the gap is only partly closed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Update a taxonomy Fabrement created') and scopes it to taxonomies the system owns, which cleanly separates it from create-taxonomy and delete-taxonomy. It does not explicitly name a sibling to disambiguate against, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete operating guidance: 'send only what changes' and 'postTypes is the FULL set (replaces)', which tells the agent exactly how to invoke it. It also routes the agent to get-skill-doc before the first call. No explicit when-not-to-use statement, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-update-termUpdate termAInspect
Rename a term, change its slug/description or move it under another parent (0 = top level); posts keep their assignment. A slug or parent change moves the archive URL — the response note says what moved.
Rules: get-skill-doc {id:"content-model-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| slug | No | ||
| term | Yes | The term to edit — id, slug or name. | |
| parent | No | New parent (id, slug or name); 0 makes it top-level. Hierarchical taxonomies only. | |
| taxonomy | Yes | Taxonomy slug (see list-taxonomies). | |
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| name | Yes | |
| note | No | Present whenever the archive URL moved — a slug change, a parent change, or both. Says the old URL now 404s and how many descendant terms moved with it. |
| slug | No | |
| parent | No | |
| termId | Yes | |
| changed | No | |
| taxonomy | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that posts keep their assignment, that slug/parent changes relocate the archive URL, and that the response `note` reports what moved. Auth/permission requirements and failure behavior (nonexistent term) are still undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, followed by the side-effect caveat and the prerequisite rule in two tight sentences. The nested get-skill-doc invocation is slightly awkward inline but earns its place as a required step.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still usefully explains the `note` field, and it covers the main mutation side effects for a 6-param tool. Remaining gaps are only edge-case/error behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, so name, slug, and description are undocumented in the schema; the description partially compensates by naming those editable fields and confirming 0 = top level. It adds no syntax detail (e.g., slug format rules) beyond what the schema already carries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (rename/change/move) and resource (term) plus the exact editable facets (name, slug, description, parent), which cleanly separates it from create-term and delete-term siblings. The scope is unambiguous without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete prerequisite — read get-skill-doc {id:"content-model-contract"} before the first call — which is actionable routing guidance. It stops short of naming sibling alternatives (e.g., set-post-terms for reassigning posts), so it is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fabrement-upload-mediaUpload mediaAInspect
Upload one file into the media library from EXACTLY ONE source — sourceUrl (preferred), filePath (on the WordPress machine) or base64 (≤512 KB) — and get {id, url, …} for a block's media attribute. altText is REQUIRED for images. list-media first: it may already exist. Rules: get-skill-doc {id:"site-assets-contract"} — read it before the first call.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Optional media library title. | |
| base64 | No | File bytes as base64 (a "data:…;base64," prefix is accepted and stripped). Requires filename. Max 512 KB decoded. Last resort — prefer sourceUrl. | |
| altText | No | REQUIRED for images: what the image shows, for screen readers and SEO. Ignored for non-images. | |
| filePath | No | Absolute path to a file on the WordPress host. One source only. | |
| filename | No | Filename to store it under, e.g. "hero-bg.webp". Defaults to the source filename; REQUIRED with base64 (it carries the extension). | |
| sourceUrl | No | Remote http(s) URL to download into the library. One source only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | With `url`, the {id, url} pair an image attribute stores; alone, the siteIcon update-site-settings takes. |
| url | Yes | |
| width | No | Null for documents, AV and usually SVG. |
| height | No | |
| altText | Yes | |
| filename | Yes | After sanitising and de-duplicating — need not match what was sent. |
| mimeType | Yes | Detected from the real bytes, not the filename. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does well: source mutual-exclusivity, the 512 KB decoded limit, altText required for images, and the {id, url} return for block media attributes. It stops short of covering auth/permission needs or duplicate/error handling, so it is not fully exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action is front-loaded, then constraints and prerequisites follow. Capitalized emphasis is used sparingly and makes the scoping rules scannable; no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, and the description complements it by naming the source options, the required altText, and the prerequisite contract doc. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by adding the preference ordering among sources and the mutual-exclusivity rule, which the schema states per-field but never as a relationship. It adds real selection semantics beyond the field docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Upload one file into the media library') and immediately scopes the operation (single file, one of three named sources). An agent can tell it apart from fabrement-list-media and fabrement-delete-media without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance at every decision point: choose exactly one source, sourceUrl is preferred, list-media first to avoid duplicates, and read the site-assets-contract skill doc before the first call. This is when-to-use plus prerequisites and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
97 tool updates
- First observed
fabrement-assign-template-archive - First observed
fabrement-assign-template-pages - First observed
fabrement-create-block - First observed
fabrement-create-cf7-form - First observed
fabrement-create-design-system - First observed
fabrement-create-menu - First observed
fabrement-create-post-type - First observed
fabrement-create-taxonomy - First observed
fabrement-create-term - First observed
fabrement-delete-archive-page - First observed
fabrement-delete-block - First observed
fabrement-delete-cf7-form - First observed
fabrement-delete-content - First observed
fabrement-delete-icon - First observed
fabrement-delete-media - First observed
fabrement-delete-menu - First observed
fabrement-delete-options-page - First observed
fabrement-delete-post-type - First observed
fabrement-delete-single-page - First observed
fabrement-delete-synced-pattern - First observed
fabrement-delete-taxonomy - First observed
fabrement-delete-template - First observed
fabrement-delete-term - First observed
fabrement-get-archive-page - First observed
fabrement-get-block-source - First observed
fabrement-get-cf7-form - First observed
fabrement-get-content - First observed
fabrement-get-design-system - First observed
fabrement-get-field-values - First observed
fabrement-get-fields - First observed
fabrement-get-figma - First observed
fabrement-get-global-css - First observed
fabrement-get-global-js - First observed
fabrement-get-icon - First observed
fabrement-get-options-page - First observed
fabrement-get-seo - First observed
fabrement-get-single-page - First observed
fabrement-get-site-settings - First observed
fabrement-get-skill-doc - First observed
fabrement-get-synced-pattern - First observed
fabrement-get-template - First observed
fabrement-import-block - First observed
fabrement-install-plugin - First observed
fabrement-list-archive-pages - First observed
fabrement-list-archive-records - First observed
fabrement-list-archives - First observed
fabrement-list-block-usage - First observed
fabrement-list-blocks - First observed
fabrement-list-content - First observed
fabrement-list-fonts - First observed
fabrement-list-forms - First observed
fabrement-list-icons - First observed
fabrement-list-media - First observed
fabrement-list-menus - First observed
fabrement-list-options-pages - First observed
fabrement-list-post-type-fields - First observed
fabrement-list-post-types - First observed
fabrement-list-post-types-custom - First observed
fabrement-list-seo - First observed
fabrement-list-single-pages - First observed
fabrement-list-synced-patterns - First observed
fabrement-list-taxonomies - First observed
fabrement-list-template-pages - First observed
fabrement-list-templates - First observed
fabrement-list-terms - First observed
fabrement-list-versions - First observed
fabrement-preview - First observed
fabrement-query-database - First observed
fabrement-rollback-version - First observed
fabrement-save-archive-page - First observed
fabrement-save-content - First observed
fabrement-save-design-system - First observed
fabrement-save-fields - First observed
fabrement-save-global-css - First observed
fabrement-save-global-js - First observed
fabrement-save-icon - First observed
fabrement-save-options-page - First observed
fabrement-save-single-page - First observed
fabrement-save-synced-pattern - First observed
fabrement-save-template - First observed
fabrement-set-archive-record - First observed
fabrement-set-content-status - First observed
fabrement-set-default-template - First observed
fabrement-set-field-values - First observed
fabrement-set-post-terms - First observed
fabrement-set-post-type-starter-blocks - First observed
fabrement-set-schema - First observed
fabrement-set-seo - First observed
fabrement-set-seo-defaults - First observed
fabrement-submit-version - First observed
fabrement-update-cf7-form - First observed
fabrement-update-menu - First observed
fabrement-update-post-type - First observed
fabrement-update-site-settings - First observed
fabrement-update-taxonomy - First observed
fabrement-update-term - First observed
fabrement-upload-media
Related MCP Servers
- AlicenseNot gradedqualityBmaintenancePerplexity for social: ask what competitors are running across social and get answers grounded in real ad and creative data, not guesses.2Apache 2.0
- AlicenseCqualityBmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs119 npmMIT
- AlicenseAqualityCmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.1611 npm1MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.