WebMCP no seu site|INEMA.CLUB-PRO

Aula 4 · 15 min

Ciclo de vida: getTools, toolchange, AbortSignal e cancelamento

Ferramenta não é para sempre: a página registra quando a função existe e remove quando sai de cena. Na spec de 16/10/2026 não há unregisterTool; quem remove é o signal de um AbortController. E quem chama pode cancelar uma execução no meio. Nesta aula você vê o ciclo inteiro e os eventos que o navegador dispara.

Começar a aula
Painel de conexões escuro com alguns cabos ligados e uma mão puxando um deles para fora.

Nesta aula você vai

  1. 1Registro com signal e o evento toolchange
  2. 2Remover com abort(): o lugar do antigo unregisterTool
  3. 3Cancelar uma execução: signal no execute e no executeTool
  4. 4toolactivated e toolcancel: nativo dispara, polyfill não

Objetivo: registrar, listar, remover com AbortSignal e cancelar uma execução, sabendo quais eventos o navegador dispara em cada passo.

01O ciclo de uma ferramenta

Clique em cada passo.

Doc do Chrome: window.ontoolactivated e window.ontoolcancel não têm suporte desde o 156. Ouça no document.modelContext.

Medido em 19/10/2026: o Chromium 156 dispara os três eventos; o polyfill 6.0.3 só toolchange.

02O ciclo em código

Trecho de kit/scripts/ciclo.mjs (roda dentro da página). Dois controllers: um para o registro, outro para a chamada.

Trecho simplificado · kit/scripts/ciclo.mjs
const registro = new AbortController();
await mc.registerTool({
  name: 'tarefa_lenta', description: 'Leva 2 segundos. Existe só para ensinar cancelamento.',
  async execute(_, { signal }) {
    return new Promise((ok, falha) => {
      const t = setTimeout(() => ok({ terminou: true }), 2000);
      signal.addEventListener('abort', () => { clearTimeout(t); falha(new DOMException('cancelada', 'AbortError')); });
    });
  }
}, { signal: registro.signal });

const t = (await mc.getTools()).find(x => x.name === 'tarefa_lenta');
const chamada = new AbortController();
setTimeout(() => chamada.abort(), 100);
try { await mc.executeTool(t, {}, { signal: chamada.signal }); }
catch (e) { /* AbortError */ }

registro.abort();   // remove a ferramenta: não existe unregisterTool
Terminal · ciclo no nativo e no polyfill
cd ~/projetos/formacao-webmcp-site-v72/kit
node scripts/ciclo.mjs nativo; echo "saída: $?"
node scripts/ciclo.mjs polyfill; echo "saída: $?"
Exemplo do repositório
== Chromium 156.0.8078.4 (Playwright) · modo: nativo
antes: 4 ferramentas
registrou tarefa_lenta: 5 ferramentas
nome repetido: recusado (InvalidStateError)
execução cancelada pelo chamador: AbortError
depois do abort(): 4 ferramentas
eventos: toolchange toolactivated:tarefa_lenta toolcancel:tarefa_lenta toolchange
saída: 0
== Chromium 156.0.8078.4 (Playwright) · modo: polyfill
antes: 4 ferramentas
registrou tarefa_lenta: 5 ferramentas
nome repetido: recusado (InvalidStateError)
execução cancelada pelo chamador: AbortError
depois do abort(): 4 ferramentas
eventos: toolchange toolchange
saída: 0

Mesma sequência nos dois. A diferença está na linha "eventos": só o nativo dispara toolactivated e toolcancel.

03Onde registrar e onde abortar

Mesma regra em qualquer framework: registrar no início, abortar no fim.

1. Página

Registre depois de a regra estar pronta e aborte no pagehide.

É o que iniciarWebMCP faz no kit.

KitaddEventListener('pagehide', () => pagina.abort(), { once: true })

04Prática

Ensaio nos dois modos com API. Cada exercício termina num pronto quando.

E1 · Ciclo no nativo

3 min

Rode o bloco do ciclo e leia linha a linha.

Pronto quando: node scripts/ciclo.mjs nativo → nome repetido: recusado (InvalidStateError), execução cancelada pelo chamador: AbortError, depois do abort(): 4 ferramentas e eventos: toolchange toolactivated:tarefa_lenta toolcancel:tarefa_lenta toolchange.

E2 · A diferença do polyfill

3 min

Rode o mesmo no polyfill e anote no seu status-webmcp.md (aula 1) o que o polyfill não faz.

Pronto quando: node scripts/ciclo.mjs polyfill → eventos: toolchange toolchange e saída: 0; a linha está no seu arquivo.

E3 · Tudo ou nada

5 min

Rode os testes de regra do kit: um deles simula a 2ª ferramenta falhando no registro.

Pronto quando: node --test 2>&1 | grep -E "^ℹ (pass|fail)" → ℹ pass 4 e ℹ fail 0.

05Teste da aula

A explicação aparece depois da resposta.

Pergunta 1 de 4

Como se remove uma ferramenta na spec de 16/10/2026?

06Em três frases

RemoverSignal no registro e abort() quando a função sai de cena; não existe unregisterTool.
CancelarSignal no executeTool; o execute ouve o próprio signal e para.
Eventostoolchange, toolactivated e toolcancel no document.modelContext; o polyfill só dispara o primeiro.

Para ir além

Aula anteriorPróxima aula