Skip to main content
Glama
arcane-D7

anycubic-slicer-next-control

by arcane-D7

Anycubic Slicer Next Control

PoC de plugin local para o Codex/ChatGPT controlar com segurança o Anycubic Slicer Next no Windows através de tools MCP estruturadas.

O projeto abre o app, carrega STL/3MF, descobre perfis locais, aplica overrides básicos de slicing, inicia o slice e exporta G-code e/ou .gcode.3mf. Suporta também remote print LAN (MQTT + FTP) para impressoras Anycubic compatíveis, com envio do ficheiro para o SD card e início/controlo do trabalho a partir da máquina local.

Estado do PoC

  • Detecta automaticamente C:\Program Files\AnycubicSlicerNext\AnycubicSlicerNext.exe e aceita override por variável de ambiente.

  • Usa a CLI nativa herdada do OrcaSlicer (--load-settings, --load-filaments, --slice, --outputdir, --export-3mf) apenas para slice local de G-code.

  • Orquestra o app GUI para export compatível com o firmware: slice_via_app abre o app, carrega o modelo e usa os controlos visuais do próprio app (Slice all / Export G-code) via UI Automation, porque a CLI não gera os metadados que a impressora exige (thumbnails, print_sequence, paint_info).

  • Inspeciona a janela via Windows UI Automation e expõe um conjunto pequeno e seguro de ações (uia_tree, uia_read, uia_click, uia_type, uia_key) com allowlists fixas — nunca coordenadas nem teclas arbitrárias.

  • Controla impressoras na LAN via MQTT/TLS (porta 8883) e FTP/TLS (porta 990), com o access code nunca registado em logs.

  • Leitura da conta Anycubic via cloud workbench API (account_login, account_devices, account_files), com token JWT capturado do app em memória e guardado DPAPI-encrypted. O envio por account_print está bloqueado para repetição de ficheiros históricos até corrigir o contrato cloud documentado no incidente de 2026-09-07.

  • Cria um plano temporário antes de executar e grava cada resultado numa pasta nova, evitando sobrescrita.

  • Valida extensões, tamanho, caminhos canónicos, perfis e roots permitidos.

  • Regista apenas metadados mínimos num audit log local; não guarda prompts nem tokens.

Related MCP server: OrcaSlicer MCP

Arquitetura

ChatGPT / Codex
      |
      | MCP stdio; schemas estritos; aprovação do host
      v
Servidor local TypeScript
      |
      +-- Policy: allowlists, limites, plano -> confirmação, audit log
      |
      +-- Orquestração do app GUI (via de export compatível)
      |      +-- slice_via_app: abrir app, carregar modelo,
      |      |   Slice all + Export G-code (UIA allowlist)
      |      +-- export-scan: localizar ficheiro novo e validar
      |          estrutura (thumbnail / print_sequence) antes de usar
      |
      +-- Adaptador CLI (secundário: G-code local)
      |      +-- carregar perfis JSON
      |      +-- overrides básicos
      |      +-- slice local
      |      +-- G-code / G-code.3MF
      |
      +-- Ponte Windows UIA/Win32 (inspeção + ações seguras)
      |      +-- detetar/inspecionar janela
      |      +-- ações allowlist (Slice all, Save Project, Export G-code, ...)
      |
      +-- Remote print LAN (MQTT/FTP) e Cloud (workbench API)

O MCP orquestra o app em vez de replicar o slicer: o firmware rejeita ficheiros .gcode.3mf produzidos só pela CLI (erro 10115) porque lhes falta a estrutura que a própria app GUI gera. A UI wxWidgets expõe controlos via UI Automation com nomes localizados; por isso a camada UIA usa apenas uma allowlist pequena e robusta de ações, nunca coordenadas arbitrárias.

Mais detalhes: docs/architecture.md e schemas/tools.json.

Codex local vs. ChatGPT

  • Codex desktop/local: usa diretamente o servidor MCP stdio incluído em .mcp.json.

  • ChatGPT Developer Mode: a OpenAI exige um endpoint HTTPS público ou o Secure MCP Tunnel. Para manter o slicer privado, ligue o tunnel a este servidor stdio; depois registe a conexão no ChatGPT e use o ID plugin_asdk_app... numa futura .app.json.

  • O PoC não abre porta TCP e não cria um tunnel automaticamente. Essa escolha evita exposição acidental da máquina e precisa de configuração/autorização do workspace do utilizador.

O manifesto .codex-plugin/plugin.json e a pasta skills/ são específicos do ecossistema Codex. O servidor em dist/server.mjs, porém, é um servidor MCP stdio normal e pode ser usado por qualquer cliente MCP que execute processos locais na mesma máquina Windows.

Claude Code

Extraia o plugin para uma pasta estável, por exemplo C:\Tools\anycubic-slicer-next-control, e registe o servidor nativo:

claude mcp add anycubic-slicer-next --scope user -- cmd /c node "C:\Tools\anycubic-slicer-next-control\dist\server.mjs"
claude mcp list

No Windows nativo, cmd /c evita problemas de inicialização do processo local. O Claude Code pedirá confirmação antes de usar uma configuração MCP de projeto.

GitHub Copilot CLI

copilot mcp add anycubic-slicer-next -- node.exe "C:\Tools\anycubic-slicer-next-control\dist\server.mjs"
copilot mcp list

Também é possível colocar a configuração em %USERPROFILE%\.copilot\mcp-config.json. No VS Code, use .vscode\mcp.json com a mesma command/args, mas a chave superior esperada pelo editor é servers em vez de mcpServers.

Claude Code e Copilot usarão as tools MCP, mas não a skill Codex nem o manifesto .codex-plugin. O cliente precisa rodar no Windows onde o Anycubic Slicer Next está instalado; agentes cloud/remotos não conseguem controlar esse aplicativo local sem uma ponte explícita.

Como usar o MCP (guia de utilização)

O servidor expõe 86 tools MCP (ver schemas/tools.json) que cobrem o ciclo completo: inspecionar → abrir → fatiar → exportar → imprimir. Todas as tools são chamadas pelo agente (Codex, Claude, Copilot, …) através do protocolo MCP stdio; o fluxo é sempre o mesmo:

1. Modelo de confirmação (gating)

O servidor é local-first e "least privilege": nenhuma tool que tenha consequências (mover eixos, aquecer, iniciar impressão, enviar comandos, escrever ficheiros) executa sem aprovação explícita.

Classe de segurança

Exemplos

Exigências

read

inspect_slicer, printer_status, account_cloud_diagnostics, printer_read_all, slicer_profiles

nenhuma — executam de imediato

state

printer_connection_close, ace_feed_finish, ace_refresh_slot, printer_rename

confirm: true

thermal

temperature_set (via printer_command_send)

confirm: true

motion / job

mover eixos, printer_command_send (motion), printer_print_start, printer_edge_stop, account_print_local

confirm: true e confirm_word: "EXECUTE"

Regra prática: se a tool pedir confirm, o agente deve mostrar o plano/parâmetros ao utilizador e aguardar aprovação explícita antes de chamar. Um default de schema (confirm: false) nunca dispara uma ação.

2. Jornada típica — fatiar e exportar

1. inspect_slicer({})                    → confirma instalação, processo e roots permitidos
2. slicer_profiles({ kind: "machine", query: "Kobra S1" })
3. open_model_in_slicer({ path: "<abs>\\modelo.stl|3mf", confirmation: "RUN" })
4. prepare_slice_job(...)                → devolve o plano (camada, infill, walls, suportes)
5. run_slice_job({ job_id, confirmation: "RUN" })
  • O fluxo recomendado para exportar um ficheiro que o firmware aceita é slice_via_app (o app gera thumbnails, print_sequence, paint_info — a CLI não gera esses metadados e a impressora rejeita o ficheiro com erro 10115).

  • A CLI é usada apenas como via secundária para G-code local (--slice, --export-3mf). Não assuma que o resultado CLI é imprimível sem a validação do app.

  • Nunca imprima G-code sem verificar no preview/estado: impressora, nozzle, filamento, temperaturas, tipo de mesa e limites físicos.

3. Jornada típica — imprimir via LAN

1. discover_printers({})                 → ou fixar ANYCUBIC_PRINTER_IPS
2. printer_status({ dev_id, dev_ip, access_code })
3. send_to_printer({ ... local_file })   → envia .gcode/.3mf para sdcard/ via FTP/TLS
4. start_print({ ... })                  → inicia o trabalho (project_file)
5. printer_status(...)                   → confirmar gcode_state / mc_percent

4. Jornada típica — imprimir via cloud (por conta)

1. account_capture_token({})             → captura o JWT do app em memória (requer sessão iniciada)
2. account_token_status({})              → confirma dono/expiração sem ecoar segredo
3. account_login({})                     → troca token por sessão cloud (XX-Token)
4. account_devices({})                   → obter printer_key
5. account_file_upload({ local_file })   → sobe o .gcode/.3mf para a cloud
   (ou account_cloud_files({}) para escolher um ficheiro já existente)
6. printer_print_start(...)            → ordem 1 int live-validated (contrato correto)

Atenção: account_print está legado/obsoleto (ordem 1/filetype 1, o contrato que causou o erro 10115). Para ficheiros novos use slice_via_app + upload + printer_print_start/account_print_local. Ver incidente de 2026-09-07.

5. Ler o estado antes de agir

O servidor privilegia leitura antes de escrita. Antes de qualquer comando de controle, use:

  • printer_status / printer_status_snapshot — temperaturas, estado, progresso, slots ACE

  • printer_read_all — leitura exaustiva de todas as fontes (12 MQTT + catálogo HTTP, 434 campos)

  • printer_connection_status — saúde da sessão MQTT cloud persistente

  • printer_property_catalog — o que cada propriedade significa (offline)

  • printer_hidden_command_map — todos os canais de escrita e a sua classe de segurança

O printer_command_send aceita light, fan, temperature, ace_*, ai_settings, axis, camera, print_update, pause/resume/stop — mas cada classe respeita o gating da tabela acima.

6. CAD e ferramentas criativas

cad_open_workspace({})                   → abre o editor 3D web local (127.0.0.1, token por sessão)
cad_generate_parametric(...)             → script paramétrico (manifold) → malha
cad_generate_from_prompt({ prompt, dry_run: true })  → AI texto→CAD (sem chamar o provedor)
cad_v2_boolean({ ... })                  → booleanos CSG watertight (subtract/union/intersect)
cad_export(...) → slice_via_app(...)     → fluxo completo modelar→fatiar
cad_close_workspace()                    → para o servidor local

7. Boas práticas / segurança

  • Caminhos absolutos sempre. Roots permitidos: ANYCUBIC_CONTROL_ALLOWED_INPUT_ROOTS / ANYCUBIC_CONTROL_ALLOWED_OUTPUT_ROOTS.

  • confirm por omissão é false — o utilizador aprova em cada passo consequente.

  • Nunca colar access codes / tokens no chat: o servidor usa env vars ou ficheiros DPAPI-protected. Logs redigem tokens automaticamente.

  • Lê o estado antes de agir: use as tools read acima antes de qualquer printer_command_send / printer_print_start.

  • Workflows de ficheiros: outputs em pasta nova por UUID (ANYCUBIC_CONTROL_OUTPUT_ROOT), nada é sobrescrito.

Tools

Tool

Efeito

inspect_slicer

Deteta instalação, processo, roots e disponibilidade UIA.

list_slicer_profiles

Lista perfis JSON locais por tipo.

open_slicer

Abre o app.

open_model_in_slicer

Valida e abre um STL/3MF permitido.

prepare_slice_job

Valida tudo e devolve o comando/plano, sem executar.

run_slice_job

Executa um plano confirmado numa pasta nova.

get_slice_job

Consulta estado e artefactos.

uia_tree

Lê a árvore UIA da janela do slicer (depth/children limitados).

uia_read

Lê valores/estado dos controlos expostos.

uia_click

Invoca uma ação segura por nome (Slice plate/all, Save Project, Export G-code).

uia_type

Digita texto ASCII no controlo focado (máx. 500 chars).

uia_key

Envia uma tecla/shortcut da allowlist (Enter, Tab, Ctrl+S, ...).

slice_via_app

Orquestra o app (abre, ativa, Slice all + Export G-code via UIA) e localiza/valida o ficheiro exportado. Use quando o firmware rejeitar ficheiros slice-via-CLI (erro 10115).

discover_printers

Varre a sub-rede local procurando portas de impressora (8883/990/...).

printer_status

Consulta temperaturas, estado e progresso da impressora via MQTT.

send_to_printer

Envia .gcode/.3mf para o SD card via FTP (sdcard/).

start_print

Inicia o trabalho na impressora via project_file (LAN).

cancel_print

Envia task_cancel/task_pause/task_resume/print_stop.

account_capture_token

Captura o JWT (access_token) do app em memória e guarda DPAPI-encrypted.

account_token_status

Mostra quem é o dono do token e expiração, sem ecoar o segredo.

account_token_clear

Apaga o token guardado e a sessão em memória.

account_login

Troca o access_token por uma sessão cloud (XX-Token) ativa.

account_devices

Lista impressoras ligadas à conta Anycubic (remote print por conta).

account_files

Lista ficheiros na nuvem da conta (que alimenta account_print).

account_print

Legado/obsoleto: mantido por compatibilidade mas usa o contrato antigo (ordem 1, filetype 1) que causou o erro 10115. Use printer_print_start (contrato ordem 1 int, live-validated 2026-09-11). Ver incidente de 2026-09-07.

account_cloud_diagnostics

Consultas cloud allowlist: detalhe/estado/funções da impressora, histórico e detalhe, projetos, erros, metadados G-code, ACE, thumbnails.

account_cloud_live_diagnostics

Leituras MQTT cloud por tipo (axis/info/tempature/fan/light/peripherie/aiSettings/multiColorBox/print/file) com correlação de respostas e códigos do device.

printer_http_readonly_diagnostics

Sondas HTTP GET limitadas à impressora (facade OctoPrint/gkapi).

printer_read_all

Leitura exaustiva: todas as fontes MQTT (12) via cloud ou LAN nativa + catálogo HTTP completo (434 campos), com reconciliação campo-a-campo. Ver printer-property-map.

printer_property_catalog

Catálogo offline das 553 propriedades conhecidas (fonte, unidade, grupo, evidência, tópico).

printer_hidden_command_map

Mapa offline de todos os canais de escrita: tópicos, envelope, comandos com payload e classe de segurança, endpoints HTTP, order ids legacy, operações não verificadas.

printer_property_reconcile

Reconciliação offline: payload capturado vs catálogo → revela campos não documentados (extra).

printer_command_catalog

Lista os 18 comandos executáveis (tipo, ação, payload, classe de segurança, confirmações exigidas).

printer_connection_status

Saúde da sessão MQTT cloud persistente (ligada, contadores, eventos em buffer).

printer_gcode_resolve

Resolve gcode_id → cloud file id + metadados de slice (/work/gcode/infoFdm).

printer_command_send

Controlo completo por cloud: luz, ventoinhas, temperatura, ACE (secagem/feed/auto-feed/slot), AI, eixos (mover/home/motores-off), câmara (start/stop capture), print_update (configurações do trabalho em curso), pausa/retomar/parar, início local. Exige confirm: true (+ confirm_word: "EXECUTE" em motion/job).

printer_print_start

Início de impressão cloud com o contrato ordem 1 int live-validated (2026-09-11: uma tarefa real alcançou printing e finished na unidade de teste; a hipótese 1240 nunca criava tarefa): resolve gcode, recusa impressora ocupada, slice_param completo, mapeamento ACE explícito e verificação pós-envio da tarefa. Ver printer-command-bus.

account_file_upload

Upload de ficheiro local para a cloud (lock → PUT presigned → claim → unlock; locks órfãos eliminados em falha). Devolve cloud file id e gcode_id quando gerado.

account_print_local

Fluxo completo local→impressão: upload + resolução + início ordem 1 verificado num só fluxo confirmado.

printer_lan_camera

Snapshot da câmara por LAN (HTTP-FLV porta 18088, ffmpeg argv fixo, sem shell).

printer_connection_close

Encerra a sessão MQTT cloud persistente (higiene; reconecta automaticamente no próximo comando).

printer_material_catalog

Vocabulário de materiais aceite nas escritas de slot ACE.

printer_status_snapshot

Painel único de estado cloud (read-only): lifetime (print count, material usado, tempo total), firmware, temperaturas atuais, features, slots ACE Pro (filamento/estado/cor). Expansão Batch 0.

account_print_history

Histórico de impressão cloud com página/limite/status e razões de falha legíveis (read-only). Expansão Batch 0.

printer_lifetime_metrics

Métricas compactas de vida útil da impressora (contador, material, tempo) (read-only). Expansão Batch 0.

account_cloud_store

Quota de armazenamento cloud (usado/total) para preflight de upload (read-only). Expansão Batch 0.

account_cloud_files

Shelf de ficheiros cloud: gcode_id, tamanho, MD5, thumbnails (read-only). Expansão Batch 0.

printer_error_list

Catálogo de defeitos da câmara/AI + códigos de razão de falha conhecidos (read-only). Expansão Batch 0.

printer_file_preview

Pré-visualização de slice por gcode_id/file_id: layers, dimensões, uso de filamento por cor (read-only). Expansão Batch 0.

printer_order_registry

Registos de order-ids do protocolo cloud: 10 validados live + 40 de referência, com aviso de colisão 1214 (read-only). Expansão Batch 0.

account_cloud_projects

Índice de projetos cloud (/work/project/getProjects): id, nome, modelo, tamanho, timestamps — útil como índice de recuperação/report (read-only). Expansão Batch 2.

account_print_metrics

Agregados sobre account_print_history: contadores finished/failed/cancelled/paused, breakdown de falhas por razão legível e taxas de sucesso/falha (read-only). Expansão Batch 2.

printer_metrics_expose

Snapshot da impressora como texto Prometheus/OpenMetrics (printer_print_count_total, printer_material_used_kg, temperaturas, consumíveis, ACE drying) — pronto para Grafana/scrape (read-only). Expansão Batch 2.

printer_edge_stop

Recuperação de estado preso: mode:"force" envia STOP_PRINT_FORCE (44); mode:"free" envia SET_PRINT_STATUS_FREE (901) para limpar estados de "resuming/stoping". confirm:true e confirm_word:"EXECUTE" (safety job). Só na unidade de teste, após leitura do estado. Batch 1.

ace_feed_finish

Conclui uma operação de alimentação de filamento ACE (FEED_FILAMENT_FINISH 1209). confirm:true (safety state). Batch 1.

ace_refresh_slot

Refresca os metadados de um slot ACE (MULTI_COLOR_BOX_REFRESH_SLOT 1210). confirm:true (safety state). Batch 1.

printer_rename

Renomeia a impressora na conta cloud (/work/printer/edit, N10). confirm:true; idempotente, não destrutivo. Batch 1.

firmware_update_check

Consulta firmware atual/latest e indica se existe atualização (OTA read-only, nunca dispara/cancela OTA; N10). Batch 1.

printer_event_watch

Amostra printersStatus e devolve o delta desde a amostra anterior (estado, print_status, task_id, temperaturas, contadores lifetime, slots/consumíveis ACE, drying) como eventos; reset:true limpa a baseline. Read-only. N14. Batch 2.

nfc_tag_decode

Decoder puro offline de registos NFC crus → Anycubic SKU / Bambu-like / Creality ASCII. Nunca escreve em nenhuma tag. Read-only. N13. Batch 2.

spool_resolve

Resolve UID/SKU contra o registo offline de spools conhecidos. Read-only. N13. Batch 2.

camera_cloud_info

Info da câmara cloud: suporte RTC (Agora/Shengwang), video_taskid (autoriza sessão RTC), timelapse. Nunca abre a câmara nem encaminha o stream. Read-only. N12. Batch 2.

cad_open_workspace

Abre na browser uma página web 3D CAD local (127.0.0.1, token por sessão) para modelar/editar STL para impressão. Pode pré-carregar um ficheiro.

cad_close_workspace

Para o servidor local do workspace CAD (os ficheiros exportados permanecem no disco).

cad_v2_boolean

CSG robusto (Sprint 1): boolean watertight (add/subtract/intersect) entre dois objectos do workspace via three-bvh-csg.

cad_generate_parametric

Motor paramétrico (Sprint 2): executa script declarativo sandboxed sobre manifold-3d (WASM) e materializa a malha; STL/STEP opcional.

cad_generate_from_prompt

AI texto → CAD (Sprint 3): traduz descrição em script paramétrico (provedor configurado por CAD_AI_*), valida e executa; dry_run pré-visualiza sem chamar o provedor.

cad_select_faces / cad_edit_mesh / cad_texture / cad_image_to_3d

Edição avançada no workspace CAD: seleção de faces, extrude/bevel/subdivide/sculpt, cor/texture/relevo, imagem → 3D.

printer_capability_catalog

Catálogo read-only das capacidades LAN Anycubic (queries confirmadas, comandos mapeados, câmara).

printer_lan_command_preview

Pré-visualização exata (tópico + envelope) de um comando LAN — sem conectar nem publicar.

printer_diagnostics / printer_monitor

Diagnóstico LAN e recolha repetida de snapshots de estado.

printer_lan_camera / camera_watch

Câmara via HTTP-FLV (porto 18088): mode:snapshot|stream, duration_s (1–60), size; camera_watch faz snapshots periódicos opt-in (confirm:true). Captura read-only para o estado da impressora.

auth_setup / auth_id_flow_start

Primeira instalação sem Slicer: colar token pcf/web OU fluxo email/senha assistido por browser (portal Casdoor). Valida e grava DPAPI. Ver docs.

REST/OpenAPI (fase 5) + dados persistentes

Além do MCP stdio, o mesmo leque de tools está disponível por HTTP local (token-gated, só 127.0.0.1) para clientes genéricos (n8n, Node-RED, Home Assistant, Postman):

# 1) gerar/atualizar a spec OpenAPI 3.0 a partir das tools reais (79)
node scripts/generate-openapi.mjs --live
#    -> escreve schemas/openapi.json

# 2) subir o bridge REST
node scripts/rest-bridge.mjs [--port 8766] [--token <hex>]
#    POST /tools/{tool_name}   (Bearer token)
#    GET  /openapi.json
#    GET  /health

O token é criado em %LOCALAPPDATA%\AnycubicSlicerNextControl\bridge-token (ou PLUGIN_DATA); se não for passado --token, é gerado e impresso no arranque.

PLUGIN_DATA (variável de ambiente): redireciona toda a pasta de dados (tokens cloud, bridge-token, outputs) para outro disco/pasta. Resolução: $PLUGIN_DATA > %LOCALAPPDATA%\AnycubicSlicerNextControl > pluginRoot/AnycubicSlicerNextControl. Útil para não encher o disco de sistema ou para perfis portáteis.

Diagnóstico read-only consolidado: node scripts/diagnose.mjs [--cloud|--lan <ip>|--http|--printers] (substitui os antigos probe-*.mjs, arquivados em scripts/archive/).

Módulo CAD (modelação 3D web)

O plugin inclui um módulo de modelação 3D web leve para desenhar objectos para impressão 3D sem abrir outra aplicação:

  • cad_open_workspace({ input_path?, port?, idle_timeout_min?, open_browser? }) inicia um servidor HTTP apenas em 127.0.0.1 (nunca exposto à rede), gera um token aleatório por sessão e abre o browser. A ferramenta devolve a URL (com token).

  • A página web oferece um editor inspirado em CAD (Three.js): primitivas (caixa, cilindro, cone, esfera, prisma), transformações numéricas em milímetros (mover, centrar, rodar, escalar), operações booleanas CSG (união/subtração/intersecção), import STL/OBJ e export STL/OBJ/3MF para a pasta raiz de saída configurada.

  • Booleanos robustos (Sprint 1): cad_v2_boolean executa CSG watertight via three-bvh-csg (MIT) sobre dois objectos do workspace — subtrair/intersetar com buracos reais (não só meias-espaços).

  • Motor paramétrico (Sprint 2): cad_generate_parametric executa um script declarativo sandboxed sobre manifold-3d (WASM) — box/cylinder/sphere/cone/tetrahedron, add/subtract/intersect, translate/rotate/scale/mirror — materializa a malha no workspace e devolve STL/STEP opcional.

  • AI texto → CAD (Sprint 3): cad_generate_from_prompt traduz uma descrição em linguagem natural num script paramétrico (provedor configurável por ambiente), valida, executa no motor manifold e materializa o resultado. dry_run: true devolve uma pré-visualização determinística sem chamar o provedor.

  • Medidas precisas: o servidor calcula caixa envolvente, volume e área num núcleo matemático em dupla precisão, e o ficheiro exportado pode ser usado diretamente em slice_via_app/CLI.

  • cad_close_workspace para o servidor (fica livre a porta); os ficheiros exportados permanecem no disco.

  • O workspace CAD não toca na impressora nem no slicer; é apenas um editor/repositório de STL para alimentar os fluxos de slicing existentes.

AI texto → CAD (configuração)

O provedor é lido de variáveis de ambiente do processo do servidor (nunca do browser/renderer):

Variável

Padrão

CAD_AI_API_KEY

(sem chave — tool responde "not configured")

CAD_AI_BASE_URL

https://api.openai.com/v1

CAD_AI_MODEL

gpt-4o-mini

Exemplo:

$env:CAD_AI_API_KEY = "sk-..."
node dist/server.mjs

O fluxo completo (sem dry_run) chama {base}/chat/completions, extrai o código de um fenced block, valida contra o sandbox partilhado e executa. A chave nunca é exposta na UI nem nos logs (todos os erros passam por redact()).

Instalação e build

Requisitos: Windows, Anycubic Slicer Next e Node.js 22+.

Para instalação standalone, extraia anycubic-slicer-next-control-0.1.0.zip para uma pasta sem espaços e preserve a estrutura interna, especialmente dist/server.mjs. O ZIP é um pacote de plugin; para Codex, instale-o pelo marketplace/plugin manager local e abra uma nova task. Para outros clientes, use diretamente os comandos MCP acima.

Também há um bundle anycubic-slicer-next-marketplace-0.1.0.zip que já contém a estrutura .agents/plugins/marketplace.json e plugins/; ele pode ser registado diretamente como marketplace local do Codex.

pnpm install
pnpm run check

pnpm run check roda, em sequência, build → testes → smoke → e2e UI:

  • build: node scripts/build.mjs regenera dist/server.mjs a partir do bundle congelado vendor/server.mjs (sem tsc/esbuild; idempotente). O dist/ é gitignored — nunca edite o dist/ diretamente, use o vendor/.

  • test: suíte unitária (Node test runner, sem rede).

  • smoke: scripts/smoke.mjs arranca o servidor MCP via stdio e valida as 82 tools + cad_open_workspace.

  • e2e:ui: tests/e2e/cad-ui.e2e.mjs lança um Chromium headless real, abre o workspace CAD e executa o fluxo completo em browser: add primitivas → boolean CSG → paramétrico → AI dry-run (zero erros de página).

O plugin já inclui .codex-plugin/plugin.json e .mcp.json. Para desenvolvimento local, adicione a pasta a um marketplace pessoal ou de repositório usando o fluxo oficial do Codex; depois instale o plugin e abra uma nova task para carregar as tools.

Configuração de segurança

Variáveis opcionais:

Variável

Valor padrão

ANYCUBIC_SLICER_EXE

Descoberta em pastas padrão do Windows.

ANYCUBIC_CONTROL_ALLOWED_INPUT_ROOTS

Plugin, Documents, Desktop e Downloads.

ANYCUBIC_CONTROL_OUTPUT_ROOT

Documents\Anycubic-Control-Exports.

ANYCUBIC_CONTROL_ALLOWED_OUTPUT_ROOTS

O root de output acima.

ANYCUBIC_CONTROL_MAX_INPUT_BYTES

1 GiB.

ANYCUBIC_CONTROL_SLICE_TIMEOUT_MS

600000 ms.

ANYCUBIC_ACCESS_CODE

Access code da impressora (8 chars alfanuméricos). Usado quando a tool não recebe access_code.

ANYCUBIC_PRINTER_IPS

IPs fixos separados por vírgula, para saltar o scan da sub-rede.

Roots múltiplos usam ;. Todos os caminhos enviados às tools devem ser absolutos. Outputs são sempre criados dentro de uma pasta nova cujo nome é o UUID do job.

Exemplo de fluxo

  1. inspect_slicer({})

  2. list_slicer_profiles({ kind: "machine", query: "Kobra S1" }) — use the test-unit family as an example; any Anycubic machine profile works.

  3. Listar também processo e filamento.

  4. prepare_slice_job(...) com, por exemplo, layer_height_mm: 0.2, infill_density_percent: 15, wall_loops: 3 e supports: false.

  5. Rever printer/nozzle/material/output.

  6. run_slice_job({ job_id, confirmation: "RUN" }).

Nunca imprima G-code sem verificar no preview a impressora, nozzle, filamento, temperaturas, tipo de mesa, limites físicos e comandos de início/fim.

Arquitetura (revisão: orquestrar o app, não replicar o slicer)

O MCP executa o aplicativo para toda a interação com o slicer — abre o app, carrega o modelo, e usa os próprios controlos visuais do app (via UIA) para fatiar e exportar. A CLI herdada do Orca é usada apenas para casos que ela suporta de forma fiável; ela não substitui o app nos formatos de export que o firmware exige. A tool slice_via_app encapsula exatamente esse fluxo: app GUI → Slice all → Export G-code → localizar e validar o ficheiro exportado.

Remote print (LAN)

  1. discover_printers({}) para candidatos na sub-rede (ou configure ANYCUBIC_PRINTER_IPS).

  2. printer_status({ dev_id, dev_ip, access_code }) para confirmar alcance e temperaturas.

  3. send_to_printer({ dev_id, dev_ip, access_code, local_file }) após o slice.

  4. Mostre o caminho remoto e peça aprovação explícita.

  5. start_print({ dev_id, dev_ip, access_code, task_name, file_remote_path: "sdcard:nome.gcode.3mf", ... }).

  6. printer_status para confirmar gcode_state/mc_percent.

Remote print (Cloud / por conta)

  1. account_capture_token({}) — requer que o app esteja com sessão iniciada (re-login enquanto o watcher corre).

  2. account_token_status({}) para confirmar o dono/expiração.

  3. account_login({}) — troca o access_token por uma sessão cloud (XX-Token).

  4. account_devices({}) — obter o key (printer_key) da impressora alvo.

  5. account_files({}) — obter file_key/file_id/gcode_id de um ficheiro já na nuvem.

  6. account_print({ printer_key, file_key, file_id, gcode_id, file_name, ... }).

Aceitação da API ≠ aceitação pelo firmware. Enviar um .gcode.3mf fatiado só via CLI pode resultar em erro 10115 na impressora porque falta ao ficheiro a estrutura que o app GUI gera (thumbnails, print_sequence, paint_info, bed_type). Para impressão cloud de um ficheiro novo, use slice_via_app (o app gera o formato correto), depois suba o ficheiro para a conta e chame account_print.

Pesquisa e limitações

  • A documentação atual da OpenAI define plugins como skills + MCP server + UI opcional e recomenda schemas explícitos, anotações corretas, least privilege e confirmação para ações consequentes: arquitetura, definição de tools, segurança, empacotamento.

  • O Anycubic Slicer Next é open source e baseado no OrcaSlicer: repositório oficial.

  • O manual oficial confirma os fluxos visuais de Import, Slice e Export G-code: manual Anycubic.

  • A CLI exporta G-code como resultado do slice e pode empacotá-lo em .gcode.3mf.

  • O remote print LAN segue o protocolo compatível com Bambu (MQTT device/<id>/request|report + FTP sdcard/), verificado no repositório oficial; necessita da impressora ligada na mesma rede e do access code. A automação foi inspecionada localmente numa instalação cujo executável reporta produto 1.4.1.2. IDs e textos UIA não devem ser tratados como API estável.

Este projeto é independente, não afiliado à Anycubic. Nenhum código do slicer foi copiado; a integração invoca interfaces de processo e UI do app instalado.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables interaction with 3D printer management systems through an MCP server, supporting STL file manipulation, slicing, and control of printers like OctoPrint, Klipper, Duet, and more.
    57 npm
    236
    GPL 2.0
  • A
    license
    A
    quality
    A
    maintenance
    Enables headless slicing with OrcaSlicer, preset management, G-code analysis, and printer control over LAN for Klipper, OctoPrint, Prusa, Duet, Elegoo, and Bambu printers.
    15
    2
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables MCP clients to monitor and control a Bambu Lab P1S printer over the local network, including status, file management, slicing, and print operations.
    11
    MIT