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
set_listing_attributes ~564

Set channel-defined listing attributes on ONE product (Material, Style, Washing Instructions and similar). Call describe_listing_attributes first to learn the field keys and their allowed values. A PARTIAL WRITE SUCCEEDS. Send four values with one bad and the three good ones are stored while the bad one is reported — you do not have to get them all right at once. A value the channel refuses comes back in `rejected` with a machine-readable `reason` and the allowed values echoed, so you can correct it in one more turn rather than guessing. Rejections are never dropped silently. ⛔ NEVER INVENT A VALUE. Relay what the merchant told you. If you cannot get a value from them, leave it UNSET and say so — an unset field is honest, an invented one is not. Do not infer it from the product type, do not copy it from another shop, and do not pick the nearest allowed value because it looks close. 📏 SIZE CHART. US apparel is graded down without one. A chart is normally rendered automatically from the fulfillment provider's real measurements, so most listings need nothing. When one IS flagged, prefer `size_chart_measurements` (an object — call import_size_measurements to fill it from the provider) over `size_chart_template_id`: the template id can only come from a human in the channel's own admin, because the channel publishes no way to list, verify or correct one. ⛔ NEVER INVENT MEASUREMENTS. They are what a buyer reads before choosing a size. Do not derive a table from the garment type, do not copy one from a similar product, and do not fill a gap with a plausible number. A malformed table is refused whole, with a reason — nothing is half-applied. A missing cell is fine and renders blank; an invented one means somebody receives a garment that does not fit. Setting a value does NOT change the live listing on its own — the channel is updated on the next sync. Pass `sync: true` to push it immediately, or run sync_to_channel afterwards. [#ef218b]

NameTypeReqDescription
integration_uuidstring–Only needed when the store has more than one connected channel.
product_uuidstringyes–
removearray–Field keys to clear.
store_uuidstringyes–
syncboolean–Push the listing to the channel immediately after storing.
valuesobjectyesfield key -> value. Use an array for a field whose `cardinality` is "multi", and an object for one whose `value_type` is "object" (build it from that field's `channel_ref.object_schema`). Values are…
workspacestring––

No output schema declared.

No examples provided.

set_order_payment_method ~115

Change the recorded payment method on an order that already has a payment recorded (e.g. correct "stripe" to "sales_channel"). This is a bookkeeping label change; it does not move any money. [#588a7f]

NameTypeReqDescription
order_uuidstringyesThe order uuid to update.
payment_methodstringyesThe new payment method label (e.g. "sales_channel", "stripe").
workspacestring–Workspace uuid to scope to (agency accounts). Omit for the Default workspace.

No output schema declared.

No examples provided.

set_prices_by_margin ~204

Set each variant's price to hit a target profit margin off its OWN cost: price = cost / (1 - margin). Reads per-variant production cost (populated after the fulfillment sync), applies a per-variant price, then re-syncs connected channels. Use this instead of one flat price when costs tier by size (larger sizes cost more, so a single price gives a different margin per size — and can go negative on the biggest). Requires store_uuid (cost lives on the store-products list, not product detail). [#54cd6b]

NameTypeReqDescription
also_update_channelsboolean–Default true.
marginnumberyesTarget profit margin as a fraction of the selling price, e.g. 0.15 = 15%.
product_uuidstringyes–
store_uuidstringyesThe store the product is in — needed to read per-variant cost and to re-sync channels.
workspacestring––

No output schema declared.

No examples provided.

set_product_images ~553

Set an existing product's listing images: attach an uploaded photo or a generated lifestyle shot, reorder them, and choose the cover. Use this AFTER the product exists — create_product / ship_product pick the initial mockup themselves. ⚠️ THE LIST REPLACES, IT DOES NOT MERGE. What you send becomes the whole gallery, in the order given. To add one image, READ the current list first and send it back with the new entry in it — sending the new entry alone deletes every other image. Pass `images: null` to reset the gallery back to the product's provider mockups. ⚠️ ORDER IS FUNCTIONAL, NOT COSMETIC. Channels cap how many images a listing may carry and TRUNCATE IN GALLERY ORDER, so position decides what actually ships: TikTok Shop takes 9, Wix 15, Shopify and WooCommerce are unlimited. On a capped channel an image in position 10 is not a lower-priority image, it is an absent one. Put the images that must survive first. The platform stores at most 20. Each entry carries provenance. `source` says where the file came from (mockup / upload / ai_mockup / print_file / unknown). `ai_generated` is SEPARATE and tri-state on purpose: an uploaded photo may itself have been AI-generated and the platform cannot detect that, so only you can say. Set it truthfully — true, false, or leave it unset when you genuinely do not know. Do not guess it from `source`. `cover` sets the display image independently of order, so the cover need not be first. A cover that is not in the gallery is added to it. Replace the gallery without naming a cover and the cover follows to the new first image. CONCURRENCY: this reads the product first and passes its version back with the write, so a change someone else made in between is REFUSED rather than silently overwritten. On a conflict the tool re-reads and returns `conflict: true` with the current images — it does NOT retry, because the list you built was based on a gallery that no longer exists. Rebuild from `current_images` and call again. [#781240]

NameTypeReqDescription
coverstring–URL of the image to show as the listing cover. Independent of gallery order. Added to the gallery if it is not already in it.
images––The COMPLETE ordered gallery, replacing whatever is there. Null resets to the product's provider mockups. Omit to change only the cover.
product_uuidstringyesThe product whose listing images to set.
workspacestring–Workspace uuid (agency accounts).

No output schema declared.

No examples provided.

ship_product ~582

End-to-end pipeline in ONE call: take a design, generate + verify a mockup (one per imported color, so every color variant has a matching mockup), create the product with the correct field names, add all variants, associate with a store, sync to fulfillment, then (optionally) sync to sales channels as DRAFT. Handles EMBROIDERY garments automatically WHEN the garment is actually embroidered: routes the design to the real embroidery placement and attaches thread colors (derived from the design, or pass thread_colors). Headwear is NOT inherently embroidered -- some providers carry printed (DTF) caps that take photoreal art as-is, so check `accepts_photoreal` on the garment rather than assuming, and call find_garments before concluding a design cannot go on a hat. Face goods (canvas, posters, backpacks, bags, socks, towels, blankets, pillows, cases...) default to print_style "fill": the design is recomposed onto an aesthetically matching background and printed edge-to-edge, so no green-screen background or contrasting borders reach the product. Enforces pricing floors and guards the AQUA-vs-Navy variant trap. Streams progress. PREFER this over chaining create_product + add_variants + sync_to_fulfillment + sync_to_channel yourself — especially for AUTOMATED or SCHEDULED runs — because it guarantees the correct order (store association + fulfillment sync BEFORE any channel sync). Use the split primitives only when you deliberately need a partial/interactive flow. [#232f74]

NameTypeReqDescription
design_urlstring–The design URL, if known (else resolved).
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–Default true.
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 like canvas/backpacks/bags/socks/towels/blankets/pillows/cases). "pl…
product_metaobjectyes–
store_uuidstring–Omit to create a standalone (unassociated) product.
sync_to_channelsarray––
thread_colorsarray–EMBROIDERY garments only: explicit Printful thread palette colors. Omit to auto-derive from the design (mapped to the fixed 15-color palette).
variantsarrayyes–
workspacestring––

No output schema declared.

No examples provided.

start_channel_connect ~466

Begin a browser-based connection (Printful, Shopify, TikTok Shop, Fourthwall). Shopify additionally requires shop_url, the merchant myshopify domain — ask for it before calling. Returns an authorization URL to give the user. THE CONNECTION IS NOT FINISHED WHEN THIS RETURNS. You must keep polling check_connection_status (passing the same provider_uuid) until it reports connected, then tell the user. The browser tab where they authorize is NOT this conversation and cannot report back to you, so polling is the only way you or they will learn it worked. Poll every few seconds, up to about two minutes, and if it has not landed by then ask whether they finished authorizing rather than giving up silently. If they need to create an upstream account first, let them, then call this again for a fresh link. [#6d4006]

NameTypeReqDescription
callback_urlstring–OMIT THIS. The platform fills in the callback registered with the provider, and for Shopify that registered URL is the only one that works — anything else is refused, either by us or by Shopify with…
kindstringyesWhich family this provider belongs to (from list_connectable_providers.family).
provider_uuidstringyesProvider uuid (from list_connectable_providers).
shop_urlstring–Required for Shopify only: the merchant's myshopify domain, e.g. your-store.myshopify.com. Ask the user for it; it is the domain in their Shopify admin URL, not their custom storefront domain. Omit f…
store_namestring–Name for a NEW store, when connecting fulfillment without an existing store_uuid.
store_uuidstring–Store to attach to. Required for sales_channel. For fulfillment, omit it together with store_name to create a new 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.

submit_order_to_fulfillment ~116

Manually submit an order to its fulfillment provider (Printful/Printify) as a DRAFT. For sales-channel orders this auto-fetches the recipient from the channel. Use to un-stick a paid order that never got submitted; confirm it afterward with confirm_order if the store requires confirmation. [#437d68]

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.

sync_collection ~116

Sync a collection to a sales channel (creates/updates the channel-side category and places all products in it that are already synced there). integration_uuid selects which channel; not all channels support collections (e.g. TikTok Shop), which returns a clear "collections_unsupported" error. [#7f246a]

NameTypeReqDescription
collection_uuidstringyes–
integration_uuidstringyesThe sales-channel integration to sync this collection to (required by the platform).
store_uuidstringyes–
workspacestring––

No output schema declared.

No examples provided.

sync_orders ~91

Pull the latest orders from connected fulfillment providers. Pass store_uuid to sync one store; omit it to sync all of your stores. Use to refresh orders that have not come through yet. [#64e731]

NameTypeReqDescription
store_uuidstring–Scope the sync to one store (omit for all stores).
workspacestring–Workspace uuid to scope to (agency accounts). Omit for the Default workspace.

No output schema declared.

No examples provided.

sync_to_channel ~193

Sync one product to a sales channel (WooCommerce/Shopify/Wix) as a listing. PREREQUISITE: the product must first be associated with the store AND synced to its fulfillment provider — call sync_to_fulfillment(product_uuid, store_uuid) FIRST (it does the store association too). If that prerequisite is missing, this tool now AUTO-HEALS it (associate + fulfillment-sync, then retries once) instead of failing with "product not associated with store" — but the clean, explicit order is sync_to_fulfillment then sync_to_channel, and ship_product does the whole pipeline in one call. Defaults to DRAFT — only push live when the user explicitly asks. [#32962d]

NameTypeReqDescription
integration_uuidstringyes–
product_uuidstringyes–
statestring––
store_uuidstringyes–
workspacestring––

No output schema declared.

No examples provided.

sync_to_fulfillment ~108

Associate a product with a store AND sync it to that store's fulfillment provider (Printful/Printify). This is the REQUIRED step before sync_to_channel: it both puts the product on the store (a product from create_product is standalone) and creates the manufacturing path the sales-channel listing binds to. Run it after the product has variants. [#58f859]

NameTypeReqDescription
product_uuidstringyes–
store_uuidstringyes–
workspacestring––

No output schema declared.

No examples provided.

unapprove_order ~99

Revert an approved order back to pending so it can be reviewed / re-approved. Only works if the order has NOT yet been submitted to the fulfillment provider. Use to undo an approve_order that was done too early. [#1d050e]

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.

unarchive_store ~87

Restore an archived store. It comes back as CLOSED (or ACTIVE if a fulfillment provider is still connected); if it landed CLOSED, connect a provider and call activate_store to reopen it. [#468f04]

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

No output schema declared.

No examples provided.

unassign_workspace_member ~80

Revoke a member's assignment to a workspace (agency / Enterprise). The account owner cannot be unassigned from the Default workspace. Needs an account-wide key. [#7d3ad6]

NameTypeReqDescription
user_public_idstringyesThe member's user public_id.
workspace_uuidstringyesWorkspace uuid (from list_my_workspaces).

No output schema declared.

No examples provided.

unsync_from_channel ~169

Remove a product from ONE sales channel, leaving every other channel and the fulfillment provider untouched. The product stays in ApparelHub; only that channel listing goes away. Use this to delist from a single channel — do NOT hand-roll it against the raw unsync endpoint: that endpoint is product-level and defaults to detaching fulfillment AND cascading to every channel, so getting the parameters slightly wrong unsyncs far more than you asked for. To remove a product from EVERYTHING, use archive_product instead. [#bd6407]

NameTypeReqDescription
integration_uuidstringyesThe sales-channel integration to remove the listing from. Required: without it the platform would cascade to fulfillment and every other channel.
product_uuidstringyes–
store_uuidstringyes–
workspacestring––

No output schema declared.

No examples provided.

update_collection ~83

Update a collection's name and/or description. A name change is sent to the platform as the collection title. Editing a synced collection marks it for re-sync. [#1d73cf]

NameTypeReqDescription
collection_uuidstringyes–
descriptionstring––
namestring––
store_uuidstringyes–
workspacestring––

No output schema declared.

No examples provided.

update_product ~157

Update a product (name, description, price). For a price change that must propagate to synced channels, prefer cascade_price_change. Optionally set tiktok_listing to enrich the TikTok Shop listing (SEO search terms, product highlights, brand, packaging, TikTok-only title/description, and category_id) — applied when the product is synced to a TikTok channel; ignored by other channels. For channel-defined ATTRIBUTES (Material, Style, Washing Instructions...) use set_listing_attributes instead: it validates against the listing category's real schema and tells you which values the channel refused, which this tool cannot. [#c20857]

NameTypeReqDescription
changesobjectyes–
product_uuidstringyes–
workspacestring––

No output schema declared.

No examples provided.

update_store_settings ~518

Update a store's fulfillment workflow / notification settings. Only the fields you pass are changed. fulfillment_mode: "auto" (auto-pilot: paid -> draft -> auto-confirm -> production), "confirm" (auto-draft, you confirm each order), "review" (held before submission for approval). The hold_* guardrails escalate an otherwise-auto/confirm order to a pre-submission review. Set hold_orders_above_amount / hold_below_margin_pct to null to disable that guardrail. hold_channel_risk_review is ON by default and OVERRIDES fulfillment_mode (including "auto"): an order the sales channel is reviewing is never sent to fulfillment while it may still be voided. [#fe3014]

NameTypeReqDescription
approval_authoritystring–Who decides when a review is required: human (UI queue), agent (API/callback), rules (auto unless a guardrail trips).
auto_fulfill_on_paymentboolean–Auto-submit to the provider once payment clears.
auto_reconcile_ordersboolean–Periodically re-sync open sales-channel orders with their channel (manual reconcile always works regardless).
fulfillment_modestring–Automation level: auto (auto-pilot), confirm (you confirm each), review (approve before submit).
hold_below_margin_pctnumber|null–Auto-hold orders below this profit-margin percent. null disables the guardrail.
hold_channel_risk_reviewboolean–ON by default. Hold an order the SALES CHANNEL has flagged as under its own risk review, so it is never sent to fulfillment while the channel may still void it. Unlike the other guardrails this one O…
hold_first_time_customerboolean–Auto-hold the first order from a new customer.
hold_on_negative_marginboolean–Auto-hold orders that would lose money.
hold_orders_above_amountnumber|null–Auto-hold orders whose total exceeds this amount. null disables the guardrail.
notify_on_new_orderboolean–Send a notification when a new order arrives.
notify_on_shipmentboolean–Send a notification when an order ships.
require_payment_before_fulfillboolean–Block fulfillment until the order is paid.
store_uuidstringyesThe store uuid to update.
workspacestring–Workspace uuid to scope to (agency accounts). Omit for the Default workspace.

No output schema declared.

No examples provided.

update_workspace ~94

Rename a workspace or archive/unarchive it (agency / Enterprise). The Default workspace cannot be archived. Needs an account-wide key. [#e8ebf4]

NameTypeReqDescription
archivedboolean–Archive (true) or unarchive (false). Ignored for the Default workspace.
namestring–New name (max 128 chars).
workspace_uuidstringyesWorkspace uuid (from list_my_workspaces).

No output schema declared.

No examples provided.

upload_design ~637

Upload artwork the merchant ALREADY OWNS and turn it into a design_uuid usable by create_product / ship_product. This is the way to build products from a client's own files — a logo, a brand mark, a cleared cover, a photograph — instead of generating something new. If a client says their mark must not be redrawn, use this; never regenerate or approximate a mark to work around a missing file. Three ways to supply the file, pick the cheapest one available: 1. `source_url` — an https URL the server can fetch. One call, no context cost. Best when the asset is already hosted or reachable by link (the link must not require sign-in). 2. no source at all — returns a presigned `upload_url` you PUT the bytes to yourself, then call this tool again with the returned `image_uuid` to finish. No context cost, full resolution, and the right choice whenever you can make an HTTP request (curl, fetch, requests). 3. `image_base64` — inline bytes. Works anywhere, but costs roughly 350k tokens per megabyte of file, so reserve it for small files when neither of the above is possible. Accepts PNG, JPEG, WEBP and SVG. SVG is the BEST input for a logo or mark: it is rendered server-side at print resolution, so it stays crisp at any size. Two things must be true of the SVG first — text converted to outlines, and any linked image embedded — otherwise the upload is refused with instructions rather than silently losing that part of the artwork. For pixel art, or any hard-edge raster mark that must stay crisp, pass upscale="pixel" so a small file is enlarged without being smoothed. [#85542c]

NameTypeReqDescription
content_typestring–Declared MIME type. Detected from the file when the bytes are supplied, so it is only needed for the presigned mode (defaults to image/png). Use image/svg+xml to upload vector.
filenamestring–Original filename. Used for the default title.
image_base64string–Base64-encoded file bytes (a data: URI is accepted). Expensive in context — prefer source_url or the presigned mode. Capped at 4MB decoded.
image_uuidstring–Finish a presigned upload: pass the image_uuid from a previous upload_design call after you have PUT the bytes. Also use this to resume polling if processing was still running.
source_urlstring–Public https URL of the artwork. The server fetches it. Must not require sign-in.
titlestring–Display title for the design. Defaults to the filename stem.
upscalestring–How to resample if the file is below the 512px print minimum. "pixel" = nearest-neighbour, keeps pixel art and hard-edge marks crisp. "smooth" = for photographic art. "auto" (default) detects. Pass "…
workspacestring–Workspace uuid (agency accounts).

No output schema declared.

No examples provided.

verify_design_quality ~97

Local QC gate for a design: transparency correctness (alpha, clean corners, white premultiply), resolution, and detected text. Returns a 0-100 score + issues. Needs local Python + Pillow. [#8e74ec]

NameTypeReqDescription
design_uuidstringyes–
image_urlstring––
needs_transparencyboolean–Default true; set false for all-over-print.
workspacestring––

No output schema declared.

No examples provided.

verify_design_text ~117

Read the text in a design with local OCR (tesseract) when available, so the agent can confirm spelling. Advisory: pass expected_text to get a match verdict, otherwise the detected text is returned for visual review. has_text is null when OCR is unavailable, meaning UNKNOWN — not "no text"; read the design image yourself in that case. [#57c0af]

NameTypeReqDescription
expected_textstring––
image_urlstring––
image_uuidstringyes–
workspacestring––

No output schema declared.

No examples provided.

verify_mockup_quality ~186

QC gate for a rendered product MOCKUP (verify_design_quality checks the design; this checks the render on the garment). Deterministically catches three defects that have actually shipped: an un-keyed chroma-green background printed onto the product, an empty render, and a render too small to judge. It does NOT decide whether the design is upright, clipped, seam-split, or whether every face is printed: those need looking at the image, and a pixel statistic that guessed would be confidently wrong on exactly those cases. It returns a fixed visual_checklist for you to answer by VIEWING the render, so grading is consistent across callers. Treat a clean result as "no hard defect found", not "the mockup is good" until you have answered the checklist. [#feb72a]

NameTypeReqDescription
preview_urlstringyesURL of the rendered mockup to grade.

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.