Instagram MCP Server
Instagram MCP Server
Ein gehosteter Model Context Protocol (MCP)-Server, der Claude, Cursor, Windsurf und jedem anderen MCP-Client zwei schreibgeschützte Instagram-Tools bereitstellt. Rufe ein öffentliches Profil per Handle ab und durchlaufe seinen öffentlichen Post-Feed als strukturiertes JSON.
Er liest öffentliche Daten über Konten. Er agiert nicht als ein Konto. Es gibt nichts zu verbinden, und nirgends im Ablauf ist ein Konto von dir beteiligt.
https://mcp.hasdata.com/api/mcp?apis=instagram
Inhalt
Related MCP server: Social MCP Connector
Was du brauchst
Ein MCP-Client, der streamable HTTP mit benutzerdefinierten Headern unterstützt. Ein HasData-API-Schlüssel vom Dashboard, kostenlos zu erstellen, ohne Kreditkarte, und die Testversion umfasst 100 Aufrufe. Sonst nichts. Dies ist ein Remote-Server, der einfachste Weg ist also eine URL und ein Header, ohne einen Container ausführen zu müssen. Ein reiner stdio-Client kann stattdessen den Launcher @hasdata/instagram-mcp (npm) oder hasdata-instagram-mcp (PyPI) verwenden.
Schnellstart
URL |
|
Transport | HTTP, streamable |
Auth-Header |
|
Die Server-URL ist für jeden Client dieselbe. Wir haben den Server in Claude Code und Claude Desktop im Einsatz. Die anderen Blöcke folgen dem jeweils dokumentierten Format des Clients für einen Remote-Server.
Clients mit OAuth-Unterstützung können dieselbe URL als Connector hinzufügen und sich anmelden, ohne einen Schlüssel in eine Konfigurationsdatei zu setzen.
claude mcp add --transport http instagram "https://mcp.hasdata.com/api/mcp?apis=instagram" \
--header "x-api-key: HASDATA_API_KEY"Claude Desktop lädt aus seiner Konfigurationsdatei nur lokale (stdio-)Server, daher erreicht es einen Remote-Server über einen stdio-Launcher. Das Paket @hasdata/instagram-mcp ist dieser Launcher und liest den Schlüssel aus der Umgebung.
claude_desktop_config.json:
{
"mcpServers": {
"instagram": {
"command": "npx",
"args": ["-y", "@hasdata/instagram-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}Python statt Node? Tausche den Launcher gegen das PyPI-Paket aus, das uvx ohne manuelle Installation ausführt:
{
"mcpServers": {
"instagram": {
"command": "uvx",
"args": ["hasdata-instagram-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}Ein Client mit OAuth-Unterstützung kann stattdessen die URL als benutzerdefinierten Connector hinzufügen und den Launcher überspringen.
.cursor/mcp.json:
{
"mcpServers": {
"instagram": {
"url": "https://mcp.hasdata.com/api/mcp?apis=instagram",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"instagram": {
"serverUrl": "https://mcp.hasdata.com/api/mcp?apis=instagram",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}{
"mcpServers": {
"instagram": {
"url": "https://mcp.hasdata.com/api/mcp?apis=instagram",
"type": "streamableHttp",
"headers": { "x-api-key": "HASDATA_API_KEY" },
"disabled": false
}
}
}.vscode/mcp.json:
{
"servers": {
"instagram": {
"type": "http",
"url": "https://mcp.hasdata.com/api/mcp?apis=instagram",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}~/.gemini/settings.json:
{
"mcpServers": {
"instagram": {
"httpUrl": "https://mcp.hasdata.com/api/mcp?apis=instagram",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}Beispiel-Prompts
Jeder dieser Aufrufe ist ein einzelner Tool-Aufruf, sofern die Anzahl nichts anderes angibt.
Ruf das Profil von
@nasaab und nenn mir die Follower-Anzahl, die Kategorie und jeden Link in der Bio.
Ein Aufruf, 10 Credits. Da die Profilantwort für ein öffentliches Konto bereits die zwölf neuesten Beiträge enthält, ist für eine Nachfrage zur jüngsten Aktivität kein zweiter Aufruf nötig.
Vergleiche
@nasa,@natgeound@bbcearthhinsichtlich Follower, veröffentlichten Beiträgen und ob es sich jeweils um ein Geschäftskonto handelt.
Drei Aufrufe, 30 Credits. Einer pro Handle.
Gehe die letzten fünfzig Beiträge von
@nasadurch und gib zu jedem Hashtag an, wie oft es vorkommt.
Fünf Aufrufe, 50 Credits. Pro Aufruf kommen zwölf Beiträge, und fünfzig benötigen fünf Seiten.
Gib mir für die letzten zwölf Beiträge von
@natgeoLikes, Kommentare und die in jedem Caption erwähnten Konten an.
Ein Aufruf, 10 Credits. Engagement-Zahlen und Erwähnungen kommen in den Beitragsobjekten bereits geparst.
Zwei Dinge machen das möglich. Hashtags und Erwähnungen kommen als Arrays an, die aus dem Caption geparst wurden, und ein Agent zählt sie, statt einen Regex über den Fließtext laufen zu lassen. Und eine Profilabfrage liefert den aktuellen Feed in derselben Antwort. Deshalb landen so viele Recherchefragen in einem einzigen Aufruf.
Tools
Zwei Tools, beide schreibgeschützt, beide an einen öffentlichen Account-Handle gebunden. Die folgenden Beispiele sind aus echten Aufrufen gekürzt, und die Zahlen darin verschieben sich, wenn Konten posten. Betrachte sie als Strukturvorlagen. Jeder Toolname verlinkt auf seine Endpunkt-Referenz.
Die Beispiele sind die Nutzlast, nicht die gesamte Antwort. Ein tools/call-Ergebnis enthält einen Textblock, und dieser Text ist selbst JSON mit url, status, text und json, wobei die gescrapten Daten unter json liegen. Bei einer rohen JSON-RPC-Antwort lautet der Pfad: result.content[0].text parsen, dann .json. Ein Chat-Client extrahiert das für dich, Code, der direkt mit dem Endpunkt spricht, jedoch nicht.
Instagram-Profil abrufen
hasdata_instagram_profile_getInstagramProfile
Ein öffentliches Profil per Handle.
Parameter | Typ | Erforderlich | Hinweise |
| string | ja | Benutzername ohne |
Gibt id, username, fullName, biography, businessCategory, verified, isBusinessAccount und isProfessionalAccount zurück, die Zähler followersCount, followsCount, postsCount, highlightsCount und igtvVideoCount, sowohl profilePicUrl als auch profilePicUrlHD sowie die Arrays latestPosts, latestIgtvVideos und relatedProfiles.
Die zentralen Identitätsfelder sowie die Follower- und Following-Zahlen werden für jedes öffentliche Konto zurückgegeben. Die Felder darüber hinaus hängen davon ab, was das Konto selbst preisgibt; lies die optionalen Felder daher mit einem Standardwert.
Links liegen in zwei Feldern, die nicht dasselbe sind.
bioLinksist das Array aller Links in der Bio.externalUrlsist trotz des Pluralnamens eine einzelne Zeichenfolge und enthält den primären Link, manchmal mit einem abschließenden Schrägstrich, der der Array-Version fehlt. LiesbioLinks, wenn du alle haben möchtest.
latestPostsundlatestIgtvVideoshaben nicht identische Felder. Videoeinträge fügentaggedUsershinzu, und die Beitragsobjekte hier lassen das FeldproductTypeweg, das das Posts-Tool enthält. Code, der beide Arrays mit einem Parser durchläuft, muss die zusätzlichen Schlüssel als optional behandeln.
{
"id": "528817151",
"username": "nasa",
"fullName": "NASA",
"biography": "Making the seemingly impossible, possible. ✨",
"businessCategory": "Government Agencies",
"bioLinks": [
"https://www.nasa.gov",
"https://science.nasa.gov/mission/roman-space-telescope/",
"http://intern.nasa.gov"
],
"externalUrls": "https://www.nasa.gov/",
"followersCount": 104397669,
"followsCount": 92,
"postsCount": 4887,
"verified": true,
"isBusinessAccount": true,
"latestPosts": [ "…twelve most recent posts, same shape as the posts tool…" ],
"relatedProfiles": [
{ "id": "…", "username": "…", "fullName": "…", "profilePicUrl": "…" }
]
}relatedProfiles ist die eigene Vorschlagsliste von Instagram für das Konto und umfasst einige Dutzend Einträge. Es ist eine kostengünstige Möglichkeit, eine Wettbewerbsgruppe zu erweitern, ohne Handles zu erraten.
Instagram-Posts abrufen
hasdata_instagram_posts_getInstagramPosts
Der öffentliche Post-Feed für einen Handle, Seite für Seite.
Parameter | Typ | Erforderlich | Hinweise |
| string | ja | Benutzername ohne |
| number | Ungefähre Obergrenze für Beiträge in einer Antwort. Zwölf ist das tatsächliche Maximum, und größere Werte holen nicht mehr | |
| string | Der |
limitist eher eine grobe Obergrenze als eine exakte Anzahl. Zwölf Beiträge sind eine Instagram-Seite und die harte Obergrenze für einen einzelnen Aufruf, undlimit: 50liefert zwölf. Unterhalb der Obergrenze liegt die Anzahl nahe an der gewünschten Zahl, ohne sie immer zu treffen, und wie nah hängt vom Konto ab. Gemessen an@nasalieferte ein Limit von 2 4 Beiträge, 6 lieferte 6, 11 lieferte 10 und 13 lieferte 12. Behandle es als „nicht mehr als ungefähr so viele“ und lies die Array-Länge, statt sie anzunehmen.
Die Antwort wiederholt die Identitätsfelder des Kontos neben den Beiträgen.
username,id,fullName,verifiedund beide Avatar-URLs kommen auf jeder Seite an. Praktisch zum Beschriften von Zeilen und wissenswert, bevor du einen separaten Profilaufruf tätigst, um sie zu erhalten.
Jeder Beitrag enthält id, shortcode, caption, type, productType, hashtags, mentions, likesCount, commentsCount, timestamp, url, displayUrl, images, dimensionsWidth, dimensionsHeight, ownerId und ownerUsername.
{
"username": "nasa",
"id": "528817151",
"fullName": "NASA",
"verified": true,
"latestPosts": [
{
"id": "3967213292204992434",
"shortcode": "DcOX3hWFiey",
"caption": "With your powers combined…\n\nThis colorful picture of the cosmos is the product of teamwork between our @NASAHubble, @NASAWebb, and @NASAChandraXray telescopes. […] \n\n#NASA #Universe #Nebula",
"type": "Image",
"hashtags": ["#NASA", "#Universe", "#Nebula"],
"mentions": ["@NASAHubble", "@NASAWebb", "@NASAChandraXray"],
"likesCount": 78412,
"commentsCount": 402,
"timestamp": "2026-08-18T16:02:11.000Z",
"url": "https://www.instagram.com/p/DcOX3hWFiey/"
}
],
"pagination": {
"morePostsAvailable": true,
"nextPageToken": "3968050822236429248_528817151",
"hasdataLink": "https://api.hasdata.com/scrape/instagram/posts?handle=nasa&nextPageToken=3968050822236429248_528817151"
}
}Hashtags und Erwähnungen behalten ihre Präfixe # und @, was wichtig ist, wenn du sie mit einer selbst erstellten Liste abgleichst. morePostsAvailable ist das Flag, an dem du dich beim Blättern orientierst, und hasdataLink ist dieselbe nächste Seite als REST-URL, nützlich, wenn du einen Agentenaufruf von Hand nachvollziehen möchtest.
Fehler und Fehlerpfade
Dein Client sieht bei einem Tool-Aufruf fast nie einen HTTP-Fehlercode. Die MCP-Ebene antwortet mit 200 und legt den Fehler in das Ergebnis, mit isError auf true und dem Grund als Text. Der Agent liest eine Meldung, wo du eine Statuszeile erwarten würdest.
Ein falscher Schlüssel erscheint als Tool-Ausgabe, nicht als fehlgeschlagene Verbindung. Das Auflisten der Tools akzeptiert jeden nicht-leeren Schlüssel, und der Client schließt den Handshake ab und zeigt Grün. Der erste Tool-Aufruf kommt dann mit isError: true und dem Text HasData API error: 401 Unauthorized zurück. Achte auf diese Zeichenkette, denn nichts früher im Ablauf meldet das Problem.
Ein fehlender Schlüssel ist der einzige echte HTTP-Fehler. Die Autorisierung läuft vor jedem Tool, und die Verbindung selbst schlägt mit 401 fehl.
Ein Argument, das das Schema verletzt, wird abgelehnt, bevor daraus eine Anfrage wird. Der Server antwortet mit isError: true und dem Text MCP error -32602: Input validation error und nennt das Feld. Es wird nichts abgerufen und nichts berechnet.
Ein Handle, der nicht aufgelöst werden kann, ist ein sauberer Fehler, keine leeren Daten. Er gibt `isError
Die kostenlose Testversion umfasst 1.000 Credits über 30 Tage ohne Kreditkarte oder 100 Instagram-Aufrufe. Danach erhält ein aktives Konto täglich 100 Credits gutgeschrieben, sobald sein Guthaben unter 100 fällt. Ein Agent mit geringem Volumen läuft also dauerhaft auf dem kostenlosen Tarif.
Bezahlte Tarife beginnen bei 49 $ pro Monat für 200.000 Credits bzw. 20.000 Aufrufe. Der Stückpreis sinkt mit dem Volumen, von 2,45 $ pro 1.000 Aufrufen im Einstiegstarif auf 0,99 $ bei Business, 0,83 $ bei Growth und 0,75 $ beim größten High-Volume-Tarif.
Ihr Tarif legt auch die Parallelität fest. Die kostenlose Testversion erlaubt 1 Anfrage gleichzeitig, Startup 15, Business 30, Growth 50, und die High-Volume-Tarife reichen von 200 bis 1.500. Behandeln Sie den Überlauffall defensiv in allem, was unbeaufsichtigt läuft, denn ein Agent, der sich über viele Profile ausbreitet, erreicht die Obergrenze vor Ihnen.
Das Blättern kostet jedes Mal einen Aufruf. Ein Prompt, der hundert Beiträge über zwei Konten durchläuft, kostet achtzehn Aufrufe und 180 Credits. Die Testversion reicht bei Profilvergleichen weiter als bei tiefen Feed-Crawls.
Tool-Auswahl
?apis=instagram legt genau diese beiden Tools offen. Der Parameter akzeptiert eine Liste, und ?apis=instagram,tiktok,youtube gibt Ihrem Agenten drei soziale Plattformen auf einmal. Lassen Sie den Parameter weg, und Sie erhalten alles, was HasData freigibt – derzeit 57 Tools.
Eine schmale Liste ist in der Regel die bessere Standardeinstellung. Ein Modell, das zwischen zwei Tools wählt, trifft öfter die richtige Entscheidung als eines, das zwischen siebenundfünfzig wählt, und schon die Tool-Beschreibungen kosten bei jeder Runde Kontext.
Plattformübergreifende Vergleiche sind der übliche Grund, die Liste zu erweitern. Stellen Sie dieselbe Frage an ein Instagram-Profil und ein TikTok-Profil, und es ist ein Prompt, sobald beide freigeschaltet sind.
Vergleich
Fast jeder Instagram-MCP-Server macht etwas anderes als dieser, und das macht die Wahl ungewöhnlich klar.
Die verbreiteten Server betreiben ein Konto. Einige kapseln die Instagram Graph API, um Beiträge zu veröffentlichen, Kommentare zu lesen und die Konten zu verwalten, die Sie administrieren. Andere übernehmen Direktnachrichten. Die Engagement-Analyse-Server fragen in einem Env-Block nach INSTAGRAM_USERNAME und INSTAGRAM_PASSWORD, gemäß ihren eigenen Einrichtungsanleitungen, weil sie sich als Sie anmelden und browsen. All diese sind das richtige Werkzeug, wenn die Aufgabe darin besteht, ein Konto zu betreiben, das Sie kontrollieren.
Dieser Server meldet sich nie als jemand an, das ist eine andere Aufgabe. Jede Frage, die er beantwortet, betrifft ein Profil, das Ihnen nicht gehört, und der Aufruf ist identisch, egal um welches Profil es sich handelt.
Konto-betreibender Server | Dieser Server | |
Als was es fungiert | Ihr Konto, per Token oder Sitzung | Nichts, er liest öffentliche Daten |
Was Sie konfigurieren | Anmeldedaten oder eine Graph-API-App, pro Konto | Ein API-Schlüssel, einmalig |
Welche Profile es abdeckt | Die Konten, die Sie verwalten | Jedes öffentliche Profil |
Veröffentlichen und Nachrichten | Ja, darum geht es | Nicht angeboten |
Ausgabe | Auf das von Ihnen betriebene Konto beschränkt | JSON für jedes öffentliche Profil, Hashtags und Erwähnungen geparst |
Was Sie ausführen | Einen Python- oder Node-Prozess lokal | Eine URL und einen Header |
Kosten | Kostenlos | 10 Credits pro Aufruf |
Zwei Zeilen entscheiden es. Wenn Sie Beiträge veröffentlichen, kommentieren oder antworten müssen, kann dieser Server Ihnen überhaupt nicht helfen. Wenn Sie dieselben Felder für hundert Profile benötigen, zu denen Sie keinerlei Beziehung haben, kann ein Server, der um Ihre eigenen Anmeldedaten herum gebaut ist, Ihnen ebenfalls nicht helfen.
Die entscheidende Achse ist die Reichweite, nicht die Ausgereiftheit. Ein Server, der um Ihren eigenen Login herum gebaut ist, kann nur die Konten erreichen, die Sie verwalten – egal wie gut seine Ausgabe ist. Dieser hier beantwortet dieselbe Frage für jedes öffentliche Profil, und die Felder kommen als geparste Arrays zurück, deren Aggregation nichts kostet.
Was dies er Server nicht tut. Keine Kommentare, keine Stories, keine Reels über das hin aus, was der Feed meldet, keine Direktnachrichten, keine Hashtag- oder Ortssuche, und nichts, was schreibt. Er liest zwei Dinge gut.
FAQ
Was ist ein Instagram-MCP-Server?
Ein Server, der Instagram-Daten als Tools bereitstellt, die ein KI-Client aufrufen kann. Der Client sendet einen Tool-Aufruf über das Model Context Protocol, der Server ruft die Daten ab und liefert strukturiertes JSON zurück, und das Modell arbeitet mit dem Ergebniss und sieht nie eine HTML-Seite. Dieser hier stellt zwei schreibgeschützte Tools bereit und läuft remote. Der Client verbindet sich mit einer URL und startet keinen lokalen Prozess.
Gibt es einen offiziellen Instagram-MCP-Server?
Meta veröffentlicht keinen Allzweck-Server. Es gibt ein offizielles MCP für Meta-Werbung, und es deckt Werbekonten und Kampagnen ab, nicht Profil- und Beitragsdaten. Alles andere in diesem Bereich stammt von jemand anderem.
Welche Daten sind abgedeckt?
Öffentliche Profilfelder und der öffentliche Beitrags-Feed, für öffentliche Konten, per Benutzernamen. Ein privates Konto liefert weiterhin seinen Header, die Follower- und Following-Zahlen und ein private: true-flag, aber keine Biografie und keine Beiträge, da es keinen öffentlichen Feed zu lesen gibt. Sie sind dafür verantwortlich, wie Sie die Ergebniss verwenden, einschließlich der Einhaltung der Instagram-Bedingungen und des für Sie geltenden Rechts.
Muss ich etwas hosten oder ausführen?
Nein. Dies ist ein Remote-MCP-Server über streamable HTTP. Nichts zu installieren, keine Python-Umgebung, kein Prozess, der neu gestartet werden muss.
Sind die Daten live oder zwishengespeichert?
Live. Jeder Aufruf ruft zum Zeitpunkt der Anfrage ab und trägt seine eigene requestMetadata.id. Zwei identische Aufrufe sind zwei getrennte Abrufe und keine Wiedergabe einer gespeicherten Kopie. Zähler wie Follower und Likes folgen dem Konto und bewegen sich mit ihm.
Wie viele Beiträge kann ich abrufen?
Zwölf pro Aufruf, eine Instagram-Seite, weitere Seiten kommen über pagination.nextPageToken. Bei einem öffentlichen Konto enthält der Profil-Lookup dieselben zwölf ohne zusätzlche Kosen, sodass kurze Feed-Fragen oft gar keinen Beiträgsaufruf benötigen.
Was passiert, wenn Instagram sein Markup ändert?
Auf Ihrer Seite nichts. Wir verfolgen die Änderungen und halten das Antwort-Schema stabil, und Feldnamen und -typen bleiben gleich. Ein Feld ohne Wert fehlt in dem Element, statt vorhanden und null zu sein, und genau deshalbb sollten optionale Felder mit einem Standardwert gelesen werden.
Kann ich einen Server für mehrere Plattformen nutzen?
Ja. Der Parameter apis akzeptiert eine Liste, und ?apis=instagram,tiktok,youtube gibt Ihrem Agenten drei Plattformen auf einmal.
Welche Clients funktionieren?
Jeder MCP-Client, der streamable HTTP mit benutzerdefinierten Headern unterstützt. Die obigen Konfigurationen sind getestet. Clients mit OAuth-Unterstützung können die URL stattdessen als Connector hinzufügen.
HasData-Links
Produktseiten und Request-Builder | |
Server-Dokumentation | |
Alle 57 Tools in einem Server | |
Client-Anleitungen | |
Die anderen Plattformen, die wir parsen | |
Tarife und Credit-Kosten | |
API-Schlüssel und Nutzung | |
Node-Starter auf npm | |
Python-Starter auf PyPI |
Entwicklung
Dieses Repositorium ist Konfiguration und Dokumentation für einen Remote-Server. Es gibt keinen Build-Schritt und nichts zu containerisieren.
Es enthält jedoch einen Vertragstest. Die README verspricht zwei Tools mit bestmmten Parametern, und die Upstream-Tool-Liste kann sich ändern, ohne dass hier ein Commit erfolgt – und das würde diese Datei stillschweigend lügen lassen. Der Test prüft das Versprechen und läuft wöchentlich in CI sowie bei jedem Push.
HASDATA_API_KEY=your_key_here npm testUnter PowerShel:
$env:HASDATA_API_KEY = "your_key_here"; npm testDer letzte Check tätigt einen echten Aufruf und kostet 10 Credits – das ist der Preiss einer Canary, die aus dem richtigen Grund fehlschlagen kann. Das Auflisten von Tools geligt mit jedem nicht-leeren Schlüssel, und ein Test, der nur Tools auflistet, bleit mit einem widerrufenen Schlüssel grün.
Mitwirken
Korekturen an den Tool-Tabellen und den Antwortbeispielen sind der nützlichste Beitrag, denn das sind die Teile, die abweichen. Geben Sie den von Ihnen getätigten Aufruf und die erhaltene Antwort an. Pull Requests aus Forks führen die Suite ohne Schlüssel aus, und die Live-Checks werden übersprungen, statt rot zu werden.
Lizenz
MIT. Siehe LICENSE.
Available Tools
2 toolshasdata_instagram_posts_getInstagramPostsinstagram_posts: GET /AInspect
Get Instagram Posts
Fetches the latest posts of a public Instagram account by username (handle) and returns each post with caption, hashtags, mentions, likes/comments/plays counts, image and video URLs, dimensions, and timestamp, plus basic account info (full name, profile picture URL, verified/private flags). Supports token-based pagination via nextPageToken to walk older posts. Use to monitor competitor content, track engagement of creator posts, or build datasets of account content for vetting and analytics.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | The maximum number of posts to retrieve per request. Defaults to 12. | |
| handle | Yes | The Instagram username of the account whose posts you want to scrape, without the `@` symbol. | |
| nextPageToken | No | Defines the next page token. It is used for retrieving the next page results. Use the `nextPageToken` value returned by the previous response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It discloses token-based pagination via nextPageToken and limits to public accounts, which is helpful. However, it does not mention error handling, rate limits, authentication requirements, or what happens when an account is not found. For a GET operation, read-only nature is implied but not explicitly stated. This is adequate but leaves some behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: it starts with a clear title line, then a detailed paragraph, and ends with use cases. It front-loads the core functionality and avoids unnecessary repetition. While slightly verbose with the list of return fields, each sentence adds value and the overall length is appropriate for the complexity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (3 parameters, no output schema) and lack of annotations, the description covers the essential aspects: what data is returned, pagination, and the public-account constraint. It does not mention potential errors, maximum limit values, or ordering guarantees, but these are not critical for a basic GET posts endpoint. The description is sufficiently complete for an agent to invoke the tool correctly in typical scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for all three parameters (handle, limit, nextPageToken), so the schema already documents their semantics. The description adds no new information about parameters beyond what the schema provides—it merely reiterates the pagination concept. With high schema coverage, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Fetches' and the resource 'latest posts of a public Instagram account by username (handle)', and enumerates the returned fields (caption, hashtags, mentions, counts, URLs, dimensions, timestamp, and account info). This specificity distinguishes it from the sibling tool getInstagramProfile, which targets profile data, so an agent can immediately tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete use cases: 'monitor competitor content, track engagement of creator posts, or build datasets of account content for vetting and analytics.' This gives clear context for when to use the tool, though it does not explicitly mention exclusions or direct comparisons to the sibling tool. Still, the use cases effectively communicate appropriate scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hasdata_instagram_profile_getInstagramProfileinstagram_profile: GET /AInspect
Get Instagram Profile
Fetches a public Instagram profile by username (handle) and returns full name, biography, external link, profile picture URL, followers count, following count, posts count, verified/private flags, and category. Use to enrich CRM/lead records, verify influencer reach before outreach, monitor competitor accounts, or build datasets of creator metadata for vetting and analytics.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | The Instagram username of the profile you want to scrape, without the `@` symbol. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does state that the profile is public and lists the data returned, implying a read-only fetch. However, it does not disclose potential rate limits, response format, or behavior when a profile is private or nonexistent, which leaves notable gaps for a scraping tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and return fields, then provides a compact use-case sentence. The use-case list is slightly long with overlapping examples, but every sentence contributes orientation for an agent; it is concise without being terse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-oriented public profile fetch with no output schema, the description covers the input, the returned data, and typical use cases. It lacks explicit notes on errors, rate limits, or private-account behavior, but these are minor for this simple tool and the description is otherwise complete enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the only parameter ('handle') with a clear description including the requirement to omit the '@' symbol, so schema description coverage is 100%. The description repeats the handle concept without adding new parameter semantics, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action ('Fetches a public Instagram profile by username (handle)') and names the resource, input, and a concrete list of returned fields (full name, biography, counts, flags, category). This clearly distinguishes it from sibling tools like hasdata_instagram_posts_getInstagramPosts, which targets posts rather than profile metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete application contexts: enriching CRM/lead records, verifying influencer reach, monitoring competitors, and building creator datasets. It does not explicitly state when not to use it or mention alternatives such as the Instagram Posts sibling, but the use-case list makes selection straightforward.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v1.0.0- First observed
hasdata_instagram_posts_getInstagramPosts - First observed
hasdata_instagram_profile_getInstagramProfile
TDQS
Scored across 2 tools
The two tools are completely distinct: one fetches profile metadata, the other fetches posts. There is no overlap in purpose or data returned, making misselection unlikely.
Both tool names follow the same pattern: 'hasdata_instagram_<resource>_get<Resource>'. The structure and verb usage are consistent, making them predictable and easy to understand.
With only 2 tools, this is on the thin side for an Instagram server. While they cover the core profile and posts endpoints, the count barely meets the threshold for a reasonable server scope.
The server covers only profile and posts, leaving significant gaps such as comments, stories, search, or follower interactions. For a comprehensive Instagram API surface, many common operations are missing, which could cause agent failures when those capabilities are needed.
Maintenance
Related MCP Connectors
Instagram profiles, follower/following snapshots and changes, with budgeted public lookups.
61Read-only public Instagram data: profiles, posts, reels, stories, comments, top-accounts ranking.
Get social media data from Instagram and TikTok: profiles, posts, videos, comments, and more.
16 Instagram endpoints. Pay per call in USDC via x402.
Related MCP Servers
- FlicenseAqualityNot gradedmaintenanceEnables access to Instagram data through EnsembleData API, allowing retrieval of user information, posts, reels, follower counts, and search functionality for users, hashtags, and locations.9-
- FlicenseNot gradedqualityDmaintenanceA remote MCP server that provides tools to query live Meta (Facebook+Instagram) and TikTok organic social data, such as follower counts, insights, recent posts, and aggregated overviews.-
- AlicenseAqualityAmaintenanceA hosted Model Context Protocol server providing read-only YouTube tools for search, video/channel data, and transcripts, with no Google Cloud project or API key required.491 npm6MIT
- AlicenseAqualityAmaintenanceEnables MCP clients to perform live Google searches and retrieve structured SERP data including organic results, AI Overviews, People Also Ask, AI Mode answers, news, shopping, and short-video results via eight read-only tools.1073 npm65 PyPI18MIT