JENNi Shop — Local & Nationwide AI Commerce
Search live local & nationwide retail stock, check prices, and run zero-click AI agent checkouts.
我该使用它吗
质量与安全性
基于对工具定义和协议合规性的自动分析。
上下文开销
这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。
安装
一键安装
将以下内容添加到你的 `claude_desktop_config.json` 文件中:
{
"mcpServers": {
"ghost-market-web": {
"url": "https://shop.jennipro.com/mcp"
}
}
}远程端点
https://shop.jennipro.com/mcpstreamable-http它能做什么
工具清单
工具(5)
🟢search_catalog(query, product_id, gtin, brand, store_id, ...)
Complete canonical product facts, read-only. Nullable titles, empty images/offers and unknown stock remain visible. Discovery never authorizes checkout; completion is unavailable. Store filters are rejected; postal context never filters facts. Use search_catalog for product facts without store filters; it does not verify stock, price or delivery. Then call get_buying_options with the exact product_id, zip, quantity and fulfillment_mode. After the buyer chooses a returned offer with is_eligible_checkout true, use its store_id with start_checkout for direct checkout. An offer explicitly marked fulfillment concierge may also use start_checkout for a hosted request handoff even when that flag is false. Retain the exact buying context. A handoff does not reserve stock, create a durable quote or complete a purchase.
输入模式
{
"type": "object",
"properties": {
"query": {
"type": "string",
"maxLength": 256,
"description": "Optional title, brand, UPC or GTIN keyword. Omit to enumerate approved root catalog facts."
},
"product_id": {
"type": "string",
"maxLength": 128
},
"gtin": {
"type": "string",
"pattern": "^[0-9]{8,14}$"
},
"brand": {
"type": "string",
"maxLength": 256
},
"store_id": {
"type": "string",
"description": "Unsupported for catalog facts; nonempty store filters are rejected."
},
"store_ids": {
"type": "array",
"maxItems": 0,
"items": {
"type": "string"
},
"description": "Empty normalizes to absent; store filtering is unsupported."
},
"zip": {
"type": "string",
"pattern": "^[0-9]{5}(?:-[0-9]{4})?$",
"description": "Optional echoed caller context only; never filters facts."
},
"postal_code": {
"type": "string",
"pattern": "^[0-9]{5}(?:-[0-9]{4})?$",
"description": "Optional echoed caller context only; never filters facts."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 20
},
"cursor": {
"type": "string",
"maxLength": 8192,
"description": "Confidential opaque upstream continuation; forward unchanged with the same selectors and limit."
}
},
"required": [],
"additionalProperties": false
}输出模式
{
"type": "object",
"properties": {
"mode": {
"type": "string",
"const": "canonical_discovery"
},
"contract_version": {
"type": "string",
"const": "catalog_facts_v1"
},
"items": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"id",
"title",
"brand",
"upc",
"gtin",
"category",
"images",
"offers",
"stock_state",
"checkout_eligible"
],
"properties": {
"id": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
},
"title": {
"type": [
"string",
"null"
]
},
"brand": {
"type": [
"string",
"null"
]
},
"upc": {
"type": [
"string",
"null"
]
},
"gtin": {
"type": [
"string",
"null"
]
},
"category": {
"type": "object",
"additionalProperties": false,
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": [
"string",
"null"
]
},
"name": {
"type": [
"string",
"null"
]
}
}
},
"images": {
"type": "array",
"maxItems": 0,
"items": {
"type": "string"
}
},
"offers": {
"type": "array",
"maxItems": 0,
"items": {
"type": "string"
}
},
"stock_state": {
"type": "string",
"const": "unknown"
},
"checkout_eligible": {
"type": "boolean",
"const": false
}
}
}
},
"next_cursor": {
"type": [
"string",
"null"
]
},
"exhausted": {
"type": "boolean"
},
"catalog_authority": {
"type": "object",
"additionalProperties": false,
"required": [
"kind",
"version",
"policy_hash"
],
"properties": {
"kind": {
"type": "string",
"const": "jenni_catalog_facts"
},
"version": {
"type": "string",
"const": "2026-10-16.v1"
},
"policy_hash": {
"type": "string",
"const": "1340ae7f5b87d590b5107d90c6ace904a0b38419101e211f39f5bbaa84e704a1"
}
}
},
"offer_policy": {
"type": "object",
"additionalProperties": false,
"required": [
"state"
],
"properties": {
"state": {
"type": "string",
"const": "not_requested"
}
}
},
"requested_context": {
"type": "object",
"additionalProperties": false,
"required": [
"postal_code"
],
"properties": {
"postal_code": {
"type": [
"string",
"null"
],
"pattern": "^[0-9]{5}(?:-[0-9]{4})?$"
}
}
},
"source_observed_at": {
"type": "string",
"format": "date-time"
},
"snapshot_semantics": {
"type": "string",
"const": "live_keyset"
}
},
"required": [
"mode",
"contract_version",
"items",
"next_cursor",
"exhausted",
"catalog_authority",
"offer_policy",
"requested_context",
"source_observed_at",
"snapshot_semantics"
],
"additionalProperties": false
}🟢find_stores(name, zip, market, limit)
Read-only shop directory by name. A listing proves no stock, price, delivery or checkout eligibility. Use search_catalog for product facts without store filters; it does not verify stock, price or delivery. Then call get_buying_options with the exact product_id, zip, quantity and fulfillment_mode. After the buyer chooses a returned offer with is_eligible_checkout true, use its store_id with start_checkout for direct checkout. An offer explicitly marked fulfillment concierge may also use start_checkout for a hosted request handoff even when that flag is false. Retain the exact buying context. A handoff does not reserve stock, create a durable quote or complete a purchase.
输入模式
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Shop name or part of it, e.g. \"Cheeky Monkey\"."
},
"zip": {
"type": "string",
"description": "5-digit US ZIP code: matching shops nearest it come first."
},
"market": {
"type": "string",
"description": "Market key, e.g. san-antonio-tx. Used when no zip is given."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"description": "Shops to return (default 10)."
}
},
"required": [
"name"
],
"additionalProperties": false
}输出模式
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"location": {
"type": [
"string",
"null"
]
},
"partial": {
"type": "boolean",
"description": "True when not every listed shop could be compared."
},
"next_step": {
"type": "string",
"description": "Present when no shop matched."
},
"stores": {
"type": "array",
"items": {
"type": "object",
"properties": {
"store_id": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"address": {
"type": [
"string",
"null"
]
},
"distance_miles": {
"type": [
"number",
"null"
]
},
"url": {
"type": [
"string",
"null"
],
"description": "The shop's page on the storefront."
}
},
"required": [
"store_id",
"name",
"address",
"distance_miles",
"url"
]
}
}
},
"required": [
"name",
"stores",
"partial"
]
}🟢get_product(product_id, zip, postal_code)
Complete canonical product facts, read-only. Nullable titles, empty images/offers and unknown stock remain visible. Discovery never authorizes checkout; completion is unavailable. Store filters are rejected; postal context never filters facts. Use search_catalog for product facts without store filters; it does not verify stock, price or delivery. Then call get_buying_options with the exact product_id, zip, quantity and fulfillment_mode. After the buyer chooses a returned offer with is_eligible_checkout true, use its store_id with start_checkout for direct checkout. An offer explicitly marked fulfillment concierge may also use start_checkout for a hosted request handoff even when that flag is false. Retain the exact buying context. A handoff does not reserve stock, create a durable quote or complete a purchase.
输入模式
{
"type": "object",
"properties": {
"product_id": {
"type": "string",
"maxLength": 128
},
"zip": {
"type": "string",
"pattern": "^[0-9]{5}(?:-[0-9]{4})?$",
"description": "Optional echoed caller context only; never filters facts."
},
"postal_code": {
"type": "string",
"pattern": "^[0-9]{5}(?:-[0-9]{4})?$",
"description": "Optional echoed caller context only; never filters facts."
}
},
"required": [
"product_id"
],
"additionalProperties": false
}输出模式
{
"type": "object",
"properties": {
"mode": {
"type": "string",
"const": "canonical_discovery"
},
"contract_version": {
"type": "string",
"const": "catalog_facts_v1"
},
"items": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"id",
"title",
"brand",
"upc",
"gtin",
"category",
"images",
"offers",
"stock_state",
"checkout_eligible"
],
"properties": {
"id": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
},
"title": {
"type": [
"string",
"null"
]
},
"brand": {
"type": [
"string",
"null"
]
},
"upc": {
"type": [
"string",
"null"
]
},
"gtin": {
"type": [
"string",
"null"
]
},
"category": {
"type": "object",
"additionalProperties": false,
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": [
"string",
"null"
]
},
"name": {
"type": [
"string",
"null"
]
}
}
},
"images": {
"type": "array",
"maxItems": 0,
"items": {
"type": "string"
}
},
"offers": {
"type": "array",
"maxItems": 0,
"items": {
"type": "string"
}
},
"stock_state": {
"type": "string",
"const": "unknown"
},
"checkout_eligible": {
"type": "boolean",
"const": false
}
}
}
},
"next_cursor": {
"type": [
"string",
"null"
]
},
"exhausted": {
"type": "boolean"
},
"catalog_authority": {
"type": "object",
"additionalProperties": false,
"required": [
"kind",
"version",
"policy_hash"
],
"properties": {
"kind": {
"type": "string",
"const": "jenni_catalog_facts"
},
"version": {
"type": "string",
"const": "2026-10-16.v1"
},
"policy_hash": {
"type": "string",
"const": "1340ae7f5b87d590b5107d90c6ace904a0b38419101e211f39f5bbaa84e704a1"
}
}
},
"offer_policy": {
"type": "object",
"additionalProperties": false,
"required": [
"state"
],
"properties": {
"state": {
"type": "string",
"const": "not_requested"
}
}
},
"requested_context": {
"type": "object",
"additionalProperties": false,
"required": [
"postal_code"
],
"properties": {
"postal_code": {
"type": [
"string",
"null"
],
"pattern": "^[0-9]{5}(?:-[0-9]{4})?$"
}
}
},
"source_observed_at": {
"type": "string",
"format": "date-time"
},
"snapshot_semantics": {
"type": "string",
"const": "live_keyset"
}
},
"required": [
"mode",
"contract_version",
"items",
"next_cursor",
"exhausted",
"catalog_authority",
"offer_policy",
"requested_context",
"source_observed_at",
"snapshot_semantics"
],
"additionalProperties": false
}🟡start_checkout(product_id, store_id, quantity, fulfillment_mode, zip)
Call when the shopper has chosen to buy: the exact product_id (a variant's when it has sizes or colours), the store_id of an offer with is_eligible_checkout true or fulfillment concierge, a quantity and their ZIP. Re-checks the offer at that quantity and returns checkout_url: JENNi checkout with that item added to the shopper's basket, where they enter email, name, address and card and see delivery, tax and the total; nothing is charged until they place the order. For a concierge offer it returns a product page handoff, where the shopper sets quantity and the page checks request availability. This handoff does not create a durable quote, reserve stock or purchase anything. After get_buying_options retain its exact quantity, ZIP and fulfillment_mode.
输入模式
{
"type": "object",
"properties": {
"product_id": {
"type": "string",
"description": "The exact item: a variant's product_id when it has variants."
},
"store_id": {
"type": "string",
"description": "store_id of an offer with is_eligible_checkout true, or a concierge offer."
},
"quantity": {
"type": "integer",
"minimum": 1,
"maximum": 99,
"description": "How many (default 1)."
},
"fulfillment_mode": {
"type": "string",
"enum": [
"local_delivery",
"ship_to_home"
],
"description": "Retain the mode chosen from get_buying_options."
},
"zip": {
"type": "string",
"description": "5-digit US ZIP code the order is delivered to, e.g. 78205."
}
},
"required": [
"product_id",
"store_id",
"zip",
"quantity",
"fulfillment_mode"
],
"additionalProperties": false
}输出模式
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"basket",
"concierge_request"
]
},
"checkout_url": {
"type": "string"
},
"item": {
"type": "string"
},
"store_name": {
"type": [
"string",
"null"
]
},
"unit_price": {
"type": [
"string",
"null"
],
"description": "The shelf price the page shows; checkout states the total."
},
"quantity": {
"type": "integer"
},
"next_step": {
"type": "string"
}
},
"required": [
"kind",
"checkout_url",
"next_step"
]
}🟢get_buying_options(product_id, zip, quantity, fulfillment_mode)
Read verified buying options for the exact product, destination, quantity and fulfillment mode. Empty offers mean no options verified for this request, not that the product does not exist. Choose an eligible store, then start_checkout with the same context; the buyer approves and pays in hosted checkout.
输入模式
{
"type": "object",
"properties": {
"product_id": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$",
"maxLength": 128
},
"zip": {
"type": "string",
"pattern": "^[0-9]{5}$"
},
"quantity": {
"type": "integer",
"minimum": 1,
"maximum": 99
},
"fulfillment_mode": {
"type": "string",
"enum": [
"local_delivery",
"ship_to_home"
]
}
},
"required": [
"product_id",
"zip",
"quantity",
"fulfillment_mode"
],
"additionalProperties": false
}输出模式
{
"type": "object",
"properties": {
"product": {
"type": "object",
"properties": {
"product_id": {
"type": "string"
},
"title": {
"type": "string"
},
"brand": {
"type": [
"string",
"null"
]
},
"category": {
"type": [
"string",
"null"
]
},
"image": {
"type": [
"string",
"null"
]
},
"price": {
"type": [
"string",
"null"
],
"description": "Headline price in USD; null when none is held."
},
"shelf_price": {
"type": [
"string",
"null"
],
"description": "Store shelf price observed at the named store. Browse information only; not a checkout price. Use `price` and is_eligible_checkout for purchase."
},
"description": {
"type": [
"string",
"null"
],
"description": "The merchant's own description (get_product only)."
},
"url": {
"type": [
"string",
"null"
],
"description": "Storefront product page, where the buyer picks size/colour, checks out as a guest (email, no account) and pays. Null when no storefront is configured."
},
"size": {
"type": [
"string",
"null"
],
"description": "Size of the variant product_id names; null when it has none."
},
"color": {
"type": [
"string",
"null"
],
"description": "Colour of the variant product_id names; null when it has none."
},
"variants": {
"type": "array",
"description": "Buyable size/colour variants. Give the shopper the variant url so the page opens on that choice. search_catalog lists at most 30; get_product lists all.",
"items": {
"type": "object",
"properties": {
"product_id": {
"type": "string"
},
"size": {
"type": [
"string",
"null"
]
},
"color": {
"type": [
"string",
"null"
]
},
"url": {
"type": [
"string",
"null"
],
"description": "Storefront page opened on this variant."
}
},
"required": [
"product_id"
]
}
},
"offers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"product_id": {
"type": [
"string",
"null"
],
"description": "The exact variant this shop holds."
},
"store_id": {
"type": "string"
},
"store_name": {
"type": "string"
},
"city": {
"type": [
"string",
"null"
]
},
"distance_miles": {
"type": [
"number",
"null"
]
},
"price": {
"type": [
"string",
"null"
],
"description": "USD, e.g. \"$12.50\". Null when we hold no current price."
},
"shelf_price": {
"type": [
"string",
"null"
],
"description": "Store shelf price observed at the named store. Browse information only; not a checkout price. Use `price` and is_eligible_checkout for purchase."
},
"is_eligible_search": {
"type": "boolean"
},
"is_eligible_checkout": {
"type": "boolean",
"description": "True when the storefront offers this exact offer for order: ordering on, a checkout price quote, a shelf in stock, a courier or shipping, and a stated delivery fee. Local delivery is also refused when the shop's own hours show no opening within the week; a search result may not carry hours, and start_checkout re-checks with them. False forbids direct checkout. An explicitly `concierge` offer may still use start_checkout for a hosted request handoff; the product page checks whether a request is available. Neither eligibility nor a handoff reserves stock, creates a quote or places an order."
},
"fulfillment": {
"type": "string",
"enum": [
"pickup",
"local_delivery",
"ship_to_home",
"concierge",
"in_store_only"
],
"description": "`local_delivery`: delivered from the shop. `concierge`: a person goes to the shop and buys it on the buyer's behalf. start_checkout returns a hosted request link, even when is_eligible_checkout is false; the page determines whether a request can proceed. The link is not a stock reservation, durable quote or completed purchase. `ship_to_home`: shipped from the shop. `in_store_only`: the shop carries it, but it cannot be ordered through JENNi; tell the shopper to visit the shop. `pickup` is store-owned capability metadata, not a JENNi customer reservation/ready/handoff flow, and is never returned. These are not executable MCP methods: ordering happens on the storefront."
},
"availability": {
"type": [
"string",
"null"
],
"enum": [
"in_stock",
"out_of_stock",
null
],
"description": "NULL when we cannot read that shop's shelf, or the last read is over 24 hours old (shelf_observed_at says when). Null is not 'out of stock' — it means unknown, and must not be presented as either availability state."
},
"shelf_observed_at": {
"type": [
"string",
"null"
],
"description": "When the shelf was last read. Null means never."
},
"note": {
"type": "string",
"description": "The disclosure a shopper sees for this shop; relay it."
},
"url": {
"type": [
"string",
"null"
],
"description": "Storefront page for this exact offer."
}
},
"required": [
"store_id",
"is_eligible_search",
"is_eligible_checkout",
"fulfillment",
"availability"
]
}
},
"offer_count": {
"type": "integer",
"description": "How many offers this product has. search_catalog lists at most 5, orderable ones first; get_product lists all."
}
},
"required": [
"product_id",
"title",
"offers"
]
},
"requested_context": {
"type": "object",
"required": [
"product_id",
"postal_code",
"quantity",
"fulfillment_mode"
],
"properties": {
"product_id": {
"type": "string"
},
"postal_code": {
"type": "string"
},
"quantity": {
"type": "integer"
},
"fulfillment_mode": {
"type": "string",
"enum": [
"local_delivery",
"ship_to_home"
]
}
}
}
},
"required": [
"product",
"requested_context"
]
}社区
证据