CaptionPipe

Give CaptionPipe a video and it gives the video back with the captions burned in.

Community: Submitted by a user or imported; check the owner before granting accessOnlineNo sign-inGlobalFreeCan modify data

What it can do

  • Create Upload: Only for a video file on the caller's side, at most 2 GB. Returns a PUT-only upload URL for one object, valid for one hour; PUT the raw bytes to it, then call caption_video with the ret
  • Caption Video: Start captioning one video. Pass exactly one source: inputUrl, a direct https link to a video file (platform pages such as YouTube or TikTok are refused), or jobId from create_upload af
  • Get Caption Job: Poll a job. While it runs, retryAfterSeconds says how long to wait before calling again. When status is completed, artifacts holds signed links to the captioned MP4, SRT, VTT, ASS and

What data it sees

Do you need an account

No: the server works without sign-in

Give CaptionPipe a video and it gives the video back with the captions burned in. One call does the whole thing: send a direct https link or upload the file, pick a caption style, and poll until it is done.

Nothing to install. There is no FFmpeg to set up, no speech model to download, no local render. The server is hosted at api.captionpipe.com and speaks MCP over streamable HTTP, or plain HTTP if you would rather call it as a REST API.

Nothing to subscribe to. Minutes are prepaid: $10 buys 250 minutes and they never expire. There is no monthly plan, nothing renews, and a failed job is not charged. New accounts get 5 free minutes.

Four tools, not a toolbox. create_upload, caption_video, get_caption_job, render_captions. An agent does not have to choose between ninety ways to call FFmpeg.

When a word comes out wrong, fix it. Every finished job returns word-level timings alongside the video. Send the corrected words back to render_captions and the video is burned again from exactly those words, free, up to three times per job within 24 hours. No speech model runs the second time, so what you send is what gets burned.

Every job returns the burned MP4 plus SRT, VTT, ASS and words.json. Three caption styles. Inputs up to 2 GB and 30 minutes. Named-term dictionary so proper nouns are spelled right the first time. Media and captions are deleted 24 hours after the job finishes.

How to connect

How to connect CaptionPipe to Claude

The server address to paste into Claude settings:

https://captionpipe.run.tools

  1. Open Claude (claude.ai or the desktop app).
  2. Go to Settings → Connectors.
  3. Click Add custom connector.
  4. Paste the server address copied below into Remote MCP server URL and click Add.
  5. In a chat, click + → Connectors and switch the new connector on.

Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.

Authorization

After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.

How to connect CaptionPipe to ChatGPT

The server address to paste into ChatGPT settings:

https://captionpipe.run.tools

  1. Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
  2. Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
  3. Open Settings → Connectors and click Create.
  4. Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
  5. Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
  6. In a new chat open + → Apps/Connectors and enable the connector.

OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.

Authorization

On first use ChatGPT opens the service's sign-in window. Sign in and approve access.

How to connect CaptionPipe to Cursor

The server address to paste into Cursor settings:

https://captionpipe.run.tools

Fastest: click Open in Cursor below and confirm the prompt.

Manually:

  1. In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
  2. Paste the JSON copied below into ~/.cursor/mcp.json (per project: .cursor/mcp.json in the repo root).
  3. Save the file. The server appears in the MCP list; authorize it there if asked.

Authorization

If the service needs sign-in, an authorize button appears next to the server in the MCP list.

Server tool list (4)

Raw names from tools/list. Only developers need these.

create_uploadOnly for a video file on the caller's side, at most 2 GB. Returns a PUT-only upload URL for one object, valid for one hour; PUT the raw bytes to it, then call caption_video with the returned jobId. Pass contentLength if you know the file's size in bytes and the URL is bound to it; leave it out if you do not. If the video is already at a direct https URL, skip this tool entirely and pass inputUrl to caption_video. A retry is safe only when it carries the same idempotencyKey; without one, each call creates a new upload.
caption_videoStart captioning one video. Pass exactly one source: inputUrl, a direct https link to a video file (platform pages such as YouTube or TikTok are refused), or jobId from create_upload after the bytes are uploaded. Choose a preset: highlight (the spoken word takes the accent), clean (white with an outline) or boxed (a plate behind the line). Optionally send a dictionary of names to spell right and a language. Returns a jobId in status probing; poll it with get_caption_job. The balance is charged by the whole second once the duration is known, and nothing is charged if the job fails.
get_caption_jobPoll a job. While it runs, retryAfterSeconds says how long to wait before calling again. When status is completed, artifacts holds signed links to the captioned MP4, SRT, VTT, ASS and words.json, valid until expiresAt (24 hours after completion), and chargedSeconds is final. After a render_captions call, render says which version was asked for last and whether it is still rendering, done, or failed; the links always belong to the newest finished version, and preset describes the newest request. When status is failed, error says why and nothing was charged. dictionaryCapacityApplied is the dictionary capacity the speech vendor honoured (1000 on the primary vendor, 0 on the fallback), not a count of terms. Every response includes the caller's balance.
render_captionsBurn the same video again from edited words. Send the job's words.json with corrections applied, every word with its startMs and endMs in order (keep confidence if you want it in the new words.json); no speech model runs, what you send is what gets burned. Optionally change the preset or the highlight colour. Free within the job's allowance (3 on a paid account, 1 on the trial) and within 24 hours of completion. Returns the job at once with render.status accepted; poll get_caption_job until it is completed, when the artifact links switch to the new version. A retry is safe only when it carries the same idempotencyKey and the same body; without a key, each accepted call reserves a re-render from the allowance. Completion spends it; failure returns it. After 3 failed re-renders the job is paused for investigation, with rerenderFailureLimitReached true; do not automatically retry. Re-renders count toward the account's concurrent job limit while they run.