SafeXL
Edita arquivos .xlsx e .xlsm e deixa macros, tabelas dinâmicas e gráficos intactos. Não consegue excluir linhas ou colunas, e não recalcula.
Documentação
SafeXL
O SafeXL permite que um agente de IA edite pastas de trabalho do Excel e deixe tudo o que não tocar exatamente como estava. Ele altera o XML do arquivo diretamente, em vez de carregar e salvar novamente a pasta de trabalho inteira. Gráficos, tabelas dinâmicas, macros, validação de dados e o restante saem byte-idênticos, a menos que uma edição precise alterá-los. Eu o escrevi para pessoas cujos agentes trabalham em planilhas das quais outras pessoas dependem.
Ele é distribuído como uma CLI (safexl), um servidor MCP (safexl-mcp) e um plugin para Claude Code. Uma versão hospedada está no Apify: https://apify.com/herakles-dev/safexl-workbook
O que eu medi
O benchmark consiste em 8 tarefas difíceis em pastas de trabalho reais, 3 execuções cada, totalizando 24 execuções por braço. Um avaliador determinístico pontua os resultados. "Intacto" significa que a verificação de preservação do avaliador passou. "Aprovado" significa que o resultado estava correto, preservado e válido.
Este não é um teste fora da amostra. Eu construí o SafeXL com base nessas 8 tarefas, e escrevi as orientações do plugin depois de observar os modelos falharem nelas. As orientações não contêm nenhuma das respostas, e um teste no repositório verifica isso. Espere menos em tarefas que eu não vi.
Claude Haiku 4.5 com a habilidade xlsx da Anthropic, instruído em uma linha para usá-la (2026-10-05): 6 de 24 intactos, 5 de 24 aprovados.
Claude Haiku 4.5 com o plugin SafeXL 0.2 e sem instrução do operador (2026-10-05): 22 de 24 intactos, 21 de 24 aprovados. As 24 execuções custaram US$ 1,862 no total, o que equivale a US$ 0,078 por execução e US$ 0,089 por execução aprovada. Esses são os preços de tabela da API, conforme relatados pela CLI. As execuções usaram uma assinatura do Claude.
Os dois braços não são a mesma configuração. O braço com habilidade tinha a habilidade da Anthropic, uma dica de uma linha e nenhum hook. O braço com plugin tinha o plugin com o hook de proteção ativado e a habilidade da Anthropic bloqueada. Sua mensagem inicial diz ao modelo para usar safexl e nunca salvar com openpyxl ou pandas. Portanto, o modelo recebeu um empurrão, e não foi um teste cego. Os braços foram executados como lotes separados no mesmo dia.
As três execuções que falharam. Uma vez, o modelo escreveu uma fórmula de PROCV que avalia como #N/D. Duas vezes, ele inseriu uma linha inteira onde a tarefa exigia uma inserção limitada a algumas colunas, e isso moveu dois nomes definidos.
Uma falha pertence ao próprio SafeXL. Na minha própria verificação após as execuções, safexl verify disse "intacto" para todas as 24 saídas, incluindo as duas que moveram nomes definidos. Você não pode repetir essa verificação a partir deste repositório, porque os arquivos de saída não estão nele. A versão 0.2.0, usada nessas execuções, não sinalizou uma referência que foi movida. A versão 0.2.1 lista cada nome definido e intervalo de tabela que mudou. Eu a executei novamente nas saídas registradas: as duas execuções com falha agora nomeiam os dois nomes movidos, dropdown e droptable, junto com dois nomes que a tarefa pretendia expandir. O veredito ainda é "intacto", porque o recibo relata a mudança e não pode saber se ela era desejada. O hook de proteção não teve nada em que agir em nenhuma das 24 execuções.
Também executei outros modelos apenas com as ferramentas MCP do SafeXL. Não executei nenhum deles sem o SafeXL. Essas linhas mostram o que cada modelo conseguiu com as ferramentas. Elas não mostram o que as ferramentas adicionaram.
A tabela cobre 7 das 8 tarefas, 21 execuções por modelo. O prompt do sistema dessa rodada continha a fórmula de uma tarefa como exemplo, então deixei essa tarefa de fora. O resumo da rodada cita as linhas.
| Modelo | Aprovados | Custo por execução |
|---|---|---|
| DeepSeek V4 Flash (OpenRouter) | 21 de 21 | cerca de US$ 0,011, cerca de 29 s |
| Qwen 3.8 27B (camada gratuita) | 18 de 21 | não cobrado |
| Nemotron 3 Super 120B (camada gratuita) | 17 de 21 | não cobrado |
| Laguna S 2.1 (camada gratuita) | 16 de 21 | não cobrado |
| Mistral Small 3.2 | 13 de 21 | US$ 0,0030 |
| GPT-OSS 120B | 12 de 21 | US$ 0,0021 |
| Claude Haiku 4.5, mesmo harness | 6 de 7 (uma repetição, parcial) | US$ 0,0933 |
As outras orientações do prompt foram escritas depois de observar os modelos falharem nessas tarefas, então essas linhas também estão dentro da amostra. Mais quatro modelos executaram apenas 5 a 7 vezes e passaram em 2 a 4 delas. Eles estão no resumo dessa rodada. Algumas linhas incluem falhas de API e respostas vazias.
Vinte e quatro execuções por braço em 8 tarefas é uma amostra pequena, e o benchmark é meu.
Verifique você mesmo
git clone https://github.com/herakles-dev/safexl
cd safexl
pip install -e 'packages/safexl[scan,test]'
python3 research/xlsx-bench/fetch_corpus.py
python3 research/xlsx-bench/grade.py --tasks research/xlsx-bench/tasks_hard8.json --runs <runs dir> --summary
fetch_corpus.py baixa as 14 pastas de trabalho de teste de suas fontes upstream e verifica seus hashes. Nenhuma delas está neste repositório. A avaliação precisa do LibreOffice (soffice) no PATH. Executar uma rodada precisa da CLI claude.
As notas estão em research/xlsx-bench/results/. Cada rodada tem sua própria pasta. As execuções brutas estão em research/xlsx-bench/recordings/. Você pode ler cada execução e reexecutar o benchmark. Você não pode reavaliar meus arquivos exatos, porque as pastas de trabalho de saída das minhas execuções não estão no repositório. Caminhos locais, meu nome de usuário e o nível de assinatura são reescritos nas gravações.
Instalação
O SafeXL não está no PyPI. Instale-o a partir da URL do git:
pip install "git+https://github.com/herakles-dev/safexl#subdirectory=packages/safexl"
command -v safexl
Para Claude Code, adicione o plugin:
claude plugin marketplace add herakles-dev/claude-plugins
claude plugin install safexl@herakles-plugins
Ou adicione apenas o servidor MCP:
claude mcp add safexl -- safexl-mcp
O que ele não pode fazer
Ele não pode excluir linhas ou colunas. Ele não pode inserir colunas. Ele não pode criar gráficos, tabelas dinâmicas ou formatação. Ele não recalcula fórmulas; ele sinaliza a pasta de trabalho para recalcular ao abrir. Planilhas com prefixo de namespace (arquivos .NET OpenXML SDK) são recusadas. A saída foi aberta no LibreOffice. Nunca foi aberta no Excel para desktop.
O que há no repositório
packages/safexl/contém o mecanismo, a CLI, o servidor MCP e o plugin Claude Code emclaude-plugin/.research/xlsx-bench/contém o benchmark: tarefas, avaliador, executor,fetch_corpus.pye as gravações e resultados de três rodadas.research/safexl-moat/fixtures/contém um manifesto e uma pequena pasta de trabalho minha.
Licença
MIT. As pastas de trabalho de teste de terceiros permanecem sob suas licenças upstream. Veja research/xlsx-bench/THIRD_PARTY.md.