vdl-mcp
vdl-mcpは、Model Context Protocolを介してAIアシスタントを自身のvdlサーバーに接続します。真の力はWhisperの相乗効果にあります。
ダウンロード → 文字起こし → アシスタントが内容を理解します。
次のように指示できるようになります。
「このYouTube動画をダウンロードして要約してください。」
「あの料理のクリップを取得して、レシピをリストとして書き出してください。」
「このインタビューでXについて何が言われていましたか?」
「この講演の音声をダウンロードして、重要なポイントを教えてください。」
仕組み
これは、vdlのREST APIと通信し、既存のAPIトークンで認証する小さなstdio MCPサーバーです。vdl自体の中では何も実行されません。
ツールグループは安全なデフォルトで切り替え可能です。
グループ | ツール | デフォルト |
読み取り |
| ✅ on |
ダウンロード |
| ✅ on |
文字起こし |
| ✅ on |
削除 |
| ❌ off |
一括 |
| ❌ off |
設定 |
| ❌ off |
無効なグループはアシスタントに表示されません。
Related MCP server: popcorn
必要条件
実行中の**vdl**インスタンス。
MCPトークン: vdlでMCPタブ → トークンを作成し、コピーします。このトークンはスコープ付きです — そこで有効にしたMCPアクションのみを実行できます(書き込み/削除ツールはトグルと読み取り専用モードを尊重し、それ以外はサーバー側で拒否されます)。そのため、汎用のAPIトークンよりも安全です。
インストール
pipxを使用する場合(vdl-mcpがPATHに追加されます):
pipx install git+https://github.com/sphings79/vdl-mcpまたはuvを使用する場合:
uv tool install git+https://github.com/sphings79/vdl-mcpClaude Desktopに接続する
Claude Desktopの設定(claude_desktop_config.json)に以下を追加します:
{
"mcpServers": {
"vdl": {
"command": "vdl-mcp",
"env": {
"VDL_URL": "http://localhost:8000",
"VDL_TOKEN": "your-api-token"
}
}
}
}Claude Desktopを再起動すると、vdlツールが表示されます。(MCP対応のクライアントはすべて同様に動作します。vdl-mcpコマンドをstdio経由で実行するだけです。)
Dockerで実行する
コンテナがお好みですか?GHCRに公開済みのビルド済みイメージがあります — コマンドとして使用します:
{
"mcpServers": {
"vdl": {
"command": "docker",
"args": ["run", "-i", "--rm",
"-e", "VDL_URL", "-e", "VDL_TOKEN",
"ghcr.io/sphings79/vdl-mcp:latest"],
"env": {
"VDL_URL": "http://host.docker.internal:8000",
"VDL_TOKEN": "your-api-token"
}
}
}
}-i(stdio用に標準入力を開いたままにする)オプションと、vdlが同じホストで実行されている場合、host.docker.internal(コンテナが到達できるようにする)に注意してください。
Web UIはありません — 設計上の意図
vdl-mcpは、MCPクライアントによってローカルで起動されるstdioプロセスです。ネットワークポートを開かないため、ログインページもfail2banもありません — 受信を保護するものは何もありません。そのセキュリティモデルは次の通りです:APIトークンを非公開に保ち、破壊的なツールをオフにして(デフォルト)、必要に応じてドメイン許可リストを設定します。認証とブルートフォース攻撃の保護はvdl自体にあります。(リモートのマルチクライアントHTTPサーバーが必要な場合は、別のトランスポートです — issueを開いてください。)
ツール
resolve(url)— リンクを分析し、アイテムと利用可能な品質を一覧表示します(ダウンロードはしません)。download(url, audio=False, section="", wait=True)— 最高品質(またはMP3)でダウンロードします。sectionは0:30-1:00のようにクリップを指定します。waitは完了したファイルのnameを返します。transcribe(name, language="")— Whisperによる文字起こし → テキストを返します(vdlでWhisperモデルが設定されている必要があります)。get_transcript(name)— 既存の文字起こしのテキストを返します。list_files(query, service, label, limit)— ダウンロードを閲覧します。job_status(job_id)— ダウンロードジョブの状態を確認します。(デフォルトでオフ)
delete_file,bulk,get_settings。
設定(環境変数)
変数 | デフォルト | 意味 |
|
| vdlインスタンスのベースURL |
| (空) | vdl MCPトークン(MCPタブから) |
|
| キルスイッチ:読み取りツールのみ公開(ダウンロード/文字起こし/削除/一括は不可) |
|
| resolve/list/status/get_transcript |
|
| download |
|
| transcribe |
|
| ファイルの削除 |
|
| 一括操作 |
|
| 設定の読み取り |
| (未設定) | ツールごとのオーバーライド(例: |
| (空 = すべて許可) | アシスタントがダウンロードを許可されるホストのサフィックス(カンマ区切り) |
|
| デフォルトのリクエストタイムアウト(秒) |
すべてのツールは、説明内に**[読み取り]、[書き込み]、[削除]**のタグが付いており、あなたとアシスタントの両方が一目でリスクを認識できます。
vdlのWeb UIからも管理できます: vdlで設定 → MCPタブに移動し、各ツールを切り替えます(読み取り専用マスタースイッチとリスクチップ付き)。vdl-mcpは起動時にその設定を取得するため、環境変数は不要です。変更後はvdl-mcpを再起動してください。ツールが公開されるかどうかの優先順位:読み取り専用(環境変数またはUI)→ ツールごとの環境変数オーバーライド → Web UI → グループフラグ。
セキュリティに関する注意
アシスタントはあなたのトークンを通じてあなたとして動作します — 非公開に保ってください。
破壊的なツールはデフォルトでオフです。 意識的に有効にしてください。
アシスタントのリクエストに応じて任意のURLをダウンロードすることは、プロンプトインジェクションの表面になります。
VDL_MCP_DOMAIN_ALLOWLIST(例:youtube.com,instagram.com)を設定して制限してください。自分が所有している、またはダウンロードする権利/許可があるコンテンツにのみ使用してください — vdlと同じ免責事項が適用されます。
ライセンス
GNU Affero General Public License v3.0(AGPL-3.0) — LICENSEを参照してください。© 2026 sphings79
Available Tools
6 toolsdownloadA
[writes] Download a video or audio from a URL into vdl (best quality).
audio=True downloads MP3 (audio only).
section like '0:30-1:00' clips a part.
wait=True (default) waits for completion and returns the resulting file 'name' (use it with transcribe/get_transcript). wait=False returns immediately with a job_id.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| wait | No | ||
| audio | No | ||
| section | No | ||
| timeout_seconds | No |
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 burden. It discloses that the tool writes to 'vdl' (a local directory), that wait=True blocks and returns a file name, and wait=False returns a job_id. It does not mention potential overwrites, rate limits, or auth requirements, but the core behavior is well covered.
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?
The description is concise and front-loaded: a single sentence defining purpose, followed by bullet points for details. Every sentence adds value, and the structure is easy to parse.
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?
Given the tool has 5 parameters and an output schema, the description covers purpose, usage, and most parameters. It interacts well with sibling tools. The only oversight is the timeout_seconds parameter, but overall it is sufficiently complete for an agent to select and invoke the tool 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?
With 0% schema description coverage, the description must compensate. It explains url (implicit), wait, audio, and section with examples. The only missing parameter is timeout_seconds, which is not addressed. This is a minor gap given the overall clarity.
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 clearly states the tool's purpose: 'Download a video or audio from a URL into vdl (best quality).' It uses a specific verb and resource, and distinguishes itself from sibling tools like transcribe and get_transcript by mentioning their interaction.
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 provides explicit guidance on when to use wait=True vs wait=False, and how to combine with transcribe/get_transcript. It also explains audio and section options. However, it does not explicitly state when not to use this tool or mention alternatives like job_status for tracking wait=False jobs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transcriptA
[read] Return the transcript text (.txt) of a downloaded file, if it has been transcribed. If none exists yet, tells you to run transcribe(name) first.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It clearly states the tool is a read operation ('[read]') and describes the conditional behavior (returns text or instructs to transcribe). However, it does not detail the return format or what happens if the file hasn't been downloaded, missing some transparency.
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?
The description is extremely concise, using two short sentences to convey the purpose, condition, and fallback instruction. No words are wasted, and the structure front-loads the key action.
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?
Given the tool has only one parameter, no annotations, but does have an output schema, the description is nearly complete. It covers the core behavior and prerequisite. It lacks some context about error states or file existence requirements, but for a simple tool, this is sufficient.
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 description adds meaning to the single required parameter 'name' by implying it must refer to a downloaded file that has been transcribed. Although schema coverage is 0%, the description compensates by providing context for the parameter's expected value. Without additional detail like format or examples, it cannot score a 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?
The description clearly states the tool returns transcript text from a downloaded file, using a specific verb ('Return') and resource ('transcript text (.txt)'). It also distinguishes itself by mentioning the prerequisite condition, which differentiates it from sibling tools like 'download' and 'transcribe'.
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 explicitly tells the user when to use the tool ('if it has been transcribed') and when not to use it ('If none exists yet, tells you to run transcribe(name) first'). This provides clear context and an alternative action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_statusA
[read] Status of a download job by id, or the list of all current jobs if no id is given.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the dual behavior (by id or all) and that it is read-only (via '[read]'). However, it does not explain what happens when job_id is invalid, whether results are paginated, or what state jobs can be in. Adequate but not thorough.
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?
The description is a single sentence, with no wasted words: it states the operation type, resource, and conditional behavior concisely. Perfectly front-loaded and efficient.
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?
Given the tool has one optional parameter, no output schema, no annotations, and low sibling relatedness, the description covers the core mechanism. But for a listing tool, it could mention what fields each job status entry contains, whether results are sorted, or any rate limits. It is minimally complete.
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 0%, so description must compensate. The description explains the 'job_id' parameter's role: if provided, returns status for that job; if empty/omitted, returns all jobs. This adds significant meaning beyond the bare schema—specifically the default behavior. However, it doesn't specify format constraints or validation rules for the id string.
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 starts with '[read]' which clearly signals a read operation, and then states the tool checks status by id or lists all jobs. This distinguishes it from siblings like 'download' or 'transcribe' which are clearly different operations.
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 implies use when needing job status or listing current jobs, but does not explicitly say when to use alternatives or when not to use it. No exclusions or sibling comparisons are provided, leaving the agent to infer context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_filesA
[read] List downloaded files in vdl. Optional filters: query (name/label substring), service (e.g. youtube), label. Returns name, size, duration, labels, in_feed.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | ||
| limit | No | ||
| query | No | ||
| service | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well. It explicitly marks the tool as a read operation with '[read]', lists return fields (name, size, duration, labels, in_feed), and mentions all filters. This fully informs the agent of the tool's behavior and output.
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?
The description is a single sentence, front-loaded with the read indicator and core action. Every piece of information earns its place: operation type, resource, filters with examples, and return fields. 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?
Given the output schema exists, the description does not need to detail return values further. It covers filters, operation type, and a general resource overview. I deduct 1 point because the 'limit' parameter is not explained, though its default is visible in the schema; with 0% schema coverage, a brief mention would make it fully complete.
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%, so the description must compensate. It does so by explaining that 'query' is a substring for name/label, 'service' is exemplified with 'youtube', and 'label' is a filter. 'limit' is not mentioned explicitly but has a default visible in schema, and its purpose is inferable. The description adds substantial meaning beyond the raw schema.
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 clearly states 'List downloaded files in vdl' with a specific verb and resource. It also lists optional filters (query, service, label) and return fields, distinguishing it from sibling tools like get_transcript or download.
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 says 'Optional filters' and lists them, giving clear context for when to use each filter. However, it does not explicitly mention when not to use this tool versus alternatives, though the read nature and filters are clear enough for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolveA
[read] Analyze a link and list the available media items and qualities — WITHOUT downloading.
Use this to preview what a URL contains before calling download.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description uses '[read]' to indicate a read-only operation, and explicitly states 'NOT downloading' and 'analyze a link... WITHOUT downloading.' This provides behavioral clarity about the tool being non-destructive. Since no annotations are provided, the description carries the full burden; it does so well but could add details like whether it requires authentication or has rate limits.
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 sentences, zero filler. The first sentence defines purpose and behavior; the second provides usage guidance. Every word earns its place. No redundancy or unnecessary details.
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?
Given the tool's simplicity (1 required param, no enums, output schema present), the description covers the core purpose, read-only behavior, and relationship to siblings. It lacks mention of what the output schema contains, but since an output schema exists, the agent can infer return structure. Could justify a 5 as complete for a simple tool, but 4 acknowledges minor gaps like authentication preconditions.
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 description says 'analyze a link' which implicitly tells the agent that the single parameter 'url' is a link to analyze. This adds semantic meaning beyond the bare schema, which only defines 'url' as a string. With schema description coverage at 0%, the description compensates well, though it could be more explicit about the expected URL format (e.g., HTTP/HTTPS, supported domains).
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 clearly states the tool analyzes a link and lists available media items and qualities without downloading. The verb 'analyze' and noun 'link' are specific, and the description differentiates it from 'download' by explicitly noting it does NOT download. However, it could be more precise about what 'media items' means (e.g., video/audio tracks, formats).
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 explicitly states when to use this tool: 'preview what a URL contains before calling download.' It provides a clear exclusion: 'WITHOUT downloading.' The last sentence directly advises the agent to use this tool before the 'download' sibling, giving strong usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcribeA
[writes] Transcribe a downloaded file locally with Whisper and return the text.
'name' is the downloads-relative path from list_files/download (e.g. 'youtube/clip.mp4'). Requires a Whisper model set in vdl (Settings → Transcription). Can take a while.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| language | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description bears full responsibility for disclosing behavior. It notes '[writes]' (suggesting mutation), requires a Whisper model, and mentions variable runtime. However, it fails to clarify side effects (e.g., file creation?), error handling, idempotency, or safety aspects. This leaves significant gaps in behavioral understanding for an agent.
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?
The description is three sentences long, front-loading the purpose first, then parameter clarification, then prerequisite and performance note. Every sentence contributes distinct value with no redundancy or fluff.
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?
Given the sibling tools (list_files, download, get_transcript), the description fits well into a transcription workflow. It explains the prerequisite (Whisper model), the path convention, and the time cost. Minor omission: it could explicitly state that the file must already be downloaded via the download tool, but the phrase 'downloaded file' and the path example imply this. The output schema exists, so return value documentation is not needed. Overall very helpful for an agent.
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%, requiring the description to explain all parameters. It adequately explains the 'name' parameter (downloads-relative path with example), but entirely omits the 'language' parameter (schematype: string, default: ''). With only one of two parameters described, the description adds only partial value beyond the schema.
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 clearly states the action: 'Transcribe a downloaded file locally with Whisper and return the text.' It specifies the verb (transcribe), resource (downloaded file), method (Whisper locally), and output (text). This distinguishes it from sibling tools like get_transcript (which likely retrieves existing transcripts) or list_files/download.
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 provides context: it requires a Whisper model set in settings and warns that it can take a while. This gives implicit usage guidance, but it does not explicitly state when to use this tool over alternatives (e.g., get_transcript) or list conditions where it should not be used. The guidance is adequate but not comprehensive.
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.
6 tool updates
v0.1.0- First observed
download - First observed
get_transcript - First observed
job_status - First observed
list_files - First observed
resolve - First observed
transcribe
TDQS
Scored across 6 tools
Each tool has a clearly distinct purpose: preview (resolve), download (download), monitor jobs (job_status), list files (list_files), transcribe (transcribe), and fetch transcript (get_transcript). No functional overlap.
All names use snake_case and are readable, but the pattern varies: verb_noun (list_files, get_transcript), verb (resolve, download, transcribe), and noun_noun (job_status). Mostly consistent but not a single pattern.
Six tools cover the full preview-download-monitor-list-transcribe workflow without being excessive. Each tool serves a necessary function in the pipeline.
Core lifecycle is fully covered: preview, download, job monitoring, file listing, transcription, and transcript retrieval. Minor gaps like deleting files or canceling jobs are missing, but the essential workflow is complete.
Maintenance
Related MCP Connectors
MCP server for Google Veo AI video generation
MCP server for Wan AI video generation
MCP server for Hailuo (MiniMax) AI video generation
MCP server for RiverScript, an AI transcription platform - fetches transcripts shared via a link.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceMCP server enabling AI agents to generate AI videos and images, analyze video content, and download videos from Douyin and Xiaohongshu.-
- AlicenseAqualityDmaintenanceAn MCP server that enables AI agents to analyze videos locally by extracting transcripts, detecting scene changes, and returning key frames.57MIT
- AlicenseNot gradedqualityAmaintenanceMCP server that enables AI agents to watch and analyze videos from 1800+ sources, with persistent indexing, OCR, transcription, and a self-verification loop for debugging.MIT
- AlicenseNot gradedqualityCmaintenanceA self-hosted media downloader and converter MCP server that wraps yt-dlp and HandBrake, allowing AI assistants to download, convert, manage queues, and handle subscriptions.MIT