Image MCP

Redimensione, converta, comprima, corte, crie miniaturas e adicione marcas d'água em imagens diretamente no chat: sem upload, sem conta, sem dependência nativa. Cada arquivo permanece na sua máquina.

Documentação

mcp-image

Servidor MCP para redimensionamento, conversão, compressão e marca d'água de imagens. Redimensione, converta, comprima e adicione marca d'água em imagens, JavaScript puro.

Funciona com Claude Desktop, Claude Code, Cursor e qualquer cliente do Model Context Protocol. Roda na sua própria máquina, ou hospedado sem instalação.

Página do produto: https://mcp.zovo.one/s/image — o que faz, as ferramentas que expõe e um endpoint de token ao vivo.

Instalação

Hospedado, nada para instalar. Obtenha um token em https://mcp.zovo.one/mcp/connect (a página de conexão) ou https://mcp.zovo.one/mcp/token (o mesmo token como JSON); um token anônimo gratuito é emitido na hora e uma chave Pro funciona da mesma forma. Em seguida, aponte um cliente MCP para https://mcp.zovo.one/mcp/image via streamable-http e envie o token como Authorization: Bearer <token>.

Se o seu cliente não puder definir cabeçalhos, coloque o token no caminho: https://mcp.zovo.one/mcp/image/t/<token>. Ambas as formas funcionam. A URL simples sem token responde 401 em tools/call, então o token não é opcional.

Claude Desktop, um clique. Baixe image.mcpb do último lançamento e clique duas vezes nele.

A partir do código-fonte. O espelho é autossuficiente: cada dependência @theluckystrike/* é fornecida, então um clone novo compila sem configuração extra.

git clone https://github.com/theluckystrike/mcp-image.git
cd mcp-image
npm install && npm run build

Em seguida, aponte seu cliente para o ponto de entrada compilado:

{
  "mcpServers": {
    "image": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-image/dist/index.js"]
    }
  }
}

@theluckystrike/mcp-image ainda não está publicado no npm, então um comando npx -y @theluckystrike/mcp-image falhará. Os três caminhos acima são os que funcionam e cada um é testado pelo CI.

image demo

Espelho somente leitura de mcp-servers/servers/image. Veja MIRROR.md.

Diga "deixe estas cinco fotos com 1200 pixels de largura" ou "reduza esta captura de tela e remova o GPS dela" e isso acontece, na sua máquina, em um segundo. Este servidor MCP faz os pequenos trabalhos de imagem que de outra forma te levariam a um uploader web: redimensionar, converter entre PNG, JPEG, BMP, GIF e TIFF, comprimir com uma contagem real de bytes antes e depois, recortar, gerar miniaturas de uma pasta, adicionar marca d'água com o nome da sua empresa e remover o bloco EXIF que a câmera do celular escreve em toda foto. Sem upload, sem conta, sem dependência nativa, sem editor de imagens.

No Registro Oficial MCP (io.github.theluckystrike/image-resize-convert-compress-watermark).

Listado no AI Product Index — endpoint remoto ao vivo em mcp.zovo.one/s/image, plano gratuito, sem cadastro.

As tarefas de imagem de um negócio freelance, feitas pelo chat em vez de uma aba do navegador para a qual você preferiria não enviar a foto de um cliente.

Instalação em 60 segundos

A publicação no npm para @theluckystrike/mcp-image está pendente. Até lá, o pacote de um clique .mcpb ou um clone + compilação é o caminho que funciona, ambos verificados abaixo.

Um clique (.mcpb): baixe image.mcpb do último lançamento e clique duas vezes nele no Claude Desktop: https://github.com/theluckystrike/mcp-servers/releases/latest

(claude_desktop_config.json):

{
  "mcpServers": {
    "image": {
      "command": "npx",
      "args": ["-y", "@theluckystrike/mcp-image"]
    }
  }
}

Claude Code:

claude mcp add image -- npx -y @theluckystrike/mcp-image

(.cursor/mcp.json):

{
  "mcpServers": {
    "image": {
      "command": "npx",
      "args": ["-y", "@theluckystrike/mcp-image"]
    }
  }
}

O formulário npx acima começa a funcionar no momento em que o pacote for publicado. Até lá, use o pacote .mcpb acima, ou compile a partir do código-fonte com exatamente estes três comandos:

git clone https://github.com/theluckystrike/mcp-servers.git && cd mcp-servers
npm install
npm run build -w packages/mcp-license -w servers/image

Em seguida, aponte o command do seu cliente para node com um argumento: o caminho absoluto para servers/image/dist/index.js.

Para executar no modo Pro, defina MCP_LICENSE_KEY no mesmo bloco de configuração, ou chame license_activate uma vez com sua chave.

Ferramentas

FerramentaO que faz
image_infoFormato, dimensões em pixels, megapixels, proporção, tamanho do arquivo em bytes, se a imagem possui canal alfa e os bytes que gasta por pixel
image_resizeUma cópia redimensionada. inside cabe dentro da caixa e mantém a proporção, cover preenche a caixa e corta o excesso, exact estica. Informe largura ou altura e a outra segue automaticamente
image_convertRe-codifica como PNG, JPEG, BMP, GIF ou TIFF. Transparência indo para JPEG é achatada sobre branco, e a resposta informa isso
image_compressMenos bytes, com a contagem antes e depois e a porcentagem economizada. quality (padrão 80), max_width e max_bytes para atingir um tamanho alvo em uma única chamada
image_cropCorta um retângulo: x, y a partir do canto superior esquerdo, width, height. Um retângulo além da borda é recusado com o tamanho real, nunca cortado silenciosamente
image_thumbnailsUma miniatura por arquivo em out_dir, cada uma cabendo dentro de size por size e mantendo sua proporção
image_watermarkTexto sobre a imagem em um canto e uma opacidade, branco sobre uma placa translúcida. Sem texto, o nome da sua empresa do perfil compartilhado mcp-invoice e mcp-docx é usado
image_strip_metadataUma cópia com pixels e nada mais: EXIF, GPS, câmera, hora da captura, XMP e perfis de cor não são transferidos
image_batch_resizeRedimensiona uma lista inteira para out_dir, cada uma mantendo sua própria proporção, nomeadas <name>-<W>x<H>.<ext>
image_dominant_colorsAs cores que cobrem a maior parte de uma imagem, como códigos hex com a parcela de pixels que cada uma cobre. Grátis: 3; Pro: até 16
license_statusMostra o modo Grátis ou Pro
license_activateAtiva uma chave Pro (verificada offline)

Recurso: image://recent retorna as últimas 25 operações, mais recentes primeiro, com as entradas, os arquivos gravados e quando. Prompt: prepare_for_web reduz uma imagem do tamanho de uma câmera para um JPEG do tamanho de uma página, remove os metadados que vieram com ela e informa os bytes economizados.

O que você pode dizer

Você dizFerramenta
"Qual o tamanho desta imagem e ela tem transparência?"image_info
"Deixe esta com 1200 pixels de largura."image_resize
"Transforme este PNG em JPEG."image_convert
"Esta foto tem 8 MB, deixe-a abaixo de um megabyte."image_compress
"Corte o banner superior desta captura de tela."image_crop
"Crie miniaturas de tudo nesta pasta."image_thumbnails
"Coloque o nome da minha empresa no canto desta foto."image_watermark
"Remova as coordenadas GPS antes de eu enviar isto."image_strip_metadata
"Redimensione todos estes para 1600 de largura."image_batch_resize
"De quais cores este logotipo é feito?"image_dominant_colors
"Deixe isto pronto para o site."prepare_for_web prompt

Exemplo prático

You: This photo is too big for the site. Get it to 1600 wide and drop the metadata.

  image_info { path: "~/photos/DSC_0491.jpg" }
  -> 6000x4000, 24 MP, JPEG, 8.4 MB, no alpha

  image_compress {
    path: "~/photos/DSC_0491.jpg",
    max_width: 1600,
    quality: 80,
    max_bytes: 256000,
    out_path: "~/photos/DSC_0491-web.jpg"
  }
  -> 8.4 MB -> 243.7 KB (8809124 -> 249556 bytes, -97.2%)
  -> Method: JPEG quality 62 (searched down from 80 in 5 encodes to fit 250.0 KB)
     and a resize to 1600 px wide
  -> ~/photos/DSC_0491-web.jpg, 1600x1067, JPEG

A re-codificação JPEG também remove o bloco EXIF que a câmera gravou, incluindo as coordenadas GPS. O arquivo original permanece byte por byte inalterado.

Grátis vs Pro

GrátisPro
image_infoIlimitado, em qualquer tamanhoIlimitado
image_resize, image_convert, image_compress, image_cropQualquer origem, gravando saídas de até 4 MP (2000x2000 e um pouco mais)Qualquer tamanho, até os limites de entrada de 50 MB / 10.000 px
image_strip_metadataQualquer tamanhoQualquer tamanho
image_thumbnails, image_batch_resizeAté 5 arquivos por chamada, saídas de até 4 MP cadaQualquer número de arquivos, qualquer tamanho
image_watermarkO nome da sua empresa do perfil compartilhadoQualquer texto que você passar
image_dominant_colorsAs 3 principais coresAté 16

O limite gratuito é sobre o que é gravado, não sobre o que é lido: uma foto de celular de 12 MP reduzida para 1600 px de largura é uma chamada gratuita, porque esse é o trabalho. Gravar 12 MP de volta é a chamada Pro.

Um limite de nível é uma resposta, não um erro, e nada é gravado quando uma chamada é recusada.

Pro é um pagamento único de $19, ou $39 para todos os servidores da coleção, vitalício.

quality é um parâmetro JPEG, e apenas um parâmetro JPEG

Esta é a única coisa sobre compressão de imagem que surpreende as pessoas, então o servidor diz isso em sua própria resposta em vez de aceitar um número e silenciosamente não fazer nada com ele. Um JPEG descarta detalhes para ficar menor, e quality é o controle de quanto. Um PNG é sem perdas: não há controle. Passar quality: 40 para uma saída PNG não torna um PNG 60% menor, ele gera exatamente o mesmo PNG.

Portanto, o formato de saída segue a extensão do seu out_path, e essa é a alavanca:

  • out_path: "shot-small.jpg", quality se aplica, e uma foto normalmente reduz 80-95%.
  • out_path: "shot-small.png", quality é informado como não aplicável, e apenas max_width remove bytes.

A quantização de paleta foi medida como alternativa para PNG e rejeitada: re-codificar um PNG ruidoso de 300x220 através de um quantizador de 16 cores produziu um arquivo maior (115.451 bytes contra 39.262), porque o codificador aqui grava RGBA de qualquer forma e a quantização apenas destrói a similaridade linha a linha que a etapa deflate estava explorando. Uma ferramenta que afirma comprimir e retorna um arquivo maior é pior do que uma ferramenta que diz qual botão existe.

image_compress portanto sempre informa a contagem de bytes antes e depois, a porcentagem e o método que fez o trabalho, e, se a saída ficou maior, ele diz isso e recomenda manter o original.

Bombas de descompressão são recusadas pelo cabeçalho, antes de qualquer decodificação

Um PNG de 4 KB pode declarar que tem 20.000 por 20.000 pixels. Decodificá-lo aloca 1,6 GB de RGBA e derruba o processo antes que qualquer verificação de tamanho escrita após a decodificação pudesse ser executada. Portanto, as dimensões declaradas são lidas do cabeçalho do contêiner, IHDR do PNG, segmento SOF do JPEG, descritor de tela lógica do GIF, cabeçalho de informações do BMP, o primeiro IFD do TIFF, e um arquivo com mais de 10.000 px em um lado é recusado ali, com a memória que teria sido necessária nomeada na mensagem:

Error: /path/bomb.png declares 20000x20000 pixels in its PNG header and was refused before decoding:
this server caps a side at 10000 px. A small file that declares an enormous canvas is a decompression
bomb - decoding it would allocate 1526 MB of RGBA. Nothing was decoded.

O tamanho decodificado é verificado novamente depois, porque uma sondagem de cabeçalho pode retornar vazia em um TIFF incomum, e um guarda que só às vezes é executado não é um guarda.

Arquivos existentes nunca são sobrescritos, e entradas nunca são modificadas

Toda ferramenta grava um novo arquivo e deixa suas entradas byte por byte intactas, não há modo in-place, de propósito. Um out_path que já existe é recusado:

Error: /path/shot-small.png already exists and nothing was written.
Pass overwrite: true to replace it, or give a different out_path.

O caminho é reservado com uma criação exclusiva, não uma verificação de existência, então dois processos gravando o mesmo out_path ao mesmo tempo não podem se sobrescrever: um vence, o outro é recusado e não grava nada. image_thumbnails e image_batch_resize reservam cada um de seus caminhos de saída antes de gravar qualquer um deles, então uma colisão no arquivo 3 não deixa os arquivos 1 e 2 para trás como um lote pela metade, e as reservas são liberadas, então nada vazio é deixado no disco também.

Passe overwrite: true quando substituir o arquivo é o que você deseja.

overwrite: true ainda não permite que uma saída seja uma entrada. Gravar um resultado de volta sobre uma de suas próprias origens destrói essa origem, os pixels já estão decodificados na memória e são gravados sobre o arquivo de onde vieram, então um original de 4000 px se torna a miniatura de 512 px e toda leitura posterior desse caminho está silenciosamente errada. Portanto, um out_path que resolve para (ou compartilha um inode com) qualquer entrada da mesma chamada é recusado antes que qualquer trabalho aconteça.

O que "remover metadados" realmente faz

image_strip_metadata decodifica a imagem e a re-codifica a partir dos pixels brutos. EXIF, coordenadas GPS, a câmera e a lente, a hora da captura, pacotes XMP e perfis de cor incorporados não são removidos um a um, eles simplesmente nunca são entregues ao codificador, então não podem sair do outro lado. Duas consequências que valem a pena saber:

  • Os pixels são os mesmos, os bytes não são. Um JPEG passa pelo codificador uma segunda vez, então a cópia não é bit idêntica ao original, mesmo que pareça a mesma. Mantenha o original se isso importar.
  • Toda outra ferramenta de gravação aqui tem o mesmo efeito como efeito colateral. Redimensionar uma foto também remove seu EXIF.

Limites

  • Entradas acima de 50 MB são recusadas: uma imagem é decodificada para largura x altura x 4 bytes de RGBA bruto, independentemente de quão bem ela é comprimida no disco.
  • 10.000 px por lado, verificado primeiro pelo cabeçalho e depois pela decodificação.
  • Lidos e gravados: PNG, JPEG, BMP, GIF e TIFF, detectados por bytes mágicos em vez de extensão de arquivo. Sem WebP, sem AVIF, sem HEIC, sem SVG, não há decodificador JavaScript puro para esses formatos que valha a pena enviar, e este servidor não tem dependência nativa.
  • Um GIF animado é lido como seu primeiro quadro. Este servidor não faz animação.
  • O texto da marca d'água é desenhado com as faces bitmap Open Sans incluídas (8, 16, 32, 64 e 128 px), e a maior que couber na imagem é escolhida. Um caractere que essas faces não possuem não é desenhado, portanto não há marca d'água CJK.
  • Sem rotação, sem filtros, sem correção de cor, sem OCR, sem remoção de fundo. Este servidor faz os trabalhos de tamanho e formato; não é um editor de imagens.

Como ele armazena dados

Apenas um registro do que fez: ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/image/operations.json, as últimas 500 operações, como JSON simples. Suas imagens permanecem onde você as colocou. Cada gravação no registro é executada dentro de um bloqueio consultivo em .../image/.lock, para que dois clientes em um mesmo diretório de dados não possam perder um registro, e os salvamentos vão para um arquivo temporário e são renomeados para o lugar.

Se o registro estiver ilegível ou não for JSON válido, ele nunca é tratado como "vazio": ele é movido para o lado byte a byte como operations.json.corrupt-<timestamp> com um marcador ao lado. A imagem que você solicitou ainda é gravada, o arquivo está no disco antes de o registro ser tocado, e a resposta informa que o histórico não pôde ser atualizado.

A marca d'água lê o único perfil compartilhado que todo o conjunto usa, ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/profile/business.json, escrito por business_set em mcp-invoice ou mcp-docx. Nada é inventado: sem nome armazenado e sem texto passado, image_watermark recusa e informa qual ferramenta executar.

Privacidade

Todos os dados permanecem locais. O servidor lê e grava arquivos na sua máquina e não faz nenhuma solicitação de rede de qualquer tipo -- nem para licenciamento (as chaves são verificadas offline), nem para fontes, nem para telemetria. Uma foto de cliente que você redimensiona nunca é enviada para lugar nenhum, que é exatamente a razão pela qual isso existe.

Combina com

  • mcp-docx, redimensione um logotipo aqui e depois coloque-o no cabeçalho: image_resize para a altura do cabeçalho, e então o gravador .docx pega o arquivo do disco.
  • mcp-pdf, reduza os scans antes de mesclá-los, para que o PDF unido não tenha 40 MB.
  • mcp-resume, um retrato corretamente dimensionado e sem metadados para o currículo e o formulário de inscrição.
  • office-suite, vários servidores atrás de uma única instalação, uma única entrada de configuração.

Solução de problemas

  • npx trava ou não encontra o pacote: a publicação npm deste pacote está pendente. Use o pacote .mcpb ou o caminho de clonar e compilar acima até que ele seja publicado.
  • "quality não se aplica a uma saída PNG": grave em um .jpg out_path, ou passe max_width. Veja a seção acima.
  • "declara NxN pixels ... e foi recusado antes da decodificação": o arquivo declara uma tela acima de 10.000 px por lado. Se for genuinamente tão grande, redimensione-o com uma ferramenta que transmita blocos; este servidor decodifica imagens inteiras.
  • "não começa com os bytes mágicos": o arquivo não é PNG, JPEG, BMP, GIF ou TIFF. Um nome .png em um arquivo WebP é a causa usual; converta-o primeiro.
  • "já existe e nada foi gravado": passe overwrite: true, ou um out_path diferente.
  • A marca d'água está minúscula: a maior face incluída é de 128 px, e ela é escolhida para caber dentro de 80% da largura da imagem. Em uma foto muito grande, redimensione primeiro e aplique a marca d'água depois.
  • Versão do Node: requer Node >= 18. Verifique com node -v.

Licenciado sob MIT. Suporte: support@zovo.one

Construído por theluckystrike.

Use estes documentos como um servidor MCP

Qualquer cliente MCP (Claude, Cursor, Windsurf, VS Code) pode ler a documentação deste repositório diretamente via GitMCP — sem instalação: