Help us improve
Share bugs, ideas, or general feedback.
From obsidian-vault-agent
Extracts YouTube video transcripts and metadata, then creates a vault note with synthesized content. Triggers on any YouTube URL or phrases like "summarize this video."
npx claudepluginhub tuan3w/obsidian-vault-agent --plugin obsidian-vault-agentHow this skill is triggered — by the user, by Claude, or both
Slash command
/obsidian-vault-agent:youtube <youtube-url><youtube-url>This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
<Purpose>
Pull a YouTube video transcript into a queryable markdown vault with yt-dlp subtitle discovery, VTT cleanup, metadata frontmatter, and capture-seed stubs.
Extracts YouTube transcripts/metadata, generates Korean summaries/insights Markdown docs, tests comprehension with 9 tiered quizzes (easy/medium/hard), and enables deep research follow-ups.
Fetches YouTube video transcripts and repurposes content into summaries, blog posts, social posts, quotes, or show notes. Activates when a user pastes a YouTube URL.
Share bugs, ideas, or general feedback.
<Use_When>
<Do_Not_Use_When>
<Execution_Policy>
Parse the YouTube URL/ID from $ARGUMENTS. If no URL provided, ask the user.
Run the extraction script. Redirect stdout to a temp file (stderr has progress messages that break piping):
SKILL_DIR="${CLAUDE_SKILL_DIR}"
YT_OUTPUT="$SKILL_DIR/_output.json"
uv run "$SKILL_DIR/scripts/fetch_youtube.py" "VIDEO_URL" --lang en > "$YT_OUTPUT"
Then read $YT_OUTPUT with the Read tool to get the JSON. Clean up the file after use.
The JSON contains:
title, channel, duration, upload_date, description, chapterstranscript.full_text, transcript.segments, transcript.languagetranscript.error (null if success)If transcript.error is not null: inform the user and stop. No note without content.
If transcript is very long (>50,000 chars): warn the user this is a long video. Chunk the transcript for the agent if needed — send first 40,000 chars with a note about total length. For very long videos (>2hrs), consider suggesting the user watch key sections instead.
Read the agent definition:
Read("${CLAUDE_SKILL_DIR}/agents/video-noter.md")
Search the vault for existing notes related to the video's topics using the MCP tool:
search_notes(query="KEYWORD", limit=20)
Or fall back to Grep if MCP is unavailable:
Grep(pattern="KEYWORD", path="notes/", glob="*.md", head_limit=20)
Launch the video-noter agent:
Agent(
subagent_type="general-purpose",
model="sonnet",
run_in_background=false,
prompt="You are Video Noter. Follow these instructions exactly:
[INSERT FULL CONTENT OF agents/video-noter.md HERE]
VIDEO METADATA:
- Title: [title]
- Channel: [channel]
- Duration: [duration]
- Upload date: [upload_date]
- Chapters: [chapters if any]
- Description: [first 500 chars of description]
EXISTING VAULT NOTES ON RELATED TOPICS:
[List any matching notes found in grep]
TRANSCRIPT:
[full_text or chunked text]
Produce the note body following the Output Format. Do NOT include frontmatter —
only the body starting from the # title line."
)
date +%Y%m%d%H%M%S
Format the upload_date for frontmatter (YYYYMMDD → YYYY-MM-DD)
Check for duplicate notes:
grep -rl "VIDEO_TITLE" notes/ --include="*.md" | head -5
---
id: YYYYMMDDHHMMSS
type: post
processing_status: inbox
author: Channel Name
link: "https://www.youtube.com/watch?v=VIDEO_ID"
created_date: YYYY-MM-DD
updated_date: YYYY-MM-DD
---
[AGENT OUTPUT HERE — starts with # title and 🏷️Tags line]
Place the note in notes/ under the most appropriate topic subfolder:
notes/ml/notes/startup/notes/finance/notes/design/notes/psychology/notes/<Tool_Usage>
<Escalation_And_Stop_Conditions>
$ARGUMENTS