API ВЕГА

Instagram MCP Server

Хостируемый сервер Model Context Protocol (MCP), который предоставляет Claude, Cursor, Windsurf и любому другому MCP-клиенту два инструмента Instagram только для чтения. С их помощью можно найти общедоступный профиль по имени пользователя и просмотреть ленту его общедоступных публикаций в формате структурированного JSON.

Сервер получает общедоступные данные об аккаунтах, но не выполняет никаких действий от их имени. Подключать аккаунт не нужно, и ваш аккаунт нигде не задействуется.

1 000 бесплатных кредитов в месяц без привязки карты — этого хватит на 100 вызовов Instagram.

https://mcp.hasdata.com/mcp?apis=instagram

Содержание

  • Что понадобится

  • Быстрый старт

  • Примеры запросов

  • Инструменты

  • Ошибки и сбои

  • Стоимость, бесплатный тариф и ограничения

  • Выбор инструмента

  • Сравнение с аналогами

  • Часто задаваемые вопросы

  • Ссылки HasData

  • Разработка

  • Участие в проекте

  • Лицензия

Что понадобится

MCP-клиент с поддержкой streamable HTTP и пользовательских заголовков. Также потребуется ключ API HasData — его можно бесплатно создать в панели управления, без привязки карты. Бесплатный тариф включает 100 вызовов в месяц. Больше ничего не нужно: это удалённый сервер, поэтому для работы достаточно URL и заголовка — запускать контейнер не придётся. Если клиент поддерживает только stdio, используйте вместо этого запускающий пакет @hasdata/instagram-mcp (npm) или hasdata-instagram-mcp (PyPI).

Быстрый старт

URLhttps://mcp.hasdata.com/mcp?apis=instagram
ТранспортHTTP, streamable
Заголовок авторизацииx-api-key: HASDATA_API_KEY

URL сервера одинаков для всех клиентов. Мы проверили подключение в Claude Code и Claude Desktop. Примеры для остальных клиентов составлены в соответствии с их официальной документацией по настройке удалённых серверов.

Клиенты с поддержкой OAuth можно настроить как коннектор с тем же URL и выполнить вход без добавления ключа в файл конфигурации.

Claude Code

claude mcp add --transport http instagram "https://mcp.hasdata.com/mcp?apis=instagram" \
  --header "x-api-key: HASDATA_API_KEY"

Claude Desktop

Claude Desktop загружает из файла конфигурации только локальные серверы stdio, поэтому для доступа к удалённому серверу понадобится запускающий пакет stdio. Эту роль выполняет пакет @hasdata/instagram-mcp: он получает ключ из переменной окружения.

claude_desktop_config.json:

{
  "mcpServers": {
    "instagram": {
      "command": "npx",
      "args": ["-y", "@hasdata/instagram-mcp"],
      "env": { "HASDATA_API_KEY": "YOUR_KEY" }
    }
  }
}

Предпочитаете Python вместо Node? Замените запускающий пакет на пакет PyPI, который uvx запускает без ручной установки:

{
  "mcpServers": {
    "instagram": {
      "command": "uvx",
      "args": ["hasdata-instagram-mcp"],
      "env": { "HASDATA_API_KEY": "YOUR_KEY" }
    }
  }
}

Если клиент поддерживает OAuth, можно добавить URL как пользовательский коннектор и обойтись без запускающего пакета.

Cursor

.cursor/mcp.json:

{
  "mcpServers": {
    "instagram": {
      "url": "https://mcp.hasdata.com/mcp?apis=instagram",
      "headers": { "x-api-key": "HASDATA_API_KEY" }
    }
  }
}

Windsurf

~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "instagram": {
      "serverUrl": "https://mcp.hasdata.com/mcp?apis=instagram",
      "headers": { "x-api-key": "HASDATA_API_KEY" }
    }
  }
}

Cline

{
  "mcpServers": {
    "instagram": {
      "url": "https://mcp.hasdata.com/mcp?apis=instagram",
      "type": "streamableHttp",
      "headers": { "x-api-key": "HASDATA_API_KEY" },
      "disabled": false
    }
  }
}

VS Code

.vscode/mcp.json:

{
  "servers": {
    "instagram": {
      "type": "http",
      "url": "https://mcp.hasdata.com/mcp?apis=instagram",
      "headers": { "x-api-key": "HASDATA_API_KEY" }
    }
  }
}

Gemini CLI

~/.gemini/settings.json:

{
  "mcpServers": {
    "instagram": {
      "httpUrl": "https://mcp.hasdata.com/mcp?apis=instagram",
      "headers": { "x-api-key": "HASDATA_API_KEY" }
    }
  }
}

Примеры запросов

Для каждого примера нужен один вызов инструмента, если не указано иное.

Найди профиль @nasa и сообщи количество подписчиков, есть ли у аккаунта отметка верификации и какие ссылки указаны в описании.

Один вызов, 10 кредитов. В ответе для общедоступного аккаунта уже содержатся двенадцать последних публикаций, поэтому для вопроса о недавней активности дополнительный вызов не нужен.

Сравни @nasa, @natgeo и @bbcearth по количеству подписчиков, подписок и наличию отметки верификации.

Три вызова, 30 кредитов — по одному на каждый аккаунт.

Просмотри последние пятьдесят публикаций @nasa и перечисли все хештеги с указанием частоты их появления.

Пять вызовов, 50 кредитов. За один вызов возвращается двенадцать публикаций, поэтому для пятидесяти понадобятся пять страниц.

Для последних двенадцати публикаций @natgeo перечисли аккаунты, упомянутые в описании каждой публикации, и укажи её тип.

Один вызов, 10 кредитов. Упоминания и хештеги извлекаются из описания и передаются в объектах публикаций.

Эти примеры эффективны по двум причинам. Во-первых, хештеги и упоминания возвращаются в виде массивов, уже извлечённых из описания, поэтому агенту не нужно искать их с помощью регулярных выражений в обычном тексте. Во-вторых, последние публикации включены в ответ на запрос профиля. Поэтому на многие исследовательские вопросы можно ответить одним вызовом.

Инструменты

ИнструментЧто возвращает
hasdata_instagram_posts_getInstagramPostsПолучает последние публикации общедоступного аккаунта Instagram по имени пользователя (нику) и возвращает данные о каждой публикации: идентификатор, короткий код, описание, тип, productType, постоянную ссылку, URL изображения и альтернативный текст, а также извлечённые из описания хештеги и упоминания. Не возвращает показатели вовлечённости и временную метку. 10 кредитов за вызов
hasdata_instagram_profile_getInstagramProfileПолучает данные общедоступного профиля Instagram по имени пользователя (нику): идентификатор, полное имя, описание, ссылки из описания, URL изображения профиля, количество подписчиков и подписок, признак верификации и двенадцать последних публикаций. 10 кредитов за вызов

Оба инструмента работают только на чтение и используют ник общедоступного аккаунта. Примеры ниже сокращены и основаны на реальных вызовах; числовые значения меняются по мере появления новых публикаций. Рассматривайте их как примеры структуры данных. Название каждого инструмента ведёт на страницу документации соответствующего endpoint.

Примеры содержат полезные данные, а не весь ответ. Результат tools/call включает один текстовый блок, внутри которого находится JSON с полями url, status, text и json; полученные данные находятся в json. В необработанном ответе JSON-RPC путь к ним такой: result.content[0].text. Разберите это значение, а затем обратитесь к .json. Чат-клиент выполнит распаковку автоматически, а при прямом обращении к endpoint это нужно сделать самостоятельно.

Получить профиль Instagram

hasdata_instagram_profile_getInstagramProfile

Получение данных одного общедоступного профиля по нику.

ПараметрТипОбязательныйПримечания
handlestringдаИмя пользователя без @, как оно указано в URL профиля

Возвращает поля id, username, fullName, biography, verified, счётчики followersCount и followsCount, поле profilePicUrl, внутренний идентификатор fbid, массив bioLinks и поле latestPosts.

Какие поля гарантированно присутствуют, а какие — нет: по результатам проверки двадцати аккаунтов поля id, username, followersCount, followsCount, profilePicUrl и fbid возвращались каждый раз. Для всех общедоступных аккаунтов также возвращались fullName, biography, verified, bioLinks и latestPosts; при обработке этих полей следует предусмотреть значение по умолчанию.

Для закрытого аккаунта сервер возвращает private: true и почти ничего больше. Описание, публикации и счётчики, кроме количества подписчиков, отсутствуют. Прежде чем обращаться к остальным данным, проверьте это поле.

bioLinks — это массив объектов, а не строк. Каждый элемент содержит url, title, обёрнутый в перенаправление Instagram адрес redirectUrl и поле linkType. Чтобы получить конечный адрес ссылки, используйте .url.

{
  "id": "528817151",
  "username": "nasa",
  "fullName": "NASA",
  "biography": "Making the seemingly impossible, possible. ✨",
  "verified": true,
  "followersCount": 104345698,
  "followsCount": 91,
  "profilePicUrl": "https://scontent.cdninstagram.com/v/t51.2885-19/…",
  "fbid": "17841401474538262",
  "bioLinks": [
    {
      "url": "https://www.nasa.gov",
      "title": "NASA.gov Homepage",
      "redirectUrl": "https://l.instagram.com/?u=https%3A%2F%2Fwww.nasa.gov%2F&e=…",
      "linkType": "external"
    }
  ],
  "latestPosts": [ "…the most recent posts, same shape as the posts tool…" ]
}

Получение публикаций Instagram

hasdata_instagram_posts_getInstagramPosts

Публичная лента публикаций одного аккаунта с постраничной загрузкой.

ПараметрТипОбязательныйПримечания
handlestringдаИмя пользователя без @
limitnumberПримерный верхний предел количества публикаций в одном ответе. Фактический максимум — двенадцать; большее значение не увеличит количество результатов
nextPageTokenstringЗначение pagination.nextPageToken из предыдущего ответа

limit задаёт приблизительный предел, а не точное количество. Одна страница Instagram содержит двенадцать публикаций — это жёсткий максимум для одного вызова. Поэтому при limit: 50 вернутся двенадцать публикаций. Если значение ниже максимума, их количество будет примерно соответствовать запрошенному, но не обязательно совпадёт с ним. Точность зависит от аккаунта. Например, при проверке @nasa значение 2 вернуло 4 публикации, 6 — 6, 11 — 10, а 13 — 12. Считайте limit приблизительной верхней границей и проверяйте длину массива, а не рассчитывайте на точное совпадение.

Ответ содержит только posts и pagination. В более ранних версиях вместе с лентой возвращались поля с данными аккаунта. Если ваш код рассчитан на прежнюю структуру ответа, для получения имени и аватара потребуется отдельный вызов профиля.

Для каждой публикации возвращаются id, shortcode, caption, type, productType, url, alt, ownerUsername и ownerId; кроме редких случаев, также присутствует displayUrl. Поля hashtags и mentions добавляются только при наличии соответствующих данных в подписи: среди 177 проверенных публикаций упоминания встречались примерно в половине, а хештеги — примерно в четверти.

В этом ответе нет показателей вовлечённости. У публикаций отсутствуют likesCount, commentsCount и timestamp, поэтому для сортировки по популярности или фильтрации по дате понадобится другой источник данных.

{
  "posts": [
    {
      "id": "3983374110243288826",
      "shortcode": "DdHyaYAifb6",
      "caption": "Cementing their names in history.\n\nThe Artemis III crew is leaving their mark […] @NASAKennedy",
      "type": "Carousel",
      "productType": "carousel_container",
      "mentions": ["@NASAKennedy", "@EuropeanSpaceAgency", "@Astro_Luca"],
      "url": "https://www.instagram.com/p/DdHyaYAifb6/",
      "displayUrl": "https://scontent.cdninstagram.com/v/t51.…",
      "alt": "Photo by NASA on September 10, 2026. May be an image of text.",
      "ownerUsername": "nasa",
      "ownerId": "528817151"
    }
  ],
  "pagination": {
    "morePostsAvailable": true,
    "nextPageToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…",
    "hasdataLink": "https://api.hasdata.com/scrape/instagram/posts?handle=nasa&nextPageToken=…"
  }
}

Хештеги и упоминания сохраняют префиксы # и @. Это важно, если вы сопоставляете их со списком, который подготовили самостоятельно. При переходе к следующей странице ориентируйтесь на флаг morePostsAvailable. Поле hasdataLink содержит ссылку на ту же следующую страницу в формате REST URL и пригодится, если нужно вручную повторить вызов агента.

Ошибки и сценарии сбоев

При вызове инструмента клиент почти никогда не получает HTTP-код ошибки. На уровне MCP возвращается код 200, а сведения о сбое передаются в результате: isError принимает значение true, а причина указывается текстом. Вместо строки статуса агент получает сообщение.

Неверный ключ отображается в ответе инструмента, а не как ошибка соединения. Для получения списка инструментов подойдёт любой непустой ключ, поэтому клиент успешно завершит рукопожатие и отобразит зелёный статус. Однако первый вызов инструмента вернёт isError: true и текст HasData API error: 401 Unauthorized. Обращайте внимание на это сообщение: на более ранних этапах ошибка не обнаруживается.

Отсутствующий ключ — единственный случай, когда возникает настоящая HTTP-ошибка. Проверка авторизации выполняется до вызова любого инструмента, поэтому соединение завершается с ошибкой 401.

Аргумент, не соответствующий схеме, отклоняется до отправки запроса. Сервер возвращает isError: true и текст MCP error -32602: Input validation error, указывая проблемное поле. Данные не запрашиваются, плата не взимается.

Если имя пользователя не найдено, возвращается явная ошибка, а не пустые данные. Ответ содержит isError: true, текст HasData API error: 400 Bad Request и значение error в поле requestMetadata.status. Это удобный сценарий: причину сбоя легко определить. Проверяйте флаг, а не длину массива.

Для аккаунта, данные которого недоступны публично, лента публикаций не возвращается. Инструменты работают с публичными аккаунтами; для непубличного аккаунта данные недоступны. Отсутствие latestPosts следует считать признаком того, что аккаунт не входит в область поддержки, а не пустой лентой.

В результатах с данными также есть requestMetadata.id — его можно указать при обращении в поддержку, — а также ссылки html и json на сохранённый артефакт конкретного вызова.

Стоимость, бесплатный тариф и ограничения

Каждый успешный вызов любого инструмента для Instagram стоит 10 кредитов. Размер ответа на стоимость не влияет: профиль с двенадцатью публикациями стоит столько же, сколько профиль без них.

Бесплатный тариф предоставляет 1 000 кредитов в месяц без привязки карты — этого хватит на 100 вызовов инструментов Instagram. Кредиты обновляются в соответствии с платёжным циклом, поэтому агент с небольшой нагрузкой может бессрочно работать на бесплатном тарифе.

Платные тарифы начинаются с $59 в месяц за 200 000 кредитов, то есть за 20 000 вызовов. При увеличении объёма цена за единицу снижается: с $2.95 за 1 000 вызовов на начальном тарифе до $1.19 на Basic и $0.83 на тарифах Growth. Актуальные цены указаны на странице с тарифами.

Тариф также определяет допустимое число одновременных запросов. На бесплатном тарифе разрешён 1 запрос одновременно, на Startup — 5, на Basic — 15, а на тарифах Growth — от 50 до 500. Если ваш процесс работает без постоянного контроля, предусмотрите обработку превышения лимита: агент, который одновременно обращается к нескольким аккаунтам, может упереться в ограничение раньше, чем вы ожидаете.

Каждый переход на следующую страницу требует отдельного вызова. Запрос, который загружает сто публикаций из двух аккаунтов, потребует восемнадцать вызовов и 180 кредитов. Бесплатного тарифа хватит на большее количество сравнений профилей, чем на глубокий сбор данных из лент.

Выбор инструментов

Параметр ?apis=instagram предоставляет ровно два инструмента. Параметр принимает список: например, ?apis=instagram,tiktok,youtube добавит агенту три социальные платформы. Если параметр не указывать, станут доступны все инструменты HasData — на данный момент их 57.

Обычно лучше начинать с небольшого списка. Модель чаще правильно выбирает между двумя инструментами, чем между пятьюдесятью семью, а описания инструментов занимают контекст при каждом обращении.

Чаще всего список расширяют для сравнения данных между платформами. Когда инструменты для Instagram и TikTok доступны одновременно, один и тот же вопрос об аккаунтах на обеих платформах можно задать в одном запросе.

Сравнение с другими решениями

Почти все MCP-серверы для Instagram решают другие задачи, поэтому выбрать подходящий вариант обычно несложно.

Популярные серверы предназначены для управления аккаунтом. Некоторые используют Instagram Graph API, чтобы публиковать записи, читать комментарии и управлять аккаунтами, которыми вы администрируете. Другие работают с личными сообщениями. Серверы для анализа вовлечённости, согласно собственным инструкциям по настройке, запрашивают INSTAGRAM_USERNAME и INSTAGRAM_PASSWORD в блоке env, поскольку выполняют вход и просматривают Instagram от вашего имени. Все эти варианты подходят, если вам нужно управлять собственным аккаунтом.

Этот сервер не выполняет вход ни в чей аккаунт и решает другую задачу. Все его запросы относятся к аккаунтам, которыми вы не владеете, и выполняются одинаково независимо от выбранного аккаунта.

Сервер для управления аккаунтомЭтот сервер
От чьего имени работаетОт имени вашего аккаунта — через токен или сессиюНи от чьего: он читает публичные данные
Что нужно настроитьУчётные данные или приложение Graph API для каждого аккаунтаОдин API key при первоначальной настройке
С какими аккаунтами работаетС аккаунтами, которыми вы администрируетеС любыми публичными аккаунтами
Публикации и сообщенияДа, для этого он и предназначенНе поддерживаются
РезультатДанные в пределах аккаунта, которым вы управляетеJSON для любого публичного аккаунта с распознанными хештегами и упоминаниями
Что нужно запуститьЛокальный процесс Python или NodeURL и заголовок
СтоимостьБесплатно10 кредитов за вызов

Решающими будут два пункта. Если вам нужно публиковать записи, комментировать или отвечать на сообщения, этот сервер не подойдёт. Если же нужно получать одинаковые поля для сотни аккаунтов, с которыми вас ничего не связывает, сервер, работающий с вашими собственными учётными данными, тоже не решит задачу.

Главное отличие — область охвата, а не качество реализации. Сервер, использующий ваш аккаунт, может обращаться только к аккаунтам, которыми вы управляете, независимо от того, насколько хорошо он формирует результаты. Этот сервер отвечает на одни и те же вопросы о любом публичном аккаунте и возвращает распознанные массивы, которые можно объединять без дополнительных затрат.

Чего этот сервер не умеет. Он не возвращает комментарии и истории, не предоставляет Reels сверх тех данных, которые уже есть в ленте, не работает с личными сообщениями и не выполняет поиск по хештегам или местоположению. Он также ничего не публикует и не изменяет. Сервер хорошо справляется с двумя задачами.

FAQ

Что такое Instagram MCP-сервер?

Сервер предоставляет данные Instagram в виде инструментов, которые может вызывать AI-клиент. Клиент отправляет вызов инструмента через Model Context Protocol, сервер получает данные и возвращает структурированный JSON. Модель работает с результатом и не видит HTML-страницу. Этот сервер предоставляет два инструмента только для чтения и работает удалённо. Клиент подключается по URL, и запускать локальный процесс не нужно.

Существует ли официальный MCP-сервер Instagram?

Meta не выпускает универсальный сервер такого типа. Есть официальный MCP для рекламы Meta, но он работает с рекламными аккаунтами и кампаниями, а не с данными профилей и публикаций. Все остальные решения в этой области созданы сторонними разработчиками.

Какие данные доступны?

Публичные поля профиля и лента публикаций открытых аккаунтов — поиск выполняется по имени пользователя. Для закрытого аккаунта сервер всё равно возвращает шапку профиля, количество подписчиков и подписок, а также флаг private: true, но не биографию и публикации: публичную ленту такого аккаунта прочитать нельзя. Вы сами отвечаете за использование результатов, в том числе за соблюдение условий Instagram и применимого к вам законодательства.

Нужно ли размещать сервер у себя или что-то запускать?

Нет. Это удалённый MCP-сервер, работающий по streamable HTTP. Ничего устанавливать не нужно, среда Python не требуется, перезапускать процесс тоже не придётся.

Данные актуальны в реальном времени или кэшируются?

Данные актуальны в реальном времени. Каждый вызов получает данные в момент запроса и содержит собственный requestMetadata.id. Два одинаковых вызова — это два отдельных запроса, а не повторная выдача сохранённой копии. Счётчики подписчиков и отметок «Нравится» отражают текущее состояние аккаунта и меняются вместе с ним.

Сколько публикаций можно получить?

Двенадцать за один вызов — одна страница Instagram. Для получения следующих страниц используется pagination.nextPageToken. Для открытого аккаунта запрос профиля уже включает те же двенадцать публикаций без дополнительной платы, поэтому для простых вопросов о ленте отдельный вызов для получения публикаций часто не нужен.

Что произойдёт, если Instagram изменит разметку?

Вам ничего не придётся делать. Мы отслеживаем изменения и поддерживаем стабильную схему ответа: названия и типы полей остаются прежними. Если у поля нет значения, оно отсутствует в объекте, а не присутствует со значением null. Поэтому при чтении необязательных полей следует задавать значение по умолчанию.

Можно ли использовать один сервер для нескольких платформ?

Да. Параметр apis принимает список, а ?apis=instagram,tiktok,youtube позволяет агенту одновременно работать с тремя платформами.

Какие клиенты поддерживаются?

Любые MCP-клиенты, поддерживающие streamable HTTP с пользовательскими заголовками. Приведённые выше конфигурации проверены. Клиенты с поддержкой OAuth можно подключить, добавив сервер как коннектор.

Ссылки HasData

Страницы продуктов и конструктор запросовInstagram Profile API и Instagram Posts API
Документация сервераДокументация MCP-сервера
Все 57 инструментов на одном сервереHasData/hasdata-mcp
Руководства по работе с клиентамиMCP-клиенты и интеграции
Другие платформы, данные которых мы собираемЕщё 53 API для скрейпинга
Тарифы и стоимость запросов в кредитахТарифы и стоимость запросов в кредитах
Ключи и статистика использованияПанель управления HasData
Запуск Node через npm@hasdata/instagram-mcp
Запуск Python через PyPIhasdata-instagram-mcp

Разработка

В этом репозитории находятся конфигурация и документация для удалённого сервера. Сборка не требуется, упаковывать его в контейнер тоже не нужно.

Здесь есть проверка контракта. В README заявлены два инструмента с определёнными параметрами, но список инструментов на стороне сервера может измениться без коммита в этот репозиторий — тогда README незаметно перестанет соответствовать действительности. Проверка подтверждает заявленные параметры и запускается еженедельно в CI, а также при каждом push.

HASDATA_API_KEY=your_key_here npm test

В PowerShell:

$env:HASDATA_API_KEY = "your_key_here"; npm test

Последняя проверка выполняет настоящий запрос и стоит 10 кредитов. Это плата за контрольную проверку, которая может завершиться ошибкой, если для этого есть реальная причина. Получить список инструментов можно с любым непустым ключом, поэтому тест, который только запрашивает список, пройдёт даже с отозванным ключом.

Участие в разработке

Полезнее всего присылать исправления для таблиц инструментов и примеров ответов — именно эти разделы быстрее всего устаревают. Укажите вызов, который вы выполнили, и полученный ответ. Для pull request из форков набор тестов запускается без ключа, а проверки в реальном времени пропускаются, чтобы сборка не завершалась ошибкой.

Лицензия

MIT. См. LICENSE.