harristeeter-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., "@harristeeter-mcp search for milk and add the cheapest one 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.
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.
Install the ContextMint Bridge extension and sign in at https://www.harristeeter.com.
Add the server (below) and call
ht_healthcheck.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:
a
ziporlocationIdyou pass for that one search;the store you saved with
ht_set_store("use my Park Road store");HARRISTEETER_LOCATION_ID;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;
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 |
| Search at your pickup store: UPC, name, brand, size, price, sale price, unit price, stock |
| Look up UPCs |
| Harris Teeter stores near a ZIP, with the 8-digit location id (needs Kroger API credentials) |
| Cart with names, prices, estimated subtotal |
| Add items by UPC (adds to existing quantity) |
| Set quantity / substitution preference (0 removes) |
| Remove items |
| Your pickup store, and the store search prices against |
| Choose the search store by ZIP, name or location id (or clear it) |
| Open pickup windows and fees for the cart |
| Confirmation-gated. Reserve a window and create the checkout, returning totals and the place-order link |
| The current checkout draft |
| Past purchases and receipts (each with a |
| One purchase in full: items, price paid, savings, totals |
| Orders placed but not yet picked up |
| e-VIC digital coupons |
| Your personalised My Specials |
| This week's ad, by department or text |
| Fuel points balance and expiry |
| Recipes, with store products matched to ingredients |
| Shopping lists (delete is confirmation-gated) |
| Add or remove list items by UPC |
| Order Ahead menus and pickup times |
| Confirmation-gated. Place an Order Ahead order, paid at pickup. Not yet verified against a live order. |
| Pharmacy: session status, prescriptions, refills remaining, due dates |
| Confirmation-gated. Request a refill, paid at the pharmacy. Not yet verified against a live refill. |
| 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 | |
|
| fetchproxy concentrator port, shared by the whole fleet. Change only if you know why. |
| unset | Optional Kroger developer app: search and prices without the browser |
| unset | 8-digit store id for bridge-free search (below a saved |
|
| Where the saved and remembered store are kept |
| unset |
|
|
| IANA zone sent with pickup-time requests |
|
|
|
| on |
|
| 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 toolsht_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_couponAIdempotent
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_listADestructive
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_storesARead-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_cartARead-only
Show the Harris Teeter cart — each item with quantity, name, size and price, plus an estimated subtotal.
Inputs: view.
ht_get_checkoutARead-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_pointsBRead-only
Show your Harris Teeter fuel points: current balance, earned and redeemed this period, and points expiring next.
Inputs: view.
ht_get_productsBRead-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_receiptARead-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_recipeARead-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_listBRead-only
Read one Harris Teeter shopping list with its items.
Inputs: listId (required), view.
ht_get_storeARead-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_adARead-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-endARead-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_couponsARead-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_ordersARead-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_listsARead-only
List your Harris Teeter shopping lists — name, item count and listId.
Inputs: no named parameters.
ht_list_specialsARead-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_timeslotsARead-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_ordersARead-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_itemARead-only
Read one Order Ahead item in full — description, price, and any options (bread, toppings, sizes).
Inputs: productId (required), view.
ht_oa_list_departmentsARead-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_pickup_timesBRead-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_orderADestructive
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_cartAIdempotent
Remove items from the Harris Teeter cart by UPC. Re-add with ht_add_to_cart.
Inputs: upcs (required).
ht_remove_from_shopping_listAIdempotent
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_listCIdempotent
Rename a Harris Teeter shopping list.
Inputs: name (required), listId (required).
ht_rx_list_prescriptionsARead-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_refillADestructive
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_sessionARead-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_productsARead-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_recipesARead-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_storeAIdempotent
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_couponAIdempotent
Remove a clipped e-VIC digital coupon from your card. Re-add with ht_clip_coupon.
Inputs: couponId (required).
ht_update_cart_itemAIdempotent
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
Scored across 39 tools
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.
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).
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.
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
Related MCP Connectors
Search live store shelves, verify delivery windows, and run instant AI agent checkouts.
Connect Meta Muse and Claude agents to live local retail store shelves and direct checkout.
Live product discovery for AI shopping agents, with shopper-approved retailer handoff.
AI shopping gateway for product search, inventory, carts, and merchant-hosted checkout.
Related MCP Servers
- FlicenseAqualityCmaintenanceEnables Claude to search products, build a shopping cart on Selver.ee, and open it in the browser for checkout.423-
- AlicenseAqualityDmaintenanceEnables Claude to browse stores, search products, manage the cart, and open checkout on Rappi Chile through natural language, automating grocery and delivery purchases.121MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to browse product catalogs, search products with filters, and initiate checkouts, generating order summaries and checkout URLs.-
- AlicenseNot gradedqualityCmaintenanceEnables 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.1MIT