skillZs
★ LIVE SKILL TAGS ★
>>> LIVE SKILLS INDEX <<<
* OPEN SOURCE *
NO LOGIN, NO TRACKING
※ REAL INSTALL DATA ※
← back to all skills
xtemos/woodmart-skill203 installs

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-mcp
view source ↗

Is 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

IntentStart with
Find a page, post, product, portfolio project, or HTML blockwoodmart/search-content
Create a page, post, portfolio project, or HTML blockwoodmart/create-content
Rename, publish, re-slug, or re-parent contentwoodmart/update-content
Read a target's block treewoodmart/gutenberg-get-content
Change blocks in a non-empty targetwoodmart/gutenberg-edit-blocks
Fill an empty target or deliberately rebuild all of itwoodmart/gutenberg-add-pending-change
Discover blocks and their attributeswoodmart/gutenberg-list-blocks, then woodmart/gutenberg-describe-block
Reuse a demo section or pagewoodmart/gutenberg-search-templates, then woodmart/gutenberg-get-template
Read or change a theme settingwoodmart/list-theme-settings, then woodmart/get-theme-setting
Replace Header Builder logoswoodmart/replace-header-logo
Discover, create, or assign layoutswoodmart/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.

  1. Never rebuild a target to change only part of it. Read it with gutenberg-get-content, then use gutenberg-edit-blocks and 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.
  2. Use gutenberg-add-pending-change only for an empty target or when the user explicitly asks to replace/rebuild the entire target.
  3. Author text and content in the attribute named by gutenberg-describe-block's contentAttribute. Do not hand-write innerHTML for content updates. Existing innerHTML is round-trip data for content the agent is preserving, or verbatim markup supplied for an intentional insert.
  4. Only wd/* blocks have stable blockId values and can be addressed by id. Core blocks pass through but cannot be individually updated, deleted, moved, or used as anchors.
  5. Omit attributes.blockId when authoring or inserting a wd/* block; normalization creates it. Use ids copied from gutenberg-get-content only as operation selectors or anchors—never invent, copy, reuse, or send one inside update attributes.
  6. Pass expected_content_hash from the latest gutenberg-get-content response 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

  1. Use gutenberg-list-blocks, then gutenberg-describe-block for every block being authored.
  2. Fetch referenced styleGroups or composites with gutenberg-describe-attribute-group only when that styling is needed.
  3. Follow the returned composition, nesting, conventions, examples, units, responsive attributes, and data-resolver hints. Do not invent block attributes or site-specific ids.
  4. For layouts, pass the relevant type's block_categories from list-layout-types to gutenberg-list-blocks.
  5. 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.

  1. Follow the queue response's user_instruction. Ask the user to keep WoodMart → Tools → AI Block Queue open in wp-admin.
  2. Call gutenberg-enable-finalization when the response says the batch is still a draft. create-content or create-layout with block_spec already marks its batch ready, so do not enable it again.
  3. Poll gutenberg-get-pending-batch until finalized, failed, or conflicted.
  4. 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, actual after.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-setting immediately before writing. Honor writable, value_format, options, current_value, and has_preset_overrides.
  • update-theme-setting writes the base layer. A preset override may still determine the visible value; report that instead of retrying blindly.
  • replace-header-logo requires an existing media-library image attachment_id and updates every saved header. Read the per-header statuses and totals; report skipped or failed headers rather than claiming blanket success.

Layouts

  • Start with list-layout-types. Use its live type, block_categories, predefined, and condition_types data 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-conditions replaces the complete condition set. Send every condition that must remain; [] unassigns the layout.
  • Build each condition using the selected layout type's condition_types entry and its query_kind (none, scalar, array, or number_range).
  • is_assigned is request-context-dependent over MCP. Inspect stored conditions; do not rewrite them solely because is_assigned is 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.

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>