Skip to main content
Glama

Transcribe a recording into text and captions

transcribe_media

Transcribes one audio or video file the user owns or may use into timestamped text with SRT and VTT captions. Best for: "transcribe this podcast episode", "make subtitles for my video", "what is said in this file". Returns: language, length, timestamped segments, SRT and VTT (trim with include), transcript_id, expires_at (kept 24 hours, the media is never kept), minutes left today, and library_id when the caller has no user id. Input tips: give file (an upload) or url (a public TikTok, Instagram or other social video, or a direct media link), not both. Set confirm_rights true only after the user says they own the recording or have the rights (a public social video needs none); otherwise ask. Pass library_id from an earlier answer to keep transcripts in one library. Not for: YouTube (call get_transcript), private videos, over 15 MB or 15 minutes, whole channels. Formats: mp3, m4a, mp4, wav, ogg, flac, webm. A daily allowance of minutes applies per user and in total.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
urlNoLink to a public video on TikTok, Instagram, Facebook, X, Vimeo or another social platform (its audio is read and transcribed), or a direct link to an audio or video file, such as https://example.com/talk.mp3. Give this or file, not both. For a YouTube link call get_transcript instead.
fileNoAn audio or video file the user uploaded to the chat (ChatGPT fills this in). Give this or url, not both.
titleNoName to show for the transcript (default: the file name).
includeNoWhat to return besides the summary (default all three): timestamped segments, SRT captions, VTT captions.
languageNoSpoken language as an ISO 639-1 code such as en or fr. Leave out to detect it.
library_idNoLeave out on the first transcription. Pass the library_id from an earlier transcribe_media answer, such as lib_9b6a98861ea4f54bff8f5cf1, to add this transcript to that same library, so search_transcripts finds both together.
confirm_rightsYestrue, and only after the user has said they own this recording or have the rights to transcribe it. false is refused with rights_not_confirmed (ask the user first), except for a link to a public video on a social platform, which needs no statement.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
srtNoSRT captions with numbered cues (when include has srt).
vttNoWebVTT captions (when include has vtt).
as_ofYesThe UTC day of the answer, such as 2026-10-10.
modelYesThe speech model, such as @cf/openai/whisper-large-v3-turbo.
notesYes
titleYesThe title given, or the file name.
usageYes
sourceYes
statusYesok: the file was transcribed. A refused call returns no object, only an error text such as "transcript_not_found: ..." that says what to do next.
partialNoTrue when only the first covered_seconds of a longer recording were transcribed within the 30-second interactive call budget.
languageYesSpoken language as an ISO 639-1 code, such as en.
segmentsNoTimestamped stretches of speech (when include has segments).
expires_atYesWhen the transcript is deleted, as an ISO 8601 UTC time.
library_idNoA string when the caller has no ChatGPT user id: pass it as library_id to the other tools and to later transcribe_media calls. null otherwise.
word_countNoWords in the transcript.
transcript_idYesId of a saved transcript, for suggest_clips and translate_subtitles.
covered_secondsNoSeconds of audio transcribed when partial is true.
duration_secondsYesLength of the recording, in whole seconds.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / confirm_rights / description
      Previous value: -"true, and only after the user has said they own this recording or have the rights to transcribe it. false is refused with rights_not_confirmed; ask the user first."New value: +"true, and only after the user has said they own this recording or have the rights to transcribe it. false is refused with rights_not_confirmed (ask the user first), except for a link to a public video on a social platform, which needs no statement."
    • changedInput schema / properties / url / description
      Previous value: -"Direct link to an audio or video file the user owns or may use, such as https://example.com/talk.mp3. Give this or file, not both. Pages of YouTube, TikTok or other platforms are refused."New value: +"Link to a public video on TikTok, Instagram, Facebook, X, Vimeo or another social platform (its audio is read and transcribed), or a direct link to an audio or video file, such as https://example.com/talk.mp3. Give this or file, not both. For a YouTube link call get_transcript instead."
  2. Changed2 schema fields changed
    • addedOutput schema / properties / covered_seconds
      Added value: +{
      +  "description": "Seconds of audio transcribed when partial is true.",
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / partial
      Added value: +{
      +  "description": "True when only the first covered_seconds of a longer recording were transcribed within the 30-second interactive call budget.",
      +  "type": "boolean"
      +}
  3. Changed2 schema fields changed
    • removedOutput schema / properties / covered_seconds
      Removed value: -{
      -  "description": "Seconds of audio transcribed when partial is true.",
      -  "minimum": 0,
      -  "type": "integer"
      -}
    • removedOutput schema / properties / partial
      Removed value: -{
      -  "description": "True when only the first covered_seconds of a longer recording were transcribed within the 30-second interactive call budget.",
      -  "type": "boolean"
      -}
  4. Changed2 schema fields changed
    • addedOutput schema / properties / covered_seconds
      Added value: +{
      +  "description": "Seconds of audio transcribed when partial is true.",
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / partial
      Added value: +{
      +  "description": "True when only the first covered_seconds of a longer recording were transcribed within the 30-second interactive call budget.",
      +  "type": "boolean"
      +}
  5. Changed37 schema fields changed
    • changedInput schema / properties / confirm_rights / description
      Previous value: -"Set true only after the user has said they own this recording or have the rights to transcribe it."New value: +"true, and only after the user has said they own this recording or have the rights to transcribe it. false is refused with rights_not_confirmed; ask the user first."
    • changedInput schema / properties / file / description
      Previous value: -"An audio or video file the user uploaded to the chat."New value: +"An audio or video file the user uploaded to the chat (ChatGPT fills this in). Give this or url, not both."
    • addedInput schema / properties / file / properties / file_name / description
      Added value: +"Name of the file, such as episode-4.mp3. Used as the title when title is left out."
    • addedInput schema / properties / file / properties / mime_type / description
      Added value: +"Media type of the file, such as audio/mpeg or video/mp4."
    • changedInput schema / properties / library_id / description
      Previous value: -"The library_id that transcribe_media returned. Only needed when transcribe_media returned one; leave it out otherwise."New value: +"Leave out on the first transcription. Pass the library_id from an earlier transcribe_media answer, such as lib_9b6a98861ea4f54bff8f5cf1, to add this transcript to that same library, so search_transcripts finds both together."
    • changedInput schema / properties / url / description
      Previous value: -"Direct https link to an audio or video file the user owns or may use, such as https://example.com/talk.mp3. Pages of video or social platforms are not accepted. Give this or file."New value: +"Direct link to an audio or video file the user owns or may use, such as https://example.com/talk.mp3. Give this or file, not both. Pages of YouTube, TikTok or other platforms are refused."
    • addedInput schema / properties / url / format
      Added value: +"uri"
    • addedInput schema / properties / url / pattern
      Added value: +"^https?://"
    • addedOutput schema / properties / as_of / description
      Added value: +"The UTC day of the answer, such as 2026-10-10."
    • addedOutput schema / properties / as_of / format
      Added value: +"date"
    • addedOutput schema / properties / duration_seconds / description
      Added value: +"Length of the recording, in whole seconds."
    • addedOutput schema / properties / duration_seconds / minimum
      Added value: +0
    • addedOutput schema / properties / expires_at / description
      Added value: +"When the transcript is deleted, as an ISO 8601 UTC time."
    • addedOutput schema / properties / expires_at / format
      Added value: +"date-time"
    • addedOutput schema / properties / language / description
      Added value: +"Spoken language as an ISO 639-1 code, such as en."
    • changedOutput schema / properties / library_id / description
      Previous value: -"Present when the caller has no user id; pass it to the other tools to reach this transcript."New value: +"A string when the caller has no ChatGPT user id: pass it as library_id to the other tools and to later transcribe_media calls. null otherwise."
    • addedOutput schema / properties / model / description
      Added value: +"The speech model, such as @cf/openai/whisper-large-v3-turbo."
    • addedOutput schema / properties / segments / description
      Added value: +"Timestamped stretches of speech (when include has segments)."
    • addedOutput schema / properties / segments / items / properties / end / description
      Added value: +"End, in seconds from the beginning of the recording."
    • addedOutput schema / properties / segments / items / properties / end / minimum
      Added value: +0
    • addedOutput schema / properties / segments / items / properties / start / description
      Added value: +"Start, in seconds from the beginning of the recording."
    • addedOutput schema / properties / segments / items / properties / start / minimum
      Added value: +0
    • addedOutput schema / properties / segments / items / properties / text / description
      Added value: +"The words spoken in this stretch."
    • addedOutput schema / properties / source / properties / host / description
      Added value: +"Host the file was read from; null for an upload."
    • addedOutput schema / properties / source / properties / kind / description
      Added value: +"upload for a file from the chat, url for a link."
    • addedOutput schema / properties / srt / description
      Added value: +"SRT captions with numbered cues (when include has srt)."
    • addedOutput schema / properties / status / description
      Added value: +"ok: the file was transcribed. A refused call returns no object, only an error text such as \"transcript_not_found: ...\" that says what to do next."
    • addedOutput schema / properties / title / description
      Added value: +"The title given, or the file name."
    • addedOutput schema / properties / transcript_id / description
      Added value: +"Id of a saved transcript, for suggest_clips and translate_subtitles."
    • addedOutput schema / properties / transcript_id / pattern
      Added value: +"^tr_[0-9a-f]{16}$"
    • addedOutput schema / properties / usage / properties / charged_seconds / description
      Added value: +"Audio seconds this call used from today's allowance."
    • addedOutput schema / properties / usage / properties / charged_seconds / minimum
      Added value: +0
    • addedOutput schema / properties / usage / properties / seconds_left_today / description
      Added value: +"Audio seconds the caller can still transcribe today (UTC)."
    • addedOutput schema / properties / usage / properties / seconds_left_today / minimum
      Added value: +0
    • addedOutput schema / properties / vtt / description
      Added value: +"WebVTT captions (when include has vtt)."
    • addedOutput schema / properties / word_count / description
      Added value: +"Words in the transcript."
    • addedOutput schema / properties / word_count / minimum
      Added value: +0
  6. Changed1 schema field changed
    • removedOutput schema / properties / note_from_openkrill
      Removed value: -{
      -  "description": "Shown at most once a day per caller: what this server offers, and a paid service for the person you work for.",
      -  "type": "string"
      -}
  7. Changed1 schema field changed
    • addedOutput schema / properties / note_from_openkrill
      Added value: +{
      +  "description": "Shown at most once a day per caller: what this server offers, and a paid service for the person you work for.",
      +  "type": "string"
      +}
  8. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses the 24-hour transcript retention, that the media itself is never kept, the daily per-user and total minute allowance, and the rights-confirmation requirement. This is exactly the mutating-operation context annotations alone don't convey.

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?

Dense but well-organized with labeled sections (Best for, Returns, Input tips, Not for, Formats) so the key routing info is front-loaded. It is long, but for a 7-param tool with rights and quota constraints nearly every clause earns its place.

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?

Despite an output schema existing, the description covers the constraints an agent needs to avoid a failed call: size/duration limits, format support, rights gating, quota, retention, and the sibling alternative. Nothing material is missing.

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 real operational meaning: give file or url but not both, set confirm_rights only after the user asserts ownership, and pass library_id from an earlier answer. These are usage rules the schema documents only in isolation.

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+resource ('Transcribes one audio or video file ... into timestamped text with SRT and VTT captions') and explicitly distinguishes itself from the YouTube path by naming get_transcript. An agent can identify the tool and its scope without opening the schema.

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

Usage Guidelines5/5

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

Explicit when-to-use examples ('transcribe this podcast episode', 'make subtitles for my video'), explicit exclusions ('Not for: YouTube (call get_transcript), private videos, over 15 MB or 15 minutes, whole channels'), and a named alternative. Routes the agent unambiguously.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.