Skip to main content
Glama
KaiQin04

Instagram Download MCP Server

by KaiQin04

download_instagram_highlights

Download Instagram highlights from any user's profile by providing login credentials and specifying the target username, with optional filters for specific highlight titles.

Instructions

Download Instagram highlights for a target user.

Note: This feature requires login.

Args: username_target: Target Instagram username. highlight_title: Optional highlight title filter. username: Instagram username for authenticated access. password: Instagram password for authenticated access. download_root: Optional override for download directory.

Returns: A JSON-serializable dict containing download results.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
username_targetYes
highlight_titleNo
usernameNo
passwordNo
download_rootNo

Implementation Reference

  • The primary handler function for the 'download_instagram_highlights' tool. It logs into Instagram using provided credentials, retrieves highlights for the target user (optionally filtered by title), downloads the story items from each highlight, and returns a structured result with paths to downloaded files.
    @mcp.tool()
    def download_instagram_highlights(
        username_target: str,
        highlight_title: str | None = None,
        username: str | None = None,
        password: str | None = None,
        download_root: str | None = None,
    ) -> dict[str, Any]:
        """Download Instagram highlights for a target user.
    
        Note: This feature requires login.
    
        Args:
            username_target: Target Instagram username.
            highlight_title: Optional highlight title filter.
            username: Instagram username for authenticated access.
            password: Instagram password for authenticated access.
            download_root: Optional override for download directory.
    
        Returns:
            A JSON-serializable dict containing download results.
        """
        try:
            target_username = username_target.strip()
            if not target_username:
                raise ValueError("username_target must not be empty.")
    
            title_filter = highlight_title.strip() if highlight_title else None
    
            target_root = _resolve_download_root(download_root)
            loader = _build_instaloader(
                target_root,
                download_pictures=True,
                download_videos=True,
                save_metadata=False,
                save_caption=False,
            )
            user, pwd = _resolve_credentials(username, password)
            _require_login(user, pwd, "highlights")
            _login_if_needed(loader, user, pwd)
    
            base_username = target_username.lower()
            profile = instaloader.Profile.from_username(
                loader.context,
                base_username,
            )
    
            results: list[dict[str, Any]] = []
            for highlight in loader.get_highlights(profile):
                if title_filter and (
                    highlight.title.strip().casefold()
                    != title_filter.casefold()
                ):
                    continue
    
                safe_title = _sanitize_target_component(highlight.title)
                highlight_dirname = (
                    f"{base_username}_highlight_{safe_title}_{highlight.unique_id}"
                )
                download_dir = target_root / highlight_dirname
                before = _snapshot_files(download_dir)
    
                num_items = 0
                num_downloaded = 0
                for item in highlight.get_items():
                    num_items += 1
                    if loader.download_storyitem(item, target=highlight_dirname):
                        num_downloaded += 1
    
                after = _snapshot_files(download_dir)
                downloaded_files = (after - before) or after
                results.append(
                    {
                        "title": highlight.title,
                        "unique_id": highlight.unique_id,
                        "download_dir": str(download_dir),
                        "num_items": num_items,
                        "num_downloaded": num_downloaded,
                        "image_files": _collect_paths_by_suffixes(
                            downloaded_files,
                            {".jpg", ".jpeg", ".png", ".webp"},
                        ),
                        "video_files": _collect_paths_by_suffixes(
                            downloaded_files,
                            {".mp4"},
                        ),
                    }
                )
    
            if title_filter and not results:
                raise ValueError(
                    "No highlights matched the given highlight_title."
                )
    
            return {
                "success": True,
                "username_target": target_username,
                "highlight_title": title_filter,
                "highlights": results,
            }
        except instaloader.exceptions.InstaloaderException as exc:
            return {
                "success": False,
                "error": f"Instaloader error: {exc.__class__.__name__}: {exc}",
            }
        except Exception as exc:
            return {"success": False, "error": str(exc)}
  • Registers the 'download_instagram_highlights' tool with the FastMCP server instance using the @mcp.tool() decorator.
    @mcp.tool()
  • Helper function to resolve the download root directory, defaulting to ~/Downloads/instagram if not provided.
    def _resolve_download_root(download_root: str | None) -> Path:
        if download_root is None:
            return DEFAULT_DOWNLOAD_ROOT
        cleaned = download_root.strip()
        if not cleaned:
            return DEFAULT_DOWNLOAD_ROOT
        return Path(cleaned).expanduser()
  • Helper to create and configure an Instaloader instance for downloading.
    def _build_instaloader(
        download_root: Path,
        download_pictures: bool = False,
        download_videos: bool = True,
        save_metadata: bool = False,
        save_caption: bool = False,
    ) -> instaloader.Instaloader:
        dirname_pattern = str(download_root / "{target}")
        post_metadata_txt_pattern = "{caption}" if save_caption else ""
        return instaloader.Instaloader(
            quiet=True,
            dirname_pattern=dirname_pattern,
            download_pictures=download_pictures,
            download_videos=download_videos,
            download_video_thumbnails=False,
            download_geotags=False,
            download_comments=False,
            save_metadata=save_metadata,
            compress_json=False,
            post_metadata_txt_pattern=post_metadata_txt_pattern,
        )
  • Helper to normalize credential strings, stripping whitespace.
    def _normalize_credential(value: str | None) -> str | None:
        if value is None:
            return None
        stripped = value.strip()
        return stripped if stripped else None

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/KaiQin04/ig-download-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server