app() agrupas varias operaciones relacionadas en un solo despliegue. Tus agentes IA descubren cada tool individualmente vía MCP, y cada uno tiene su propia ruta HTTP.
Patrón: app() + múltiples define() + .describe() en cada campo + config compartida + ctx.env.get() para secrets.
index.ts
Prueba local
Inicia el servidor conjelou dev y prueba cada tool:
400 con el detalle del error:
Por qué funciona así
- Rutas automáticas — las keys
crearContacto,buscarContactos,eliminarContactogeneran/crear-contacto,/buscar-contactos,/eliminar-contacto. - GET vs POST —
buscarContactosusaconfig: { methods: ["GET"] }para recibir parámetros como query string. Los demás usan POST por defecto. descriptionimporta — cada tool tiene una descripción específica que le dice al agente IA exactamente qué hace y qué retorna. “Busca contactos por nombre o email” es mucho mejor que “Busca contactos”.- Config compartida —
corsytimeoutse definen una vez enapp()y aplican a todos los tools. Cada tool puede sobreescribirlos si necesita. - Secrets centralizados — los 3 tools usan
ctx.env.get("CRM_API_KEY"). Configuras el secret una vez conjelou secrets set. - MCP unificado —
curl http://localhost:3000/mcpretorna los 3 tools como herramientas independientes que el agente puede invocar.