Metadata-Version: 2.4
Name: igsight-mcp
Version: 1.2.0
Summary: MCP server to read and analyze Instagram posts and profiles for AI agents
Keywords: instagram,mcp,model-context-protocol,ai-agents,social-media,read-only
Author: Vinícius Hugenthobler
License-Expression: MIT
License-File: LICENSE
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Internet
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Dist: fastmcp>=2.0.0
Requires-Dist: httpx>=0.28.0
Requires-Dist: instaloader>=4.14
Requires-Dist: platformdirs>=4.0
Requires-Dist: pydantic>=2.10
Requires-Dist: yt-dlp>=2025.1
Requires-Dist: faster-whisper>=1.1.0 ; extra == 'complete'
Requires-Dist: imageio-ffmpeg>=0.5.1 ; extra == 'complete'
Requires-Dist: imageio-ffmpeg>=0.5.1 ; extra == 'ffmpeg'
Requires-Dist: faster-whisper>=1.1.0 ; extra == 'local'
Requires-Dist: playwright>=1.49.0 ; extra == 'login'
Requires-Dist: rapidocr-onnxruntime>=1.4.4 ; extra == 'ocr'
Requires-Python: >=3.11
Project-URL: Homepage, https://github.com/vinihuge/igsight-mcp
Project-URL: Repository, https://github.com/vinihuge/igsight-mcp
Project-URL: Documentation, https://github.com/vinihuge/igsight-mcp/tree/main/docs
Project-URL: Changelog, https://github.com/vinihuge/igsight-mcp/blob/main/CHANGELOG.md
Project-URL: Issues, https://github.com/vinihuge/igsight-mcp/issues
Provides-Extra: complete
Provides-Extra: ffmpeg
Provides-Extra: local
Provides-Extra: login
Provides-Extra: ocr
Description-Content-Type: text/markdown

# igsight-mcp

MCP server to read and analyze Instagram posts and profiles for AI agents.

Inspired by [smorand/mcp-instagram](https://github.com/smorand/mcp-instagram) (MIT). See [NOTICE](NOTICE) for attribution details.

PyPI: [igsight-mcp](https://pypi.org/project/igsight-mcp/)

## Quickstart

**Fastest path:** install into your MCP client, save an Instagram session with **`igsight-mcp login`** (or use browser cookies), restart the client, then call **`get_post`** on a public Instagram URL.

```bash
igsight-mcp install --client cursor    # or: claude | vscode | all
pip install 'igsight-mcp[login]' && igsight-mcp login   # recommended session setup
igsight-mcp doctor                     # fast local checklist (+ fixes)
igsight-mcp doctor --online            # optional live Instagram session probe
```

One-click (same config as `install`; log into Instagram in Chrome first):

[![Add to Cursor](https://img.shields.io/badge/Add%20to%20Cursor-igsight-000?style=for-the-badge&logo=cursor)](cursor://anysphere.cursor-deeplink/mcp/install?name=igsight&config=eyJjb21tYW5kIjoidXZ4IiwiYXJncyI6WyJpZ3NpZ2h0LW1jcCJdLCJlbnYiOnsiSUdTSUdIVF9DT09LSUVTX0ZST01fQlJPV1NFUiI6ImF1dG8ifX0)

[![Install in VS Code](https://img.shields.io/badge/Install%20in%20VS%20Code-igsight-007ACC?style=for-the-badge&logo=visualstudiocode)](vscode:mcp/install?name=igsight&config=eyJjb21tYW5kIjoidXZ4IiwiYXJncyI6WyJpZ3NpZ2h0LW1jcCJdLCJlbnYiOnsiSUdTSUdIVF9DT09LSUVTX0ZST01fQlJPV1NFUiI6ImF1dG8ifX0)

**Claude Desktop:** download **`igsight-mcp.mcpb`** from [GitHub Releases](https://github.com/vinihuge/igsight-mcp/releases) and open it in Claude Desktop, or run `igsight-mcp install --client claude`.

Requires **[uv](https://docs.astral.sh/uv/)** (for `uvx`) and **Python ≥ 3.11**. No API keys required for public posts.

### Optional extras

| Extra | Purpose |
| --- | --- |
| **`igsight-mcp[local]`** | Offline transcription via faster-whisper when no cloud `IGSIGHT_TRANSCRIBE_*` keys are set (`IGSIGHT_TRANSCRIBE_BACKEND` defaults to **`auto`**) |
| **`igsight-mcp[ffmpeg]`** | Bundled ffmpeg when none is on `PATH` (GPL binary — opt-in; see [NOTICE](NOTICE)) |
| **`igsight-mcp[complete]`** | `[local]` + `[ffmpeg]` |
| **`igsight-mcp[login]`** | **`igsight-mcp login`** — dedicated browser session (Playwright) |
| **`igsight-mcp[ocr]`** | On-screen text in **`get_post(..., ocr=True)`** |

System ffmpeg/ffprobe on `PATH` is still preferred when available. Without ffprobe, duration is read via ffmpeg.

### Run the server manually

```bash
uvx igsight-mcp                  # stdio (default)
uvx igsight-mcp --transport http # streamable HTTP on 127.0.0.1:8000
```

From a git checkout: `uvx --from . igsight-mcp`

### Verify setup

In the client, call **`check_auth`**, or from a terminal run **`igsight-mcp doctor`** (local-only by default; **`doctor --online`** for one live cookie probe). Both report cookie source (`login`, `file`, `browser:…`, or `none`), ffmpeg, transcription backend, and rate limits without echoing secrets. **`doctor`** also reads your installed Claude/Cursor/VS Code MCP configs and shows each client's `IGSIGHT_COOKIES_FROM_BROWSER`.

## Let your agent set it up

Point your agent at **[llms.txt](llms.txt)** and **[AGENTS.md](AGENTS.md)**, then use a one-line prompt:

> Install igsight-mcp following llms.txt and run self_test, then give feedback

Example first **`get_post`** prompt in your client:

> Use the get_post tool on `https://www.instagram.com/p/SHORTCODE/` with default settings.

## MCP client configuration

Use the same command everywhere:

```json
"command": "uvx",
"args": ["igsight-mcp"]
```

Add an **`env`** block for `IGSIGHT_*` variables (paths shown are examples—adjust for your machine).

### Shared `env` example

```json
"env": {
  "IGSIGHT_COOKIES_FROM_BROWSER": "chrome",
  "IGSIGHT_CACHE_DIR": "/home/you/.cache/igsight-mcp",
  "IGSIGHT_CACHE_TTL": "3600",
  "IGSIGHT_TRANSCRIBE_BASE_URL": "https://api.groq.com/openai/v1",
  "IGSIGHT_TRANSCRIBE_API_KEY": "your-api-key-here",
  "IGSIGHT_TRANSCRIBE_MODEL": "whisper-large-v3-turbo"
}
```

Transcription is optional; omit the three `IGSIGHT_TRANSCRIBE_*` keys to skip speech-to-text.

### Claude Desktop

Edit **`claude_desktop_config.json`**:

| OS | Path |
| --- | --- |
| macOS | `~/Library/Application Support/Claude/claude_desktop_config.json` |
| Windows | `%APPDATA%\Claude\claude_desktop_config.json` |

```json
{
  "mcpServers": {
    "igsight": {
      "command": "uvx",
      "args": ["igsight-mcp"],
      "env": {
        "IGSIGHT_COOKIES_FROM_BROWSER": "chrome"
      }
    }
  }
}
```

Because the MCP server runs on the same machine as your browser, **`IGSIGHT_COOKIES_FROM_BROWSER`** avoids exporting `cookies.txt`. Alternatively set **`IGSIGHT_COOKIES_FILE`** (see [docs/cookies.md](docs/cookies.md)).

Restart Claude Desktop after saving.

### Cursor

**Project** (repository root): `.cursor/mcp.json`

**Global**: `~/.cursor/mcp.json` (macOS/Linux) or `%USERPROFILE%\.cursor\mcp.json` (Windows)

```json
{
  "mcpServers": {
    "igsight": {
      "command": "uvx",
      "args": ["igsight-mcp"],
      "env": {
        "IGSIGHT_COOKIES_FROM_BROWSER": "chrome"
      }
    }
  }
}
```

Reload MCP servers from Cursor settings after editing.

### Grok Bot

In Grok Bot MCP settings, add a **stdio** server with command **`uvx`**, arguments **`["igsight-mcp"]`**, and the same **`env`** keys as above (UI labels vary; the transport is stdio JSON-RPC).

### Generic stdio MCP JSON

```json
{
  "mcpServers": {
    "igsight": {
      "command": "uvx",
      "args": ["igsight-mcp"],
      "env": {
        "IGSIGHT_COOKIES_FILE": "/path/to/cookies.txt",
        "IGSIGHT_CACHE_DIR": "/path/to/cache",
        "IGSIGHT_CACHE_TTL": "3600",
        "IGSIGHT_TRANSCRIBE_BASE_URL": "https://api.openai.com/v1",
        "IGSIGHT_TRANSCRIBE_API_KEY": "sk-...",
        "IGSIGHT_TRANSCRIBE_MODEL": "whisper-1"
      }
    }
  }
}
```

## Tools

**v1.0 highlights:** stories and highlights (cookies), multi-profile **`compare_profiles`**, scene-change video frames with uniform fallback, optional OCR extra, nightly upstream smoke in CI, and the full [docs/](docs/) set linked below.

| Tool | Inputs | Outputs |
| --- | --- | --- |
| **`health_check()`** | _(none)_ | `status` (`"ok"`), `version` (package version string), `message` (short status text) |
| **`get_post(url, max_frames=6, transcribe=True, ocr=False)`** | `url` — Instagram post or reel URL (or shortcode forms resolved by the server). `max_frames` — key frames for video/reel (clamped to **1–20**; out-of-range values adjust with a **warning**). `transcribe` — when `true`, attempt speech-to-text on video/reel if transcription env is configured. `ocr` — when `true` and `igsight-mcp[ocr]` is installed, extract on-screen text per image/frame (otherwise a **warning** with install hint). | **Structured content:** `kind` (`photo` \| `carousel` \| `video` \| `reel`), `shortcode`, `author`, `caption`, `hashtags`, `mentions`, `timestamp`, `local_paths`, `warnings`, optional `likes`, `comments_count`. **Video/reel extras:** `duration`, `transcript` (`text`, `language`, `segments[]` with `start`/`end`/`text`) when transcription succeeds; frames prefer **scene cuts** (`IGSIGHT_FRAME_STRATEGY=scene`, fallback to uniform with **warnings**). **OCR extras:** optional `ocr_frames`, `on_screen_text` when enabled. **Content blocks:** JPEG **`ImageContent`** for each carousel slide or sampled frame. Partial failures (download, ffmpeg, transcription, OCR) append human-readable strings to **`warnings`** without failing the whole tool when possible. |
| **`compare_profiles(handles, n=12)`** | `handles` — **2–5** `@username` or profile URLs (duplicates de-duplicated with a **warning**). `n` — recent posts per profile (clamped to **1–50** like **`analyze_profile`**). | `profiles` (compact summary per handle), `table` (followers, posting cadence, mix %, engagement, top hashtags/keywords), `themes` (shared vs unique), `leaders` (best per metric), `warnings`. One failing profile becomes an error row; others still return. |
| **`get_stories(handle, limit=20)`** | `handle` — profile username or URL. `limit` — story items (clamped to **1–50**). **Requires** session cookies (file or browser). | Story items in the same shape as **`get_post`** (metadata, images, optional video transcript), plus `warnings`. Without cookies: clear login-required error, no network. |
| **`get_highlights(handle, max_highlights=10, items_per_highlight=20)`** | `handle` — profile username or URL. Caps clamped (**max_highlights** ≤ **30**, **items_per_highlight** ≤ **50**). **Requires** session cookies (file or browser). | List of `{ id, title, cover, items:[...] }` with **`get_post`**-compatible items and `warnings`. |
| **`analyze_profile(handle, n=12, transcribe_top_reels=0)`** | `handle` — `@username` or profile URL. `n` — recent posts to analyze (clamped to **1–50**). `transcribe_top_reels` — when **1–3**, transcribe speech on that many top-engagement reels among the analyzed posts (requires ffmpeg + a configured transcription backend). | Profile fields: `username`, `full_name`, `bio`, `external_url`, `verified`, `followers`, `following`, `posts_count`. Analytics: `posts`, `mix`, `posting_frequency`, `engagement`, `top_posts`, `recurring_hashtags`, `recurring_keywords`, `first_caption_lines`, optional `top_reels_transcripts` (shortcode, engagement, transcript payload), `warnings`. |
| **`get_comments(url, limit=50)`** | `url` — post, reel, or IGTV URL/shortcode. `limit` — comments to return (clamped to **1–200**). | `comments` (username, text, timestamp, likes, etc.) and `warnings`. **Requires** session cookies (file or browser). |
| **`download_media(url, audio_only=False)`** | `url` — post or reel URL/shortcode. `audio_only` — when `true`, extract one MP3 from video/reel instead of saving video files. | `kind`, absolute `local_paths` under the cache media directory, and `warnings`. Carousel downloads are capped (see implementation). |
| **`check_auth()`** | _(none)_ | `cookies_loaded`, `cookies_file` (path when using a file, else `null`), `cookies_source` (`login`, `file`, `browser:<name>`, or `none`), `has_sessionid`, `cookies_valid` (`true`/`false`/`null`), `ffmpeg_available`, `transcription_backend`, `transcription_configured`, `cache_dir`, `cache_ttl_seconds`, `rate_limit`, `warnings`. Never includes API keys or cookie values. |
| **`self_test(profile="nasa", skip_network=False, skip_cookie_steps=False, skip_download=False)`** | `profile` — public handle for `analyze_profile`. Toggles skip network-heavy steps, cookie-only `get_comments`, or `download_media`. | `worked`, `skipped`, `errors` (step + message), `missing_config`, `suggestions`, `summary`, `version`. Uses the built-in rate limiter (~5 Instagram requests when network steps run). Never returns secrets. |

## Environment variables

All configuration uses **`IGSIGHT_*`** environment variables (there is no separate config file). Defaults match the implementation in `src/igsight_mcp/core/`.

| Variable | Default | Description |
| --- | --- | --- |
| **`IGSIGHT_COOKIES_FILE`** | _(unset)_ | Path to a Netscape-format cookies file. Wins over saved login and browser. See [docs/cookies.md](docs/cookies.md). |
| **`IGSIGHT_COOKIES_FROM_BROWSER`** | **`auto`** when unset | After file and **`igsight-mcp login`** session: explicit browser name, or **`auto`** (Safari last on macOS). CLI: **`--cookies-from-browser`**. |
| **`IGSIGHT_DATA_DIR`** | platform user data dir | Login session cookies and Playwright profile (`igsight-mcp login`). |
| **`IGSIGHT_CACHE_DIR`** | `~/.cache/igsight-mcp` | Root directory for JSON caches (posts, transcripts, `get_post` media metadata). |
| **`IGSIGHT_CACHE_TTL`** | `3600` | Cache entry lifetime in seconds. Invalid values fall back to `3600`. `0` disables TTL reads (effectively no cache reuse). |
| **`IGSIGHT_TRANSCRIBE_BASE_URL`** | _(empty)_ | OpenAI-compatible API base URL, without trailing slash. Required with API key and model to enable transcription. |
| **`IGSIGHT_TRANSCRIBE_API_KEY`** | _(empty)_ | Bearer token for the transcription API. Never logged or returned by **`check_auth`**. |
| **`IGSIGHT_TRANSCRIBE_MODEL`** | _(empty)_ | Model id for `/audio/transcriptions`. |
| **`IGSIGHT_TRANSCRIBE_BACKEND`** | `auto` | `auto` (default), `openai_compatible`, or `faster_whisper`. **`auto`** uses cloud API when all three `IGSIGHT_TRANSCRIBE_*` vars are set, otherwise local faster-whisper when `igsight-mcp[local]` is installed. |
| **`IGSIGHT_WHISPER_MODEL`** | `small` | faster-whisper model size/name when using the local backend. |
| **`IGSIGHT_WHISPER_DEVICE`** | `auto` | Device for local Whisper: `auto`, `cpu`, or `cuda` (CPU uses int8 compute). |

There are **no** `IGSIGHT_*` rate-limit overrides; limits are fixed in code and reported by **`check_auth`** under `rate_limit`:

| Field | Default |
| --- | --- |
| `min_interval_seconds` | `3.0` |
| `max_interval_seconds` | `5.0` |
| `hourly_budget` | `200` |
| `bucket_capacity` | `1.0` |
| `refill_seconds` | `4.0` |

### Transcription examples

**Groq**

```json
"IGSIGHT_TRANSCRIBE_BASE_URL": "https://api.groq.com/openai/v1",
"IGSIGHT_TRANSCRIBE_API_KEY": "gsk_...",
"IGSIGHT_TRANSCRIBE_MODEL": "whisper-large-v3-turbo"
```

**OpenAI**

```json
"IGSIGHT_TRANSCRIBE_BASE_URL": "https://api.openai.com/v1",
"IGSIGHT_TRANSCRIBE_API_KEY": "sk-...",
"IGSIGHT_TRANSCRIBE_MODEL": "whisper-1"
```

Alternative OpenAI model example: `gpt-4o-mini-transcribe` (if your account exposes it on the same API).

All three transcription variables must be set together for the OpenAI-compatible backend; otherwise video/reel posts still return frames but add a transcription warning (unless local faster-whisper is selected).

**Local faster-whisper**

```json
"IGSIGHT_TRANSCRIBE_BACKEND": "faster_whisper",
"IGSIGHT_WHISPER_MODEL": "small",
"IGSIGHT_WHISPER_DEVICE": "auto"
```

Install `igsight-mcp[local]` in the same environment as the server. With `IGSIGHT_TRANSCRIBE_BACKEND=auto`, the server uses the API when all three `IGSIGHT_TRANSCRIBE_*` vars are set, otherwise local Whisper when the extra is installed.

## Third-party plugins

Install separate Python packages that declare setuptools entry points in group `igsight_mcp.plugins`. They can add MCP tools without forking the core server. Control loading with `IGSIGHT_DISABLE_PLUGINS` and `IGSIGHT_PLUGINS`. See **[docs/plugins.md](docs/plugins.md)** and **`examples/igsight-plugin-hello/`**.

## HTTP transport

For MCP clients that speak **streamable HTTP** instead of stdio:

| Variable / flag | Default | Purpose |
| --- | --- | --- |
| `--transport http` or `IGSIGHT_TRANSPORT=http` | `stdio` | Enable HTTP transport |
| `--host` / `IGSIGHT_HOST` | `127.0.0.1` | Bind address |
| `--port` / `IGSIGHT_PORT` | `8000` | Listen port |
| `IGSIGHT_HTTP_TOKEN` | _(unset)_ | When set, requires `Authorization: Bearer <token>` on every HTTP request |

```bash
export IGSIGHT_HTTP_TOKEN="$(openssl rand -hex 32)"
uvx igsight-mcp --transport http --host 127.0.0.1 --port 8000
```

### HTTP security warning

Streamable **HTTP** exposes an unauthenticated MCP API on the host and port you bind **unless** you set `IGSIGHT_HTTP_TOKEN`. There is no built-in TLS; anyone who can reach the port can call your tools (including Instagram actions using your local cookies).

- **Prefer stdio** when the MCP client runs on the same machine (`uvx igsight-mcp` with no flags).
- For HTTP, bind to **`127.0.0.1`** (the CLI default via `--host` / `IGSIGHT_HOST`) and connect only from localhost, or place the service behind a **firewall** or **reverse proxy with authentication**.
- Set a long random **`IGSIGHT_HTTP_TOKEN`** whenever the listener is not strictly local.
- The **Docker** image defaults to `--host 0.0.0.0` so port publishing works; treat published ports as public unless you add a token, network policy, or proxy auth (see [Docker](#docker)).

Binding to a non-loopback address prints a stderr warning; always set `IGSIGHT_HTTP_TOKEN` when the port is reachable from other machines.

## Cookies

See **[docs/cookies.md](docs/cookies.md)** for **`IGSIGHT_COOKIES_FROM_BROWSER`** (local browser auto-load), Netscape **`IGSIGHT_COOKIES_FILE`**, Keychain/DPAPI troubleshooting, secondary accounts, and keeping cookies out of git.

## Account safety and rate limits

**igsight-mcp** is built for **occasional, read-only** agent use—not bulk scraping.

- **Built-in rate limiting** spaces Instagram requests (roughly 3–5 seconds jitter between calls, token bucket, and an hourly budget of 200 requests). Hitting limits raises a rate-limit error; wait and retry.
- **No bulk scraping** — do not loop thousands of profiles or posts through the tools.
- **Avoid datacenter IPs** — Instagram often blocks cloud VPS IPs. Prefer a home or office network where you normally use Instagram. **`check_auth`** warns when common cloud environment variables are detected.
- Use a **secondary account** and browser or file cookies rather than hammering anonymous endpoints.

## Legal and terms of use

**Not affiliated with, endorsed by, or sponsored by Meta Platforms, Inc. Instagram is a trademark of Meta.**

You are responsible for complying with Instagram’s Terms of Use, applicable copyright law, and privacy rules. This project provides **read-only** access to public (or session-allowed) content for personal/agent assistance. Do not use it to harass users, bypass paywalls, or redistribute media against creators’ rights. Respect creators and platform policies.

## Demo

<!-- TODO: Record a short demo GIF (Claude Desktop or Cursor calling get_post on a public post) and save as docs/assets/demo.gif -->

![Demo: get_post in an MCP client](https://raw.githubusercontent.com/vinihuge/igsight-mcp/main/docs/assets/demo.gif)

## Docker

Published images: [`ghcr.io/vinihuge/igsight-mcp`](https://github.com/vinihuge/igsight-mcp/pkgs/container/igsight-mcp).

**Security:** the default command binds **streamable HTTP** MCP to **`0.0.0.0:8000`**, so anyone who can reach the port can use the server unless you protect it. **Strongly recommended:** set **`IGSIGHT_HTTP_TOKEN`** to a long random secret and configure MCP clients to send `Authorization: Bearer <token>`. Prefer not publishing the port on untrusted networks; use stdio mode (below) when the client runs on the same host.

The image includes **ffmpeg** and the `igsight-mcp` wheel installed with [uv](https://docs.astral.sh/uv/). It runs as a non-root user. **No local Whisper model** is baked in; use API transcription env vars (see above) or install `[local]` only in custom builds.

Mount volumes for cache and cookies so data survives restarts:

| Mount / env | Purpose |
| --- | --- |
| `-v igsight-cache:/home/igsight/.cache/igsight-mcp` | Post and media cache (`IGSIGHT_CACHE_DIR`) |
| `-v /path/to/cookies.txt:/home/igsight/cookies.txt:ro` + `-e IGSIGHT_COOKIES_FILE=/home/igsight/cookies.txt` | Netscape cookies for authenticated requests |

**HTTP (default transport)**

```bash
docker run --rm -p 8000:8000 \
  -e IGSIGHT_HTTP_TOKEN="replace-with-a-long-random-secret" \
  -v igsight-cache:/home/igsight/.cache/igsight-mcp \
  -v "$HOME/.config/igsight/cookies.txt:/home/igsight/cookies.txt:ro" \
  -e IGSIGHT_COOKIES_FILE=/home/igsight/cookies.txt \
  ghcr.io/vinihuge/igsight-mcp:latest
```

**Stdio (Claude Desktop, Cursor, Grok Bot, etc.)**

Use `-i` so the MCP client can use stdin/stdout; override the default HTTP command with `--transport stdio`:

```bash
docker run --rm -i \
  -v igsight-cache:/home/igsight/.cache/igsight-mcp \
  -v "$HOME/.config/igsight/cookies.txt:/home/igsight/cookies.txt:ro" \
  -e IGSIGHT_COOKIES_FILE=/home/igsight/cookies.txt \
  ghcr.io/vinihuge/igsight-mcp:latest \
  --transport stdio
```

Example MCP client config: `command` = `docker`, `args` = `["run", "--rm", "-i", "-v", "igsight-cache:/home/igsight/.cache/igsight-mcp", "ghcr.io/vinihuge/igsight-mcp:latest", "--transport", "stdio"]` (add cookie mounts and `env` as needed).

## Documentation

Detailed guides (architecture, tools, transcription, FAQ, comparisons):

- [docs/architecture.md](docs/architecture.md)
- [docs/tools.md](docs/tools.md)
- [docs/transcription.md](docs/transcription.md)
- [docs/faq.md](docs/faq.md)
- [docs/comparison.md](docs/comparison.md)
- [docs/cookies.md](docs/cookies.md) · [docs/plugins.md](docs/plugins.md)

Agent onboarding: [llms.txt](llms.txt) and [AGENTS.md](AGENTS.md).

## Development

Requires [uv](https://docs.astral.sh/uv/). See [CONTRIBUTING.md](CONTRIBUTING.md).

```bash
uv sync --all-groups
make check          # ruff, mypy --strict, pytest
uv run igsight-mcp  # stdio MCP server
uvx --from . igsight-mcp
```

## Support the project

If igsight-mcp saves you time, consider sponsoring on [GitHub Sponsors](https://github.com/sponsors/vinihuge).

### Crypto

Always double-check the network before sending; funds sent on the wrong network may be lost.

| Network | Address | QR |
| --- | --- | --- |
| Bitcoin (BTC) | `bc1qfm4mhns9j4s589lhc9xq6asxpf5x93vhxkdlnn` | ![Bitcoin QR](https://raw.githubusercontent.com/vinihuge/igsight-mcp/main/assets/donate/btc.png) |
| EVM (Ethereum, BNB Smart Chain, Arbitrum; ETH and USDC/USDT on those networks) | `0x816895DFd46328258Bc11E133bD6d659Ccd0E323` | ![EVM QR](https://raw.githubusercontent.com/vinihuge/igsight-mcp/main/assets/donate/evm.png) |
| Solana (SOL, USDC) | `7zvKEwXR5KpbwoorQ4JhjhPSDDkwujKu7tN4BSeAq3Ci` | ![Solana QR](https://raw.githubusercontent.com/vinihuge/igsight-mcp/main/assets/donate/solana.png) |
| Tron (TRX, USDT TRC-20) | `TRk3jC7FjkDpLyHThVogP5pPeeufkSTQ7C` | ![Tron QR](https://raw.githubusercontent.com/vinihuge/igsight-mcp/main/assets/donate/tron.png) |

---

Built by Vinícius · creator of [WeTrackWise](https://wetrackwise.com)
