Skip to main content
Glama

locate

Read-onlyIdempotent

Find where a source word or recording time plays in the current edit: map transcript indices and source timestamps to render timeline positions, accounting for cuts and cold opens.

Instructions

Where does a SOURCE word or SOURCE time play in the current render?

cut_by_time's read-only mirror, and the tool to reach for before quoting any timestamp to a human: word indices and transcript times address the original recording, so they are NOT render times and every accumulated cut moves them further apart.

Two clocks, and this reports the Edit's. timeline_start/ timeline_end are 0 = the Edit's own first frame, unchanged whether or not a head (a cold open) is configured. head_seconds rides along (0.0 with none) so a caller that needs the actual render time — this tool's own stated purpose — can add it: render time = Edit time + head_seconds.

Address it one way per call — first/last are inclusive word indices (last defaults to first), source_start/source_end are seconds into the recording (omit source_end to locate an instant), or phrase — a phrase naturally is a range, so it resolves straight to first/last with no edge to pick (after/occurrence disambiguate a phrase matching more than once).

Read present first. False means the material is not in the render, and beyond_source distinguishes "you cut it" from "the recording never went that far". A partially-cut range is normal: placements lists each surviving piece in playback order with the source coordinates saying which part of the phrase it is, covered how much survives, and contiguous whether the survivors still play back-to-back. Word mode (and phrase mode, which resolves into it) echoes the resolved words plus three either side; time mode echoes the words the interval overlaps, or its nearest neighbours if it landed in silence. Read-only: nothing is written.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
lastNoLast word index, inclusive. Defaults to `first`.
pathNoThe project directory to act on. Omit it — the usual case — when this server is bound to a project (started as `proofcut -C DIR mcp`, or inside a project; `ping` says which): it then resolves to that one bound project, a relative path resolves against it, and a path outside it is refused by name. Unbound, `path` is the whole address and omitting it refuses rather than guessing.
afterNoA forward cursor over a phrase's matches: any match at or before this word index is skipped. -1, the default, means from the start.
firstNoFirst word index, inclusive. Address it one way per call: `first`/`last`, `source_start`/`source_end`, or `phrase`.
phraseNoLocate by wording. A phrase is naturally a range, so it resolves straight to first and last with no edge to pick.
clip_idYesThe transcript, or the recording, the address belongs to.
occurrenceNoDisambiguate a phrase by count when it matches more than once, **1-based** in transcript order among the matches after `after`: 1 is the first, 2 the second. Unset, an ambiguous phrase is refused — listing every candidate's range and text — rather than guessed at.
source_endNoEnd of the source interval, in the recording's own seconds.
source_startNoSeconds into the original recording. Omit `source_end` to locate an instant.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed33 schema fields changedv0.25.0
    • addedInput schema / properties / after / description
      Added value: +"A forward cursor over a phrase's matches: any match at or before this word index is skipped. -1, the default, means from the start."
    • removedInput schema / properties / after / title
      Removed value: -"After"
    • addedInput schema / properties / clip_id / description
      Added value: +"The transcript, or the recording, the address belongs to."
    • removedInput schema / properties / clip_id / title
      Removed value: -"Clip Id"
    • removedInput schema / properties / first / anyOf
      Removed value: -[
      -  {
      -    "type": "integer"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / first / description
      Added value: +"First word index, inclusive. Address it one way per call: `first`/`last`, `source_start`/`source_end`, or `phrase`."
    • removedInput schema / properties / first / title
      Removed value: -"First"
    • addedInput schema / properties / first / type
      Added value: +[
      +  "integer",
      +  "null"
      +]
    • removedInput schema / properties / last / anyOf
      Removed value: -[
      -  {
      -    "type": "integer"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / last / description
      Added value: +"Last word index, inclusive. Defaults to `first`."
    • removedInput schema / properties / last / title
      Removed value: -"Last"
    • addedInput schema / properties / last / type
      Added value: +[
      +  "integer",
      +  "null"
      +]
    • removedInput schema / properties / occurrence / anyOf
      Removed value: -[
      -  {
      -    "type": "integer"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / occurrence / description
      Added value: +"Disambiguate a phrase by count when it matches more than once, **1-based** in transcript order among the matches after `after`: 1 is the first, 2 the second. Unset, an ambiguous phrase is refused — listing every candidate's range and text — rather than guessed at."
    • removedInput schema / properties / occurrence / title
      Removed value: -"Occurrence"
    • addedInput schema / properties / occurrence / type
      Added value: +[
      +  "integer",
      +  "null"
      +]
    • removedInput schema / properties / path / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / path / description
      Added value: +"The project directory to act on. Omit it — the usual case — when this server is bound to a project (started as `proofcut -C DIR mcp`, or inside a project; `ping` says which): it then resolves to that one bound project, a relative path resolves against it, and a path outside it is refused by name. Unbound, `path` is the whole address and omitting it refuses rather than guessing."
    • removedInput schema / properties / path / title
      Removed value: -"Path"
    • addedInput schema / properties / path / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedInput schema / properties / phrase / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / phrase / description
      Added value: +"Locate by wording. A phrase is naturally a range, so it resolves straight to first and last with no edge to pick."
    • removedInput schema / properties / phrase / title
      Removed value: -"Phrase"
    • addedInput schema / properties / phrase / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedInput schema / properties / source_end / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / source_end / description
      Added value: +"End of the source interval, in the recording's own seconds."
    • removedInput schema / properties / source_end / title
      Removed value: -"Source End"
    • addedInput schema / properties / source_end / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedInput schema / properties / source_start / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / source_start / description
      Added value: +"Seconds into the original recording. Omit `source_end` to locate an instant."
    • removedInput schema / properties / source_start / title
      Removed value: -"Source Start"
    • addedInput schema / properties / source_start / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedInput schema / title
      Removed value: -"locateArguments"
  2. First observedv0.24.0

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=false. The description goes well beyond these by explaining the two-clock semantics, how `present`/`beyond_source` distinguish outcomes, how partial cuts surface via `placements`/`covered`/`contiguous`, and explicitly stating 'Read-only: nothing is written.' It also explains what happens in edge cases like silence and ambiguous phrases. No contradiction with annotations.

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 description is long but every paragraph earns its place: core purpose first, then the clock explanation, addressing modes, output semantics, and the read-only note. It is dense without redundancy. A small deduction because the path parameter's behavior is only explained in the schema, not reinforced here, though that is arguably fine given 100% schema coverage.

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

Completeness5/5

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

For a 9-parameter tool with an output schema and rich annotations, the description is remarkably complete. It covers the core purpose, the clock distinction, all three addressing modes, the output fields and their meanings, edge cases (partial cuts, silence, ambiguity), and the read-only nature. An agent could confidently invoke this tool correctly on the basis of this description alone.

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 schema already documents every parameter. The description adds genuine value beyond the schema by stating the 'one way per call' constraint (first/last XOR source_start/source_end XOR phrase), the default relationship between first/last, and how phrase mode resolves to a range with after/occurrence disambiguation. It also explains that time mode returns overlapping words or nearest neighbors in silence, which the schema doesn't convey.

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?

The description states a specific verb-resource pair ('Where does a SOURCE word or SOURCE time play in the current render?') and immediately differentiates itself from its read-only mirror, cut_by_time. It also clarifies the critical two-clock distinction (Edit time vs render time) that would otherwise confuse an agent.

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?

The description gives an explicit usage directive ('the tool to reach for before quoting any timestamp to a human') and names cut_by_time as its mirror, implying the read/write split. It explains why word indices and transcript times are not render times, which tells the agent when this tool is needed. It doesn't explicitly state when NOT to use it beyond the mirror relationship, but the context is clear.

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