Integrations
MCP Server
The Vidiyo MCP server exposes your account as Model Context Protocol tools (99 tools). Connect Cursor, Claude Desktop, or any MCP-compatible agent, then upload videos, manage schedules, Autopilot, marketplace, and analytics with natural language or tool calls.
Connect your MCP client
Cursor IDE
Add this to .cursor/mcp.json in your project root, then restart Cursor:
{
"mcpServers": {
"vidiyo": {
"url": "https://mcp.vidiyo.com/mcp"
}
}
}
Claude (web, Desktop, and mobile)
Claude connects to remote MCP servers natively. Go to Settings → Connectors → Add custom connector, name it Vidiyo, and enter the MCP URL above. Enable it in a chat via the + menu, then verify: "Use the ping tool to check the Vidiyo MCP server." For Claude Code:
claude mcp add --transport http vidiyo https://mcp.vidiyo.com/mcp
ChatGPT
Requires a paid plan. Enable Settings → Connectors → Advanced settings → Developer Mode, then Connectors → Create with the MCP URL and authentication set to None (you authenticate in-session with set_api_key). Enable the connector per chat via + → More → Developer Mode.
Grok
Go to grok.com/connectors → New Connector → Custom and enter the MCP URL. For the xAI API, pass the URL as an mcp tool with server_url and server_label.
MCP Inspector (debugging)
npx @modelcontextprotocol/inspector@latest # Enter: https://mcp.vidiyo.com/mcp
Authentication
Method 1 — API Key (recommended for agents)
For autonomous agents, CI pipelines, and any workflow that runs without a browser.Generate a key in
Studio → Account → API Keys, then call
set_api_key.
set_api_key(api_key: "vk_live_...")
The key is stored in the Durable Object session and sent on every API call. It is not echoed back or logged. The tool verifies the key against the API before storing it and will reject invalid or revoked keys immediately.
Method 2 — Google OAuth (for interactive users)
- Call
authenticate — returns a URL - Visit the URL in your browser and sign in with Google
- Return to your MCP client — the session is linked
- JWTs refresh automatically; sessions persist for the Durable Object's lifetime
Core (4 tools)
| Tool | Auth | Description |
|---|
ping | None | Health check. Returns server status and auth method. |
authenticate | None | Start Google OAuth. Returns a URL for the user to visit. |
set_api_key | None | Authenticate with a creator API key. For agents without a browser. |
whoami | Yes | Current user's profile and active auth method. |
Browse (10 tools — no auth)
Optional brand scopes catalog tools to a Brand Kit allowlist (X-Vidiyo-Brand).
| Tool | Auth | Description |
|---|
list_channels | None | Paginated channel list, sorted by recency. Optional brand. |
get_channel | None | Channel detail by slug. Optional brand. |
get_channel_schedule | None | Schedule blocks for a channel on a date. Optional brand. |
get_now_playing | None | Current content + next upcoming on a channel. Optional brand. |
search | None | Search channels and content. Optional brand. |
get_trending | None | Trending search terms. Optional brand. |
get_home_feed | None | Featured, live, and popular channels. Optional brand. |
get_content | None | Public content item by UUID. |
list_categories | None | All categories with channel counts. |
get_category | None | Category detail with paginated channels. |
Brand Kits / Your brand (9 tools)
| Tool | Auth | Description |
|---|
get_brand | None | Public Brand Kit by slug (active only). |
resolve_brand | None | Resolve a Brand Kit from a hostname (platform or verified custom). |
get_my_brand_kit | Yes | Your Brand Kit manage DTO + entitlement. |
create_my_brand_kit | Yes | Create a draft Brand Kit. |
update_my_brand_kit | Yes | Patch channels, chrome recipes, legal URLs, exclusive, slate URL. |
publish_my_brand_kit | Yes | Publish draft to active when entitled and publish-ready. |
list_my_brand_domains | Yes | Custom domains + CNAME target. |
attach_brand_domain | Yes | Attach a custom hostname via Cloudflare for SaaS. |
detach_brand_domain | Yes | Remove a custom hostname from your Brand Kit. |
Playback (1 tool — no auth)
| Tool | Auth | Description |
|---|
get_stream_url | None | HLS master playlist URL, now-playing EPG, and VMAP ad tag for a channel. Optional brand. |
On Demand (4 tools)
| Tool | Auth | Description |
|---|
browse_on_demand | None | Catalog rails: Most Popular, New This Month, Leaving Soon, by category. |
list_on_demand_titles | None | Cursor-paginated On Demand catalog. |
get_on_demand_title | None | Title detail + related titles. |
get_on_demand_playback | None | Seekable SSAI VOD HLS URL (resume when signed in). |
Content library (7 tools)
| Tool | Auth | Description |
|---|
list_my_content | content:read | List your content library. Filter by status: 'ready' to find schedulable videos. |
get_my_content_item | content:read | Full detail for one owned item: renditions, captions, thumbnails, transcode status. |
update_content | content:write | Update title, description, channel, rating, or tags. |
delete_content | content:write | Soft-delete a content item. |
retry_transcode | content:write | Re-queue a failed transcode without re-uploading. |
init_direct_upload | content:write | Start a direct-to-R2 upload. Returns a presigned URL + contentItemId. |
complete_direct_upload | content:write | Finalize after the PUT succeeds. Triggers transcoding. |
Two ways to upload a video. If your agent can make an HTTP PUT (Cursor, Claude Code, scripts), use init_direct_upload + complete_direct_upload. If it's a chat client that can't send file bytes (Claude web, ChatGPT, Grok), host the file at a public URL and use ingest_from_url — it works for any video, not just AI-generated content.
Schedule management (5 tools)
| Tool | Auth | Description |
|---|
get_schedule | schedule:read | Schedule blocks + gaps for a channel + date window. |
create_schedule_block | schedule:write | Place a ready content item at a specific time. Returns 409 on overlap. |
update_schedule_block | schedule:write | Move, resize, or swap content of an existing block. |
delete_schedule_block | schedule:write | Remove a block. Content item is not deleted. |
fill_schedule_gaps | schedule:write | Trigger async auto-fill to cover gaps with library content. |
Channel management (13 tools)
| Tool | Auth | Description |
|---|
get_my_channels | channel:read | List all channels you own, including drafts. |
get_channel_dashboard | channel:read | Realtime viewers, 7-day overview, now-playing, content counts. |
create_channel | channel:write | Create a new channel. |
update_channel | channel:write | Update name, description, kind, category, vod_enabled. |
publish_channel | channel:write | Publish a draft channel. |
unpublish_channel | channel:write | Take a channel offline. |
delete_channel | channel:write | Soft-delete a channel you own. |
get_my_profile | Yes | Authenticated user's profile. |
generate_channel_images | channel:write | Start an AI artwork candidate batch for a channel. |
list_channel_image_candidates | channel:read | List latest AI artwork candidates. |
select_channel_image | channel:write | Adopt a ready candidate as channel art. |
get_channel_rtmp | channel:read | RTMP ingest URL + stream key for live channels. |
rotate_channel_rtmp | channel:write | Rotate the RTMP stream key. |
Analytics (7 tools)
| Tool | Auth | Description |
|---|
get_analytics_overview | analytics:read | Per-channel KPIs: views, sessions, watch minutes, trends. |
get_content_performance | analytics:read | Per-content metrics with pagination. |
get_viewer_demographics | analytics:read | Country and platform breakdown. |
get_realtime_viewers | analytics:read | Live viewer count and per-minute activity. |
get_creator_overview | analytics:read | Cross-channel totals with per-channel breakdown. |
get_analytics_timeseries | analytics:read | Daily series for views, sessions, watch minutes, or ad impressions. |
get_creator_analytics_summary | analytics:read | Compact today-vs-last-week snapshot. |
Favorites and follows (12 tools)
| Tool | Auth | Description |
|---|
list_my_favorites | Yes | User's favorited channels. |
add_favorite | Yes | Favorite a channel by UUID or slug. |
remove_favorite | Yes | Unfavorite a channel. |
list_followed_creators | Yes | Creators the user follows. |
follow_creator | Yes | Follow a creator by username. |
unfollow_creator | Yes | Unfollow a creator. |
list_followed_channels | Yes | Channels the user follows. |
follow_channel | Yes | Follow a channel by UUID or slug. |
unfollow_channel | Yes | Unfollow a channel. |
list_followed_collections | Yes | Channel collections the user follows. |
follow_collection | Yes | Follow a collection by UUID. |
unfollow_collection | Yes | Unfollow a collection. |
Ingest, AI creation, Autopilot, and credits (15 tools)
| Tool | Auth | Description |
|---|
ingest_from_url | content:write | Ingest any publicly downloadable video URL (not just AI output). The upload path for chat clients that can't PUT file bytes. |
estimate_generation | Yes | Price an AI generation in credits without submitting. Free. |
request_generation | credits:spend | Submit an AI video generation. Spends credits. |
get_generation | Yes | Status of one creation job. |
list_generations | Yes | Recent creation jobs, newest first. |
cancel_generation | Yes | Cancel a pre-submission job; refunds the hold. |
create_brief | credits:spend | Recurring Autopilot programming brief on a channel. |
list_briefs | Yes | Briefs with status and next run time. |
get_brief | Yes | One brief plus recent run history. |
update_brief | credits:spend | Edit brief fields or pause/resume. Creative fields merge with the current brief. |
delete_brief | credits:spend | Archive a brief (stops future runs). |
run_brief | credits:spend | Trigger a brief run now. Spends credits within caps. |
get_brief_review | Yes | Clips awaiting approval for review-mode briefs. |
approve_brief_content | credits:spend | Approve a review-queue clip onto the brief channel. |
get_credits | Yes | Credits balance and recent transactions. |
Marketplace (6 tools)
| Tool | Auth | Description |
|---|
get_marketplace_terms | Yes | Active Vidiyo Open License (required before share). |
list_marketplace_listings | Yes | Browse listings you can schedule onto your channels. |
get_marketplace_listing | Yes | Listing detail for evaluation. |
share_to_marketplace | Yes | Share a ready owned video (rights consent required). |
withdraw_from_marketplace | Yes | Withdraw your content from the marketplace. |
get_marketplace_earnings | Yes | Earnings for shared content. |
Webhooks (4 tools)
| Tool | Auth | Description |
|---|
list_webhooks | content:write | Your outbound webhook subscriptions with status and delivery stats. |
create_webhook | content:write | Subscribe an HTTPS endpoint to pipeline events. Returns the signing secret once. |
delete_webhook | content:write | Remove a subscription. |
enable_webhook | content:write | Re-enable a subscription auto-disabled after delivery failures. |
Payouts and viewer (2 tools)
| Tool | Auth | Description |
|---|
get_payout_summary | Yes | Stripe Connect status, payout history, pending balance. |
get_continue_watching | Yes | In-progress viewing sessions with position and last-watched time. |
Autonomous agent workflow
The complete flow for an AI agent that generates videos throughout the day and schedules them automatically:
# 1. Authenticate with API key (no browser needed)
set_api_key(api_key: "vk_live_...")
# 2. Upload a generated video
init_direct_upload(
filename: "daily-briefing.mp4",
title: "Daily Briefing — May 3",
size_bytes: 52428800,
content_type: "video/mp4",
channel_id: "01936f4e-..."
)
# → { contentItemId, uploadUrl }
# Agent PUTs the file bytes to uploadUrl via HTTP
complete_direct_upload(content_item_id: "01936f4e-...")
# 3. Wait for transcoding (poll until status === "ready")
get_my_content_item(id: "01936f4e-...") # repeat every 30s
# 4. Find an open slot
get_schedule(
channel_id: "01936f4e-...",
from: "2026-05-03T00:00:00Z",
to: "2026-05-04T00:00:00Z"
)
# → inspect gaps[] to find open windows
# 5. Schedule the content
create_schedule_block(
channel_id: "01936f4e-...",
content_item_id: "01936f4e-...",
starts_at: "2026-05-03T14:00:00Z"
)
Error handling
| Status | MCP response |
|---|
| 401 | Authentication required. Call authenticate or set_api_key. |
| 403 (scope) | API key is missing required scope(s): schedule:write |
| 403 (ownership) | You don't own this channel. |
| 404 | The requested resource was not found. |
| 409 | That time slot already has a block. Move or shorten it first. |
| 429 | Rate limit exceeded. Please wait before retrying. |
| 503 | The Vidiyo API is currently unavailable. Please try again later. |
MCP endpoints
| Environment | URL |
|---|
| Production | https://mcp.vidiyo.com/mcp |
| Staging | https://mcp-stg.vidiyo.com/mcp |
| Local dev | http://localhost:8787/mcp |
Transport: Streamable HTTP (SSE fallback supported). Standard MCP protocol — no vendor extensions.