Documentation
README
Analyzing narrated recordings with talkthrough
The talkthrough MCP server turns a local video/audio file into queryable structured data: timestamped transcript segments, scene keyframes, OCR'd on-screen text, and wall-clock anchoring. No LLM inside โ you bring the reasoning; it brings the evidence. Everything is lazy and token-budgeted: never ask for more than the moment you are analyzing.
Prerequisite
The talkthrough MCP server must be connected (tools like
process_media / get_transcript are visible). If not, tell the user to
install it: claude mcp add -s user talkthrough -- uvx talkthrough-mcp
(see the repository README for other clients).
Core workflow
- Ingest once:
process_media(path)โ idempotent by content hash; re-calls on the same file return instantly. Long videos take minutes and stream progress. The summary gives youjob_id, counts, wall-clock, and a transcript preview โ do NOT dump anything else eagerly. Multi-person recording (meeting/interview)? Adddiarize=trueโ even when the ask is just "summarize", speaker structure is part of meeting analysis โ and โ whenever the headcount is known โnum_speakers=N(the main accuracy lever): segments getS1/S2/โฆ labels and the summary a talk-time roster. On an already-processed job this amends in seconds without re-transcribing. - Orient:
get_transcript(job_id)(paginate vianext_start_mswhentruncated) orsearch(job_id, "<distinctive word>")to jump straight to the relevant moments (searches speech AND on-screen OCR text). - Evidence per remark:
get_moment(job_id, t0-2000, t1+2000)โ one call returns the transcript slice + up to 3 unique frames + their OCR text + the wall-clock range. This is the workhorse; describeobservedfrom the returned pixels, never from imagination. - Precision when needed:
get_frames(at_ms=...)for nearby keyframes;extract_frame(job_id, at_ms, crop={x,y,w,h})for an exact instant at native resolution (keyframes capture scene changes + a 1 fps floor, so sub-second moments can fall between them). - Recall across sessions:
list_jobs()โ the store persists; a file processed yesterday (even via CLI) is queryable byjob_idtoday.
Timestamps
Every timestamped result carries t_ms (video-relative) and, when the
recording start is known, t_wall (ISO 8601 real time). Use t_wall to
correlate remarks with server/app logs (ยฑ30 s grep window). If
wall_clock is null or low-confidence, ask the user when the recording
started and re-anchor: process_media(path, recorded_at="<ISO 8601>", force=true).
Packaged workflows (server prompts)
Prefer the server prompts when the task matches โ they encode the full
method: triage-recording (screencast โ findings JSON per the contract in
examples/output-contract.schema.json), spec-from-workshop,
backlog-from-demo, meeting-actions (audio-only friendly),
correlate-with-logs.
Rules of thumb
- Audio-only jobs (.m4a/.mp3/โฆ): transcript tools work; frame tools error by design โ that error is expected, not a failure.
- Speaker labels are anonymous (
S1/S2, ordered by first voice). Mapping them to names is YOUR job: self-introductions, vocatives, the attendees list. State the mapping explicitly and mark unmapped labels "unidentified".diarize=trueneeds the[diarization]extra โ its absence produces an actionable install-hint error. - Findings/quotes must cite the narrator's exact words +
t_ms(+t_wallwhen known) + the frame files you actually inspected. - Low STT/vision confidence โ surface a question; never silently guess.
- Any narration language works (Whisper auto-detects; the summary reports
language+language_probability). Garbled transcript or low/wrong detection โ re-callprocess_media(path, model="large-v3-turbo", force=true)(best multilingual quality) or pinlanguage="โฆ"; domain jargon โ passvocabulary="Term1, Term2". - Write digests/summaries for the recording author in the narrator's language; keep quotes verbatim in the original โ translate in your own prose only, never inside a quote.