PixelLetter MCP

Envia cartas físicas e faxes pelo PixelLetter: entregue um PDF e um endereço e ele é impresso, selado e postado, com um modo de teste que não cobra nada.

Documentação

pixelletter-mcp

Servidor MCP local (stdio) para a interface HTTPS do PixelLetter. Entregue um PDF e um país de destino e a PixelLetter imprime, dobra, sela e posta a carta, opcionalmente como registro. Também envia faxes, cancela pedidos, lê o saldo da conta e aciona a assinatura eletrônica de faturas.

Ele se integra ao pdf-letter-mcp: esse servidor gera um PDF de carta no padrão DIN 5008, este o coloca no correio. send_letter recebe o caminho absoluto que create_letter retorna.

A implementação segue a documentação publicada: o manual HTTPS, o manual de e-mail, os dois manuais de assinatura, a classe PHP de referência (versão 2.01) e a lista pública de códigos de erro. Três valores não estão impressos nesses documentos — impressão colorida, postagem GoGreen e o interruptor NODUPLEX — e foram retirados do cliente hudora/pyPostal, que já envia pedidos reais com eles. Eles estão marcados como tal na tabela abaixo. Nada mais foi inventado.

Como a interface funciona

Tudo é um único POST HTTPS multipart para https://www.pixelletter.de/xml/index.php. O campo de formulário xml carrega o documento do pedido, incluindo credenciais, e os campos uploadfile0, uploadfile1 e assim por diante carregam os documentos. A resposta é um pequeno documento XML: o código 100 significa que o pedido foi aceito, qualquer outra coisa é um código de erro da lista publicada. O resultado final, incluindo se o endereço do destinatário coube na janela do envelope, chega por e-mail algumas horas depois.

Modo de teste

Cada ferramenta de envio precisa de um sinalizador explícito testMode, não há padrão. testMode: true executa o pedido exatamente como um real, mas a PixelLetter nunca imprime, nunca envia e nunca cobra por ele. testMode: false realmente posta a carta. Defina PIXELLETTER_FORCE_TEST_MODE=true para fixar o servidor inteiro em modo de teste enquanto configura as conexões.

Instalação

npm install
npm run build

Registre o servidor no Claude Code:

claude mcp add pixelletter \
  --env PIXELLETTER_EMAIL=you@example.com \
  --env PIXELLETTER_PASSWORD=your-password \
  -- node "/absolute/path/to/pixelletter-mcp/dist/src/index.js"

Ou no ~/.claude.json / claude_desktop_config.json:

{
  "mcpServers": {
    "pixelletter": {
      "command": "node",
      "args": ["/absolute/path/to/pixelletter-mcp/dist/src/index.js"],
      "env": {
        "PIXELLETTER_EMAIL": "you@example.com",
        "PIXELLETTER_PASSWORD": "your-password",
        "PIXELLETTER_DEFAULT_DESTINATION": "DE"
      }
    }
  }
}

Ambiente

VariávelFinalidade
PIXELLETTER_EMAILObrigatória. O endereço de e-mail com o qual a conta PixelLetter está registrada.
PIXELLETTER_PASSWORDObrigatória. A senha da PixelLetter.
PIXELLETTER_ENDPOINTEndpoint da interface. Padrão https://www.pixelletter.de/xml/index.php.
PIXELLETTER_ACCEPT_TERMSAceita os termos da PixelLetter em cada pedido, padrão true. A API rejeita pedidos caso contrário (erro 013).
PIXELLETTER_WAIVE_WITHDRAWAL_RIGHTAbre mão do direito de arrependimento de duas semanas para que os pedidos sejam executados imediatamente, padrão true. false atrasa cada pedido em duas semanas.
PIXELLETTER_DEFAULT_LOCATIONCentro de despacho padrão: 1 Munique (DE), 2 Hausleiten perto de Viena (AT), 3 Hamburgo (DE).
PIXELLETTER_DEFAULT_DESTINATIONPaís de destino padrão como código ISO de duas letras, por exemplo DE.
PIXELLETTER_FORCE_TEST_MODEForça o modo de teste em cada pedido, padrão false.
PIXELLETTER_TIMEOUT_MSTempo limite de solicitação em milissegundos, padrão 120000.

As credenciais são lidas apenas do ambiente, nada é armazenado no repositório e nada é gravado em disco.

Ferramentas

FerramentaFinalidade
send_letterEnvia documentos ou texto simples como carta física, opcionalmente também como fax.
send_faxEnvia documentos ou texto simples apenas como fax.
get_account_infoLê os dados do cliente armazenados e o crédito atual.
cancel_orderCancela um pedido enviado pelo ID do pedido PixelLetter.
sign_invoiceEnvia documentos ao serviço de assinatura eletrônica de faturas e opcionalmente envia o PDF assinado por e-mail.
get_interface_referenceConsulta offline de valores de ação, centros de despacho, códigos de serviço, limites e códigos de erro.

send_letter

PDF pronto, o caso normal:

{
  "testMode": true,
  "files": ["/Users/you/Documents/Briefe/2026-07-24-widerspruch.pdf"],
  "destination": "DE",
  "transaction": "widerspruch-4711"
}

Registro com aviso de recebimento, impresso em cores em um único lado:

{
  "testMode": false,
  "files": ["/Users/you/Documents/Briefe/kuendigung.pdf"],
  "destination": "DE",
  "registered": true,
  "returnReceipt": true,
  "colorPrint": true,
  "duplex": false
}

Texto simples, formatado pela PixelLetter, com a assinatura armazenada na conta:

{
  "testMode": true,
  "address": ["Erika Mustermann", "Musterstr. 28", "81237 Musterstadt", "Deutschland"],
  "subject": "Ihre Anfrage vom 12.07.2026",
  "text": "Hallo Frau Mustermann,\n\nvielen Dank für Ihre Anfrage.\n\nMit freundlichen Grüßen\n\n%Unterschrift%\nMax Mustermann",
  "destination": "DE"
}

Regras que a ferramenta aplica antes de enviar qualquer coisa:

  • Um pedido carrega documentos ou texto, não ambos. Vários documentos são convertidos e mesclados em uma única carta, na ordem fornecida.
  • O país de destino é obrigatório para cartas; um código errado leva a postagem incorreta.
  • O endereço do destinatário precisa estar visível na área da janela do envelope do documento; a PixelLetter verifica isso antes do envio.
  • Tipos de upload permitidos são .pdf, .doc, .xls, .ppt, .rtf, .wpd, .psd, máximo de 50 MB. O erro 053 mostra que a PixelLetter pode restringir isso a PDF, então PDF é a escolha segura.
  • Serviços adicionais, impressão colorida e frente e verso são apenas para cartas; um pedido de fax puro os rejeita. Os códigos 28 (aviso de recebimento) e 29 (entrega pessoal) precisam do 27 (registrado), o código 30 (registro em caixa de correio) é independente. Registro é um produto alemão; outros destinos resultam no erro 026.

Cada opção da interface

Cobertura completa dos campos que a interface documenta. "Aplica-se a" indica qual tipo de despacho aceita a opção; combinações inválidas são rejeitadas antes de a solicitação sair.

Campo da APIParâmetro da ferramentaValores permitidosAplica-se aFonte
emailPIXELLETTER_EMAILe-mail da contatodosmanual HTTPS
passwordPIXELLETTER_PASSWORDsenha da contatodosmanual HTTPS
agbPIXELLETTER_ACCEPT_TERMSja, neintodosmanual HTTPS
widerrufsverzichtPIXELLETTER_WAIVE_WITHDRAWAL_RIGHTja, nein, nein atrasa o pedido em duas semanastodosmanual HTTPS
testmodustestMode, PIXELLETTER_FORCE_TEST_MODEtrue, falsetodosmanual HTTPS
order typeescolhido da entradatext, upload, canceltodosmanual HTTPS, classe de referência
actionsend_letter, alsoSendFax, send_fax, sign_invoice1 carta, 2 fax, 3 carta e fax, 4 assinatura de faturatodosmanual HTTPS, manuais de assinatura
transactiontransactiontexto livre, retornado com a respostatodosmanual HTTPS
faxfaxNumberformato internacional, +49 89 72448483faxmanual HTTPS
locationlocation1 Munique (DE), 2 Hausleiten perto de Viena (AT), 3 Hamburgo (DE), padrão 1carta, faxmanual HTTPS
destinationdestination, PIXELLETTER_DEFAULT_DESTINATIONcódigo ISO de duas letras, obrigatório para cartas, ignorado para fax purocartamanual HTTPS
addoption 27registeredEinschreiben, registrocartamanual HTTPS
addoption 28returnReceiptRückschein, aviso de recebimento, apenas com 27cartamanual HTTPS
addoption 29personalDeliveryEigenhändig, entrega pessoal, apenas com 27cartamanual HTTPS
addoption 30registeredDropInEinschreiben Einwurf, registro em caixa de correio, não combinável com 27, 28, 29cartamanual HTTPS
addoption 31cashOnDeliveryNachnahme, definido automaticamente quando o bloco de dados bancários é fornecidocartaclasse de referência 2.01
addoption 33colorPrintimpressão colorida em vez de preto e brancocartapyPostal, erro 038
addoption 44goGreenGoGreen, postagem neutra em CO2cartapyPostal
addoption outrosadditionalServiceCodesnúmeros brutos que a PixelLetter acordou para sua contacartamanual HTTPS
controlduplextrue frente e verso (padrão da PixelLetter), false envia NODUPLEX para um único ladocartapyPostal
control brutocontrolqualquer token que a PixelLetter lhe deu, não pode ser combinado com duplexcarta, faxclasse de referência 2.01
returnaddressreturnAddressvalor bruto, sem significado publicadocarta, faxclasse de referência 2.01
wiretransfer/recipient/namecashOnDelivery.name1 a 27 caracterescartaclasse de referência, erros 030 a 037
wiretransfer/recipient/bankaccountidcashOnDelivery.bankAccountId6 a 10 dígitoscartaclasse de referência, erro 036
wiretransfer/recipient/blzcashOnDelivery.bankCodeexatamente 8 dígitoscartaclasse de referência, erro 037
wiretransfer/recipient/banknamecashOnDelivery.bankName1 a 27 caracterescartaclasse de referência, erro 031
wiretransfer/reasonforpayment1cashOnDelivery.reasonForPayment1até 27 caracterescartaclasse de referência, erro 032
wiretransfer/reasonforpayment2cashOnDelivery.reasonForPayment2até 27 caracterescartaclasse de referência, erro 033
wiretransfer/amountcashOnDelivery.amountXXXX,XX, 3,00 a 1600,00 EURcartaclasse de referência, erros 034, 035
text/addressaddresslinhas do endereço do destinatário, país incluídocarta, faxmanual HTTPS
text/subjectsubjectassunto da cartacarta, faxmanual HTTPS
text/messagetexttexto simples, sem HTML, %Unterschrift% insere a assinatura armazenadacarta, faxmanual HTTPS
uploadfile0, uploadfile1, ...files, inlineFiles.pdf, .doc, .xls, .ppt, .rtf, .wpd, .psd, 50 MB cadacarta, fax, assinaturamanual HTTPS
order type="cancel"/idcancel_order.orderIdID do pedido PixelLettercancelamentoclasse de referência 2.01
sender, recipient, cc, bcc, subject, body, filenamesign_invoice.notification.*campos de e-mail da notificação de assinaturaassinaturamanuais de assinatura
info/account:info type="all"get_account_infosem parâmetroscontamanual HTTPS

get_interface_reference retorna a mesma lista em tempo de execução, incluindo a tabela completa de códigos de erro.

O que a interface não oferece

Nomeado explicitamente, porque sua ausência é uma propriedade da API e não uma omissão deste servidor:

  • Sem lista de trabalhos. Não há chamada documentada que liste ou consulte pedidos enviados. cancel_order funciona com um ID de pedido do e-mail de confirmação, get_account_info informa o saldo, todo o resto vive na área do cliente PixelLetter.
  • Sem formato de envelope ou papel, sem classe de postagem, sem velocidade de entrega, sem folha de rosto, sem envelope de resposta, sem identificação do remetente. Esses não são campos da interface. Cartas vão em um envelope de janela DIN C6/5 e a postagem segue peso e país de destino.
  • Sem correção de endereço. Premiumadress aparece no erro 088, mas precisa ser configurado pelo suporte da PixelLetter para a conta e não tem campo de solicitação.
  • Cartões postais, modelos de upload e pedidos em massa. A classe de referência e os códigos de erro mostram que existem (font, número do modelo, ação 5), mas nenhum manual documenta seus valores de ação ou layout de campos. Enviar uma ação adivinhada poderia produzir um despacho real e errado, então foram deixados de fora.
  • ref no bloco de autenticação não tem significado documentado e é sempre enviado vazio, exatamente como a classe de referência faz.

Verificação

npm test    # XML payloads, response parsing, option rules, configuration, HTTP layer with a mocked fetch

Os testes nunca tocam a API ao vivo. A camada HTTP é exercitada por meio de um fetch injetado, que verifica o endpoint, o campo xml, as partes uploadfileN, o sinalizador de modo de teste e o mapeamento de códigos de erro.

Licença

MIT, veja LICENSE.