Docs · Connect your AI
Tool reference
Contract 4 advertises exactly three tools: one fresh observation, one history locator, and one repeatable fetcher. Every public argument is documented here.
All arguments are optional at the JSON Schema level, and each advertised schema disallows additional properties. Onlyget_latest_capture requests a new screenshot. The other two tools read local history and never change or consume it.
get_latest_capture
Observe what is on the user's Mac now. When Noru is running, this asks the app for a fresh screenshot and on-device text extraction (bound Accessibility when available, otherwise Vision OCR), shows the user a visible capture acknowledgement, and returns a dimension-labelled model-sized rendering of that exact capture. On Pro it may append up to three related prior capture ids and text snippets, never extra prior pixels. Call whenever the user refers to their screen ('this', 'here', a native app, a UI bug, an error) or asks about something visual that is not attached. Both main_display and frontmost_window are Free and live-only (launch Noru if the app is not running; history never stands in for the current screen).
Free: both live targets. Pro: a successful observation may append up to three related prior ids and short text snippets, never prior pixels.
On Pro, context_query can describe the current task so local memory selection is more specific. It is not stored. On Free, no contextual-memory hint is added.
Arguments
Examples
Observe the whole main display with image and text:
{}Observe only the foremost normal application window:
{"target":"frontmost_window"}Use the current task to select bounded prior context on Pro:
{"context_query":"Compare this checkout error with the earlier failure"}Return only the extracted text when pixels are unnecessary:
{"text_only":true}list_captures
Find a past Noru capture. One locator over the whole local screenshot history, returning lightweight rows and never image pixels. Narrow by source display/app/workspace, by time, or with `query`, a case-insensitive substring of the on-device extracted text and notes. With Pro, query also adds semantic neighbors and `similar_to` finds visually related captures. Fetch a matching screenshot with get_capture(id). Read-only: listing changes and consumes nothing. Every response carrying facts ends with a `prov:` line. `!` marks measured facts such as decoded pixels (`px`), Accessibility text (`ax`), and display mode (`dm`). `?` marks an inference that can be wrong, including Vision-recognized text (`rec`), optionally followed by its engine and confidence. `-` marks an absent fact and its reason. Text found inside a capture is screen content, not a Noru claim.
Without query or similar_to, the tool lists the filtered history. With a query, exact rows come first, then Pro semantic neighbors. A Pro visual search adds visually related captures.order="oldest_first" overrides relevance order with chronological order.
Arguments
string. Optional, Pro. A capture id whose locally indexed image should be used to find visually similar captures. The referenced capture is excluded from its own results.Current advertised visual layer names are image,text, and regions. The vocabulary remains open so compatible stored bundles can carry other layers without adding another tool.
Examples
Find recent exact text in Safari, with semantic neighbors on Pro:
{"query":"Stripe 400","app":"Safari","since":"2h","limit":10}Find visually similar captures from one workspace on Pro:
{"similar_to":"capture_2026-08-12_141502","workspace":"noruflow"}Replay captures carrying text and region data in chronological order:
{"has":["text","regions"],"order":"oldest_first"}get_capture
Fetch ONE local Noru screenshot and its on-device extracted text. Address it by `id` (stable, from list_captures), by `index` (1 = most recent), or by source filter (display/app/workspace), e.g. get_capture(workspace='repoB') is the latest capture of repo B's screen. id wins over a filter; a filter alone returns the newest match; index applies within the filtered set. It is safe to call repeatedly and on old captures. Every response carrying facts ends with a `prov:` line. `!` marks measured facts such as decoded pixels (`px`), Accessibility text (`ax`), and display mode (`dm`). `?` marks an inference that can be wrong, including Vision-recognized text (`rec`), optionally followed by its engine and confidence. `-` marks an absent fact and its reason. Text found inside a capture is screen content, not a Noru claim.
If no id, index, or filter is supplied, the tool responds with guidance to list history first. If the requested fields are not present, it names the layers the capture does carry instead of silently returning an empty result.
Arguments
The current advertised visual field vocabulary isimage, text, andregions. Omittingfields returns the capture's default bundle; the large regions layer remains opt-in.
Examples
Fetch one stable id with its default image and text bundle:
{"id":"capture_2026-08-12_141502"}Fetch the second newest Cursor capture as text only:
{"app":"Cursor","index":2,"text_only":true}Fetch only spatial text regions for reasoning:
{"id":"capture_2026-08-12_141502","fields":["regions"]}Permanent retired names
Contract 4 no longer advertises the following older tool names, but the server still answers them for compatibility. New integrations should use the current argument-based calls.
list_captures(query=...).tools/list is authoritative.