Public Instagram profiles and post feeds by handle, with hashtags and mentions parsed.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
A hosted Model Context Protocol (MCP) server that gives Claude, Cursor, Windsurf and any other MCP client two read-only Instagram tools. Look up a public profile by handle, and walk its public post feed, as structured JSON.
It reads public data about accounts. It does not act as an account. There is nothing to connect and no account of yours involved anywhere in the flow.
An MCP client that speaks streamable HTTP with custom headers. A HasData API key from the dashboard, free to create with no card, and the trial covers 100 calls. Nothing else. This is a remote server, so the simplest path is a URL and a header, with no container to run. A stdio-only client can use the @hasdata/instagram-mcp (npm) or hasdata-instagram-mcp (PyPI) launcher instead.
| URL | https://mcp.hasdata.com/api/mcp?apis=instagram |
| Transport | HTTP, streamable |
| Auth header | x-api-key: HASDATA_API_KEY |
The server URL is the same for every client. We run it hands-on in Claude Code and Claude Desktop. The other blocks follow each client's own documented format for a remote server.
Clients with OAuth support can add the same URL as a connector and sign in without putting a key in a config file.
Claude Desktop loads only local (stdio) servers from its config file, so it reaches a remote server through a stdio launcher. The @hasdata/instagram-mcp package is that launcher, and it reads the key from the environment.
claude_desktop_config.json:
Python instead of Node? Swap the launcher for the PyPI package, which uvx runs without a manual install:
A client with OAuth support can instead add the URL as a custom connector and skip the launcher.
.cursor/mcp.json:
~/.codeium/windsurf/mcp_config.json:
.vscode/mcp.json:
~/.gemini/settings.json:
Each of these is one tool call unless the count says otherwise.
Pull the profile for
@nasaand tell me the follower count, the category and every link in the bio.
One call, 10 credits. For a public account the profile response already carries the twelve most recent posts, so a follow-up about recent activity needs no second call.
Compare
@nasa,@natgeoand@bbcearthon followers, posts published and whether each is a business account.
Three calls, 30 credits. One per handle.
Walk the last fifty posts from
@nasaand list every hashtag with how often it appears.
Five calls, 50 credits. Twelve posts arrive per call, and fifty takes five pages.
For the last twelve posts on
@natgeo, give me likes, comments and the accounts mentioned in each caption.
One call, 10 credits. Engagement counts and mentions come parsed in the post objects.
Two things make these work. Hashtags and mentions arrive as arrays parsed out of the caption, and an agent counts them instead of running a regex over prose. And a profile lookup returns the recent feed in the same response. That is why so many research questions land in a single call.
Two tools, both read-only, both keyed on a public account handle. Samples below are trimmed from real calls, and the numbers in them move as accounts post. Read them as shapes. Each tool name links to its endpoint reference.
The samples are the payload, not the whole response. A tools/call result carries one text block, and that text is itself JSON holding url, status, text and json, with the scraped data under json. From a raw JSON-RPC response the path is result.content[0].text, parsed, then .json. A chat client unwraps that for you and code talking to the endpoint directly does not.
hasdata_instagram_profile_getInstagramProfile
One public profile by handle.
| Parameter | Type | Required | Notes |
|---|---|---|---|
handle | string | yes | Username without the @, as it appears in the profile URL |
Returns id, username, fullName, biography, businessCategory, verified, isBusinessAccount and isProfessionalAccount, the counters followersCount, followsCount, postsCount, highlightsCount and igtvVideoCount, both profilePicUrl and profilePicUrlHD, and the arrays latestPosts, latestIgtvVideos and relatedProfiles.
The core identity fields and the follower and following counts come back for every public account. The fields beyond that depend on what the account itself exposes, so read the optional ones with a default.
Links live in two fields that are not the same thing.
bioLinksis the array of every link in the bio.externalUrlsis a single string despite the plural name, and it holds the primary link, sometimes with a trailing slash the array version lacks. ReadbioLinkswhen you want them all.
latestPostsandlatestIgtvVideosdo not carry identical fields. Video entries addtaggedUsers, and the post objects here omit theproductTypethat the posts tool includes. Code that walks both arrays through one parser has to treat the extra keys as optional.
relatedProfiles is Instagram's own suggestion list for the account and runs to a few dozen entries. It is a cheap way to widen a competitor set without guessing handles.
hasdata_instagram_posts_getInstagramPosts
The public post feed for one handle, page by page.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/hasdata-instagram)<a href="https://allmcps.com/mcp/hasdata-instagram"><img src="https://allmcps.com/api/badge/hasdata-instagram?style=directory" alt="HasData Instagram on AllMCPs" /></a>