Skip to main content
Glama
KaiQin04

Instagram Download MCP Server

by KaiQin04

download_instagram_video

Download Instagram videos, reels, and TV content to your local filesystem with optional metadata and caption extraction.

Instructions

Download an Instagram video's media files to the local filesystem.

Args: url: Instagram post/reel/tv URL. username: Optional Instagram username for authenticated access. password: Optional Instagram password for authenticated access. save_metadata: Save JSON metadata files when available. save_caption: Save caption into a text file when available. download_root: Optional override for download directory.

Returns: A JSON-serializable dict containing download results.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
urlYes
usernameNo
passwordNo
save_metadataNo
save_captionNo
download_rootNo

Implementation Reference

  • The primary handler function for the 'download_instagram_video' MCP tool. It orchestrates shortcode extraction, Instaloader configuration, authentication, video download, and result reporting. Also serves as the registration point via the @mcp.tool() decorator.
    @mcp.tool()
    def download_instagram_video(
        url: str,
        username: str | None = None,
        password: str | None = None,
        save_metadata: bool = True,
        save_caption: bool = True,
        download_root: str | None = None,
    ) -> dict[str, Any]:
        """Download an Instagram video's media files to the local filesystem.
    
        Args:
            url: Instagram post/reel/tv URL.
            username: Optional Instagram username for authenticated access.
            password: Optional Instagram password for authenticated access.
            save_metadata: Save JSON metadata files when available.
            save_caption: Save caption into a text file when available.
            download_root: Optional override for download directory.
    
        Returns:
            A JSON-serializable dict containing download results.
        """
        try:
            shortcode = extract_shortcode(url)
            target_root = _resolve_download_root(download_root)
            loader = _build_instaloader(
                target_root,
                download_pictures=False,
                download_videos=True,
                save_metadata=save_metadata,
                save_caption=save_caption,
            )
            user, pwd = _resolve_credentials(username, password)
            _login_if_needed(loader, user, pwd)
            video_files = _download_videos_for_shortcode(
                loader,
                shortcode,
                target_root,
            )
            download_dir = target_root / shortcode
            after = _snapshot_files(download_dir)
            metadata_files = _collect_paths_by_suffixes(after, {".json"})
            caption_files = _collect_paths_by_suffixes(after, {".txt"})
            return {
                "success": True,
                "shortcode": shortcode,
                "download_dir": str(download_dir),
                "video_files": [str(path) for path in video_files],
                "metadata_files": metadata_files,
                "caption_files": caption_files,
            }
        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)}
  • Helper function to parse Instagram URLs and extract the post shortcode using regex, essential for targeting specific content.
    def extract_shortcode(url: str) -> str:
        """Extract an Instagram shortcode from a supported URL.
    
        Supported formats include:
        - https://www.instagram.com/p/<shortcode>/
        - https://www.instagram.com/reel/<shortcode>/
        - https://www.instagram.com/tv/<shortcode>/
    
        Args:
            url: Instagram post/reel/tv URL.
    
        Returns:
            The extracted shortcode.
    
        Raises:
            ValueError: If the shortcode cannot be extracted.
        """
        pattern = (
            r"(?:https?://)?(?:www\.)?(?:m\.)?instagram\.com/"
            r"(?:p|reel|tv)/([A-Za-z0-9_-]+)"
        )
        match = re.search(pattern, url)
        if not match:
            raise ValueError("Unsupported Instagram URL format.")
        return match.group(1)
  • Core helper that performs the actual Instaloader download for a shortcode, filters for video files (.mp4), and returns their paths.
    def _download_videos_for_shortcode(
        loader: instaloader.Instaloader,
        shortcode: str,
        download_root: Path,
    ) -> list[Path]:
        download_root.mkdir(parents=True, exist_ok=True)
        download_dir = download_root / shortcode
    
        before = _snapshot_files(download_dir)
    
        post = instaloader.Post.from_shortcode(loader.context, shortcode)
        if not _post_has_video(post):
            raise ValueError("The Instagram post does not contain video content.")
    
        loader.download_post(post, target=shortcode)
    
        after = _snapshot_files(download_dir)
        new_files = after - before
        video_files = sorted(
            [path for path in new_files if path.suffix.lower() == ".mp4"],
            key=lambda p: p.stat().st_mtime,
            reverse=True,
        )
        if video_files:
            return video_files
    
        all_videos = sorted(
            [path for path in after if path.suffix.lower() == ".mp4"],
            key=lambda p: p.stat().st_mtime,
            reverse=True,
        )
        if all_videos:
            return all_videos
    
        raise RuntimeError("Download completed but no video files were found.")
  • Helper to configure and instantiate Instaloader with tool-specific download options, directory patterns, and metadata settings.
    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,
        )
  • Instantiates the FastMCP server object 'mcp' to which all tools, including 'download_instagram_video', are registered via decorators.
    mcp = FastMCP("ig-download-mcp")

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