Skip to main content
Glama

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

License: MIT No login MCP On-device STT Claude Code plugin Codex plugin


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 (reels_links)

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_links pulls 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: 5 for 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-mcp
claude plugin install reels-research@reels-research
npx -y github:jindratilk/reels-research-mcp --setup

Codex (plugin: MCP server + skill)

codex plugin marketplace add jindratilk/reels-research-mcp
codex plugin add reels-research@reels-research
npx -y github:jindratilk/reels-research-mcp --setup

Claude 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.

  1. 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 ffmpeg on macOS); do not install without asking. If Node or Python is missing or too old, stop and tell the user.

  2. Install for the client you are running in:

    • Claude Code (the claude CLI exists): claude plugin marketplace add jindratilk/reels-research-mcp, then claude plugin install reels-research@reels-research.

    • Codex (the codex CLI exists): codex plugin marketplace add jindratilk/reels-research-mcp, then codex 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 (uses servers instead of mcpServers). If the client supports skills, copy skills/reels-research into its skills folder.

  3. 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.

  4. Verify: run npx -y github:jindratilk/reels-research-mcp --doctor. Every line should start with ✓.

  5. 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

reels_fetch

Read up to 20 Reels: details, transcript, frames, preview comments, cover

reels_links

Collect Reel links from up to 15 web pages

reels_doctor

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

reels

1–20 Reel URLs (/reel/, /reels/, /p/) or shortcodes

parts

details · transcript · frames · comments · cover (default details, transcript)

start / end

Range for transcript and frames, in seconds or m:ss

query

Return only transcript passages matching these phrases

frames / frameAt / frameWidth

N evenly spaced frames, or exact seconds; width up to 1080 px (default 480)

commentsLimit

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:04
{ "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:

  1. Get the Reels: the user's links, or a web search for pages that embed Reels on the topic, then reels_links (finding-reels).

  2. Define the result before fetching: spoken hook, on-screen text, visual, hook type, likes/day.

  3. Read in batches of 5–10, hooks with start: 0, end: 5 and frames (hooks: 10 Reel hook types).

  4. Fan out to up to 3 Haiku subagents for bigger sets, each reporting reels_reviewed and what it skipped.

  5. Verify and cite as @handle · Reel URL · second, with a coverage line (synthesis).

Configuration

Env var

Default

Meaning

REELS_MCP_TOOLS

all

Comma-separated tools to expose

REELS_MAX_CONCURRENCY / REELS_MIN_GAP_MS

2 / 700

Instagram lookup pacing

REELS_PROXY

none

HTTP(S) proxy for yt-dlp and ffmpeg

REELS_PYTHON / REELS_VENV

~/.cache/reels-research-mcp/venv

Python with moondream installed

REELS_STT_MODEL / REELS_STT_DEVICE

moondream/parakeet-redux / auto

Speech model and device (cpu, mps, cuda)

REELS_STT_IDLE_MS

600000

Stop the speech worker after this much idle time

REELS_FRAME_MAX_HEIGHT / REELS_FFMPEG_CONCURRENCY

1280 / 3

Frame stream quality and parallel ffmpeg processes

REELS_CACHE_TTL_MS

900000

In-memory cache lifetime

YT_DLP_PATH / FFMPEG_PATH / FFPROBE_PATH

on PATH

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 return login_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 client

Layout: 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 tools
reels_doctorCheck Reels setupA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ReelsA
Read-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".

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoRange end for transcript and frames: seconds or 'm:ss'.
partsNoAny of details, transcript, frames, comments, cover. Default ["details","transcript"].
queryNoReturn only transcript passages matching these phrases instead of the full transcript.
reelsYes1–20 Reel URLs (instagram.com/reel/…, /reels/…, /p/…) or shortcodes.
startNoRange start for transcript and frames: seconds or 'm:ss'.
framesNoWith part frames: how many, evenly spaced over the range (default 4, max 12 per Reel, 36 per call).
frameAtNoWith part frames: exact seconds instead of even spacing, e.g. [0, 1.5, 3].
frameWidthNoFrame width in px (default 480, max 1080). Reels are vertical; 480 keeps on-screen text readable.
commentsLimitNoPreview comments per Reel (default 10). Instagram exposes only a handful without login.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv0.1.1
    • First observedreels_doctor
    • First observedreels_fetch
    • First observedreels_links

TDQS

A4.6/5.0

Scored across 3 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    F
    maintenance
    Enables 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.
    28
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Forwards Instagram reels to Claude with timestamped transcripts and video frames, enabling Claude to watch, research, and build based on shared content.
    10
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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