sixty60-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@sixty60-mcp search for 2L milk and add two to my cart"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
sixty60-mcp
MCP server for Checkers Sixty60: log in, search, build the real cart, and preview checkout totals. Paying and placing the order happens in the Sixty60 app — the cart built here is the same cart the app shows.
Built on the private Sixty60 mobile-app API, via the API layer of
checkers60-cli (MIT, vendored in src/vendor/checkers60
from commit 1e4c5d1). The API is undocumented and can change or break without notice.
Hosted: https://mcp.skoonveld.app
A Cloudflare Worker serves the MCP endpoint at https://mcp.skoonveld.app/mcp and the setup page at
https://mcp.skoonveld.app.
Sign-in: OAuth 2.1 through
@cloudflare/workers-oauth-provider, using dynamic client registration and client ID metadata documents. The connect page signs you in with your Sixty60 mobile number and SMS code. SMS sends are rate-limited per number and per IP address.Per-user state: each Sixty60 account has its own Durable Object (
Sixty60Account). It holds that account's session, device id and stores, and runs the account's tool calls. The OAuth grant carries only the account id and mobile number.Expiry: Sixty60 sessions expire after about an hour. The MCP connection stays authorised, and Claude asks for a new SMS code through
sixty60_login_start/sixty60_login_verify, limited to the connected number.
npx wrangler dev # local, http://localhost:8787
npx wrangler deploy # Longshots account, custom domain mcp.skoonveld.appRelated MCP server: woolies-mcp
Local (stdio)
npm install && npm run build
claude mcp add sixty60 -- node "$PWD/dist/local.js" # or use the bundled .mcp.jsonAsk Claude to log in: it calls sixty60_login_start with the mobile number, you read back the SMS code,
and it calls sixty60_login_verify. State lives in ~/.config/sixty60-mcp/state.json
(override with SIXTY60_STATE_PATH).
Stores
Search, prices and stock come from the stores that serve the account's current delivery address
(set it in the app), resolved once per account. With no usable address it falls back to Potchefstroom — override with
SIXTY60_LATITUDE / SIXTY60_LONGITUDE, or pin exact stores with CHECKERS60_STORES (JSON array).
sixty60_status shows which address and stores are in use.
Tools
Tool | What it does |
| SMS one-time-PIN login |
| Session expiry, address and stores in use |
| Catalogue search and product details with deals |
| Current carts ( |
| Change the real cart |
| Fees, payable total, slots, payment methods |
| Account reads |
Prices are in cents (ZAR).
Layout
src/tools.ts: every tool, shared by both serverssrc/local.ts: stdio server, one account saved in a JSON filesrc/worker/: hosted server (OAuth, connect pages,Sixty60AccountDurable Object)src/vendor/checkers60/: Sixty60 API client from checkers60-cli
Changes to the vendored code
context.ts(new): per-user state (credentials, device id, stores, cart plans), scoped per call withAsyncLocalStorage. A hosted isolate serves many accounts, so nothing user-specific lives in module globals.config.ts:CONFIGreads and writes the user-specific fields (mobile, stores, location, ids) on the current user context.creds-store.ts,runtime.ts,confirm.ts: credentials, the device id and cart plans live in the user context instead of files and file locks.cart-mutate.ts:runCartMutationreturns aCartMutationResultinstead of writing to stdout.Removed CLI-only modules (
output,address-mutate,favourites-mutate,discovery) and terminal helpers.
Available Tools
15 toolssixty60_addressesSixty60 delivery addressesBRead-only
Saved delivery addresses on the account. Switch address in the Sixty60 app.
Inputs: no named parameters.
sixty60_cartView Sixty60 cartARead-only
Show the account's carts (the same carts the Sixty60 app shows). Prices are in cents. Totals are line-price sums; use sixty60_checkout_preview for delivery fees and the payable total.
Inputs: mode.
sixty60_cart_addAdd to Sixty60 cartA
Add a product to the real Sixty60 cart. Pass a product id from sixty60_search for an exact match; a search term adds the top search result. If the product is already in the cart, the quantity is added to it.
Inputs: product (required), mode, weight, quantity.
sixty60_cart_clearEmpty Sixty60 cartBDestructive
Remove every item from one cart.
Inputs: mode.
sixty60_cart_removeRemove from Sixty60 cartADestructive
Remove a product from the cart, or reduce its quantity. Match by product id or by part of the product name.
Inputs: product (required), mode, weight, quantity.
sixty60_checkout_previewPreview Sixty60 checkoutARead-only
Server-calculated totals for the current cart: subtotal, discounts, delivery fees, payable total, delivery slots and payment methods. Read-only — placing the order and paying happens in the Sixty60 app.
Inputs: no named parameters.
sixty60_delivery_slotsSixty60 delivery slotsBRead-only
Next available delivery slots for the current address.
Inputs: mode.
sixty60_login_startStart Sixty60 loginA
Send a one-time PIN by SMS to the Sixty60 account's mobile number. Returns a reference to pass to sixty60_login_verify with the code the user receives.
Inputs: mobile.
sixty60_login_verifyFinish Sixty60 loginA
Verify the SMS one-time PIN and save the session (valid about an hour).
Inputs: code (required), reference (required).
sixty60_logoutLog out of Sixty60B
Delete the saved Sixty60 session.
Inputs: no named parameters.
sixty60_ordersSixty60 ordersARead-only
Order list. Active orders by default; set all=true for history. Pass reference to get one order's items and status.
Inputs: all, reference.
sixty60_past_purchasesSixty60 past purchasesARead-only
What this account usually buys: completed orders with their items, and the most frequently bought products. Useful for rebuilding a regular shop.
Inputs: top.
sixty60_productGet Sixty60 productBRead-only
Full details and active deals for one product id.
Inputs: productId (required).
sixty60_searchSearch Sixty60 productsARead-only
Search the catalogue for the stores serving the current delivery address. Prices are in cents (ZAR). Use the returned product id with sixty60_cart_add to add the exact product.
Inputs: query (required), page, limit.
sixty60_statusSixty60 session statusARead-only
Show whether we're logged in, when the session expires, and which delivery address and stores are being used.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 15 tools
Each tool has a clearly distinct purpose: auth lifecycle, status, search/product lookup, cart operations (view/add/remove/clear), checkout preview, delivery slots, orders, addresses, and past purchases. The only mild overlap is between sixty60_orders and sixty60_past_purchases, but descriptions clearly differentiate active/history orders from frequency-based purchase history.
All tools share the sixty60_ prefix and snake_case, with a consistent naming feel. However, some are verb_noun (login_start, cart_add, checkout_preview) while others are bare nouns acting as getters (cart, product, status, orders, addresses), which is a minor deviation from a pure verb_noun pattern but still very readable.
15 tools is well within the ideal range and each earns its place: authentication, catalogue search, product details, cart management, checkout preview, delivery slots, orders, addresses, and purchase history. No redundant or filler tools are present.
The surface covers the full companion-app workflow: auth lifecycle, search and product lookup, cart CRUD (add/remove/clear/view), checkout preview, delivery slots, order history, addresses, and past purchases. Gaps like placing an order, switching address, and editing addresses are explicitly deferred to the Sixty60 app, so they are intentional rather than missing, though the lack of any address or cart-quantity update beyond add/remove is a minor limitation.
Maintenance
Related MCP Connectors
Search products, manage a customer cart, and request current checkout quotes.
Search live store shelves, verify delivery windows, and run instant AI agent checkouts.
Discover Servd venues, browse menus, validate carts, place confirmed orders, and track status.
Browse the Gelato catalog, prices, orders and shipping; quote, create draft orders and products.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenancePersonal UK Tesco grocery account over MCP: search, basket, slots, orders, and on-pack nutrition (search and rank by macros + micros). Catalogue + nutrition tools need no auth; destructive actions require a two-step confirm288 npm17MIT
- AlicenseAqualityBmaintenanceEnables browsing and searching the Woolworths New Zealand grocery catalogue, retrieving product details, checking specials, and managing a shopping trolley with optional account sign-in.184MIT
- AlicenseNot gradedqualityBmaintenanceEnables product search and authenticated grocery shopping-list management, including adding items, setting quantities, removing items, emptying the list, and reading purchase history.1MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to search and browse grocery products, manage a cart, check out, and complete UPI payments, with OTP login and delivery-address selection built in. Order placement is gated on the user explicitly confirming the exact payable amount.62 npm12MIT