ashlrai/webfetch

🔎 Search & Data Extraction🟢 Verified Active
0 Views
0 Installs

📇 ☁️ 🏠 🍎 🪟 🐧 - 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.

Quick Install

One-Click IDE Configuration
claude_desktop_config.json
{
  "mcpServers": {
    "ashlrai-webfetch": {
      "command": "npx",
      "args": [
        "-y",
        "ashlrai-webfetch"
      ]
    }
  }
}
Or

Using an AI coding agent (Claude Code, Cursor, etc.)? Copy a ready-made prompt that tells it to fetch the setup instructions and install this server for you.

Documentation Overview

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     |
                 |  browser + managed-browser + archival opt-in|
                 +-------------------------------------------+

Every surface shares ~/.webfetch/cache/ keyed by SHA-256, so a download from the CLI is instantly available to the MCP server and vice versa.

Safety defaults

  • licensePolicy: "safe-only" — open, platform-license, and editorial/press categories are allowed; UNKNOWN is rejected.
  • safeSearch: "strict".
  • Opt-in providers (youtube-thumb, bing, serpapi, browser, managed-browser, europeana-archival) off by default.
  • 20 MB per-download cap, content-type guard, host blocklist.
  • robots.txt respected on generic page probes.

Roadmap

  • webfetch watch — daemon mode for repeated queries / incremental refresh.
  • Bring-your-own-provider plugin API.
  • Hosted tier at getwebfetch.com — pooled provider keys, managed browser fallback, team usage dashboard.

Contributing

Issues and PRs welcome. Run bun install && bun test to get started. See docs/ for per-area reference docs.

License

MIT.

Related MCP Servers

linxule/mineru-mcp

📇 ☁️ - MCP server for MinerU document parsing API. Parse PDFs, images, DOCX, and PPTX with OCR (109 languages), batch processing (200 docs), page ranges, and local file upload. 73% token reduction with structured output.

🔎 Search & Data Extraction1 views
0xdaef0f/job-searchoor

📇 🏠 - An MCP server for searching job listings with filters for date, keywords, remote work options, and more.

🔎 Search & Data Extraction0 views
Aas-ee/open-webSearch

🐍 📇 ☁️ - Web search using free multi-engine search (NO API KEYS REQUIRED) — Supports Bing, Baidu, DuckDuckGo, Brave, Exa, and CSDN.

🔎 Search & Data Extraction0 views
ac3xx/mcp-servers-kagi

📇 ☁️ - Kagi search API integration

🔎 Search & Data Extraction0 views

Engagement

Views
0
Installs
0
Upvotes
0

Views and upvotes are unique per visitor network (hashed IP). Installs count copy actions.

Status

Health: Active

Recent health check succeeded.

Last checked: 7/28/2026, 4:50:52 PM

Unclaimed listing (imported or pending owner verification). Claim it →
★ Spotlight Slot

Feature Your MCP Server

Get maximum visibility for your server across our directory, search results, and detail pages.

Spotlight Your Server

Own this project?

This directory is pre-filled from public sources. Claim via GitHub README, site badge, or DNS TXT to get the verified badge and attach your website.

Claim this listing

Promote this listing

Optional paid placement. Free listings stay free forever.

Share & Embed

Add our SVG badge (dark/light directory styles) or embeddable widget to your site.