Skip to main content

Index and search a local video library using metadata, transcripts, and AI-generated visual descriptions

Project description

TakeSeek

An MCP server that indexes and searches a local video library. It extracts metadata with ffprobe, transcribes audio with faster-whisper, and uses Claude's vision to describe video frames — all searchable via full-text search.

How it works

TakeSeek gives Claude Code tools to manage a video library:

  1. Index — Scans a folder for video files, extracts metadata (resolution, codec, duration), pre-extracts frames, and starts audio transcription in the background
  2. See — Returns pre-extracted frames to Claude Code as images. Claude describes what it sees in each frame — while transcription runs in parallel
  3. Search — Full-text search across transcripts and frame descriptions using SQLite FTS5

The key design choice: there's no separate vision API call. Claude Code is the vision model. The extract_frames tool returns actual images that Claude sees natively, then Claude writes descriptions and saves them with save_frame_descriptions.

Requirements

  • Python 3.10+
  • ffmpeg (for metadata extraction, audio extraction, and frame capture)

Install ffmpeg:

# macOS
brew install ffmpeg

# Ubuntu / Debian
sudo apt install ffmpeg

# Windows
winget install ffmpeg

Install

pip install takeseek

Or from source:

git clone https://github.com/ahumanflourish/takeseek.git
cd takeseek
pip install .

Configure with Claude Code

Add the MCP server to Claude Code:

claude mcp add takeseek -- takeseek-server

To set a default video folder and database location:

claude mcp add takeseek \
  -e FOOTAGE_LIBRARY_PATH=/path/to/your/videos \
  -e FOOTAGE_DB_PATH=/path/to/takeseek.db \
  -- takeseek-server

Environment variables

Variable Default Description
FOOTAGE_LIBRARY_PATH (none) Default directory to scan for videos
FOOTAGE_DB_PATH takeseek.db Path to the SQLite database
FOOTAGE_WHISPER_MODEL base Whisper model size (tiny, base, small, medium, large)
FOOTAGE_FRAME_INTERVAL 30 Seconds between extracted frames

Usage

Once configured, just ask Claude Code to work with your videos:

> Index the videos in /path/to/footage
> Search my videos for "sunset over the ocean"
> What clips mention machine learning?
> Tag clip 3 as "interview"
> Show me what's in clip 5

MCP tools

Tool Description
index_new_files Scan a directory, extract metadata, pre-extract frames, and start background transcription
extract_frames Return pre-extracted frames from a clip as images for Claude to see
save_frame_descriptions Store Claude's descriptions of what it saw in extracted frames
search_footage Full-text search across transcripts and frame descriptions
get_clip_details Get full metadata, tags, transcript, and frame descriptions for a clip
get_transcript Get the full transcript for a clip
browse_folder Browse clips in the library, optionally filtered by folder
index_status Get indexing status, dependency check, and background transcription progress
list_tags List all tags with clip counts
add_tag Add a tag to a clip

Indexing pipeline

The full indexing pipeline runs automatically when you ask Claude to index a folder:

  1. index_new_files scans for videos, extracts metadata with ffprobe, pre-extracts frames to disk, and starts Whisper transcription in a background thread
  2. For each clip, extract_frames returns the pre-extracted frames instantly as images
  3. Claude describes each frame (scene, subjects, actions, lighting, text)
  4. save_frame_descriptions stores the descriptions in the database
  5. Background transcription finishes while Claude works on frame descriptions
  6. Everything becomes searchable via search_footage

Transcription and frame descriptions run in parallel — Claude doesn't wait for Whisper to finish before starting frame descriptions, and Whisper doesn't wait for Claude. This roughly halves the total indexing time.

The first time Whisper runs, it downloads the model (~139 MB for base). This is cached for subsequent runs.

Using with other MCP clients

TakeSeek is a standard MCP server and works with any MCP-compliant client — not just Claude Code. Most tools (search, browse, transcripts, tags) return plain JSON and work everywhere.

The extract_frames tool returns images via MCP's image content type. Your client needs to support image content in tool responses for the frame description workflow to work. This is part of the MCP spec, so most compliant clients should handle it.

CLI

TakeSeek also includes a standalone CLI for indexing without Claude Code:

# Index a folder (metadata + transcription)
takeseek-index /path/to/videos --db takeseek.db

# Metadata only (no transcription)
takeseek-index /path/to/videos --metadata-only

# Skip already-indexed files
takeseek-index /path/to/videos --new-only

# Use a larger Whisper model for better accuracy
takeseek-index /path/to/videos --whisper-model medium

Development

git clone https://github.com/ahumanflourish/takeseek.git
cd takeseek
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest

License

All rights reserved. See LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

takeseek-0.1.0.tar.gz (24.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

takeseek-0.1.0-py3-none-any.whl (22.8 kB view details)

Uploaded Python 3

File details

Details for the file takeseek-0.1.0.tar.gz.

File metadata

  • Download URL: takeseek-0.1.0.tar.gz
  • Upload date:
  • Size: 24.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for takeseek-0.1.0.tar.gz
Algorithm Hash digest
SHA256 02c2b78f54f7b83e0fcbdbf4117727cd29fea6e9725060cd91ec1315ef767a87
MD5 b4a4f0d4381d5fb318671dd2e4082223
BLAKE2b-256 4d77ecddaab486de37a8db5f28cea73481c8ebce99a9ce326345128f09619102

See more details on using hashes here.

File details

Details for the file takeseek-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: takeseek-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 22.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for takeseek-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f8affca36c3e5b73cb42f6755b0aadf0c1c96138281fce1f32c6718b4dab0e82
MD5 001f08b6c3482abec19840cf1eef959b
BLAKE2b-256 c0640697276e4201797b76f4557c939b1aa5401209ed621e56bfb307cf0951e6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page