# Moltline Shopify Prep

> Check a product CSV, handles, variant matrices and metafield keys. 4 of 6 free.

- name: com.moltlinestudio/shopify
- version: 1.2.0
- connection class: R0 (autonomous)
- trust: 84/100 flags: duplicate-repo
- quality: 91/100 (strong)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/com.moltlinestudio%2Fshopify
- tools: https://api.protogrid.dev/v1/servers/com.moltlinestudio%2Fshopify/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "shopify": {
      "type": "http",
      "url": "https://mcp.moltlinestudio.com/shopify"
    }
  }
}
```


## Trust

- hygiene: 60
- liveness: 99
- freshness: 85
- provenance: 85
- drivers: +repository +dns-namespace +website +reachable +uptime-97% ~updated-42d-ago -duplicate-repo(22 names)
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 91/100 (strong)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 100 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 6 of 6 tools declare readOnlyHint or destructiveHint
- pass `tools.directory_hints`: every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
- pass `tools.token_cost`: about 2,391 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: no tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 6, about 2,391 tokens to load them all
- tool set hash: 31547a3bb2898c639b6e6870869ffd4c
- badge: [![protogrid quality](https://protogrid.dev/badge/com.moltlinestudio/shopify.svg)](https://protogrid.dev/servers/com.moltlinestudio/shopify)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

_No tool definition changes recorded._

## Remotes

- https://mcp.moltlinestudio.com/shopify (streamable-http, auth none, reachable true, uptime30d 0.9745763)

## Packages

_none_

## Tools (6)

- `bulk_price_change`: 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.
- `metafield_key_check`: 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.
- `payout_estimate`: 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.
- `product_csv_check`: 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.
- `url_handle`: 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.
- `variant_matrix`: 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.
