MCP outputSchema y structuredContent: contratos de salida para agentes que sí se pueden validar
MCP ya no debería tratar los resultados de tools como texto libre. outputSchema y structuredContent permiten contratos validables, menos parsing frágil y mejores guardrails para agentes.
MCP ya no debería tratar los resultados de tools como texto libre. outputSchema y structuredContent permiten contratos validables, menos parsing frágil y mejores guardrails para agentes.
La actualización 2025-06-18 de Model Context Protocol añadió una pieza menos vistosa que OAuth, pero muy práctica para equipos que construyen agentes: `outputSchema` y `structuredContent` para resultados de herramientas. En vez de devolver solo texto que luego el modelo debe interpretar, un servidor MCP puede declarar qué forma tendrá la salida y devolver JSON validable.
El cambio convierte muchas integraciones MCP en APIs de verdad. La descripción de la tool sigue ayudando al modelo a decidir cuándo usarla; el schema ayuda al runtime a comprobar si el resultado sirve.
Por qué no basta con buen prompting
Un prompt puede pedir 'devuelve JSON válido', pero eso no es un contrato fuerte. El modelo o la tool pueden incluir texto adicional, omitir campos, cambiar nombres o colar un error en un campo que el consumidor interpreta como dato. En una demo funciona; en producción crea ramas falsas de ejecución.
`outputSchema` mueve la expectativa al borde de la tool. Si `search_docs` promete una lista de documentos con `id`, `title`, `url`, `score` y `snippet`, el cliente puede rechazar respuestas incompletas, marcar la ejecución como degradada o pedir aprobación humana antes de continuar.
La diferencia para un agente de código es concreta: no es lo mismo leer 'encontré tres archivos importantes' que recibir un array validado de rutas, rangos, hashes y motivos. Lo segundo puede alimentar un diff, una revisión o una métrica sin depender de parsing frágil.
Checklist
Resource links frente a blobs
MCP permite que una tool devuelva `resource_link` para apuntar a recursos que el cliente puede obtener o suscribirse después. Esto es mejor que incrustar siempre blobs largos en el resultado: el agente recibe una referencia con URI, nombre, descripción, MIME type y anotaciones, y decide si necesita cargar más contexto.
Para repositorios, esto encaja bien con resultados como archivos candidatos, logs de CI, trazas, documentos recuperados o reportes generados. El resultado estructurado puede contener ranking y metadatos; el resource link preserva el artefacto completo sin llenar el contexto inicial.
El patrón saludable es devolver índice primero y contenido después. Si el agente necesita todo, lo pedirá. Si solo necesita decidir el siguiente paso, no pagas tokens por material que no se usa.
Validación en el cliente
La especificación dice que los servidores deben cumplir su schema y que los clientes deberían validar resultados estructurados. En una arquitectura seria, ambos lados hacen su parte: el servidor valida antes de responder y el cliente valida antes de confiar.
Puntos a revisar
Lo que conviene comprobar
No pases `structuredContent` sin validar directamente a un pipeline que ejecuta acciones. Valida tipo, campos requeridos, longitudes, enumeraciones y límites numéricos. Si usas TypeScript, trata el valor como `unknown` hasta que pase por un parser o guardia de tipos. Si usas Python, valida con JSON Schema o modelos tipados antes de convertirlo en decisiones.
La validación también debe limitar coste: número máximo de items, tamaño máximo de snippets, URLs permitidas, MIME types aceptados y timeout por tool. Un schema correcto pero enorme puede ser igual de dañino para un agente que una respuesta inválida.
Errores como datos de control
La especificación distingue errores de protocolo JSON-RPC de errores de ejecución de la tool con `isError: true`. Esa distinción importa. Un nombre de tool desconocido o argumentos inválidos son problemas de protocolo; un 429 del upstream, una credencial caducada o una búsqueda sin resultados son estados operativos que el agente puede manejar.
Diseña errores recuperables con estructura: `code`, `retryAfterSeconds`, `safeToRetry`, `userActionRequired`, `detailsForLog` y `messageForModel`. El modelo no necesita ver todo el stack trace, pero sí necesita saber si debe reintentar, pedir permisos, reducir scope o parar.
Un agente que distingue `permission_denied` de `not_found` toma mejores decisiones. Un agente que solo recibe 'failed' tiende a repetir llamadas o inventar alternativas.
El objetivo no es describir todo el sistema al modelo. Es darle contratos pequeños, verificables y suficientes para avanzar.
Checklist de implementación
- Declara `outputSchema` en toda tool que alimente automatización.
- Devuelve `structuredContent` y un `TextContent` serializado para compatibilidad.
- Valida la salida en servidor antes de responder.
- Valida la salida en cliente antes de pasarla al modelo o ejecutar acciones.
- Separa datos, errores recuperables y errores de protocolo.
- Usa `resource_link` para artefactos grandes en vez de meter blobs en el resultado.
- Limita número de items, tamaños, URLs y MIME types.
- No confíes en anotaciones de tools desde servidores no verificados.
- Mide tokens consumidos por schemas y herramientas activas.
- Documenta qué campos son evidencia y cuáles son interpretación.
Checklist
Conclusión
MCP está creciendo como capa de integración para agentes, pero la fiabilidad no aparece por instalar más servidores. Aparece cuando cada tool tiene un contrato pequeño, validable y auditable.
Si hoy construyes servidores MCP, añade `outputSchema` pronto. Si consumes servidores MCP, valida `structuredContent` y trata texto libre como explicación, no como API. La diferencia parece menor hasta que un agente encadena tres tools y una respuesta ambigua se convierte en un PR incorrecto, una métrica falsa o una acción con permisos.
Fuentes y referencias
También te puede interesar
MCP en producción: seguridad y permisosReal-time chunking para RAG y agentesMétricas para agentes de códigoCopilot coding agent: MCP y hooksAWS Agent Toolkit y MCP ServerRecibe una lectura semanal de herramientas IA para devs
Cada martes: Claude Code, Cursor, Copilot, MCP, agentes y herramientas nuevas. En español y sin ruido.
Suscribirme gratis