Skip to main content
Glama

blinkit-mcp

An API-only MCP server for Blinkit (Indian quick-commerce). Every runtime call is a plain HTTPS request to blinkit.com — no browser automation in the happy path. A browser is used only once, during research, to discover endpoints; see RESEARCH.md.

How it works (the important bits)

  • Cloudflare TLS fingerprinting blocks ordinary HTTP clients (curl, Node fetch → 403). We use impit to impersonate Chrome's TLS handshake, so requests pass with no browser and no cookie/challenge. This is what makes API-only possible.

  • Bootstrap: GET /v2/accounts/auth_key/ with a fixed req_key constant → device auth_key (no login). Sent on every call.

  • Login is headless OTP: send_otp(phone) → verify_otp(phone, code) returns an access_token we persist. No browser ever involved.

  • Server-driven UI responses are parsed defensively into clean product/order objects.

Related MCP server: shop-mcp

Setup

pnpm install
pnpm build

Add to your MCP client (e.g. Claude Code mcp config):

{
  "mcpServers": {
    "blinkit": { "command": "node", "args": ["/path/to/blinkit-mcp/dist/index.js"] }
  }
}

State is stored in ~/.blinkit-mcp/:

  • session.json — device id, auth_key, access_token (secret), location, store. chmod 600.

  • staples.json — your reorder catalog + scorer weights.

  • cart.json — the current working cart.

Tools

Auth/login — blinkit_login_status, blinkit_send_otp, blinkit_verify_otp, blinkit_logout Location — blinkit_set_location, blinkit_check_serviceability Discovery — blinkit_search, blinkit_autosuggest, blinkit_pick_best, blinkit_recommendations, blinkit_home_feed Cart — blinkit_add_to_cart, blinkit_remove_from_cart, blinkit_view_cart, blinkit_clear_cart Reorder — blinkit_quick_reorder, blinkit_list_staples, blinkit_set_staple Checkout/pay — blinkit_get_addresses, blinkit_checkout, blinkit_prepare_order, blinkit_pay_upi, blinkit_payment_status Orders — blinkit_order_count, blinkit_order_history

Typical flow (fully headless; only PhonePe approval is manual)

blinkit_set_location { lat: 28.5653836, lon: 77.38265 }      # once, persists
blinkit_send_otp     { phone: "9XXXXXXXXX" }
blinkit_verify_otp   { phone: "9XXXXXXXXX", code: "1234" }    # stores access_token + phone
blinkit_pick_best    { query: "milk", brands:["Amul"], attrs:["full cream"] }  # → product
blinkit_get_addresses                                        # → address_id
blinkit_checkout     { items: [ <chosen> ], address_id }     # → server cart_id (creates+binds+validates)
blinkit_pay_upi      { cart_id, method:"collect", vpa:"name@ybl", wait:true }
#   → pushes a UPI collect to PhonePe; streams status via notifications; you approve on your phone

Payment status & notifications

  • blinkit_pay_upi initiates UPI payment (method:"qr" returns a upi://pay intent link; method:"collect" + vpa pushes a collect request to your UPI app). With wait:true it polls verifyPaymentStatus until terminal and returns final_status.

  • blinkit_payment_status checks the last (or a given) in-flight payment on demand — returns pending / success / failed.

  • The server declares the MCP logging capability and emits notifications/message during the wait ("waiting for approval", "✅ approved", "❌ failed") — surfaced live by Claude Code.

Payment is delegated to Zomato zpaykit; the human step is approving the UPI request in PhonePe. See RESEARCH.md §8–9 for the full captured flow.

Notes / limits

  • Unofficial, reverse-engineered API — no stability guarantees; header/version constants may need bumping. Respect Blinkit's ToS and rate limits; intended for personal automation.

  • auth_key / req_key constants are overridable via BLINKIT_REQ_KEY if Blinkit rotates them.

  • Not affiliated with or endorsed by Blinkit/Zomato. Use at your own risk.

License

MIT — see LICENSE.

Available Tools

25 tools
blinkit_add_to_cartA

Add line items to the working cart and reprice. Pass the product objects (or their cart_item) returned by blinkit_search/blinkit_pick_best.

Inputs: items (required).

blinkit_autosuggestC

Typeahead suggestions for a partial query.

Inputs: query (required).

blinkit_checkoutA

Headless checkout prep: create a real server cart from items, bind the delivery address, and validate. Returns the server cart_id to pass to blinkit_prepare_order / blinkit_pay_upi.

Inputs: items (required), address_id (required).

blinkit_check_serviceabilityA

Check if Blinkit delivers to a lat/lon (does not change the saved location).

Inputs: lat (required), lon (required).

blinkit_clear_cartB

Empty the working cart.

Inputs: no named parameters.

blinkit_get_addressesA

List saved delivery addresses (id, label, location). Requires login.

Inputs: no named parameters.

blinkit_home_feedB

Products surfaced on the home feed for the saved location.

Inputs: no named parameters.

blinkit_list_staplesB

List the saved staple catalog and pick preferences.

Inputs: no named parameters.

blinkit_login_statusA

Show whether a user is logged in and the saved location/store.

Inputs: no named parameters.

blinkit_logoutA

Clear the stored access_token.

Inputs: no named parameters.

blinkit_order_countB

Lifetime order counts (delivered/live/cancelled). Requires login.

Inputs: no named parameters.

blinkit_order_historyA

Recent orders with totals, status, item names, and reorder product ids. Requires login.

Inputs: no named parameters.

blinkit_payment_statusA

Check the status of the last (or a specific) in-flight UPI payment without re-initiating it. Returns pending / success / failed.

Inputs: cart_id.

blinkit_pay_upiA

Initiate UPI payment on a prepared order via Zomato zpaykit. method 'qr' returns a upi://pay intent link to open on the phone; method 'collect' attempts to push a collect request to the given VPA (PhonePe). Then poll status.

Inputs: cart_id (required), vpa, wait, method.

blinkit_pick_bestA

Search and auto-pick the best product using the multi-factor scorer (brand + attributes + availability + price), with cheaper-equivalent swap. Returns the chosen product, alternatives, and the reason.

Inputs: query (required), attrs, brands, max_price.

blinkit_prepare_orderA

Mint a payment session for a server-synced cart (createOrder + zomato_payment_hash). Returns PAS token, orderId, payable amount. Fails if the order already has a pending payment.

Inputs: cart_id (required).

blinkit_quick_reorderA

Rebuild a basket from saved staples. With no keys, adds all auto-eligible staples silently; otherwise resolves the given staple keys. Returns the repriced cart and what was chosen for each item.

Inputs: keys.

blinkit_recommendationsB

Products frequently bought with a given product id ('people also bought').

Inputs: product_id (required).

blinkit_remove_from_cartB

Remove a product from the working cart by id and reprice.

Inputs: product_id (required).

blinkit_send_otpA

Send a login OTP to a phone number (headless, no browser). Step 1 of login.

Inputs: phone (required).

blinkit_set_locationB

Resolve a lat/lon, confirm serviceability, pick the express dark store, and save it as the default delivery location.

Inputs: lat (required), lon (required).

blinkit_set_stapleC

Add or update a staple in the reorder catalog.

Inputs: key (required), query (required), auto, unit, +4 more.

blinkit_verify_otpA

Verify the OTP and persist the access_token. Step 2 of login. NOTE: a wrong code returns ok:false even though Blinkit reports success.

Inputs: code (required), phone (required).

blinkit_view_cartA

Show the working cart, repriced (items, payable amount, delivery, MROV).

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.6/5.0

    Scored across 25 tools

    Disambiguation5/5

    Each tool targets a distinct action or resource (e.g., add_to_cart vs. remove_from_cart, search vs. pick_best). There is minimal overlap, and descriptions clearly differentiate similar tools.

    Naming Consistency5/5

    All tools follow a consistent 'blinkit_verb_noun' pattern in snake_case, making the tool surface predictable and easy to navigate.

    Tool Count4/5

    With 25 tools, the set is slightly larger than the ideal range but justifiable for a full-featured e-commerce MCP server covering login, location, cart, search, ordering, and payment.

    Completeness4/5

    The surface covers most lifecycle stages (login, search, cart, checkout, payment, staples), but lacks explicit order cancellation or address update during checkout, which are minor gaps.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers