Zinc MCP
A hosted MCP server enabling AI assistants to search for products across major retailers like Amazon and Walmart, review order totals, and complete purchases using a card payment. It supports order tracking and history retrieval, requiring no API key for basic usage.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://mcp.zinc.com/mcpWhat you can do with it
- Search for products across multiple retailers
- Review estimated order totals and card holds
- Place orders via secure payment page
- Track order status and history
Source and maintenance
Protocol and capabilities
- Server
- zinc 1.1.0
- MCP protocol
- 2025-06-18
- Tools
- 9 advertised
- Resources
- 4 advertised
- Resource templates
- 0 advertised
- Prompts
- 0 advertised
{
"tools": {
"listChanged": true
},
"logging": {},
"prompts": {
"listChanged": true
},
"resources": {
"subscribe": true,
"listChanged": true
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
9 advertised
list-orders — List Zinc orders
List or search the Zinc orders on the configured account, newest first. Renders an interactive order list. Use `search` for a partial order ID or tracking number, `status` to filter by order status, and `has_tracking` to show only shipped orders.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "How many orders to return (1-50, default 10)"
},
"search": {
"type": "string",
"description": "Partial Zinc order ID or tracking number to match"
},
"status": {
"enum": [
"pending",
"in_progress",
"order_placed",
"order_failed",
"cancelled",
"cancelled_by_retailer"
],
"type": "string",
"description": "Filter to one Zinc order status"
},
"has_tracking": {
"type": "boolean",
"description": "True to return only orders that already have tracking numbers"
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"orders",
"total",
"returned",
"environment"
],
"properties": {
"total": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total matching orders on the account"
},
"orders": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"status",
"retailer",
"item_count",
"item_urls",
"retailer_logo",
"items",
"total_cents",
"total_display",
"max_price_cents",
"merchant_order_ids",
"shipment_summary",
"tracking",
"error",
"error_type",
"is_trial",
"created_at",
"updated_at"
],
"properties": {
"id": {
"type": "string",
"description": "Zinc order UUID"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Failure reason when status is order_failed"
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"url",
"title",
"image"
],
"properties": {
"url": {
"type": "string"
},
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"description": "One per line item. title/image are what the shopper saw in the review card when the order was placed through this connector; null when the order came from elsewhere."
},
"status": {
"type": "string",
"description": "Zinc order status"
},
"is_trial": {
"type": "boolean",
"description": "max_price of 0 marks a trial run: the retailer validates the order and deliberately does not place it, charging nothing. That outcome is recorded as order_failed with error_type max_price_exceeded, and nothing went wrong — do not report it as a failure. A trial carrying any other error_type did fail, before the price ceiling was ever reached, and the error explains how. This flag is the one to read: a null max_price_cents is an unknown ceiling, never a trial."
},
"retailer": {
"type": "string",
"description": "Merchant inferred from the item URLs — Zinc stores no retailer field"
},
"tracking": {
"type": "array",
"items": {
"type": "object",
"required": [
"carrier",
"tracking_number",
"status",
"estimated_delivery_date",
"tracking_url"
],
"properties": {
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "pending, in_transit, or delivered; null before first scan"
},
"carrier": {
"type": "string",
"description": "Carrier code, e.g. ups, usps, fedex"
},
"tracking_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"tracking_number": {
"type": "string"
},
"estimated_delivery_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Carrier ETA as a destination-local YYYY-MM-DD date"
}
},
"additionalProperties": false
}
},
"item_urls": {
"type": "array",
"items": {
"type": "string"
},
"description": "Retailer URL per line item. Zinc stores no product name, so this is the only identification of what was ordered — a title derived from the URL path was a guess and often wrong."
},
"created_at": {
"type": "string"
},
"error_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Worker's classification of the failure, e.g. max_price_exceeded"
},
"item_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total units across all line items"
},
"updated_at": {
"type": "string"
},
"total_cents": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "What the retailer charged, in cents. Null when the order was never placed AND null on every list-orders row — the Zinc list endpoint omits it. Call get-order for the real total."
},
"retailer_logo": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The retailer's mark, for rows with no product picture."
},
"total_display": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Preformatted total, e.g. $41.98"
},
"max_price_cents": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "Customer's price ceiling, in cents. Null means withheld, not zero: the public tracking view a guest reads does not carry it. A zero ceiling means something specific (see is_trial) that null does not."
},
"shipment_summary": {
"type": "string",
"description": "One-line shipment state rolled up from the tracking rows"
},
"merchant_order_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Retailer's own order numbers"
}
},
"additionalProperties": false
}
},
"returned": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"environment": {
"enum": [
"sandbox",
"live"
],
"type": "string",
"description": "Which Zinc dataset the configured API key reads"
}
},
"additionalProperties": false
}{
"title": "List Zinc orders",
"readOnlyHint": true,
"openWorldHint": true,
"destructiveHint": false
}get-order — Get a Zinc order
Fetch one Zinc order by its UUID and render a detail card: line items, retailer price breakdown, shipping destination, and shipment timeline.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"order_id"
],
"properties": {
"order_id": {
"type": "string",
"description": "The Zinc order UUID"
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"order",
"items",
"price_breakdown",
"prices_withheld",
"ship_to",
"environment"
],
"properties": {
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"url",
"title",
"image",
"retailer_logo",
"quantity",
"status",
"variant",
"cancellation_reason"
],
"properties": {
"url": {
"type": "string"
},
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What the shopper saw when buying through this connector; null otherwise."
},
"status": {
"type": "string"
},
"variant": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"quantity": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"retailer_logo": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"cancellation_reason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
}
},
"order": {
"type": "object",
"required": [
"id",
"status",
"retailer",
"item_count",
"item_urls",
"retailer_logo",
"items",
"total_cents",
"total_display",
"max_price_cents",
"merchant_order_ids",
"shipment_summary",
"tracking",
"error",
"error_type",
"is_trial",
"created_at",
"updated_at"
],
"properties": {
"id": {
"type": "string",
"description": "Zinc order UUID"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Failure reason when status is order_failed"
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"url",
"title",
"image"
],
"properties": {
"url": {
"type": "string"
},
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"description": "One per line item. title/image are what the shopper saw in the review card when the order was placed through this connector; null when the order came from elsewhere."
},
"status": {
"type": "string",
"description": "Zinc order status"
},
"is_trial": {
"type": "boolean",
"description": "max_price of 0 marks a trial run: the retailer validates the order and deliberately does not place it, charging nothing. That outcome is recorded as order_failed with error_type max_price_exceeded, and nothing went wrong — do not report it as a failure. A trial carrying any other error_type did fail, before the price ceiling was ever reached, and the error explains how. This flag is the one to read: a null max_price_cents is an unknown ceiling, never a trial."
},
"retailer": {
"type": "string",
"description": "Merchant inferred from the item URLs — Zinc stores no retailer field"
},
"tracking": {
"type": "array",
"items": {
"type": "object",
"required": [
"carrier",
"tracking_number",
"status",
"estimated_delivery_date",
"tracking_url"
],
"properties": {
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "pending, in_transit, or delivered; null before first scan"
},
"carrier": {
"type": "string",
"description": "Carrier code, e.g. ups, usps, fedex"
},
"tracking_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"tracking_number": {
"type": "string"
},
"estimated_delivery_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Carrier ETA as a destination-local YYYY-MM-DD date"
}
},
"additionalProperties": false
}
},
"item_urls": {
"type": "array",
"items": {
"type": "string"
},
"description": "Retailer URL per line item. Zinc stores no product name, so this is the only identification of what was ordered — a title derived from the URL path was a guess and often wrong."
},
"created_at": {
"type": "string"
},
"error_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Worker's classification of the failure, e.g. max_price_exceeded"
},
"item_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Total units across all line items"
},
"updated_at": {
"type": "string"
},
"total_cents": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "What the retailer charged, in cents. Null when the order was never placed AND null on every list-orders row — the Zinc list endpoint omits it. Call get-order for the real total."
},
"retailer_logo": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The retailer's mark, for rows with no product picture."
},
"total_display": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Preformatted total, e.g. $41.98"
},
"max_price_cents": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "Customer's price ceiling, in cents. Null means withheld, not zero: the public tracking view a guest reads does not carry it. A zero ceiling means something specific (see is_trial) that null does not."
},
"shipment_summary": {
"type": "string",
"description": "One-line shipment state rolled up from the tracking rows"
},
"merchant_order_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Retailer's own order numbers"
}
},
"additionalProperties": false
},
"ship_to": {
"anyOf": [
{
"type": "object",
"required": [
"name",
"city",
"state",
"postal_code",
"country"
],
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"state": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"postal_code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"environment": {
"enum": [
"sandbox",
"live"
],
"type": "string"
},
"price_breakdown": {
"anyOf": [
{
"type": "object",
"required": [
"subtotal_cents",
"tax_cents",
"shipping_cents",
"discount_cents",
"fees_cents",
"total_cents",
"currency"
],
"properties": {
"currency": {
"type": "string"
},
"tax_cents": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
]
},
"fees_cents": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
]
},
"total_cents": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
]
},
"discount_cents": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
]
},
"shipping_cents": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
]
},
"subtotal_cents": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Null until the retailer order is placed — unless prices_withheld is true, which means the amounts exist and this read cannot see them. All amounts in cents."
},
"prices_withheld": {
"type": "boolean",
"description": "True when the order was read without an account, from the public tracking view, which carries no money at all. The order may well have been charged in full: never report it as uncharged. False on a signed-in read, where a null breakdown does mean not charged yet."
}
},
"additionalProperties": false
}{
"title": "Get a Zinc order",
"readOnlyHint": true,
"openWorldHint": true,
"destructiveHint": false
}get-order-tracking — Get shipment tracking for a Zinc order
Return the carrier tracking timeline (scan checkpoints) for one Zinc order. Use this when the question is only about where a package is, not about pricing or line items.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"order_id"
],
"properties": {
"order_id": {
"type": "string",
"description": "The Zinc order UUID"
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"order_id",
"order_status",
"shipment_summary",
"shipments"
],
"properties": {
"order_id": {
"type": "string"
},
"shipments": {
"type": "array",
"items": {
"type": "object",
"required": [
"carrier",
"tracking_number",
"status",
"estimated_delivery_date",
"tracking_url",
"checkpoints"
],
"properties": {
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"carrier": {
"type": "string"
},
"checkpoints": {
"type": "array",
"items": {
"type": "object",
"required": [
"checkpoint_time",
"status",
"message",
"location"
],
"properties": {
"status": {
"type": "string"
},
"message": {
"type": "string"
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"checkpoint_time": {
"type": "string"
}
},
"additionalProperties": false
},
"description": "Newest scan first"
},
"tracking_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"tracking_number": {
"type": "string"
},
"estimated_delivery_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
}
},
"order_status": {
"type": "string"
},
"shipment_summary": {
"type": "string"
}
},
"additionalProperties": false
}{
"title": "Get shipment tracking for a Zinc order",
"readOnlyHint": true,
"openWorldHint": true,
"destructiveHint": false
}list-addresses — List addresses the user has shipped to before
Destinations from the signed-in user's recent orders, each with an id you can pass to prepare-order as address_id. Only useful once the user has signed in (list-orders has worked, or they asked for their history); for anyone else it has nothing, and the shopper enters the address on the payment page instead. It never prompts for sign-in. Labels are deliberately partial — a name, a city, a truncated postal code. You are not shown the street, and you do not need it: the full address is resolved server-side and shown to the user in the review card before anything is placed. Never reconstruct or guess an address from a label; if none of these is the right destination, ask the user.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"addresses",
"orders_inspected"
],
"properties": {
"addresses": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"label",
"last_used",
"order_count"
],
"properties": {
"id": {
"type": "string",
"description": "Pass as prepare-order's address_id"
},
"label": {
"type": "string",
"description": "Partial by design — not the full address"
},
"last_used": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"order_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
},
"additionalProperties": false
}
},
"orders_inspected": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
},
"additionalProperties": false
}{
"title": "List addresses the user has shipped to before",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}prepare-order — Prepare an order for the user to review
Show the user an order to review: items, what it will cost and the hold on the card. This does NOT place the order or spend anything — the user places it by clicking Pay & place in the card that appears, and enters their shipping address on the payment page that opens. Use this whenever the user wants to buy something; never ask them for an address first. Pass each product's title, image and price_cents from search so the card shows the item and quotes the total; leave max_price out unless the user named a budget. address_id, from list-addresses, is only for a signed-in user shipping somewhere they have shipped before. Not sold through this connector: weapons, tobacco and nicotine, regulated drugs and paraphernalia, prescription medication, adult products, gambling, covert surveillance and counterfeit goods. An order for one of those is refused.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"products"
],
"properties": {
"products": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Product URL on the retailer's site"
},
"image": {
"type": "string",
"description": "Product image URL, copied verbatim from the search result. Only an address search returned can be shown — a constructed or substituted one is dropped rather than rendered."
},
"title": {
"type": "string",
"description": "Product title from search, for the card."
},
"quantity": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1
},
"price_cents": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Listed unit price from search, in cents. Drives the quote and the cap."
}
}
},
"minItems": 1
},
"max_price": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Hard spending cap for this order, in cents, including tax and shipping. Pass it only when the user named a budget; otherwise leave it out and the cap is derived from the listed price, an estimated tax and shipping, with a margin. The order fails rather than exceeding it."
},
"address_id": {
"type": "string",
"description": "An id from list-addresses, for a signed-in user shipping somewhere they have shipped before. Resolved against their own order history; the full address appears in the review card, not here. Leave it out otherwise: the shopper enters the address on the payment page. Never ask for an address in the conversation."
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"products",
"max_price_cents",
"max_price_display",
"quote",
"ship_to_summary",
"environment",
"can_place",
"guest"
],
"properties": {
"guest": {
"type": "boolean",
"description": "True when nobody is signed in: the order belongs to a guest account made from the checkout email rather than to a Zinc account."
},
"quote": {
"anyOf": [
{
"type": "object",
"required": [
"listed_price_cents",
"estimated_tax_cents",
"shipping_cents",
"order_fee_cents",
"estimated_total_cents",
"hold_cents",
"tax_rate",
"tax_basis",
"shipping_basis",
"cap_basis"
],
"properties": {
"tax_rate": {
"type": "number",
"description": "The rate the tax ESTIMATE used, as a decimal. Not a lookup: the destination is not known until checkout, so a flat 10% is assumed and the retailer charges the real tax. It only sizes the hold; only the actual total is ever captured."
},
"cap_basis": {
"enum": [
"derived",
"budget"
],
"type": "string",
"description": "derived: the cap is the estimate plus a margin; budget: it is the max_price the user named."
},
"tax_basis": {
"enum": [
"assistant",
"assumed",
"floored"
],
"type": "string",
"description": "Always 'assumed' here: a flat 10% estimate, not a rate lookup."
},
"hold_cents": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Authorized on the card: max_price + fee."
},
"shipping_basis": {
"enum": [
"member",
"free_over_threshold",
"standard"
],
"type": "string",
"description": "member: ships free at any size on this connector; free_over_threshold: the basket clears the retailer's free-shipping line; standard: the retailer's ground charge applies."
},
"shipping_cents": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"order_fee_cents": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"listed_price_cents": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"estimated_tax_cents": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"estimated_total_cents": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "What the card will most likely be charged: goods + tax + shipping + fee."
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"products": {
"type": "array",
"items": {
"type": "object",
"required": [
"url",
"quantity"
],
"properties": {
"url": {
"type": "string",
"description": "Product URL on the retailer's site"
},
"image": {
"type": "string",
"description": "Product image URL, copied verbatim from the search result. Only an address search returned can be shown — a constructed or substituted one is dropped rather than rendered."
},
"title": {
"type": "string",
"description": "Product title from search, for the card."
},
"quantity": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1
},
"price_cents": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Listed unit price from search, in cents. Drives the quote and the cap."
},
"retailer_logo": {
"type": "string"
}
},
"additionalProperties": false
}
},
"can_place": {
"type": "boolean",
"description": "False when this connection lacks the orders:write scope."
},
"environment": {
"enum": [
"sandbox",
"live"
],
"type": "string"
},
"max_price_cents": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"ship_to_summary": {
"type": "string",
"description": "Empty when the shopper will enter the address on the payment page."
},
"shipping_address": {
"type": "object",
"required": [
"first_name",
"last_name",
"address_line1",
"city",
"postal_code",
"phone_number",
"country"
],
"properties": {
"city": {
"type": "string"
},
"state": {
"type": "string",
"description": "Two-letter state code where applicable"
},
"country": {
"type": "string",
"default": "US"
},
"last_name": {
"type": "string"
},
"first_name": {
"type": "string"
},
"postal_code": {
"type": "string"
},
"phone_number": {
"type": "string"
},
"address_line1": {
"type": "string"
},
"address_line2": {
"type": "string"
}
},
"description": "Only when resolved from a saved address; otherwise entered at checkout.",
"additionalProperties": false
},
"max_price_display": {
"type": "string"
}
},
"additionalProperties": false
}{
"title": "Prepare an order for the user to review",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}place-order — Place a reviewed order
Internal: places an order the user already confirmed in the review card, paying by card. Requires a confirmation issued by prepare-order, which is not available to you — call prepare-order and let the user confirm instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"confirmation",
"order"
],
"properties": {
"order": {
"type": "object",
"required": [
"products",
"max_price"
],
"properties": {
"products": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Product URL on the retailer's site"
},
"image": {
"type": "string"
},
"title": {
"type": "string"
},
"quantity": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1
}
}
},
"minItems": 1
},
"max_price": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"shipping_address": {
"type": "object",
"required": [
"first_name",
"last_name",
"address_line1",
"city",
"postal_code",
"phone_number"
],
"properties": {
"city": {
"type": "string"
},
"state": {
"type": "string",
"description": "Two-letter state code where applicable"
},
"country": {
"type": "string",
"default": "US"
},
"last_name": {
"type": "string"
},
"first_name": {
"type": "string"
},
"postal_code": {
"type": "string"
},
"phone_number": {
"type": "string"
},
"address_line1": {
"type": "string"
},
"address_line2": {
"type": "string"
}
}
}
}
},
"confirmation": {
"type": "string",
"description": "Issued by prepare-order to the view."
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"status",
"order_id",
"max_price_cents",
"payment"
],
"properties": {
"status": {
"type": "string",
"description": "An order status once placed, or requires_action while the buyer pays."
},
"payment": {
"anyOf": [
{
"type": "object",
"required": [
"payment_id",
"status",
"order_id",
"pay_url",
"expires_at",
"hold_cents",
"failure"
],
"properties": {
"status": {
"type": "string"
},
"failure": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Why the payment ended `failed`, for the shopper — e.g. the address they entered at checkout could not be used. The hold has been released."
},
"pay_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"order_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"expires_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"hold_cents": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
]
},
"payment_id": {
"type": "string"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Set when the buyer has to pay on pay_url before the order exists."
},
"order_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"max_price_cents": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
},
"additionalProperties": false
}{
"title": "Place a reviewed order",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}get-payment-status — Check a pending card payment
Where a card payment stands after place-order sent the buyer to a payment page: requires_action until they pay, then placed with the order_id. The review card polls this itself; call it only if the user asks whether their payment went through.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"payment_id"
],
"properties": {
"payment_id": {
"type": "string",
"description": "The payment id place-order returned."
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"payment_id",
"status",
"order_id",
"pay_url",
"expires_at",
"hold_cents",
"failure"
],
"properties": {
"status": {
"type": "string"
},
"failure": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Why the payment ended `failed`, for the shopper — e.g. the address they entered at checkout could not be used. The hold has been released."
},
"pay_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"order_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"expires_at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"hold_cents": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
]
},
"payment_id": {
"type": "string"
}
},
"additionalProperties": false
}{
"title": "Check a pending card payment",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}search-products — Search for products across retailers
Find products across Amazon, Walmart, Target, Best Buy and more. Each result carries an orderable URL that can be passed straight to prepare-order, along with its title, image and price_cents — pass those too, so the review card can show the item and quote the total. Use this when the user wants to buy something but has not given a product URL. Then stop and let the user choose from the card — do not go on to prepare-order in the same turn unless they already named the exact item or asked you to pick. Search once with the user's best query rather than issuing speculative variations, and do not retry a failed search without saying why. When the user names the store they want to buy from, pass it in retailers rather than in the query; otherwise leave retailers out and search everywhere. Not sold through this connector: weapons, tobacco and nicotine, regulated drugs and paraphernalia, prescription medication, adult products, gambling, covert surveillance and counterfeit goods. A search for one of those is refused and matching results are dropped; tell the user plainly rather than rephrasing the query to get around it.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"minLength": 1,
"description": "What to search for, e.g. 'airpods pro' or 'cotton bath towels'"
},
"retailers": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"maxItems": 18,
"description": "Only return results from these stores: any of amazon, bestbuy, bhphotovideo, chewy, costco, homedepot, kohls, lowes, macys, newegg, staples, target, walmart, wayfair, etsy, plus up to 3 Shopify stores by domain (e.g. 'yetch.studio'). A Shopify store must be in Zinc's catalog; an unknown value is rejected with the list of accepted ones. Omit to search every retailer. Shopify stores and Etsy are only searched when named here."
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"query",
"results",
"result_count",
"environment"
],
"properties": {
"query": {
"type": "string"
},
"results": {
"type": "array",
"items": {
"type": "object",
"required": [
"url",
"retailer",
"title"
],
"properties": {
"url": {
"type": "string",
"description": "Orderable retailer URL — pass straight to prepare-order"
},
"brand": {
"type": "string"
},
"image": {
"type": "string"
},
"stars": {
"type": "number"
},
"title": {
"type": "string"
},
"retailer": {
"type": "string"
},
"num_reviews": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"price_cents": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"price_display": {
"type": "string"
},
"retailer_logo": {
"type": "string"
}
},
"additionalProperties": false
},
"maxItems": 20,
"description": "At most 20 results, best first. The card shows them all; a narrower query finds more, not a second page."
},
"retailers": {
"type": "array",
"items": {
"type": "string"
},
"description": "The stores the search was limited to; absent when it searched everywhere."
},
"environment": {
"enum": [
"sandbox",
"live"
],
"type": "string"
},
"result_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "How many results are in `results`."
}
},
"additionalProperties": false
}{
"title": "Search for products across retailers",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}send_feedback — Send feedback
Records feedback about this MCP server, including unexpected tool failures, unhelpful responses, or missing capabilities observed by the agent or reported by the user.
{
"type": "object",
"required": [
"content",
"source"
],
"properties": {
"source": {
"enum": [
"user",
"model"
],
"type": "string",
"description": "Who initiated the feedback: \"user\" or \"model\"."
},
"content": {
"type": "string",
"description": "The feedback content, stripped of any PII."
}
}
}{
"type": "object",
"required": [
"received"
],
"properties": {
"received": {
"type": "boolean",
"description": "True once the feedback is recorded."
}
}
}{
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": false
}Prompts
0 advertised
Resources
4 advertised
order-confirm
Order review card: the item, the estimated total and the card hold, with the Pay & place button only the user can press. The shopper enters the shipping address on the payment page that opens.
ui://views/order-confirm.htmlorder-detail
One order's detail card: line items, the retailer's price breakdown, the destination and the shipment timeline.
ui://views/order-detail.htmlorders-list
The user's orders as rows with status, shipment progress and total; hover details, newest first.
ui://views/orders-list.htmlproduct-search
Product search results as a card of tiles — image, title, retailer, price — the user picks from. It already shows every result, so do not repeat the list.
ui://views/product-search.html30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 1147 ms
- 95th percentile latency
- 1147 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 1147 ms · metadata changed · 9 tool(s), 4 resource(s), 0 resource template(s), 0 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http zinc-mcp https://mcp.zinc.com/mcpCodex
codex mcp add zinc-mcp --url https://mcp.zinc.com/mcpCursor
{
"mcpServers": {
"zinc-mcp": {
"url": "https://mcp.zinc.com/mcp"
}
}
}Cline
{
"mcpServers": {
"zinc-mcp": {
"type": "streamableHttp",
"url": "https://mcp.zinc.com/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"zinc-mcp": {
"type": "http",
"url": "https://mcp.zinc.com/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http zinc-mcp https://mcp.zinc.com/mcpClaude Desktop
{
"mcpServers": {
"zinc-mcp": {
"url": "https://mcp.zinc.com/mcp"
}
}
}Windsurf
{
"mcpServers": {
"zinc-mcp": {
"serverUrl": "https://mcp.zinc.com/mcp"
}
}
}Let your agent find its tools
Find servers like Zinc MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other commerce servers
Do you run Zinc MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.