{
  "markdown": "# broll\n\n**The content studio MCP for coding agents.** broll gives Claude Code, Codex, and any MCP client real hands for content work: generate media with *your own* API keys, render videos and carousels deterministically with code, and publish through a draft-first outbox.\n\nThe model plans. Code renders. Nothing posts without confirmation.\n\n## Why\n\nEvery developer running a coding agent hits the same wall: the agent can write the marketing plan, but it can't *make* the carousel, cut the video, or post it. Existing tools are credit-metered schedulers built for social media managers. broll is built for developers:\n\n- **BYO keys, no markup.** Image/video generation uses your `OPENAI_API_KEY` / `GEMINI_API_KEY` directly. broll never proxies your inference or resells credits. A built-in mock provider keeps every workflow runnable before you add any keys.\n- **Deterministic rendering.** Videos and slides are compiled from declarative plans into exact ffmpeg/sharp invocations. Same plan + same inputs = same output. When AI output drifts, the fix is code — so layout, fonts, captions, and branding live in code.\n- **Draft-first publishing.** Posts are reviewable JSON files in an outbox. `publish_post` requires `confirm: true`, validates per-platform rules (char limits, media counts, file sizes) before anything leaves the machine, and reports per-platform results. The `export` platform always works: it writes a ready-to-post bundle.\n\n## Install\n\nRequires Node 20+ and ffmpeg (`brew install ffmpeg`).\n\n```bash\ncd broll\nnpm install && npm run build\n```\n\nRegister with Claude Code (or use the checked-in `.mcp.json` when working inside this repo):\n\n```bash\nclaude mcp add broll -- node /path/to/broll/dist/index.js\n```\n\nOptional environment:\n\n| Variable | Purpose |\n| --- | --- |\n| `OPENAI_API_KEY` | gpt-image-1 image generation |\n| `GEMINI_API_KEY` | Imagen images + Veo video generation |\n| `BLUESKY_IDENTIFIER` / `BLUESKY_APP_PASSWORD` | live Bluesky posting (use an app password) |\n| `MASTODON_ACCESS_TOKEN` (+ optional `MASTODON_INSTANCE`) | live Mastodon posting — no app review, any instance |\n| `X_API_KEY` / `X_API_SECRET` / `X_ACCESS_TOKEN` / `X_ACCESS_TOKEN_SECRET` | live X posting (free API tier works) |\n| `BROLL_HOME` | workspace location (default `~/.broll`) |\n| `BROLL_FFMPEG` / `BROLL_FFPROBE` | explicit binary paths |\n\nBrand kit: drop a `broll.config.json` next to where the server runs (see this repo's for an example) — name, handle, colors, font, logo. Every render picks it up automatically.\n\n## Tools\n\n| Tool | What it does |\n| --- | --- |\n| `broll_status` | Workspace, ffmpeg, provider + platform readiness. Call first. |\n| `generate_image` / `generate_video` | BYO-key generation → workspace assets (mock fallback when keyless) |\n| `import_asset` / `list_assets` / `probe_asset` | Bring in and inspect media |\n| `render_video` | Declarative RenderPlan → mp4: clips (video/image/color), trims, cover/contain fits, burned-in titles + timed captions, music bed, 9:16 / 1:1 / 4:5 / 16:9 |\n| `render_carousel` | Branded slide sets (the Instagram/LinkedIn format): kicker, headline, body, accent bar, page numbers, watermark — layout is 100% code |\n| `extract_frame` | Pull a PNG frame so the agent can visually QA its own render |\n| `create_post_draft` | Text + media + platforms → validated, reviewable draft in the outbox |\n| `list_drafts` / `publish_post` | Inspect the outbox; publish with explicit `confirm: true` |\n\n## Try it\n\n```bash\nnpm run smoke\n```\n\ndrives the real server through a real MCP client: generates a background, renders a 3-slide carousel and a 9:16 teaser video with captions, extracts a QA frame, then drafts and \"publishes\" an export bundle — all into `./.broll/`.\n\n\n## broll cloud (waitlist)\n\nThe local server you're looking at stays MIT and free. **broll cloud** adds the parts a local server can't do well: the app-review-walled platforms (Instagram, LinkedIn, TikTok) through broll's own approved credentials, schedules that run while your laptop is closed, and a swipe-to-approve inbox on your phone. ~$29/mo when it ships.\n\n**[Join the waitlist → 👍 issue #1](https://github.com/luke-fairbanks/broll/issues/1)** — subscribers get the launch note; comments set the platform build order.\n\n## Safety model\n\n1. Nothing is published without a draft file on disk first.\n2. `publish_post` hard-requires `confirm: true` — agents are instructed to obtain the user's explicit go-ahead.\n3. Constraint violations block publishing; they never auto-truncate your text.\n4. Keys are read from your environment and sent only to their own vendor's API.\n\n## Status & roadmap\n\nEarly but real: 96 tests including real-ffmpeg integration renders and a full MCP round trip.\n\n- [ ] Bluesky video upload\n- [ ] X chunked video upload\n- [ ] LinkedIn adapter (needs app review)\n- [x] Mastodon adapter\n- [ ] YouTube Shorts via user OAuth\n- [ ] Ken Burns / crossfade transitions\n- [ ] Word-level caption timing from transcripts\n- [ ] `npx broll-mcp` distribution\n\n## Development\n\n```bash\nnpm test          # unit + integration (real ffmpeg)\nnpm run typecheck\nnpm run smoke     # end-to-end artifact check\n```\n\nMIT.\n",
  "bytes": 5149,
  "sha": "3e22dc0d1ec61de44a411e0c43c0aa80a2a0c8e1c8a50f3de77462f2ad868ef3",
  "repo_slug": "luke-fairbanks/broll",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_luke_fairbanks_broll_cb7dc8f7/readme"
}