Moltline Shopify Prep
Check a product CSV, handles, variant matrices and metafield keys. 4 of 6 free.
我該用這個嗎
品質與安全性
發現項目(1)
- LOW在 url_handle 中
根據工具定義與協定合規性的自動化分析。
上下文成本
這是每次將伺服器的工具載入模型上下文時所消耗的約略 token 數量。數量越高,可用於其他工作的注意力就越少。
安裝
一鍵安裝
將以下內容加入你的 `claude_desktop_config.json` 檔案:
{
"mcpServers": {
"shopify": {
"url": "https://mcp.moltlinestudio.com/shopify"
}
}
}遠端端點
https://mcp.moltlinestudio.com/shopifystreamable-http它能做什麼
工具清單
工具(6)
🟢product_csv_check(header_row, mode)
Check a product CSV's header row against Shopify's current columns. FREE. Catches the failure that wastes the most time: a template copied from an out-of-date guide, using column names Shopify renamed. Typical input {"header_row": ["Handle", "Title", "Body (HTML)", "Variant Price"]} returns {"ok": false, "missing_required": [], "renamed": [{"found": "Handle", "use": "URL handle"}, ...], "unrecognised": [], "verdict": "..."}. Use before an import, on the header row alone. Not for whether the values in the rows are valid — check a handle with url_handle and a metafield key with metafield_key_check. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "header_row must contain at least one column name"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
輸入結構描述
{
"type": "object",
"properties": {
"header_row": {
"items": {
"type": "string"
},
"type": "array",
"description": "The CSV's first row as a list of column names, exactly as\nwritten in the file, e.g. [\"Handle\", \"Title\", \"Variant Price\"]."
},
"mode": {
"default": "new",
"pattern": "^(new|update)$",
"type": "string",
"description": "\"new\" when creating products, where Shopify requires only Title;\n\"update\" when changing existing ones, where it also requires URL\nhandle. Default \"new\"."
}
},
"required": [
"header_row"
],
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"additionalProperties": true
}🟢url_handle(title, existing)
Turn a product title into a valid, unique Shopify URL handle. FREE. Shopify handles are lowercase, may contain letters, numbers and dashes, and may not contain spaces. Typical input {"title": "Men's Merino Wool Socks (2-Pack)"} returns {"handle": "mens-merino-wool-socks-2-pack", "valid": true, "changed": true, "collisions": []}. Use when generating handles for an import, or checking one you already have. Not for validating a whole header row — that is product_csv_check. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "title must not be empty"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
輸入結構描述
{
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "The product title or a candidate handle, e.g. \"Men's Merino\nWool Socks\"."
},
"existing": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Handles already used in the store or the file, so a\ncollision can be reported and a suffixed alternative suggested.\nOptional."
}
},
"required": [
"title"
],
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"additionalProperties": true
}🟢variant_matrix(options, max_variants, max_options, list_rows)
Count the variants a set of options produces, and flag the ceilings. FREE. Option counts multiply, so three modest lists become a number nobody intended. Typical input {"options": {"Size": ["S", "M", "L"], "Colour": ["Black", "Navy"]}} returns {"option_count": 2, "variant_count": 6, "within_limits": true, "per_option": {"Size": 3, "Colour": 2}}. Use before building an import file, to find out whether the catalogue needs splitting into several products. Not for validating the resulting CSV's columns — that is product_csv_check. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "options must contain at least one option"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
輸入結構描述
{
"type": "object",
"properties": {
"options": {
"additionalProperties": {
"items": {
"type": "string"
},
"type": "array"
},
"type": "object",
"description": "Option names mapped to their values, e.g. {\"Size\": [\"S\",\n\"M\"], \"Colour\": [\"Black\"]}. Each list needs at least one value."
},
"max_variants": {
"default": 2048,
"minimum": 1,
"type": "integer",
"description": "Ceiling to check against. Default 2048, which is the\nlimit Shopify announced on 15 October 2025, up from 100. Override\nit if your plan differs."
},
"max_options": {
"default": 3,
"minimum": 1,
"type": "integer",
"description": "Ceiling on distinct option names. Default 3."
},
"list_rows": {
"default": false,
"type": "boolean",
"description": "When true, also return every variant combination. Off by\ndefault because the list can be very large."
}
},
"required": [
"options"
],
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"additionalProperties": true
}🟢metafield_key_check(namespace, key, value_type)
Validate a metafield namespace and key before you define it. FREE. Shopify metafield namespaces and keys are lowercase alphanumerics and underscores; a capital letter or a dash is rejected at definition time, usually after the rest of the import has already run. Typical input {"namespace": "custom", "key": "Care-Instructions"} returns {"ok": false, "problems": ["key: dashes and capitals are not allowed"], "suggested_key": "care_instructions"}. Use when designing metafields. Not for the CSV column that carries them — that is product_csv_check. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"}. Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
輸入結構描述
{
"type": "object",
"properties": {
"namespace": {
"type": "string",
"description": "The metafield namespace, e.g. \"custom\"."
},
"key": {
"type": "string",
"description": "The metafield key, e.g. \"care_instructions\"."
},
"value_type": {
"default": "single_line_text_field",
"type": "string",
"description": "The intended metafield type, echoed back for your record,\ne.g. \"single_line_text_field\". Not validated against Shopify's\ntype list, which changes."
}
},
"required": [
"namespace",
"key"
],
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"additionalProperties": true
}🟢bulk_price_change(prices, change_pct, change_flat, round_to, charm_ending)
Apply one pricing rule across a list of prices and show the effect. PREMIUM (license). Percentage first, then the flat amount, then rounding — stated explicitly because the order changes the answer. Typical input {"prices": [19.99, 24.5], "change_pct": 10, "charm_ending": ".99"} returns {"rows": [{"was": 19.99, "now": 21.99}, {"was": 24.5, "now": 26.99}], "total_was": 44.49, "total_now": 48.98, "uplift_pct": 10.09}. Use when repricing a catalogue before export. Not for what a price nets you after Shopify's fees — that is payout_estimate. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "prices must contain at least one price"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
輸入結構描述
{
"type": "object",
"properties": {
"prices": {
"items": {
"type": "number"
},
"type": "array",
"description": "Current prices, at least one, each greater than 0."
},
"change_pct": {
"default": 0,
"type": "number",
"description": "Percentage change applied first, e.g. 10 to raise by 10%\nor -5 to cut by 5%. Default 0."
},
"change_flat": {
"default": 0,
"type": "number",
"description": "Flat amount applied after the percentage. Default 0."
},
"round_to": {
"default": 0.01,
"exclusiveMinimum": 0,
"type": "number",
"description": "Rounding increment applied last, e.g. 0.01 or 0.05.\nDefault 0.01."
},
"charm_ending": {
"default": "",
"type": "string",
"description": "Force every price to end in these cents, e.g. \".99\" or\n\".95\". Applied after rounding. Empty by default."
}
},
"required": [
"prices"
],
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"additionalProperties": true
}🟢payout_estimate(order_total, fee_pct, fee_fixed, refund_rate_pct, orders)
Estimate what actually lands in the bank after processing fees. PREMIUM (license). Typical input {"order_total": 84.5, "fee_pct": 2.9, "fee_fixed": 0.3, "orders": 120, "refund_rate_pct": 4} returns {"gross": 10140.0, "fees": 330.06, "refunds": 405.6, "net_payout": 9404.34, "effective_fee_pct": 3.26}. Use for cash-flow planning. Not as an authoritative fee schedule: rates depend on your plan, country and card mix, so pass your own. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"}. Every call is read-only and idempotent, so after correcting the input it is always safe to retry.
輸入結構描述
{
"type": "object",
"properties": {
"order_total": {
"exclusiveMinimum": 0,
"type": "number",
"description": "Value of one order including anything the processor\ntakes a percentage of. Must be greater than 0."
},
"fee_pct": {
"default": 2.9,
"minimum": 0,
"type": "number",
"description": "Percentage fee per transaction. Default 2.9 — a common\npublished rate, not a promise about your account."
},
"fee_fixed": {
"default": 0.3,
"minimum": 0,
"type": "number",
"description": "Fixed fee per transaction. Default 0.30."
},
"refund_rate_pct": {
"default": 0,
"maximum": 100,
"minimum": 0,
"type": "number",
"description": "Share of order value refunded, as a percentage.\nDefault 0."
},
"orders": {
"default": 1,
"minimum": 1,
"type": "integer",
"description": "How many orders to model. Default 1."
}
},
"required": [
"order_total"
],
"additionalProperties": false
}輸出結構描述
{
"type": "object",
"additionalProperties": true
}社群
證據