Reels Research MCP
Enables reading public Instagram Reels without login, including Reel details, timestamped speech-to-text transcripts, video frames, preview comments, covers, and collecting Reel links from web pages.
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., "@Reels Research MCPtranscribe this reel and give me the spoken hook"
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.
Reels Research MCP
A keyless Instagram Reels MCP server and research skill for AI agents. Read Instagram Reels without a login: details, timestamped transcripts with on-device speech-to-text (Parakeet Redux, 25 languages), real video frames, preview comments, and Reel links collected from web pages. In Claude Code, Codex and any MCP client.
Website · Install · Tools · The skill · FAQ
What it does
Ask your agent things like:
"Here are 12 Reels from creators I follow. Break down how each one opens: what's said, what's on screen, and the hook type."
"Find Reels about meal-prep for busy parents and summarise the angles they take."
"What do these coaches say about pricing? Quote them with the second they said it."
…and get back verbatim spoken hooks, on-screen text read from real frames, hook types and a coverage line, without logging into Instagram.
Related MCP server: doomscroll-mcp
How it works without a login
Instagram shows any logged-out visitor of a public Reel its caption, likes, comment count, date, and the audio and video streams. That is all this server uses:
Need | How |
Reel details | Public Reel data via yt-dlp |
What's said | The Reel's audio, transcribed on your machine with Moondream Parakeet Redux (178 MB, 25 European languages, ~50× real time on Apple silicon). Instagram's own captions are only served to logged-in users. |
What's on screen | Real frames decoded by ffmpeg at any second (only the bytes around each frame are read) |
Finding Reels | Instagram has no logged-out search, so Reels come from your links or from web pages ( |
Features
🎙️ Timestamped transcripts, on-device. Parakeet Redux runs locally through Moondream's Photon runtime in a long-lived worker: ~3 s warm start, then a 45 s Reel transcribes in about a second. Nothing goes to a cloud.
🎞️ Real vertical frames. Burned-in subtitles, text overlays, b-roll and cut pace become visible to the agent.
🔗 Reels from the web.
reels_linkspulls every embedded or linked Reel out of up to 15 pages (articles, roundups, newsletters, link-in-bio pages).✂️ Read only what you need. A time range (
start: 0, end: 5for hooks) or only the transcript passages matching a query.🧾 Nothing disappears silently. Per-Reel failures carry a reason code (
login_required,not_found,rate_limited), music-only Reels are flagged as such.🧠 A research skill for hooks (spoken, on-screen and visual), topic sweeps via the web, quotes and write-ups with citations.
Install
The easy way: ask your agent
Paste this into Claude Code, Codex, Cursor or any agent that can run commands:
Install Reels Research MCP for me from https://github.com/jindratilk/reels-research-mcp. Follow the "Install instructions for AI agents" in its README for the client you are running in: the plugin (MCP server + research skill) in Claude Code or Codex, otherwise the MCP server config. Run its --setup step for local speech-to-text, then run the doctor and tell me whether everything works, and if I need to restart anything.Claude Code (plugin: MCP server + skill)
claude plugin marketplace add jindratilk/reels-research-mcpclaude plugin install reels-research@reels-researchnpx -y github:jindratilk/reels-research-mcp --setupCodex (plugin: MCP server + skill)
codex plugin marketplace add jindratilk/reels-research-mcpcodex plugin add reels-research@reels-researchnpx -y github:jindratilk/reels-research-mcp --setupClaude Desktop, Cursor, Windsurf, VS Code, Zed, any MCP client
{
"mcpServers": {
"reels": {
"command": "npx",
"args": ["-y", "github:jindratilk/reels-research-mcp"]
}
}
}Then run npx -y github:jindratilk/reels-research-mcp --setup once. The skill is optional outside the plugins: copy skills/reels-research into your agent's skills folder.
Requirements: Node.js 20+, Python 3.10+, yt-dlp and ffmpeg (brew install yt-dlp ffmpeg). --setup creates a private Python environment in ~/.cache/reels-research-mcp with Moondream's Photon runtime (it brings PyTorch, about 1 GB) and downloads the 178 MB model.
Install instructions for AI agents
If a user asked you to install Reels Research MCP, follow these steps exactly.
Check prerequisites:
node --version(20+),python3 --version(3.10+),yt-dlp --version,ffmpeg -version. If yt-dlp or ffmpeg is missing, offer to install them (brew install yt-dlp ffmpegon macOS); do not install without asking. If Node or Python is missing or too old, stop and tell the user.Install for the client you are running in:
Claude Code (the
claudeCLI exists):claude plugin marketplace add jindratilk/reels-research-mcp, thenclaude plugin install reels-research@reels-research.Codex (the
codexCLI exists):codex plugin marketplace add jindratilk/reels-research-mcp, thencodex plugin add reels-research@reels-research.Any other MCP client: add
"reels": { "command": "npx", "args": ["-y", "github:jindratilk/reels-research-mcp"] }to its MCP config, keeping existing entries. Common files: Claude Desktop~/Library/Application Support/Claude/claude_desktop_config.json(macOS) or%APPDATA%\Claude\claude_desktop_config.json(Windows); Cursor~/.cursor/mcp.json; Windsurf~/.codeium/windsurf/mcp_config.json; VS Code.vscode/mcp.json(usesserversinstead ofmcpServers). If the client supports skills, copyskills/reels-researchinto its skills folder.
Set up speech-to-text: run
npx -y github:jindratilk/reels-research-mcp --setup. It downloads about 1 GB (PyTorch and the model) into~/.cache/reels-research-mcp; tell the user before you start.Verify: run
npx -y github:jindratilk/reels-research-mcp --doctor. Every line should start with ✓.Tell the user what you installed, the doctor result, and that they need to start a new session (or restart the app) for the tools to appear.
Tools
Tool | What it does |
Read up to 20 Reels: details, transcript, frames, preview comments, cover | |
Collect Reel links from up to 15 web pages | |
Check yt-dlp, ffmpeg, Reel access, the video stream and speech-to-text |
reels_fetch
{
"reels": ["https://www.instagram.com/reel/DNkpzuaRy-5/", "DO_T5qAEdmo"],
"parts": ["details", "transcript", "frames"],
"start": 0,
"end": 5,
"frames": 3
}Parameter | Meaning |
| 1–20 Reel URLs ( |
|
|
| Range for transcript and frames, in seconds or |
| Return only transcript passages matching these phrases |
| N evenly spaced frames, or exact seconds; width up to 1080 px (default 480) |
| Preview comments (Instagram exposes only a handful without login) |
Example output (live, abridged):
## [1] @mosseri: AMA: how long should my reels be??
https://www.instagram.com/reel/DNkpzuaRy-5/ · Adam Mosseri (@mosseri) · published 2025-08-20 · 20K likes · 1.1K comments · 0:45
Transcript (speech-to-text) 0:00–0:06:
[0:00] So there is no perfect length for a reel, but generally we recommend reels under three minutes because Instagram is generally focused on shorter video.
Frames (3, 480px wide): attached below at 0:00, 0:02, 0:04reels_links
{ "pages": ["https://blog.example.com/best-instagram-reels", "https://news.example.com/story"] }Finds Reels embedded or linked in the pages (plain links, embeds, escaped JSON, URL-encoded iframes), de-duplicated across pages; /p/ posts are listed separately.
reels_doctor
No parameters. Also available as npx -y github:jindratilk/reels-research-mcp --doctor.
The research skill
skills/reels-research guides the agent through a Reels study:
Get the Reels: the user's links, or a web search for pages that embed Reels on the topic, then
reels_links(finding-reels).Define the result before fetching: spoken hook, on-screen text, visual, hook type, likes/day.
Read in batches of 5–10, hooks with
start: 0, end: 5and frames (hooks: 10 Reel hook types).Fan out to up to 3 Haiku subagents for bigger sets, each reporting
reels_reviewedand what it skipped.Verify and cite as
@handle · Reel URL · second, with a coverage line (synthesis).
Configuration
Env var | Default | Meaning |
| all | Comma-separated tools to expose |
| 2 / 700 | Instagram lookup pacing |
| none | HTTP(S) proxy for yt-dlp and ffmpeg |
|
| Python with |
|
| Speech model and device ( |
| 600000 | Stop the speech worker after this much idle time |
| 1280 / 3 | Frame stream quality and parallel ffmpeg processes |
| 900000 | In-memory cache lifetime |
| on | Locate the helpers |
Honest limits
No search inside Instagram. Logged-out visitors get no search, hashtag pages or profile listings. Reels come from your links or from web pages.
No Instagram captions. Instagram's auto-captions are served only to logged-in users, so transcripts are speech-to-text. Parakeet Redux can mishear names and does worse in loud music or noise.
Likes, not views. View counts are hidden from logged-out visitors.
Rate limits. Instagram throttles anonymous lookups; the server spaces them, and failed Reels say
rate_limited. Private, age-restricted or region-blocked Reels returnlogin_required.Setup size. Speech-to-text needs about 1 GB (PyTorch plus the model).
FAQ
Does it need my Instagram login? No. Only public data that any logged-out visitor sees. No login, cookies or API key.
Which languages are transcribed? The 25 European languages of Parakeet v3 with automatic detection: English, German, French, Spanish, Italian, Portuguese, Dutch, Polish, Czech, Slovak, Ukrainian, Russian, Swedish, Danish, Finnish, Estonian, Latvian, Lithuanian, Hungarian, Romanian, Bulgarian, Croatian, Slovenian, Greek, Maltese.
Is audio sent anywhere? No. It is decoded to a temporary file, transcribed locally and deleted.
Is it affiliated with Instagram or Meta? No. It is an independent open-source project. Use it in line with Instagram's terms and respect creators' rights.
Researching YouTube too? See the sibling project YouTube Research MCP.
Development
npm install && npm run build
npm test # offline unit tests
npm run smoke # end-to-end against live Reels through a real MCP clientLayout: src/instagram.ts (yt-dlp lookups) · src/media.ts (ffmpeg audio and frames) · src/stt.ts + python/worker.py (Parakeet worker) · src/tools/* · skills/ · docs/ (website).
License
MIT. Parakeet Redux is © Moondream / M87 Labs under CC-BY-4.0, based on NVIDIA Parakeet TDT v3. Not affiliated with Instagram or Meta. Instagram is a trademark of Meta Platforms, Inc.
Keywords: Instagram Reels MCP server, Instagram Reels transcript without login, Reels hooks research, Model Context Protocol, Claude Code plugin, Codex plugin, on-device speech-to-text, Parakeet, video frames for LLMs, agent skill.
Available Tools
3 toolsreels_doctorCheck Reels setupARead-onlyIdempotent
Check everything this server needs on this machine, with timings: yt-dlp, ffmpeg, anonymous Reel access, the video stream, and local speech-to-text (Parakeet Redux). Run it after installing or when reels_fetch fails.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the description's contribution is the diagnostic detail: it probes local binaries, anonymous network access, the video stream, and a local STT model, and reports timings. It does not say how failures are surfaced or what the report looks like, but for a read-only check that is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler. The scope enumeration is front-loaded and the usage trigger is packed into the second sentence, so both payloads land before an agent stops reading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param, read-only diagnostic with no output schema, the description covers what is checked, when to run it, and the failure path. Only the interpretation of results (pass/fail shape) is unspecified, which is acceptable given the low complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter meaning to convey and the baseline of 4 applies. The description correctly signals a no-argument, run-and-see invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Check') plus the exact scope: yt-dlp, ffmpeg, anonymous Reel access, the video stream, and Parakeet Redux speech-to-text. That enumeration makes it unmistakably a dependency-diagnostic tool and clearly distinct from reels_fetch and reels_links.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions: 'Run it after installing or when reels_fetch fails.' The failure-recovery routing names a sibling and the condition that selects this tool, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reels_fetchRead Instagram ReelsARead-onlyIdempotent
Read Instagram Reels from their URLs, without a login: details (author, caption, likes, comment count, date), a timestamped transcript of what is said (local speech-to-text, Parakeet Redux, 25 European languages), real video frames, preview comments and the cover image. Batch up to 20 Reels per call.
Best for: hooks (what is said and shown in the first seconds), quoting what creators say, comparing how Reels open, reading on-screen text from frames. Returns: per Reel a header and the requested parts; per-Reel failures are reported inline with a reason code, never dropped.
Tips:
Hooks: start=0, end=5 (or 0–10) with parts ["details","transcript","frames"] and frames=3. Many Reels burn subtitles into the video: frames show them.
Instagram has no anonymous search: get Reel URLs from the user, or from web pages with reels_links.
Instagram links cannot jump to a second, so cite as "@handle, Reel URL, at 0:03".
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Range end for transcript and frames: seconds or 'm:ss'. | |
| parts | No | Any of details, transcript, frames, comments, cover. Default ["details","transcript"]. | |
| query | No | Return only transcript passages matching these phrases instead of the full transcript. | |
| reels | Yes | 1–20 Reel URLs (instagram.com/reel/…, /reels/…, /p/…) or shortcodes. | |
| start | No | Range start for transcript and frames: seconds or 'm:ss'. | |
| frames | No | With part frames: how many, evenly spaced over the range (default 4, max 12 per Reel, 36 per call). | |
| frameAt | No | With part frames: exact seconds instead of even spacing, e.g. [0, 1.5, 3]. | |
| frameWidth | No | Frame width in px (default 480, max 1080). Reels are vertical; 480 keeps on-screen text readable. | |
| commentsLimit | No | Preview comments per Reel (default 10). Instagram exposes only a handful without login. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, and the description adds real behavioral context beyond them: no login required, batch limit of 20 Reels, and that per-Reel failures are returned inline with a reason code rather than dropped. It also warns that Instagram exposes only a handful of comments without login, which sets expectations on result completeness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then Best-for, Returns, and Tips — a clean scannable order with no filler sentences. It is slightly long for the payload, and the 'Best for' list partially restates the Tips section, but every block carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description covers the return shape (per-Reel header plus requested parts, inline failure reporting with reason codes), which is the main gap such a tool would otherwise have. Combined with the no-login and citation guidance, an agent has everything needed to call it correctly and report results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3; the description earns extra credit by showing how parameters combine for the hook workflow (start/end range plus parts plus frames count) and by flagging that burned-in subtitles make frames the reliable way to read on-screen text. It does not explain 'query' or 'frameAt' beyond the schema, so it stops short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Read Instagram Reels from their URLs, without a login') and enumerates the payload (details, transcript, frames, comments, cover). It also draws a boundary with the sibling reels_links by positioning it as the URL-discovery tool, so an agent can route between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Best for' section names concrete use cases (hooks, quoting creators, comparing openings, reading on-screen text), and the Tips give a concrete recipe (start=0, end=5, parts=['details','transcript','frames'], frames=3). It also states a precondition — Instagram has no anonymous search, so URLs must come from the user or from reels_links — which is exactly the when/when-not guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reels_linksFind Reel links in web pagesARead-onlyIdempotent
Collect Instagram Reel links from web pages (articles, newsletters, "best Reels" lists, creator websites, link-in-bio pages). Instagram has no anonymous search, so this is the keyless way to turn web research into Reels you can read with reels_fetch.
Best for: after a web search for a topic, pull every embedded or linked Reel out of the result pages in one call. Returns: unique Reel URLs per page, with "post" links listed separately (a /p/ post may be a video or images).
| Name | Required | Description | Default |
|---|---|---|---|
| pages | Yes | 1–15 web page URLs to scan for Instagram Reel links. | |
| includePosts | No | Also list /p/ post links (default true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuinely new context: Instagram has no anonymous search, so the tool is 'keyless' (no auth/credentials needed), and it discloses the return shape including that /p/ posts are listed separately and may be images rather than video. No rate-limit or pagination behavior is described, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then clearly labeled 'Best for:' and 'Returns:' blocks. Every sentence carries information and nothing is repeated from the schema verbatim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing the return (unique Reel URLs per page, posts separated). Combined with annotations covering safety and the reason the tool exists (no anonymous Instagram search), an agent has everything needed to select and call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters, so the schema already documents the URL array and includePosts default. The description adds only the rationale for separating /p/ post links, not new syntax or constraints, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Collect Instagram Reel links from web pages') and enumerates the sources it targets (articles, newsletters, best-of lists, link-in-bio pages). It also distinguishes itself from the sibling reels_fetch by positioning that tool as the reader of the links this one discovers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Best for: after a web search for a topic, pull every embedded or linked Reel out of the result pages in one call' gives an explicit trigger condition, and the reference to reels_fetch tells the agent which tool takes over next. The agent knows when to reach for this tool and what the follow-up is.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.1- First observed
reels_doctor - First observed
reels_fetch - First observed
reels_links
TDQS
Scored across 3 tools
Each tool has a clearly distinct purpose: reels_fetch reads a Reel by URL, reels_links collects Reel URLs from web pages, and reels_doctor verifies environment dependencies. There is no overlap in what they do or when to invoke them.
All three tools use the same snake_case pattern with a shared 'reels_' prefix followed by a distinct noun/verb (fetch, links, doctor). The convention is fully predictable.
Three tools is on the lean side, but the server has a narrow, well-defined scope (reading Instagram Reels for research), and each tool earns its place: discovery, fetching, and diagnostics. Nothing is redundant, though it borders on thin.
For a read-only research surface, the lifecycle is largely covered: reels_links discovers URLs, reels_fetch retrieves content (details, transcript, frames, comments), and reels_doctor handles troubleshooting. A minor gap is the lack of a direct search/discovery tool (correctly noting Instagram has no anonymous search), but the web-page link extraction compensates.
Maintenance
Related MCP Connectors
Public Instagram reels, posts, profiles and comments, plus reel-to-text transcripts. No login.
Instagram data for AI agents: profiles, posts, reels, followers. Influencer + brand research.
Instagram Reels to text in bulk: transcripts with timestamps, SRT and VTT for public Reels.
Transcripts of Instagram Reels or a creator's newest reels by @handle. No login.
Related MCP Servers
- AlicenseAqualityFmaintenanceEnables AI assistants to interact with Instagram by scraping profiles, posts, reels, DMs, and business insights through a robust, DOM-agnostic browser orchestration engine that bypasses Instagram's anti-automation measures.281Apache 2.0
- 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 gradedqualityDmaintenanceForwards Instagram reels to Claude with timestamped transcripts and video frames, enabling Claude to watch, research, and build based on shared content.10MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to scrape Instagram Reels and public profile data (metadata, engagement, owner info) without the official API, via tools for scraping, status checks, cookie import, stopping, and exporting results.MIT