Skip to main content
Glama
harristeeter-mcp
by chrischall

harristeeter-mcp

Harris Teeter for Claude: search groceries with prices at your store, build the cart, pick a pickup window and start checkout, clip digital coupons, read the weekly ad and your specials, check fuel points and past receipts, find recipes, manage shopping lists, browse and order from Order Ahead (deli, subs, pizza, platters), and check your prescriptions. You place grocery orders yourself on harristeeter.com. The MCP stops at a draft checkout with the real totals and hands you the link.

This project was developed and is maintained by AI (Claude Code). Use at your own discretion.

How it reaches Harris Teeter

harristeeter.com is Kroger's web platform behind Akamai bot protection, and it answers only a real browser. Every request therefore runs inside your own signed-in harristeeter.com tab through the ContextMint Bridge extension (the fetchproxy bridge), reusing your session. There are no credentials to configure.

  1. Install the ContextMint Bridge extension and sign in at https://www.harristeeter.com.

  2. Add the server (below) and call ht_healthcheck.

  3. Approve the pair code it shows in the extension popup, once.

If a second browser also runs ContextMint Bridge, stderr will show a fresh pair code on every call even though the call succeeds. Don't approve those; that's the other browser being refused.

Related MCP server: RappiMCP

Without the browser: Kroger's official API (optional)

Product search, prices and store lookup can run without the bridge through Kroger's official API. Register an app at developer.kroger.com and set KROGER_API_CLIENT_ID and KROGER_API_CLIENT_SECRET. ht_search_products, ht_get_products and ht_find_stores then call api.kroger.com directly, pricing against a store chosen in this order:

  1. a zip or locationId you pass for that one search;

  2. the store you saved with ht_set_store ("use my Park Road store");

  3. HARRISTEETER_LOCATION_ID;

  4. the store last seen in your browser, remembered whenever the bridge reads it, so the server keeps pricing at your store when the browser is closed;

  5. your browser's store, read live through the bridge.

ht_get_store shows which one is in use and why. Cart, pickup times and checkout always use the store chosen on harristeeter.com. Results have the same fields either way and say which source served them; the API prices produce per pound, and each API result says so. Everything else (cart, checkout, coupons, lists, Order Ahead, pharmacy) still needs the bridge: Kroger's API sign-in doesn't accept Harris Teeter accounts, so it can't act on your account.

Install

{
  "mcpServers": {
    "harristeeter": { "command": "npx", "args": ["-y", "@chrischall/harristeeter-mcp"] }
  }
}

Tools

Tool

What it does

ht_search_products

Search at your pickup store: UPC, name, brand, size, price, sale price, unit price, stock

ht_get_products

Look up UPCs

ht_find_stores

Harris Teeter stores near a ZIP, with the 8-digit location id (needs Kroger API credentials)

ht_get_cart

Cart with names, prices, estimated subtotal

ht_add_to_cart

Add items by UPC (adds to existing quantity)

ht_update_cart_item

Set quantity / substitution preference (0 removes)

ht_remove_from_cart

Remove items

ht_get_store

Your pickup store, and the store search prices against

ht_set_store

Choose the search store by ZIP, name or location id (or clear it)

ht_list_timeslots

Open pickup windows and fees for the cart

ht_start_checkout

Confirmation-gated. Reserve a window and create the checkout, returning totals and the place-order link

ht_get_checkout

The current checkout draft

ht_list_orders

Past purchases and receipts (each with a receiptKey)

ht_get_receipt

One purchase in full: items, price paid, savings, totals

ht_list_upcoming_orders

Orders placed but not yet picked up

ht_list_coupons / ht_clip_coupon / ht_unclip_coupon

e-VIC digital coupons

ht_list_specials

Your personalised My Specials

ht_get_weekly_ad

This week's ad, by department or text

ht_get_fuel_points

Fuel points balance and expiry

ht_search_recipes / ht_get_recipe

Recipes, with store products matched to ingredients

ht_list_shopping_lists / ht_get_shopping_list / ht_create_shopping_list / ht_rename_shopping_list / ht_delete_shopping_list

Shopping lists (delete is confirmation-gated)

ht_add_to_shopping_list / ht_remove_from_shopping_list

Add or remove list items by UPC

ht_oa_list_departments / ht_oa_list_menu / ht_oa_get_item / ht_oa_list_pickup_times

Order Ahead menus and pickup times

ht_oa_place_order

Confirmation-gated. Place an Order Ahead order, paid at pickup. Not yet verified against a live order.

ht_rx_session / ht_rx_list_prescriptions

Pharmacy: session status, prescriptions, refills remaining, due dates

ht_rx_request_refill

Confirmation-gated. Request a refill, paid at the pharmacy. Not yet verified against a live refill.

ht_healthcheck

Bridge status

Cart tools change only your cart and can be undone, so they run without confirmation. ht_start_checkout reserves a pickup window, so it previews first and acts only when called again with the returned confirmToken.

Pharmacy needs its own sign-in

Opening harristeeter.com/rx asks you to sign in again (with a one-time code the first time on a browser). Pharmacy access then lasts one hour from sign-in, and nothing extends it. When it lapses the ht_rx_* tools say so; sign in again at https://www.harristeeter.com/rx/dashboard. If a pharmacy tab is open when the hour ends, the site signs you out of harristeeter.com entirely, so the grocery tools need a fresh sign-in too. Keep a regular harristeeter.com tab open as well, because the bridge can't send some requests from a pharmacy page.

Why it can't press "Place Order"

The site submits orders to a separate payment host from a hosted payment frame that attaches its own token plus fraud-screening and bot-detection data. Sending that from a server would mean faking those signals, so the final click stays with you. See docs/HT-API.md.

Configuration

Variable

Default

HARRISTEETER_WS_PORT

37149

fetchproxy concentrator port, shared by the whole fleet. Change only if you know why.

KROGER_API_CLIENT_ID / KROGER_API_CLIENT_SECRET

unset

Optional Kroger developer app: search and prices without the browser

HARRISTEETER_LOCATION_ID

unset

8-digit store id for bridge-free search (below a saved ht_set_store choice)

HARRISTEETER_STATE_DIR

~/.harristeeter-mcp

Where the saved and remembered store are kept

HARRISTEETER_DEBUG

unset

1 for verbose bridge logging to stderr

MCP_USER_TZ

America/New_York

IANA zone sent with pickup-time requests

MCP_CONFIRM_MODE

ask-user

ask-user (the model must get your OK in chat before using a token), auto, or refuse

MCP_CONFIRM_ELICITATION

on

off skips the client's confirmation prompt even when it supports one

MCP_CONFIRM_SECRET

random per process

Fixed key for confirm tokens, so a token survives a restart

Skill

skills/harristeeter-fpx does the same reads and cart changes from a shell with the fpx CLI, with no MCP server.

License

MIT

Available Tools

39 tools
ht_add_to_cartA

Add groceries to the Harris Teeter cart by UPC. Adds to any quantity already in the cart. Reversible with ht_update_cart_item / ht_remove_from_cart; nothing is ordered or charged.

Inputs: items (required).

ht_add_to_shopping_listA

Add items to a Harris Teeter shopping list by UPC (adds to any quantity already there). Undo with ht_remove_from_shopping_list.

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

ht_clip_couponA
Idempotent

Load a Harris Teeter e-VIC digital coupon to your card (applies at checkout or in store). Undo with ht_unclip_coupon.

Inputs: couponId (required).

ht_create_shopping_listB

Create a new, empty Harris Teeter shopping list. Remove it with ht_delete_shopping_list.

Inputs: name (required).

ht_delete_shopping_listA
Destructive

Delete a Harris Teeter shopping list and everything on it. Cannot be undone. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call returns a preview and a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE).

Inputs: listId (required), confirmToken.

ht_find_storesA
Read-only

Find Harris Teeter stores near a ZIP code — name, address and the 8-digit location id (set HARRISTEETER_LOCATION_ID to search prices there without the browser). Needs Kroger API credentials.

Inputs: zip (required), limit.

ht_get_cartA
Read-only

Show the Harris Teeter cart — each item with quantity, name, size and price, plus an estimated subtotal.

Inputs: view.

ht_get_checkoutA
Read-only

Show the current Harris Teeter checkout draft — items, pickup window, coupons, fees, tax, total and payment card — plus the link to review and place it.

Inputs: view.

ht_get_fuel_pointsB
Read-only

Show your Harris Teeter fuel points: current balance, earned and redeemed this period, and points expiring next.

Inputs: view.

ht_get_productsB
Read-only

Look up Harris Teeter products by UPC — price, sale price, size, unit price and stock at your pickup store.

Inputs: upcs (required), zip, view, locationId.

ht_get_receiptA
Read-only

Read one Harris Teeter purchase in full — every item with quantity, price paid and savings, plus subtotal, coupons, tax and total. Pass a receiptKey from ht_list_orders. The site sometimes refuses this request (its bot protection); if so, open the purchase under My Purchases on harristeeter.com.

Inputs: receiptKey (required), view.

ht_get_recipeA
Read-only

Read a Harris Teeter recipe: ingredients, steps, times, servings, and the store products (UPCs) matched to each ingredient — ready for ht_add_to_cart.

Inputs: id (required), view.

ht_get_shopping_listB
Read-only

Read one Harris Teeter shopping list with its items.

Inputs: listId (required), view.

ht_get_storeA
Read-only

Show which Harris Teeter store is in use: the one chosen on harristeeter.com (cart, pickup, checkout) and the one bridge-free search prices against, with where that choice came from.

Inputs: no named parameters.

ht_get_weekly_adA
Read-only

Read this week's Harris Teeter weekly ad (Weekly Specials) at your store, by department: 1 Produce, 2 Breads & Bakery, 3 Deli, 4 Dairy & Chilled Foods, 5 Frozen Foods, 6 Meat - Packaged, 7 Meat - Fresh, 8 Seafood, 9 Breakfast Foods, 10 Meal Makers, 11 Baking Items, 12 Snacks & Sweets, 13 Beverages, 14 Beer & Wine, 15 Household Essentials, 16 Pet Essentials, 17 Health Care Essentials, 18 Beauty Care Essentials. Omit department for every department.

Inputs: view, search, department.

ht_healthcheckVerify the ContextMint Bridge connection end-to-endA
Read-onlyIdempotent

Round-trips a small public www.harristeeter.com URL (/robots.txt) through ContextMint Bridge (your signed-in browser tab) and returns diagnostics: the bridge's role (host/peer/null), port, version, the extension link (linked / pair pending / not attached / never answered), the elapsed round-trip time, and a plain-English hint distinguishing 'bridge never came up' from 'extension not connected' from 'this browser can't serve a capability' from 'real www.harristeeter.com-side problem'. Read-only, no auth required. Call this when a real tool fails and you want to know which hop broke.

Inputs: no named parameters.

ht_list_couponsA
Read-only

List Harris Teeter e-VIC digital coupons — available (unclipped), clipped to your card, or all — with brand, value and expiry. Use ht_clip_coupon to load one to your card.

Inputs: view, limit, offset, search, +1 more.

ht_list_ordersA
Read-only

List past Harris Teeter purchases (online orders and in-store receipts on the loyalty card) — date, total, status and item UPCs.

Inputs: page, view, endDate, pageSize, +1 more.

ht_list_shopping_listsA
Read-only

List your Harris Teeter shopping lists — name, item count and listId.

Inputs: no named parameters.

ht_list_specialsA
Read-only

List your personalised Harris Teeter "My Specials" — sale items picked for your card, with sale price, regular price, limit and end date.

Inputs: view.

ht_list_timeslotsA
Read-only

List available Harris Teeter pickup windows (next ~7 days) for what is in the cart now, with the fee for each. Pass a window to ht_start_checkout.

Inputs: view.

ht_list_upcoming_ordersA
Read-only

List Harris Teeter orders placed but not yet picked up — the next pickup, its window and status. Empty when nothing is scheduled.

Inputs: no named parameters.

ht_oa_get_itemA
Read-only

Read one Order Ahead item in full — description, price, and any options (bread, toppings, sizes).

Inputs: productId (required), view.

ht_oa_list_departmentsA
Read-only

List Harris Teeter Order Ahead departments at your store — deli counter, sandwich shop, pizzas, party and seafood platters, fruit baskets, bakery, holiday meals — with lead time and order cutoff. Order Ahead is paid at pickup.

Inputs: no named parameters.

ht_oa_list_menuB
Read-only

List the Order Ahead menu for one department — items with name, price, unit and serving size, grouped by category.

Inputs: departmentId (required), view.

ht_oa_list_pickup_timesB
Read-only

List Order Ahead pickup times on a date for the given departments (e.g. "10:15 AM" … "7:00 PM").

Inputs: date (required), departmentIds (required).

ht_oa_place_orderA
Destructive

Place a Harris Teeter Order Ahead order (deli, subs, pizza, platters) for pickup — paid at the store when you collect it. The store starts preparing it and there is no cancel from here, so this sends real work to a person. NOT yet verified against a live order: the first real use is the test. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call returns a preview and a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE).

Inputs: date (required), time (required), items (required), confirmToken.

ht_remove_from_cartA
Idempotent

Remove items from the Harris Teeter cart by UPC. Re-add with ht_add_to_cart.

Inputs: upcs (required).

ht_remove_from_shopping_listA
Idempotent

Remove items from a Harris Teeter shopping list by UPC. Re-add with ht_add_to_shopping_list.

Inputs: upcs (required), listId (required).

ht_rename_shopping_listC
Idempotent

Rename a Harris Teeter shopping list.

Inputs: name (required), listId (required).

ht_rx_list_prescriptionsA
Read-only

List prescriptions at the Harris Teeter pharmacy — drug, Rx number, status (refillable, too soon, no refills), refills remaining, refill due date, last fill, price and prescriber. Needs an active pharmacy session (ht_rx_session).

Inputs: view, patientNumber.

ht_rx_request_refillA
Destructive

Request a refill of a prescription for pickup at its Harris Teeter pharmacy, paid at the pharmacy. The pharmacy starts work on it and there is no cancel from here. Needs an active pharmacy session. NOT yet verified against a live refill: the first real request is the test. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call returns a preview and a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE).

Inputs: rxNumber (required), pickupDate (required), pickupTime (required), confirmToken.

ht_rx_sessionA
Read-only

Check whether the Harris Teeter pharmacy session is active. Pharmacy access needs a separate sign-in at harristeeter.com/rx (a one-time code on a browser it does not know) and lasts one hour from sign-in; it cannot be extended.

Inputs: no named parameters.

ht_search_productsA
Read-only

Search Harris Teeter groceries by keyword at your pickup store — returns UPC, name, brand, size, price, sale price, unit price and pickup stock. Use the UPC with ht_add_to_cart. With Kroger API credentials set it runs without the browser (source: api.kroger.com); that API prices produce per pound where the website prices it per item.

Inputs: query (required), zip, view, limit, +3 more.

ht_search_recipesA
Read-only

Search Harris Teeter recipes by keyword — title, total time, servings and ingredient count. Use ht_get_recipe for ingredients, steps and matching products.

Inputs: query (required), view, limit, offset.

ht_set_storeA
Idempotent

Choose the Harris Teeter store that bridge-free product search prices against — by ZIP (optionally with part of the store name, e.g. "Park Road") or 8-digit location id — or clear the choice to follow the store picked on harristeeter.com. Saved on this server; does not change the store on your Harris Teeter account.

Inputs: zip, name, clear, locationId.

ht_start_checkoutA

Reserve a Harris Teeter pickup window and create the checkout for the current cart. Returns the real totals (coupons, fees, tax) and a link; the order is NOT placed and nothing is charged — the user reviews it and presses "Place Order" on harristeeter.com. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call returns a preview and a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE).

Inputs: window (required), confirmToken.

ht_unclip_couponA
Idempotent

Remove a clipped e-VIC digital coupon from your card. Re-add with ht_clip_coupon.

Inputs: couponId (required).

ht_update_cart_itemA
Idempotent

Set the quantity (or substitution preference) of items already in the Harris Teeter cart. Quantity 0 removes the item. Nothing is ordered or charged.

Inputs: items (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 39 tools

    Disambiguation4/5

    Tools are split into clearly distinct areas (product search, cart, checkout, lists, coupons, Order Ahead, pharmacy) and most names/descriptions make the intended target obvious. Minor confusion risk exists between ht_search_products vs ht_get_products (keyword vs UPC) and between ht_list_timeslots (cart pickup) and ht_oa_list_pickup_times (Order Ahead departments), but the descriptions disambiguate these adequately.

    Naming Consistency4/5

    The dominant pattern is ht_verb_noun with consistent subdomain prefixes (ht_oa_*, ht_rx_*), giving predictable grouping and readable names. Deviations are minor: ht_healthcheck (no verb_noun, no sub-prefix) and ht_rx_session (noun-only status check rather than an action verb).

    Tool Count3/5

    39 tools is heavy for a single server, well beyond the comfortable 3-15 range, and would be hard for an agent to hold in context. It is defensible in that the surface spans four genuinely separate subdomains (shopping, Order Ahead, pharmacy, diagnostics) and each tool maps to a real capability, but there is little slack in the catalogue.

    Completeness4/5

    Coverage is broad and lifecycle-complete for most areas: cart add/update/remove/get, timeslots → checkout → orders → receipts, full shopping-list CRUD, coupon clip/unclip, Order Ahead menu and ordering, and pharmacy session/prescriptions/refill. Gaps are minor by design (final order placement and refill confirmation stay on the website) plus small omissions like no per-item quantity edit on shopping lists.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Enables Claude to browse stores, search products, manage the cart, and open checkout on Rappi Chile through natural language, automating grocery and delivery purchases.
      12
      1
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables Claude to do grocery shopping through a logged-in drive session, including product search with labels, Nutri-Score and price per kilo, weekly promotions, usual products, purchase habit analysis, Open Food Facts quality checks, and cart quantity management.
      1
      MIT