Skip to main content
Glama

find_text

Read text from the screen, image, or video frame with Windows OCR and locate matches by bounding box. Use it to find labels, buttons, or secrets and get regions to redact.

Instructions

Read text on screen or in an image/video frame with the OCR engine built into Windows (no install), with each line's and match's bounding box. Find where a label or button is, check what the screen says, or locate secrets (e.g. regex 'sk-|ghp_|api.?key') and get redact_region rectangles for them; for a video, scanEverySec checks the whole clip. Boxes are in the image's pixels; for a live target, add origin for desktop coordinates. Best-effort detection: always review.

Input Schema

NameRequiredDescriptionDefault
keepNoFor a live target: keep the captured screenshot and return its path (default false: it is deleted after reading, since it may show the secrets being looked for).
inputNoOr read text from an image or video file (one of target / input).
queryNoText to look for. Case-insensitive, and tolerant of common OCR misreads (_ vs -, I vs l, O vs 0; regexes get the _ vs - tolerance). Without a query, all recognised text is returned.
regexNoTreat query as a regular expression (case-insensitive).
redactNoAlso return padded rectangles around each match, ready to pass to redact_region (regions) to cover them. Detection is best-effort: review the result.
targetNoRead text live from the screen: 'full' | 'monitor:<index>' | 'window:<title>' (or window:exe=<app.exe> / window:hwnd=<handle>) | 'region:...'.
backendNoFor a live target: gdigrab (default) reads what is visible; 'wgc' (window: targets, FFmpeg 8+) reads the window's own surface even when other windows cover it.
maxFramesNoWith scanEverySec: most frames to read (default 30); each takes about a second.
timestampNoFor a video input: the second to read (default 0). Ignored with scanEverySec.
exactTitleNoFor window: targets, match the title exactly (default false).
returnImageNoReturn the image inline with matches outlined in red (default true when there is a query).
scanEverySecNoFor a video input: read a frame every N seconds across the whole clip instead of one frame, so text shown at any moment is found (use it to check a clip for secrets before sharing). Each match gets its time, and redactRegions get start/end. The interval widens to stay within maxFrames.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changedv0.39.0
    • addedInput schema / properties / keep
      Added value: +{
      +  "description": "For a live target: keep the captured screenshot and return its path (default false: it is deleted after reading, since it may show the secrets being looked for).",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / maxFrames
      Added value: +{
      +  "description": "With scanEverySec: most frames to read (default 30); each takes about a second.",
      +  "maximum": 120,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • changedInput schema / properties / query / description
      Previous value: -"Text to look for. Case-insensitive, and tolerant of common OCR misreads (_ vs -, I vs l, O vs 0). Without a query, all recognised text is returned."New value: +"Text to look for. Case-insensitive, and tolerant of common OCR misreads (_ vs -, I vs l, O vs 0; regexes get the _ vs - tolerance). Without a query, all recognised text is returned."
    • addedInput schema / properties / scanEverySec
      Added value: +{
      +  "description": "For a video input: read a frame every N seconds across the whole clip instead of one frame, so text shown at any moment is found (use it to check a clip for secrets before sharing). Each match gets its time, and redactRegions get start/end. The interval widens to stay within maxFrames.",
      +  "exclusiveMinimum": 0,
      +  "type": "number"
      +}
    • changedInput schema / properties / timestamp / description
      Previous value: -"For a video input: the second to read (default 0)."New value: +"For a video input: the second to read (default 0). Ignored with scanEverySec."
  2. First observedv0.32.0

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does it well: 'no install', best-effort detection with an explicit 'always review' warning, boxes reported in the source image's pixels with coordinate-frame guidance, per-frame cost ('each takes about a second'), and the backend trade-off where gdigrab reads what is visible while wgc reads a window's own surface even when occluded. The `keep` note about screenshots being deleted by default because they may show the very secrets being searched for is exactly the kind of consequence an agent needs before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded in the opening clause, and nearly every clause carries distinct information (engine provenance, use cases, redaction hand-off, coordinate frames, review caveat). The single dense paragraph with stacked semicolons and em-dashes is heavier than needed and would scan better as two or three sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter tool with no annotations and no output schema, the description covers the return shape (per-line and per-match bounding boxes), the defaults that matter, and the security-sensitive deletion behavior. The remaining gap is that zero parameters are required, so the description never says what happens when neither `target` nor `input` is supplied, and the phantom `origin` reference needs reconciliation with the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds genuinely non-schema meaning: the coordinate frame of returned boxes (image pixels vs desktop coordinates) and the fact that scanEverySec covers the whole clip rather than one moment, with the interval auto-widening. It loses a point for referencing an `origin` parameter in the parenthetical that has no counterpart in the schema, which could send an agent looking for a field that isn't there.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Read text on screen or in an image/video frame with the OCR engine built into Windows') and immediately names the concrete jobs it serves: locating a label or button, checking what the screen says, and hunting for secrets. It also distinguishes itself from the adjacent redact_region tool by declaring that it produces rectangles for it, so an agent can tell the two apart without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear situational routing: use scanEverySec 'for a video' to check a whole clip for secrets before sharing, and add `origin` for a live target to get desktop coordinates. There is no explicit when-not or named alternative among siblings such as screenshot or sample_frames, and the mention of an `origin` parameter that does not exist in the schema leaves a small inference gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.