{"name":"io.github.luke-fairbanks/broll","slug":"luke-fairbanks-broll","title":null,"description":"Content studio MCP for coding agents: BYO keys, deterministic video rendering, draft-first posting","url":"https://mcp.market/server/luke-fairbanks-broll","rating":null,"grade":"B","score":78,"certified":false,"status":"active","category":"media","tags":["media"],"presence":{"score":25,"stars":5,"forks":0,"downloads_week":36,"last_push_at":"2026-07-12T18:42:12.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/luke-fairbanks/broll","website":null,"version":"0.1.1","remotes":[],"packages":[{"registryType":"npm","identifier":"broll-mcp","version":"0.1.1","transport":{"type":"stdio"},"environmentVariables":[{"description":"Optional: gpt-image-1 image generation","isSecret":true,"name":"OPENAI_API_KEY"},{"description":"Optional: Imagen images + Veo video","isSecret":true,"name":"GEMINI_API_KEY"},{"description":"Optional: Bluesky handle for live posting","name":"BLUESKY_IDENTIFIER"},{"description":"Optional: Bluesky app password","isSecret":true,"name":"BLUESKY_APP_PASSWORD"},{"description":"Optional: Mastodon app token for live posting","isSecret":true,"name":"MASTODON_ACCESS_TOKEN"},{"description":"Optional: X consumer key (posting requires funded API credits)","isSecret":true,"name":"X_API_KEY"},{"description":"Optional: X consumer secret","isSecret":true,"name":"X_API_SECRET"},{"description":"Optional: X access token (Read and write)","isSecret":true,"name":"X_ACCESS_TOKEN"},{"description":"Optional: X access token secret","isSecret":true,"name":"X_ACCESS_TOKEN_SECRET"}]}],"tools":[{"name":"broll_status","description":"Report workspace location, ffmpeg availability, configured generation providers, and social platform readiness. Call this first to see what is possible. Pass probe: true to live-verify social credentials (makes real authenticated API calls, posts nothing).","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_post_draft","description":"Create a reviewable post draft (text + media + target platforms). Validates against per-platform rules (char limits, media counts/sizes) and reports violations. Nothing is published — drafts are files the user can inspect; use publish_post to send.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_thread_draft","description":"Create a multi-post thread draft. On publish, posts chain as replies under the first one (Bluesky reply refs, X in_reply_to). Each post has its own text and up to 4 images, validated per platform. Nothing is published until publish_post with confirm: true.","write_action":true,"price_micros":0,"input_schema":null},{"name":"extract_frame","description":"Extract a single PNG frame from a video at a timestamp — use it to visually QA a render.","write_action":false,"price_micros":0,"input_schema":null},{"name":"generate_image","description":"Generate image(s) with the user’s own API keys (BYO-key: OpenAI or Gemini; falls back to a labelled mock when no keys are set). Returns workspace asset ids usable in render_video, render_carousel, and post drafts.","write_action":false,"price_micros":0,"input_schema":null},{"name":"generate_video","description":"Generate a short video clip with the user’s own API keys (Gemini Veo when configured; labelled mock otherwise). Expensive with real keys — only call when the user’s workflow needs generated footage.","write_action":false,"price_micros":0,"input_schema":null},{"name":"import_asset","description":"Copy a local file (image/video/audio) into the broll workspace and get an asset id for it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_assets","description":"List workspace assets (generated, imported, and rendered), optionally filtered by kind.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_drafts","description":"List post drafts in the outbox with status and publish results.","write_action":false,"price_micros":0,"input_schema":null},{"name":"probe_asset","description":"Inspect a media file: duration, dimensions, codecs, streams. Accepts an asset id or absolute path.","write_action":false,"price_micros":0,"input_schema":null},{"name":"publish_post","description":"Publish a draft to its target platforms. Requires confirm: true — never call this without the user’s explicit go-ahead in the conversation. Platforms without credentials fail independently with setup instructions; \"export\" always succeeds and writes a ready-to-post bundle.","write_action":true,"price_micros":0,"input_schema":null},{"name":"render_carousel","description":"Render branded carousel slides (the Instagram/LinkedIn format). Layout, fonts, accent bar, page numbers, and watermark are deterministic code; backgrounds can be plain color or any image asset. Returns one asset per slide.","write_action":false,"price_micros":0,"input_schema":null},{"name":"render_video","description":"Compile a declarative RenderPlan into an mp4 via ffmpeg — deterministic, brand-aware, no generation keys needed. Clips (video/image/color) are concatenated in order; overlays and captions are burned in; optional music is mixed under clip audio. Returns the rendered asset id.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_profile","description":"Update the Bluesky profile (display name, bio, avatar image) — merges with the existing profile, never clobbers other fields. Requires confirm: true because it changes the public account.","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":78,"grade":"B","scanned_at":"2026-09-26T05:12:20.397Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-26T05:12:20.450Z","components":{"code":{"score":25,"max":25,"notes":["57 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":12,"max":15,"notes":["last push 75 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"broll-mcp","version":"0.1.1","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":4,"publishedAt":"2026-07-12T07:07:57.674Z","repositoryUrl":"git+https://github.com/luke-fairbanks/broll.git","weeklyDownloads":36}],"repo":{"found":true,"owner":"luke-fairbanks","repo":"broll","archived":false,"pushedAt":"2026-07-12T18:42:12Z","stars":5,"forks":0,"openIssues":1,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/52293458?v=4","ownerCreatedAt":"2019-06-27T17:06:34Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/52293458?v=4&s=128","source":"github"},"presence":{"stars":5,"forks":0,"downloadsWeek":36,"license":"MIT","lastPushAt":"2026-07-12T18:42:12.000Z","score":25}}}},"grade_history":[],"reviews":[]}