reel-relay
Allows ingestion of Instagram reels via iOS share sheet or DM webhook, downloading and processing the reel to extract transcript and sampled frames.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@reel-relaywhat's in the reel I just shared?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
reel-relay
Forward an Instagram reel to Claude the same way you send it to a friend - then have Claude watch it, research it, and build what it shows.
Ever be doomscrolling reels, hit one with a genuinely good idea - for me it's usually some insane UI demo - and I think "I want Claude to build a demo"... but you can't be bothered to pause, transcribe it, and explain it? So you save it to the graveyard folder you'll never open again.
reel-relay closes that gap. Share the reel to your self-hosted endpoint (a Telegram bot, an iOS Shortcut, or an Instagram DM), and it lands in Claude as a timestamped transcript plus sampled video frames - so Claude can actually "watch" it and you can just say "what's in the reel I just shared?" Then take it further: "research whether this tactic would work for my project" or "build the thing in that reel."
The share gesture you already use 20 times a day - now one of the recipients is Claude.
How it works
phone: Telegram bot · iOS Shortcut · Instagram DM
│ POST /ingest {url} (X-Ingest-Secret)
▼
your server (localhost or a free cloud VM)
├─ yt-dlp → download the reel (≤720p mp4)
├─ ffmpeg → ~30 deduplicated keyframes (JPEG, 512px wide)
├─ captions → else Groq whisper-large-v3 → timestamped transcript
└─ SQLite + frames on disk (the video itself is deleted)
│
▼
FastMCP server (streamable HTTP, same process)
│ get_reel() → transcript + frames as MCP images
▼
Claude (web · desktop · mobile · Claude Code) via a custom connectorEverything runs in one Python process you host yourself. Claude reaches it as a standard MCP custom connector - the reel's transcript arrives as text and its frames arrive as images, so Claude sees both what's said and what's shown.
Related MCP server: video-reader-mcp
Features
Multiple ways to ingest - forward a reel to a Telegram bot (easiest, works on iOS and Android, no app review), an iOS share-sheet Shortcut, or an Instagram DM webhook.
Claude actually "watches" the video - timestamped transcript + evenly-sampled, deduplicated frames delivered as MCP image content.
Three MCP tools tuned so Claude knows to grab "the reel I just shared" with zero ceremony.
Free transcription via Groq's
whisper-large-v3(falls back to it only when a reel has no captions).Runs anywhere - your Mac, a Raspberry Pi, or a free-forever cloud VM. Binds to localhost; you expose it through a tunnel, so no ports are opened to the world.
Self-healing & tiny - the video is never stored (~0.6 MB of frames per reel), the disk auto-prunes, and the service auto-restarts.
MCP tools
Tool | What it does |
| Browse recently shared reels (id, title, transcript preview). |
| Watch a reel - full timestamped transcript + sampled frames. No |
| Zoom into a specific time window for more visual detail. |
Quickstart (self-host in ~10 minutes)
Requirements: Python 3.11+, uv, ffmpeg, and a free
Groq API key. A cloudflared
or Tailscale tunnel to expose it, and a Claude account with custom connectors.
git clone https://github.com/siemd2/reel-relay.git
cd reel-relay
# system deps (macOS shown; Linux: apt install ffmpeg)
brew install ffmpeg uv
uv sync # install Python deps
make secrets # generate INGEST_SECRET + MCP_PATH_TOKEN into .env
# add your Groq key: echo 'GROQ_API_KEY=gsk_...' >> .env (or edit .env)
make test # offline tests - synthesizes a clip with ffmpeg, no network
make dev # start the server on http://127.0.0.1:8787Expose it & connect Claude:
# quickest tunnel for testing (random URL, no domain needed):
cloudflared tunnel --url http://localhost:8787
make mcp-url # prints your connector URL: https://<tunnel-host>/mcp-<token>/mcpAdd that URL in Claude → Settings → Connectors → Add custom connector. No OAuth - the long random path segment is the credential, so treat the URL as a secret.
Share reels to it. Easiest is a Telegram bot — works on iOS and Android, no app review, ~2-minute setup: docs/telegram.md. Prefer something else? An iOS share-sheet Shortcut or the Instagram DM webhook. Then: share/forward a reel → open Claude → "what's in the reel I just shared?"
Run it 24/7 for free (always-on cloud)
Instagram rate-limits datacenter IPs, so the download step wants a "residential-looking" connection - but in practice a free-tier cloud VM works fine for personal volume. The setup the author runs (≈$0/month, survives reboots, independent of your laptop):
Free VM - Oracle Cloud Always Free (
VM.Standard.E2.1.Micro), or any small Linux box.Deploy -
uv sync, drop your.env, install theops/reel-relay.servicesystemd unit (systemctl enable --now reel-relay), and add the hourlyops/cleanup.shcron.HTTPS with no open ports - Tailscale Funnel:
tailscale funnel --bg 8787gives you a permanenthttps://<machine>.<tailnet>.ts.netURL that routes inbound through Tailscale's edge (the VM never exposes a public port; the app stays bound to localhost). Register that URL +/mcp-<token>/mcpas your connector.
On macOS instead, make launchd-install keeps the server + a Cloudflare tunnel running at login.
Configuration
All settings come from environment variables (see .env.example):
Var | Required | Purpose |
| for transcription | Groq key for |
| ✅ | Shared secret the |
| ✅ | Long random segment in the MCP URL - the connector's only auth. |
| optional | Storage location and bind address (defaults: |
| optional | Reuse a browser's Instagram session for reels that require login. |
make secrets fills the two required secrets for you.
Security
The server binds
127.0.0.1only; the tunnel is the sole path in./ingestand the debug endpoints require theX-Ingest-Secretheader (constant-time compared).The MCP endpoint is guarded by a long random path token - the connector URL is a secret.
Interactive API docs (
/docs,/openapi.json) are disabled since the app faces the internet.Videos are never persisted;
data/and.envare gitignored.
Roadmap
Not sure, will evolve with needs.
Contributions welcome - open an issue or PR.
How it's built
Python 3.11+ · FastAPI · FastMCP (streamable HTTP) · yt-dlp · ffmpeg · Groq whisper-large-v3 · SQLite · uv. One process, no external database, no build step.
License
MIT - do anything you like; self-host your own.
This server cannot be deployed
Maintenance
Related MCP Connectors
Turn a TikTok/Instagram/YouTube link into text for your AI: metadata, transcript and image OCR.
The AI influencer MCP for Claude: research trends and write reel scripts, render in the app.
Instagram data for AI agents: profiles, posts, reels, followers. Influencer + brand research.
Search your saved videos by what was said. YouTube, Reels, and TikTok transcripts. Read-only.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceEnables sending and receiving Instagram Direct Messages, managing conversations, downloading media, viewing user profiles and stories, and interacting with posts through natural language in Claude.MIT
- AlicenseNot gradedqualityDmaintenanceEnables Claude to read and watch online videos (YouTube, TikTok, Douyin, Facebook, Instagram) by pasting a link, providing summaries, transcripts, frame analysis, and metadata.MIT
- AlicenseAqualityDmaintenanceEnables AI agents to browse Instagram Reels by automating login, scrolling, and extracting structured metadata such as URL, creator, caption, likes, comments, and audio.71MIT
- AlicenseNot gradedqualityDmaintenanceTransforms social media links (TikTok, Instagram, YouTube) and videos into text context with transcription, OCR, and metadata for AI agents like Claude and Cursor.MIT