api.video MCP by usefulapi

Manage videos and live streams, inspect captions, players and webhooks, and read play analytics.

Should I use this

Quality & Safety

A
Description quality
99%
Schema completeness
97%
Naming quality
79%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (1)

  • LOWTool 'apivideo_get_live_stream_analytics' name length outside 3-30 rangein apivideo_get_live_stream_analytics

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,878Tokens (tool definitions)
~1.6 KBTypical response size
Significant attention impact (2.25% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "apivideo": {
      "url": "https://apivideo.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://apivideo.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (15)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢apivideo_list_videos(title, tags, metadata, description, liveStreamId, ...)

List videos in the account, with optional filters (title, tags, metadata, description, liveStreamId) and sorting. Read-only. GET /videos.

Input Schema

{
  "type": "object",
  "properties": {
    "title": {
      "description": "Filter by video title (substring).",
      "type": "string"
    },
    "tags": {
      "description": "Filter by tags (all must match). Sent as tags[].",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "metadata": {
      "description": "Filter by metadata key/value pairs. Sent as metadata[key]=value.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    },
    "description": {
      "description": "Filter by description (substring).",
      "type": "string"
    },
    "liveStreamId": {
      "description": "Return only videos recorded from this live stream id.",
      "type": "string"
    },
    "sortBy": {
      "description": "Field to sort by.",
      "type": "string",
      "enum": [
        "title",
        "createdAt",
        "publishedAt",
        "updatedAt"
      ]
    },
    "sortOrder": {
      "description": "Sort direction.",
      "type": "string",
      "enum": [
        "asc",
        "desc"
      ]
    },
    "currentPage": {
      "description": "Page number (1-based). Default 1.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Results per page (max 100). Default 25.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢apivideo_get_video(videoId)

Get a single video object by id (title, assets, player URL, status flags). Read-only. GET /videos/{videoId}.

Input Schema

{
  "type": "object",
  "properties": {
    "videoId": {
      "type": "string",
      "description": "The video id, e.g. vi4k0jvEUuaTdRAEjQ4Jfrgz."
    }
  },
  "required": [
    "videoId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢apivideo_get_video_status(videoId)

Get encoding and ingest status for a video (upload progress, encoding qualities, playability). Read-only. GET /videos/{videoId}/status.

Input Schema

{
  "type": "object",
  "properties": {
    "videoId": {
      "type": "string",
      "description": "The video id."
    }
  },
  "required": [
    "videoId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢apivideo_list_live_streams(streamKey, name, sortBy, sortOrder, currentPage, ...)

List live streams in the account, with optional filters (streamKey, name) and sorting. Read-only. GET /live-streams.

Input Schema

{
  "type": "object",
  "properties": {
    "streamKey": {
      "description": "Filter by exact stream key.",
      "type": "string"
    },
    "name": {
      "description": "Filter by live stream name (substring).",
      "type": "string"
    },
    "sortBy": {
      "description": "Field to sort by.",
      "type": "string",
      "enum": [
        "createdAt",
        "updatedAt"
      ]
    },
    "sortOrder": {
      "description": "Sort direction.",
      "type": "string",
      "enum": [
        "asc",
        "desc"
      ]
    },
    "currentPage": {
      "description": "Page number (1-based). Default 1.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Results per page (max 100). Default 25.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢apivideo_get_live_stream(liveStreamId)

Get a single live stream object by id (stream key, RTMP ingest, player URL). Read-only. GET /live-streams/{liveStreamId}.

Input Schema

{
  "type": "object",
  "properties": {
    "liveStreamId": {
      "type": "string",
      "description": "The live stream id, e.g. li400mYKSgQ6xs7taUeSaEup."
    }
  },
  "required": [
    "liveStreamId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢apivideo_list_captions(videoId, currentPage, pageSize)

List caption tracks for a video (language, source URL, default flag). Read-only. GET /videos/{videoId}/captions.

Input Schema

{
  "type": "object",
  "properties": {
    "videoId": {
      "type": "string",
      "description": "The video id."
    },
    "currentPage": {
      "description": "Page number (1-based). Default 1.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Results per page (max 100). Default 25.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 100
    }
  },
  "required": [
    "videoId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢apivideo_list_chapters(videoId, currentPage, pageSize)

List chapter tracks for a video. Read-only. GET /videos/{videoId}/chapters.

Input Schema

{
  "type": "object",
  "properties": {
    "videoId": {
      "type": "string",
      "description": "The video id."
    },
    "currentPage": {
      "description": "Page number (1-based). Default 1.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Results per page (max 100). Default 25.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 100
    }
  },
  "required": [
    "videoId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢apivideo_list_players(sortBy, sortOrder, currentPage, pageSize)

List customized player themes in the account. Read-only. GET /players.

Input Schema

{
  "type": "object",
  "properties": {
    "sortBy": {
      "description": "Field to sort by.",
      "type": "string",
      "enum": [
        "createdAt",
        "updatedAt"
      ]
    },
    "sortOrder": {
      "description": "Sort direction.",
      "type": "string",
      "enum": [
        "asc",
        "desc"
      ]
    },
    "currentPage": {
      "description": "Page number (1-based). Default 1.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Results per page (max 100). Default 25.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢apivideo_list_webhooks(events, currentPage, pageSize)

List webhooks configured in the account, optionally filtered by event name. Read-only. GET /webhooks.

Input Schema

{
  "type": "object",
  "properties": {
    "events": {
      "description": "Filter by event name, e.g. \"video.encoding.quality.completed\".",
      "type": "string"
    },
    "currentPage": {
      "description": "Page number (1-based). Default 1.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Results per page (max 100). Default 25.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢apivideo_get_video_analytics(from, to, dimension, filter, currentPage, ...)

Aggregated play analytics for videos over a date range, grouped by a dimension. Read-only. GET /analytics/videos/plays.

Input Schema

{
  "type": "object",
  "properties": {
    "from": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "Start date yyyy-mm-dd (inclusive). Required."
    },
    "to": {
      "description": "End date yyyy-mm-dd (inclusive).",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "dimension": {
      "type": "string",
      "enum": [
        "videoId",
        "emittedAt",
        "country",
        "deviceType",
        "operatingSystem",
        "browser"
      ],
      "description": "Dimension to group plays by."
    },
    "filter": {
      "description": "Filter expression, e.g. \"videoId:vi123\".",
      "type": "string"
    },
    "currentPage": {
      "description": "Page number (1-based). Default 1.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Results per page (max 100). Default 25.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 100
    }
  },
  "required": [
    "from",
    "dimension"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢apivideo_get_live_stream_analytics(from, to, dimension, filter, currentPage, ...)

Aggregated play analytics for live streams over a date range, grouped by a dimension. Read-only. GET /analytics/live-streams/plays.

Input Schema

{
  "type": "object",
  "properties": {
    "from": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "Start date yyyy-mm-dd (inclusive). Required."
    },
    "to": {
      "description": "End date yyyy-mm-dd (inclusive).",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "dimension": {
      "type": "string",
      "enum": [
        "liveStreamId",
        "emittedAt",
        "country",
        "deviceType",
        "operatingSystem",
        "browser"
      ],
      "description": "Dimension to group plays by."
    },
    "filter": {
      "description": "Filter expression, e.g. \"liveStreamId:li123\".",
      "type": "string"
    },
    "currentPage": {
      "description": "Page number (1-based). Default 1.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Results per page (max 100). Default 25.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 100
    }
  },
  "required": [
    "from",
    "dimension"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴apivideo_create_video(title, description, source, public, panoramic, ...)

WRITE. Create a new video object. If `source` (a public video URL) is provided, api.video ingests the video from that URL — recommended for hosted use, since raw file bytes cannot stream through MCP. POST /videos.

Input Schema

{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "description": "Video title. Required."
    },
    "description": {
      "description": "Video description.",
      "type": "string"
    },
    "source": {
      "description": "Public URL of a video file to ingest from. Recommended over uploading bytes.",
      "type": "string"
    },
    "public": {
      "description": "Whether the video is public (default true) or private.",
      "type": "boolean"
    },
    "panoramic": {
      "description": "Whether the video is a 360/panoramic video.",
      "type": "boolean"
    },
    "mp4Support": {
      "description": "Whether to also generate a downloadable MP4.",
      "type": "boolean"
    },
    "tags": {
      "description": "Tags for the video.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "metadata": {
      "description": "Key/value metadata pairs (sent as [{key,value}]).",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    },
    "playerId": {
      "description": "Id of a custom player theme to attach.",
      "type": "string"
    }
  },
  "required": [
    "title"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴apivideo_update_video(videoId, title, description, tags, metadata, ...)

WRITE. Update fields on an existing video. Only the provided fields are changed. PATCH /videos/{videoId}.

Input Schema

{
  "type": "object",
  "properties": {
    "videoId": {
      "type": "string",
      "description": "The video id to update."
    },
    "title": {
      "description": "New title.",
      "type": "string"
    },
    "description": {
      "description": "New description.",
      "type": "string"
    },
    "tags": {
      "description": "Replacement tag list.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "metadata": {
      "description": "Replacement metadata (sent as [{key,value}]).",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    },
    "public": {
      "description": "New public/private flag.",
      "type": "boolean"
    },
    "panoramic": {
      "description": "New panoramic flag.",
      "type": "boolean"
    },
    "playerId": {
      "description": "Player theme id to attach.",
      "type": "string"
    }
  },
  "required": [
    "videoId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴apivideo_delete_video(videoId)

WRITE. Permanently DELETE a video and all its assets. This cannot be undone. DELETE /videos/{videoId}.

Input Schema

{
  "type": "object",
  "properties": {
    "videoId": {
      "type": "string",
      "description": "The video id to permanently delete."
    }
  },
  "required": [
    "videoId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴apivideo_create_live_stream(name, public, playerId)

WRITE. Create a new live stream, returning a stream key and RTMP ingest URL to broadcast to. POST /live-streams.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Live stream name. Required."
    },
    "public": {
      "description": "Whether the stream is public (default true) or private.",
      "type": "boolean"
    },
    "playerId": {
      "description": "Id of a custom player theme to attach.",
      "type": "string"
    }
  },
  "required": [
    "name"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded15 tools
verifiedversion not recorded15 tools
verifiedversion not recorded15 tools
failed observationversion not recorded—
failed observationversion not recorded—