Sapo MCP by usefulapi
Read Sapo store products, orders, customers and stock levels; edit order notes and stock.
我该使用它吗
质量与安全性
基于对工具定义和协议合规性的自动分析。
上下文开销
这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。
安装
一键安装
将以下内容添加到你的 `claude_desktop_config.json` 文件中:
{
"mcpServers": {
"sapo": {
"url": "https://sapo.usefulapi.io/mcp"
}
}
}远程端点
https://sapo.usefulapi.io/mcpstreamable-http它能做什么
工具清单
工具(20)
🟢sapo_get_store
The Sapo store this login belongs to: name, domain, currency, timezone, plan and other settings. GET /admin/store.json.
输入模式
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sapo_list_products(query, ids, vendor, product_type, collection_id, ...)
List products with their variants, prices, SKUs and images. Filter by name, vendor, type, collection or created/modified dates. Paged: pass next_page as page. GET /admin/products.json.
输入模式
{
"type": "object",
"properties": {
"query": {
"description": "Search by product name.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"ids": {
"description": "Only these product ids.",
"minItems": 1,
"maxItems": 250,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"vendor": {
"description": "Exact vendor (brand) name.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"product_type": {
"description": "Exact product type.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"collection_id": {
"description": "Only products in this collection (see sapo_list_custom_collections).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since_id": {
"description": "Only products with an id greater than this.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"created_on_min": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
},
"created_on_max": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
},
"modified_on_min": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
},
"modified_on_max": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"limit": {
"description": "Results per page, 1-250 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 250
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sapo_count_products(vendor, product_type, collection_id, created_on_min, created_on_max)
Number of products matching the filters. GET /admin/products/count.json.
输入模式
{
"type": "object",
"properties": {
"vendor": {
"description": "Exact vendor (brand) name.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"product_type": {
"description": "Exact product type.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"collection_id": {
"description": "Only products in this collection (see sapo_list_custom_collections).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"created_on_min": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
},
"created_on_max": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sapo_get_product(product_id)
One product by id, with variants and images. GET /admin/products/{id}.json.
输入模式
{
"type": "object",
"properties": {
"product_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Sapo product id."
}
},
"required": [
"product_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sapo_list_product_variants(product_id, page, limit)
The variants (size, color, SKU, barcode, price) of one product. Paged. GET /admin/products/{product_id}/variants.json.
输入模式
{
"type": "object",
"properties": {
"product_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Sapo product id."
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"limit": {
"description": "Results per page, 1-250 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 250
}
},
"required": [
"product_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sapo_get_product_variant(variant_id)
One product variant by id. GET /admin/variants/{id}.json.
输入模式
{
"type": "object",
"properties": {
"variant_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Sapo variant id."
}
},
"required": [
"variant_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sapo_list_custom_collections(name, product_id, page, limit)
List manual product collections (danh mục thủ công). Paged. GET /admin/custom_collections.json.
输入模式
{
"type": "object",
"properties": {
"name": {
"description": "Filter by collection name.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"product_id": {
"description": "Only collections that contain this product.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"limit": {
"description": "Results per page, 1-250 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 250
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sapo_list_orders(query, status, financial_status, fulfillment_status, tag, ...)
List orders with line items, customer, totals, payment and fulfillment status. Filter by status, tag, customer or dates. Paged: pass next_page as page. GET /admin/orders.json.
输入模式
{
"type": "object",
"properties": {
"query": {
"description": "Search text (order number, customer name, phone, email).",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"status": {
"description": "Order status: open (Sapo default when omitted, so archived orders are left out), closed, or any (all orders). Pass any for date-range totals.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"financial_status": {
"description": "Payment status: authorized, pending, paid, refunded, voided, or any. Sapo default when omitted: authorized, pending and paid only (refunded and voided are left out).",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"fulfillment_status": {
"description": "Fulfillment status (for example unfulfilled, fulfilled, partial).",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"tag": {
"description": "Only orders with this tag.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"customer_id": {
"description": "Only orders of this customer.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"created_on_min": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
},
"created_on_max": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
},
"modified_on_min": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
},
"modified_on_max": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"limit": {
"description": "Results per page, 1-250 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 250
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sapo_count_orders(status, financial_status, fulfillment_status, created_on_min, created_on_max, ...)
Number of orders matching the filters. GET /admin/orders/count.json.
输入模式
{
"type": "object",
"properties": {
"status": {
"description": "Order status: open (Sapo default when omitted, so archived orders are left out), closed, or any (all orders). Pass any for date-range totals.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"financial_status": {
"description": "Payment status: authorized, pending, paid, refunded, voided, or any. Sapo default when omitted: authorized, pending and paid only (refunded and voided are left out).",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"fulfillment_status": {
"description": "Fulfillment status (for example unfulfilled, fulfilled, partial).",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"created_on_min": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
},
"created_on_max": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
},
"modified_on_min": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
},
"modified_on_max": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sapo_get_order(order_id)
One order by id with line items, addresses, discounts, payment and shipping. GET /admin/orders/{id}.json.
输入模式
{
"type": "object",
"properties": {
"order_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Sapo order id."
}
},
"required": [
"order_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sapo_list_order_transactions(order_id)
The payment transactions recorded on one order. GET /admin/orders/{order_id}/transactions.json.
输入模式
{
"type": "object",
"properties": {
"order_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Sapo order id."
}
},
"required": [
"order_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sapo_list_customers(since_id, created_on_min, created_on_max, modified_on_min, modified_on_max, ...)
List customers with contact details, addresses, order count and total spent. Paged. GET /admin/customers.json.
输入模式
{
"type": "object",
"properties": {
"since_id": {
"description": "Only customers with an id greater than this.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"created_on_min": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
},
"created_on_max": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
},
"modified_on_min": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
},
"modified_on_max": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"limit": {
"description": "Results per page, 1-250 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 250
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sapo_count_customers
Total number of customers. GET /admin/customers/count.json.
输入模式
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sapo_get_customer(customer_id)
One customer by id. GET /admin/customers/{id}.json.
输入模式
{
"type": "object",
"properties": {
"customer_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Sapo customer id."
}
},
"required": [
"customer_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sapo_list_locations(query, status, page, limit)
List branches, stores and warehouses (id, name, address, whether they track stock). Use the ids for stock levels. Paged. GET /admin/locations.json.
输入模式
{
"type": "object",
"properties": {
"query": {
"description": "Search by name, code or phone.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"status": {
"description": "Branch status; Sapo spells the inactive value \"expried\".",
"type": "string",
"enum": [
"active",
"expried"
]
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"limit": {
"description": "Results per page, 1-250 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 250
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sapo_list_inventory_items(query, variant_ids, product_ids, ids, page, ...)
List inventory items (one per variant) by SKU/barcode search, variant or product ids. The id is what stock levels use as inventory_item_id. Paged. GET /admin/inventory_items.json.
输入模式
{
"type": "object",
"properties": {
"query": {
"description": "Search by barcode or SKU.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"variant_ids": {
"description": "Only these variant ids.",
"minItems": 1,
"maxItems": 250,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"product_ids": {
"description": "Only these product ids.",
"minItems": 1,
"maxItems": 250,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"ids": {
"description": "Only these inventory item ids.",
"minItems": 1,
"maxItems": 250,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"limit": {
"description": "Results per page, 1-250 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 250
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sapo_list_inventory_levels(inventory_item_ids, location_ids, available_min, available_max)
Stock per item and location: on_hand, available, committed, incoming, reserved. Filter by inventory item or location ids, or by a minimum/maximum available quantity. Sapo documents no paging for this list, so narrow it with ids. GET /admin/inventory_levels.json.
输入模式
{
"type": "object",
"properties": {
"inventory_item_ids": {
"description": "Only these inventory item ids (see sapo_list_inventory_items).",
"minItems": 1,
"maxItems": 250,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"location_ids": {
"description": "Only these location ids (see sapo_list_locations).",
"minItems": 1,
"maxItems": 250,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"available_min": {
"description": "Only levels with at least this much available.",
"type": "number"
},
"available_max": {
"description": "Only levels with at most this much available.",
"type": "number"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢sapo_list_price_rules(created_on_min, created_on_max, starts_on_min, starts_on_max, ends_on_min, ...)
List discount price rules (percentage, fixed amount, fixed price) with validity dates and usage counts. Paged. GET /admin/price_rules.json.
输入模式
{
"type": "object",
"properties": {
"created_on_min": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
},
"created_on_max": {
"type": "string",
"description": "ISO 8601 date or date-time (UTC unless it carries an offset), e.g. 2026-10-01 or 2026-10-01T00:00:00Z."
},
"starts_on_min": {
"description": "Only rules that start on or after this date.",
"type": "string"
},
"starts_on_max": {
"description": "Only rules that start on or before this date.",
"type": "string"
},
"ends_on_min": {
"description": "Only rules that end on or after this date.",
"type": "string"
},
"ends_on_max": {
"description": "Only rules that end on or before this date.",
"type": "string"
},
"times_used": {
"description": "Only rules used exactly this many times.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"limit": {
"description": "Results per page, 1-250 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 250
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴sapo_update_order(order_id, note, tags)
WRITE: set the note and/or the tags of an order (Sapo only lets an order's items and quantities stay fixed after creation). The value REPLACES the existing note or tags: read the order first to keep what is there. PUT /admin/orders/{id}.json.
输入模式
{
"type": "object",
"properties": {
"order_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Sapo order id."
},
"note": {
"description": "New order note (replaces the old one; empty string clears it).",
"type": "string",
"maxLength": 5000
},
"tags": {
"description": "New tag list (replaces all tags; an empty list clears them).",
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100
}
}
},
"required": [
"order_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴sapo_set_inventory_level(inventory_item_id, location_id, on_hand, reason)
WRITE: set the physical stock (on_hand) of one inventory item at one location to an exact quantity, with a reason. This OVERWRITES the current number and is recorded as a stock adjustment: read the level first (sapo_list_inventory_levels). PUT /admin/inventory_levels/set.json.
输入模式
{
"type": "object",
"properties": {
"inventory_item_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Inventory item id (see sapo_list_inventory_items)."
},
"location_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Location id (see sapo_list_locations)."
},
"on_hand": {
"type": "number",
"minimum": 0,
"maximum": 1000000000,
"description": "Physical on-hand quantity to set (at most 3 decimals are kept)."
},
"reason": {
"description": "Why the stock changes (default: Sapo's own default).",
"type": "string",
"enum": [
"inventory_change_by_damaged",
"inventory_change_by_return_restock",
"inventory_change_by_transfer",
"inventory_change_by_manufacture",
"inventory_change_by_loss",
"inventory_change_by_correction",
"inventory_change_by_other_reason"
]
}
},
"required": [
"inventory_item_id",
"location_id",
"on_hand"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}社区
证据