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).
Быстрый старт
| URL | https://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
Получение данных одного общедоступного профиля по нику.
| Параметр | Тип | Обязательный | Примечания |
|---|---|---|---|
handle | string | да | Имя пользователя без @, как оно указано в 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
Публичная лента публикаций одного аккаунта с постраничной загрузкой.
| Параметр | Тип | Обязательный | Примечания |
|---|---|---|---|
handle | string | да | Имя пользователя без @ |
limit | number | Примерный верхний предел количества публикаций в одном ответе. Фактический максимум — двенадцать; большее значение не увеличит количество результатов | |
nextPageToken | string | Значение 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 или Node | URL и заголовок |
| Стоимость | Бесплатно | 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 через PyPI | hasdata-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.