{
  "markdown": "<p align=\"center\">\n  <a href=\"https://rendobar.com\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://cdn.rendobar.com/assets/brand/logo-mark.svg\">\n      <img alt=\"Rendobar\" src=\"https://cdn.rendobar.com/assets/brand/logo-mark-black.svg\" width=\"80\">\n    </picture>\n  </a>\n</p>\n\n<h1 align=\"center\">@rendobar/mcp</h1>\n\n<p align=\"center\">\n  <strong>Serverless media processing for AI agents.</strong><br>\n  The official Model Context Protocol server for Rendobar.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://rendobar.com/docs/mcp-server\">Docs</a> &nbsp;·&nbsp;\n  <a href=\"https://www.npmjs.com/package/@rendobar/mcp\">npm</a> &nbsp;·&nbsp;\n  <a href=\"https://glama.ai/mcp/servers/kwdj3f0u3z\">Glama</a> &nbsp;·&nbsp;\n  <a href=\"https://discord.gg/kAGqjBzx8N\">Discord</a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/@rendobar/mcp\"><img src=\"https://img.shields.io/npm/v/@rendobar/mcp?style=flat-square&color=059669&label=npm\" alt=\"npm version\"></a>\n  <a href=\"https://www.npmjs.com/package/@rendobar/mcp\"><img src=\"https://img.shields.io/npm/dm/@rendobar/mcp?style=flat-square&color=059669\" alt=\"npm downloads\"></a>\n  <img src=\"https://img.shields.io/npm/l/@rendobar/mcp?style=flat-square&color=059669\" alt=\"MIT license\">\n  <img src=\"https://img.shields.io/node/v/@rendobar/mcp?style=flat-square&color=059669\" alt=\"Node version\">\n</p>\n\n`@rendobar/mcp` is the official Model Context Protocol server for [Rendobar](https://rendobar.com), a serverless media processing API. The server runs locally over stdio and reads files straight from your disk, so an AI agent can take a file off your machine, process it on Rendobar's infrastructure, and hand back a hosted URL.\n\nRendobar covers both sides of media work.\n\n**Transform what you have.** Run any FFmpeg command against video, audio or images the way you would write it locally. Inspect a file and get a normalized summary plus the full ffprobe report. Compose video from a declarative JSON timeline. Compress to a target size or quality, where the encoder searches candidate encodes and returns the smallest file that clears the bar. Burn in subtitles from SRT, VTT or ASS, or let it transcribe when none is given.\n\n**Generate what you do not.** Create an image from a text prompt on hosted open-weight diffusion models. Edit up to four reference images from a written instruction, no masks and no coordinates. Upscale on a one-step diffusion restoration model that reconstructs detail rather than only sharpening. The same model-backed layer drives the transcription and keyword highlighting behind animated captions, so this is not an image-only capability.\n\nThe job list grows over time, so this README names families rather than types. `list_job_types` reads the current set live from the registry on every call.\n\nPublished to npm as `@rendobar/mcp` and to the [official MCP Registry](https://registry.modelcontextprotocol.io) as `com.rendobar/mcp`.\n\n## Without it\n\n> **You:** Mute the first 3 seconds of `intro.mp4`.\n\nThe agent tells you to install FFmpeg. Then you go looking for how to gate a\nfilter on a timestamp, land on `volume=enable='lt(t,3)'`, and lose another few\nminutes to quote escaping in your shell. Nobody remembers that syntax, which is\nthe problem.\n\n## With it\n\n> **You:** Mute the first 3 seconds of `intro.mp4`.\n\n```jsonc\nupload_file  { \"path\": \"~/clips/intro.mp4\" }\n// → { \"downloadUrl\": \"https://cdn.rendobar.com/u/abc123/intro.mp4\", \"sizeBytes\": 4821004 }\n\nsubmit_job   { \"type\": \"ffmpeg\",\n               \"inputs\": { \"intro.mp4\": \"https://cdn.rendobar.com/u/abc123/intro.mp4\" },\n               \"params\": { \"command\": \"-i intro.mp4 -af \\\"volume=enable='lt(t,3)':volume=0\\\" -c:v copy out.mp4\" } }\n// → { \"jobId\": \"job_9f2a\", \"status\": \"waiting\" }\n\nget_job      { \"jobId\": \"job_9f2a\", \"wait\": true }\n// → complete · $0.01 · https://cdn.rendobar.com/o/job_9f2a/out.mp4\n```\n\nThe agent writes the filter. Rendobar runs it. Nothing gets installed on your\nmachine, and `-c:v copy` means the video stream is never re-encoded.\n\n## Two more things to ask for\n\n**Hit a size budget.**\n\n> **You:** Get `demo.mov` under 25 MB so I can email it.\n\n```jsonc\nupload_file  { \"path\": \"~/recordings/demo.mov\" }\n// → { \"downloadUrl\": \"https://cdn.rendobar.com/u/7c1e/demo.mov\", \"sizeBytes\": 251658240 }\n\nsubmit_job   { \"type\": \"compress.target\",\n               \"inputs\": { \"source\": \"https://cdn.rendobar.com/u/7c1e/demo.mov\" },\n               \"params\": { \"for\": \"web\", \"target\": { \"maxSize\": \"25MB\" } } }\n// → { \"jobId\": \"job_4b8d\", \"status\": \"waiting\" }\n\nget_job      { \"jobId\": \"job_4b8d\", \"wait\": true }\n// → complete · https://cdn.rendobar.com/o/job_4b8d/out.mp4 · 23.8 MB\n```\n\nYou give it the ceiling, not a bitrate. The encoder searches candidate encodes\nand returns the smallest file that still clears the quality bar, so you are not\nguessing at CRF values to land under a mail server's limit.\n\n**Generate an image.**\n\n> **You:** Make a 1920x1080 title card for a video about deep sea diving.\n\n```jsonc\nsubmit_job   { \"type\": \"image.generate\",\n               \"inputs\": {},\n               \"params\": { \"model\": \"standard\",\n                           \"prompt\": \"Title card for a deep sea diving documentary. Shafts of light through deep blue water, small diver silhouette, empty space across the upper third for a title.\",\n                           \"width\": 1920, \"height\": 1080 } }\n// → { \"jobId\": \"job_2fa7\", \"status\": \"waiting\" }\n\nget_job      { \"jobId\": \"job_2fa7\", \"wait\": true }\n// → complete · https://cdn.rendobar.com/o/job_2fa7/out.png\n```\n\n`inputs` is empty because nothing is being transformed. Ask for a tier\n(`economy`, `standard`, `premium`) and the platform picks the model, or pin an\nexact model id to reach its own controls. Requested dimensions are snapped to\nwhat the chosen model can actually render.\n\n## The rest of the surface\n\nFour more tools, and the prompts that reach them.\n\n> **You:** What can Rendobar actually do?\n\n```jsonc\nlist_job_types {}\n// → { \"jobTypes\": [ { \"type\": \"compose\", \"tag\": \"Compose\",\n//                     \"summary\": \"Render a video from a declarative JSON timeline\",\n//                     \"acceptsMedia\": [\"video\", \"image\", \"audio\"] }, ... ],\n//     \"guidance\": \"...\" }\n```\n\nRead live from the job registry on every call, which is why nothing in this\nREADME enumerates job types. A new one appears here without a release.\n\n> **You:** How much credit is left?\n\n```jsonc\nget_account {}\n// → { \"balance\": \"$4.86\", \"balanceUsd\": 4.86, \"plan\": \"free\", \"isPro\": false,\n//     \"limits\": { \"concurrentJobs\": 1, \"maxFileSize\": \"500 MB\", \"jobTimeoutMin\": 60 } }\n```\n\nWorth a call before submitting something expensive.\n\n> **You:** What did I run this morning?\n\n```jsonc\nlist_jobs { \"status\": \"complete\", \"limit\": 5 }\n// → { \"jobs\": [ { \"id\": \"job_9f2a\", \"type\": \"ffmpeg\", \"status\": \"complete\",\n//                 \"createdAt\": \"2026-08-04T09:12:00Z\", \"cost\": \"$0.01\",\n//                 \"output\": { \"url\": \"https://cdn.rendobar.com/o/job_9f2a/out.mp4\" } } ] }\n```\n\nThe compact row is enough to find a result you lost. Call `get_job` when you\nneed the full output.\n\n> **You:** Stop that one, I picked the wrong file.\n\n```jsonc\ncancel_job { \"jobId\": \"job_9f2a\" }\n// → { \"id\": \"job_9f2a\", \"status\": \"cancelled\" }\n```\n\nWorks on `waiting`, `dispatched` and `running` jobs. A running job's upstream\nexecution is stopped too, so you are not billed for work you cancelled.\n\n## Install\n\nRendobar has two MCP servers. Pick by whether the agent needs your filesystem.\n\n| | `@rendobar/mcp` (this package) | Hosted (`api.rendobar.com/mcp`) |\n|---|---|---|\n| Transport | stdio, spawned by your client | Streamable HTTP |\n| Reads local files | Yes. That is the reason it exists | No. The server has no disk |\n| Auth | API key | OAuth in the browser, or a Bearer key |\n| Best for | Claude Desktop, Cursor, Cline, Zed | claude.ai, ChatGPT, hosted gateways |\n\n**Hosted, no API key**, one command:\n\n```bash\nclaude mcp add --transport http rendobar https://api.rendobar.com/mcp\n```\n\n**Local**, for filesystem access. Get a key at [app.rendobar.com](https://app.rendobar.com) → Settings → API Keys, then:\n\n```bash\nclaude mcp add rendobar -s user --env RENDOBAR_API_KEY=rb_... -- npx -y @rendobar/mcp\n```\n\nAlready ran `rb login` with the Rendobar CLI? Drop `--env`. The server finds the credentials file.\n\n<details>\n<summary><strong>Claude Desktop, Cursor, Cline, Windsurf</strong></summary>\n\nSame block for all four. Claude Desktop: `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\\Claude\\claude_desktop_config.json` (Windows). Cursor: `~/.cursor/mcp.json` on every OS. Windsurf: `~/.codeium/windsurf/mcp_config.json` on every OS. Cline: MCP panel → Configure.\n\nOn Linux, use Cursor, Windsurf, Cline, Zed, VS Code or Continue. Claude Desktop has no Linux build, so it is the one client on this list you cannot use there. The server itself runs fine on Linux.\n\n```json\n{\n  \"mcpServers\": {\n    \"rendobar\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@rendobar/mcp\"],\n      \"env\": { \"RENDOBAR_API_KEY\": \"rb_...\" }\n    }\n  }\n}\n```\n\nRestart the client afterwards.\n</details>\n\n<details>\n<summary><strong>Zed, VS Code, Continue</strong></summary>\n\nZed uses `context_servers` instead of `mcpServers`, in `~/.config/zed/settings.json`:\n\n```json\n{\n  \"context_servers\": {\n    \"rendobar\": {\n      \"source\": \"custom\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@rendobar/mcp\"],\n      \"env\": { \"RENDOBAR_API_KEY\": \"rb_...\" }\n    }\n  }\n}\n```\n\nVS Code 1.101+, in `.vscode/mcp.json`, prompts for the key instead of storing it:\n\n```json\n{\n  \"servers\": {\n    \"rendobar\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@rendobar/mcp\"],\n      \"env\": { \"RENDOBAR_API_KEY\": \"${input:rendobarKey}\" }\n    }\n  },\n  \"inputs\": [{ \"id\": \"rendobarKey\", \"type\": \"promptString\", \"password\": true, \"description\": \"Rendobar API Key\" }]\n}\n```\n\nContinue, in `.continue/mcpServers/rendobar.yaml`:\n\n```yaml\ntype: stdio\ncommand: npx\nargs: [\"-y\", \"@rendobar/mcp\"]\nenv:\n  RENDOBAR_API_KEY: rb_...\n```\n</details>\n\nRuns on **macOS, Linux and Windows**. Every release is tested on all three in CI. There are no native dependencies, so architecture does not matter: x64 and arm64 both work. Needs Node 20.10 or later, and the server checks at startup and exits with a clear message on older versions.\n\n## Tools\n\n| Tool | Purpose |\n|---|---|\n| `upload_file` | Upload a local file. Returns a URL to use in `submit_job`. |\n| `list_job_types` | Every active job type, read live. Call this first. |\n| `submit_job` | Submit a job of any type. |\n| `get_job` | Status and result. Pass `wait: true` to long-poll for ~50s. |\n| `list_jobs` | Recent jobs. |\n| `cancel_job` | Cancel a waiting, dispatched or running job. |\n| `get_account` | Balance, plan limits, active job count. |\n\n## Job types\n\n**`ffmpeg`** is the one to reach for first. It takes a command the way you would\nwrite it locally, runs it on hosted infrastructure, and hands back a URL:\ntranscode, trim, mux, filter, concat, whatever the flags allow. Pass\n`params.compute` as `gpu` to force NVENC encoding (Pro plan), or leave it on\n`auto` and Rendobar routes CUDA commands to a GPU and everything else to CPU.\n\nBeyond that there are purpose-built types for\n[timeline composition](https://rendobar.com/docs/jobs/compose),\n[compression to a size budget](https://rendobar.com/docs/jobs/compress),\n[subtitle burn-in](https://rendobar.com/docs/jobs/captions/burn),\n[animated captions](https://rendobar.com/docs/jobs/captions/animate),\n[media inspection](https://rendobar.com/docs/jobs/ffprobe),\n[image generation](https://rendobar.com/docs/jobs/image-generate),\n[image editing](https://rendobar.com/docs/jobs/image-edit), and\n[image upscaling](https://rendobar.com/docs/jobs/image-upscale).\n\nFull reference: **[rendobar.com/docs/jobs](https://rendobar.com/docs/jobs)**. Or\ncall `list_job_types`, which reads the registry live and is always current. This\nREADME deliberately does not enumerate them, so it cannot go stale.\n\n### Chaining\n\nA `submit_job` input can point at a previous job's output, so a multi-step edit never round-trips through your disk. For `ffmpeg` inputs, pass `{ job: \"job_...\" }`. For other types, read the output URL from `get_job` and pass that.\n\n## Authentication\n\nThree sources, first match wins:\n\n1. `--api-key=<key>` flag\n2. `RENDOBAR_API_KEY` environment variable\n3. `~/.config/rendobar/credentials.json` on Unix, `%APPDATA%\\rendobar\\credentials.json` on Windows, written by `rb login` (Rendobar CLI 1.1+)\n\nInstalled as a `.mcpb` extension, the key goes in the extension's own settings field and none of the three above apply.\n\nThe server starts without a key so clients and directories can list its tools, and it makes no network call at startup. Nothing it advertises depends on the registry, so the job type list can never be baked into a build. `list_job_types` reads it live instead, and because `GET /jobs/types` is public it answers without a key at all. Every other tool returns a clear error until a key is set.\n\nIf you do not need Rendobar to read files off your machine, the hosted server at `https://api.rendobar.com/mcp` signs you in through the browser and there is no key to manage. The local server exists for disk access, and the key is the price of it.\n\n## Telemetry\n\nThe server reports anonymous usage through PostHog's MCP Analytics SDK: tool name, success, duration, and the agent's stated intent.\n\nIt never sends your parameters or responses. File URLs, job configs, and outputs are stripped before anything leaves the process. Events carry no account identity and build no person profile. It is off in CI automatically.\n\n```bash\nDO_NOT_TRACK=1        # or RENDOBAR_TELEMETRY=0\n```\n\n## Troubleshooting\n\n<details>\n<summary><strong>Common problems</strong></summary>\n\n**Cursor on macOS can't find `npx`.** Launched from the Dock, Cursor gets the GUI PATH rather than your shell PATH. Use an absolute path: `\"command\": \"/Users/you/.nvm/versions/node/v20.x/bin/npx\"`.\n\n**Windows can't find `npx`.** Use `\"command\": \"npx.cmd\"` if your client doesn't resolve it.\n\n**Tools appear but calls fail with \"No Rendobar API key configured\".** Expected with no key set. The server advertises tools so clients can list them, but calls need credentials. Set `RENDOBAR_API_KEY`, pass `--api-key`, or run `rb login`. Startup logs a `no_api_key` warning to stderr.\n\n**The server won't start.** It writes JSON lines to stderr. Check your client's output panel for entries with `level: \"error\"`.\n</details>\n\n## Privacy Policy\n\nFull policy: **[rendobar.com/privacy](https://rendobar.com/privacy/)**. What this server does specifically:\n\n**Collected.** Your API key, read from the flag, the environment, or the credentials file. Job inputs you pass to a tool, and files you point `upload_file` at, are sent to the Rendobar API to run the job you asked for. Anonymous telemetry covers the tool name, whether it succeeded, how long it took, and the agent's stated intent.\n\n**Not collected.** Tool parameters and responses. File URLs, job configs, and outputs are stripped before any telemetry leaves the process. Telemetry carries no account identity and builds no person profile. Nothing is read from your disk except the file paths you explicitly pass to `upload_file`.\n\n**Storage.** Uploaded inputs and job outputs live in Rendobar's storage and are removed on the retention schedule for your plan. Telemetry goes to PostHog. The server keeps nothing on your machine beyond the credentials file the CLI writes.\n\n**Third parties.** Rendobar (job execution and storage) and PostHog (anonymous telemetry). Opt out of telemetry entirely with `DO_NOT_TRACK=1` or `RENDOBAR_TELEMETRY=0`.\n\n**Contact.** [support@rendobar.com](mailto:support@rendobar.com), or open an issue on this repo.\n\n## Security\n\nReporting a vulnerability: see [SECURITY.md](./SECURITY.md).\n\n## Contributing\n\nSee [CONTRIBUTING.md](./CONTRIBUTING.md). For AI-assisted development, [AGENTS.md](./AGENTS.md) and [CLAUDE.md](./CLAUDE.md).\n\n## License\n\nMIT\n",
  "bytes": 16021,
  "sha": "f8359b84f8cc30ac83c1174161b1a302fc0da45fca1a8607efe593fac472f696",
  "repo_slug": "rendobar/mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_com_rendobar_mcp_350c734c/readme"
}