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.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。