doomscroll-mcp
Enables AI agents to browse Instagram Reels by automating login, scrolling, and extracting structured metadata such as URL, creator, caption, likes, comments, and audio.
README
DoomScroll MCP
An MCP server that allows AI agents to browse Instagram Reels and perform content research.
Instead of manually scrolling through Instagram, agents can discover, inspect, filter, and analyze reels directly from the feed.
⚠️ Use at your own risk. Automating Instagram violates its Terms of Service and may get an account rate-limited, locked, or banned. Use a secondary / throwaway account — never your main account.
Features
- Login to Instagram once
- Persist browser session between runs
- Browse the default Reels feed based on your algorithm
- Search by keyword
- Search by hashtag
- Scroll through reels
- Extract reel metadata
- Filter and rank content before sending it to an AI model
- Humanized browsing (randomized delays, scroll jitter, watch pauses)
- Optional, opt-in account interactions (e.g. likes)
Extracted Data
For each reel, DoomScroll MCP attempts to collect:
- Reel URL
- Creator username
- Caption / description
- Audio information
- Likes
- Comments
- Shares / reposts (when available)
- Date posted
Note:
viewsis always null — Instagram does not expose reel view counts on the web (why).
The MCP returns structured data so the AI agent can decide what is interesting and what should be ignored.
Architecture
AI Agent
↓
DoomScroll MCP
↓
Playwright
↓
Instagram Web
Technology
- Python
- MCP
- Playwright
- uv
uv is used for fast dependency management and execution.
Session Persistence
Instagram login is only required once.
The Playwright browser profile is persisted locally and reused between runs.
First Run
---------
login()
→ User signs in
→ Session saved
Second Run
----------
login_status()
→ Logged In
No additional login required.
MVP Scope
1. Login
login()
login_status()
logout()
2. Scroll
scroll_reels(limit=50)
Supports:
- Default Reels feed
- Search results
- Hashtag pages
Examples:
scroll_reels()
scroll_reels(
search="yoga"
)
scroll_reels(
hashtag="yoga"
)
3. Return Results
[
{
"url": "...",
"creator": "...",
"caption": "...",
"likes": 12345,
"comments": 123,
"date_posted": "...",
"audio": "...",
}
]
The MCP does not perform analysis.
Its job is to collect and return reel data.
The AI agent is responsible for:
- Trend detection
- Content analysis
- Ranking
- Content recommendations
- Content generation
Example Workflow
User:
Find content ideas for beginner yoga.
Agent:
→ login_status()
Agent:
→ scroll_reels(
search="beginner yoga",
limit=100
)
MCP:
→ Returns reel metadata
Agent:
→ Filters high-engagement reels
→ Analyzes hooks and formats
→ Returns top content ideas
Install
Requires uv. Two one-time setup steps before any
agent can use it:
# 1. Install the headless browser (shared cache, done once per machine)
uvx --from doomscroll-mcp playwright install chromium
# 2. Log in to Instagram by hand (opens a visible browser; no credentials stored)
uvx --from doomscroll-mcp doomscroll-login
From a git clone instead of PyPI, swap
uvx --from doomscroll-mcpforuv run --directory /path/to/doomscroll-mcp.
Then add it to your agent. The server speaks MCP over stdio.
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) /
%APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"doomscroll": {
"command": "uvx",
"args": ["doomscroll-mcp"]
}
}
}
Claude Code
claude mcp add doomscroll -- uvx doomscroll-mcp
Cursor
~/.cursor/mcp.json (or any MCP client using the standard schema):
{
"mcpServers": {
"doomscroll": {
"command": "uvx",
"args": ["doomscroll-mcp"]
}
}
}
From a local clone (no PyPI)
{
"mcpServers": {
"doomscroll": {
"command": "uv",
"args": ["run", "--directory", "/path/to/doomscroll-mcp", "doomscroll-mcp"]
}
}
}
After it's wired up, have the agent call doctor() to confirm it sees your
logged-in profile. If login_status() ever reports logged out (expired session
or a checkpoint), run doomscroll-login again.
Tools
login(force=False)— headful sign-in, persist profilelogin_status()— is the session logged in?logout()— clear the profiledoctor()— browser/profile/auth diagnostics + next actionscroll_reels(limit=50, sort_by=None, top=None, mode=None)— feed, stop at a reel countdoomscroll(duration_seconds, sort_by=None, top=None, mode=None)— feed, stop after a wall-clock timesearch_reels(query, limit=50, sort_by=None, top=None, mode=None)— keyword search → matching reelshashtag_reels(tag, limit=50, sort_by=None, top=None, mode=None)— hashtag → matching reels
search_reels / hashtag_reels hit Instagram's top_serp search API directly
(relevance-filtered, paginated), not the explore UI.
doomscroll scrolls for a fixed time instead of a fixed count — e.g.
doomscroll(600) doomscrolls for 10 minutes. Add sort_by="views" + top=10
to get "the best reels from N minutes of scrolling". Duration is clamped to
DOOMSCROLL_MAX_DURATION_S (default 30 min). sort_by ∈
views | likes | reposts | recent (descending; None = discovery order).
Responses include stopped_reason (limit | duration | dry | capped).
Filters
All four collection tools accept filters, applied after collection, before sort/top:
posted_within_hours— recency window (e.g.24= last day)min_views/min_likes/min_reposts— engagement floors ("viral")contains— caption keyword, case-insensitive
Example — "best fresh reels from 10 minutes of doomscrolling":
doomscroll(600, posted_within_hours=24, sort_by="likes", top=10).
Responses include filtered_out (how many were dropped) and echo the active
filters. An empty result purely because filters excluded everything is a valid
response (reels: []), not an error.
Notes:
- The feed's
viewsare null — usemin_likeson the feed,min_viewson search/hashtag. - The home feed mixes fresh and evergreen reels, so a tight
posted_within_hoursreturns only the fresh minority (a longerdoomscrollcatches more). containsis keyword matching, not topic understanding. For real topic relevance usesearch_reels(Instagram's own ranking); semantic topic is the agent's job, not the server's.
Errors come back as structured dicts (code, retry_after, requires_headful,
suggested_tool) so an agent can recover instead of stalling.
See docs/sample-output.md for a real scroll_reels
run against the live feed.
Vision
Turn Instagram into a structured data source for AI-powered content research.
Login once. Scroll automatically. Return structured reel data. Let the AI decide what matters.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.