Metadata-Version: 2.4
Name: instagram-mcp
Version: 0.1.1
Summary: Model Context Protocol server for the Instagram Graph API (Business/Creator accounts).
Project-URL: Homepage, https://github.com/AleemHaider/instagram-mcp
Project-URL: Repository, https://github.com/AleemHaider/instagram-mcp
Project-URL: Issues, https://github.com/AleemHaider/instagram-mcp/issues
Project-URL: Changelog, https://github.com/AleemHaider/instagram-mcp/blob/main/CHANGELOG.md
Author: Syed Aleem
License: MIT
License-File: LICENSE
Keywords: anthropic,claude,fastmcp,graph-api,instagram,mcp
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.10
Requires-Dist: httpx>=0.27.0
Requires-Dist: mcp[cli]>=1.2.0
Requires-Dist: python-dotenv>=1.0.0
Provides-Extra: dev
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
Requires-Dist: pytest>=8.0; extra == 'dev'
Requires-Dist: respx>=0.21; extra == 'dev'
Requires-Dist: ruff>=0.6; extra == 'dev'
Description-Content-Type: text/markdown

# instagram-mcp

[![PyPI version](https://img.shields.io/pypi/v/instagram-mcp.svg)](https://pypi.org/project/instagram-mcp/)
[![Python versions](https://img.shields.io/pypi/pyversions/instagram-mcp.svg)](https://pypi.org/project/instagram-mcp/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

A [Model Context Protocol](https://modelcontextprotocol.io) server that wraps the
**Instagram Graph API** so Claude (or any MCP client) can read, publish, comment,
DM, and pull insights from an Instagram **Business** or **Creator** account.

24 tools across five capability areas — profile/media, publishing, comments, DMs,
and insights — built on FastMCP + httpx.

## Quick install

```bash
pip install instagram-mcp
```

Or with `uv`:

```bash
uv tool install instagram-mcp
```

## Setup

### 1. Create a Meta App

1. Go to https://developers.facebook.com/apps → **Create app** → use case **Other** → type **Business**.
2. In the app dashboard, add the **Instagram** product (Add Product → Instagram → Set up).

### 2. Link an Instagram Business/Creator account

You need an Instagram account switched to **Business** or **Creator**, linked to a
Facebook **Page**. In the app dashboard, walk through **Instagram → API setup with
Facebook login → Step 1: Generate access tokens** and link your account.

### 3. Get the required permissions

Generate a token with these scopes (in Graph API Explorer or the Instagram API
setup page):

- `instagram_basic`
- `instagram_content_publish`
- `instagram_manage_comments`
- `instagram_manage_messages`
- `instagram_manage_insights`
- `pages_show_list`
- `pages_read_engagement`
- `business_management`

> While your app is in **Development mode**, only accounts in your app's Roles
> list (admins/developers/testers) can authenticate. That's fine for personal use.
> For other users, you need **App Review** with Advanced Access.

### 4. Mint a long-lived Page token

The fastest way: run the bundled helper.

```bash
instagram-mcp-get-token
```

It will ask for your short-lived user token + app ID/secret, exchange it for a
long-lived user token, list your linked IG accounts, and write `.env` for you.

Manual alternative:

```bash
# Exchange short-lived user token → long-lived (~60 days)
curl -G "https://graph.facebook.com/v21.0/oauth/access_token" \
  --data-urlencode "grant_type=fb_exchange_token" \
  --data-urlencode "client_id=YOUR_APP_ID" \
  --data-urlencode "client_secret=YOUR_APP_SECRET" \
  --data-urlencode "fb_exchange_token=SHORT_LIVED_TOKEN"

# Find your Pages and their IG accounts
curl -G "https://graph.facebook.com/v21.0/me/accounts" \
  --data-urlencode "fields=name,instagram_business_account,access_token" \
  --data-urlencode "access_token=LONG_LIVED_USER_TOKEN"
```

Use the **Page's** `access_token` (never expires) and the
`instagram_business_account.id` of the linked IG account.

### 5. Configure `.env`

```bash
IG_USER_ID=17841446575432302
IG_ACCESS_TOKEN=EAAxxxxxxxxxxxxxxxxxxx
IG_GRAPH_VERSION=v21.0
IG_GRAPH_HOST=graph.facebook.com
```

Set `IG_GRAPH_HOST=graph.instagram.com` if your token came from the **Instagram
Login** path instead of Facebook Login.

## Connect to Claude Desktop

Edit `~/.config/Claude/claude_desktop_config.json` (Linux) or
`~/Library/Application Support/Claude/claude_desktop_config.json` (macOS):

```json
{
  "mcpServers": {
    "instagram": {
      "command": "instagram-mcp",
      "env": {
        "IG_USER_ID": "17841446575432302",
        "IG_ACCESS_TOKEN": "EAAxxxxxxxxxxxxxxxxxxx"
      }
    }
  }
}
```

Restart Claude Desktop. You should see 24 tools under the `instagram` server.

## Available tools

### Profile & media

| Tool | What it does |
|---|---|
| `get_my_profile` | Profile info: bio, followers, media count, etc. |
| `list_my_media` | One page of recent posts |
| `list_all_media` | Auto-paginate through all media |
| `get_media` | Fetch a single media item |
| `list_tagged_media` | Posts the account is tagged in |
| `list_stories` | Currently-live stories (24h window) |

### Hashtags

| Tool | What it does |
|---|---|
| `search_hashtag` | Resolve a `#tag` to its ID |
| `hashtag_top_media` | Top-ranked posts for a hashtag |
| `hashtag_recent_media` | Recent posts for a hashtag (24h window) |

### Publishing

| Tool | What it does |
|---|---|
| `publish_image` | Single image post from a public URL |
| `publish_reel` | Reel (waits for container processing) |
| `publish_story` | Image or video story |
| `publish_carousel` | 2-10 item carousel |
| `get_publish_limit` | Show 24h publish quota usage |

### Comments

| Tool | What it does |
|---|---|
| `list_comments` | Top-level comments + nested replies |
| `get_comment_replies` | Replies under a specific comment |
| `reply_to_comment` | Post a reply |
| `hide_comment` | Hide / unhide |
| `delete_comment` | Delete a comment you own |

### Direct messages

| Tool | What it does |
|---|---|
| `list_conversations` | DM conversations |
| `get_conversation` | Messages in a conversation |
| `send_dm` | Send a DM (optionally with a `message_tag`) |

### Insights

| Tool | What it does |
|---|---|
| `get_account_insights` | Account-level metrics with optional `metric_type` |
| `get_media_insights` | Per-media insights |

## Notes & gotchas

- **Publishing requires public HTTPS URLs.** Meta fetches media server-side. Host
  your images/videos on a publicly accessible URL first.
- **Publish quota is 100 posts per 24h rolling window** on most Business accounts.
- **`send_dm` is response-only by default** — it only works inside the 24h
  user-initiated window. Pass a `message_tag` (e.g. `HUMAN_AGENT`) to send
  outside that window. Tags require Meta approval.
- **Some insight metrics need `metric_type='total_value'`** (Meta tightened this
  in 2024): `views`, `accounts_engaged`, `total_interactions`, `profile_views`,
  `likes`, `comments`, `shares`, `saves`. `reach` and `follower_count` don't.
- **Errors return a structured dict**, not exceptions. Look for `error: true`
  along with `status`, `message`, `code`, `subcode`, and `fbtrace_id` in the
  response — that's the Graph API error, not a Python traceback.

## Development

```bash
git clone https://github.com/AleemHaider/instagram-mcp
cd instagram-mcp
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest
```

## License

MIT — see [LICENSE](LICENSE).
