WebMCP en tu sitio|INEMA.CLUB-PRO

Clase 4 · 15 min

Ciclo de vida: getTools, toolchange, AbortSignal y cancelación

Una tool no es para siempre: la página la registra cuando la función existe y la quita cuando sale de escena. En la spec del 16/10/2026 no existe unregisterTool; quien la quita es el signal de un AbortController. Y quien llama puede cancelar una ejecución a la mitad. En esta clase ves el ciclo completo y los eventos que dispara el navegador.

Empezar la lección
Panel de conexiones oscuro con algunos cables conectados y una mano sacando uno de ellos.

En esta lección vas a

  1. 1Registro con signal y el evento toolchange
  2. 2Quitar con abort(): el lugar del antiguo unregisterTool
  3. 3Cancelar una ejecución: signal en execute y en executeTool
  4. 4toolactivated y toolcancel: el nativo los dispara, el polyfill no

Objetivo: registrar, listar, quitar con AbortSignal y cancelar una ejecución, sabiendo qué eventos dispara el navegador en cada paso.

01El ciclo de una tool

Haz clic en cada paso.

Doc de Chrome: window.ontoolactivated y window.ontoolcancel no tienen soporte desde el 156. Escucha en document.modelContext.

Medido el 19/10/2026: Chromium 156 dispara los tres eventos; el polyfill 6.0.3 solo toolchange.

02El ciclo en código

Fragmento de kit/scripts/ciclo.mjs (corre dentro de la página). Dos controllers: uno para el registro, otro para la llamada.

Fragmento 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();   // quita la tool: no existe unregisterTool
Terminal · ciclo en el nativo y en el polyfill
cd ~/projetos/formacao-webmcp-site-v72/kit
node scripts/ciclo.mjs nativo; echo "saída: $?"
node scripts/ciclo.mjs polyfill; echo "saída: $?"
Ejemplo del repositorio
== 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

Misma secuencia en los dos. La diferencia está en la línea "eventos": solo el nativo dispara toolactivated y toolcancel.

03Dónde registrar y dónde abortar

Misma regla en cualquier framework: registrar al inicio, abortar al final.

1. Página

Registra cuando la regla ya esté lista y aborta en pagehide.

Es lo que hace iniciarWebMCP en el kit.

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

04Práctica

Ensayo en los dos modos con API. Cada ejercicio termina con un listo cuando.

E1 · Ciclo en el nativo

3 min

Ejecuta el bloque del ciclo y léelo línea por línea.

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

E2 · La diferencia del polyfill

3 min

Ejecuta lo mismo en el polyfill y anota en tu status-webmcp.md (clase 1) lo que el polyfill no hace.

Listo cuando: node scripts/ciclo.mjs polyfill → eventos: toolchange toolchange y saída: 0; la línea está en tu archivo.

E3 · Todo o nada

5 min

Ejecuta las pruebas de regla del kit: una de ellas simula que la 2.ª tool falla en el registro.

Listo cuando: node --test 2>&1 | grep -E "^ℹ (pass|fail)" → ℹ pass 4 y ℹ fail 0.

05Prueba de la clase

La explicación aparece después de la respuesta.

Pregunta 1 de 4

¿Cómo se quita una tool en la spec del 16/10/2026?

06En tres frases

QuitarSignal en el registro y abort() cuando la función sale de escena; no existe unregisterTool.
CancelarSignal en el executeTool; el execute escucha su propio signal y se detiene.
Eventostoolchange, toolactivated y toolcancel en el document.modelContext; el polyfill solo dispara el primero.

Para ir más allá

Clase anteriorSiguiente clase