Verified conversions across 205 color spaces: CSS strings, gamut checks, .cube LUTs
Streamloop is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Manage cloud-hosted 24/7 video streams, playlists, destinations, schedules, media and workspaces.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http streamloop-mcp https://mcp.streamloop.app/mcp
# 2 — ask your agent for something these tools do
# list_streams, get_stream, start_stream and 64 more
Streamloop costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it.
claude mcp add --scope user --transport http streamloop-mcp https://mcp.streamloop.app/mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
67 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Find streams and their ids — the starting point for every other stream tool. Each row carries the name, current state, scheduled start and whether that schedule repeats, which is enough to tell a one-off from a daily loop without a second call. Filter by name substring, status (active = live or starting, scheduled = waiting for its window, inactive = neither) and creation window. Use get_stream fo
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | no | Case-insensitive substring to match the name. |
| status | string | no | active = live or starting; scheduled = waiting for its window; inactive = neither. |
| createdAfter | string | no | Only items created at or after this RFC3339 time, e.g. 2026-05-01T00:00:00Z. |
| createdBefore | string | no | Only items created at or before this RFC3339 time. |
| sort | string | no | Sort by creation time: newest (default) or oldest. |
| first | integer | no | Page size (default 20, max 100). |
| after | string | no | The nextCursor from a previous page of this same tool. |
One stream's full configuration: current state, output quality and framerate, the destinations it publishes to (each enabled or not, with its delivery state), and its scheduled window including recurrence and repeat weekdays. Use it before changing a stream. For whether it could start right now, call check_stream_readiness instead (this tool reports what is configured, not what is missing); for li
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Stream id (stream_...), from list_streams. |
Start streaming now, looping the stream's playlist (or playing its scene) until it is stopped. THIS PUTS VIDEO IN FRONT OF THE PUBLIC, so confirm with the user first unless they just asked for it. Requires a destination plus either a playable video playlist (at least one item) or an attached published scene (set_stream_scene) — check_stream_readiness reports what is missing without changing anythi
| Parameter | Type | Required | Notes |
|---|---|---|---|
| streamId | string | yes | Stream id (stream_...) to start. |
Stop a stream that is live or starting. It stops publishing and becomes inactive; nothing is deleted and it can be started again with the same configuration. Does NOT cancel a recurring schedule — a daily or weekly stream stopped here starts again at its next window, so call cancel_stream_schedule as well to keep it off.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| streamId | string | yes | Stream id (stream_...) to stop. |
Permanently delete a stream, its playlists and its schedule. Irreversible, and it cannot be undone by re-creating the stream: uploads survive but the arrangement does not. Stop the stream first if it is live. To keep a stream but take it off the air, use stop_stream (plus cancel_stream_schedule). Requires confirm=true and the streamloop:destructive scope.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Stream id (stream_...) to delete. |
| confirm | boolean | no | Set true to actually execute this irreversible action. Without it the tool returns a confirmation prompt and makes no changes. |
Use this to set up a new loop or a stream for a scene. The stream is created empty and CANNOT start until it has (1) a destination — add_stream_destination with one from list_destinations, or get_connection_hints for how to make one — plus (2) either a playable video playlist (at least one item) or an attached published scene (set_stream_scene). Creating a stream also creates its two empty playlis
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | no | Display name for the stream. |
| quality | string | no | Output quality (default: the account preference). |
| framerate | string | no | Output framerate. |
| streamDuration | integer | no | Stop after this many seconds of streaming; 0 = run until stopped. |
| storageBackend | string | no | Media storage: standard (included) or large, for big playlists, billed per GiB-month. |
| runBackupStream | boolean | no | Also publish to YouTube's backup ingest for redundancy. Doubles the streaming cost while live. |
Change a stream's settings (name, quality, framerate, duration, storage, backup ingest) and/or its YouTube broadcast settings via the youtube object. Where it publishes is add_stream_destination / set_stream_destination_enabled / remove_stream_destination; when it runs is schedule_stream. The youtube settings only apply when one of the stream's destinations is a YouTube channel connected throu
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Stream id (stream_...) to update. |
| name | string | no | Display name for the stream. |
| quality | string | no | Output quality (default: the account preference). |
| framerate | string | no | Output framerate. |
| streamDuration | integer | no | Stop after this many seconds of streaming; 0 = run until stopped. |
| storageBackend | string | no | Media storage: standard (included) or large, for big playlists, billed per GiB-month. |
| runBackupStream | boolean | no | Also publish to YouTube's backup ingest for redundancy. Doubles the streaming cost while live. |
| retryMirror | boolean | no | Re-attempt mirroring this stream's schedule onto YouTube. |
| youtube | object | no | YouTube broadcast settings (title/privacy/thumbnail/etc.). ONLY take effect when the stream's destination is a YouTube channel connected through Streamloop. They are NOT supported for custom RTMP dest |
Set the window a stream runs in, once or on a repeat, and arm it. The stream must already be startable — a destination plus either a playable video playlist or an attached published scene (check_stream_readiness) — otherwise the window arrives and the start fails. repeat=daily re-arms the window exactly 24h later; repeat=weekly re-arms +7 days, or on the weekdays given in days. Both repeats REQU
| Parameter | Type | Required | Notes |
|---|---|---|---|
| streamId | string | yes | Stream id (stream_...) to schedule. |
| scheduleStartAt | string | yes | When the stream should start. Must be an RFC3339 instant WITH an explicit UTC offset — 'Z' for UTC or ±HH:MM for a local zone (e.g. 2026-09-22T06:00:00-04:00 for 6am Eastern daylight time). A value wi |
| scheduleEndAt | string | no | When the stream should stop. Required for repeat=daily/weekly, and the window must be under 24h. Must be an RFC3339 instant WITH an explicit UTC offset — 'Z' for UTC or ±HH:MM for a local zone (e.g. 2 |
| repeat | string | no | none (default) = run once. daily = re-arm +24h. weekly = re-arm +7 days, or on days. daily/weekly need scheduleEndAt and a sub-24h window. |
| days | array | no | Only with repeat=weekly: the UTC weekdays the window starts on (distinct). Omit for the same UTC weekday as scheduleStartAt, every 7 days. |
Disarm a scheduled stream and return it to an unscheduled, inactive state, clearing any daily or weekly repeat. Use this to stop a recurring stream coming back; it has no effect on a stream that is currently live (stop_stream does that).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| streamId | string | yes | Stream id (stream_...) whose schedule to cancel. |
Answer 'would start_stream work right now?' without changing anything. Runs the same pre-flight configuration checks a start does and returns ready plus every blocking issue — typically a missing or archived destination, an empty video playlist, media too big for the stream's storage, or, for a stream playing a scene, a scene that is missing, not published or invalid. It does NOT check whether upl
| Parameter | Type | Required | Notes |
|---|---|---|---|
| streamId | string | yes | Stream id (stream_...) to check. |
How a live stream is doing ON YOUTUBE: watch URL, broadcast status, concurrent viewers, views and likes. Only meaningful while the stream is live to a YouTube channel connected through Streamloop — a custom RTMP destination reports nothing here, since those numbers live with that platform. For whether Streamloop itself considers the stream healthy, read state from get_stream.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Stream id (stream_...). |
Where a stream publishes, in the order they were added: each destination, whether it is enabled, and while the stream runs its delivery state (connecting, live, reconnecting, failed with a reason).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| streamId | string | yes | Stream id (stream_...). |
Make a stream also publish to one of the workspace's destinations (list_destinations), enabled. Up to 5 per stream and one YouTube channel at most (DESTINATION_LIMIT, YOUTUBE_DESTINATION_LIMIT, DESTINATION_DUPLICATE). A second destination needs multistream on the workspace (MULTISTREAM_NOT_ENABLED). Refused while the stream is live (STREAM_LIVE), and for a destination the stream's quality or codec
| Parameter | Type | Required | Notes |
|---|---|---|---|
| streamId | string | yes | Stream id (stream_...). |
| destinationId | string | yes | Destination id (dest_...), from list_destinations. |
Stop or resume sending to one of a stream's destinations without removing it. Disabling works while the stream is live — that output goes off the air at once — except for its last enabled destination (LAST_DESTINATION: stop_stream instead). Enabling is refused while live (STREAM_LIVE).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| streamId | string | yes | Stream id (stream_...). |
| destinationId | string | yes | Destination id (dest_...), from list_destinations. |
| enabled | boolean | yes | true: send to it; false: stop sending to it. |
Take a destination off a stream (the destination itself stays in the workspace). Refused while the stream is live (STREAM_LIVE): disable it with set_stream_destination_enabled instead.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| streamId | string | yes | Stream id (stream_...). |
| destinationId | string | yes | Destination id (dest_...), from list_destinations. |
Use this FIRST when the user names a platform they want to stream to ("put this on YouTube", "also send it to Twitch") and there is no destination for it yet. Returns, for that platform: the connection methods, the exact ingestUrl to pass to create_rtmp_destination (or null when the platform issues one per session), what each method can and cannot do afterwards, the Streamloop tools to call in o
| Parameter | Type | Required | Notes |
|---|---|---|---|
| platform | string | yes | The platform the user named. Use 'other' for anything that takes an RTMP url and key. |
Find the places this workspace can publish to — connected YouTube channels and custom RTMP endpoints — and their ids, which is what add_stream_destination needs. Check status: only an active destination can carry a stream; needs_reauth and revoked mean the YouTube connection must be re-consented (start_youtube_connection) before a stream using it will start. Filter by name substring, a sin
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | no | Case-insensitive substring to match destination names. |
| id | string | no | Look up a single destination by id (dest_...). |
| status | string | no | Filter by status: active is the only one a stream can publish to. |
| kind | string | no | Filter by kind: a connected YouTube channel, or a custom RTMP endpoint. |
| sort | string | no | Sort by creation time: newest (default) or oldest. |
| first | integer | no | Page size (default 20, max 100). |
| after | string | no | The nextCursor from a previous page of this same tool. |
Create a destination for any platform that gives out an RTMP ingest URL and stream key (Twitch, Facebook, Kick, X, TikTok, Telegram, a self-hosted server, or YouTube when its channel is not connected here). Take rtmpUrl from get_connection_hints(platform).ingestUrl rather than guessing it — a wrong host is a stream that silently never connects. The key is stored encrypted and never read back. Use
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Display name, e.g. 'Twitch — main channel'. |
| rtmpUrl | string | yes | Ingest URL. Take it from get_connection_hints(platform).ingestUrl or from the platform's own streaming settings — never invent one. |
| rtmpKey | string | yes | Stream key from the platform. Stored encrypted. |
Maintain an existing destination: rename it, replace the stream key after the platform rotated it (custom RTMP only — a connected YouTube channel has no key to set), and archive or restore it. Archiving hides a destination from the picker without deleting it; it is reversible with archived=false. A live stream keeps publishing with the key it started with, so restart the stream after rotating a ke
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Destination id (dest_...), from list_destinations. |
| name | string | no | New display name. |
| rtmpKey | string | no | Replacement stream key for a custom RTMP destination. Stored encrypted. |
| archived | boolean | no | true archives the destination (reversible); false restores it. |
Begin connecting a Google account so its YouTube channels can be streamed to with managed broadcasts (titles, privacy, thumbnails, live stats). Returns a Google consent URL — give it to the user to open in a browser; consent cannot be completed by an agent. Afterwards, list_youtube_channels shows the authorized channels and create_youtube_destination turns one into a destination. Also the fix for
| Parameter | Type | Required | Notes |
|---|---|---|---|
| returnUrl | string | no | Where Google should send the user after consent. Defaults to the Streamloop destinations page. |
The YouTube channels this workspace has Google consent for, with live channel data (title, handle, country, subscriber count, connection status). These are NOT destinations yet: pass a channel's id to create_youtube_destination to get something a stream can publish to. Use list_destinations to see which channels already have one. An empty result means no Google account is connected — start_youtu
No parameter schema on file.
Turn an already-consented YouTube channel into a destination a stream can publish to, with managed broadcasts (update_stream's youtube settings, get_stream_live_stats). Takes the channel id from list_youtube_channels — NOT the YouTube channel URL or handle. If that list is empty, the account has not consented yet: start_youtube_connection first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| channelId | string | yes | The id of a channel from list_youtube_channels. |
| name | string | no | Display name for the destination. Defaults to the channel title. |
Use this to get from a stream to something you can edit: pass streamId and you get the two playlists that stream owns — one video, one audio, created empty with it. Pass sceneId for the playlists a scene's sources play. Also the way to find a playlist id before any other playlist tool. Rows are a summary; get_playlist has the items.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| streamId | string | no | Only playlists belonging to this stream id (stream_...). |
| sceneId | string | no | Only playlists belonging to this scene (scn_...). |
| kind | string | no | Filter by kind: video or audio. |
| createdAfter | string | no | Only items created at or after this RFC3339 time, e.g. 2026-05-01T00:00:00Z. |
| createdBefore | string | no | Only items created at or before this RFC3339 time. |
| sort | string | no | Sort by creation time: newest (default) or oldest. |
| first | integer | no | Page size (default 20, max 100). |
| after | string | no | The nextCursor from a previous page of this same tool. |
An empty playlist owned by a scene, for one of its playlist sources to play (a stream's own two playlists come with the stream). Fill it with apply_playlist_operations. Each call creates another.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| sceneId | string | yes | The scene that owns it (scn_...), from list_scenes. |
| kind | string | yes | What it plays. |
| name | string | yes | What it is called. |
Use this before editing a playlist (item ids for remove and reorder come from here, and so does the version the edit tools take) and after swapping one onto a live stream (to see the swap finished). Returns the draft items in play order, what a running stream is playing right now, whether the draft differs from that, how it differs, and any custom playback order attached.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Playlist id (pl_...), from list_playlists. |
Use this for every playlist change: add media, remove items, reorder, or switch between sequential and shuffle, as one ordered batch. All-or-nothing — if any operation is invalid, nothing is written. A stream that is NOT currently live picks the change up on its next start, with nothing else to call. A stream that IS live keeps playing the arrangement it started with until swap_live_playlist repla
| Parameter | Type | Required | Notes |
|---|---|---|---|
| playlistId | string | yes | Playlist id (pl_...) to edit. |
| operations | array | yes | Operations in the order they should apply. |
| basedOnVersion | integer | no | The playlist version this edit was computed against. Rejected with CONFLICT if the playlist has changed since. |
Use this to reuse an arrangement on a second stream instead of rebuilding it: copies one playlist's contents into another playlist of the same kind. The target must be EMPTY — this never merges or overwrites. The target stream picks the contents up on its next start; if it is already live, swap_live_playlist puts them on the air.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| sourcePlaylistId | string | yes | Playlist id (pl_...) to copy from. |
| targetPlaylistId | string | yes | Playlist id (pl_...) to copy into; must be empty. |
Use this ONLY to put an edited playlist on the air while its stream is LIVE — the hot swap the product calls publishing. The stream changes over to the new arrangement without going off the air. NOT needed to set a stream up and NOT needed before a first start: starting a stream takes the playlist as it is then, so on a stream that is not live this tool just fails with NOT_LIVE. Asynchronous — new
| Parameter | Type | Required | Notes |
|---|---|---|---|
| playlistId | string | yes | Playlist id (pl_...) whose draft should go live. |
| expectedDraftVersion | integer | yes | Required: the version from get_playlist. On STALE_DRAFT, refetch and retry. |
Find saved custom playback orders (order sequencers) and their ids. Use it before creating one — an order the user already has can be assigned to another playlist instead of rewritten. Pass streamId to see only orders that can run over that stream's playlist. latestReadyVersionID null means nothing usable has been produced yet. Which order a given playlist is using is on get_playlist, not here.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | no | Case-insensitive substring to match the name. |
| streamId | string | no | Only orders that can run over this stream's playlist (stream_...). |
| sort | string | no | Sort by creation time: newest (default) or oldest. |
| first | integer | no | Page size (default 20, max 100). |
| after | string | no | The nextCursor from a previous page of this same tool. |
One saved order: its description, how many playlists use it, and its newest usable version with any validation problems. Pass playlistId as well to get the answer that actually matters before assigning — whether this order can run over THAT playlist (assignable), which items it expects but cannot find, and a dry-run of the first items it would pick, in order. Do that instead of assigning to find
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Order id (oseq_...), from list_playlist_orders. |
| playlistId | string | no | Also check this playlist (pl_...): compatibility plus a dry-run of the picks. |
Describe a playback order in plain language and have one written and validated. Pass the playlist it is for as playlistId: the order is written against that playlist's REAL items, so leaving it out produces a rule aimed at nothing. Creating does NOT apply it — assign_playlist_order does. Read status on the result: READY = usable; INVALID = written but it failed validation, and diagnostics say
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Short name for the order, e.g. 'Sunday service running order'. |
| intent | string | yes | What the order should do, in plain language — e.g. 'always start with the welcome clip, then alternate a talk and a song, and never play the same song twice in a row'. |
| playlistId | string | no | The playlist (pl_...) this order is for. Omitting it produces a rule with no items to reason about. |
| description | string | no | Longer note for the user's own reference. |
Continue the conversation about an existing order — 'never end on an instrumental', 'put the announcement second instead' — producing a new version. Use this rather than creating a second order for the same purpose. Pass the playlist currently being composed against so the rewrite sees its real items. Interpret status exactly as for create_playlist_order. A new version does NOT reach playlists a
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Order id (oseq_...) to refine. |
| message | string | yes | The change to make, in plain language. |
| playlistId | string | no | The playlist (pl_...) being composed against on this turn. |
Make a playlist play in a saved order. This is the step that changes playback, and unlike a playlist edit it needs no swap_live_playlist — a running stream picks the new order up for its next items. The version in use is pinned at assign time and never advances on its own, so call this again after refine_playlist_order to adopt an improvement. Check get_playlist_order(id, playlistId) first: assign
| Parameter | Type | Required | Notes |
|---|---|---|---|
| playlistId | string | yes | Playlist (pl_...) that should play in this order. |
| orderId | string | yes | Order id (oseq_...) to apply. |
| versionId | string | no | Pin an earlier version instead of the newest usable one. |
| acknowledgeMissingRefs | array | no | Item names from a previous run's dependencyWarnings that the user has accepted as missing, so they stop being reported. Pass them back verbatim. |
Stop a playlist using a custom order; it returns to playing in its own item order (or shuffled, per the playlist's mode). The order itself is kept and can be assigned again. Like assigning, it takes effect on a running stream immediately, with no swap_live_playlist needed.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| playlistId | string | yes | Playlist (pl_...) to clear the custom order from. |
Find media and their ids (obj_...) — what apply_playlist_operations adds to a playlist. Removed media is not listed. uploaded false means the media is still arriving or processing and cannot be streamed yet. Filter by name substring, kind and creation window; use get_upload for one item's duration, resolution and import progress.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | no | Case-insensitive substring to match the name. |
| type | string | no | Filter by kind: audio, video or image. |
| createdAfter | string | no | Only items created at or after this RFC3339 time, e.g. 2026-05-01T00:00:00Z. |
| createdBefore | string | no | Only items created at or before this RFC3339 time. |
| sort | string | no | Sort by creation time: newest (default) or oldest. |
| first | integer | no | Page size (default 20, max 100). |
| after | string | no | The nextCursor from a previous page of this same tool. |
One media file in detail: duration, resolution, framerate, whether it has video and audio (probed from the file itself, not from its name), a temporary download URL, a thumbnail, and — for a URL import — how far the download has got and why it failed. Use it to confirm media is ready to stream, and to read the duration a schedule window has to fit.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Media id (obj_...), from list_uploads. |
Step 1 of uploading a LOCAL file: reserves the media record and returns uploadUrl, a presigned PUT you can use immediately. This server does not relay bytes, but YOU probably can — if the client can run a command or make an HTTP request, do the PUT itself: curl -X PUT -H 'Content-Type: <the mimeType you passed>' --data-binary @<file> '<uploadUrl>' The Content-Type header MUST equal the mimeTyp
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | File name, e.g. 'intro.mp4'. |
| type | string | yes | Media kind: audio, video or image. |
| mimeType | string | yes | MIME type, e.g. video/mp4. |
| fileSize | integer | no | File size in bytes (recommended). |
| duration | integer | no | Duration in seconds (video/audio). |
| width | integer | no | Pixel width (video/image). |
| height | integer | no | Pixel height (video/image). |
Step 2 of uploading a local file: call it once the bytes have been PUT to the url create_upload returned — by you, or by the user — which starts processing. Until this is called the media is unusable, and calling it before the PUT finishes leaves a broken record. Nothing to call for a url import: import_upload_from_url completes on its own.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | The media id (obj_...) create_upload returned. |
Look at any media url and report what could be imported from it: each asset with its quality options, sizes and duration. REQUIRED BEFORE import_upload_from_url, which takes the opaque asset and quality ids only this tool hands out — they cannot be constructed. Works for a media page AND for a direct file link, which is what makes it the right tool for a FILE THE USER ATTACHED in this conversation
| Parameter | Type | Required | Notes |
|---|---|---|---|
| url | string | yes | Public media URL to inspect. |
Import chosen assets from a media url — a page, a direct file link, or a file the user attached in this conversation — straight into the workspace, with no local file and no PUT. Each selection must echo an assetId and qualityId from discover_external_media for the SAME url; invented ids are rejected. One selection produces one media item, so the same asset can be imported twice with different ran
| Parameter | Type | Required | Notes |
|---|---|---|---|
| url | string | yes | The SAME url passed to discover_external_media. |
| selections | array | yes | One entry per media item to create. |
Permanently remove a media file from the library: its stored bytes and every file derived from it are deleted. Irreversible. An upload that never finished (no complete_upload after the PUT, an import that failed) is dropped too: nothing was stored. Refused, with nothing changed, while a playlist or a recent stream still uses it (IN_USE) — remove it from those playlists first with apply_playlist_op
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Media id (obj_...) to remove. |
| confirm | boolean | no | Set true to actually execute this irreversible action. Without it the tool returns a confirmation prompt and makes no changes. |
Use this to answer 'can this keep streaming, and for how long' — and whenever a stream fails to start or stops with no configuration problem, since check_stream_readiness deliberately does not look at credits. One call returns the credit balance, credits left, whether the account is in good standing, how fast credits are being spent right now, which streams are live and what they are costing, and
No parameter schema on file.
Use this for questions about the past — 'how many hours did I stream last month', 'is my spend going up' — not about the present. Returns minutes streamed, credits spent and session counts bucketed over a period and split by output quality. get_billing_overview has the current balance and burn rate instead.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| period | string | yes | Bucket size: DAY, WEEK, MONTH, QUARTER or YEAR. |
| startDate | string | no | RFC3339 start of the window. Defaults to a recent span. |
| endDate | string | no | RFC3339 end of the window. Defaults to now. |
Who this token belongs to: the signed-in account's id, email, name, language and the default run-length new streams inherit. Use it to confirm which account an agent is acting for. It says nothing about which workspace is in use (get_selected_workspace) or about credits (get_billing_overview).
No parameter schema on file.
Every workspace this account belongs to, with the account's role in each and which one is currently in use. Streams, media, playlists, destinations and credits all belong to ONE workspace and are never shared between them, so when a user says something exists and it is not in a list, check here before concluding it is missing — the answer is usually that another workspace is selected. Pass an id
No parameter schema on file.
Switch which workspace this connection works in, for every later tool call on this connection (other connections, even ones sharing the same login, are unaffected). Takes an id from list_workspaces; membership is checked here and again by the API on every request, so this grants no access by itself. Use it when a stream, upload or destination the user describes is not in this workspace. Override
| Parameter | Type | Required | Notes |
|---|---|---|---|
| workspaceId | string | yes | A workspace id (wksp_...) from list_workspaces. The organization id is also accepted. |
Which workspace this connection is working in right now, and where that came from: explicit (a select_workspace call), header or env (the client pinned it in its own configuration), or token-hint (the default the login carries). Call it when a result is unexpectedly empty, to confirm you are looking in the right workspace before telling the user something does not exist.
No parameter schema on file.
Read the scene's draft (or a published version, with version): a resource (with its revision and children, the sub-paths to read next), a type such as element/Text or source/data (its props), a mask ending in /* (a list), or "" (the types). as: "image" on a frame or layer → a picture of it. (In a scene's draft; scene: its id.)
| Parameter | Type | Required | Notes |
|---|---|---|---|
| scene | string | yes | The scene (scn_…), from list_scenes or create_scene. |
| as | string | no | image: a picture of a frame (the whole of it, at most 1280 px wide) or of one layer (at full design size, to look closely; origin: where its top-left is in the frame), with what drew and the issues: t |
| at | number | no | Picture: ms since the frame went on air (default: entrances settled) |
| data | string | no | Picture: bindings read live values (the default: tables as last read) or sample data (each table's own rows). Either way state.* is the state the show starts with — what onStart sets, else each field' |
| limit | integer | no | Rows per page (…/rows): default 20, at most 200 |
| offset | integer | no | First row (…/rows) |
| overlay | string | no | Picture: grid = 10 % grid with design-pixel labels; ids = each layer's outline and id |
| path | string | yes | type[/kind]/id[/…], a type, a mask ending in /*, or "" for the types |
| version | no | Read a saved published version instead of the draft: its number, or "published" for the latest one — published even when no stream is running. What a running stream shows: get_scene_state |
Fetch a URL once, changing nothing in the show: HTTP status, content type, an outline of the JSON (keys, their values, array lengths) or the page's title and text, and the rows a table would get from it with connector, pick and headers. Use it before creating a URL table, and to find the pick path or selector. (In a scene's draft; scene: its id.)
| Parameter | Type | Required | Notes |
|---|---|---|---|
| scene | string | yes | The scene (scn_…), from list_scenes or create_scene. |
| connector | string | no | How to read it as rows (default: from the content type) |
| headers | object | no | Request headers, e.g. { Authorization: "Bearer <key>" } — a key the user gave, never a guessed one |
| pick | string | no | json: a path into the document, e.g. chart.result[0].meta — an array there is the rows, an object one row; html: a CSS selector, each match a row |
| sheet | string | no | xlsx, sheets: which tab |
| url | string | yes | — |
Delete whole resources (frames, layers, sources, components). All or nothing: anything in use by something not removed in the same call is refused, with what uses it. (In a scene's draft; scene: its id.) Removing a resource needs its revision in revisions (path → the revision you read; "*": whatever is there, on purpose); without it the answer is REVISION_REQUIRED.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| scene | string | yes | The scene (scn_…), from list_scenes or create_scene. |
| paths | array | yes | — |
| revisions | object | no | path → the revision you read it at (or its frame's; "*": whatever is there); nothing is removed if one changed since (CONFLICT). Over the MCP every path needs one (REVISION_REQUIRED) |
Create, replace or change one resource; get <type> shows what each takes, with an example. value is the whole resource, as get answers it: a frame { code: "<JSX>" } or, as JSON, { name, root }; a component { description, props, tsx }; a source or table its fields. edits change part of it: [{ old, new }] replaces text in its code (copy old from what get answers: code is stored formatted), or an obj
| Parameter | Type | Required | Notes |
|---|---|---|---|
| scene | string | yes | The scene (scn_…), from list_scenes or create_scene. |
| edits | no | Part of the resource: text replacements in its code (a frame's code, a component's tsx, a script), or an object merged into its fields (a JSON merge patch; null removes a field) | |
| path | string | yes | What to write, e.g. frame/intro, source/data/headlines, component/LowerThird |
| revision | no | The revision get or the last set answered (of this path, or of the frame a layer is in): the set is refused (CONFLICT, with currentRevision) if it changed since. Send it whenever the path exists — "*" | |
| value | object | no | The whole resource: a field left out is cleared (to change part of it, send edits) |
Lists the workspace's scenes, newest first: id, name, the version last published (0: never) and when. Read one's draft with scene_get (path "" lists what it holds).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| first | integer | no | Page size (default 20, max 100). |
| after | string | no | The nextCursor from a previous page of this same tool. |
Creates a scene with an empty draft, nothing published. Build it with scene_set (frame/<id> for each frame, source/… for what it reads), then publish_scene. Each call creates another scene.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | What the scene is called |
Publishes the draft exactly as it was at draftRevision (required) as the scene's next version: what streams playing it play from then on. All of it is checked first; a refusal (SCENE_INVALID) lists each problem — fix them with scene_set and publish again. Edits made after draftRevision are not published (the answer says so, stale: true). If someone published after the version your draft is based o
| Parameter | Type | Required | Notes |
|---|---|---|---|
| scene | string | yes | The scene (scn_…), from list_scenes or create_scene. |
| draftRevision | string | yes | The draftRevision of the answer you reviewed (every scene_get and scene_set answer has one) |
| confirm | boolean | no | true: you accept what a CONFIRM_REQUIRED refusal named — a stream has this scene on air and viewers see the change at once. Send it only after telling the user. |
| overwritePublished | integer | no | You accept what a STALE_PUBLISH refusal named: its publishedVersion, which this publish replaces |
| dryRun | boolean | no | Only check, and say what would change |
Puts the draft back to the published version: every change made since it was published is lost (nothing on air changes). draftRevision (required) is the draft you reviewed: if it changed after that, nothing is discarded (CONFLICT). dryRun: true lists what would be lost and discards nothing — show the user that first. Refused (NOT_PUBLISHED) when nothing is published.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| scene | string | yes | The scene (scn_…), from list_scenes or create_scene. |
| draftRevision | string | yes | The draftRevision of the answer you reviewed (every scene_get and scene_set answer has one) |
| dryRun | boolean | no | Only say what would be lost |
Lists a scene's published versions, newest first: number, when, by whom. Read one with scene_get and version.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| scene | string | yes | The scene (scn_…), from list_scenes or create_scene. |
| first | integer | no | Page size (default 20, max 100). |
| after | string | no | The nextCursor from a previous page of this same tool. |
Publishes an earlier version's document as the next version (the versions in between stay; the draft is untouched — publishing the draft later is refused with STALE_PUBLISH until you send overwritePublished, and discard_scene_draft makes the draft this version too). expectedVersion (required) is the latest published version you saw (list_scene_versions, list_scenes): if someone published since, no
| Parameter | Type | Required | Notes |
|---|---|---|---|
| scene | string | yes | The scene (scn_…), from list_scenes or create_scene. |
| version | integer | yes | The version to publish again |
| expectedVersion | integer | yes | The latest published version you saw (0: none) |
| confirm | boolean | no | true: you accept what a CONFIRM_REQUIRED refusal named — a stream has this scene on air and viewers see the change at once. Send it only after telling the user. |
Deletes the scene, its draft and every published version, for good. Refused (SCENE_IN_USE) while a stream plays it. Its ingest keys are revoked and its cameras removed.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| scene | string | yes | The scene (scn_…), from list_scenes or create_scene. |
| confirm | boolean | no | Set true to actually execute this irreversible action. Without it the tool returns a confirmation prompt and makes no changes. |
Makes a stream play a scene (its published version) instead of a video playlist, or with scene null stops doing so. Refused (STREAM_LIVE) while the stream runs: stop it, set the scene, start it again. The scene must be published first (publish_scene).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| streamId | string | yes | A stream's id, from list_streams. |
| scene | yes | The scene (scn_…); null: none |
Answers each stream that plays it: the stream's state and, under onAir while it runs, the frame/<id> on air (frame) and the one cued next, the controls' values, each source's status and what its playlists play.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| scene | string | yes | The scene (scn_…), from list_scenes or create_scene. |
Acts on the scene on air, as its operator would: goFrame (take frame/<target> to air, with a transition), next (cue frame/<target> so the take is instant; no target clears the cue), setControl (set one of its controls; scene_get control/* lists them), setData (replace a table's rows), skip (a playlist source to its next item). Viewers see it at once. The arguments are checked first, then against w
| Parameter | Type | Required | Notes |
|---|---|---|---|
| scene | string | yes | The scene (scn_…), from list_scenes or create_scene. |
| streamId | string | no | Which stream (stream_…), when more than one plays it |
| op | string | yes | What to do |
| target | string | no | goFrame, next: which frame, by the id in its path frame/<id> |
| transition | no | goFrame: how it cuts — a kind, or { kind, ms } (default: the frame's own) | |
| actionId | string | no | Your id for this one action (a new uuid each time): a retry with the same actionId applies it at most once |
| controlId | string | no | setControl: the control's id (as in control/<id>) |
| value | no | setControl: the value (a toggle true or false, a text a string, a number a number, a select one of its options; none for a button) | |
| sourceId | string | no | setData: the table's id (as in source/data/<id>); skip: the playlist source's id (default: the scene's first) |
| rows | array | no | setData: the table's rows |
Makes the key an encoder (OBS, vMix, a phone app) sends a live feed with, for one of the scene's rtmp or srt sources: RTMP, RTMPS and SRT URLs with the key, shown in this answer only — give them to the user. Make the source first (scene_set source/rtmp/<id>). The source's status is waiting until an encoder connects with this key, and live while it publishes. The key's own id (ingkey_…) is what rev
| Parameter | Type | Required | Notes |
|---|---|---|---|
| scene | string | yes | The scene (scn_…), from list_scenes or create_scene. |
| sourceId | string | yes | The source's id (as in source/rtmp/<id>) |
Renames the scene (what the dashboard and list_scenes call it).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| scene | string | yes | The scene (scn_…), from list_scenes or create_scene. |
| name | string | yes | — |
Lists a scene's ingest keys (id ingkey_…, which source, live or not, never the key itself), its secrets (names only) and its IP cameras: what create_scene_ingest_key and set_scene_secret made.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| scene | string | yes | The scene (scn_…), from list_scenes or create_scene. |
Revokes an ingest key: the encoder using it is cut off at once. A new key for the same source: create_scene_ingest_key.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| scene | string | yes | The scene (scn_…), from list_scenes or create_scene. |
| keyId | string | yes | The key's id (ingkey_…), from list_scene_inputs |
| confirm | boolean | no | Set true to actually execute this irreversible action. Without it the tool returns a confirmation prompt and makes no changes. |
Deletes a saved secret: a table that names it ("$secret:<name>") stops getting it.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| scene | string | yes | The scene (scn_…), from list_scenes or create_scene. |
| name | string | yes | — |
| confirm | boolean | no | Set true to actually execute this irreversible action. Without it the tool returns a confirmation prompt and makes no changes. |
Saves an API key or token a table sends (sealed; never shown again). A table names it as "$secret:<name>" in a header value or a URL's query. Only a key the user gave you.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| scene | string | yes | The scene (scn_…), from list_scenes or create_scene. |
| name | string | yes | Its name, e.g. weatherKey |
| value | string | yes | The key itself |
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Streamloop or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
This listing is an address its publisher runs, and you connect to it directly — this marketplace is not in the path. The scanner reads packages and public source, and an address is neither. So there is no grade — not a withheld one, an unmeasured one.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 1.0.0.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Streamloop can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.