An MCP server that turns your Instagram saved posts and X bookmarks into text an agent can search. Agent only. There is no UI.
Instagram saved folder, or X bookmarks
| fetched through the private web APIs
| (cookies from your logged in browser)
+-- audio --> Whisper on GPU --> transcript
+-- images --> tesseract OCR, then a vision
| pass over the local claude CLI
v
SQLite at ~/.cache/filmroom/transcripts.db
|
v
search: FTS5 keyword plus bge-small-en-v1.5 vectors,
merged by reciprocal rank fusion
|
v
your agent over MCP
Whisper uses CUDA libraries from the installed nvidia pip wheels. Set FILMROOM_CACHE to store the database somewhere else.
One command. Needs Python 3.10 or newer, git, and Claude Code.
curl -fsSL https://raw.githubusercontent.com/nethum529/Filmroom/main/scripts/install.sh | shIt clones the repo to ~/.local/share/filmroom, installs the server into its own virtual environment, registers it with Claude Code, and runs a health check. Safe to run again over an existing install.
You also need tesseract and ffmpeg:
sudo apt install tesseract-ocr ffmpeg~/.local/share/filmroom/scripts/update.shIt fast forwards to origin main and reinstalls only what changed. It never touches your cache. It refuses to run if you have local changes. Restart Claude Code after updating.
Log into instagram.com and x.com in a Firefox family browser. Zen works. The server reads that profile's session cookies. No API keys.
The vision pass runs the local claude CLI. Be logged into Claude Code on the same machine.
The installer registers the server for you. To register a checkout by hand instead:
claude mcp add filmroom -s user /path/to/Filmroom/.venv/bin/filmroom| Tool | Purpose |
|---|---|
| get_transcript | Text of one post URL: caption, transcript, slide text. |
| get_transcripts_from_page | Text for every post on a saved folder or profile page. |
| list_saved_folders | Instagram saved folders with names, ids, and counts. |
| index_saved_folder | Index one folder, or "all" for the whole library. |
| list_x_bookmark_folders | X bookmark folders, if the account has them. |
| index_x_bookmarks | Index all X bookmarks, or one folder by name. |
| run_vision_pass | Describe post images with the local claude CLI. |
| search_cache | Keyword, semantic, or hybrid; a folder name narrows results. |
| get_post | Small brief: summary, up to 5 key points, quotes, section map. |
| get_post_section | One named section in full, never summarized. |
| get_post_slide | One carousel slide by number: alt text, OCR, vision text. |
| get_post_segments | Timestamped speech segments for one video post. |
| reindex_search | Rebuild keyword and vector indexes after new posts arrive. |
| health_check | Report on ffmpeg, tesseract, CUDA, cookies, and the database. |
index_saved_folder("all") keeps every post's folder ids, so search_cache can filter by saved folder across the whole library.
get_post is small on purpose. A 12 slide carousel holds about 28000 characters; its brief is about 800. Read the brief first, and call the section tools only when you truly need the full text.
- X bookmark folders are often not available. The API returns an authorization error for them. In that case index_x_bookmarks indexes all bookmarks instead and says so.