media-downloader
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@media-downloaderdownload the audio from https://example.com/audio.mp3"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Media Downloader
CLI or API | MCP
Version: 4.4.5
Documentation — Installation, deployment, and usage across the CLI, Python API, MCP, and A2A agent interfaces are maintained in the official documentation.
Related MCP server: media-downloader
Overview
Media Downloader is a production-grade Agent and Model Context Protocol (MCP) server designed to interface directly with Download audio/videos from the internet! Host an MCP Server for Agentic AI to download videos!.
Key Features
Consolidated Action-Routed MCP Tools: Minimizes token overhead and eliminates tool bloat in LLM contexts by grouping methods into optimized, togglable tool modules.
Enterprise-Grade Security: Complete support for Eunomia policies, OIDC token delegation, and granular execution context tracking.
Integrated Graph Agent: Built-in Pydantic AI agent supporting the Agent Control Protocol (ACP) and standard Web interfaces (AG-UI).
Native Telemetry & Tracing: Out-of-the-box OpenTelemetry exports and native Langfuse tracing.
CLI or API
This agent wraps the Download audio/videos from the internet! Host an MCP Server for Agentic AI to download videos! API. The operator can interact with it programmatically or via its integrated execution entrypoints.
Detailed instructions on how to use the underlying API wrappers, extended schema bindings, and developer SDK references are maintained in docs/index.md.
MCP
This server use dynamic Action-Routed tools to optimize token overhead and maximize IDE compatibility.
Available MCP Tools
Condensed action-routed tools (MCP_TOOL_MODE=condensed)
MCP Tool | Toggle Env Var | Description |
| — | Write a video-built skill, or append another video's findings to one. |
| — | Download video or audio from supported sites (YouTube, Rumble, etc.). |
| — | List video-built skills under a root and the videos each already has. |
| — | Watch a video: download it with captions and extract key frames. |
Verbose 1:1 API-mapped tools (MCP_TOOL_MODE=verbose or both)
MCP Tool | Toggle Env Var | Description |
|
| Invoke the download_all operation. |
|
| Invoke the download_video operation. |
|
| Invoke the get_channel_videos operation. |
|
| Invoke the open_file operation. |
|
| Invoke the progress_hook operation. |
|
| Invoke the set_progress_callback operation. |
|
| Download a video with its captions and extract scene-change key frames. |
4 action-routed tool(s) · 7 verbose 1:1 tool(s). Each is enabled unless its <DOMAIN>TOOL toggle is set false; MCP_TOOL_MODE selects the surface (intent default — the six verb-tools, granular set loaded on demand · condensed action-routed · verbose 1:1 · both). Auto-generated — do not edit.
Detailed tool schemas, parameter shapes, and validation constraints are preserved in docs/usage.md.
Dynamic Tool Selection & Visibility
This MCP server supports dynamic toolset selection and visibility filtering at runtime. This allows the operator to restrict the set of exposed tools to prevent blowing up the LLM's context window.
The operator can configure tool filtering via multiple input channels:
CLI Arguments: Pass
--toolsor--toolsets(or their disabled counterparts--disabled-toolsand--disabled-toolsets) during startup.Environment Variables: Define standard environment variables:
MCP_ENABLED_TOOLS/MCP_DISABLED_TOOLSMCP_ENABLED_TAGS/MCP_DISABLED_TAGS
HTTP SSE Request Headers: Pass custom headers during transport initialization:
x-mcp-enabled-tools/x-mcp-disabled-toolsx-mcp-enabled-tags/x-mcp-disabled-tags
HTTP SSE Request Query Parameters: Append query parameters directly to the operator's transport connection URL:
?tools=tool1,tool2?tags=tag1
When query strings or parameters are supplied, an LLM-free Knowledge Graph resolution layer (using DynamicToolOrchestrator) matches query intents against known tool tags, names, or descriptions, with safe fallback and automated 24-hour background cache refreshing.
MCP Configuration Examples
Install the connector-focused
[mcp]extra. Examples usemedia-downloader[mcp]to add FastMCP / FastAPI throughscion-sdk; the required Scion SDK core still carriesepistemic-graph[full]. The[agent-runtime]extra additionally enables model orchestration.
stdio Transport (local IDEs — Cursor, Claude Desktop, VS Code)
{
"mcpServers": {
"media-downloader-mcp": {
"command": "uvx",
"args": [
"--from",
"media-downloader[mcp]",
"media-downloader-mcp"
],
"env": {
"MCP_TOOL_MODE": "intent",
"MEDIA_DOWNLOADER_ALLOW_PRIVATE_HOSTS": "media.internal.example",
"MEDIA_DOWNLOADER_MAX_WORKERS": "4",
"MEDIA_DOWNLOADER_OUTPUT_ROOT": "/data/media",
"WORKSPACE_PATH": "workspace"
}
}
}
}Runtime references require an alias-aware launcher such as Arbora. Other launchers must omit those entries and inject the resolved values through their own runtime secret boundary.
Streamable-HTTP Transport (networked / production)
{
"mcpServers": {
"media-downloader-mcp": {
"command": "uvx",
"args": [
"--from",
"media-downloader[mcp]",
"media-downloader-mcp",
"--transport",
"streamable-http",
"--port",
"8000"
],
"env": {
"TRANSPORT": "streamable-http",
"HOST": "127.0.0.1",
"PORT": "8000",
"MCP_TOOL_MODE": "intent",
"MEDIA_DOWNLOADER_ALLOW_PRIVATE_HOSTS": "media.internal.example",
"MEDIA_DOWNLOADER_MAX_WORKERS": "4",
"MEDIA_DOWNLOADER_OUTPUT_ROOT": "/data/media",
"WORKSPACE_PATH": "workspace"
}
}
}
}Alternatively, connect to a pre-deployed Streamable-HTTP instance by url:
{
"mcpServers": {
"media-downloader-mcp": {
"url": "http://localhost:8000/media-downloader-mcp/mcp"
}
}
}Run a reviewed container image as a least-privilege stdio child (no listener or published port):
docker run -i --rm \
--read-only \
--cap-drop=ALL \
--security-opt=no-new-privileges \
--pids-limit=256 \
--tmpfs /tmp:rw,noexec,nosuid,nodev,size=64m \
-e TRANSPORT=stdio \
-e MCP_TOOL_MODE=intent \
-e MEDIA_DOWNLOADER_ALLOW_PRIVATE_HOSTS=media.internal.example \
-e MEDIA_DOWNLOADER_MAX_WORKERS=4 \
-e MEDIA_DOWNLOADER_OUTPUT_ROOT=/data/media \
-e WORKSPACE_PATH=workspace \
registry.example.invalid/media-downloader@sha256:<digest> media-downloader-mcpFor containerized network HTTP, supply an authenticated TLS ingress (or
direct server TLS), exact MCP_ALLOWED_HOSTS, and an exact trusted-proxy
CIDR policy through the operator-owned deployment profile. The generator
does not emit an unauthenticated non-loopback listener.
Auto-generated from the code-read env surface (MCP_TOOL_MODE + package vars) — do not edit.
Additional Deployment Options
media-downloader can run as a local stdio process or container, or behind a remote
network boundary. The
Deployment guide carries
the detailed transport contract.
Local container — launch a reviewed immutable image as a least-privilege stdio child with no listener or published port.
Remote URL — connect through an operator-supplied authenticated HTTPS ingress. Keep its URL, outbound identity references, trust profile, and exact
MCP_ALLOWED_HOSTSinAgentConfig.
Agent
This repository features a fully integrated Pydantic AI Graph Agent. It communicates over the Agent Control Protocol (ACP) and interacts smoothly with the Agent Web UI (AG-UI) and Terminal interface.
Running the Agent CLI
To start the interactive command-line agent:
# Run the agent server
media-downloader-agent --provider openai --model-id gpt-4oDocker Compose Orchestration
version: '3.8'
services:
media-downloader-mcp:
image: example/media-downloader@sha256:<digest>
container_name: media-downloader-mcp
hostname: media-downloader-mcp
restart: always
env_file:
- ../.env
environment:
- PYTHONUNBUFFERED=1
- HOST=0.0.0.0
- PORT=8000
- TRANSPORT=streamable-http
ports:
- "8000:8000"
healthcheck:
test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
image: example/media-downloader@sha256:<digest>
container_name: media-downloader-agent
hostname: media-downloader-agent
restart: always
depends_on:
- media-downloader-mcp
env_file:
- ../.env
command: [ "media-downloader-agent" ]
environment:
- PYTHONUNBUFFERED=1
- HOST=0.0.0.0
- PORT=9000
- MCP_URL=http://media-downloader-mcp:8000/mcp
- PROVIDER=${PROVIDER:-openai}
- MODEL_ID=${MODEL_ID:-gpt-4o}
- ENABLE_WEB_UI=True
- ENABLE_OTEL=True
ports:
- "9000:9000"
healthcheck:
test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:9000/health')"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
Detailed graph node architecture explanations, custom skill configurations, and agentic trace guides are available in docs/deployment.md.
Security & Governance
Built directly upon the enterprise-ready scion-sdk core, standard security parameters are fully supported:
Access Control & Policy Enforcement
Eunomia Policies: Fine-grained, policy-driven tool authorization. Supports
none, localembedded(mcp_policies.json), or centralizedremotemodes.OIDC Token Delegation: Compliant with RFC 8693 token exchange for flowing authenticating user credentials from Web UI / ACP → Agent → MCP.
Scoped Credentials: Execution context runs restricted to the specific caller identity.
Runtime Security Grid
Feature | Feature | Enablement |
Tool Guard | Sensitivity inspection with human-in-the-loop validation | Enabled by default |
Prompt Injection Defense | Input scanning, repetition monitoring, and recursive loop blocks | Enabled by default |
Context Safety Guard | Stuck-loop detectors and contextual overflow preemptive alerts | Enabled by default |
Environment Variables
Package environment variables
Variable | Example | Description |
|
| |
|
| |
|
| options: stdio, streamable-http, sse |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| options: none, embedded, remote |
|
| |
|
| |
|
| Required by the hardened compose profiles — no floating tag is assumed. Point these at an immutable digest of a reviewed image before running |
|
| |
|
| Every download is written beneath this root; a path that escapes it is rejected. Falls back to WORKSPACE_PATH, then ~/Downloads. |
|
| |
|
| Exact hostnames allowed to resolve to a private address. Downloads are restricted to publicly routable hosts otherwise; no wildcards are accepted. |
|
| Parallel download workers, clamped to 1-4. |
Inherited scion-sdk variables (apply to every connector)
Variable | Example | Description |
|
| Tool surface: |
| — | Comma-separated tool allow-list |
| — | Comma-separated tool deny-list |
| — | Comma-separated tag allow-list |
| — | Comma-separated tag deny-list |
| — | Outbound MCP child auth: |
| — | OIDC client id (service-account auth) |
|
| Runtime secret reference for the OIDC service account |
| — | HTTP Basic username ( |
|
| Runtime secret reference for HTTP Basic auth ( |
|
| Verbose logging |
|
| Unbuffered stdout (recommended in containers) |
|
| URL of the MCP server the agent connects to |
| — | Operator-configured LLM provider for the agent |
| — | Operator-configured model id for the agent |
|
| Serve the AG-UI web interface |
17 package + 16 inherited variable(s). Auto-generated from .env.example + the shared scion-sdk set — do not edit.
Every variable the server reads. A local template is supplied inside
.env.example — copy it to .env and adjust as needed.
MCP server / transport
Variable | Description | Default |
|
|
|
| Bind host (HTTP transports) |
|
| Bind port (HTTP transports) |
|
| Tool surface: |
|
| Comma-separated tool allow/deny list | — |
| Comma-separated tag allow/deny list | — |
| Unbuffered stdout (recommended in containers) |
|
Telemetry & governance
Variable | Description | Default |
| Enable OpenTelemetry export |
|
| OTLP collector endpoint | — |
| OTLP auth keys | — |
| OTLP protocol (e.g. | — |
| Authorization mode: |
|
| Embedded policy file |
|
| Remote Eunomia server URL | — |
Agent CLI (full [agent] runtime only)
Variable | Description | Default |
| URL of the MCP server the agent connects to |
|
| LLM provider (e.g. |
|
| Model id (e.g. |
|
| Serve the AG-UI web interface |
|
Installation
Pick the extra that matches what the operator want to run:
Extra | Installs | Use when |
| Connector-focused MCP server ( | The operator only run the MCP server (smallest install / image) |
| Everything ( | Development / both surfaces |
# Connector-focused MCP server (includes the shared graph engine)
uv pip install "media-downloader[mcp]"
# Agent runtime (adds model orchestration to the shared graph engine)
# Everything (development)
uv pip install "media-downloader[all]" # or: python -m pip install "media-downloader[all]"Container images (:mcp)
One multi-stage docker/Dockerfile builds the MCP-only image (--target mcp):
Image tag | Build target | Contents | Entrypoint |
|
|
|
|
docker build --target mcp -t knucklessg1/media-downloader:mcp docker/ # connector-focused MCP serveragent (default build) with a co-located :mcp sidecar. For an immutable production digest, tag and
pin the operator's own build as shown in the hardened docker run pattern above.
Knowledge-graph database (epistemic-graph)
Scion SDK core dependency (epistemic-graph[full]). The [mcp] extra keeps
deployments can use the bundled engine. For production — or to share one knowledge graph
across multiple agents — run epistemic-graph as its own dedicated database service and
configure the runtime to use it instead of the bundled engine. Deployment recipes
(single-node + Raft HA), connection configuration, and the full database architecture
(with diagrams) are documented in the
epistemic-graph deployment guide.
Documentation
The complete documentation is published as the official documentation site and is the recommended reference for installation, deployment, and day-to-day operation.
Page | Contents |
pip, source, extras, prebuilt Docker image | |
run the MCP server, the agent server, Compose, Caddy + Technitium, env config | |
the MCP tools, the | |
ecosystem role, enterprise readiness, architecture | |
concept registry ( |
AGENTS.md is the canonical contributor/agent guidance.
Repository Owners
Contribute
Contributions are welcome! Please ensure code quality by running local checks before submitting pull requests:
Format code using
ruff format .Lint code using
ruff check .Validate type-safety with
mypy .Ran test suites using
pytest
Governed capability contract
This package ships a compact canonical skill surface with specialist procedures
kept as referenced workflows. The current MCP tools, skill metadata,
connector_manifest.yml, ontology, mappings, shapes, fixtures, migrations,
tool-schema fingerprints, and certification metadata form one versioned
capability contract. Validate them together; do not rely on stale tool names or
historical per-task skill wrappers.
Runtime endpoints, credentials, certificate trust, tenant identity, retention, and observability policy are deployment inputs and are never packaged values. See Configuration, trust, and privacy before enabling a network transport, connector ingestion, Arbora delegation, or trace export.
Available Tools
11 toolsbuild_watch_skillBuild Watch SkillA
Write a video-built skill, or append another video's findings to one.
You supply the body - reading the transcript and frames is your job, not this tool's. It owns the mechanics: frontmatter, the provenance table every claim stays traceable to, the version bump, and WORKFLOW.md.
Appending a video the skill already lists is refused rather than
duplicated, so re-running a pipeline is safe. Call list_watch_skills
first to see which skill a new video belongs to.
Default to append. Use replace when the new source contradicts the
skill, changes a conclusion, supersedes rather than extends it, leaves
the body no longer reading as one document, or outgrows the description.
A create or replace without a "What would change this skill" section
is refused.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The markdown body you wrote from the bundle, starting with a '# Title' heading and ending with a '## What would change this skill' section naming the evidence that would revise it. Do not include a Sources section - it is generated from the manifest. | |
| mode | No | 'create' a new skill, 'append' a video's findings, or 'replace' the body | create |
| name | Yes | Skill name; becomes the directory name | |
| tags | No | Comma-separated frontmatter tags | |
| description | No | Skill description; required when creating | |
| skills_root | Yes | Directory the skill lives in (one subdirectory per skill) | |
| manifest_path | Yes | Path to the watch bundle's manifest.json, for provenance |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it discloses idempotency ('Appending a video the skill already lists is refused... re-running a pipeline is safe'), the required body shape, the auto-generated artifacts (frontmatter, provenance table, WORKFLOW.md), and that create/replace without a 'What would change this skill' section is refused. It does not say what happens to the existing body on `replace` or what permissions/paths are needed, so a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then responsibilities, then mode selection, then hard refusals. Slightly long with a trailing paragraph on refusal rules, but every sentence carries operative information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need no explanation, and the description covers delegation of reading transcripts/frames, generated artifacts, and refusal conditions. The only meaningful gap is the mismatched `mode` default between prose and schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds real decision semantics on `mode` (default append, when to choose replace) and on what `body` must contain. However, it states 'Default to `append`' while the schema declares `mode` default 'create' — a conflict the agent must resolve, which keeps this below 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opening sentence names specific verbs (write / append) and a concrete resource (video-built skill), and the tool is clearly distinct from siblings like list_watch_skills and watch_media. An agent knows exactly what this tool produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing guidance: 'Call `list_watch_skills` first to see which skill a new video belongs to', 'Default to `append`', and a clear enumerated set of conditions selecting `replace`. Alternatives and exclusions are both named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_mediaDownload MediaC
Download video or audio from supported sites (YouTube, Rumble, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
| video_url | Yes | URL of the video/media to download | |
| audio_only | No | Extract audio and convert to MP3 | |
| download_directory | No | Directory to save downloads | . |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden, yet it says nothing about authentication requirements, rate limits, blocking or long-running behavior, overwrite semantics for download_directory, or what 'supported sites' actually means. Only the basic read-and-write-to-disk nature is implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no waste and no preamble. It is efficient, though its brevity contributes to the gaps in behavior and routing rather than being a deliberate trade-off.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema relieves the need to describe return values and the schema covers all parameters, but for a network-facing download tool with no annotations and nine closely related siblings, the definition omits failure modes, restrictions, and tool-selection context an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all three parameters are documented in the schema, including the audio_only MP3 conversion and download_directory default. The description adds only a slight hint about which sites are supported, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Download') and resource ('video or audio') and names example sources (YouTube, Rumble), so the core action is unambiguous. However, it gives no signal distinguishing it from siblings like media_downloader_download_video, media_downloader_download_all, or watch_media, leaving the agent to guess among near-identical download tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no when-to-use or when-not-to-use guidance and never mentions any alternative. With ten sibling tools in the media_downloader family, the absence of routing criteria is a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_watch_skillsList Watch SkillsA
List video-built skills under a root and the videos each already has.
Use it before building: it says whether a new video extends an existing skill and whether that skill already covers it.
| Name | Required | Description | Default |
|---|---|---|---|
| skills_root | Yes | Directory holding video-built skills |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. "List" implies a non-mutating read and the description discloses what comes back (skills plus their existing videos), but it says nothing about behavior on a missing/invalid skills_root, whether the root is created, or ordering/pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the capability stated first and the usage rationale second. The second sentence is slightly redundant in phrasing ("extends an existing skill" vs "already covers it"), but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be detailed, and with one well-documented parameter the surface is small. The only meaningful gap is undefined behavior for an invalid or empty skills_root.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter, so the schema already defines skills_root as the directory holding video-built skills. The description adds no format, path-resolution, or constraint detail beyond that, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it lists video-built skills under a root directory plus the videos each already contains. That is clearly a read/inspection operation and distinct from build_watch_skill, though the sibling is never named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use it before building" gives a concrete trigger point, and the follow-on clause explains the decision it informs (extend an existing skill vs. create new, and coverage overlap). It stops short of naming build_watch_skill or stating when not to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
media_downloader_download_allDownload allC
Invoke the download_all operation.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, and destructiveHint=false, so the agent knows this is a non-destructive but externally-reaching operation. The description adds nothing beyond that: it does not say what gets downloaded, whether files are written to disk, how progress is reported (despite a sibling progress_callback tool), or how large an 'all' operation may be.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with no wasted words, but it is under-specified rather than concise — there is no front-loaded statement of scope or outcome. The single sentence carries no information an agent could act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description is the only place to explain what 'all' covers, where the results go, and what side effects to expect on an openWorld operation. It supplies none of that, leaving a meaningful gap for a tool that likely triggers bulk downloads.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate at the parameter level. Baseline 4 applies; the missing semantics are about behavior, not inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is a tautology: 'Invoke the download_all operation' merely restates the tool name and title without saying what is downloaded, from where, or to where. It gives no basis for distinguishing it from siblings such as download_media, media_downloader_download_video, or watch_media.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus the several download/watch siblings, and no prerequisites or exclusions are stated. The agent must infer scope from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
media_downloader_download_videoDownload videoD
Invoke the download_video operation.
| Name | Required | Description | Default |
|---|---|---|---|
| link | Yes | ||
| extra_opts | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and openWorldHint=true, so an agent knows this is a non-destructive write that reaches the open web, but the description adds nothing beyond that — no mention of download location, size/format limits, network/auth requirements, or blocking behavior. For a network-writing tool with zero added context, this is inadequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is one short sentence with no filler, but brevity here is under-specification rather than conciseness — there is no front-loaded statement of purpose or scope to justify the sentence that exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A two-parameter, open-world network operation with 0% schema coverage, no output schema, and no annotations covering input semantics requires substantially more description. Nothing an agent needs in order to call it correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%: `link` is required but untyped and undocumented, and `extra_opts` has only a title with a null default. The description provides no meaning for either parameter, so the agent has no idea what format `link` expects (URL? ID?) or what belongs in `extra_opts`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description merely restates the tool name and title ("Invoke the download_video operation") without stating what resource is fetched, from where, or how it differs from siblings like download_media, media_downloader_download_all, or watch_media. It is a tautology that gives an agent no basis for selecting this tool over the other download-family tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance at all — no mention of supported sources, no distinction from download_media or download_all, and no noted prerequisites. An agent must guess between at least four download-related siblings with zero routing signal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
media_downloader_get_channel_videosGet channel videosCRead-onlyIdempotent
Find a channel's video links; queue them on self.links and return them.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| channel | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds real value by disclosing a side effect the annotations do not mention: links are queued on ``self.links`` so they can presumably be passed to download_all later. That disclosure sits awkwardly against readOnlyHint/idempotentHint (does a repeat call enqueue duplicates?), and the description doesn't resolve that, nor does it say whether the queue is cleared first.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single front-loaded sentence with no padding, which is good. But it spends its words on the internal implementation token ``self.links``, which is jargon an agent may not be able to interpret, rather than on the parameter and return details that are actually missing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, 0% schema descriptions, and no parameter documentation, the description carries the full burden and does not discharge it: return shape ('return them' – links? IDs? objects?), channel identifier format, and the meaning of limit=-1 are all absent. For a 2-parameter network tool that mutates an internal queue, this leaves too much for the agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%: neither `channel` (untyped) nor `limit` (default -1, presumably meaning unlimited, but unstated) carries any documentation. The description mentions a channel only in passing and never explains `limit` or the accepted channel identifier format, so it fails to compensate for a total schema documentation gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Find a channel's video links'), so an agent knows exactly what the tool retrieves. It does not, however, contrast itself with siblings such as media_downloader_download_video or media_downloader_download_all, nor does it say how the discovered links relate to those downloaders.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to choose this tool versus download_all, download_video, or watch. Usage is only implied by the word 'Find'. Nothing states prerequisites (does the channel need to be authenticated?) or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
media_downloader_open_fileOpen fileD
Invoke the open_file operation.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=true, so the safety profile is covered structurally, but the description adds nothing: it doesn't explain what 'open' actually does, whether it launches an external process, or what side effects openWorldHint implies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence is technically concise, but it is under-specified rather than efficient—there is no front-loaded useful information to structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an open-world, non-read-only tool with an undocumented required parameter and no output schema, the description supplies none of the information an agent needs to call it correctly or predict its effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one required parameter 'file' with 0% schema description coverage and no type information; the description says nothing about it, so an agent cannot tell whether it expects a path, URL, or identifier.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
'Invoke the open_file operation' only restates the tool name; it does not say what resource is opened, in what sense (OS handler launch, file read, stream), or how it differs from siblings like watch_media or download_media.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance whatsoever on when to call this versus the ten sibling tools (download_media, watch_media, media_downloader_watch, etc.), nor any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
media_downloader_progress_hookProgress hookD
Invoke the progress_hook operation.
| Name | Required | Description | Default |
|---|---|---|---|
| d | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, openWorldHint=true, and destructiveHint=false, so the safety profile is partly covered. The description adds nothing about side effects, what the hook does when invoked, or what it returns; it doesn't contradict annotations, but contributes zero behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with no wasted words, but this is under-specification rather than conciseness. There is no front-loaded information an agent can act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A single-parameter tool with an opaque parameter name, no output schema, and annotations only hinting at open-world non-destructive behavior. The description is far too thin for an agent to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single required parameter is named 'd' with no type and 0% schema description coverage. The description says nothing that would explain what 'd' should contain, leaving the agent unable to supply a meaningful value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description merely restates the tool name as 'Invoke the progress_hook operation,' adding no verb specificity or resource clarification. It doesn't distinguish this from media_downloader_set_progress_callback or explain what a 'progress hook' does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus the closely related media_downloader_set_progress_callback, nor any prerequisites or conditions. The agent must infer everything from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
media_downloader_set_progress_callbackSet progress callbackD
Invoke the set_progress_callback operation.
| Name | Required | Description | Default |
|---|---|---|---|
| callback | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=true, so the description carries a lower burden — yet it adds nothing at all. It does not say that setting a callback mutates downloader state, whether it replaces a previously registered callback, whether it persists, or how the callback is invoked (signature, threading, frequency).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short, but the brevity is under-specification rather than efficiency — a single contentless sentence that front-loads nothing useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one untyped parameter, no output schema, and only minimal annotations, the description should explain what the callback receives and what registering it changes. None of that is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required parameter 'callback' whose schema is an empty object with no type, description, or signature information, and schema description coverage is 0%. This is the one place the description had to compensate, and it says nothing about the expected callback shape.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is a tautology: 'Invoke the set_progress_callback operation' restates the tool name and title without saying what a progress callback is for, what it attaches to, or what it reports. It gives no way to distinguish this from the sibling media_downloader_progress_hook.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when to call this, whether a download must be in flight first, or how it relates to media_downloader_progress_hook and media_downloader_watch. An agent has to guess entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
media_downloader_watchWatchB
Download a video with its captions and extract scene-change key frames.
Returns the bundle manifest: the media, the transcript, the key frames,
and whatever could not be obtained. status is success only when
both captions and frames are present, so a caller can surface a
partial result before reasoning over an incomplete bundle. A degraded
run never raises.
| Name | Required | Description | Default |
|---|---|---|---|
| link | Yes | ||
| max_frames | No | ||
| min_frames | No | ||
| subtitle_langs | No | ||
| scene_threshold | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations (readOnlyHint=false, openWorldHint=true, destructiveHint=false) by disclosing the return manifest shape, the `status` success/partial semantics, and the important trait that a degraded run never raises. That failure-mode disclosure is exactly the kind of thing annotations cannot convey; it stops short of covering on-disk artifacts or network/permission constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then return contract and edge-case behavior. Four sentences, each carrying information, with no filler; the double-backtick emphasis on `status`/`partial` is slightly verbose but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Return semantics are well covered despite no output schema, and the non-raising guarantee is valuable. However, for a five-parameter tool with zero schema documentation, the description leaves the agent unable to set frame limits, language preferences, or scene sensitivity correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across five parameters, and the description adds no meaning to `link`, `max_frames`, `min_frames`, `subtitle_langs`, or `scene_threshold`. It only obliquely implies captions and scene-based frame extraction, so an agent gets no guidance on tuning frame counts or thresholds.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific compound action: download a video with captions and extract scene-change key frames. Clear verb+resource. It doesn't differentiate itself from siblings like media_downloader_download_video, download_media, or watch_media, so an agent must infer that this is the combined media+transcript+frames pipeline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: a caller wanting media, transcript, and key frames together should use this, and can tolerate a partial bundle. There is no explicit 'use this instead of X' or precondition statement, despite three plausible overlapping siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
watch_mediaWatch MediaA
Watch a video: download it with captions and extract key frames.
Returns a manifest describing a bundle on disk - the caption transcript plus scene-change key frames whose filenames carry their timestamp, so what was on screen can be lined up against what was said. Use this to analyse a tutorial, demo, talk, or screen recording rather than merely archive it.
Check status before trusting the bundle: partial means the captions
or the frames are missing, and captions.fallback then names the
audio-transcriber skill to recover a transcript.
| Name | Required | Description | Default |
|---|---|---|---|
| video_url | Yes | URL of the video/media to watch | |
| max_frames | No | Maximum key frames to extract (1-200) | |
| scene_threshold | No | ffmpeg scene-change sensitivity; lower finds more frames | |
| download_directory | No | Directory to save the watch bundle | . |
| subtitle_languages | No | Comma-separated yt-dlp caption language codes | en,en-orig |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does well: it discloses the on-disk bundle layout, that frame filenames carry timestamps, and that `status` can be `partial`. It adds a recovery path via `captions.fallback`. It doesn't mention disk footprint, network/size limits, or whether directories are created, which keeps it off a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then return shape, then caveat. Every sentence carries distinct information, and there is no filler or repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be fully restated, and the description still covers the one thing the schema likely doesn't: the meaning of `status: partial` and the fallback path. An agent has enough to call it and interpret results, with only operational details like disk usage missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all five parameters are already documented, and the description adds no syntax or format detail beyond them. The reference to captions and `captions.fallback` is output-related rather than parameter guidance, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+output: 'Watch a video: download it with captions and extract key frames.' It also explicitly contrasts itself with archiving, which separates it from the download_media / media_downloader_download_video siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use list ('analyse a tutorial, demo, talk, or screen recording') and an implicit exclusion ('rather than merely archive it'), which points at the plain downloader siblings. It stops short of naming the alternative tool explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v4.4.7- First observed
build_watch_skill - First observed
download_media - First observed
list_watch_skills - First observed
media_downloader_download_all - First observed
media_downloader_download_video - First observed
media_downloader_get_channel_videos - First observed
media_downloader_open_file - First observed
media_downloader_progress_hook - First observed
media_downloader_set_progress_callback - First observed
media_downloader_watch - First observed
watch_media
TDQS
Scored across 11 tools
There are near-duplicate pairs: watch_media and media_downloader_watch have essentially identical descriptions, and download_media overlaps with media_downloader_download_video/download_all. The two progress tools (set_progress_callback, progress_hook) are internal callbacks with no distinguishing description, so an agent cannot tell which to call or when.
Names mix a `media_downloader_` prefix (set_progress_callback, download_all, open_file, watch) with bare snake_case (download_media, watch_media, build_watch_skill), and equivalent actions appear under both conventions. Several delegated names are also opaque stubs ('Invoke the download_all operation') that don't follow the descriptive verb_noun style of the others.
11 tools is a reasonable count for the domain, but several slots are wasted on duplicated or internal-only operations (watch vs watch_media, download_all/download_video, progress_hook, open_file). Trimming the redundant entries would leave a tighter, clearer core.
The core loop is covered: list skills, download, watch, build/append skill, plus channel video discovery. However there is no way to delete or remove a skill, no way to inspect a stored skill's contents, and progress/callback plumbing is exposed as tools rather than handled internally.
Maintenance
Related MCP Connectors
One MCP server for all web data. Scrape, search, crawl, and AI research in one install.
8 MCP servers, 104+ tools: memory, social, PDF, email, images, calendar, scheduler, files.
MCP server with quote and live cryptocurrency price tools, local and cloud-deployed transports.
MCP registry & directory: search, find & install 31k+ MCP servers & tools. Catalog and marketplace.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA highly configurable, deployment-ready MCP server with modular architecture for dynamic tool loading and external package support.1-
- FlicenseNot gradedqualityCmaintenanceA multimedia downloading and conversion MCP server supporting YouTube, HLS streams, podcasts, and images, with features like batch downloads, subtitle extraction, format query, and whitelist management.-
- AlicenseCqualityAmaintenanceA production-grade MCP server for managing git projects, offering dynamic tool selection and enterprise-grade security.1203MIT
- FlicenseNot gradedqualityDmaintenanceA production-ready, modular MCP server with 40+ tools across 8 categories, featuring dynamic auto-loading and sandboxed security for file system, database, and network operations.-