sapo-mcp · v0.7.0 · pre-1.0

Toàn cảnh Sapo MCP — 105 tools, 4 modes, 2 transports

Model Context Protocol server cho nền tảng POS & e-commerce Sapo.vn. Single-tenant, stdio + Streamable HTTP, destructive ops gated bởi env flags. Dưới đây là toàn bộ những gì bộ MCP này phơi ra cho LLM.

package
sapo-mcp
node
>= 20
license
MIT
auth
Sapo Private App
tenancy
single-shop
updated
2026-04-30
105
unique tools
4
modes
2
transports
12
canary endpoints

Cài đặt & kết nối

Ba cách dùng: npx (khuyến nghị cho MCP client), global, hoặc local dependency. Yêu cầu Node 20+.

A · npx (no install)

# Pull latest, no install
npx -y sapo-mcp@latest --version

B · global

npm install -g sapo-mcp
sapo-mcp --help

C · local

npm install sapo-mcp
npx sapo-mcp --mode=pos-online

Claude Desktop config

{
  "mcpServers": {
    "sapo": {
      "command": "npx",
      "args": ["-y", "sapo-mcp",
        "--mode=pos-online,web,analytics"],
      "env": {
        "SAPO_STORE": "mystorename",
        "SAPO_API_KEY": "xxx",
        "SAPO_API_SECRET": "yyy"
      }
    }
  }
}

Dùng được cả Cursor (~/.cursor/mcp.json) và MCP Inspector. Tools xuất hiện dưới biểu tượng plug 🔌 sau khi restart client.

4 Modes — chọn surface phù hợp use-case

Mỗi mode = một tập tools rời nhau (trừ 2 read-only variant tools dùng chung giữa pos-onlineweb). Bật nhiều mode bằng CSV: --mode=pos-online,web,analytics.

flowchart TB Client[MCP Client
Claude / Cursor / Inspector / GoClaw] Client -- stdio --> Bin Client -- HTTP / SSE --> HTTP subgraph Server[sapo-mcp server] Bin[bin/sapo-mcp.js
--mode CSV] HTTP[Streamable HTTP
:3333 /mcp] Bin --> Reg HTTP --> Reg Reg[Tool Registry] Reg --> M1[pos-online · 51] Reg --> M2[web · 31] Reg --> M3[pos-counter · 15] Reg --> M4[analytics · 10] end M1 --> API[Sapo Admin REST API
https://*.mysapo.net/admin/*.json] M2 --> API M3 --> API M4 --> API classDef m fill:#162438,stroke:#4a90d9,color:#c8d8e8 class M1,M2,M3,M4 m
pos-online51 tools

Online orders, customers, fulfillment, refunds, draft orders, price rules, discount codes.

  • Orders + transactions + fulfillments + refunds
  • Customers + addresses (read & write)
  • Products / variants (read-only ở mode này)
  • Draft orders, price rules, discount codes
web31 tools

Storefront content: blogs, articles, pages, collections, SEO, script tags.

  • Articles + Blogs (CRUD)
  • Pages, custom & smart collections, collects
  • Script tags injection
  • Product / page SEO updates
pos-counter15 tools

Quầy POS vật lý: locations, inventory write, suppliers, stock transfers, shifts.

  • Locations & payment methods
  • Inventory adjust / connect / set
  • POS orders (?source_name=pos), suppliers, stock transfers
  • POS shifts (2 tools broken — endpoint trả HTML)
analytics10 tools

Composed reports — không phải endpoint Sapo gốc, mà aggregate từ nhiều endpoint với auto-pagination.

  • revenue_summary, top_products, top_customers
  • customer_ltv, tax_summary, online_vs_counter_breakdown
  • discount_usage_report, shift_report
  • inventory_low_stock, inventory_value
Note: pos-counter exclude 5 endpoint internal-only (purchase_orders, purchase_returns, stock_adjustments, cash_transactions, cashbook) — Private App trả 403, cần OAuth Partner App (post-1.0). Analytics auto-paginate đến SAPO_MAX_AUTO_PAGES; vượt ngưỡng → truncated: true.

Toàn bộ 105 tools, nhóm theo resource

Ký hiệu trạng thái: canary-monitored, live-verified, docs-only, composed, broken. Tool có nhãn destructive yêu cầu cả SAPO_ALLOW_OPS phù hợp lẫn confirm: true trong args.

pos-online · 51 tools

Customers 7
  • list_customers
  • get_customer
  • search_customers
  • count_customers
  • list_customer_orders
  • create_customer
  • update_customer
Customer Addresses 4
  • list_customer_addresses
  • add_customer_address
  • update_customer_address
  • set_default_customer_address
Products (read) 4
  • list_products
  • get_product
  • search_products
  • count_products
Variants (read) 2
  • list_variants_for_product
  • get_variant
Inventory (read) 1
  • get_inventory_levels
Orders 4
  • list_orders
  • get_order
  • count_orders
  • search_orders
Order Transactions 2
  • list_order_transactions
  • create_order_transaction
Fulfillments 4
  • list_fulfillments_for_order
  • get_fulfillment
  • create_fulfillment
  • update_fulfillment_tracking
Refunds 3
  • list_refunds
  • get_refund
  • create_refundrefund
Draft Orders 7
  • list_draft_orders
  • get_draft_order
  • create_draft_order
  • update_draft_order
  • complete_draft_order
  • send_draft_order_invoice
  • delete_draft_orderdelete
Price Rules 5
  • list_price_rules
  • get_price_rule
  • create_price_rule
  • update_price_rule
  • delete_price_ruledelete
Discount Codes 3
  • list_discount_codes
  • create_discount_code
  • delete_discount_codedelete
Destructive (cancel/delete-strict) 5
  • cancel_ordercancel
  • close_ordercancel
  • cancel_fulfillmentcancel
  • delete_customerdelete_strict
  • delete_variantdelete_strict

web · 31 tools

Store 1
  • get_store_info
Articles 5
  • list_articles
  • get_article
  • create_article
  • update_article
  • delete_articledelete
Blogs 5
  • list_blogs
  • get_blog
  • create_blog
  • update_blog
  • delete_blogdelete
Pages 4
  • list_pages
  • get_page
  • update_page_seo
  • delete_pagedelete
Custom Collections 5
  • list_custom_collections
  • get_custom_collection
  • create_custom_collection
  • update_custom_collection
  • delete_custom_collectiondelete
Smart Collections + Collects 5
  • list_smart_collections
  • get_smart_collection
  • list_collects
  • create_collect
  • delete_collectdelete
Script Tags 3
  • list_script_tags
  • create_script_tag
  • delete_script_tagdelete
SEO + Variants (shared) 3
  • update_product_seo
  • list_variants_for_product
  • get_variant

pos-counter · 15 tools

Locations 2
  • list_locations
  • get_location
Payment Methods 1
  • list_payment_methods
Inventory (write) 3
  • adjust_inventory_level
  • connect_inventory_level
  • set_inventory_levelinventory_set
Variants (write) 1
  • update_variant
POS Orders 2
  • list_pos_orders
  • get_pos_order
Suppliers 2
  • list_suppliers
  • get_supplier
Stock Transfers 2
  • list_stock_transfers
  • get_stock_transfer
POS Shifts 2
  • list_pos_shiftsbroken
  • get_pos_shiftbroken

analytics · 10 tools (all composed)

Revenue & Sales 3
  • revenue_summary
  • top_products
  • top_customers
Customer & Tax 2
  • customer_ltv
  • tax_summary
Channel & Discount 2
  • online_vs_counter_breakdown
  • discount_usage_report
Operations 3
  • shift_report
  • inventory_low_stock
  • inventory_value

Tool verification status — biết tool nào tin được

5 cấp độ verification phản ánh độ chắc chắn schema khớp Sapo API. Canary nightly probe phát hiện drift trong 24h.

Canary-monitoredEndpoint + schema verified live, daily probe qua .github/workflows/canary.yml
Live-verifiedHit live khi develop, schema captured fixture, không nằm trong daily canary
Docs-onlySchema từ docs/sapo-api-reference.md chính thức, mock test, chưa probe live
ComposedKhông phải endpoint Sapo — aggregate logic nội bộ, unit-tested
BrokenĐã biết không hoạt động — list_pos_shifts, get_pos_shift trả HTML thay vì JSON

Canary-monitored endpoints (12)

ResourceMode(s)Endpoint
storeall/admin/store.json
products (read)pos-online, pos-counter/admin/products.json
orderspos-online, pos-counter/admin/orders.json
customerspos-online, pos-counter/admin/customers.json
inventory_levelspos-online, pos-counter/admin/inventory_levels.json
locationspos-counter/admin/locations.json
draft_orderspos-online/admin/draft_orders.json
price_rulespos-online/admin/price_rules.json
pagesweb/admin/pages.json
supplierspos-counter/admin/suppliers.json
stock_transferspos-counter/admin/stock_transfers.json
payment_methodspos-counter/admin/payment_methods.json
Broken — cần điều tra: list_pos_shiftsget_pos_shift hit /admin/pos_shifts.json nhưng nhận về Content-Type: text/html (Sapo POS web app shell). JSON API endpoint chưa tìm được. POS shift management hiện cần admin UI.

Destructive ops — gated bằng 2 lớp

Mặc định mọi tool destructive (cancel, delete, set inventory, refund) đều bị block. Bật từng category qua SAPO_ALLOW_OPS, đồng thời mỗi call vẫn cần confirm: true trong args để tránh LLM nhỡ tay.

CategoryToolsPhạm vi
cancelcancel_order, close_order, cancel_fulfillmentHủy đơn / fulfillment
deletedelete_article, delete_blog, delete_page, delete_*_collection, delete_collect, delete_script_tag, delete_draft_order, delete_price_rule, delete_discount_codeXóa content / metadata
delete_strictdelete_customer, delete_variantXóa entity quan trọng (data loss)
inventory_setset_inventory_levelGhi đè tuyệt đối tồn kho (mutate vs adjust)
refundcreate_refundHoàn tiền — tài chính
shift_close(reserved)Đóng ca POS — chưa active
cashbook_write(reserved)Sổ quỹ — chưa active (post-1.0)
# Allow order cancel + standard deletes
SAPO_ALLOW_OPS=cancel,delete npx sapo-mcp --mode=pos-online

# Wildcard (chỉ dùng môi trường dev/test)
SAPO_ALLOW_OPS=*

CLI flags & environment variables

Toàn bộ knob cấu hình. Một trong SAPO_API_SECRET hoặc SAPO_API_SECRET_FILE là bắt buộc — file mode an toàn hơn vì không lộ qua ps//proc.

CLI flags

FlagDefaultDescription
--mode=<modes>pos-onlineCSV danh sách modes
--transport=<t>stdiostdio hoặc http
--port=<n>3333HTTP port (bỏ qua nếu stdio)
--helpIn usage
--versionIn version

Environment variables

VariableRequiredDefaultDescription
SAPO_STOREyesStore subdomain
SAPO_API_KEYyesPrivate App key
SAPO_API_SECRETyes*Private App secret
SAPO_API_SECRET_FILEyes*File chứa secret (ưu tiên hơn env)
SAPO_ALLOW_OPSno""CSV destructive categories
SAPO_MAX_AUTO_PAGESno10Max auto-pagination pages
SAPO_RETRY_MAXno3HTTP retry attempts
SAPO_LOG_LEVELnoinfoerror / warn / info / debug / trace
SAPO_HTTP_HOSTno†127.0.0.1HTTP bind host
SAPO_HTTP_PORTno3333HTTP port
SAPO_HTTP_MAX_SESSIONSno100Max concurrent MCP sessions
SAPO_HTTP_SESSION_IDLE_MSno1800000Idle session GC (30 min)
SAPO_MCP_AUTH_TOKENno†Bearer token; bắt buộc nếu host non-loopback
SAPO_HTTP_CORS_ORIGINSnoCSV CORS origins (default: off)

* Một trong hai bắt buộc. † HTTP-only; token enforce khi host khác 127.0.0.1 / localhost / ::1.

Hai transport: stdio + Streamable HTTP

stdio cho MCP client local (Claude Desktop, Cursor). HTTP cho remote agents, Docker, GoClaw — bind loopback mặc định, public bind yêu cầu auth token.

MethodPathDescription
GET/healthLiveness probe — { status, version, modes, sessions }
POST/mcpJSON-RPC over Streamable HTTP (init session)
GET/mcpSSE long-poll (header mcp-session-id)
DELETE/mcpTerminate session
# Local-only (no auth)
sapo-mcp --mode=pos-online \
  --transport=http --port=3333
# Public bind — token required
SAPO_HTTP_HOST=0.0.0.0 \
SAPO_MCP_AUTH_TOKEN=$(openssl rand -hex 32) \
sapo-mcp --mode=pos-online --transport=http

Session model: mỗi MCP client một UUID session, isolated bằng McpServer instance. Idle session vượt SAPO_HTTP_SESSION_IDLE_MS bị evict tự động. Concurrent cap SAPO_HTTP_MAX_SESSIONS → 503 khi đầy. CORS off mặc định, bật bằng SAPO_HTTP_CORS_ORIGINS (CSV hoặc *).

Có sẵn examples/Dockerfile + examples/docker-compose.yml để tự host.

Probing & canary scripts

Trước khi cấu hình client, verify endpoint nào available trên store của bạn. Write-probe có safeguard: chỉ chạy nếu SAPO_STORE chứa test, dev hoặc sandbox.

# Read-only probe — safe, GET only
SAPO_STORE=mystore SAPO_API_KEY=xxx SAPO_API_SECRET=yyy npm run probe

# Schema drift check (probe + Zod validate vs fixtures)
npm run canary

# Write probe — chỉ chạy được trên test/dev/sandbox stores
npm run probe:write

Post-1.0 roadmap — đang chờ stable cut

Pre-1.0 nên tool name & schema có thể đổi giữa các minor bump. Các hạng mục dưới đây là gating cho 1.0.0:

MCP Resources

sapo://shop/info, sapo://orders/today, sapo://orders/pending, sapo://inventory/low-stock — read-heavy data dùng Resource hiệu quả hơn tool call lặp.

MCP Prompts

Templated workflows: respond_to_complaint, weekly_report, seo_optimize_product, customer_followup.

Webhook receiver

Sub-package surface Sapo webhooks thành MCP events.

OAuth 2.0 Partner App

Multi-tenant SaaS. Mở khóa 5 internal-only endpoints (purchase_orders, purchase_returns, stock_adjustments, cash_transactions, cashbook) + 4 finance/PO reports đang hoãn.

Storefront GraphQL

Verify Private App access cho GraphQL Storefront API; scope tools nếu khả dụng.

Secret-file isolation

Đọc secret duy nhất lúc startup rồi clear khỏi memory — tracked nhưng chưa land.