Instagram Profile MCP Server avatar

Instagram Profile MCP Server

Pricing

Pay per event + usage

Go to Apify Store
Instagram Profile MCP Server

Instagram Profile MCP Server

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.

Pricing

Pay per event + usage

Rating

0.0

(0)

Developer

Andrey Afanasenko

Andrey Afanasenko

Maintained by Community

Actor stats

0

Bookmarked

13

Total users

1

Monthly active users

3 days ago

Last modified

Share

Apify

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

  1. 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.
  2. 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.
  3. Or POST programmatically to apify.com/acts/.../runs with {"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. Five tools appear: instagram_analyze_followers_following, instagram_analyze_specific_accounts, instagram_network_expansion, instagram_keyword_discovery, instagram_location_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

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

EventPrice (USD)When charged
PROFILE_ANALYZED$0.01per profile successfully retrieved + analyzed
USER_LIST_FETCHED$0.10per follower OR following list dump (Mode 1 only)

Not-found, private, and failed retrievals are never billed. A profile that is retrieved and analyzed is billed even when one of your filters rejects it afterwards — validate narrow filter combinations with a small maxCount first. RUN_SUMMARY.profilesCharged shows the exact billed count after every run.

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 planPaid plan
Profiles / run50unlimited (50 per MCP call)
Mode 1 targets3unlimited
Modes 3/4/5 discovery5unlimited (50 per MCP call)
Emailmasked (j***@a***.com)full address
Reels analytics, view/follower rationot appliedapplied
searchDepth=2 (Mode 3)not availableavailable

🔒 Storage records

Every run writes the same record surface as the parent scraper:

KeyFormatPurpose
RUN_SUMMARYJSONprofiles found / enriched / skipped, email-resolution stats, plan, durationSeconds, MCP tool-call count, profilesCharged / listFetchesCharged (real billed counts) and cost.spent
SKIPPED_ACCOUNTSJSONper-username list of skips with reason + category (filter / not_found / private / error)
FREE_LIMITS_APPLIEDJSONwhich FREE-plan ceilings actually clipped the run (profile cap, target cap, expansion cap) — empty on paid
USER_MESSAGEJSONdiagnosis banner: missing-input errors, zero-result cause + top fix, narrow-filter heads-up — present whenever a run fails validation or delivers nothing
FILTER_BURN_PREDICTIONJSONpre-run yield estimate when filters are active (regular runs only)
status.htmlHTMLlive 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 cut profiles before expensive enrichment.
  • For Mode 4 keyword discovery, combine searchQueries (broader Instagram account search) with searchHashtags (top-post authors, biased toward larger accounts) to widen the funnel.
  • For Mode 5 location discovery, use City, Country format (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 maxCount realistically per mode — most discovery sources return hundreds of candidates. Free plan ceiling (50 / 3 / 5 by mode) acts as a backstop.
  • Tri-state filters (accountType, mustBeVerified, categoryFilter) drop matches before paid analysis.
  • Skip extractPosts / searchContactsInPosts when 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 ER aren't all "N/A" on a sample row before scaling.
  • "Mutual Follow" column appears only when Mode 1 has both analyzeFollowers AND analyzeFollowing enabled.
  • "Tagged Location" column appears only in Mode 5.
  • "Matched By" column appears when categoryFilter or keywords is 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 5 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 5 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). 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; profiles that were retrieved but rejected by your filters are billed and counted in RUN_SUMMARY.profilesCharged.

ActorDescription
instagram-profile-scraperParent scraper — same data + pricing, full INPUT_SCHEMA flow
instagram-followers-scraperLighter spinoff — followers/following only, single mode
instagram-related-profiles-scraperLighter spinoff — Network Expansion only, single mode
instagram-follower-trackerSpinoff — tracks new / lost followers & following for a public account over time (stateful, scheduled)
tiktok-profile-scraperTikTok counterpart — profiles, followers, engagement metrics by the same author
zillow-mcp-serverMCP 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.