Herramientas Mastra vs MCP: ¿Cuál Debería Usar tu Agente?
createTool nativo de Mastra vs servidores MCP para agentes de IA: arquitectura, coste de memoria, control de aprobaciones y cuándo elegir cada uno. Cifras reales de una app Mastra en producción.
13 min de lectura

Si construyes agentes con Mastra, te topas pronto con esta decisión: escribir una herramienta nativa con createTool, o conectar un servidor MCP y repartir sus herramientas al agente.
Para el modelo se ven igual: “llama a la herramienta X con estos argumentos”. Las operaciones y el coste, no. Lo aprendí por las malas cuando una integración MCP de WordPress se sentó junto a mi proceso de Mastra y consumió silenciosamente unos 200 MB de RAM siempre activa, solo para que el agente pudiera gestionar entradas.
Este artículo es la división práctica: qué es cada camino, cómo funcionan, cuándo merece la pena MCP y cuándo gana una herramienta Mastra ligera.
¿Nuevo en alguno de los dos lados? Empieza con Crea un agente de IA con Mastra y MCP para principiantes.
Crea un Agente con Mastra Guía de MCP para PrincipiantesLo que realmente estás eligiendo
| Herramientas Mastra | Herramientas MCP | |
|---|---|---|
| Definición | Tu código vía createTool |
Herramientas anunciadas por un servidor MCP |
| Dónde corre el código | En proceso (el mismo Node que Mastra) | Normalmente otro proceso (stdio) o HTTP remoto |
| Quién lo mantiene | Tú | El autor del servidor / el proveedor |
| RAM / procesos | Solo lo que necesita tu función | Un Node extra (y a menudo npx) durante la vida del host |
| Esquemas | Zod que controlas tú | JSON Schema del servidor |
| Aprobaciones / dry-run | Fáciles de implementar | Los envuelves o confías en el servidor |
| Reutilización en workflows | Exporta una función normal y llámala | Incómodo fuera del agente + cliente MCP |
| Ideal para | Capacidades centrales del producto | Paquetes opcionales o de terceros |
Misma experiencia de agente. Factura de ejecución distinta.
Cómo funcionan las herramientas de Mastra
Una herramienta nativa es una función tipada con una descripción que el modelo puede leer. Mastra usa Zod para las entradas (y salidas opcionales). La ejecución permanece dentro de tu servidor.
import { createTool } from "@mastra/core/tools";
import { z } from "zod";
export const discordNotify = createTool({
id: "discord-notify",
description: "Post a short status message to a Discord webhook channel.",
inputSchema: z.object({
title: z.string(),
body: z.string(),
level: z.enum(["info", "success", "error"]).default("info"),
}),
execute: async ({ context }) => {
// fetch webhook, return { ok: true } / error
return { ok: true, title: context.title };
},
});Regístrala en el agente:
export const assistant = new Agent({
id: "assistant",
name: "Assistant",
// ...
tools: {
discordNotify,
// tinyfishSearch, postTweet, queryDatabase, ...
},
});Por qué es la opción por defecto para agentes en producción
- En proceso: sin IPC, sin un segundo heap de V8, sin un padre
npxhuérfano - Control total sobre validación, reintentos, logging,
requireApprovaly comprobaciones de entorno - Amigable con workflows: extrae
publishTweet()y llámala desde un job programado sin el agente - Despliegues predecibles: las herramientas van con tu bundle; sin sorpresas de
@latestal arrancar
En una app Mastra real terminas con una carpeta de herramientas: búsqueda web, metadatos de YouTube, GitHub, Discord, X/Bluesky, helpers de consulta a la BD, generación de imágenes, etc. Esa es la superficie central. Mantenla nativa.
Patrón de seguridad
Para cualquier cosa que publique o mute sistemas de producción (X, Reddit, Hashnode, escrituras en el CMS), pon requireApproval: true en las herramientas interactivas. Los workflows desatendidos deberían llamar a funciones normales, no a herramientas de agente autoaprobadas.
Cómo funcionan las herramientas MCP en Mastra
MCP (Model Context Protocol) es un estándar para que un host (Mastra) pueda hablar con servidores que exponen herramientas, recursos y prompts. El cliente @mastra/mcp de Mastra puede lanzar un servidor stdio y cargar sus herramientas:
import { MCPClient } from "@mastra/mcp";
const mcpClient = new MCPClient({
id: "mcp-client",
servers: {
sureDash: {
command: "npx",
args: ["-y", "@automattic/mcp-wordpress-remote@latest"],
env: {
WP_API_URL: process.env.WP_API_URL!,
WP_API_USERNAME: process.env.WP_API_USERNAME!,
WP_API_PASSWORD: process.env.WP_API_PASSWORD!,
},
},
},
});
const mcpTools = await mcpClient.listTools();
// Same agent shape as native tools:
// tools: { ...nativeTools, ...mcpTools }Qué se ejecuta realmente
Para un servidor MCP stdio lanzado con npx, el árbol de procesos suele verse así:
mastra node (your app + MCP client)
└── npm exec / npx ← often stays alive (~100+ MB)
└── mcp server node ← second V8 runtime (~80–100+ MB)
└── remote API (WordPress, GitHub, …)El modelo nunca ve eso. Solo ve nombres de herramientas y esquemas. Tú pagas los procesos extra mientras el host de Mastra esté arriba, especialmente si haces listTools() en la importación del módulo y mantienes la conexión abierta.
Por qué MCP sigue existiendo (y es útil)
- Los proveedores entregan paquetes completos de herramientas (entradas, páginas, medios, taxonomías) sin que escribas cada endpoint
- Un protocolo, muchos hosts: el mismo servidor puede funcionar con Claude Desktop, Cursor, Mastra y otros
- Integraciones opcionales: genial cuando necesitas WordPress la semana que viene, no en cada despliegue
MCP no son herramientas peores. Es capacidad alquilada con un impuesto de proceso y protocolo.
Cifras reales de memoria (por qué me importa)
En un servicio Mastra de producción de larga duración medí aproximadamente:
| Componente | Rol | RAM (aprox.) |
|---|---|---|
| Node principal de Mastra | Agentes, memoria, Studio, herramientas nativas | cientos de MB (tamaño de app) |
npm exec (padre npx) |
Lanza el paquete MCP | ~120 MB |
mcp-wordpress-remote |
Servidor MCP stdio (SDK + stack de proxy) | ~96 MB |
Solo ese camino de WordPress eran unos 200 MB siempre activos, antes de cualquier llamada del agente. El pico de memoria del servicio rondaba 1 GB. Tras desactivar MCP con un feature flag, el mismo servicio se estabilizó más cerca de ~450 MB solo con el proceso Node principal.
Eso no es una fuga de WordPress. Es:
- Un segundo servidor Node para MCP stdio
- Un padre
npxque no desaparece - Un paquete proxy pesado (SDK de MCP, stack tipo Express, agentes de proxy, a veces QuickJS para PAC)
- Carga anticipada al arrancar para que las herramientas existan en cada sesión de chat
El disco para la caché de npx de ese paquete era del orden de decenas de MB. La RAM es la parte cara en un VPS pequeño.
Comparación de arquitectura
Native Mastra tool
─────────────────
User → Agent → createTool.execute() → your API/SDK → result
(same process)
MCP tool
────────
User → Agent → MCP client → stdio/HTTP → MCP server process → remote API → result
(your process) (another process)La latencia suele ir bien en ambos casos para el chat humano. El coste en reposo y los modos de fallo no son iguales. MCP añade fallos de arranque (npx, variables de entorno ausentes, 401 remotos) y un proceso que debes monitorizar.
MCP detrás de un feature flag (recomendado)
No dejes servidores MCP opcionales cableados a “credenciales presentes = siempre activo”. Guarda las credenciales en .env y ponles puerta con un flag explícito:
function envFlag(name: string, defaultEnabled = false): boolean {
const raw = process.env[name]?.trim().toLowerCase();
if (raw === undefined || raw === "") return defaultEnabled;
return raw !== "false" && raw !== "0" && raw !== "off" && raw !== "no";
}
const enableWordpressMcp = envFlag("ENABLE_WORDPRESS_MCP", false);
const hasWpCreds = Boolean(
process.env.WP_API_URL &&
process.env.WP_API_USERNAME &&
process.env.WP_API_PASSWORD,
);
if (enableWordpressMcp && hasWpCreds) {
// MCPClient + listTools()
} else {
// log and skip; credentials can stay for later
}# .env
ENABLE_WORDPRESS_MCP=false
WP_API_URL=https://example.com/wp-json/...
WP_API_USERNAME=...
WP_API_PASSWORD=...Actívalo solo cuando necesites las herramientas, recompila si usas un bundle de producción y reinicia el servicio. El mismo patrón funciona para cualquier servidor MCP pesado.
Cuándo usar herramientas Mastra vs MCP
Prefiere herramientas Mastra cuando
- La capacidad es central para el producto (búsqueda, notificaciones, publicación, BD, TTS, imágenes)
- Necesitas aprobación, dry-run o logging estricto
- La herramienta corre en un schedule o workflow sin UI de chat
- Corres en un VPS pequeño y te importa la RAM en reposo
- Solo necesitas 2–3 endpoints de una API de proveedor enorme
Prefiere MCP cuando
- Un proveedor ya entrega un servidor sólido y necesitas muchas herramientas raramente
- Quieres el mismo servidor en Cursor y en tu app Mastra
- La integración es opcional y puede quedarse detrás de un flag
- Aceptas el impuesto de proceso a cambio de llegar antes a las herramientas
Un enfoque híbrido que funciona bien
| Capa | Elección |
|---|---|
| Camino diario (búsqueda, archivos, social, APIs internas) | createTool nativo |
| CMS ocasional / paquetes de terceros | MCP + ENABLE_*=false por defecto |
| Subconjunto caliente de una superficie MCP | Promuévelo a unas pocas herramientas nativas después |
Ejemplo: si solo creas y actualizas entradas, una herramienta Mastra de 40 líneas contra la REST API de WP le ganará a un proceso MCP de WordPress permanente todos los días de la semana.
Un MCP más ligero si decides mantenerlo
Si MCP se queda en el stack:
- Evita
npxde larga duración. Instala el paquete y apuntacommandal binario real o anode path/to/proxy.js - Fija versiones. No uses
@latesten cada arranque - No cargues en la importación a menos que cada petición necesite esas herramientas (un cliente perezoso es más difícil si los agentes necesitan un mapa de herramientas estático, pero merece la pena diseñarlo así)
- Limita la memoria del servicio en systemd (
MemoryHigh/MemoryMax) para que un servidor desbocado no se lleve la máquina - Monitoriza los procesos hijos con
systemctl status/ps --forestpara ver los nodos de npx + MCP
Hoja de trucos para decidir
| Pregunta | Inclínate así |
|---|---|
| ¿Esto correrá cada hora sin supervisión? | Herramienta Mastra / función normal |
| ¿Es un paquete de 50 herramientas de un proveedor que toco una vez al mes? | MCP (con flag) |
| ¿Necesitas aprobación humana antes de efectos secundarios? | Herramienta Mastra |
| ¿Menos de 512 MB de RAM libres? | Herramienta Mastra primero |
| ¿Construyes una vez para Cursor + Mastra + Claude? | Servidor MCP |
Preguntas frecuentes
¿Prefieren los agentes MCP a las herramientas nativas?
No. El modelo solo ve nombre, descripción y esquema. La calidad de la descripción y la fiabilidad de la herramienta importan más que el transporte. Las herramientas nativas suelen ganar porque controlas los mensajes de error y los argumentos.
¿Es Composio lo mismo que MCP?
No exactamente. Composio (y routers similares) importan herramientas vía su SDK/API. También son herramientas externas, pero normalmente no un proceso Node stdio local. En cuanto a procesos se parecen más a una integración HTTP que a npx mcp-wordpress-remote.
¿Puedo mezclar ambas en un mismo agente?
Sí. Reparte las herramientas nativas y las MCP en el mismo objeto tools. Solo mantén el lado MCP opcional para que un arranque fallido de MCP no tumbe toda la app.
¿Debería cada integración convertirse en un servidor MCP?
No. MCP brilla cuando compartes una superficie de herramientas entre hosts o entregas un servidor productizado. Dentro de una app Mastra, createTool es más simple, más barato y más fácil de asegurar.
Conclusión
Las herramientas Mastra son tu contrato en proceso: rápidas, baratas, amigables con aprobaciones y listas para workflows. Las herramientas MCP son una forma estándar de alquilar la superficie de herramientas de otro. Potentes, pero los servidores stdio (especialmente vía npx) cuestan RAM real y atención operativa.
La regla que uso ahora:
- Capacidades centrales del agente → herramientas Mastra nativas
- Paquetes opcionales de proveedores → MCP detrás de un feature flag
- Si un servidor MCP se vuelve crítico a diario → promueve el camino caliente a herramientas nativas
Esa división mantuvo la superficie del agente rica sin pagar ~200 MB para siempre por herramientas de WordPress que no estaba usando activamente.
Tutorial de agentes Mastra Introducción a MCP

