shsunmoonlee/transcribe-so
Transcribe audio and video (YouTube, podcasts, uploads) into speaker-labelled transcripts with chapters, cited Q&A, word timings, subtitles, and hosted captioned clips, via the transcribe.so remote MCP server.
Changelog
All notable changes to the transcribe-so CLI (0.x) and to the plugin
manifests (1.x, tracking the MCP server version).
Bump the version in every plugin manifest with each release; CI checks it.
Plugin 1.8.2
Manifests only; no skill or tool changes.
Added
- The root
plugin.jsonnow declares the Agent Plugins 1.0.0 schema ($schema, author, homepage, repository, license, keywords), and a rootmcp.jsonlists the remote server asstreamable-http. Kiro Powers and the Cursor Marketplace read this format; Antigravity still validates it and loads it as a native plugin unless its Agent Plugins flag is on.
Changed
.cursor-plugin/plugin.jsondrops the non-standardnotekey from its MCP server entry.
Plugin 1.8.1
README only: a How-to videos section (Claude Code, Claude, the Claude desktop app, ChatGPT, WhatsApp) and the playlist link. No manifest, skill or tool changes.
Plugin 1.8.0
Plugin manifests and skills only; the CLI stays at 0.2.0. Tracks MCP server 1.8.0.
Changed
- All manifests move to 1.8.0 with the MCP server. Server 1.8.0 adds the clip
options from transcribe.so#1583 where the server enables them (
output: audiogram, video or audio;caption_position,words_per_line,framing,highlight_color;rights_affirmedfor video from a link, when the source video can be used; up to 180 s) and accepts public TikTok, X and Facebook video links asplatform_url. skills/transcribe-audio: the platform list names TikTok, X and Facebook.- Antigravity CLI plugin: root
plugin.json(name, version, description) andmcp_config.json(serverUrlto the hosted MCP server); install withagy plugin install <repo URL>. The CLI cannot run the OAuth sign-in, so the README adds the server with an API key header under its own name. The build's version and listing checks cover the new manifest. - Codex
longDescription(the OpenAI listing text): drops the claim that recordings "stay private"; the listing only says to sign in with an existing account. skills/get-transcript, Clips:outputand the caption options, the 180 s qualifier, andgetClip'sfile_url(mp4_urlis null for audio).- README: a "What the Claude plugin runs and sends" section for directory review; the ChatGPT section points at the developer-mode connector only.
- LICENSE: copyright holder is SUNMOON.CO PTE. LTD. (transcribe.so).
Plugin 1.7.0
Plugin manifests and skills only; the CLI stays at 0.2.0. Tracks MCP server 1.7.0.
Changed
skills/get-transcript, Clips: call the new read toolgetClipQuotefor the range first, tell the user itscharge_usdand wait for a go-ahead (unless it is within a limit the user already gave), then pass the agreed figure torenderClipasmax_charge_usd. Onmax_charge_exceedednothing is held or rendered: report the figure and ask, never raise the ceiling.- Codex
commerce_descriptionnow covers clips (getClipQuotepreview and therenderClipceiling). - README: the MCP tool count is corrected to 24 (it said 21).
idempotency_keyretry rule fortranscribeandrenderClipin both skills, aligned with the server: keep the same key by default (a retry with the same arguments replays the first result;queue_fulland server errors afterretry_after;not_readywhile an earlier call may still be running). Refusals are replayed under the key for 24 hours, so a new key is needed only after a refusal actually received that says nothing was started or drawn, once its cause is fixed; the listed codes are examples, not a closed list. If the same key is rejected because the arguments differ and the first call was never answered, it may have gone through: re-send the same key with the original arguments or check the job or clip first.- Retry bounds now match the server (transcribe.so #1541): the preview phase
ends within 45 seconds (retry once, then tell the user), and a same-key
not_readycarriesstale: trueafter 120 seconds with no result recorded.transcribe: onstale, a job with yourclient_referencein any status counts as found; with noclient_reference, tell the user instead of switching keys.renderClip: onstale, tell the user. The earlier "keep retrying for up to 5 minutes" rule is gone. - Every plugin manifest is 1.7.0; the Codex release notes name MCP server 1.7.0 and the clip preview.
scripts/check-api-coverage.ts:getClipQuoteadded to the skip list with the other clip operations (no CLI clip commands yet).
Plugin 1.6.1
Plugin manifests only (.codex-plugin, .claude-plugin, .cursor-plugin,
.grok-plugin, gemini-extension.json); the CLI stays at 0.2.0.
Changed
- Directory-safe copy in
skills/transcribe-audio,skills/get-transcriptandcommands/transcribe.md: the model-readable text describes whatgetQuotereports and that the agent waits for the user's go-ahead; it carries no money, promotion or account-tier wording and no em-dashes. The skills are based on the copy OpenAI's directory scan accepted, with factual corrections:getTranscriptinline truncation (truncated,download_url),idempotency_keyontranscribeandrenderClip,artifact_missingas anot_readyreason, and the approval rule (go ahead whenretail_usdis 0 or within a limit the user already gave, otherwise ask first). - Plugin versions now track the MCP server version (1.6.1) in every manifest instead of a separate 1.x line.
Added
.codex-plugin/plugin.json: Codex listing block (interface) and review metadata (extensions.com.openai.reviewtest cases, commerce declaration,extensions.com.openai.publication.release_notes). The demo recording URL is injected at build time, never committed.scripts/build-openai-plugin.mjs(pnpm run build:openai-plugin): builds the OpenAI directory submission ZIP intoout/and fails on listing-tier copy violations. See README, "Directories".
0.2.0
Targets transcribe.so API 1.1.0.
Added
transcript <id>: the COMPLETE transcript as a raw body, never capped (--format txt|md,--no-speaker-labels,--no-timestamps,--out FILE). A 409not_readyis acted on by itsreason: onlytranscription_processingis retried (honouringRetry-After, bounded by--wait-seconds, default0= no waiting). Every other reason exits non-zero immediately with the recovery on stderr, because retrying it can never succeed.captions <id> --for <destination>: paste-ready captions and chapter timestamps. Destinations:instagram,x,threads,linkedin,youtube,spotify,apple_podcasts,markdown,plain. Variants:standard,highlights,clips,quoted_sections,show_notes,original.--ctaappends the transcribe.so footer (off by default: the caption belongs to the user). Prints the text raw;--jsonprints the full envelope (warnings,ok_to_paste,thread[],constraints). Onartifact_missingit prints the exact recovery, and--regenerateruns that onePOST /timestamps/regeneratefor you and retries.--regenerateis not side-effect free: it regenerates and REPLACES all four cached caption/chapter variants and burns 1 of the 10 regenerations allowed per transcription. Once those are gone the API answers 429rate_limitedwith noRetry-After, which the CLI maps to exit 1 (not the transient exit 5), because only a re-transcribe resets the count.search <q> [--id <id>] [--limit N] [--offset N]: "who said X, and when" across the library, or scoped to one transcription. Hits carryspeaker,start_ms,end_msand a deep-linkurl.capabilities: one JSON object: live/meand/pipelines, the API version from the spec, every format enum this CLI accepts, and the exit-code table. No guessing flag values.--max-charge-usd <n>oncreate,runandretry: a server-side charge ceiling (max_charge_usd) enforced at the wallet hold.runsends its--max-usdas the ceiling by default;--no-server-ceilingopts out. A retry is a new paid attempt with its own hold, so the ceiling has to be sent again there.- Exit code 7 for 402
max_charge_exceeded, distinct from 4 (the account cannot pay) and from 6 (the local--max-usdrefusal). Nothing was charged and no job was started; the remedy is to report the real price, not to top up. Exit codes 0-6 are unchanged. --segments-offset/--segments-limitonresultandwait, withsegments_metasurfaced on stderr. A windowed transcript now says so instead of looking complete.- Examples:
examples/ig-caption.sh,examples/who-said-what.sh. pnpm run test: unit tests for the mapping/parsing helpers.- Multi-runtime manifests so the same repo installs outside Claude Code:
.cursor-plugin/plugin.json(Cursor plugin: both skills plus the hosted MCP server) andgemini-extension.json(Gemini CLI extension bundlinghttps://transcribe.so/mcp). The README Install section now leads with per-runtime instructions for Claude Code, Codex, Cursor, Gemini CLI, ChatGPT, and any skills.sh agent.
Changed
- stdout is JSON everywhere except the three raw-output commands:
subtitles,transcript, andcaptions(without--json). not_readyhints now name the specificreasonand its recovery instead of always suggestingwait.- API coverage gate:
transcript,search(both routes),timestampsandtimestamps/regeneratemoved from the skip list to covered.
0.1.0
Initial release: auth:status, me, pipelines, quote, create, wait,
result, run, list, get, delete, retry, upload, subtitles,
ask.