Zovo PDF MCP Server

Crie, divida, mescle e manipule documentos PDF a partir de arquivos locais. Servidor MCP offline-first, camada gratuita, sem cadastro.

Documentação

Mesclar, dividir e preencher formulários PDF a partir do Claude

Diga "carimbe PAGO nessa fatura e salve uma cópia" ou "pegue as páginas 2 a 6 deste scan e mescle-as com o contrato" e isso acontece, na sua máquina, em um segundo. Este servidor MCP faz os pequenos trabalhos de PDF que, de outra forma, mandariam você para um uploader web: mesclar, dividir por intervalo de páginas, extrair ou reordenar páginas, girar um scan de lado, carimbar PAID ou DRAFT ou qualquer texto que você quiser, colocar o nome da sua empresa e o CNPJ no rodapé, contar páginas em uma pasta de arquivos e ler o texto de um PDF como texto. Sem upload, sem conta, sem dependência nativa, sem instalação de Office.

No Registro Oficial de MCP (io.github.theluckystrike/pdf-merge-split-stamp-extract-pages).

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

pdf demo

As tarefas de PDF de um negócio freelancer, feitas pelo chat em vez de uma aba do navegador na qual você não confia uma fatura.

Instalação em 60 segundos

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

Um clique (.mcpb): baixe pdf.mcpb do release mais recente e clique duas vezes nele no Claude Desktop: https://github.com/theluckystrike/mcp-servers/releases/latest

(claude_desktop_config.json):

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

Claude Code:

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

(.cursor/mcp.json):

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

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/pdf

Em seguida, aponte o command do seu cliente para node com um argumento: o caminho absoluto para servers/pdf/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 ela faz
pdf_infoContagem de páginas, tamanho de cada página em pontos e milímetros, o nome do papel (A4, Carta, personalizado), a rotação já existente em cada página, os metadados (título, autor, produtor, datas) e se o arquivo está criptografado
pdf_countContagem de páginas por arquivo mais o total, para qualquer número de PDFs. Um arquivo que não pode ser lido é relatado por arquivo; o restante ainda é contado
pdf_mergeJunta PDFs em um só, na ordem fornecida. Os tamanhos de página são mantidos como estão, e um arquivo mesclado com tamanhos mistos informa isso
pdf_splitUm novo arquivo por intervalo. "1-3,5,7-" fornece as páginas 1-3, a página 5 e a página 7 até o final. out_path_pattern aceita {n}, {range} e {name}
pdf_pagesExtrai páginas selecionadas em um novo PDF, na ordem em que você as escreve. "5,1,1" coloca a página 5 primeiro e a página 1 duas vezes
pdf_rotateGira páginas em múltiplos de 90 graus, adicionado à rotação que a página já tinha, que é o que um scan de lado precisa
pdf_stampDesenha texto nas páginas: predefinições PAID e DRAFT, ou qualquer texto, cor, posição, opacidade e tamanho. Carimbos centrais vão na diagonal de 45 graus
pdf_watermark_businessSeu nome de empresa e CNPJ no rodapé de cada página, a partir do perfil compartilhado mcp-invoice e mcp-docx escrevem
pdf_textExtração de texto de melhor esforço dos fluxos de conteúdo da página. Veja as ressalvas honestas abaixo
pdf_reorderEscreve um novo PDF com as páginas em uma nova ordem. A ordem deve nomear cada página exatamente uma vez, para que nada seja descartado por acidente
license_statusMostra o modo gratuito ou Pro
license_activateAtiva uma chave Pro (verificada offline)

Recurso: pdf://recent retorna as últimas 25 operações, das mais recentes para as mais antigas, com as entradas, os arquivos gravados e quando. Prompt: mark_invoice_paid encadeia o invoice_get do mcp-invoice no pdf_stamp PAID e salva a cópia carimbada ao lado do original.

O que você pode dizer

Você dizFerramenta
"Marque a fatura INV-2026-0007 como paga."prompt mark_invoice_paid, depois pdf_stamp
"Carimbe RASCUNHO neste contrato antes de eu enviá-lo."pdf_stamp
"Junte estes três PDFs em um único arquivo."pdf_merge
"Divida o scan: as páginas 1-3 são a fatura, de 4 em diante é o recibo."pdf_split
"Pegue as páginas 2 a 6 deste e salve-as separadamente."pdf_pages
"Este scan está de lado, gire-o."pdf_rotate
"Quantas páginas há em todos estes?"pdf_count
"O que diz a página 1 deste PDF?"pdf_text
"Coloque o nome da minha empresa e o CNPJ no rodapé."pdf_watermark_business
"Mova a página de capa para a frente."pdf_reorder

Exemplo prático

You: Stamp PAID on ~/invoices/INV-2026-0007.pdf and save a copy.

  pdf_stamp {
    path: "~/invoices/INV-2026-0007.pdf",
    text: "PAID",
    position: "center",
    out_path: "~/invoices/INV-2026-0007-paid.pdf"
  }
  -> Stamped "PAID" on 1 page
  -> ~/invoices/INV-2026-0007-paid.pdf, 0.9 MB

O carimbo é texto desenhado, não uma imagem achatada: ele pode ser selecionado e pesquisado, é desenhado na diagonal de 45 graus no verde predefinido, e o arquivo original permanece byte a byte inalterado.

Gratuito vs Pro

GratuitoPro
pdf_info, pdf_count, pdf_textIlimitadoIlimitado
pdf_mergeAté 5 arquivos por chamadaQualquer número de arquivos
pdf_split, pdf_pages, pdf_rotateArquivos de até 30 páginasQualquer tamanho
pdf_stampAs predefinições PAID e DRAFT em suas cores predefinidasQualquer texto, qualquer cor, qualquer tamanho
pdf_watermark_business-Seu nome de empresa e CNPJ no rodapé
pdf_reorder-Sim

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

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

pdf_text é de melhor esforço, e aqui está exatamente o que isso significa

Um PDF não armazena texto. Ele armazena operadores de desenho, e o texto que você vê são bytes entregues a uma fonte. Este servidor descompacta o fluxo de conteúdo FlateDecode de cada página com node:zlib e lê os quatro operadores de exibição de texto -- Tj, TJ, ' e ", além dos operadores de posicionamento que encerram uma linha. Isso é um parser escrito aqui, em cerca de duzentas linhas, sem pdfjs e sem módulo nativo, e tem três limites reais que a ferramenta declara em sua própria resposta toda vez:

  • Um scan não tem texto. Uma página apenas com imagem não carrega operadores de texto, então nada é retornado. Não há OCR aqui e não haverá; a resposta diz que a página provavelmente é um scan em vez de retornar uma string vazia sem explicação.
  • Uma codificação personalizada ou CID retorna índices de glifos, não letras. Fontes com subconjunto incorporado e CJK mapeiam bytes para números de glifos por meio de uma tabela que este parser não lê. Quando a saída não tem caracteres legíveis, a resposta diz que a fonte é o motivo.
  • A ordem de leitura é a ordem de desenho. Não há detecção de colunas e nenhuma reconstrução de layout. Espaços entre palavras são recuperados dos grandes kerns negativos que um array TJ usa para eles, então um PDF que posiciona cada palavra separadamente pode retornar com palavras grudadas.

PDFs escritos por processadores de texto, ferramentas de faturamento e geradores de relatórios, tudo com fonte padrão ou totalmente incorporada, são lidos corretamente. Qualquer outra coisa informa por que não foi.

PDFs criptografados são recusados, não adivinhados

pdf-lib não pode descriptografar, e carregar um arquivo criptografado ignorando a criptografia produz páginas de lixo que seriam gravadas diretamente na saída. Portanto, um arquivo cujo trailer nomeia um dicionário /Encrypt é recusado por toda ferramenta que grava, com o motivo e a correção na mensagem: abra-o em um leitor com a senha, exporte ou imprima para um novo PDF e use esse arquivo. pdf_info ainda responde, com encrypted: true, porque relatar é seu único trabalho, e pdf_count o relata como um arquivo ilegível enquanto ainda conta o restante.

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

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

Error: /path/merged.pdf 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. pdf_split reserva cada um de seus caminhos de saída antes de gravar qualquer um deles, então uma colisão na parte 3 não deixa as partes 1 e 2 para trás como uma divisão pela metade, e as reservas são liberadas, então nada vazio é deixado no disco também.

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

overwrite: true ainda não permite que uma saída seja uma entrada. Gravar o resultado de uma operação de volta sobre uma de suas próprias fontes destrói essa fonte, as páginas já estão na memória e são gravadas sobre o arquivo de onde vieram, o que leva um arquivo de três páginas à única página que você extraiu, e cada leitura posterior desse caminho fica então 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:

Error: out_path /path/scan.pdf is also an input of this operation, so writing it would destroy the source.
Nothing was written. Write beside it instead - /path/scan-out.pdf - and, if the result really is meant to
take the original's place, rename it yourself once you have checked it.

Limites

  • Entradas acima de 100 MB são recusadas: reescrever um PDF precisa de várias vezes seu tamanho em memória.
  • Um arquivo que não começa com %PDF- é recusado antes que qualquer coisa seja lida.
  • A rotação é registrada como metadado de página, em múltiplos de 90 graus, que é tudo o que o formato tem. Nada é redesenhado.
  • O texto do carimbo passa por uma fonte PDF embutida, que carrega WinAnsi e seus 256 pontos de código. Um caractere fora dela é transliterado onde tem um corpo latino óbvio, OPŁACONE polonês carimba como OPLACONE, e a resposta diz isso e imprime o que foi realmente desenhado, e removido e contado onde não tem, então não há carimbo CJK. Uma nova linha é um separador de palavras, nunca uma exclusão.
  • font_size deve estar entre 1 e 1600 pontos. Um carimbo longo demais para caber mesmo no menor tamanho que este servidor usará ainda é desenhado, e a resposta diz o quanto ele passa da borda, para que você possa encurtá-lo.
  • pdf_text limita uma resposta a 200.000 caracteres e nomeia o argumento pages que continua de onde parou. Nada está faltando no arquivo; o corte está na resposta, não na leitura.
  • Sem numeração de páginas, sem assinaturas, sem redação, sem compressão. Este servidor faz os trabalhos de nível de página; não é um editor de PDF. Ele não escreve PDF/A: pdf_info relata o pdfa_claim do próprio arquivo, e toda ferramenta que grava diz claramente que sua saída não mantém mais essa afirmação.
  • Formulários são lidos, não preenchidos: pdf_text imprime os valores dos campos AcroForm, que vivem nos campos em vez de no fluxo de conteúdo da página e, portanto, não fazem parte do texto da página.
  • Sem OCR. Veja a seção pdf_text.

Como ele armazena dados

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

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

O rodapé comercial lê o único perfil compartilhado que toda a suíte usa, ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/profile/business.json, escrito por business_set no mcp-invoice ou mcp-docx. Nada é inventado: sem nome armazenado, pdf_watermark_business recusa e diz 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 (chaves são verificadas offline), nem para fontes, nem para telemetria. Um PDF que você carimba nunca é enviado para lugar nenhum, que é exatamente a razão pela qual isso existe.

Combina com

  • mcp-invoice, a fatura que você enviou, carimbada como PAGA: o prompt mark_invoice_paid encadeia invoice_get em pdf_stamp.
  • mcp-docx, escreva a proposta como .docx, imprima-a em PDF e depois carimbe, mescle ou divida aqui.
  • mcp-resume, junte um currículo, uma carta de apresentação e um portfólio em um único arquivo que um formulário de inscrição aceita.
  • 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.
  • "está criptografado e foi recusado": o arquivo está protegido por senha ou permissões. Abra-o em um leitor de PDF, exporte ou imprima para um novo PDF e execute a ferramenta nessa cópia. Este servidor nunca adivinha ou remove uma senha.
  • pdf_text não retornou nada: a página é um scan, ou sua fonte usa uma codificação personalizada. A resposta indica qual. Não há OCR aqui.
  • O carimbo está pequeno ou grande demais: por padrão, ele é dimensionado para caber na largura da página. Passe font_size para um tamanho exato em pontos e opacity entre 0 e 1.
  • "já existe e nada foi gravado": passe overwrite: true, ou um out_path diferente.
  • Versão do Node: requer Node >= 18. Verifique com node -v.

Licenciado sob MIT. Suporte: support@zovo.one

Criado por theluckystrike.

Perguntas frequentes

Existe um servidor MCP para mesclar e dividir PDFs?

Sim. O servidor de PDF em mcp.zovo.one mescla, divide, rotaciona e preenche formulários PDF preservando os campos do formulário. Camada gratuita de 30 páginas por arquivo nas operações de dividir/páginas/rotacionar, endpoint remoto hospedado, sem instalação.

O Claude pode preencher formulários PDF com um servidor MCP?

Sim — conecte https://mcp.zovo.one/mcp/pdf e peça ao Claude para preencher os campos de um formulário ou mesclar vários PDFs. A saída preserva os formulários, então os campos preenchidos permanecem editáveis.