youty-mcp
Local MCP server that exposes the Youty vault's vector index to any MCP-compatible AI (Claude Desktop, Claude Code, Cursor).
What it does
Seven tools, hybrid dense + BM25 retrieval over your captured YouTube / Instagram / TikTok videos, plus joint text → frame retrieval via Google's SigLIP-Base-Patch16-224 (Apache-2.0). Queries land in ~300 ms for text, ~32 ms warm for frames on Apple Silicon.
| Tool | Returns |
|---|---|
search(query, k=15, platform?, since_iso?) |
hybrid dense + BM25 + RRF over transcript chunks; top-k results with frame paths + video_md_path |
search_frames(query, k=10, platform?) |
SigLIP-Base joint text→image; top-k frame matches with parent video metadata |
get_transcript(video_id) |
full video.md + parsed frontmatter — the whole video into context |
get_video(video_id) |
frontmatter + folder listing + frame paths |
view_frames(video_id, frame_ms?, max_frames=6) |
the frame JPEGs themselves, as MCP image content — viewable in any client |
list_videos(platform?, channel?, limit=100) |
newest-first listing |
find_similar(video_id, k=10) |
nearest videos by averaged body-chunk vectors |
The loop: search finds the relevant moments → get_transcript pulls the
words into context → view_frames loads the matching frames into the model's
vision. search / search_frames also return raw frame paths, but only
Claude Code can open a path itself — view_frames returns the images inline, so
the visual half of the loop works in Claude Desktop, Cursor, and Claude Code
alike.
On-screen text. search covers both what a video said and what it
showed: each result's chunk.type is body/description/header (spoken +
metadata) or frame_text — text recognized on-screen via on-device OCR
(slides, code, terminal output, labels). A frame_text hit means the answer was
visible in the video; pair it with view_frames to see that moment.
Install
cd youty-mcp
uv sync # creates .venv, installs deps
Dependencies: mcp, cryptography, sqlite-vec, httpx, numpy, tokenizers,
huggingface-hub, sentencepiece, protobuf, and coremltools (macOS only).
Python ≥ 3.11. No PyTorch or Transformers: existing tokenizer engines prepare
queries directly, and all inference runs through Core ML. Tokenizer assets use
fixed revisions to preserve compatibility with the existing vault index.
Text + frame search: 100% on-device — no key, zero config
The server embeds each query on-device with the same Core ML models the index
was built with — Google's EmbeddingGemma (text) and the SigLIP-Base text tower
(frames) — so query and document vectors share one space. Inference is CPU-only
via coremltools to match the int8-quantized indexer. No key, no provider
option, no cloud call of any kind.
The models are not a ~1.6 GB HuggingFace download. They come from Youty's own
release asset (youty-models-<ver>.tar.gz, a few hundred MB of Core ML),
fetched once and verified by SHA-256, then cached under:
~/.cache/youty/coreml-models/<version>/
One-time per machine; every query after that is fully offline. Hot-path embed is
~300 ms for text and ~32 ms for frames on Apple Silicon. (Set
YOUTY_COREML_MODELS_DIR to point at a local .mlpackage tree in dev/CI.)
Wiring it into your AI client
One command wires every MCP client on this Mac:
uvx youty-mcp@latest install
It detects Claude Code, Claude Desktop, Cursor, Codex, Gemini CLI, Windsurf,
Continue, Cline, Antigravity, and Grok CLI, then merges a youty entry into each client's
config — preserving your other settings, idempotent (safe to re-run), and
reversible with uvx youty-mcp@latest uninstall. The entry points at the
absolute path of uvx so GUI apps (which launch with a stripped-down PATH)
reliably find it. Useful variants:
uvx youty-mcp@latest install --list # every supported client + its config path
uvx youty-mcp@latest install cursor # wire just one client
uvx youty-mcp@latest uninstall # remove Youty from all detected clients
Why a command and not a button in the Youty app? The Mac app is sandboxed, so it can't edit other apps' config files or run their CLIs. This installer ships in the (non-sandboxed)
youty-mcppackage, which can. Bareuvx youty-mcp@lateststill runs the MCP server itself — that's what the clients launch.
Editors whose config allows comments (Zed → a context_servers entry in
~/.config/zed/settings.json, VS Code → an mcp.servers entry) aren't auto-wired —
rewriting them could strip your comments — so add Youty there by hand using the
command/args shown below.
Prefer to wire a client by hand? The exact per-client config follows.
Claude Desktop wiring
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"youty": {
"command": "uvx",
"args": ["youty-mcp@latest"]
}
}
}
The @latest pin means uvx fetches the newest published youty-mcp on each
launch — so a normal restart always loads the current server with no manual
uv tool upgrade. (The Mac app auto-updates via Sparkle and the CLI via
Homebrew, so the whole stack stays in step on its own.)
Restart Claude Desktop. Then ask: "What are best practices on creating AI influencers, and what tools should I use? Use my Youty vault."
Claude Code wiring
claude mcp add youty -- uvx youty-mcp@latest
Tests
uv run pytest -q
YOUTY_TOKENIZER_PARITY=1 uv run pytest -q tests/test_query_tokenizers.py
YOUTY_COREML_SMOKE=1 uv run pytest -q tests/test_coreml_inputs.py
uv run python tests/smoke_live.py # one-shot live on-device search smoke
The Core ML smoke check requires macOS and the model assets. It exercises both
query encoders repeatedly and waits for deferred native cleanup, catching crashes
that token-only tests cannot detect. Set YOUTY_COREML_MODELS_DIR to a local
model directory when testing without the normal download cache.
Index location
Default: the Mac app's sandboxed index at
~/Library/Containers/dev.leget.youty/Data/Library/Application Support/Youty/index.db,
falling back to ~/Library/Application Support/Youty/index.db if that isn't
present. Override either with YOUTY_INDEX_DB=/abs/path.
The Mac app writes here when it saves a video (background, non-blocking).
The MCP server reads here and promotes data to sqlite-vec and FTS5
virtual tables at startup.
The index is rebuildable from the vault's video.md files alone —
losing it is recoverable, never catastrophic. Use the Mac app's Settings
window → "Re-index entire vault", or run headless:
"/path/to/youty.app/Contents/MacOS/youty" --reindex "/path/to/vault"
"/path/to/youty.app/Contents/MacOS/youty" --index-frames "/path/to/vault"
Troubleshooting
searchreturns 0 results — the index is empty. Save a video from the Mac app (indexer enabled in Settings) or run--reindexon an existing vault. No key needed — text indexing is on-device by default.- First
search/search_framesis slow — the Core ML models asset downloads once (youty-models-<ver>.tar.gz, a few hundred MB, SHA-verified) into~/.cache/youty/coreml-models/and the encoders load lazily. Subsequent queries are ~300 ms (text) / ~32 ms (frames). - Legacy bundles with 4-digit-second JPEG names (
0717.jpg) are silently skipped by frame indexing. The current contract is 8-digit milliseconds (00718000.jpg). Re-saving the video regenerates frames in the new format. - Vault location unknown error from
get_transcript— the indexer records the vault path; if you've changed it, run--reindexonce against the new path soindex_meta.vault_rootupdates.
Metadata
Release files for youty-mcp 1.4.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| youty_mcp-1.4.8.tar.gz | 44.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| youty_mcp-1.4.8-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 94.4 kB
Release files / youty_mcp-1.4.8.tar.gz
| Download URL | youty_mcp-1.4.8.tar.gz |
|---|---|
| Size | 44.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6bc7e8f48c0c4c7f2451e2efb4a2dc52badb565acbe3e4f9874511ee91cae0a5
|
|
BLAKE2b-256 checksum How to use checksums |
8dab1f3704f9a898cc4bcceda21d999417d6a1bf2be07d013eee3d80470a33ac
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / youty_mcp-1.4.8-py3-none-any.whl
| Download URL | youty_mcp-1.4.8-py3-none-any.whl |
|---|---|
| Size | 50.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f1b7045bb337f45190a483b77fd7c4723220e137ca14e0098bd96666a09ee02c
|
|
BLAKE2b-256 checksum How to use checksums |
6a294ce97a8b695ddcd021992b29f1247ce048b1195ff399f9ef4147c37c084a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|