| name | grainger-listing-check |
| description | Read price, specs and live availability for a Grainger item from the user's signed-in browser. Use when a price or a spec table is actually needed — it is the only route to either. |
| allowed-tools | Read, Bash(python3 *), mcp__claude-in-chrome__tabs_context_mcp, mcp__claude-in-chrome__tabs_create_mcp, mcp__claude-in-chrome__tabs_close_mcp, mcp__claude-in-chrome__navigate, mcp__claude-in-chrome__read_page, mcp__claude-in-chrome__get_page_text, mcp__claude-in-chrome__find |
Grainger listing check (browser tier)
Why the browser at all: Grainger's PDPs render client-side. A scripted fetch of
/product/4DA96 returns 200 and 34 KB whose state island is a 3.4 KB empty shell
— it confirms the item exists and tells you nothing else. The APIs that fill it
(/pub/api/products/{sku}, /product/v2/productPriceAsync) answer scripted
clients with a DataDome captcha. So price and specs are browser-only.
Not a workaround to be optimised away. Do not try to defeat the captcha.
Before opening a tab
Confirm the item exists and is not discontinued, from the cheap tier:
python3 scripts/grainger_fetch.py products "4DA96"
discontinued, shipPackQuantity, webParentChildCount come back here. Knowing
the item is a rollup parent with 12 children before you open the page saves a
confused reading of a variant picker.
Reading the page
tabs_context_mcp first. Create a new tab unless the user asked you to work
with one they have open.
- Navigate to
https://www.grainger.com/product/{ITEM}.
get_page_text for the body; find for specific labels.
Read and report:
- Price, and whether it is per each or per pack — with
shipPackQuantity
beside it. This is the single most common misreading of a Grainger listing.
- Availability, and the branch or ZIP it is stated for.
- Spec table — the attribute grid, which is where Grainger's real value is.
- Item number, manufacturer model number, brand.
Session-dependence, which is the trap
Grainger pricing is account-dependent: contract pricing, "Your Contract Products"
and previously-purchased flags all vary by login. A price read from a signed-out
session is not the price this account pays, and the page gives no obvious sign of
which you are looking at.
So: check the page shows a signed-in state before quoting a price, and say in
the report that the price is the signed-in account's. If the browser is signed
out, say so and stop — do not sign in on the user's behalf.
What not to do
- Do not add to cart, order, or change any account setting. This is read-only.
- Do not click through a captcha or bot-check interstitial. Report it.
- Do not fan out across many items in parallel; go serially, with pauses.
- Do not carry a price over from an earlier session or infer one from a category
page. If you did not read it now, it was not retrieved — say that.