Instagram Profile MCP Server
Pricing
from $10.00 / 1,000 profiles
Instagram Profile MCP Server
Instagram MCP server for AI agents — six tools covering followers and following export, profile enrichment, similar-account discovery, keyword and location search, and post engagers. Up to 38 fields per profile: emails, bio links, engagement, category, language. Connect Claude or Cursor to /mcp.
Pricing
from $10.00 / 1,000 profiles
Rating
0.0
(0)
Developer
Andrey Afanasenko
Maintained by CommunityActor stats
0
Bookmarked
16
Total users
2
Monthly active users
2 hours ago
Last modified
Categories
Share
Give your AI agent live Instagram profile data — 5 MCP tools for followers/following export, profile enrichment, network expansion, keyword and location discovery. Connect Claude Desktop, Cursor, or ChatGPT to /mcp and get up to 38 fields per profile: emails, engagement, category, language.
✨ New — Instagram Follower Tracker: see who started following and who unfollowed any public account over time, on a schedule. Same author.
Same data and pricing as the parent Instagram Profile Scraper — but exposed as Model Context Protocol tools so your AI agent picks the right one by intent. Beyond what Instagram's official Graph API offers (which only returns your own business accounts): full bio, contacts, engagement rate, business category, language, Reels analytics, and 38 enrichment columns per row.
What it does
Given an Instagram handle (or list of handles, seed accounts, keywords, or location), returns enriched profile records — bio, contacts, engagement metrics, post captions, language detection, and Reels analytics — same 38-column shape as the parent scraper. Each tool is one Apify run; results land in the run's default dataset.
Output sample (one row, 38 columns)
{"Account": "https://instagram.com/cristiano","Source": "Direct Input","Full Name": "Cristiano Ronaldo","Followers Count": 615000000,"Following Count": 568,"Biography": "SIUUUbscribe to my YT channel","Email": "press@example.com","Email Source": "contact_button","Phone": "+1 555 123 4567","External URL": "https://www.cristianoronaldo.com","Category": "Athlete","Profile Picture": "https://instagram.fagx1-1.fna.fbcdn.net/...","Address": "N/A","Reels Count": 142,"Last Reel (Days Ago)": 7,"Median Views": 4200000,"Avg Likes": 1420000,"Avg Comments": 8400,"Views/Followers Ratio": "0.68%","Posts per Month": 8.4,"Total Posts": 3654,"Detected Language": "English","Last Post Within (Days)": 3,"Median ER": "1.42%","Quality": "Good"}
⚡ Quick start
- Connect from your AI client (Standby
/mcp) — see "Connect from Claude Desktop / Cursor / ChatGPT" below. The actor stays warm and answers in sub-second after the first call. - Or click Run in the Apify Console — pick
Mode 2: Analyze a Specific List of Accounts, leave the demo input (openai, claudeai), and click Start. Output capped at 10 profiles for ~$0.10 trial cost. - Or POST programmatically to
apify.com/acts/.../runswith{"operationMode": "analyzeSpecificAccounts", "specificUsernamesList": ["claudeai"]}.
🤖 Connect from Claude Desktop / Cursor / ChatGPT
The MCP server lives at https://<actor-id>.apify.actor/mcp. Auth via Apify token (query param or Bearer header).
Claude Desktop
Add to your claude_desktop_config.json:
{"mcpServers": {"instagram": {"command": "npx","args": ["-y","@modelcontextprotocol/server-fetch","https://instagram-profile-scraper-mcp-server.apify.actor/mcp?token=<YOUR_APIFY_TOKEN>"]}}}
Restart Claude Desktop. Six tools appear: instagram_analyze_followers_following, instagram_analyze_specific_accounts, instagram_network_expansion, instagram_keyword_discovery, instagram_location_discovery, instagram_post_engagement_discovery.
Cursor / ChatGPT / other MCP clients
Point them at https://<actor-id>.apify.actor/mcp with Authorization: Bearer <YOUR_APIFY_TOKEN>. Streamable HTTP transport requires the header Accept: application/json, text/event-stream on every POST.
VS Code (GitHub Copilot agent mode)
Add to .vscode/mcp.json in your workspace (or the global user config):
{"servers": {"instagram": {"type": "http","url": "https://instagram-profile-scraper-mcp-server.apify.actor/mcp","headers": { "Authorization": "Bearer <YOUR_APIFY_TOKEN>" }}}}
Claude Code (CLI)
claude mcp add --transport http instagram \"https://instagram-profile-scraper-mcp-server.apify.actor/mcp" \--header "Authorization: Bearer <YOUR_APIFY_TOKEN>"
Curl smoke
TOKEN=<YOUR_APIFY_TOKEN>curl -sS -X POST "https://<actor-id>.apify.actor/mcp?token=$TOKEN" \-H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
Example agent prompts
Once connected, these plain-English prompts route to the right tool automatically:
- "Get the followers of @natgeo who have an email in their bio and more than 10k followers." →
instagram_analyze_followers_following - "Enrich these 20 Instagram handles with engagement rate and business category." →
instagram_analyze_specific_accounts - "Find accounts similar to @openai." →
instagram_network_expansion - "Find vet clinics on Instagram in Spanish-speaking markets." →
instagram_keyword_discovery - "Who posts from Shoreditch, London?" →
instagram_location_discovery - "Who liked and commented on this post? https://www.instagram.com/p/CA2aJYrg6cZ/" →
instagram_post_engagement_discovery
▶ Run as a regular Apify actor
The actor also accepts a normal INPUT_SCHEMA via apify call / Console / API. Pick a mode + provide its required field(s):
{"operationMode": "analyzeSpecificAccounts","specificUsernamesList": ["claudeai"],"extractEmail": true,"analyzeQuality": true}
All 6 modes are supported in regular-run as well as MCP. See .actor/input_schema.json for every field.
💰 Pay-per-event pricing
Same as the parent scraper. Charged on event emission — pay only for what you get.
| Event | Price (USD) | When charged |
|---|---|---|
PROFILE_ANALYZED | $0.01 | per profile successfully retrieved + analyzed |
USER_LIST_FETCHED | $0.10 | per follower OR following list dump (Mode 1 only) |
Not-found, private, and failed retrievals are never billed. Filters run after a profile is retrieved, so they narrow your output, not your bill — see What filters do to your bill. RUN_SUMMARY.profilesCharged shows the exact billed count after every run.
What filters do to your bill
Instagram has no API that filters for you. Every filter in this actor runs on a profile that has already been retrieved, so:
- Filters narrow your output, not your bill. A profile your filter rejects still counts as one
PROFILE_ANALYZED. - Your first run is the exception. On a customer's very first run, filter rejects are not billed until the run finds a profile that matches — that first match is where the guarantee ends and normal billing resumes. Up to 100 rejects per run are covered this way.
- A zero-row run tells you which filter did it. The
USER_MESSAGErecord (and, over MCP, the tool result itself) names the filter by the exact title it has in the Input form, and shows what the rejected profiles actually looked like — e.g. "the profiles we found had 14,320–291,698 followers, your minimum is 999,999,999".
Practical order: start with no filters and a small maxCount, look at what comes back, then add one filter at a time.
Demo input cap: when you leave the example seed (natgeo / openai, claudeai / openai) at default with no maxCount, the run is capped at 10 profiles — at most a $0.20 trial on any plan (Mode 1 adds one $0.10 list fetch; Modes 2/3 cost ~$0.10).
Free vs paid
| Free plan | Paid plan | |
|---|---|---|
| Profiles / run | 50 | unlimited (50 per MCP call) |
| Mode 1 targets | 3 | unlimited |
| Modes 3/4/5/6 discovery | 5 | unlimited (50 per MCP call) |
masked (j***@a***.com) | full address | |
| Reels analytics, view/follower ratio | not applied | applied |
searchDepth=2 (Mode 3) | not available | available |
🔒 Storage records
Every run writes the same record surface as the parent scraper:
| Key | Format | Purpose |
|---|---|---|
RUN_SUMMARY | JSON | profiles found / enriched / skipped, email-resolution stats, plan, durationSeconds, MCP tool-call count, profilesCharged / listFetchesCharged (real billed counts), filterRejectsWaived (filter rejects the first-run guarantee covered) and cost.spent |
SKIPPED_ACCOUNTS | JSON | per-username list of skips with reason + category (filter / not_found / private / error) |
FREE_LIMITS_APPLIED | JSON | which FREE-plan ceilings actually clipped the run (profile cap, target cap, expansion cap) — empty on paid |
USER_MESSAGE | JSON | diagnosis banner: missing-input errors, zero-result cause + top fix, narrow-filter heads-up — present whenever a run fails validation or delivers nothing |
FILTER_BURN_PREDICTION | JSON | pre-run yield estimate when filters are active (regular runs only) |
status.html | HTML | live progress dashboard (Apify Console Output tab); zero-result runs show the diagnosis instead of a bare stats grid |
Standby instances aggregate counters across all tool calls in the same instance and flush every 10 calls + on Actor.exit.
🛠️ Programmatic API
Trigger the actor as a regular run:
curl -X POST "https://api.apify.com/v2/acts/instagram-profile-scraper-mcp-server/runs?token=$TOKEN" \-H "Content-Type: application/json" \-d '{"operationMode":"analyzeSpecificAccounts","specificUsernamesList":["claudeai"]}'
Read the dataset:
$curl "https://api.apify.com/v2/datasets/<datasetId>/items?token=$TOKEN&format=json"
💡 Tips & Best Practices
Getting Maximum Results
- Start with one handle per mode to validate filter shape — Mode 2 with a single username gives the cheapest first signal.
- Layer filters in this order: follower range → contact info → category/keyword. Earlier filters skip the extra post/Reels fetch, so the run finishes faster (the per-profile charge is the same either way).
- For Mode 4 keyword discovery, combine
searchQueries(broader Instagram account search) withsearchHashtags(top-post authors, biased toward larger accounts) to widen the funnel. - For Mode 5 location discovery, use
City, Countryformat (e.g.London, UK) — the country hint disambiguates same-named cities.
Cost Optimization
- Use Apify's Run options panel (Maximum cost per run) to cap a run at any USD amount. Independent of the per-event pricing.
- Set
maxCountrealistically per mode — most discovery sources return hundreds of candidates. Free plan ceiling (50 / 3 / 5 by mode) acts as a backstop. - The real cost lever is
maxCount, not filters: filters decide what you keep,maxCountdecides how many profiles are retrieved and billed. - Skip
extractPosts/searchContactsInPostswhen you only need follower counts and bio — those toggles add a per-profile media fetch.
Performance
- The actor uses concurrency 16 against the upstream API by default; this matches the rate limit observed in production.
- Mode 5 (Location Discovery) is the slowest mode because it resolves each seed via a place-name search before fetching tagged media. Pre-resolving to a numeric place ID (paste the integer instead of
City, Country) skips the search step. - Standby instances stay warm across MCP tool calls — the second tool call in a session is faster than the first.
Data Quality
- The 38-column dataset has many nullable fields — check
Email/Reels Count/Median ERaren't all "N/A" on a sample row before scaling. - "Mutual Follow" column appears only when Mode 1 has both
analyzeFollowersANDanalyzeFollowingenabled. - "Tagged Location" column appears only in Mode 5. "Liked Posts", "Comments Left" and "Posts Engaged" appear only in Mode 6.
- "Matched By" column appears when
categoryFilterorkeywordsis active — values:category,keyword,both. - Free-plan emails are masked (
j***@a***.com) — the underlying value is correct on the paid plan.
❓ FAQ
Why a separate actor instead of the parent's modes? The MCP wrapper presents 6 narrow tools — agents can pick by intent. The parent actor uses one INPUT_SCHEMA with a mode enum, which is fine for humans but unwieldy for AI clients reading a tool catalog.
Same dataset shape as parent? Yes — 38 columns, same titles, same example values.
Same pricing as parent? Yes — $0.01 per profile + $0.10 per list dump, mirroring the parent 1:1.
Does Standby cost extra? Standby billing is per actor compute time, not per MCP tool call. Idle Standby instances stop after a few minutes of no traffic.
Will agents auto-discover this on mcp.apify.com? Yes once the actor is public + categorized as MCP_SERVERS. Indexing happens within ~1 hour of publish.
How is this different from the tool mcp.apify.com auto-generates for any actor? The auto-generated integration exposes one generic "call this actor with this input object" tool, so your agent has to understand the full 45-field input schema to use it. This server presents 6 narrow tools with small, typed argument sets — agents pick the right one by intent and fill 2–3 arguments instead of composing a full input object.
Do I need an Instagram login, cookies, or a session? No. The server reads only public profile data — you never provide credentials, and there is no account of yours that could get flagged or banned.
Can I analyze many accounts in one go? Yes. Mode 2 accepts up to 50 usernames per call/run, Mode 1 accepts multiple target accounts (3 on the free plan), and every discovery mode returns batches. For thousands of profiles, loop tool calls or schedule regular runs.
Can I run it on a schedule? Yes — regular runs work with Apify Schedules on any plan, including free. Save your input as a task, attach a schedule, and each run appends to its own dataset. For recurring follower change tracking specifically, the Instagram Follower Tracker is purpose-built.
How do I get more results per run? Three levers: raise the mode's maxCount cost-control field (0 = plan ceiling), loosen filters (contact-info and language filters reject the most), and on the free plan mind the ceilings — 50 profiles (Modes 1/2), 3 targets (Mode 1), 5 discovered profiles (Modes 3/4/5/6). Paid plans lift these to 50 per MCP call with unlimited calls/runs.
What happens when a run returns 0 profiles? The run explains itself: the USER_MESSAGE storage record and the live status page show the cause (all filtered vs unreachable vs empty source) and the top fix. Empty fetches are never billed. If filters rejected everything, the message names the filter that did it and states exactly what was charged — and on a first run, nothing is charged for those rejects (see What filters do to your bill).
My filters rejected everything — do I pay again to retry? The retry itself costs what it costs: the profiles have to be retrieved again. What you get for free is the diagnosis — the filter is named, with the observed numbers next to it, so the second attempt is informed rather than another guess. On your very first run, the rejects that led to it were not billed at all.
🔗 Related actors
| Actor | Description |
|---|---|
| instagram-profile-scraper | Parent scraper — same data + pricing, full INPUT_SCHEMA flow |
| instagram-followers-scraper | Lighter spinoff — followers/following only, single mode |
| instagram-related-profiles-scraper | Lighter spinoff — Network Expansion only, single mode |
| instagram-follower-tracker | Spinoff — tracks new / lost followers & following for a public account over time (stateful, scheduled) |
| instagram-reel-script-extractor | Reel content instead of profiles — spoken transcript, on-screen text, hook and structure |
| tiktok-profile-scraper | TikTok counterpart — profiles, followers, engagement metrics by the same author |
| zillow-mcp-server | MCP server by the same author — US real-estate listings as agent tools |
⚠️ Disclaimer
This actor scrapes only public Instagram profile data. Respect Instagram's Terms of Service and applicable data-protection regulations (GDPR, CCPA) when handling collected data. The MCP wrapper does not change what data is collected — same surface as the parent scraper.

