Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,549Letters: 14Defects: 1,324counted 2 min ago
teppi

Server definition

Hash
sha256:796b3e188e0763f6d49d2d629344042540439b0a47d54b8a2a609294c60557c7
What it is
What a remote MCP server returned when asked what it offers: 6 tools

The blob, as servednamed by its sha256

{ "instructions": "Shopify catalogue preparation over MCP. Free: product_csv_check, url_handle, variant_matrix, metafield_key_check. Premium (license): bulk_price_change, payout_estimate. Works on your file, not your store — no API key, no OAuth, no store access.", "tools": [ { "description": "Apply one pricing rule across a list of prices and show the effect. PREMIUM (license).\n\nPercentage first, then the flat amount, then rounding — stated explicitly\nbecause the order changes the answer. Typical input {\"prices\": [19.99,\n24.5], \"change_pct\": 10, \"charm_ending\": \".99\"} returns {\"rows\":\n[{\"was\": 19.99, \"now\": 21.99}, {\"was\": 24.5, \"now\": 26.99}],\n\"total_was\": 44.49, \"total_now\": 48.98, \"uplift_pct\": 10.09}.\n\nUse when repricing a catalogue before export. Not for what a price nets\nyou 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.", "inputSchema": { "additionalProperties": false, "properties": { "change_flat": { "default": 0, "description": "Flat amount applied after the percentage. Default 0.", "type": "number" }, "change_pct": { "default": 0, "description": "Percentage change applied first, e.g. 10 to raise by 10%\nor -5 to cut by 5%. Default 0.", "type": "number" }, "charm_ending": { "default": "", "description": "Force every price to end in these cents, e.g. \".99\" or\n\".95\". Applied after rounding. Empty by default.", "type": "string" }, "prices": { "description": "Current prices, at least one, each greater than 0.", "items": { "type": "number" }, "type": "array" }, "round_to": { "default": 0.01, "description": "Rounding increment applied last, e.g. 0.01 or 0.05.\nDefault 0.01.", "exclusiveMinimum": 0, "type": "number" } }, "required": [ "prices" ], "type": "object" }, "name": "bulk_price_change", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Validate a metafield namespace and key before you define it. FREE.\n\nShopify metafield namespaces and keys are lowercase alphanumerics and\nunderscores; a capital letter or a dash is rejected at definition time,\nusually after the rest of the import has already run. Typical input\n{\"namespace\": \"custom\", \"key\": \"Care-Instructions\"} returns {\"ok\": false,\n\"problems\": [\"key: dashes and capitals are not allowed\"], \"suggested_key\":\n\"care_instructions\"}.\n\nUse when designing metafields. Not for the CSV column that carries them —\nthat 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.", "inputSchema": { "additionalProperties": false, "properties": { "key": { "description": "The metafield key, e.g. \"care_instructions\".", "type": "string" }, "namespace": { "description": "The metafield namespace, e.g. \"custom\".", "type": "string" }, "value_type": { "default": "single_line_text_field", "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.", "type": "string" } }, "required": [ "namespace", "key" ], "type": "object" }, "name": "metafield_key_check", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Estimate what actually lands in the bank after processing fees. PREMIUM (license).\n\nTypical input {\"order_total\": 84.5, \"fee_pct\": 2.9, \"fee_fixed\": 0.3,\n\"orders\": 120, \"refund_rate_pct\": 4} returns {\"gross\": 10140.0, \"fees\":\n330.06, \"refunds\": 405.6, \"net_payout\": 9404.34, \"effective_fee_pct\":\n3.26}.\n\nUse for cash-flow planning. Not as an authoritative fee schedule: rates\ndepend 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.", "inputSchema": { "additionalProperties": false, "properties": { "fee_fixed": { "default": 0.3, "description": "Fixed fee per transaction. Default 0.30.", "minimum": 0, "type": "number" }, "fee_pct": { "default": 2.9, "description": "Percentage fee per transaction. Default 2.9 — a common\npublished rate, not a promise about your account.", "minimum": 0, "type": "number" }, "order_total": { "description": "Value of one order including anything the processor\ntakes a percentage of. Must be greater than 0.", "exclusiveMinimum": 0, "type": "number" }, "orders": { "default": 1, "description": "How many orders to model. Default 1.", "minimum": 1, "type": "integer" }, "refund_rate_pct": { "default": 0, "description": "Share of order value refunded, as a percentage.\nDefault 0.", "maximum": 100, "minimum": 0, "type": "number" } }, "required": [ "order_total" ], "type": "object" }, "name": "payout_estimate", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Check a product CSV's header row against Shopify's current columns. FREE.\n\nCatches the failure that wastes the most time: a template copied from an\nout-of-date guide, using column names Shopify renamed. Typical input\n{\"header_row\": [\"Handle\", \"Title\", \"Body (HTML)\", \"Variant Price\"]}\nreturns {\"ok\": false, \"missing_required\": [], \"renamed\": [{\"found\":\n\"Handle\", \"use\": \"URL handle\"}, ...], \"unrecognised\": [], \"verdict\": \"...\"}.\n\nUse before an import, on the header row alone. Not for whether the values\nin the rows are valid — check a handle with url_handle and a metafield key\nwith 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.", "inputSchema": { "additionalProperties": false, "properties": { "header_row": { "description": "The CSV's first row as a list of column names, exactly as\nwritten in the file, e.g. [\"Handle\", \"Title\", \"Variant Price\"].", "items": { "type": "string" }, "type": "array" }, "mode": { "default": "new", "description": "\"new\" when creating products, where Shopify requires only Title;\n\"update\" when changing existing ones, where it also requires URL\nhandle. Default \"new\".", "pattern": "^(new|update)$", "type": "string" } }, "required": [ "header_row" ], "type": "object" }, "name": "product_csv_check", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Turn a product title into a valid, unique Shopify URL handle. FREE.\n\nShopify handles are lowercase, may contain letters, numbers and dashes,\nand may not contain spaces. Typical input {\"title\": \"Men's Merino Wool\nSocks (2-Pack)\"} returns {\"handle\": \"mens-merino-wool-socks-2-pack\",\n\"valid\": true, \"changed\": true, \"collisions\": []}.\n\nUse when generating handles for an import, or checking one you already\nhave. 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.", "inputSchema": { "additionalProperties": false, "properties": { "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." }, "title": { "description": "The product title or a candidate handle, e.g. \"Men's Merino\nWool Socks\".", "type": "string" } }, "required": [ "title" ], "type": "object" }, "name": "url_handle", "outputSchema": { "additionalProperties": true, "type": "object" } }, { "description": "Count the variants a set of options produces, and flag the ceilings. FREE.\n\nOption counts multiply, so three modest lists become a number nobody\nintended. Typical input {\"options\": {\"Size\": [\"S\", \"M\", \"L\"], \"Colour\":\n[\"Black\", \"Navy\"]}} returns {\"option_count\": 2, \"variant_count\": 6,\n\"within_limits\": true, \"per_option\": {\"Size\": 3, \"Colour\": 2}}.\n\nUse before building an import file, to find out whether the catalogue\nneeds splitting into several products. Not for validating the resulting\nCSV'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.", "inputSchema": { "additionalProperties": false, "properties": { "list_rows": { "default": false, "description": "When true, also return every variant combination. Off by\ndefault because the list can be very large.", "type": "boolean" }, "max_options": { "default": 3, "description": "Ceiling on distinct option names. Default 3.", "minimum": 1, "type": "integer" }, "max_variants": { "default": 2048, "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.", "minimum": 1, "type": "integer" }, "options": { "additionalProperties": { "items": { "type": "string" }, "type": "array" }, "description": "Option names mapped to their values, e.g. {\"Size\": [\"S\",\n\"M\"], \"Colour\": [\"Black\"]}. Each list needs at least one value.", "type": "object" } }, "required": [ "options" ], "type": "object" }, "name": "variant_matrix", "outputSchema": { "additionalProperties": true, "type": "object" } } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:796b3e188e0763f6d49d2d629344042540439b0a47d54b8a2a609294c60557c7 | sha256sum