webfetch

A camada de imagem license-first para agentes de IA e humanos. 24 provedores federados · CC0/CC-BY/PD-first · MCP nativo · Extensão do Chrome · SDKs em Python + TS.

Documentação

webfetch

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

A camada de imagens com prioridade de licença para agentes de IA e humanos.

Um servidor MCP, um CLI e um servidor HTTP que federam entre 25 provedores de imagens, classificam resultados com prioridade de licença e rejeitam resultados UNKNOWN por padrão. Qualquer agente que fale MCP (Claude Code, Cursor, Cline, Continue, Roo Code, Codex) se conecta a partir de uma única linha de configuração. Página inicial, preços e uso hospedado estão em getwebfetch.com.

Instalação

SuperfícieComando único
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

O instalador curl | bash também conecta o webfetch ao ~/.claude/settings.json do Claude Code de forma idempotente. Execute novamente a qualquer momento para atualizar.

Superfícies

SuperfícieMelhor paraPonto de entrada
CLIscripts, trabalho em shell, transferência para agenteswebfetch search ...
Servidor MCPClaude Code, Cursor, Cline, Continue, Roo Code, Codexnpx -y getwebfetch-mcp
Servidor HTTPintegrações e extensões locaisnpx -y webfetch-server
Biblioteca principalaplicativos TypeScript e ferramentas personalizadasnpm i webfetch-core
Camada de navegadorextração de fallback e fluxos com navegador gerenciadonpm i webfetch-browser
Nuvem hospedadachaves agrupadas, rastreamento de uso, controles de equipeapp.getwebfetch.com

As notas de API por pacote estão em packages/core/README.md, packages/browser/README.md e nos demais READMEs de pacotes em packages/.

Uso em 30 segundos

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 (de dentro de qualquer agente que fale MCP):

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

Biblioteca TypeScript:

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);
}

Qual problema isso resolve

Obter uma imagem manualmente tem quatro modos de falha:

  1. Você não conhece a licença, então não pode publicar o resultado com segurança.
  2. Você não consegue automatizar — cada novo site significa mais uma tarde de trabalho.
  3. A API de Pesquisa de Imagens do Google foi descontinuada; scraping é frágil e viola os termos de uso.
  4. Sem cache compartilhado — você baixa o mesmo arquivo dezenas de vezes.

O webfetch resolve todos os quatro federando APIs de fontes diretas que possuem termos estáveis e metadados de licença estruturados, classificando candidatos com prioridade de licença e expondo o resultado como uma única ferramenta MCP.

Provedores

ProvedorCobreLicença padrãoAutenticaçãoOpt-in
wikimediaretratos, eventos, logotipos, históriaCC_BY_SA (metadados)—não
openversequalquer conteúdo licenciado CCCC_BY (metadados)—não
unsplashfotografia de alta qualidadeUNSPLASH_LICENSEUNSPLASH_ACCESS_KEYnão
pexelsfotografia de banco de imagensPEXELS_LICENSEPEXELS_API_KEYnão
pixabayfotos de banco + ilustraçõesPIXABAY_LICENSEPIXABAY_API_KEYnão
itunescapas de álbuns, retratos de artistasEDITORIAL_LICENSED—não
musicbrainz-caaarte de álbum canônicaEDITORIAL_LICENSED—não
spotifyimagens de artistas + álbunsEDITORIAL_LICENSEDSPOTIFY_CLIENT_ID/SECRETnão
youtube-thumbminiaturas de vídeosEDITORIAL_LICENSED—sim
bravepesquisa geral de imagens na webUNKNOWN (+heurística)BRAVE_API_KEYnão
bingpesquisa geral de imagens na webUNKNOWN (+heurística)BING_API_KEYsim
serpapiGoogle Images + busca reversaUNKNOWN (+heurística)SERPAPI_KEYsim
browserfallback headless vs images.google.comUNKNOWN—sim
managed-browserfallback de navegador gerenciado Bright DataUNKNOWNBRIGHTDATA_API_TOKENsim
flickrfotografia CC / domínio públicoCC_BY (metadados)FLICKR_API_KEYnão
internet-archivemídia de arquivo de domínio público / CCPUBLIC_DOMAIN—não
smithsonianmídia de museu em Open AccessCC0SMITHSONIAN_API_KEYnão
nasaimagens da NASAPUBLIC_DOMAIN—não
met-museumThe Met Open AccessCC0—não
europeanapatrimônio cultural europeuCC_BY (metadados)EUROPEANA_API_KEYnão
library-of-congressarquivo histórico dos EUAPUBLIC_DOMAIN—não
wellcome-collectionimagens médicas/históricasCC_BY (metadados)—não
rawpixelfatia de banco de imagens CC0CC0RAWPIXEL_API_KEY opcionalnão
burstfotos de banco do Shopify BurstCC0—não
europeana-archivalregistros de texto/manuscritos da EuropeanaCC_BY (metadados)EUROPEANA_API_KEYsim

Consulte docs/PROVIDERS.md para armadilhas, limites de taxa e docs/PROVIDER_TUNING.md para escolhas por caso de uso.

Modos local e nuvem

O CLI é local-first: por padrão, webfetch search, artist, album, download, probe, license e batch chamam webfetch-core em processo e usam chaves de API dos provedores do seu ambiente. Passe --cloud ou defina WEBFETCH_MODE=cloud para chamar https://api.getwebfetch.com/v1/* com WEBFETCH_API_KEY ou webfetch config set apiKey wf_live_....

Use o modo local quando quiser chamadas diretas aos provedores e um cache local. Use o modo nuvem quando quiser autenticação hospedada, chaves de provedores agrupadas, fallback de navegador gerenciado, contabilidade de uso ou controles de equipe.

Por que prioridade de licença

O único resultado que rejeitamos por padrão é uma imagem que não conseguimos justificar. Uma foto marginalmente melhor sob licença desconhecida é inútil para um pipeline que precisa publicar sem revisão humana. Empates de relevância são fáceis de desfazer; procedência não é.

O classificador ordena por: tag de licença -> confiança dos metadados -> resolução -> prioridade do provedor. UNKNOWN é rejeitado por padrão (Convenção de Berna: a maior parte da web é todos-os-direitos-reservados, salvo prova em contrário). Consulte docs/LICENSE_POLICY.md.

Migração: provedores de banco de imagens CC0

Versões antigas do webfetch tratavam Unsplash, Pexels e Pixabay como CC0. As versões atuais expõem os termos das plataformas explicitamente:

Tag antigaTag novaO que verificar
CC0 do UnsplashUNSPLASH_LICENSETermos do Unsplash; não é Creative Commons
CC0 do PexelsPEXELS_LICENSETermos do Pexels; não é Creative Commons
CC0 do PixabayPIXABAY_LICENSETermos do Pixabay; não é Creative Commons

A maioria dos chamadores deve manter licensePolicy: "safe-only" porque ainda permite categorias abertas, de plataforma, editoriais e de press kit, rejeitando UNKNOWN. Pipelines que exigem apenas ativos Creative Commons ou de domínio público devem usar licensePolicy: "open-only" e atualizar os guards de tipo para tratar as três tags de plataforma separadamente.

webfetch vs alternativas

CapacidadewebfetchGoogle Images brutoSomente UnsplashBing CSE
Automatizável via APIsimnão (descontinuado)simsim
Metadados de licença por resultadosimnãosim (uma licença)parcial
Cobre arte musical editorialsimparcialnãoparcial
Cobre CC / domínio públicosimnãonãonão
Seguro por padrão (rejeita UNKNOWN)simn/dn/dnão
Cache compartilhado por conteúdosimnãonãonão
Linha de atribuição pré-construídasimnãonãonão
Uma linha de configuração MCP em todas as IDEssimnãonãonão
Sem custo por consulta nos padrõessimn/dsimnão

Arquitetura

                             +------------------+
                             |  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|
                 +-------------------------------------------+

Toda superfície compartilha ~/.webfetch/cache/ indexado por SHA-256, então um download do CLI fica instantaneamente disponível para o servidor MCP e vice-versa.

Padrões de segurança

  • licensePolicy: "safe-only" — categorias abertas, de licença de plataforma e editoriais/press kit são permitidas; UNKNOWN é rejeitado.
  • safeSearch: "strict".
  • Provedores opt-in (youtube-thumb, bing, serpapi, browser, managed-browser, europeana-archival) desativados por padrão.
  • Limite de 20 MB por download, guard de tipo de conteúdo, lista de bloqueio de hosts.
  • robots.txt respeitado em sondagens genéricas de páginas.

Roadmap

  • webfetch watch — modo daemon para consultas repetidas / atualização incremental.
  • API de plugin traga-seu-próprio-provedor.
  • Nível hospedado em getwebfetch.com — chaves de provedores agrupadas, fallback de navegador gerenciado, painel de uso da equipe.

Contribuindo

Issues e PRs são bem-vindos. Execute bun install && bun test para começar. Consulte docs/ para documentação de referência por área.

Licença

MIT.