An AI Agent Can't Watch a Bug Recording, So It Gets the Frames

MCP

get_report on task AS-13 returns one console line, from the widget's own start-up, no network requests, and six transcript lines. The second one says "There's a cookie notice in the corner. I'll deal with it later." The third and fourth: "I click continue to payment. Nothing happens. No error, no spinner, nothing." Nothing in the text says the notice sits on the button. Now the agent asks for the frame at 0:14 and sees it covering two thirds of Continue to payment.

AS-13 comes from the same demo shop as the Whisper post, with a different bug planted. The reporter, Priya, is made up, the narration is a text-to-speech voice, and the cookie notice is mine. The report went to bugdump.com through the widget API, and Claude read it over MCP.

Why the agent doesn't get the video

MCP has no video content type, and Claude doesn't take video as input. An image, though, it reads like any other tool result.

get_report already returns a signed link to the recording, and Claude Code can download it and cut frames itself, but only where ffmpeg is installed on the user's machine. I haven't found a way for Claude on the web or ChatGPT to do the same with the link.

The first plan stored 30 frames per recording

My first plan cut frames in the background for every recording, at moments the server picked from the report: the end of each transcript line, each console error, each failed request, each click. Up to 30 frames, stored as files with the report. Four review agents read the plan and found these problems:

  • The upload helper would have charged the frames to the uploader's own storage, not to the account total the billing page shows.

  • A save that failed after the upload would leave files attached to nothing and still counted.

  • A crafted report could send a huge durationMs and keep the server generating moments.

  • A transcription job that got lost would leave a recording with no frames and no way to make them.

  • Every recording would be decoded a second time, though agents open only a few of them.

The agent picks the seconds

The tool that shipped, get_recording_frames, stores nothing. The agent passes up to six times, in seconds from the start of the video, and BugDump cuts those frames when it asks. get_report already gives the agent what it needs to choose: transcript lines in video seconds, and console, network and click times in milliseconds on the same clock as the recording's recordingStartedAt, which it turns into video seconds by subtracting that and dividing by 1,000. For AS-13 the agent asked for 0:09.5, 0:14 and 0:22.5, the ends of the lines around the two clicks.

The frame get_recording_frames returned at 0:14: the cart page, with a cookie notice covering most of the Continue to payment button

In Chrome and Firefox the widget records WebM files with no index, so a seek near the end would read everything before it. BugDump copies the video stream once into a local file that has an index, without decoding it, then takes each frame in 0.16–0.26 seconds on my MacBook. On bugdump.com, three frames of a 29-second recording came back in 0.87 seconds, download included. Each frame is a WebP at most 1,280 pixels wide, and a 1280×720 frame costs Claude about 1,230 tokens, so the tool's description tells the agent to ask only for the moments it needs.

What the agent wrote

Claude posted its reading of the frames as a comment on the task, with the demo account's MCP token:

A comment by Alex Rivera via MCP: the frames at 0:14 and 0:22.5 show the cookie notice covering Continue to payment, and nothing reaches the console or network after either click

Where it stops

  • It works on screen recordings made as video. A DOM recording is a replay of page events, with no pixels to cut.

  • The agent sees only the seconds it asks for. Something that happens between two frames needs a second call.

  • Each call downloads the recording again, up to about 112 MB for three minutes of widget video, and one person can make 20 calls a minute. Files over 200 MB are refused, and the agent can ask only for times in the first five minutes.

  • The client has to show images from a tool result. Claude Code does, and took all six frames of one call. I haven't checked Claude on the web, Cursor or ChatGPT.

Continue reading