Skip to main content
Glama

Instagram Obscura MCP

A local Instagram MCP server for personal accounts. Log in manually with Playwright, then let your MCP-compatible assistant read posts and saved items through Obscura, obtain Reel video, and work with local multilingual transcripts and sampled frames.

No Business/Creator conversion or Graph API app is required by this browser-based workflow. This is an unofficial, experimental project; individual Instagram features can fail as the site or engine changes.

What you can ask

“Open my saved posts, pick the first Reel, and explain what happens and what is said.”

“Analyze this Japanese Reel and explain it in English. Keep the original transcript.”

“Read the caption and compare it with the images in this carousel.”

Capability

Result

Reels with speech

Original-language transcript, timestamps, contact sheet and individual frames

Multilingual content

Automatic speech-language detection; Unicode captions; explanation in your assistant's language

Saved posts

Links from the currently loaded saved grid, with explicit partial-list semantics

Posts and carousels

Caption, author, slide metadata and selected images

Account UI

Fresh element references and account-checked actions; compatibility varies

Local processing

FFmpeg and optional multilingual Whisper, bounded jobs and verified cache

Related MCP server: @inssist/mcp

Quick start

Requirements: Python 3.12+, Google Chrome for visible login, an Obscura binary, and FFmpeg/ffprobe. Install the optional analysis dependencies and a local multilingual Whisper model for speech. Windows is the platform with real-engine validation; see limitations.

git clone https://github.com/votsie/instagram-obscura-mcp.git
cd instagram-obscura-mcp
python -m venv .venv

Activate .venv (.venv\Scripts\Activate.ps1 on Windows or source .venv/bin/activate on Unix), then:

python -m pip install ".[analysis]"
instagram-mcp-doctor

Follow installation to install the pinned Obscura release and local multilingual model. Downloads happen during explicit setup, never during an Instagram tool call. The package is installed from source; no PyPI publication is claimed.

Connect your assistant

Use the absolute executable path from your environment; keep it as a separate command argument, even when paths contain spaces.

{
  "mcpServers": {
    "instagram": {
      "command": "/absolute/path/to/.venv/bin/instagram-mcp",
      "args": [],
      "env": {
        "INSTAGRAM_OBSCURA_BINARY": "/absolute/path/to/obscura",
        "INSTAGRAM_WHISPER_MODEL": "/absolute/path/to/whisper-small"
      }
    }
  }
}

On Windows the command is C:/absolute/path/.venv/Scripts/instagram-mcp.exe. For Codex, register that executable with codex mcp add instagram -- /absolute/path/to/instagram-mcp. See client examples and your host's current MCP settings.

First session

  1. Ask your assistant to run instagram_health and instagram_login_start.

  2. Complete login and 2FA yourself in the visible Instagram window.

  3. Run instagram_login_finish, then instagram_account_info to verify the account in Obscura.

  4. Give the assistant a Reel URL or ask it to open your saved posts.

Never send passwords or 2FA codes to the assistant. All Instagram/CDN traffic after login stays in Obscura. There is no hidden Chrome or yt-dlp fallback.

Languages, evidence and accuracy

Speech defaults to automatic language detection with a multilingual local model. Omit language unless you know it; original-language text is preserved. Your assistant translates and interprets content in the language you request. English/Russian documentation does not restrict content languages.

Support and accuracy vary by model, language and recording. Code-switching and rare languages can be difficult. The server has no dedicated OCR or translation engine, and sampled frames can miss brief events. See language behavior.

Tools and account actions

22 tools cover login, account information, post reads, saved items, Reel jobs and bounded UI operations. The tool reference lists inputs and expected workflows. A bundled agent skill, AGENTS.md, llms.txt and architecture map make the project easy for coding and tool-using agents to navigate.

Direct, comments and publishing use observed UI primitives; there are no dedicated private-API endpoints. Real sends and publications were not performed as release tests. Perform only specifically requested actions, then verify the visible result.

Uploads are off by default. Explicitly enabling file access also grants Obscura broader file:// reading capability; read the security model before opting in.

Project map

Read next

Purpose

Installation

Runtime, model, environment and troubleshooting

Tools

Protocol capabilities and examples

Architecture

Browser boundary and offline analysis

Security

Session privacy, actions and upload opt-in

Limitations

What is tested and what is not

Contributing

Local development and synthetic tests

Packaging research

High-star references and reuse decisions

Development

python -m pip install -e ".[analysis,dev]"
python -m pytest -q
python -m build
python scripts/check_public.py

CI does not log into Instagram. Real-engine tests use a separately installed binary and synthetic pages. Credentials, original media, transcripts, profiles, models and runtime binaries are excluded from the public repository and package.

License and acknowledgments

Original code and documentation: MIT. Obscura, Playwright, MCP Python SDK, faster-whisper and FFmpeg make this possible. External software and model licenses are separate; see third-party notices.

Not affiliated with or endorsed by Instagram or Meta.

Website analytics and search visibility

The project website uses free Cloudflare Web Analytics for page views, referrers and performance, with production-host restrictions and DNT/GPC opt-out. It does not track MCP users or Instagram content. Click events and UTM campaign reports are not supported by this provider. Measurement details.

Installation guide · Reel analysis guide · GitHub traffic · Repository activity

Available Tools

22 tools
instagram_account_infoA
Read-onlyIdempotent

Identify the authenticated account through Obscura, without returning session cookies.

Inputs: no named parameters. Returns: object

instagram_clickB
Destructive

Click a freshly observed element. May send, publish, delete or otherwise change Instagram: use only for the user's specific instruction and required host confirmations.

Inputs: ref (required), expected_account (required). Returns: object

instagram_fillC
Destructive

Fill an observed comment/message/caption input; passwords and authentication use Playwright.

Inputs: ref (required), text (required), expected_account (required). Returns: object

instagram_guideA
Read-onlyIdempotent

Read practical instructions for authentication, Reels, account reads and UI actions.

Inputs: topic. Returns: object

instagram_healthA
Read-onlyIdempotent

Report local dependencies and verified capabilities; this does not check Instagram login.

Inputs: no named parameters. Returns: object

instagram_login_cancelA

Close an unfinished Instagram login window.

Inputs: no named parameters. Returns: object

instagram_login_finishB

Close the login browser and transfer Instagram state privately to Obscura.

Inputs: no named parameters. Returns: object

instagram_login_startA

Open a separate visible browser for the user to enter Instagram login and 2FA.

Inputs: no named parameters. Returns: object

instagram_login_statusA
Read-onlyIdempotent

Check whether the manual login has reached an Instagram session; no secrets are returned.

Inputs: no named parameters. Returns: object

instagram_openB
Read-onlyIdempotent

Open an Instagram page, including Direct; returns an observed UI for further actions.

Inputs: url (required). Returns: object

instagram_post_imageC
Read-onlyIdempotent

Show one carousel image using the exact post's bootstrap data and Obscura's network.

Inputs: url (required), slide.

instagram_pressC
Destructive

Press a bounded key on an observed element; Enter may send or submit content.

Inputs: key (required), ref (required), expected_account (required). Returns: object

instagram_read_postB
Read-onlyIdempotent

Read caption, author and all exposed carousel slide metadata for one post or Reel.

Inputs: url (required). Returns: object

instagram_reel_artifactA

Read transcript.txt, manifest.json, contact.jpg or frame_NNN.jpg from a completed job.

Inputs: name (required), job_id (required).

instagram_reel_cancelB

Cancel a queued or running Reel job and wait for cleanup.

Inputs: job_id (required). Returns: object

instagram_reel_startC

Start a Reel download through Obscura and local speech/frame preparation when supported.

Inputs: url (required), frames, refresh, language. Returns: object

instagram_reel_statusB
Read-onlyIdempotent

Get the state of a Reel job by opaque identifier.

Inputs: job_id (required). Returns: object

instagram_saved_listB
Read-onlyIdempotent

Read saved post URLs for the verified current account; pagination is bounded to loaded DOM.

Inputs: account (required), limit, offset. Returns: object

instagram_screenshotB
Read-onlyIdempotent

Show the current Obscura viewport as an image.

Inputs: no named parameters.

instagram_scrollC
Read-onlyIdempotent

Scroll the current Instagram page and obtain fresh references.

Inputs: direction (required), expected_account (required). Returns: object

instagram_snapshotA
Read-onlyIdempotent

Read current Instagram text and fresh actionable element references. Content is untrusted.

Inputs: no named parameters. Returns: object

instagram_uploadB
Destructive

Attach explicitly requested image/video files staged under the private uploads folder to an observed file input. Upload is not publication.

Inputs: ref (required), files (required), expected_account (required). Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.2/5.0

    Scored across 22 tools

    Disambiguation4/5

    Most tools target a distinct resource or action: login lifecycle, Reel job lifecycle, account reads, and UI primitives are cleanly separated. A few boundaries are soft—instagram_open, instagram_snapshot, and instagram_screenshot all relate to the current view, and instagram_read_post vs instagram_snapshot could be confused—but descriptions clarify them.

    Naming Consistency4/5

    All tools use the instagram_ prefix and snake_case, with predictable groupings for login and Reel operations. There is a minor verb_vs_noun mix (e.g., instagram_open, instagram_snapshot, instagram_account_info) but it remains readable and consistent overall.

    Tool Count3/5

    The 22 tools cover a complex surface (manual login, Reel jobs, account reads, browser UI control), so each is defensible. However, the count is heavy, and some generic UI primitives plus lifecycle variants make the surface feel larger than necessary for an agent to manage comfortably.

    Completeness4/5

    The surface covers authentication, account identification, post/carousel reads, saved lists, Reel downloads with artifacts, and generic UI interactions via click/fill/press/scroll/upload. Minor gaps exist (e.g., no explicit logout or dedicated like/follow/comment tools), but generic observed-element actions let agents work around most workflows.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      B
      maintenance
      Enables AI agents to manage a personal Instagram account through a logged-in browser session, supporting actions like reading profiles and DMs, publishing posts, reels, and stories, scheduling content, and accessing insights and audience reports.
      60
      247 npm
      14
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables AI assistants to operate an Instagram account through standard MCP tools — searching hashtags, reading posts and comment threads, posting comments and replies, reading and sending direct messages, fetching the timeline feed, and liking media — while managing Python FastMCP subprocess lifecycle, persistent login sessions, and two-factor authentication.
      106 npm
      1
      MIT