Skip to main content
reticle_query is not advertised. The default surface is the merged ten, so an agent does not see this name. Call reticle_look { action: "find" } instead. Everything below describes what that call does; only the spelling changed. A call to the old name is answered with the new one, but an allowedTools allowlist or an MCP permission rule naming it refuses before Reticle is asked.
reticle_look { action: "find" } answers “where is the thing I mean?” without dumping the whole page into your context window. It queries the way a testing library does: by role, label, text or testid. Your agent then binds to meaning, not to DOM structure that a refactor will move.

Example

Real response from a running app, with four of the six elements trimmed out for length:
Seven buttons matched and six came back, because limit is 6. Each one has a ref to act on and a source file to open, for 236 tokens.

Arguments

role, text, label, placeholder, testid and alt also have a predicate spelling, so { "role": "button" } works as shorthand for { "by": "role", "value": "button" }.

Use count_only when you only need a number

“Are there still three rows?” does not require three row descriptors:
Three tokens. Note that total is not emitted on this path, because count already is the total.

A zero-match result tells you what is there

The testid existed, on another route. hint.route says where you actually are, presentTestids says what is on this page instead, and presentRegions distinguishes an empty list from a missing one. All of it without paying for a snapshot.

Reading the response

ref is the handle for every other call: reticle_act, reticle_look { action: "element" }, reticle_look { action: "state" }. It stays valid until the element leaves the DOM, so you do not need to re-snapshot between actions on the same element. source appears when the app is built in development with the Reticle build plugin. Production builds omit it. Both sidebar buttons above report Sidebar.tsx:41. That is the line where the component renders its nav buttons in a loop, which is the line you want to edit. truncated: true with total: 7 means limit cut the list, not that Reticle ran out of room. Neither field is emitted when nothing was cut, so their absence is itself the signal that you are looking at every match. states distinguishes present from visible from enabled. An element can be all three and still be covered by a modal. reticle_look { action: "element" } reports occluded for that.
Query by testid when you can. Role and text queries survive refactors well; testids survive redesigns, translations, and the day someone rewrites your button labels for the marketing team.
Last modified on October 25, 2026