Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Streamloop

REMOTE · MCP.STREAMLOOP.APP

Manage cloud-hosted 24/7 video streams, playlists, destinations, schedules, media and workspaces.

+3 this week 89 Trust /100

Last scanned (25 minutes ago)

Scores higher than 97% of remote servers

Reachable. Last reached 5 Nov 2026.

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security91
  • The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
  • Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
  • HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
  • HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
  • DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
  • The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability100
Schema Quality & AI Usability67
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 13908 tokens (~207/item across 67 items; 67 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management90
  • Stability observed for 27 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 8 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 68 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 5 Nov 26 0
    • This server's schema is too large to store in full, so we cannot compare its tools day to day functional
  • 4 Nov 26 +1
    • This server's schema is too large to store in full, so we cannot compare its tools day to day functional
  • 3 Nov 26 0
    • This server's schema is too large to store in full, so we cannot compare its tools day to day functional
  • 2 Nov 26 +1
    • This server's schema is too large to store in full, so we cannot compare its tools day to day functional
  • 1 Nov 26 0
    • This server's schema is too large to store in full, so we cannot compare its tools day to day functional
  • 31 Oct 26 +1
    • This server's schema is too large to store in full, so we cannot compare its tools day to day functional
  • 30 Oct 26 0
    • This server's schema is too large to store in full, so we cannot compare its tools day to day functional
  • 29 Oct 26 +1
    • This server's schema is too large to store in full, so we cannot compare its tools day to day functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Probed https://mcp.streamloop.app/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=streamloop.app CN=WE1,O=Google Trust Services,C=US 28 Sept 2026 27 Dec 2026 ECDSA 256 ECDSA-SHA256 e877338baf3445140e80a7104fe54b13
SANs: streamloop.app, *.streamloop.app
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC secure

Validation of mcp.streamloop.app. — Secure

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
app. present 23684 8 Verified
streamloop.app. present 2371 13 Verified
mcp.streamloop.app. Verified address RRset verified with the apex keys
Authentication Enforced and verified

The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.

Result Enforced and verified
Enforced On tool calls
HTTP status 200

WWW-Authenticate challenge Bearer realm="streamloop-mcp", resource_metadata="https://mcp.streamloop.app/.well-known/oauth-protected-resource"

Bearer realm="streamloop-mcp", resource_metadata="https://mcp.streamloop.app/.well-known/oauth-protected-resource"

Protected resource metadata

Document https://mcp.streamloop.app/.well-known/oauth-protected-resource
Retrieved Yes
Resource https://mcp.streamloop.app/mcp
Authorisation server https://auth.streamloop.app

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://mcp.streamloop.app/mcp Verified 200
http (plaintext) http://mcp.streamloop.app/mcp HTTPS enforced 301 https://mcp.streamloop.app/mcp
MCP tools · 67 exposed · ~13,624 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
revoke_scene_ingest_key ~126

Revokes an ingest key for good: the encoder using it is cut off at once. It cannot be restored; a new key for the same source: create_scene_ingest_key. Answers revoked (the key's id).

NameTypeReqDescription
confirmboolean–Set true to actually execute this irreversible action. Without it the tool returns a confirmation prompt and makes no changes.
keyIdstringyesThe key's id (ingkey_…), from list_scene_inputs
scenestringyesThe scene (scn_…), from list_scenes or create_scene.

Structured output declared, but exposes no named fields.

No examples provided.

scene_get ~552

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.) Answers summary and value (the resource, with its revision and children), or image for as "image"; plus draftRevision (version, for a published version).

NameTypeReqDescription
asstring–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:…
atnumber–Picture: ms since the frame went on air (default: entrances settled)
datastring–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…
limitinteger–Reading a table's rows (source/data/<id>/rows): how many to return; 20 when omitted
offsetinteger–Reading a table's rows (source/data/<id>/rows): the 0-based index of the first one; 0 when omitted
overlaystring–Picture: a guide drawn over it to check placement — grid: lines every 10 % labelled in design pixels; ids: each layer's outline and id. Omitted: none
pathstringyestype[/kind]/id[/…], a type, a mask ending in /*, or "" for the types
scenestringyesThe scene (scn_…), from list_scenes or create_scene.
version––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

Structured output declared, but exposes no named fields.

No examples provided.

scene_probe ~378

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 — or, with connector mcp, an MCP server's tools, or one tool's rows with tool and args. Use it before creating a URL or MCP table, and to find the pick path or selector. (In a scene's draft; scene: its id.)

NameTypeReqDescription
argsobject–mcp, with tool: the arguments to call that tool with, shaped as its input schema (a probe without tool lists each tool's schema). Omitted: none
connectorstring–How to read it as rows (default: from the content type); mcp: the URL is an MCP server
headersobject–Request headers, e.g. { Authorization: "Bearer <key>" } — a key the user gave, never a guessed one
pickstring–json, mcp: a path into the document or the tool's result, e.g. chart.result[0].meta — an array there is the rows, an object one row; html: a CSS selector, each match a row
scenestringyesThe scene (scn_…), from list_scenes or create_scene.
sheetstring–xlsx, sheets: which tab
toolstring–mcp: the tool to call; without it, the server's tools are listed
urlstringyesThe http(s) address to read: a JSON API, a CSV or spreadsheet file, a Google Sheet, a web page, or with connector mcp an MCP server's endpoint

Structured output declared, but exposes no named fields.

No examples provided.

scene_remove ~238

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. It changes the draft only: viewers see nothing until publish_scene, and discard_scene_draft brings back what was published. Answers summary, removed (the paths) and draftRevision.

NameTypeReqDescription
pathsarrayyesThe resources to delete, by path as get answers them: frame/intro, frame/intro/title (one layer), source/data/headlines, component/LowerThird
revisionsobject–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)
scenestringyesThe scene (scn_…), from list_scenes or create_scene.

Structured output declared, but exposes no named fields.

No examples provided.

scene_set ~453

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 object is merged into its fields. One layer changes alone at its own path: frame/<id>/<layer> with edits { props: { … } }. Every set is checked as the studio checks it; a refused set changes nothing: read the error, fix, send again. The answer has the path it is stored at, its new revision, what changed, and draftRevision (the draft as it is now: what publish takes). (In a scene's draft; scene: its id.) Changing a resource that exists needs its `revision`, from the answer that read it ("*" overwrites whatever is there, on purpose); without it the answer is REVISION_REQUIRED. A new path needs none.

NameTypeReqDescription
edits––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)
pathstringyesWhat to write, e.g. frame/intro, source/data/headlines, component/LowerThird
revision––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 — "*…
scenestringyesThe scene (scn_…), from list_scenes or create_scene.
valueobject–The whole resource: a field left out is cleared (to change part of it, send edits)

Structured output declared, but exposes no named fields.

No examples provided.

schedule_stream ~477

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 REQUIRE scheduleEndAt and a window shorter than 24h; a one-off (repeat=none, the default) may be open-ended. `days` are UTC weekdays of the start instant, so a 9pm Monday Eastern window repeats on TUESDAY — the result echoes the committed window in UTC with its UTC weekday so this is visible. Replaces any existing window; cancel_stream_schedule disarms it. Returns the stream (id, name, state, scheduleStartAt, scheduleEndAt, scheduleRepeat, scheduleRepeatDays) and committedWindow: the window in UTC, its UTC start weekday, and the times exactly as you sent them.

NameTypeReqDescription
daysarray–Only with repeat=weekly: the UTC weekdays the window starts on (distinct). Omit for the same UTC weekday as scheduleStartAt, every 7 days.
repeatstring–How the window recurs: once when omitted, every 24h, or every 7 days (or on `days`). A repeat needs scheduleEndAt.
scheduleEndAtstring–When the stream should stop. Needed for a daily or weekly repeat, less than 24h after the start; omit for a one-off that runs until stopped. An instant in the user's own time zone, with that zone's o…
scheduleStartAtstringyesWhen the stream should start. An instant in the user's own time zone, with that zone's offset: 6am US Eastern daylight time is 2026-09-22T06:00:00-04:00. The user's clock numbers are not UTC.
streamIdstringyesStream id (stream_...) to schedule.

Structured output declared, but exposes no named fields.

No examples provided.

select_workspace ~161

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. Overrides a workspace the client pinned in its own configuration (the X-Workspace-Id header, or MCP_WORKSPACE_ID on stdio) for the rest of this connection. Call it again at any time to switch back.

NameTypeReqDescription
workspaceIdstringyesA workspace `id` (wksp_...) from list_workspaces. The organization id is also accepted.

Structured output declared, but exposes no named fields.

No examples provided.

set_scene_secret ~147

Saves an API key or token a scene's tables send (sealed; never shown again). A table names it as "$secret:<name>" in a header value or a URL's query. A name that exists already has its value replaced, and tables using it send the new one. Only a key the user gave you. Answers name and updatedAt.

NameTypeReqDescription
namestringyesThe name tables refer to it by, as "$secret:<name>", e.g. weatherKey
scenestringyesThe scene (scn_…), from list_scenes or create_scene.
valuestringyesThe API key or token itself, exactly as the user gave it

Structured output declared, but exposes no named fields.

No examples provided.

set_stream_destination_enabled ~147

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). Returns the stream's whole destination list after the change, as list_stream_destinations does.

NameTypeReqDescription
destinationIdstringyesDestination id (dest_...), from list_destinations or list_stream_destinations.
enabledbooleanyestrue: send to it; false: stop sending to it.
streamIdstringyesStream id (stream_...), from list_streams.

Structured output declared, but exposes no named fields.

No examples provided.

set_stream_scene ~100

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).

NameTypeReqDescription
scene–yesThe scene (scn_…); null: none
streamIdstringyesA stream's id, from list_streams.

Structured output declared, but exposes no named fields.

No examples provided.

start_stream ~353

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 anything, and is worth calling first. A failed pre-flight is NOT an error: the call succeeds and the answer's `state` is `invalid` — read `state` first: invalid means refused, with `issues` saying why (fix them and start again); `preparing` means accepted. Media facts (duration, sound) arrive about 15-25 s after an upload completes, so a playlist of just-finished uploads can be refused until then. Other refusals (a state that cannot start, a guard failing at the moment of starting) are errors. Credits are NOT part of the pre-flight: the balance is verified when the stream actually activates, so an otherwise-ready stream can still fail to start on an empty wallet — get_billing_overview is what tells you that. A playlist loop takes the playlist as it currently is, with nothing to publish first; a scene plays its published version (publish_scene). Asynchronous: the stream reports a starting state immediately and is live within about a minute. To start at a future time (or every day) use schedule_stream instead. Returns state, started (false when refused), issues (when refused) and startStream (the stream: id, name, state).

NameTypeReqDescription
streamIdstringyesStream id (stream_...) to start.

Structured output declared, but exposes no named fields.

No examples provided.

start_youtube_connection ~147

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 a destination whose status is needs_reauth or revoked. Not needed for plain RTMP publishing to YouTube — that is create_rtmp_destination, but it cannot manage the broadcast.

NameTypeReqDescription
returnUrlstring–Where Google should send the user after consent. Defaults to the Streamloop destinations page.

Structured output declared, but exposes no named fields.

No examples provided.

stop_stream ~87

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.

NameTypeReqDescription
streamIdstringyesStream id (stream_...) to stop.

Structured output declared, but exposes no named fields.

No examples provided.

swap_live_playlist ~235

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 — newly added media may have to be encoded first, so poll get_playlist until the swap is no longer in progress. expectedDraftVersion is required (the `version` from get_playlist) so a concurrent edit is reported instead of going live by accident. Other failures name their cause: STALE_DRAFT (refetch and retry), EMPTY_PLAYLIST, BROKEN_ITEM (an item's media was deleted or never finished uploading), RECIPE_MISMATCH, NOT_FOUND.

NameTypeReqDescription
expectedDraftVersionintegeryesRequired: the `version` from get_playlist. On STALE_DRAFT, refetch and retry.
playlistIdstringyesPlaylist id (pl_...) whose draft should go live.

Structured output declared, but exposes no named fields.

No examples provided.

unassign_playlist_order ~86

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.

NameTypeReqDescription
playlistIdstringyesPlaylist (pl_...) to clear the custom order from.

Structured output declared, but exposes no named fields.

No examples provided.

update_destination ~203

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 key. Pass only the fields to change. NOT transactional: each change commits on its own, and on a failure the response lists which ones already applied.

NameTypeReqDescription
archivedboolean–true archives the destination (reversible); false restores it.
idstringyesDestination id (dest_...), from list_destinations.
namestring–New display name.
rtmpKeystring–The new stream key, copied from the platform's own streaming settings after it rotated the old one. Custom RTMP destinations only. Stored encrypted and never shown again.

Structured output declared, but exposes no named fields.

No examples provided.

update_stream ~440

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 through Streamloop — not a custom RTMP destination, and not YouTube reached through a raw RTMP URL and key — and are otherwise skipped with a notice. Set retryMirror=true to re-attempt mirroring the schedule onto YouTube after a reconnect or a quota recovery. PARTIAL SUCCESS: settings are applied first, so if the YouTube settings then fail, `stream` still reflects the applied settings and `youtubeSettingsError` explains the YouTube failure — the settings change is NOT rolled back.

NameTypeReqDescription
frameratestring–Frames per second the stream is sent at.
idstringyesStream id (stream_...) to update.
namestring–Display name for the stream.
qualitystring–Output resolution sent to every destination; the account's preferred quality when omitted.
retryMirrorboolean–true re-attempts copying this stream's schedule onto its YouTube broadcast, e.g. after reconnecting the channel.
runBackupStreamboolean–Also publish to YouTube's backup ingest for redundancy. Doubles the streaming cost while live.
storageBackendstring–Media storage: standard (included) or large, for big playlists, billed per GiB-month.
streamDurationinteger–Stop after this many seconds of streaming; 0 = run until stopped.
youtubeobject–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 des…

Structured output declared, but exposes no named fields.

No examples provided.

Install

How do I install the Streamloop MCP server?

Streamloop is a hosted endpoint at https://mcp.streamloop.app/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · mcp.streamloop.app

# add to Claude Code
claude mcp add --transport http streamloop-mcp 'https://mcp.streamloop.app/mcp'
Common questions

What is the Streamloop MCP server?

Streamloop is an MCP server listed in the public MCP registry as io.github.streamloop/mcp. Manage cloud-hosted 24/7 video streams, playlists, destinations, schedules, media and workspaces. This page covers its hosted endpoint (https://mcp.streamloop.app/mcp).

Is the Streamloop MCP server safe to use?

Streamloop scores 89 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Streamloop MCP server expose?

Streamloop exposes 67 tools: list_streams, get_stream, start_stream, stop_stream, delete_stream, and 62 more. Their descriptions and schemas cost roughly 13,624 tokens of context every time the server is loaded.

Does the Streamloop MCP server require authentication?

Yes. Streamloop asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the Streamloop MCP server still maintained?

Streamloop is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.