PDF MCP
Mesclar, dividir, preencher e ler PDFs pelo chat: formulários, extração de páginas, metadados. Tudo permanece na sua máquina.
Documentação
Mesclar, dividir e preencher formulários PDF a partir do Claude
Servidor MCP para ferramentas de PDF que mesclam, dividem, carimbam e leem arquivos PDF; mescla e divide páginas na sua própria máquina. Mescle, divida, carimbe e leia PDFs, 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/pdf — o que faz, as ferramentas que expõe e um endpoint de token ao vivo.
Instalação
Hospedado, nada para instalar. Obtenha um token de 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 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/pdf 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/pdf/t/<token>. Ambas as formas funcionam. A URL nua sem token responde 401 em tools/call, então o token não é opcional.
Claude Desktop, um clique. Baixe pdf.mcpb do último lançamento e clique duas vezes nele.
A partir do código-fonte. O espelho é autocontido: cada dependência @theluckystrike/* é incluída, então um clone novo compila sem configuração extra.
git clone https://github.com/theluckystrike/mcp-pdf.git
cd mcp-pdf
npm install && npm run build
Em seguida, aponte seu cliente para o ponto de entrada compilado:
{
"mcpServers": {
"pdf": {
"command": "node",
"args": ["/absolute/path/to/mcp-pdf/dist/index.js"]
}
}
}
@theluckystrike/mcp-pdfainda não está publicado no npm, então um comandonpx -y @theluckystrike/mcp-pdffalhará. Os três caminhos acima são os que funcionam e cada um é exercitado pelo CI.

Espelho somente leitura de mcp-servers/servers/pdf. Veja MIRROR.md.
Diga "carimbe PAGO nessa fatura e salve uma cópia" ou "extraia 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, o enviariam a 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 seu nome comercial e ID de IVA 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 escritório.
No Registro Oficial 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, camada gratuita, sem cadastro.
As tarefas de PDF de um negócio freelance, 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+compilação
é o caminho que funciona, ambos verificados abaixo.
Um clique (.mcpb): baixe pdf.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": {
"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 é 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
| Ferramenta | O que faz |
|---|---|
pdf_info | Contagem de páginas, tamanho de cada página em pontos e milímetros, o nome do papel (A4, Carta, personalizado), a rotação já presente em cada página, os metadados (título, autor, produtor, datas) e se o arquivo está criptografado |
pdf_count | Contagem 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_merge | Junte 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_split | Um 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_pages | Extraia 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_rotate | Gire páginas por um múltiplo de 90 graus, adicionado à rotação que a página já tinha, que é o que um scan de lado precisa |
pdf_stamp | Desenhe 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_business | Seu nome comercial e ID de IVA no rodapé de cada página, do perfil compartilhado mcp-invoice e mcp-docx escrevem |
pdf_text | Extração de texto de melhor esforço dos fluxos de conteúdo da página. Veja as ressalvas honestas abaixo |
pdf_reorder | Escreva 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_status | Mostra o modo gratuito ou Pro |
license_activate | Ative 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 de mcp-invoice em pdf_stamp PAID e salva a cópia carimbada ao lado do original.
O que você pode dizer
| Você diz | Ferramenta |
|---|---|
| "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 |
| "Extraia as páginas 2 a 6 disso 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 meu nome comercial e número de IVA 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: pode ser selecionado e pesquisado, é desenhado na diagonal de 45 graus no verde predefinido, e o arquivo original permanece inalterado byte por byte.
Gratuito vs Pro
| Gratuito | Pro | |
|---|---|---|
pdf_info, pdf_count, pdf_text | Ilimitado | Ilimitado |
pdf_merge | Até 5 arquivos por chamada | Qualquer número de arquivos |
pdf_split, pdf_pages, pdf_rotate | Arquivos de até 30 páginas | Qualquer tamanho |
pdf_stamp | As predefinições PAID e DRAFT em suas cores predefinidas | Qualquer texto, qualquer cor, qualquer tamanho |
pdf_watermark_business | - | Seu nome comercial e ID de IVA no rodapé |
pdf_reorder | - | Sim |
Um limite de nível é uma resposta, não um erro, e nada é gravado quando um limite recusa 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
descomprime 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 analisador 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 somente de imagem não carrega operadores de texto, então nada retorna. 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 analisador 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 nem reconstrução de layout. Espaços entre palavras são
recuperados dos grandes kerns negativos que um array
TJusa 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 por 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 fica 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 de qualquer
trabalho acontecer:
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 o 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 metadados da página, em múltiplos de 90 graus, que é tudo o que o formato possui. 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 disso
é transliterado quando tem um corpo latino óbvio, o polonês
OPŁACONEé carimbado comoOPLACONE, e a resposta diz isso e imprime o que foi realmente desenhado, e é removido e contado quando não tem, então não há carimbo CJK. Uma nova linha é um separador de palavras, nunca uma exclusão. font_sizedeve 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 até onde passa da borda, para que você possa encurtá-lo.pdf_textlimita uma resposta a 200.000 caracteres e nomeia o argumentopagesque continua de onde parou. Nada falta 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 em nível de página; não é um
editor de PDF. Ele não escreve PDF/A:
pdf_inforelata opdfa_claimdo próprio arquivo, e toda ferramenta que escreve diz claramente que sua saída não mantém mais essa afirmação. - Formulários são lidos, não preenchidos:
pdf_textimprime os valores dos campos do 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 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 ficam onde você os colocou. Cada gravação no registro roda 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 não for legível ou não for JSON válido, ele nunca é tratado como "vazio": é movido para o lado byte por 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 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, 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 -- não para licenciamento (as chaves são verificadas offline), não para fontes, não 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 PAGO: o prompt
mark_invoice_paidencadeiainvoice_getempdf_stamp. - mcp-docx, escreva a proposta como
.docx, imprima em PDF, depois carimbe, mescle ou divida aqui. - mcp-resume, junte um currículo, uma carta de apresentação e um portfólio no único arquivo que um formulário de inscrição aceita.
- office-suite, vários servidores atrás de uma instalação, uma entrada de configuração.
Solução de problemas
npxtrava ou falha ao encontrar o pacote: a publicação npm deste pacote está pendente. Use o pacote.mcpbou o caminho de clonar e compilar acima até que 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_textnão retornou nada: a página é um scan, ou sua fonte usa uma codificação personalizada. A resposta diz qual. Não há OCR aqui.- O carimbo está pequeno demais ou grande demais: por padrão, é dimensionado para caber na largura da página. Passe
font_sizepara um tamanho exato em pontos, eopacityentre 0 e 1. - "já existe e nada foi gravado": passe
overwrite: true, ou umout_pathdiferente. - Versão do Node: requer Node >= 18. Verifique com
node -v.
Licença MIT. Suporte: support@zovo.one
Construído por theluckystrike.
Perguntas frequentes
Existe um servidor MCP para mesclar e dividir PDFs?
Sim. O servidor pdf em mcp.zovo.one mescla, divide, gira e preenche formulários PDF preservando os campos do formulário. Nível gratuito de 30 páginas por arquivo em operações de divisão/páginas/rotação, 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 permanece preservando formulários, então os campos preenchidos permanecem editáveis.
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:
- URL MCP dos documentos: https://gitmcp.io/theluckystrike/mcp-pdf