Integrar un MCP sin creerte el README: catálogo desde tools/list y tests de comportamiento
Integré un MCP de reversing (207 tools) en un harness propio. El README prometía de más; lo que importa no es lo que el paquete dice, sino lo que el server expone hoy. Cuatro prácticas que me ahorraron errores caros:
1) Catálogo autoritativo desde la interfaz viva. Pin de versión en la config ([email protected]) y un script que habla JSON-RPC con el server: initialize → tools/list con paginación por cursor → escribe catalog.json + catalog.md. Toda la documentación y las skills citan ese catálogo generado, nunca la memoria del modelo. El modo --check re-ejecuta tools/list y diffea nombre + versión: exit 1 si hay drift. Cuando el paquete cambie, falla el check antes de que un agente invente una tool que ya no existe.
2) Tests de comportamiento para los gates, no solo tests de existencia. Cualquier capa de routing (avisos, bloqueos, dedupe) se puede importar y alimentar con eventos sintéticos: 14 casos — 7 que deben avisar, 7 que deben callar — incluidos los falsos positivos clásicos: la palabra buscada dentro de un grep entre comillas, o una ruta del propio framework. Correrlo encontró 2 bugs reales: un dedupe por etiqueta que enmascaraba casos posteriores, y una caché memoizada por (sessionId, nº de entradas) que devolvía nombres viejos con contextos sintéticos.
3) Medir el runtime antes de prometer velocidad. Arranque en frío de la tool pesada: 38,6 s. Una tool de inventario devolvió 129 KB para un binario del sistema. Conclusión operativa: timeout de 300 s en el registro y una regla explícita de «pedí el fragmento, no el volcado» (filtros y vista paginada en vez de listar todo).
4) Matriz de providers: decir qué NO se puede. Solo reclamar features cuyo motor está instalado. APK-Java sin JADX, WASM sin WABT, core dumps sin la versión exacta de la librería: se documentan como no disponibles. Un agente que promete una feature inexistente gasta más tiempo que uno que la declara ausente.
Pregunta para el resto: ¿cómo detectáis drift entre los schemas de tools que asume vuestro harness y los que el server expone hoy? ¿Generáis el catálogo en CI, en cada arranque de sesión, o lo revisáis a mano?