Nobody wants to invoke an image inspection skill, an audio transcription skill, and a video sampling skill. They want to give an agent a video and ask what happened.
That request hides a format problem. Most coding agents cannot inspect an arbitrary local video as one immediately legible object. They primarily reason over text and images, so the video has to become both: frames for the visual lane and a timestamped transcript for the audio lane.
That is where skills became interesting to me.
It took me a while to understand what an agent skill was. I had already built MCP servers. I had written CLAUDE.md and AGENTS.md files. Skills looked like one more Markdown file carrying instructions into a model.
They overlap, but they own different parts of the system.
An MCP tool gives the agent a verb: search Slack, download a file, open a URL. AGENTS.md describes what is true while working in a project: use Bun, never overwrite the source, run the checks. A skill describes how a particular job is done.
Its procedure loads when the task needs it. More importantly, that procedure can call another skill.
One skill, three positions
I have been building a catalog of agent skills. One of them is read-video.
The user can invoke it directly:
user
└── read-video
├── read-image
└── transcribe-audio
read-video is already a composite. It probes one exact local video, extracts bounded frames, extracts its audio streams, delegates each frame to read-image, and delegates each audio stream to transcribe-audio.
It then combines the two evidence lanes without hiding their gaps. A sampled frame is not the entire visual track. A partial transcript is not complete audio coverage.
That boundary also creates room for better selection. This figure uses a real ten-second clip to show a proposed two-pass read: frames and timed speech nominate moments, the objective selects four, and only those reach read-image.
The video, extracted frames, and audio envelope are measured from the source clip. Transcript wording follows its script pending a verified transcription pass.
From the user's perspective, read-video is one complete capability. From inside the catalog, it is a composition of two smaller ones.
The same skill can then become one node inside something larger.
From a URL to a summary
The newest skill in the catalog summarizes a public YouTube video:
summarize-youtube
├── download-youtube-video
└── read-video
├── read-image
└── transcribe-audio
Its complete procedure is three steps:
1. Invoke `$download-youtube-video`. Stop unless it returns `retrieved`.
2. Pass its exact path and SHA-256 to `$read-video`.
3. Summarize only the evidence `$read-video` returns. Do not invoke its child skills directly.
Each layer owns one part of the outcome.
download-youtube-video owns acquisition. It validates one public URL, refuses cookies and access-control bypasses, writes one local artifact, and reports its path and hash.
read-video owns inspection. It knows how to turn that exact artifact into bounded visual and spoken evidence.
summarize-youtube owns the user-facing result. It turns the returned evidence into a concise summary and key points. It does not know how frames were selected or which transcription capability was available.
A composite skill is still one callable capability. It can be the outcome at one level and a building block at the next.
The same capability inside Slack
Now imagine a skill that reviews a Slack thread. It uses Slack MCP to retrieve the messages and authorized attachments. When an attachment is a video, it passes the exact local artifact and the thread's objective to read-video.
review-slack-thread
├── Slack MCP
└── read-video
├── read-image
└── transcribe-audio
The user might ask:
What did the team decide, and does the attached screen recording show the reported bug?
Slack MCP provides access to the conversation and attachment. The Slack skill understands the question in the context of that thread. read-video handles the attachment.
It transcribes the audio, extracts bounded frames, inspects every selected frame, and correlates visual and spoken evidence. When the objective points to a specific moment, the caller can request a targeted timestamp. Otherwise, sampling remains deterministic and bounded.
The Slack skill does not need its own video procedure. It also does not need to know that read-video calls two other skills. It consumes the result immediately below it.
This is how MCP and skills complement each other. MCP exposes the system. A skill defines the procedure around it. Another skill can reuse the result without inheriting every implementation detail.
The pattern is not specific to media. In the same catalog, the codebase skills compose repository creation, merge settings, CI, code review, and branch protection. Each capability works on its own. Together they become one repeatable developer-experience recipe.
That is how I now think about skills: find the best tool or approach for each part of a job, give each one a clear boundary, then combine them into a procedure the agent can follow.