woodmart-mcp
Use for WoodMart site work through the wood MCP abilities (woodmart/*): finding or creating content, editing Gutenberg blocks, changing theme settings or header logos, and creating or assigning WoodMart layouts. Covers the queued block-finalization workflow and the safety rules that coordinate multiple abilities.
How do I install this agent skill?
npx skills add https://github.com/xtemos/woodmart-skill --skill woodmart-mcpIs this agent skill safe to install?
- Gen Agent Trust Hubpass
The skill provides a comprehensive interface for managing WordPress sites using the WoodMart theme. It implements significant safety features, including a human-in-the-loop finalization queue for content changes and explicit requirements for user confirmation before performing destructive or public-facing actions. The 'low' verdict is assigned due to the inherent surface area for indirect prompt injection when processing existing site content alongside broad administrative capabilities.
- Socketpass
No alerts
- Snykwarn
Risk: MEDIUM · 1 issue
What does this agent skill do?
Working with WoodMart via MCP abilities
Use live ability documentation
Everything runs through the wood MCP adapter. Use mcp-adapter-discover-abilities for
the current ability list and mcp-adapter-get-ability-info before the first use of a write
ability, or whenever its parameters are uncertain. Treat the live description, input schema,
response fields, warnings, and user_instruction as authoritative; do not rely on remembered
parameter lists.
Use mcp-adapter-execute-ability with ability_name and parameters to execute an ability.
Routing
| Intent | Start with |
|---|---|
| Find a page, post, product, portfolio project, or HTML block | woodmart/search-content |
| Create a page, post, portfolio project, or HTML block | woodmart/create-content |
| Rename, publish, re-slug, or re-parent content | woodmart/update-content |
| Read a target's block tree | woodmart/gutenberg-get-content |
| Change blocks in a non-empty target | woodmart/gutenberg-edit-blocks |
| Fill an empty target or deliberately rebuild all of it | woodmart/gutenberg-add-pending-change |
| Discover blocks and their attributes | woodmart/gutenberg-list-blocks, then woodmart/gutenberg-describe-block |
| Reuse a demo section or page | woodmart/gutenberg-search-templates, then woodmart/gutenberg-get-template |
| Read or change a theme setting | woodmart/list-theme-settings, then woodmart/get-theme-setting |
| Replace Header Builder logos | woodmart/replace-header-logo |
| Discover, create, or assign layouts | woodmart/list-layout-types, then the relevant layout ability |
An id from search-content, or a layout's target_id from list-layouts, is the
target_id for Gutenberg abilities.
Block-write rules
These rules are non-negotiable because violating them can silently lose content or styling.
- Never rebuild a target to change only part of it. Read it with
gutenberg-get-content, then usegutenberg-edit-blocksand send only the operations and attribute keys that change. This includes requests such as “update all texts on the page.” Untouched blocks and attributes must be omitted. - Use
gutenberg-add-pending-changeonly for an empty target or when the user explicitly asks to replace/rebuild the entire target. - Author text and content in the attribute named by
gutenberg-describe-block'scontentAttribute. Do not hand-writeinnerHTMLfor content updates. ExistinginnerHTMLis round-trip data for content the agent is preserving, or verbatim markup supplied for an intentional insert. - Only
wd/*blocks have stableblockIdvalues and can be addressed by id. Core blocks pass through but cannot be individually updated, deleted, moved, or used as anchors. - Omit
attributes.blockIdwhen authoring or inserting awd/*block; normalization creates it. Use ids copied fromgutenberg-get-contentonly as operation selectors or anchors—never invent, copy, reuse, or send one inside updateattributes. - Pass
expected_content_hashfrom the latestgutenberg-get-contentresponse when editing. On a conflict, re-read the target and rebuild the intended operations against the new tree.
If a deliberate full replacement might touch classic/freeform content outside registered
blocks, first read with include_raw_content: true; block_spec otherwise cannot represent
that content. Do not use full replacement as a workaround for this limitation.
Choosing the write path
Existing blocks?
├── no → create-content with block_spec, or gutenberg-add-pending-change
└── yes → Explicit full rebuild requested?
├── no → gutenberg-edit-blocks
└── yes → gutenberg-add-pending-change
For a text edit, describe the block if the content attribute is not already known, then update only that attribute:
{
"target_id": 123,
"expected_content_hash": "...",
"operations": [
{ "op": "update", "blockId": "a1b2", "attributes": { "content": "New heading" } }
]
}
Authoring from scratch
- Use
gutenberg-list-blocks, thengutenberg-describe-blockfor every block being authored. - Fetch referenced
styleGroupsorcompositeswithgutenberg-describe-attribute-grouponly when that styling is needed. - Follow the returned
composition,nesting,conventions, examples, units, responsive attributes, and data-resolver hints. Do not invent block attributes or site-specific ids. - For layouts, pass the relevant type's
block_categoriesfromlist-layout-typestogutenberg-list-blocks. - Prefer a library template when it matches the requested section or page. Use its returned
block_spec; demo images are localized during finalization.
Finalization
Every block-content write is queued and is not live until its batch reaches finalized.
Metadata, theme-setting, header-logo, predefined-layout, and layout-condition writes do not use
the block queue.
- Follow the queue response's
user_instruction. Ask the user to keep WoodMart → Tools → AI Block Queue open in wp-admin. - Call
gutenberg-enable-finalizationwhen the response says the batch is still a draft.create-contentorcreate-layoutwithblock_specalready marks its batch ready, so do not enable it again. - Poll
gutenberg-get-pending-batchuntilfinalized,failed, orconflicted. - On
conflicted, re-read the target and repeat the edit against the current content.
Only one active pending change may exist per target. Cancel an obsolete non-finalized batch
with gutenberg-delete-pending-batch before queuing a replacement.
Immediate writes and reporting
Content metadata
update-content changes metadata immediately and never changes blocks.
- Publishing is outward-facing. Set
status: "publish"only when the user requested it or explicitly confirmed it. - Changing the slug or parent of published content moves its public URL. Obtain confirmation unless the user explicitly requested that URL change.
- Read and relay the response's
warnings, actualafter.slug, and resulting URL. Published hierarchical pages do not receive WordPress's old-slug redirect; their old URL can become a 404. - There is no trash/delete-content ability. Do not simulate deletion by blanking block content.
Theme settings and logos
- Find a theme-setting id with
list-theme-settings; do not guess it. - Read the full descriptor with
get-theme-settingimmediately before writing. Honorwritable,value_format,options,current_value, andhas_preset_overrides. update-theme-settingwrites the base layer. A preset override may still determine the visible value; report that instead of retrying blindly.replace-header-logorequires an existing media-library imageattachment_idand updates every saved header. Read the per-header statuses andtotals; report skipped or failed headers rather than claiming blanket success.
Layouts
- Start with
list-layout-types. Use its livetype,block_categories,predefined, andcondition_typesdata rather than maintaining local enums. - Edit an existing layout's blocks with Gutenberg abilities against its
target_id; do not recreate the layout merely to change its content. set-layout-conditionsreplaces the complete condition set. Send every condition that must remain;[]unassigns the layout.- Build each condition using the selected layout type's
condition_typesentry and itsquery_kind(none,scalar,array, ornumber_range). is_assignedis request-context-dependent over MCP. Inspect storedconditions; do not rewrite them solely becauseis_assignedis false.
Portfolio and site-specific ids
A portfolio project is content of post type portfolio; find/create it and edit its Gutenberg
blocks like a page. single_portfolio and portfolio_archive are layouts controlling how
projects or archives render. Portfolio content requires the Portfolio theme option to be enabled.
Never invent product, category, taxonomy, media, post, or template ids. Resolve them with the relevant live query/search ability, or use a dynamic block query when explicit ids are unnecessary.
How can the creator link this skill?
Add the canonical catalog link to the repository README so users can inspect current installs and available audits. The publishing guide covers the complete discovery path.
<a href="https://skillzs.dev/skills/xtemos/woodmart-skill/woodmart-mcp">View woodmart-mcp on skillZs</a>