audited Aug 28, 2026in 9s
55/ 100

9 tools registered. Strongest in usefulness, weakest in human experience.

WebMCP use61
Usefulness80
Human experience0
about:blank

No agent run recorded yet.

No steps recorded

Tools

/
search_products: fail

search_products

Search The Promo Group product catalogue by keyword. Returns up to 20 matching products with name, slug, price, and stock status. Use to find products the user wants to add to their quote list or shopping cart. Use get_product for full details (variants, branding options) of a specific result.Answers a question. Declared read only.
pagehttps://thepromogroup.co.za/
implementation
viaimperative
entry pointnavigator
registered after1335ms
executepresent
api surface
queryrequired
categoryoptional
min_priceoptional
max_priceoptional
annotations
read onlytrue
destructivenot declared
idempotentnot declared
open worldnot declared
untrusted contenttrue
titlenot declared
2 findings
failCanonical entry point
0 / 4
Every tool registers through the deprecated navigator.modelContext alias; move them to document.modelContext before the alias is removed.
fix
// Use the canonical entry point - navigator.modelContext is deprecated.
document.modelContext.provideContext({ tools: [/* ... */] });
warningHuman parity
0 / 8
9 of 9 tools run through the JavaScript API with no visible counterpart, so the person co-browsing cannot see what the agent is offered. Declarative forms (or at least a title annotation) close the gap.
search_products, get_product, find_product_by_sku, add_to_quote_list, update_quote_quantity
fix
<!-- Give the tool a visible counterpart: a declarative form is one the person can see and use too. -->
<form toolname="search_products" tooldescription="...">
  <!-- the same action, as UI -->
</form>
tool json
{
  "name": "search_products",
  "description": "Search The Promo Group product catalogue by keyword. Returns up to 20 matching products with name, slug, price, and stock status. Use to find products the user wants to add to their quote list or shopping cart. Use get_product for full details (variants, branding options) of a specific result.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "query": {
        "type": "string",
        "description": "Search keywords, e.g. \"branded coffee mug\" or \"leather notebook\"."
      },
      "category": {
        "type": "string",
        "description": "Optional category slug to narrow results, e.g. \"drinkware\", \"bags\", \"clothing\", \"tech-gadgets\", \"office-stationery\", \"headwear\", \"home-living\"."
      },
      "min_price": {
        "type": "number",
        "description": "Optional minimum unit price in ZAR.",
        "minimum": 0
      },
      "max_price": {
        "type": "number",
        "description": "Optional maximum unit price in ZAR.",
        "minimum": 0
      }
    },
    "required": [
      "query"
    ]
  },
  "annotations": {
    "readOnlyHint": true,
    "untrustedContentHint": true
  }
}
Showing search_products

Findings

WebMCP use

61 / 100 · weight 50
passTools registered
4 / 4
9 tools registered across 1 page.
failReal-browser eligible
0 / 8
The page's code registers these tools, but a real visitor's browser does not get them yet: WebMCP needs a native modelContext or a current origin trial token, and this page has neither.
warningRegistration timing
2 / 4
The slowest tool took 1335.4000000953674ms to register, past the 1000ms an agent reading the registry at first paint would wait for.
toolget_product
get_product: registered at 1335.4000000953674ms
fix
// Register tools as soon as they're ready, not behind a deferred/async chunk.
document.modelContext.provideContext({ tools: [/* ... */] });
failCanonical entry point
0 / 4
Every tool registers through the deprecated navigator.modelContext alias; move them to document.modelContext before the alias is removed.
toolsearch_products
fix
// Use the canonical entry point - navigator.modelContext is deprecated.
document.modelContext.provideContext({ tools: [/* ... */] });
passSchema validity
5 / 5
All 9 tools declare a structurally valid object input schema.
warningSchema quality
3.6 / 4
1 of 9 tool schemas are harder for an agent to use than they need to be: get_product 1 parameter description is over Chrome's 150-character guidance.
toolget_product
get_product: 1 parameter description is over Chrome's 150-character guidance
fix
{
  name: "get_product",
  inputSchema: {
    type: "object",
    properties: {
      query: { type: "string", description: "What to search for" }
    },
    required: ["query"]
  }
}
passStub detection
5 / 5
All 9 tools declare an execute handler.
warningAnnotations present
1.3 / 4
6 of 9 tools declare no readOnlyHint, so an agent cannot tell a read from a write without guessing from the name.
tooladd_to_quote_list
add_to_quote_list, update_quote_quantity, remove_from_quote_list, add_to_cart, update_cart_quantity
fix
{
  name: "add_to_quote_list",
  annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true }
}
passAnnotation mismatch
3 / 3
No tool claims to be read-only while its name says it writes (3 declared hints checked).
passUntrusted content hint
2 / 2
All 1 tool that looks like it returns third-party text declares untrustedContentHint.
passRegistration errors
2 / 2
No tool registration threw during the capture.
warningToolchange coherence
1 / 2
9 tools were registered but the page never dispatched a toolchange event, so an agent subscribed to registry updates never learns they exist.
fix
document.modelContext.dispatchEvent(new Event("toolchange"));
not applicableInjection surface
0 / 3
The injection-surface model hop returned no usable result, so tool contracts were not reviewed for injection surface.

Usefulness

80 / 100 · weight 30
passNaming quality
2 / 2
All 9 tool names are consistent, verb-led, and within Chrome's size guidance.
not applicableDescription quality
0 / 6
The description-quality model hop returned no usable result, so descriptions were not rated.
not applicableTool selection
0 / 14
The tool-selection model hop returned no usable result.
warningCoverage vs. site type
6 / 8
The tool set covers 3 of the 4 things an agent needs on a commerce site; it cannot start checkout or place an order.

Human experience

0 / 100 · weight 20
warningHuman parity
0 / 8
9 of 9 tools run through the JavaScript API with no visible counterpart, so the person co-browsing cannot see what the agent is offered. Declarative forms (or at least a title annotation) close the gap.
toolsearch_products
search_products, get_product, find_product_by_sku, add_to_quote_list, update_quote_quantity
fix
<!-- Give the tool a visible counterpart: a declarative form is one the person can see and use too. -->
<form toolname="search_products" tooldescription="...">
  <!-- the same action, as UI -->
</form>
not applicablePage experience
0 / 12
The page-experience model hop returned no usable result, so the page was not graded.

Tool selection

The tool-selection model hop returned no usable result.
how this was captured
chrome
148.0.7778.96
capture shim
v1
spec snapshot
2026-08
mode
fast
pages
1
tools
9
run time
9s
finished
Aug 28, 2026