Back to MCP Servers

Webfetch

License-first federated image search across 25 providers. Returns open/platform/editorial license tags, attribution strings, dimensions, and download-ready URLs via `npx -y getwebfetch-mcp`.

search-data-extraction
By ashlrai
3Updated 1 week agoJavaScriptMIT

Installation

npx -y getwebfetch-mcp

Configuration

{
  "mcpServers": {
    "webfetch": {
      "command": "npx",
      "args": ["-y", "webfetch"]
    }
  }
}

How to use

  1. Run the installation command above (if needed)
  2. Open your Claude Code settings file (~/.claude/settings.json)
  3. Add the configuration to the mcpServers section
  4. Restart Claude Code to apply changes

webfetch

npm version CI License: MIT webfetch MCP server Discord GitHub stars

The license-first image layer for AI agents and humans.

One MCP server, one CLI, and one HTTP server that federate across 25 image providers, rank results license-first, and reject UNKNOWN results by default. Any agent that speaks MCP (Claude Code, Cursor, Cline, Continue, Roo Code, Codex) wires up from one config line. Landing page, pricing, and hosted usage live at getwebfetch.com.

Install

SurfaceOne-liner
npmnpm i -g getwebfetch
Homebrewbrew tap ashlrai/webfetch && brew install webfetch
Dockerdocker run --rm ghcr.io/ashlrai/webfetch cli help
curl | bashcurl -fsSL https://raw.githubusercontent.com/ashlrai/webfetch/main/install/install.sh | bash

The curl | bash installer also wires webfetch into Claude Code's ~/.claude/settings.json idempotently. Re-run any time to update.

Surfaces

SurfaceBest forEntry point
CLIscripts, shell work, agent handoffwebfetch search ...
MCP serverClaude Code, Cursor, Cline, Continue, Roo Code, Codexnpx -y getwebfetch-mcp
HTTP serverlocal integrations and extensionsnpx -y webfetch-server
Core libraryTypeScript apps and custom toolingnpm i webfetch-core
Browser layerfallback extraction and managed-browser flowsnpm i webfetch-browser
Hosted cloudpooled keys, usage tracking, team controlsapp.getwebfetch.com

Package-level API notes live in packages/core/README.md, packages/browser/README.md, and the other package READMEs under packages/.

30-second usage

CLI:

webfetch search "drake portrait" --limit 5
webfetch artist "Taylor Swift" --kind portrait --min-width 1200
webfetch download <url> --out ./portrait.jpg
printf "drake portrait\nradiohead album\n" | webfetch batch --jsonl --continue-on-error

MCP (from inside any MCP-speaking agent):

search_images({ query: "drake portrait", limit: 5 })
search_artist_images({ artist: "Taylor Swift", kind: "portrait" })
download_image({ url: "..." })

TypeScript library:

import { searchArtistImages, pickBest, downloadImage } from "webfetch-core";

const { candidates } = await searchArtistImages("Drake", "portrait");
const best = pickBest(candidates, { minWidth: 1200 });
if (best) {
  const { cachedPath, sha256 } = await downloadImage(best.url);
  console.log(best.attributionLine, "->", cachedPath);
}

What problem this solves

Manually sourcing an image has four failure modes:

  1. You don't know the license, so you can't safely ship the result.
  2. You can't script it — every new site means another afternoon.
  3. Google's Image Search API is retired; scraping is brittle and ToS-grey.
  4. No shared cache — you re-download the same file dozens of times.

webfetch fixes all four by federating across direct-source APIs that have stable terms and structured license metadata, ranking candidates license-first, and exposing the result as a single MCP tool.

Providers

ProviderCoversLicense defaultAuthOpt-in
wikimediaportraits, events, logos, historyCC_BY_SA (metadata)no
openverseany CC-licensed contentCC_BY (metadata)no
unsplashhigh-quality photographyUNSPLASH_LICENSEUNSPLASH_ACCESS_KEYno
pexelsstock photographyPEXELS_LICENSEPEXELS_API_KEYno
pixabaystock photos + illustrationsPIXABAY_LICENSEPIXABAY_API_KEYno
itunesalbum covers, artist portraitsEDITORIAL_LICENSEDno
musicbrainz-caacanonical album artEDITORIAL_LICENSEDno
spotifyartist + album imagesEDITORIAL_LICENSEDSPOTIFY_CLIENT_ID/SECRETno
youtube-thumbvideo thumbnailsEDITORIAL_LICENSEDyes
bravegeneral web image searchUNKNOWN (+heuristic)BRAVE_API_KEYno
binggeneral web image searchUNKNOWN (+heuristic)BING_API_KEYyes
serpapiGoogle Images + reverse lookupUNKNOWN (+heuristic)SERPAPI_KEYyes
browserheadless fallback vs images.google.comUNKNOWNyes
managed-browserBright Data managed browser fallbackUNKNOWNBRIGHTDATA_API_TOKENyes
flickrCC / public-domain photographyCC_BY (metadata)FLICKR_API_KEYno
internet-archivepublic-domain / CC archive mediaPUBLIC_DOMAINno
smithsonianOpen Access museum mediaCC0SMITHSONIAN_API_KEYno
nasaNASA imageryPUBLIC_DOMAINno
met-museumThe Met Open AccessCC0no
europeanaEuropean cultural heritageCC_BY (metadata)EUROPEANA_API_KEYno
library-of-congressUS historical archivePUBLIC_DOMAINno
wellcome-collectionmedical/historical imageryCC_BY (metadata)no
rawpixelCC0 stock sliceCC0RAWPIXEL_API_KEY optionalno
burstShopify Burst stock photosCC0no
europeana-archivalEuropeana text/manuscript recordsCC_BY (metadata)EUROPEANA_API_KEYyes

See docs/PROVIDERS.md for gotchas, rate limits, and docs/PROVIDER_TUNING.md for per-use-case picks.

Local and cloud modes

The CLI is local-first: by default webfetch search, artist, album, download, probe, license, and batch call webfetch-core in-process and use provider API keys from your environment. Pass --cloud or set WEBFETCH_MODE=cloud to call https://api.getwebfetch.com/v1/* with WEBFETCH_API_KEY or webfetch config set apiKey wf_live_....

Use local mode when you want direct provider calls and a local cache. Use cloud mode when you want hosted auth, pooled provider keys, managed browser fallback, usage accounting, or team controls.

Why license-first

The only outcome we reject by default is an image we can't justify. A marginally-better photo under an unknown license is worthless to a pipeline that needs to ship without human review. Relevance ties are easy to break; provenance is not.

The ranker sorts by: license tag -> metadata confidence -> resolution -> provider priority. UNKNOWN is rejected by default (Berne Convention: most of the web is all-rights-reserved unless proven otherwise). See docs/LICENSE_POLICY.md.

Migration: CC0 stock providers

Older webfetch builds treated Unsplash, Pexels, and Pixabay as CC0. Current builds expose their platform terms explicitly:

Old tagNew tagWhat to check
CC0 from UnsplashUNSPLASH_LICENSEUnsplash terms; not Creative Commons
CC0 from PexelsPEXELS_LICENSEPexels terms; not Creative Commons
CC0 from PixabayPIXABAY_LICENSEPixabay terms; not Creative Commons

Most callers should keep licensePolicy: "safe-only" because it still allows open, platform, editorial, and press-kit categories while rejecting UNKNOWN. Pipelines that require only Creative Commons or public-domain assets should use licensePolicy: "open-only" and update type guards to handle the three platform tags separately.

webfetch vs alternatives

CapabilitywebfetchRaw Google ImagesUnsplash-onlyBing CSE
Scriptable via APIyesno (retired)yesyes
License metadata per resultyesnoyes (one lic)partial
Covers editorial music artyespartialnopartial
Covers CC / public-domainyesnonono
Safe-by-default (rejects UNKNOWN)yesn/an/ano
Shared content-addressed cacheyesnonono
Attribution line pre-builtyesnonono
One MCP config line across all IDEsyesnonono
No per-query cost on defaultsyesn/ayesno

Architecture

                             +------------------+
                             |  webfetch-core  |
                             |  (ranker, cache, |
                             |   license coerce)|
                             +---------+--------+
                                       |
          +----------------+-----------+-----------+----------------+
          |                |                       |                |
  +-------v------+  +------v-------+       +-------v------+  +------v-------+
  | webfetch     |  | webfetch-mcp |       | webfetch-    |  | browser      |
  | CLI          |  | (stdio)      |       | server (HTTP)|  | extensions   |
  +-------+------+  +------+-------+       +-------+------+  +------+-------+
          |                |                       |                |
          |                |                       |                |
          +----------------+-----------+-----------+----------------+
                                       |
                 +---------------------v---------------------+
                 |              provider adapters            |
                 |  wikimedia  openverse  unsplash  pexels    |
                 |  pixabay    itunes     mb-caa    spotify   |
                 |  youtube    brave      bing      serpapi   |
                 |  flickr     nasa       met       europeana |
                 |  loc        wellcome   rawpixel  burst     |
                

…
View source on GitHub