Skip to main content
Glama
sixty60-mcp
by matogen

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.app

Related 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.json

Ask 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

sixty60_login_start / sixty60_login_verify / sixty60_logout

SMS one-time-PIN login

sixty60_status

Session expiry, address and stores in use

sixty60_search, sixty60_product

Catalogue search and product details with deals

sixty60_cart

Current carts (sixty-min and one-day)

sixty60_cart_add / sixty60_cart_remove / sixty60_cart_clear

Change the real cart

sixty60_checkout_preview, sixty60_delivery_slots

Fees, payable total, slots, payment methods

sixty60_addresses, sixty60_orders, sixty60_past_purchases

Account reads

Prices are in cents (ZAR).

Layout

  • src/tools.ts: every tool, shared by both servers

  • src/local.ts: stdio server, one account saved in a JSON file

  • src/worker/: hosted server (OAuth, connect pages, Sixty60Account Durable 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 with AsyncLocalStorage. A hosted isolate serves many accounts, so nothing user-specific lives in module globals.

  • config.ts: CONFIG reads 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: runCartMutation returns a CartMutationResult instead of writing to stdout.

  • Removed CLI-only modules (output, address-mutate, favourites-mutate, discovery) and terminal helpers.

Available Tools

15 tools
sixty60_addressesSixty60 delivery addressesB
Read-only

Saved delivery addresses on the account. Switch address in the Sixty60 app.

Inputs: no named parameters.

sixty60_cartView Sixty60 cartA
Read-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 cartB
Destructive

Remove every item from one cart.

Inputs: mode.

sixty60_cart_removeRemove from Sixty60 cartA
Destructive

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 checkoutA
Read-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 slotsB
Read-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 ordersA
Read-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 purchasesA
Read-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 productB
Read-only

Full details and active deals for one product id.

Inputs: productId (required).

sixty60_statusSixty60 session statusA
Read-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

    A3.7/5.0

    Scored across 15 tools

    Disambiguation5/5

    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.

    Naming Consistency4/5

    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.

    Tool Count5/5

    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.

    Completeness4/5

    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

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      Personal 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 confirm
      288 npm
      17
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Enables browsing and searching the Woolworths New Zealand grocery catalogue, retrieving product details, checking specials, and managing a shopping trolley with optional account sign-in.
      18
      4
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables product search and authenticated grocery shopping-list management, including adding items, setting quantities, removing items, emptying the list, and reading purchase history.
      1
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables 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 npm
      12
      MIT