Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

ApparelHub

NPM · @APPARELHUB/MCP-SERVER · 2 COMPONENTS · SCANNED SEP 29

Run a custom-merch store from an agent: design, build products, list on every channel, fulfill.

63 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security48
  • Malware scan not yet available for this package.Unverified
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 31 of 92 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to ApparelHub-AI/apparelhub-mcp). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 0 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability68
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 23020 tokens (~187/item across 123 items; 123 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage90
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 71% of tool parameters carry a description.Partial
Tool Safety98
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 9 of 10 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "remove_order_item" implies "remove" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Partial
  • An AI judge read all 124 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

Install

How do I install the ApparelHub MCP server?

ApparelHub runs locally as an npm package, launched with npx -y @apparelhub/mcp-server. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · @apparelhub/mcp-server

# add to Claude Code
claude mcp add apparelhub-ai-apparelhub-mcp -- npx -y @apparelhub/mcp-server
// .cursor/mcp.json
{
  "mcpServers": {
    "apparelhub-ai-apparelhub-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@apparelhub/mcp-server"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "apparelhub-ai-apparelhub-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@apparelhub/mcp-server"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add apparelhub-ai-apparelhub-mcp -- npx -y @apparelhub/mcp-server
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "apparelhub-ai-apparelhub-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@apparelhub/mcp-server"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add apparelhub-ai-apparelhub-mcp --command npx --arg -y --arg @apparelhub/mcp-server
# ~/.hermes/config.yaml
mcp_servers:
  apparelhub-ai-apparelhub-mcp:
    command: "npx"
    args: ["-y", "@apparelhub/mcp-server"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "apparelhub-ai-apparelhub-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@apparelhub/mcp-server"
      ]
    }
  }
}
# add to Vellum
assistant mcp add apparelhub-ai-apparelhub-mcp -t stdio -c npx -a -y @apparelhub/mcp-server
// mcp.json
{
  "mcpServers": {
    "apparelhub-ai-apparelhub-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@apparelhub/mcp-server"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 29 Sept 26 63

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 29 Sept 2026 · Analysed npm/@apparelhub/mcp-server@0.15.2

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo ApparelHub-AI/apparelhub-mcp
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/ApparelHub-AI/apparelhub-mcp/.github/workflows/publish.yml@refs/tags/v0.15.2
Rekor log index 2993530528
Predicate type SLSA build provenance https://slsa.dev/provenance/v1
Subject digest sha512:6e0dd91870fc919c444959a5a6b7bffa039964915dcd4b68f5f7be7dcafea985633f51c21cea06edbc659435d01238737f7284c1428e13b3ce910669e

Background: How many MCP packages publish verified provenance →

Dependencies 92 packages
Packages resolved 92
Stale 31
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 123 exposed · ~22,846 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
accept_invite ~79

Accept a pending invite by token. The authenticated key-holder’s email must match the invite. Works on any tier and with a workspace-scoped key (the invitee side). Returns the account + workspace you were added to. [#e7e5ee]

NameTypeReqDescription
tokenstringyesThe invite token (from the invite email / accept URL).

No output schema declared.

No examples provided.

activate_store ~97

Activate a store so it can list products and ingest orders. Requires at least one fulfillment provider (e.g. Printful) to be connected first — otherwise this fails. Use after create_store or unarchive_store once a provider is connected. [#87c31f]

NameTypeReqDescription
store_uuidstringyesThe store uuid to activate.
workspacestring–Workspace uuid to scope to (agency accounts). Omit for the Default workspace.

No output schema declared.

No examples provided.

add_order_item ~320

Add an item (e.g. another variant of the same product) to a DRAFT order, before it is confirmed to production. Optionally set custom_price (the new item's per-unit retail price) and/or shipping_cost (the order-level retail shipping the customer pays — NOT the provider's cost); omit them and the variant price / existing shipping are kept. Only works while the order is in "draft" status. Printful and Gelato edit the existing provider draft IN PLACE; Printify has no edit API, so it CANCELS + RE-CREATES the order — the result then carries edit_method="recreated" and a new fulfillment_external_id. Nothing is charged on a draft, so re-creation is safe. Returns 409 "order_not_editable" if the order was already confirmed/submitted to production. [#f416d1]

NameTypeReqDescription
custom_pricenumber–Per-unit retail price for the new item. Omit to use the variant's own price.
order_uuidstringyesThe DRAFT order uuid (from list_my_orders / get_order_details).
quantityinteger–Quantity to add (default 1).
shipping_costnumber–Order-level retail shipping price (what the customer pays, not the provider cost). Omit to keep the order's current shipping.
variant_uuidstringyesThe product variant to add (e.g. another color/size of the same product).
workspacestring–Workspace uuid (agency accounts). Omit for Default.

No output schema declared.

No examples provided.

add_products_to_collection ~88

Add one or more products (by uuid) to a collection. The products must already be associated with the store. If the collection is synced to a channel, the products are added there too. [#e8080a]

NameTypeReqDescription
collection_uuidstringyes–
product_uuidsarrayyes–
store_uuidstringyes–
workspacestring––

No output schema declared.

No examples provided.

add_variants ~112

Add variants to an existing product (split primitive). Resolves provider_variant_ids by color+size from the product's provider options (or pass them explicitly). Warns on the AQUA-vs-Navy trap. Variants must exist before syncing. [#c9cff4]

NameTypeReqDescription
product_ref_idstring–Enables the AQUA-vs-Navy guard for BC 3001 ("71").
product_uuidstringyes–
variantsarrayyes–
workspacestring––

No output schema declared.

No examples provided.

analytics_breakdown ~220

Aggregate KPIs broken down by one dimension: product_type, sales_channel, fulfillment_provider, product, variant, or hold_reason. Rows are sorted for display; overflow past the limit folds into an "(everything else)" row so totals still reconcile. Requires an Advanced Analytics plan. Read-only. [#127113]

NameTypeReqDescription
currencystring–Reporting currency (e.g. "USD"). Currencies are segmented, never summed.
dimensionstringyesThe dimension to break down by (required).
endstring–End date (YYYY-MM-DD). Omit to default to today (UTC).
limitinteger–Max rows before folding the rest into "(everything else)" (default 50).
startstring–Start date (YYYY-MM-DD). Omit to default to 30 days before end.
storestring–Store uuid to narrow to one store. Omit for all accessible stores.
workspacestring–Workspace uuid to scope to (agency accounts). Omit for the Default workspace.

No output schema declared.

No examples provided.

analytics_ops ~171

Operational health for a date range: fulfillment velocity (payment→submit→ship→deliver averages), order counts, and cancellation / refund / hold rates, plus a hold-reason breakdown. Requires an Advanced Analytics plan. Read-only. [#ed8ddd]

NameTypeReqDescription
currencystring–Reporting currency (e.g. "USD"). Currencies are segmented, never summed.
endstring–End date (YYYY-MM-DD). Omit to default to today (UTC).
startstring–Start date (YYYY-MM-DD). Omit to default to 30 days before end.
storestring–Store uuid to narrow to one store. Omit for all accessible stores.
workspacestring–Workspace uuid to scope to (agency accounts). Omit for the Default workspace.

No output schema declared.

No examples provided.

analytics_portfolio ~169

Cross-client portfolio: per-workspace (per-client) KPIs plus rolled-up totals — the agency view. Groups store rollups by each store's current workspace over every workspace you can view analytics in. Requires an agency (Enterprise) account with Advanced Analytics; other accounts get a feature_unavailable error. Read-only. [#65a008]

NameTypeReqDescription
currencystring–Reporting currency (e.g. "USD"). Currencies are segmented, never summed.
endstring–End date (YYYY-MM-DD). Omit to default to today (UTC).
startstring–Start date (YYYY-MM-DD). Omit to default to 30 days before end.
workspacestring–Workspace uuid to scope to (agency accounts). Omit for the Default workspace.

No output schema declared.

No examples provided.

analytics_summary ~196

Headline order/merch KPIs for a date range (gross revenue, orders, units, AOV, COGS, gross profit, margin, cancel/refund/hold rates, fulfillment velocity) plus prior-period deltas. Defaults to the last 30 days. Requires an Advanced Analytics plan (Professional or Enterprise). Read-only. [#6b72a2]

NameTypeReqDescription
currencystring–Reporting currency (e.g. "USD"). Currencies are segmented, never summed.
endstring–End date (YYYY-MM-DD). Omit to default to today (UTC).
startstring–Start date (YYYY-MM-DD). Omit to default to 30 days before end.
storestring–Store uuid to narrow to one store. Omit for all accessible stores.
workspacestring–Workspace uuid to scope to (agency accounts). Omit for the Default workspace.

No output schema declared.

No examples provided.

analytics_timeseries ~197

KPI trend series over a date range, bucketed by day, week, or month (zero-filled). Each bucket carries gross revenue, gross profit, COGS, order count, units, AOV, average margin, and margin coverage. Requires an Advanced Analytics plan. Read-only. [#48246d]

NameTypeReqDescription
currencystring–Reporting currency (e.g. "USD"). Currencies are segmented, never summed.
endstring–End date (YYYY-MM-DD). Omit to default to today (UTC).
intervalstring–Bucket granularity (default day).
startstring–Start date (YYYY-MM-DD). Omit to default to 30 days before end.
storestring–Store uuid to narrow to one store. Omit for all accessible stores.
workspacestring–Workspace uuid to scope to (agency accounts). Omit for the Default workspace.

No output schema declared.

No examples provided.

analyze_what_works ~86

Surface insights from the merchant's own products + orders: best sellers, top channel, average order value. Read-only. Own-account signal (cross-merchant intelligence is a future feature). [#f6f4f3]

NameTypeReqDescription
scopestring––
store_uuidstring––
time_windowstring––
workspacestring––

No output schema declared.

No examples provided.

api_request ~192

Escape hatch: make an authenticated request to any ApparelHub agent API endpoint under /agents/v1, as the connected account. PREFER a dedicated tool when one exists (they return clean, guarded results) — use this only for capabilities no tool covers. Call get_api_reference first to find the right path. `path` is relative (e.g. "orders", "store/<uuid>/settings"); no full URLs. Scoped to the account's own permissions. [#48e53d]

NameTypeReqDescription
bodyobject–JSON request body (for POST/PUT/PATCH).
methodstringyesHTTP method.
pathstringyesRelative path under /agents/v1, e.g. "orders" or "product/<uuid>/archive". No host, no "..".
queryobject–Query-string parameters.
workspacestring–Workspace uuid to scope to (agency accounts).

No output schema declared.

No examples provided.

approve_order ~112

Approve an order that is awaiting approval, releasing it for fulfillment. For sales-channel (webhook) orders this also auto-submits the order to the fulfillment provider (Printful/Printify). Use when an order is held for review and the user wants to let it proceed. [#9b6ea5]

NameTypeReqDescription
order_uuidstringyesThe order uuid (from list_my_orders / get_order_details).
workspacestring–Workspace uuid to scope to (agency accounts). Omit for Default.

No output schema declared.

No examples provided.

approve_order_hold ~125

Approve a design-approval hold on an order so the provider can proceed. If the provider can't flip the hold via its API (Printful today), the result is deferred with a dashboard_url to finish the approval manually — the hold stays active until the provider's release fires. Get the hold_uuid from list_order_holds. [#7b5295]

NameTypeReqDescription
hold_uuidstringyesThe hold uuid (from list_order_holds).
order_uuidstringyesThe order uuid the hold belongs to.
workspacestring–Workspace uuid (agency accounts).

No output schema declared.

No examples provided.

archive_design ~109

Archive a design so it stops showing in the default gallery listing. Reversible with restore_design, and safe: it never touches products that already use the design. This is the right way to retire an unwanted or orphan design. Prefer it over delete_design unless the design must be removed permanently. Find orphan designs first with list_my_designs(on_products=false). [#16a475]

NameTypeReqDescription
design_uuidstringyesThe design uuid to archive.
workspacestring–Workspace uuid (agency accounts).

No output schema declared.

No examples provided.

archive_product ~112

Archive a product: unsync it from every connected sales channel and its fulfillment provider, then hide it. Fails (returns blocking_orders) if any pending order still references its variants — cancel or fulfill those first. Restore it later with restore_product. Use archive rather than delete_product when a product has order history. [#4b1462]

NameTypeReqDescription
product_uuidstringyesThe product uuid to archive.
workspacestring–Workspace uuid to scope to (agency accounts). Omit for the Default workspace.

No output schema declared.

No examples provided.

archive_store ~131

Archive a store (use instead of delete for stores with order history — order records are kept for accounting, but the store is hidden from the default listing and stops ingesting new orders). Restore it later with unarchive_store. Set disconnect_provider=true to also disconnect every connected fulfillment provider and remove its stored credentials. [#b85c96]

NameTypeReqDescription
disconnect_providerboolean–Also disconnect connected fulfillment providers and remove their credentials (default false).
store_uuidstringyesThe store uuid to archive.
workspacestring–Workspace uuid to scope to (agency accounts). Omit for the Default workspace.

No output schema declared.

No examples provided.

assign_workspace_member ~130

Assign an account member to a workspace with a role, or update their existing role (agency / Enterprise). The target must already be a member of the account (invite_member first). Needs an account-wide key. [#5ec6df]

NameTypeReqDescription
rolestringyesWorkspace role: director (full control), creator (design/build), merchandiser (price/publish), operator (post-sale), viewer (read-only).
user_public_idstringyesThe member's user public_id (from list_account_members).
workspace_uuidstringyesWorkspace uuid (from list_my_workspaces).

No output schema declared.

No examples provided.

auto_optimize_listings ~168

Propose (and, with dry_run=false, apply) optimizations across listings. Uses the sales channel's own demand data, so a listing that people SEE but do not buy is flagged for a listing fix rather than archived — that listing is proven demand with broken conversion, and archiving it destroys the best opportunity in the catalogue. Only a listing the channel reports as genuinely inert is ever archived. Where no demand data is available the proposal is "review" and NOTHING is applied. DEFAULTS TO DRY-RUN; applying only ever archives (never deletes, never goes live). [#170c11]

NameTypeReqDescription
dry_runboolean–Default true — preview only.
scopestring––
store_uuidstring––
workspacestring––

No output schema declared.

No examples provided.

browse_catalog ~355

Browse ONE fulfillment provider's catalog for garments to print on. `category` is resolved against THAT provider's own taxonomy (providers use different vocabularies for the same idea) and an unknown category is rejected with the valid list rather than quietly returning everything. `keyword` matches product names across the whole catalog. ALWAYS read `warnings` in the response: they tell you when your results are narrower than you asked for -- e.g. a category that only exists inside one department. Each garment carries `decoration_method` / `accepts_photoreal` (`accepts_photoreal` absent means the provider publishes no signal -- unchecked, NOT unsuitable). This searches a SINGLE provider: to ask what the whole account can do, or before concluding a garment cannot take a design, use find_garments. Read-only. [#5e449d]

NameTypeReqDescription
categorystring–e.g. "t-shirts", "hoodies", "mugs".
has_aopboolean–Filter to all-over-print garments. All-over print is the weakest part of the decoration signal (not every provider declares the technique, so some are recognised by name) and this searches ONE provid…
keywordstring––
pageinteger––
per_pageinteger––
providerstringyesThe fulfillment provider to browse, by name (case-insensitive). Must be a provider this account has access to — call list_catalog_providers to see valid values (the set is account-specific). An unrec…
workspacestring––

No output schema declared.

No examples provided.

cancel_order ~113

Cancel an order. Cancels it locally and, where possible, cancels the draft/order at the fulfillment provider (Printful/Printify). This does NOT refund the customer on the sales channel — the channel is the source of payment. Destructive: only cancel when the user explicitly asks. [#9e800b]

NameTypeReqDescription
order_uuidstringyesThe order uuid (from list_my_orders / get_order_details).
workspacestring–Workspace uuid to scope to (agency accounts). Omit for Default.

No output schema declared.

No examples provided.

cascade_price_change ~117

Change a product price once and propagate it: the platform cascades to all variants, and (when store_uuid is given) this re-syncs each connected channel so the price is consistent everywhere. Avoids the "changed on one channel, forgot the others" footgun. [#b8aca8]

NameTypeReqDescription
also_update_channelsboolean–Default true.
new_pricenumberyes–
product_uuidstringyes–
store_uuidstring–Required to re-sync channels.
workspacestring––

No output schema declared.

No examples provided.

channel_coverage ~87

Which of your connected sales channels report performance data, and which metrics each one supplies. Check this before concluding a listing has no traffic: a channel that reports nothing looks identical to a channel reporting zeros unless you look here. Also flags shops that must be RECONNECTED before performance data can flow. Read-only. [#df2820]

NameTypeReqDescription
workspacestring–Workspace uuid to scope to.

No output schema declared.

No examples provided.

channel_opportunities ~275

The listings wasting the most demand: proven traffic, broken conversion, ranked by how many people saw them and did not buy. This is the natural starting point for an optimisation pass — fix these before touching anything else, because the demand is already there and only the listing is in the way. Also returns per-state counts and, separately, the listings that are genuinely inert (state "dead") and therefore safe to archive. Nothing else is safe to archive. READ `shop` BEFORE acting on anything else here. If the shop as a whole is getting almost no views, safe_to_archive will be empty and top_opportunities will be thin — not because the listings are fine, but because nothing has been seen enough to judge. That is a distribution problem and no listing edit will move it. Read-only. [#7c8c30]

NameTypeReqDescription
endstring–End date (YYYY-MM-DD), channel-local. Defaults to yesterday.
providerstring–Narrow to one sales channel, by name.
startstring–Start date (YYYY-MM-DD), in the sales channel's own local dates. Defaults to 28 days back.
storestring–Narrow to one store uuid.
workspacestring–Workspace uuid to scope to (agency accounts). Omit for the Default workspace.

No output schema declared.

No examples provided.

channel_performance ~476

What the sales channel reports about each of your listings: impressions, clicks, click-through rate and units sold, plus a state telling you what to do about it. Use this to find listings people SEE but do not BUY — the order-based analytics tools cannot show you those, because to them a listing with 5,000 views and no sales looks identical to one nobody has ever seen. States: winner (scale it), conversion_blocked (lots of views, few clicks — the listing card is losing them), pdp_blocked (they click but do not buy — the product page is losing them), starved (too few views to judge; needs discovery, NOT a rewrite), dead (no activity at all; the only state safe to archive), no_channel_data (synced to the channel, but the channel has never reported it — usually means it is not actually live; check the listing before anything else), insufficient_data (not enough signal, or this channel does not report it). READ `summary.shop` FIRST. If it says no_channel_traffic, the whole shop is barely being served and no per-listing state means anything yet — the problem is distribution, and editing titles or images cannot fix a listing nobody is shown. Each row says which channel and store it came from — always check that before comparing two rows, since a channel product id is only unique within its own channel. ALWAYS check the coverage block before treating a missing metric as zero. Read-only. [#73dd2d]

NameTypeReqDescription
endstring–End date (YYYY-MM-DD), channel-local. Defaults to yesterday.
limitinteger–Cap listings returned.
providerstring–Only listings from this sales channel, by name (e.g. "TikTok Shop"). Case-insensitive. channels_present lists the channels that actually have data.
startstring–Start date (YYYY-MM-DD), in the sales channel's own local dates. Defaults to 28 days back.
statestring–Filter to one state, e.g. "conversion_blocked" to list only proven-demand listings that are failing to convert.
storestring–Only listings from this store uuid.
workspacestring–Workspace uuid to scope to (agency accounts). Omit for the Default workspace.

No output schema declared.

No examples provided.

check_connection_status ~282

Poll whether a dispatched connection has completed. Call this repeatedly after start_channel_connect while the user authorizes in their browser, and announce the result when it lands: they cannot see this conversation from the tab they authorized in, so if you do not tell them, nobody does. Read-only, makes no provider call, and is safe to poll every few seconds. connected true means say so and continue setup. connected false means keep waiting. needs_reconnect means retrying will never work and you must dispatch a fresh link with start_channel_connect. [#807361]

NameTypeReqDescription
provider_uuidstring–The provider you are waiting for — pass the same provider_uuid you gave start_channel_connect. REQUIRED in practice when waiting on a sales channel (Shopify, TikTok Shop): without it this answers onl…
store_uuidstring–Narrow the answer to one store. Omit to get the whole account.
workspacestring–Workspace uuid the store lives in (agency accounts) — use the store's workspace.uuid from list_my_stores. Omit only for single-workspace accounts; omitting it on a multi-workspace account targets the…

No output schema declared.

No examples provided.

check_design_compliance ~118

Advisory pre-flight for IP / trademark / prohibited-content risk. Scans the prompt/name and any detected text against common protected marks. NOT legal advice, and NOT an image-content trademark check. [#fba5cb]

NameTypeReqDescription
design_uuidstring––
image_urlstring––
namestring–The intended product name (scanned).
promptstring–The prompt that produced the design (scanned for risk terms).
target_channelsarray––
workspacestring––

No output schema declared.

No examples provided.

check_design_move ~128

Dry run: report whether a generated design can be MOVED to another workspace, without changing anything. Returns {eligible, blockers} — a non-empty blockers list (a product using the design is in use, or forbidden_source/destination) means move would fail, so copy instead. Read-only. [#1e988c]

NameTypeReqDescription
design_uuidstringyesThe design to check.
destination_workspacestringyesDestination workspace uuid (from list_my_workspaces).
source_workspacestring–The design's current workspace uuid; omit only if it is in your Default workspace.

No output schema declared.

No examples provided.

check_fulfillment_issue ~143

Fetch one fulfillment issue in full (affected items, evidence attachments, provider claim tracking, resolution) and, by default, the provider-ready problem report: a copy-paste summary_text plus the provider dashboard deep-link where the report must be filed (Printful/Printify accept problem reports only in their own dashboards). Read-only. [#2f6bdb]

NameTypeReqDescription
include_reportboolean–Also build the provider-ready problem report (default true).
issue_uuidstringyesThe issue uuid (from list_fulfillment_issues).
workspacestring–Workspace uuid to scope to (agency accounts). Omit for the Default workspace.

No output schema declared.

No examples provided.

check_order_status ~105

Poll the fulfillment provider for the latest status of an order and update it locally (including any design-approval holds). Read-mostly refresh — safe to call repeatedly. Use to see whether an order has shipped or is on hold at the provider. [#81b1a2]

NameTypeReqDescription
order_uuidstringyesThe order uuid (from list_my_orders / get_order_details).
workspacestring–Workspace uuid to scope to (agency accounts). Omit for Default.

No output schema declared.

No examples provided.

check_product_move ~127

Dry run: report whether a product can be MOVED to another workspace, without changing anything. Returns {eligible, blockers} — a non-empty blockers list (e.g. asset_in_use, asset_has_orders, forbidden_source/destination) means move would fail, so copy instead. Read-only. [#81f916]

NameTypeReqDescription
destination_workspacestringyesDestination workspace uuid (from list_my_workspaces).
product_uuidstringyesThe product to check.
source_workspacestring–The product's current workspace uuid; omit only if it is in your Default workspace.

No output schema declared.

No examples provided.

check_setup_readiness ~162

What this account already has, what it still needs, and the single next action to take. Returns ready_to_design / ready_to_fulfill / ready_to_sell, a per-store breakdown, and an ordered next_steps list. Start here for any first-time setup, and call it again after each connection to confirm the state actually changed. Read-only, makes no provider calls, and is safe to poll. [#01f20c]

NameTypeReqDescription
workspacestring–Workspace uuid the store lives in (agency accounts) — use the store's workspace.uuid from list_my_stores. Omit only for single-workspace accounts; omitting it on a multi-workspace account targets the…

No output schema declared.

No examples provided.

check_workspace_deletion ~69

Dry run: preview deleting a workspace (agency / Enterprise) — the stores that would move to the Default workspace and the members whose assignment would be revoked. Changes nothing. Read-only. [#bcfd4e]

NameTypeReqDescription
workspace_uuidstringyesWorkspace uuid (from list_my_workspaces).

No output schema declared.

No examples provided.

confirm_order ~110

Confirm a DRAFT order to send it into production at the fulfillment provider. Only works for orders in "draft" status that have already been submitted to a provider (have a provider order id). Use after submit_order_to_fulfillment on a "prepare, then I confirm" store. [#ebe558]

NameTypeReqDescription
order_uuidstringyesThe order uuid (from list_my_orders / get_order_details).
workspacestring–Workspace uuid to scope to (agency accounts). Omit for Default.

No output schema declared.

No examples provided.

connect_fulfillment_provider ~267

Connect an API-token fulfillment provider (Printify, Gelato) to a store, entirely in chat. Validates the token first, so a bad token fails before anything is stored. If the token maps to more than one shop the result asks you to pick one and lists them — call again with shop_id set. For Printful use start_channel_connect instead: it needs a browser. Never repeat the token back to the user. [#98598c]

NameTypeReqDescription
api_tokenstringyesThe merchant's provider API token. Get the generation URL from list_connectable_providers (credential_url). Treat as a secret: do not echo it.
provider_uuidstringyesProvider uuid (from list_connectable_providers).
shop_idstring–Which shop to connect, when the token maps to several. Omit on the first call.
store_uuidstringyesStore uuid (from list_my_stores or create_store).
workspacestring–Workspace uuid the store lives in (agency accounts) — use the store's workspace.uuid from list_my_stores. Omit only for single-workspace accounts; omitting it on a multi-workspace account targets the…

No output schema declared.

No examples provided.

connect_sales_channel ~202

Connect an API-key sales channel (WooCommerce, Wix) to a store, entirely in chat. For Shopify and TikTok Shop use start_channel_connect instead: they need a browser. Credentials are write-only and are never returned. [#c9093d]

NameTypeReqDescription
credentialsobjectyesChannel credentials, e.g. WooCommerce { store_url, consumer_key, consumer_secret }; Wix { api_key, site_id }. Treat as secrets: do not echo them.
provider_uuidstringyesProvider uuid (from list_connectable_providers).
store_uuidstringyesStore uuid (from list_my_stores or create_store).
workspacestring–Workspace uuid the store lives in (agency accounts) — use the store's workspace.uuid from list_my_stores. Omit only for single-workspace accounts; omitting it on a multi-workspace account targets the…

No output schema declared.

No examples provided.

copy_design_to_workspace ~155

Copy a generated design image into another workspace (agency accounts). Non-destructive: the original stays put and the copy gets its own duplicated image file. Use list_my_workspaces for the destination uuid; pass source_workspace if the design is not in your Default workspace. [#3090dc]

NameTypeReqDescription
design_uuidstringyesThe design to transfer.
destination_workspacestringyesDestination workspace uuid to copy/move into. Get it from list_my_workspaces (resolve a client/brand name to its uuid).
source_workspacestring–The workspace the asset currently lives in. Omit only if it is in your Default workspace; otherwise you must pass it (the platform scopes reads to a single workspace).

No output schema declared.

No examples provided.

copy_product_to_workspace ~168

Copy a product into another workspace (agency accounts). Non-destructive: the original is untouched and the copy lands as an unsynced DRAFT (no store mapping, fresh variants). Use list_my_workspaces to get the destination workspace uuid. If the product lives in a non-Default workspace, pass source_workspace too. [#d046a8]

NameTypeReqDescription
destination_workspacestringyesDestination workspace uuid to copy/move into. Get it from list_my_workspaces (resolve a client/brand name to its uuid).
product_uuidstringyesThe product to transfer.
source_workspacestring–The workspace the asset currently lives in. Omit only if it is in your Default workspace; otherwise you must pass it (the platform scopes reads to a single workspace).

No output schema declared.

No examples provided.

create_collection ~92

Create a new (empty) collection in a store. Provide a name (sent to the platform as the collection title) and an optional description. Add products with add_products_to_collection, then sync_collection to push it to a sales channel. [#ff2c5e]

NameTypeReqDescription
descriptionstring––
namestringyes–
store_uuidstringyes–
workspacestring––

No output schema declared.

No examples provided.

create_product ~457

Create a STANDALONE product from a design (split primitive) — it is NOT placed on any store yet. Applies the correct field names + pricing floor, routes EMBROIDERY garments (caps/beanies) to their real embroidery placement with Printful thread colors (derived or explicit), and defaults face goods (canvas/backpacks/bags/socks/towels/blankets/pillows/cases...) to print_style "fill" (design recomposed onto a matching background, printed edge-to-edge). Set generate_mockup: true to render a garment mockup as the display image (it auto-derives representative variants from the catalog, so you do NOT need mockup_variant_ids) — otherwise the raw design is used as the display image. To get it onto a store and listed, the required sequence is: add_variants -> sync_to_fulfillment(product_uuid, store_uuid) [associates it with the store + syncs to Printful/Printify] -> sync_to_channel [sales channel]. To run that whole pipeline in one call instead, use ship_product. [#e8704a]

NameTypeReqDescription
design_urlstring––
design_uuidstringyesThe design to print. Comes from generate_image / design_apparel, OR from upload_design when the merchant already owns the artwork (a logo, a brand mark, a cleared cover). Never regenerate a mark you…
garmentobjectyes–
generate_mockupboolean––
mockup_variant_idsarray–Representative variant ids for the mockup preview (numeric on Printful/Printify, string productUids on Gelato).
pricingobjectyes–
print_stylestring–How the design sits on the print face. "fill": recompose onto a matching background and print edge-to-edge (default for face goods). "placed": transparency preserved (default for apparel and embroide…
product_metaobjectyes–
thread_colorsarray–EMBROIDERY garments only: explicit Printful thread palette colors. Omit to auto-derive from the design.
workspacestring––

No output schema declared.

No examples provided.

create_store ~129

Create a new ApparelHub store. Only a name is required. The store starts CLOSED — connect a fulfillment provider (Printful/Printify), then call activate_store to make it ACTIVE. In an agency account pass workspace=<uuid> to create it in a specific client workspace. [#9d5cbc]

NameTypeReqDescription
descriptionstring–Optional store description.
logostring–Optional logo image URL.
namestringyesStore name (must be unique within the account).
workspacestring–Workspace uuid to scope to (agency accounts). Omit for the Default workspace.

No output schema declared.

No examples provided.

create_workspace ~77

Create a new workspace in the account (agency / Enterprise). Name must be unique within the account. Needs an account-wide key; a tier without the agency feature gets feature_unavailable. Returns the new workspace uuid. [#51f6a7]

NameTypeReqDescription
namestringyesWorkspace name (unique within the account, max 128 chars).

No output schema declared.

No examples provided.

delete_collection ~69

Delete a collection. If it is synced to any sales channel, the platform unsyncs it there first. The member products are NOT deleted, only the grouping. [#afdbfe]

NameTypeReqDescription
collection_uuidstringyes–
store_uuidstringyes–
workspacestring––

No output schema declared.

No examples provided.

delete_design ~89

Permanently delete a design and its stored files. Irreversible. Refused with design_in_use if any live product still uses the design, in which case archive_design is the safe alternative. Use archive_design unless the design genuinely must be erased. [#02e216]

NameTypeReqDescription
design_uuidstringyesThe design uuid to delete permanently.
workspacestring–Workspace uuid (agency accounts).

No output schema declared.

No examples provided.

delete_product ~101

Delete (default) or archive a product. Hard delete cascades to variants; if the product is synced to channels, unsync it first to avoid orphan listings — unsync_from_channel for one channel, archive_product for all of them. (sync_to_channel cannot unsync; it only syncs.) [#020483]

NameTypeReqDescription
archive_onlyboolean–Default false (hard delete).
product_uuidstringyes–
workspacestring––

No output schema declared.

No examples provided.

delete_workspace ~73

Delete a workspace (agency / Enterprise). Its stores are reassigned to the Default workspace and member assignments revoked first. The Default workspace cannot be deleted. Preview with check_workspace_deletion. Needs an account-wide key. [#c566a1]

NameTypeReqDescription
workspace_uuidstringyesWorkspace uuid (from list_my_workspaces).

No output schema declared.

No examples provided.

describe_listing_attributes ~679

Discover the channel-defined listing fields you can set — TikTok product attributes, eBay item specifics, WooCommerce product attributes — and what is currently set. READ-ONLY. Call this BEFORE set_listing_attributes or set_channel_settings: the field names and their allowed values are defined by the channel, so guessing them gets the value dropped. Pass `product_uuid` for one listing, or `integration_uuid` alone for the shop-wide settings (compliance answers, the shipping template, and a fallback size chart). BRAND and the per-listing SIZE CHART are per-PRODUCT, not shop-wide — both describe the blank, so a shop selling two blanks needs two values, and a shop-wide size chart would replace the accurate per-garment one on every other listing at once. Ask for them with `product_uuid`. Each field carries `value_type`, `cardinality` (single vs multi), `free_text` (whether a value outside the list is accepted) and `requirement`. Those are separate on purpose: most fields are enumerated AND accept free text, so neither flag alone tells you what is legal. `requirement: "conditional"` means the field only becomes required once `required_when` holds — typically after you answer a related question one particular way. `values` is what is LIVE ON THE CHANNEL, which is not the same as what was last written from here: platform auto-fills and merchant edits made directly in the channel's own admin show up here too. That drift is usually the most useful thing in the response. `unset_required` lists fields that are required and empty. Those are NOT filled in for you, deliberately — several are legal attestations. Left unset, the channel picks its own default or grades the listing down, so they are worth resolving with the merchant. ⚠️ CHECK `resolved_for.resolution` when it is present. `explicit_override` means the merchant chose the category. `keyword_match` means it was GUESSED from the product name, and a wrong guess means these fields belong to a different kind of product…

NameTypeReqDescription
include_valuesstring–'all', or a comma-separated list of field keys, to inline allowed values that are elided by default.
integration_uuidstring–Which connected sales channel. Required when `product_uuid` is omitted; otherwise only needed if the store has more than one channel connected.
product_uuidstring–The listing to inspect. Omit for the shop-wide settings.
store_uuidstringyes–
workspacestring––

No output schema declared.

No examples provided.

design_apparel ~266

End-to-end apparel design with the platform lessons baked in: solid-green-background prompt, transparency keying, and (optionally) a local text check. Returns ready-to-use design(s). Streams progress. Set needs_transparency=false for all-over-print products. Rate-limit errors are classified (model_rate_limited = one model's provider vs platform_rate_limited = this key's ApparelHub throttle vs request_not_sent = the call never reached ApparelHub), and each design's fallback_trail shows any model substitutions. This GENERATES new artwork — when the merchant already owns the file (a logo, a brand mark, a cleared cover), use upload_design instead and do not regenerate their mark. [#d84efc]

NameTypeReqDescription
countinteger––
garment_typestring–Hints source selection.
needs_transparencyboolean––
no_fallbackboolean–Disable the model-fallback ladder. By default a rate-limited/transient model transparently retries with a different model (per-design fallback_trail); set true to fail on the chosen source alone.
promptstringyes–
sourcestring––
stylestring––
verify_textboolean––
workspacestring––

No output schema declared.

No examples provided.

diagnose_tiktok_listings ~627

Diagnose TikTok Shop listing quality and optionally apply TikTok's own recommendations. TikTok grades each listing POOR/FAIR/GOOD and a low grade suppresses reach. Returns, per listing: the current tier, the machine-readable issues behind it (code + how_to_solve + the tier that ONE fix unlocks), and TikTok's recommended search terms / titles / descriptions. READ-ONLY unless you pass `apply`. `apply:['search_terms']` is the safe default action — search terms are hidden listing metadata. Passing 'title' or 'description' replaces merchant-visible copy with machine-generated text, so ask the user first; those land on a TikTok-ONLY override and never rewrite the shared product record (which would also change the Shopify/WooCommerce/Wix listings). Use `dry_run` to preview. IMPORTANT — TikTok often flags a title WITHOUT offering a replacement, so `apply:["title"]` returns no_recommendation. That is not a dead end: each listing also carries `requirements` (the computed target, e.g. 40-150 chars — TikTok's own length rules contradict each other and this is the intersection), `building_blocks` (the product's real garment/colors/sizes, so you write from facts rather than inventing them), and `candidates.title` (ready-to-use options, shortest first, each already validated against the requirements). Offer the candidates to the user, or write your own title to the requirements and set it via update_product tiktok_listing.title. Check `issues[].fixable_by` before acting: `photography` means the listing needs new imagery, not better writing — report it rather than trying to write around it. ⚠️ `diagnosable` means "TikTok returned a diagnosis", NOT "this listing is live". TikTok also answers for deactivated and deleted listings, so a catalog can come back entirely diagnosable:true while a third of it is no longer for sale. Read `listing_health` for liveness: "Removed" is gone, "Needs Attention" is present but not visible to buyers, and null means we have never checked — which is NO…

NameTypeReqDescription
applyarray–Omit for a read-only diagnosis. Provide the fields to overwrite with TikTok's recommendations.
dry_runboolean–With `apply`: report what would change without writing or syncing.
integration_uuidstring–Only needed when the store has more than one connected TikTok Shop integration.
product_uuidsarray–Limit to these products. Omit to cover every listing synced to TikTok.
store_uuidstringyes–
workspacestring––

No output schema declared.

No examples provided.

estimate_order_costs ~237

Estimate production + shipping + tax + total for an order WITHOUT creating it (read-only against the fulfillment provider, no order placed). Give the store, the recipient, and the variants + quantities. Use to preview landed cost before placing an order. AVAILABLE FOR PRINTFUL AND GELATO ONLY: Printify offers no pre-order estimate, so a Printify-fulfilled store returns a refusal rather than a number — do not retry it, and do not present a cross-provider landed-cost comparison that silently omits Printify. Both country_code AND address1 are required; the platform rejects the request without a street address. The variants must already be synced to the fulfillment provider. [#a2bd48]

NameTypeReqDescription
currencystring–Currency code (defaults to USD).
itemsarrayyesLine items to price.
recipientobjectyesShip-to details. country_code and address1 are both required; city/state/zip improve accuracy.
store_uuidstringyesThe store the order would be placed in.
workspacestring–Workspace uuid to scope to (agency accounts). Omit for the Default workspace.

No output schema declared.

No examples provided.

Common questions

What is the ApparelHub MCP server?

ApparelHub is an MCP server listed in the public MCP registry as io.github.ApparelHub-AI/apparelhub-mcp. Run a custom-merch store from an agent: design, build products, list on every channel, fulfill. This page covers its npm package (@apparelhub/mcp-server).

Is the ApparelHub MCP server safe to use?

ApparelHub scores 63 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 29 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the ApparelHub MCP server expose?

ApparelHub exposes 123 tools: check_setup_readiness, list_connectable_providers, connect_fulfillment_provider, connect_sales_channel, start_channel_connect, and 118 more. Their descriptions and schemas cost roughly 22,846 tokens of context every time the server is loaded.

Is the ApparelHub MCP server still maintained?

ApparelHub is still listed as active in the MCP registry. We last reached this channel on 29 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the ApparelHub MCP server under?

ApparelHub declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.