Repository navigation
v0.3.0: chore: add prepare script so git-hosted installs build dist-js
Driven by transcript mining of real agent sessions: 80% of all tool calls
were execute_js, and most of those were hand-rolled variants of four
patterns. These are now first-class tools.
Added
read_texttool — structured text scraping: per-element
{tag, text, visible, attrs?}for a CSS selector, whitespace-collapsed,
hard-capped output with atruncatedflag, optionalscope_selector.
ReplacesquerySelectorAll(...).map(el => el.textContent)execute_js snippets.inspect_elementtool — bounding rect, computed styles (default
layout/color set or explicitstyle_props), classList and attributes for
visual/layout QA. ReplacesgetComputedStyle/getBoundingClientRectsnippets.dispatch_pointertool — synthetic pointer/mouse gesture chains
(click,dblclick,down,up,hover,drag) dispatched on the
exact matched element with no interactive-ancestor retargeting. Supports
element-relativeoffset(canvas hit-testing), absolute or relative drag
destinations, interpolated drag moves double-dispatched on the element and
document(d3-drag compatible; synthetic events bypasssetPointerCapture),
buttons and modifier keys.app_bridgetool +window.__MCP_BRIDGE__registry — host apps
register named (optionally async) helpers via
__MCP_BRIDGE__.register(name, fn, description); agents discover them with
action='list'and invoke withaction='call'. Results are serialized and
truncated atmax_chars. The sanctioned path for store snapshots and
app-level actions instead of execute_js against app internals.click/query_page(find_element)sharpening — new optional
scope_selector,match(exact|contains), andnthparameters for
disambiguating repeated text/selectors within a container.
Changed
find_elementtext matching collects all candidates, prefers innermost
matches hoisted to their nearest interactive matching ancestor, and ranks
interactive > semantic > shortest text — it no longer returns a huge
container div whosetextContenthappens to include the target string.