El tool calling de agentes es un pull donde una IA decide invocar una función; un webhook es un push que se dispara cuando ocurre un evento externo. Se los compara porque ambos terminan golpeando tu backend — pero corren en direcciones opuestas, y confundirlos produce mala arquitectura y mala seguridad a la vez. La distinción entera cabe en una línea: un webhook es el mundo → tu sistema (push, disparado por evento, determinista); un tool call es tu IA → el mundo (pull, disparado por el modelo, probabilístico).
Puntos clave
| Eje | Webhook | Tool call de agente |
|---|---|---|
| Dirección | El mundo → tu sistema | Tu IA → el mundo |
| Disparador | Ocurrió un evento | El modelo decidió |
| Modelo | Push | Pull / bajo demanda |
| Determinismo | Determinista | Probabilístico |
| Postura de seguridad | Verificar lo que entra | Restringir lo que sale |
Las dos direcciones
El mismo backend, alcanzado desde ambas direcciones — una verificada, la otra restringida:
// JavaScript — Cloud Code: the same backend, reached two ways
// INBOUND — a webhook: the world tells your system something happened.
// Deterministic. You VERIFY the sender before trusting it.
Parse.Cloud.define('paymentWebhook', async (req) => {
verifyHmac(req.params, process.env.WEBHOOK_SECRET); // trust, then act
await markPaid(req.params.orderId);
return { received: true };
});
// OUTBOUND — an agent tool: your AI decides to do something.
// Probabilistic. You CONSTRAIN what it may do (runs under the user's ACLs).
Parse.Cloud.define('refundOrder', async (req) => {
const order = await new Parse.Query('Order').get(req.params.orderId);
order.set('status', 'refunded');
await order.save(); // ACLs decide if this agent-driven call is allowed
return { refunded: order.id };
}); // Flutter / Dart — Back4app Flutter SDK
// Both directions ultimately hit the same backend functions.
// A webhook arrives when an EVENT fires (push, deterministic);
// a tool call fires when the MODEL decides (pull, probabilistic).
final result = await ParseCloudFunction('runAgent')
.execute(parameters: {'goal': 'refund my last order'});
print(result.result);
// The agent PULLED the refundOrder tool. A payment provider would have
// PUSHED a webhook to paymentWebhook. Same endpoint style — opposite trigger. // iOS / Swift — Back4app Swift SDK
// Both directions ultimately hit the same backend functions.
// A webhook arrives when an EVENT fires (push, deterministic);
// a tool call fires when the MODEL decides (pull, probabilistic).
let result: [String: Any] = try await Cloud.run(
name: "runAgent", parameters: ["goal": "refund my last order"])
print(result)
// The agent PULLED the refundOrder tool. A payment provider would have
// PUSHED a webhook to paymentWebhook. Same endpoint style — opposite trigger. // Android / Kotlin — Back4app Android SDK
// Both directions ultimately hit the same backend functions.
// A webhook arrives when an EVENT fires (push, deterministic);
// a tool call fires when the MODEL decides (pull, probabilistic).
val result = ParseCloud.callFunction<Map<String, Any>>(
"runAgent", mapOf("goal" to "refund my last order"))
println(result)
// The agent PULLED the refundOrder tool. A payment provider would have
// PUSHED a webhook to paymentWebhook. Same endpoint style — opposite trigger. Qué es realmente el tool calling
Como la entrada sobre webhooks ya cubre el lado del webhook, aquí va la mitad que carga este artículo. El tool calling es cómo actúa un agente de IA: entregas definiciones de tools — un nombre, una descripción, un schema JSON tipado — en la solicitud; el modelo razona sobre la conversación y, en lugar de responder en prosa, emite una llamada estructurada nombrando una tool y sus argumentos; tu código la ejecuta y devuelve el resultado para el siguiente paso de razonamiento. El punto que todos subrayan (el recorrido de Fowler es la referencia más clara): el modelo nunca ejecuta la función — solo decide pedirla, guiado por las descripciones de las tools, y por eso esas descripciones merecen cuidado de verdad. “Function calling” (el término más antiguo) y “tool calling” (el más amplio) nombran básicamente el mismo mecanismo.
Determinismo: el eje que cambia cómo construyes
La diferencia que reorganiza tus pruebas, y la que ninguna página de comparación dice con todas las letras. Un webhook es determinista: el evento X dispara el mismo callback con un payload predecible, así que haces pruebas unitarias del handler contra una entrada fija y asertas una salida. Un tool call es probabilístico: el mismo objetivo del usuario puede o no disparar determinada tool, y puede pasar argumentos distintos en cada corrida, así que evalúas al agente estadísticamente — a lo largo de muchas ejecuciones, midiendo con qué frecuencia hace lo correcto — porque no existe una única salida correcta que assertar. Por eso una integración de webhook está “lista” cuando las pruebas pasan, y una integración de agente está “lista” cuando la tasa de éxito supera la barra que tú elegiste. Push versus pull es la distinción memorable; determinista versus probabilístico es la consecuente.
Seguridad: webhooks vs. tool calls — verifica lo que entra, restringe lo que sale
Las direcciones dictan defensas opuestas, y confundirlas de lugar es el riesgo entero.
| Webhook (entrada) | Tool call (salida) | |
|---|---|---|
| La amenaza | Un evento forjado por alguien que se hace pasar por el remitente | Un modelo manipulado tomando una acción que no debería |
| No confías en | El remitente | El juicio del modelo |
| La defensa | Verificar — firma HMAC, protección contra replays, rotación de secretos | Restringir — scopes de mínimo privilegio, compuertas en acciones irreversibles |
| Quién la aplica | Chequeo de firma (webhooks.fyi) | Permisos del lado del servidor, corriendo como el usuario |
Verifica lo que entra; restringe lo que sale. Un handler de webhook que se salta la verificación de firma es un endpoint de escritura sin autenticación; una tool de agente con credenciales demasiado amplias es un incidente de confused deputy esperando una prompt injection. Ambos fallan de la misma manera — una llamada en la que tu sistema confió y no debía — desde direcciones opuestas.
Se componen
No son rivales; son etapas de un mismo loop. Un webhook de entrada despierta a un agente (llegó un ticket de soporte, se aprobó un pago), el agente hace tool calls para actuar sobre eso, y uno de esos tool calls dispara un webhook de salida hacia otro sistema más. El modelo mental limpio para quien hace backend: ambos terminan llegando a tu API y a tus funciones — las únicas diferencias son quién jaló el gatillo (un evento externo o el modelo) y si la invocación fue determinista. Diseña el endpoint una vez; protégelo según la dirección que puede alcanzarlo.
Casos de uso comunes
- Reacción a eventos — pago aprobado, código subido, formulario enviado: un webhook, verificado.
- Acción autónoma — un agente resolviendo un objetivo llamando tools con scope: tool calling, restringido.
- Agentes despertados por eventos — un webhook como puerta de entrada que inicia el loop del agente: ambos, compuestos.
- Superficies de tools reutilizables — muchos agentes compartiendo un mismo conjunto de tools: estandarizado con MCP.
- Trabajo programado y determinista — una búsqueda que tú controlas con un temporizador: una llamada de API común, ni webhook ni tool.
¿Cuál necesitas? Matriz de decisión
| Situación | Usa |
|---|---|
| Ocurrió un evento en otro lugar y debes reaccionar | Webhook |
| Tu IA debe decidir y actuar en tiempo de ejecución | Tool call de agente |
| Una acción dirigida por el modelo sobre tu propio backend | Tool call → una función con scope |
| Muchas tools reutilizadas entre modelos/agentes | MCP sobre tool calling |
| Una búsqueda programada y determinista | Una llamada de API común o polling |
| Un evento debería iniciar un agente | Un webhook que despierta al agente — ambos |
Limitaciones y trade-offs
- La comparación esconde un endpoint compartido. Ambos llegan a la misma función de backend; olvidarlo lleva a dos modelos de seguridad donde bastaba una puerta protegida con dos cerraduras.
- La invocación probabilística se resiste a las garantías. No puedes prometer que un agente llamará una tool como prometes que un evento dispara un webhook — planifica para que el modelo no actúe, y para que actúe mal.
- Verificar y restringir no son intercambiables. Chequear la firma de un tool call o limitar por permisos un webhook resuelve la amenaza equivocada para esa dirección — empareja la defensa con la dirección.
- La composición agrega modos de falla. Un webhook que despierta a un agente que llama tools que disparan webhooks es poderoso y tiene cuatro puntos de quiebre; los IDs de correlación y la idempotencia a lo largo de la cadena no son opcionales.
- “Golpeó mi API” no dice nada sobre la confianza. La misma llamada es segura viniendo de un evento verificado y peligrosa viniendo de un modelo manipulado — lo que defiendes es la procedencia, no la forma de la solicitud.
Ambas direcciones en Back4app
Back4app es una plataforma open-source de Backend as a Service (BaaS) que combina base de datos gestionada, APIs REST y GraphQL generadas automáticamente, autenticación, almacenamiento de archivos y funciones serverless con Cloud Code. Ambas direcciones aterrizan en la misma primitiva — una función de Cloud Code —, y exactamente por eso la plataforma vuelve naturales las dos defensas, como muestran las pestañas de código. Del lado de entrada, una función es receptora de webhooks: verifica el HMAC contra un secreto guardado en el servidor y luego actúa. Del lado de salida, la misma función es una tool de agente: corre bajo la sesión del usuario que llama, así que las ACLs y los permisos a nivel de clase restringen lo que una llamada dirigida por el modelo puede tocar, y un agente secuestrado no puede exceder los derechos del propio usuario. Verifica lo que entra empujado, restringe lo que el agente extrae — un backend, un solo lugar para aplicar ambas cosas, con MCP estandarizando la superficie de tools cuando los agentes se multipliquen.
Preguntas frecuentes
¿Qué es el tool calling de agentes?
El mecanismo por el cual un agente de IA invoca una función: dadas las descripciones de las tools, el modelo emite una llamada estructurada en JSON nombrando una tool y sus argumentos, tu código la ejecuta y el resultado vuelve al modelo para seguir razonando. El modelo decide si llama, cuál llama y con qué argumentos — pero nunca ejecuta la tool por sí mismo.
¿En qué se diferencia el tool calling de un webhook?
Dirección y disparador. Un tool call es tu IA decidiendo en tiempo de ejecución invocar algo — pull, bajo demanda, disparado por el modelo. Un webhook es un sistema externo avisándote de que ocurrió un evento — push, disparado por el evento. Direcciones opuestas: uno es tu sistema saliendo al mundo, el otro es el mundo entrando a tu sistema.
¿Un tool call es una llamada a una API?
En la práctica, el modelo pide una. Él produce la intención y los argumentos; tu aplicación hace la llamada real. El tool calling es envolver una API en un schema que el modelo pueda entender e invocar — el endpoint es el mismo que llamaría un desarrollador humano, solo que disparado por el razonamiento del modelo en vez de por tu código.
¿Los webhooks y el tool calling son alternativas o complementarios?
Complementarios — corren en direcciones opuestas y se componen. Un patrón común: un webhook de entrada despierta a un agente, el agente hace tool calls para actuar y uno de esos tool calls dispara otro webhook de salida. Trabajos distintos, con frecuencia dentro del mismo loop.
¿El webhook es determinista y el tool call es probabilístico?
Sí, y es la distinción con la mayor consecuencia práctica. El evento X siempre dispara su webhook de la misma manera, así que pruebas el handler contra un payload fijo. Un modelo puede o no llamar una tool, y puede pasar argumentos distintos cada vez, así que evalúas a un agente estadísticamente a lo largo de muchas corridas en lugar de assertar una salida única.
¿Cuál es la diferencia de seguridad?
La dirección, otra vez. Con webhooks verificas lo que entra — no confías en el remitente, así que revisas una firma HMAC y te proteges contra replays. Con tool calls restringes lo que sale — no confías del todo en el juicio del modelo, así que limitas las credenciales al mínimo privilegio y pones compuertas a las acciones irreversibles. Verifica lo que entra; restringe lo que sale.
¿Dónde encaja MCP?
El Model Context Protocol estandariza el tool calling — cómo un agente descubre e invoca tools entre modelos y aplicaciones. Se ubica del lado del tool calling de esta comparación, no del lado del webhook: MCP trata del agente saliendo hacia las tools, no de eventos entrando hacia ti.
¿Cuándo deberías usar cada uno?
Ocurrió un evento en otro lugar y debes reaccionar: webhook. Tu IA necesita decidir y actuar en tiempo de ejecución: tool call. Una búsqueda programada y determinista que tú controlas: una llamada de API común o polling. Muchas tools reutilizables entre agentes: estandarízalas con MCP.