Skip to content

DocsDevelopers

MCP server

Use loudscene from Claude, ChatGPT, Cursor and other MCP clients.

loudscene runs a remote MCP server, so AI agents can extract brands, write videos and render MP4s for you. Claude and ChatGPT connect to it as a connector: you sign in with your loudscene account and allow access, no key needed. Coding agents such as Claude Code and Cursor can use a workspace API key instead. Either way it spends credits exactly as the API does and, like the API, it is part of the Pro, Crypto Pro and Agency plans. The stdio bridge for local clients ships with the open-source CLI: github.com/budeanulucian07-max/loudscene.

Connection#

SettingValue
URLhttps://www.loudscene.com/api/mcp
TransportStreamable HTTP, stateless, JSON responses (POST only)
Sign-in (connectors)OAuth 2.1: sign in with loudscene and allow access, found automatically from the URL
API key (other clients)Authorization: Bearer ls_live_…
Rate limit120 requests every 60 s per key (shared with the API) or per connected app

Create a key in Settings → API keys; see Authentication. Apps you connect with OAuth are listed in Settings → Connected apps.

Example: a film from a chat#

Once loudscene is connected, ask in plain words. The agent picks the tools, waits for the work and hands you the MP4 links:

Prompts
Make a 20 second launch film for my token 0x1234…abcd, in 16:9 and 9:16.

Make a 9:16 video for acme.com announcing our spring sale, 30% off until Sunday.

Change the headline of that video to "Live now" and render it again.

For a token, the agent passes the contract address (or a Dexscreener, pump.fun, Torch or explorer link) as token to create_video: the film takes the token’s brand and image and its live market figures. Everything runs in your workspace, on your plan’s generations and credits.

Setup#

Claude (web, desktop and mobile)

Add loudscene once as a custom connector; it then works in claude.ai, the desktop app and the mobile apps.

  1. On Free, Pro or Max: open Customize → Connectors and click Add custom connector. On Team or Enterprise, an Owner adds it in Organization settings → Connectors → Add → Custom, then each member clicks Connect in Customize → Connectors.
  2. Name it loudscene and paste the server URL: https://www.loudscene.com/api/mcp. Leave the OAuth client ID and secret empty. If Claude asks how it should identify itself, choose Register automatically.
  3. Click Add, then Connect. A loudscene page opens: sign in, pick the workspace the connector may use (one on Pro, Crypto Pro and Agency where you are an editor, admin or owner) and click Allow access.
  4. In a chat, turn the connector on from the + menu under Connectors, and ask for a video.

ChatGPT

ChatGPT connects remote MCP servers as apps in developer mode, where your ChatGPT plan offers it.

  1. In ChatGPT, open Settings → Apps (called Apps & Connectors on some accounts), then Advanced settings, and turn on Developer mode.
  2. Back in Apps, click Create. Name it loudscene, paste https://www.loudscene.com/api/mcp as the MCP server URL and choose OAuth for authentication.
  3. ChatGPT opens a loudscene page: sign in, pick the workspace and click Allow access. ChatGPT then lists loudscene’s tools.
  4. In a chat, add loudscene from the tools menu of the composer.

Claude Code

One command registers the server with your key as a header:

Terminal
claude mcp add --transport http loudscene https://www.loudscene.com/api/mcp \
  --header "Authorization: Bearer $LOUDSCENE_API_KEY"

Without the --header part, Claude Code signs in with OAuth instead: run /mcp in Claude Code, pick loudscene and follow the browser.

Cursor

Add it to ~/.cursor/mcp.json, or .cursor/mcp.json in a project:

mcp.json
{
  "mcpServers": {
    "loudscene": {
      "url": "https://www.loudscene.com/api/mcp",
      "headers": { "Authorization": "Bearer ls_live_…" }
    }
  }
}

Claude Desktop

Claude Desktop starts local servers over stdio, so it uses the CLI's bridge. Open Settings → Developer → Edit Config and add to claude_desktop_config.json:

claude_desktop_config.json
{
  "mcpServers": {
    "loudscene": {
      "command": "npx",
      "args": ["-y", "loudscene", "mcp"],
      "env": { "LOUDSCENE_API_KEY": "ls_live_…" }
    }
  }
}

loudscene mcp reads one JSON-RPC message per line on stdin, forwards it to /api/mcp with your key and writes each answer as one line on stdout. It needs Node 20 or newer.

Other clients

Any client that can send a custom header to a remote Streamable HTTP server works with the settings above. Check the connection with curl:

curl
curl -s https://www.loudscene.com/api/mcp \
  -H "Authorization: Bearer $LOUDSCENE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Clients that follow the MCP authorization specification can sign in with OAuth instead of a key: an unauthenticated request gets a 401 whose WWW-Authenticate header points at the metadata below.

EndpointURL
Protected resource metadata (RFC 9728)https://www.loudscene.com/.well-known/oauth-protected-resource/api/mcp
Authorization server metadata (RFC 8414)https://www.loudscene.com/.well-known/oauth-authorization-server
Dynamic client registration (RFC 7591)https://www.loudscene.com/api/oauth/register
Authorizationhttps://www.loudscene.com/oauth/authorize
Tokenhttps://www.loudscene.com/api/oauth/token
Revocation (RFC 7009)https://www.loudscene.com/api/oauth/revoke

Authorization code with PKCE (S256 only), the resource parameter set to https://www.loudscene.com/api/mcp, redirect URIs on https (or http on localhost, any port). Scopes: videos (brand kits, stories, brand extraction, creating and editing videos, stills) and renders (rendering and reading renders). Access tokens last an hour; refresh tokens last 30 days and change on every use, and using an old one again disconnects the app.

Tools (12)#

A typical run: list_brand_kits (or extract_brand, then wait_for_job) → create_video with a brief (and a token for a token film) → wait_for_job → get_video → render_video with the formats you need → wait_for_render for the MP4 URLs. update_video changes text and values afterwards; create_stills previews frames before you render.

extract_brandExtract a brand from a website

Reads a public website and saves its brand (colours, fonts, logo, tone) as a new brand kit in the workspace. Starts an asynchronous job and returns it: call wait_for_job with the job id; when it succeeds, result.brand_kit_id is the new kit to pass to create_video. Usually takes 20-60 seconds. Fails if the plan's brand kit limit is reached.

  • urlrequired · The brand's website, e.g. https://example.com (https is added when missing).
  • idempotency_key · Optional. Any unique string (a UUID works). Retrying the call with the same key and the same arguments returns the first result instead of starting (and paying for) the work again.

list_brand_kitsList brand kits

Lists the workspace's brand kits (default first) with their colours and fonts. Use an id as brand_kit_id in create_video.

list_storiesList story templates

Lists the built-in stories (video templates such as product launch, feature drop, stat sequence) with their editable fields and default values. Pass a story id as story_id to create_video: with fields the video is built instantly without AI; without fields the AI writes it in that story's structure.

create_videoCreate an on-brand video or token film

Creates a video (a film) on the workspace's brand, or on a token's brand when you pass token (a contract address or token link: "make a launch film for my token 0x…"). Two modes, exactly as the API: 1) AI generation: give a brief (and optionally story_id, duration_sec). The video starts in status "generating"; the answer includes the generation job: call wait_for_job with it (typically 1-3 minutes, call again if it is still running), then get_video. 2) Instant: give story_id plus fields (values for that story's field keys, see list_stories) and a brand kit. The video is ready immediately. Brand: brand_kit_id, or url (the brand is read from that site during generation), or token (the token's website and Dexscreener image), or none of them to use the default kit. Credits: an AI generation (a brief, or a story without fields) counts against the plan's monthly generations, exactly as in the app; past that quota one credit buys 4 more generations and is taken automatically. Building a story with fields uses no AI and costs nothing. Rendering MP4s is a separate step (render_video).

  • brand_kit_id · Brand kit to use (from list_brand_kits). Omit it and url to use the workspace's default kit.
  • url · A website to take the brand from when there is no brand kit yet. Ignored when brand_kit_id is given.
  • token · For a token (crypto coin) film: its contract address (0x…, or a Solana address) or a link to it (Dexscreener, pump.fun, Torch, a block explorer). Its live market figures go into the brief and its image becomes the coin's face in the film. Alone, the brand comes from the token's website; it also works with brand_kit_id or url.
  • brief · What the video should say: the news, offer or message, in plain words. Moderated before generation.
  • story_id · A story id from list_stories. Omit it to let the AI pick the structure.
  • fields · Field values for the story, keyed by the story's field keys (see list_stories): text, number, colour (#rrggbb), toggle, image ({url}) or list values. Needs story_id and a brand kit; with fields the video is built instantly, without AI.
  • format · Main format: 16:9, 9:16, 1:1 or 4:5 (default 16:9). Every format can be rendered later with render_video.
  • duration_sec · Target length in seconds (6 to 90). Default: the story's length, or 20.
  • locale · Language of the on-screen text, e.g. en, de, pt-BR. Default en.
  • title · Title shown in the video library.
  • idempotency_key · Optional. Any unique string (a UUID works). Retrying the call with the same key and the same arguments returns the first result instead of starting (and paying for) the work again.

get_jobGet a job

Status, stage, progress (0-1) and result of an asynchronous job (brand extraction or video generation). Prefer wait_for_job, which waits server-side instead of polling.

  • job_idrequired · The job id (a UUID).

wait_for_jobWait for a job

Waits server-side (up to timeout_sec, at most 25 s) until a job succeeds, fails or is canceled, then returns it like get_job. If it is still running when the time is up, call wait_for_job again; do not poll in a tight loop.

  • job_idrequired · The job id (a UUID).
  • timeout_sec · How long to wait, in seconds (1 to 25, default 20).

get_videoGet a video

A video's status, title, scenes (id, label, duration, fields) and field values of its current version, the running generation job if any, and editor_url (the player and editor in the loudscene app, where share links are made).

  • video_idrequired · The video id (a UUID).
  • include_doc · Also return the full VideoDoc (composition code included, often 20-200 KB). Default false.

update_videoChange a video's text and values

Changes field values (headline, prices, dates, colours, images: whatever get_video lists under fields) and/or the title of a video, without AI and at no cost. Field changes are saved as a new version, which becomes the current one; the next render_video renders it (a new version is a new render charge). Read get_video first to see the field keys and their current values.

  • video_idrequired · The video id (a UUID).
  • fields · New values keyed by the video's field keys (see get_video): text, number, colour (#rrggbb), toggle, image ({url}) or list values. Only the fields you send change.
  • title · A new title for the video library.
  • note · Shown in the version history, e.g. what changed and why.

create_stillsPreview frames as PNGs

Captures still frames (PNG) of the video's current version at the given moments, to check the look before rendering. Starts an asynchronous job: call wait_for_job with its id; when it succeeds, result.stills lists { t, url } with signed PNG URLs. Free, no credits; a few seconds to a minute. The same request within ten minutes returns the same job.

  • video_idrequired · The video id (a UUID).
  • timesrequired · Moments to capture, in seconds into the video (1 to 24 of them), e.g. [1, 5, 12].
  • format · Aspect ratio of the frames: 16:9, 9:16, 1:1 or 4:5. Default: the video's main format.

render_videoRender MP4s

Renders the video's current version as MP4 in one or more formats (16:9, 9:16, 1:1, 4:5) and returns one render per format. Renders take about a minute each: call wait_for_render (or get_render) with each render id to get the download URL. An identical finished render is returned instead of rendering again.

  • video_idrequired · The video id (a UUID).
  • formatsrequired · Formats to render: any of 16:9, 9:16, 1:1, 4:5.
  • resolution · Short side in pixels: 720, 1080 (default) or 2160 (4K, Pro plan and up).
  • idempotency_key · Optional. Any unique string (a UUID works). Retrying the call with the same key and the same arguments returns the first result instead of starting (and paying for) the work again.

get_renderGet a render

A render's status and progress (0-1); once succeeded, url is a signed MP4 download URL and poster_url a still image, both valid until url_expires_at (4 hours); call again for fresh ones.

  • render_idrequired · The render id (a UUID).

wait_for_renderWait for a render

Waits server-side (up to timeout_sec, at most 25 s) until a render succeeds or fails, then returns it like get_render, with the MP4 URL when ready. If it is still running, call it again.

  • render_idrequired · The render id (a UUID).
  • timeout_sec · How long to wait, in seconds (1 to 25, default 20).

Credits and waiting#

  • create_video with a brief (or a story without fields) is an AI generation: it counts against your plan's monthly generations, and past them one credit buys more, as in the app. A story with fields is built instantly, without AI, at no cost.
  • render_video spends credits like the API: the first render of a version costs one credit per started minute and covers every format and resolution of that version. Rendering an unchanged version again costs nothing.
  • update_video and create_stills cost nothing. An update saves a new version, so the next render of it is a new render charge.
  • Pass an idempotency_key to tools that start work, so a retried call returns the first result instead of paying twice.
  • wait_for_job and wait_for_render wait on the server for up to 25 seconds per call. Call them again while work is still running instead of polling in a loop.
  • Tool failures (bad arguments, no credits, plan limits) come back as tool results with a message the model can act on. See Credits and plans.