Stock Image MCP

io.github.HasiltPublished by GitHub account Hasiltv0.1.6Updated Oct 24, 2026

Search and download stock images from Unsplash, Pexels, Pixabay, Freepik, StockVault, and Burst

VerifiedSTDIODesktop onlyWeb Search & ScrapingMedia & Design

Overview

AI-generated overview

A local MCP server that lets an assistant search and download stock images from Unsplash, Pexels, Pixabay, Freepik, StockVault and Burst.

What you can do
Search stock images on one named provider or fan out across every configured provider at once, with orientation and paging options and a best-image picker for a query. Download a chosen image to a local path and return the attribution text when the image came from an earlier search. Look up attribution details for a provider and image ID. Check remaining rate-limit status per provider.
When to use it
Useful when writing blog posts, SEO content or other material and you want the assistant to find and save real stock photos without leaving the conversation. Also handy when you need to compare results across several image providers or keep track of per-provider request limits.
Requirements
Runs locally via uvx from the PyPI package (Python/uv toolchain, fetched on first run). Each user supplies their own provider API keys as environment variables: UNSPLASH_ACCESS_KEY, PEXELS_API_KEY, PIXABAY_API_KEY, FREEPIK_API_KEY and STOCKVAULT_API_KEY; only the providers you configure are queried. Optional tuning variables include DEFAULT_PROVIDER and DOWNLOAD_DIR. Network access to the provider APIs is required.
Before you install
The server stores several third-party API keys in its environment; set only the providers you need. Downloads write files to the local path you specify. Unsplash and Pexels require attribution for public use, and the server only returns the text, so you must place it yourself. Burst is an unofficial HTML scrape with no public API and may fail or return empty results. Provider rate limits and plan-dependent quotas apply.

Installation

In SourceWeft

  1. Open Stock Image MCP in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

stock-image-mcp

An MCP server that lets Claude Code (or any MCP-compatible agent) search and download stock images by tool call — useful for sourcing images while writing SEO blog posts or other content.

Providers

ProviderAPI typeRequires keyDefault rate limit
UnsplashOfficialYes50/hr demo, 5000/hr production
PexelsOfficialYes200/hr
PixabayOfficialYes100 req/60s
FreepikOfficialYesconfigurable (plan-dependent)
StockVaultOfficialYesconfigurable (undocumented, conservative default)
Burst (Shopify)Unofficial scrapeNoself-imposed, polite default

Burst has no public API. It's included as a best-effort HTML scraper, clearly marked unsupported in code — any failure there is caught and reported as an empty result rather than breaking search_all_images.

Install

Each user runs the server locally and supplies their own provider API keys — there's no shared hosting or centrally-held keys.

With Claude Code:

bash
claude mcp add stock-image-mcp \  -e UNSPLASH_ACCESS_KEY=... \  -e UNSPLASH_TIER=demo \  -e PEXELS_API_KEY=... \  -e PIXABAY_API_KEY=... \  -e FREEPIK_API_KEY=... \  -e FREEPIK_REQUESTS_PER_MINUTE=60 \  -e STOCKVAULT_API_KEY=... \  -e STOCKVAULT_REQUESTS_PER_HOUR=60 \  -e BURST_REQUESTS_PER_MINUTE=10 \  -e DEFAULT_PROVIDER=pexels \  -e DOWNLOAD_DIR=./downloads \  -- uvx stock-image-mcp

With OpenAI Codex CLI:

bash
codex mcp add stock-image-mcp \  --env UNSPLASH_ACCESS_KEY=... \  --env UNSPLASH_TIER=demo \  --env PEXELS_API_KEY=... \  --env PIXABAY_API_KEY=... \  --env FREEPIK_API_KEY=... \  --env FREEPIK_REQUESTS_PER_MINUTE=60 \  --env STOCKVAULT_API_KEY=... \  --env STOCKVAULT_REQUESTS_PER_HOUR=60 \  --env BURST_REQUESTS_PER_MINUTE=10 \  --env DEFAULT_PROVIDER=pexels \  --env DOWNLOAD_DIR=./downloads \  -- uvx stock-image-mcp

With Gemini CLI:

bash
gemini mcp add stock-image-mcp \  -e UNSPLASH_ACCESS_KEY=... \  -e UNSPLASH_TIER=demo \  -e PEXELS_API_KEY=... \  -e PIXABAY_API_KEY=... \  -e FREEPIK_API_KEY=... \  -e FREEPIK_REQUESTS_PER_MINUTE=60 \  -e STOCKVAULT_API_KEY=... \  -e STOCKVAULT_REQUESTS_PER_HOUR=60 \  -e BURST_REQUESTS_PER_MINUTE=10 \  -e DEFAULT_PROVIDER=pexels \  -e DOWNLOAD_DIR=./downloads \  -- uvx stock-image-mcp

Or add it to your MCP config manually with uvx (no clone or install step required — uvx fetches the package from PyPI on first run):

json
{  "mcpServers": {    "stock-image-mcp": {      "command": "uvx",      "args": ["stock-image-mcp"],      "env": {        "UNSPLASH_ACCESS_KEY": "...",        "UNSPLASH_TIER": "demo",        "PEXELS_API_KEY": "...",        "PIXABAY_API_KEY": "...",        "FREEPIK_API_KEY": "...",        "FREEPIK_REQUESTS_PER_MINUTE": "60",        "STOCKVAULT_API_KEY": "...",        "STOCKVAULT_REQUESTS_PER_HOUR": "60",        "BURST_REQUESTS_PER_MINUTE": "10",        "DEFAULT_PROVIDER": "pexels",        "DOWNLOAD_DIR": "./downloads"      }    }  }}

Only UNSPLASH_ACCESS_KEY, PEXELS_API_KEY, PIXABAY_API_KEY, FREEPIK_API_KEY, and STOCKVAULT_API_KEY are actual secrets — set only the ones for providers you want enabled and drop the rest; any provider key you omit is simply skipped by search_all_images and rejected if queried directly via search_stock_images. The remaining variables are optional tuning knobs shown above with their defaults — see .env.example for the full list.

Tools

  • search_stock_images(query, provider="default", orientation=None, per_page=10, page=1)
  • search_all_images(query, orientation=None, per_page=5) — fans out to every configured provider concurrently
  • get_best_image(query, provider="default")
  • download_image(url, dest_path, provider=None) — saves locally, returns attribution text if the image came from a prior search
  • get_attribution(provider, image_id)
  • get_rate_limit_status(provider=None)

Usage

You don't call these tools directly — you just talk to your agent, and it decides when to reach for one based on what you asked and the tool descriptions above. A few things worth knowing:

  • Just ask in plain English. "Find me 3 landscape photos of mountains for a blog post" is enough to trigger search_all_images (or search_stock_images if you name a provider). "Download that first Unsplash result to ./images/hero.jpg" triggers download_image. "How many Pexels requests do I have left this hour?" triggers get_rate_limit_status.
  • search_stock_images needs a specific provider (or "default"); search_all_images just queries everything you've configured keys for and merges the results. Say "search Pexels only" or similar if you care which one gets used.
  • Several providers (Unsplash and Pexels in particular) require attribution if you actually use the image somewhere public. download_image returns the attribution text alongside the file when it applies — it's on you to paste it wherever the image ends up, the server won't do that part for you.
  • Want to call tools by hand instead of through a conversation? See the MCP Inspector section under Development below.

Developing locally

Working from a clone instead of the published package:

bash
uv synccp .env.example .env   # fill in the API keys for providers you want enableduv run stock-image-mcp

Point your Claude config at the local checkout instead of uvx:

json
{  "mcpServers": {    "stock-image-mcp": {      "command": "uv",      "args": [        "--directory",        "/absolute/path/to/stock-image-mcp",        "run",        "stock-image-mcp"      ],      "env": {        "UNSPLASH_ACCESS_KEY": "...",        "UNSPLASH_TIER": "demo",        "PEXELS_API_KEY": "...",        "PIXABAY_API_KEY": "...",        "FREEPIK_API_KEY": "...",        "FREEPIK_REQUESTS_PER_MINUTE": "60",        "STOCKVAULT_API_KEY": "...",        "STOCKVAULT_REQUESTS_PER_HOUR": "60",        "BURST_REQUESTS_PER_MINUTE": "10",        "DEFAULT_PROVIDER": "pexels",        "DOWNLOAD_DIR": "./downloads"      }    }  }}

Development

bash
uv run pytest              # test suite (mocked HTTP, no live keys needed)uv run ruff check .         # lintuv run ruff format .        # formatuv run mypy src             # type check

To try it against real providers, use the MCP Inspector:

bash
npx @modelcontextprotocol/inspector uv run stock-image-mcp

Source: README.md at commit 38b4ebf

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.1.6LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts