Sección 08
Certificación
Esta página lista las comprobaciones que su servidor debe pasar antes de entrar en producción y en qué orden ocurre cada fase. No revisamos su código: usted registra el servidor, lo evaluamos contra esta lista y recibe el mismo informe que vemos nosotros.
Qué mide la batería hoy, y qué revisamos con su equipo. De las 34 comprobaciones, 12 las mide la batería automática en cada corrida y 22 las verificamos junto a su equipo durante la incorporación —19 de ellas bloqueantes—. La columna «Cómo se comprueba» de cada tabla lo dice fila por fila, y su informe también: una fila con «Todavía no automatizada» no es un defecto suyo ni algo que cambie por repetir la corrida.
Consecuencia práctica, dicha sin rodeos: el sello «Apta para producción» exige las 34, así que hoy no se alcanza solo lanzando corridas. Lo que usted puede cerrar por su cuenta es «Batería automática superada», y es lo que la aplicación le muestra como objetivo. La lista de abajo no cambia por eso: es el criterio de aceptación completo, y conviene que la use como su propia lista de pruebas desde el primer día.
Fases
| # | Fase | Qué ocurre |
|---|---|---|
| 1 | Registro | Da de alta en la aplicación cuatro datos: la URL de producción, la URL de su entorno de pruebas, la credencial que su servidor de pruebas espera y un contacto técnico. La era de protocolo no se declara: al registrar hablamos con su entorno de pruebas y la detectamos nosotros (página 09). Por eso el registro tiene una precondición: su entorno de pruebas tiene que estar desplegado y respondiendo en ese momento. Si no acordamos revisión con él, el alta se rechaza diciéndole qué anunció y qué desplegar; si el que falla es nuestro lado, se lo decimos con esas palabras y basta reintentar. Por lo demás no se declaran endpoints ni esquemas, y el catálogo no se configura en ningún panel: cada herramienta llega ya clasificada por el _meta de su definición (página 02). |
| 2 | Certificación | La batería corre de inmediato contra su entorno de pruebas y devuelve un informe con las 34 filas: las que aprueba, las que falla, las que no pudo medir y las que verificamos con su equipo. Sin aprobación no hay activación. |
| 3 | Publicación del catálogo | Usted ordena publicar y leemos tools/list de su servidor en el entorno que elija: sus herramientas quedan disponibles para el agente. Certificar no publica: son dos actos, para que usted decida cuándo la versión que sirve su servidor pasa a usarse. Las que no se admitan vienen enumeradas con su motivo y no impiden publicar el resto. |
| 4 | Conversaciones de prueba | Prueba a su agente, con sus herramientas, sin tráfico de clientes finales y con una clave ak_test_: por chat en el Playground de la consola y por voz llamando a sus números de prueba verificados (página 14). Se cobra como cualquier consumo (página 12). |
| 5 | Activación | Se enciende escenario por escenario, con su nivel y sus interruptores por acción. Usted decide alcance y canales. |
| 6 | Vigilancia | La batería se repite de forma periódica y ante cada cambio de catálogo; una regresión desactiva la capacidad. Es la última pieza en entrar: hasta entonces, la vigilancia es por monitoreo de errores y aviso a su equipo. |
Las comprobaciones que escriben se ejecutan solo contra el entorno de pruebas declarado. La batería nunca escribe en su producción.
Verifíquelo usted antes de avisarnos
La mayor parte de esta lista se comprueba sola. El servidor de referencia trae el verificador como comando y corre contra cualquier servidor MCP, no solo contra él:
git clone https://github.com/AndresTorresCode/asixto-mcp-reference
cd asixto-mcp-reference && npm install
node scripts/conformance.mjs https://su-entorno-de-pruebas/mcp SU-TOKEN --allow-writesSale con código 1 si falla una comprobación bloqueante, así que sirve en su pipeline. Imprime además la era de protocolo detectada: ya no hay que copiárnosla —la detectamos nosotros al registrar—, pero verla antes le confirma que su entorno de pruebas acuerda revisión y que el alta va a pasar.
Es de solo lectura por omisión. La comprobación de idempotencia es la única que ejecuta una
herramienta de escritura —dos veces, con la misma clave— y solo corre con --allow-writes. Sin la
bandera, «0 bloqueantes» no significa que la idempotencia esté verificada, y el veredicto se lo
dice con esas palabras. Por eso el comando de arriba apunta a su entorno de pruebas.
Lo que el verificador no cubre: latencia bajo carga, propiedad del registro con datos reales, estados terminales y los campos mínimos por dominio de la página 04. Esas cuatro tampoco las mide la batería automática todavía —salen en su informe como «Todavía no automatizada»—: las revisamos con su equipo con datos suyos, que es la única forma de comprobarlas sin escribir en su producción.
Comprobaciones
Bloqueante impide la activación. Aviso queda en el informe y no bloquea.
Cómo leer su informe. Cada fila sale con uno de cuatro resultados, y cada uno dice de quién es la siguiente acción:
| Resultado | Qué significa | Qué hace usted |
|---|---|---|
| Cumplida | La batería la midió y su servidor la pasa | Nada |
| Fallida (bloqueante) | La batería la midió y su servidor no la pasa. El detalle trae qué corregir | Corregir y volver a lanzar |
| Recomendación (aviso) | La midió y su servidor no la cumple, pero no bloquea: ni la certificación ni la activación | Nada obligatorio. Puede dejarlo como está |
| No observada | La batería no llegó a un veredicto. El detalle dice de quién es el motivo, porque hay dos: un fallo de nuestro lado (no pudimos leer su catálogo, no llegamos a ejercer una herramienta) o una respuesta suya que no sirve para comparar (su servidor rechazó los argumentos de prueba, o no devolvió resultado) | Si el motivo es nuestro, volver a lanzar en unos minutos y, si persiste, avisarnos. Si su servidor rechazó los argumentos de prueba, relanzar da lo mismo: el detalle trae su propio mensaje de error, y se corrige en su esquema o en su validación de pruebas |
| Todavía no automatizada | La batería no ejecuta esta comprobación: la revisamos con su equipo | Nada en la aplicación. Puede adelantarla con el verificador público cuando la cubra |
| No aplica | Su catálogo no expone el sujeto que la comprobación necesita: sin una herramienta que CREE una entidad del dominio no hay nada que llevar a estado terminal ni cuya propiedad se pueda probar. No es una deficiencia y no bloquea la aptitud | Nada. Si más adelante publica esa herramienta, la fila se mide sola en la siguiente corrida |
Si su servidor no responde, responde con un estado inservible, rechaza la credencial del alta o devuelve algo que no es un sobre JSON-RPC, eso sí sale como fallida y con instrucciones: que responda —aunque responda mal— nos permite decirle exactamente qué arreglar.
Protocolo y transporte
| Comprobación | Criterio | Severidad | Cómo se comprueba |
|---|---|---|---|
| Era de protocolo coherente | server/discover anuncia supportedVersions con 2026-07-28 (era modern) o el servidor responde al saludo initialize con una revisión que soporta (era legacy). Las dos se admiten y la era la DETECTAMOS al dar de alta contra su entorno de pruebas (fase 1), así que aquí ya llega medida; lo que bloquea es ninguna de las dos (página 09) | Bloqueante | Automática |
| Era recomendada | La era es modern. Un servidor de revisión anterior se certifica igual y puede quedarse así: migrar es opcional | Aviso | Automática |
| Catálogo válido | Todos los esquemas compilan y los nombres son únicos | Bloqueante | Automática |
| Esquemas cerrados | additionalProperties: false | Bloqueante | Automática |
| Opcionales nullable | Todo parámetro fuera de required admite null | Bloqueante | Automática |
required mínimo | Sin campos exigidos que su sistema pueda resolver por defecto | Aviso | Con su equipo |
| Nombres y longitudes | Nombre ≤ 40 y ^[a-z0-9_]+$; description ≤ 700 | Bloqueante | Automática |
| Una operación por herramienta | Sin parámetro que multiplexe acciones. La batería refuta un caso concluyente: un parámetro cuyo enum deja elegir entre un método HTTP de lectura (GET, HEAD, OPTIONS) y uno que escribe (POST, PUT, PATCH, DELETE) no es una operación, es un proxy con interruptor. El resto —distinguir un enum de modos legítimos de un multiplexor de acciones— lo revisamos con su equipo | Bloqueante | Con su equipo |
| Rechazo de entrada inválida | Fuera de esquema: error de contrato del SDK. Dentro de esquema pero inválida para el negocio: error_type: "VALIDATION". En ningún caso un fallo del servidor | Bloqueante | Con su equipo |
| Anotaciones coherentes | Una escritura no se declara de solo lectura. Que estén declaradas lo comprueba la batería; que sean ciertas exige ejecutar la herramienta | Bloqueante | Con su equipo |
| Clasificación presente | Cada herramienta trae com.asixto/capability (o capabilities en plural) con claves válidas, y com.asixto/verb | Bloqueante | Automática |
| Campos mínimos por dominio | La respuesta trae lo exigido en la página 04 | Bloqueante | Con su equipo |
| Orden estable del catálogo | Dos consultas, mismo orden | Aviso | Automática |
| Descripciones limpias | Sin instrucciones dirigidas al modelo («llama siempre a esta herramienta»), sin system prompt y sin bloques que parezcan texto codificado. Es estilo, y por eso es aviso y no bloqueante: sesga la elección del modelo y el precio lo paga usted. system prompt está aquí y no en la fila bloqueante a propósito — si su producto es un asistente, documentarlo es legítimo | Aviso | Automática |
| Descripciones sin inyección | Ningún texto de la herramienta intenta gobernar al modelo: sin «ignora las instrucciones anteriores», sin pedirle que no use otras herramientas, sin marcas de rol (<system>, [INST]) y sin caracteres invisibles (ancho cero, control de dirección, etiquetas U+E0000). Se revisa la descripción y los textos de su inputSchema —description, title, $comment de cada campo—, porque el modelo los lee igual. La comparación normaliza el texto, así que escribirlo en ancho completo o con doble espacio no lo esquiva. Estos textos viajan a nuestro modelo en el mismo contexto que las instrucciones de la empresa, así que no es una recomendación de estilo: una herramienta que lo incumpla tampoco se publica (página 02) | Bloqueante | Automática |
| Entorno de pruebas del mismo servicio | La URL de pruebas y la de producción comparten dominio. Un dominio distinto no bloquea nada y puede ser lo correcto: solo le avisamos, con los dos hosts, para que compruebe que esa URL es su servidor MCP de pruebas y no otro servicio suyo — la batería certifica lo que responda ahí | Aviso | Automática |
Autenticación
| Comprobación | Criterio | Severidad | Cómo se comprueba |
|---|---|---|---|
| Sin credencial | 401 con WWW-Authenticate | Bloqueante | Con su equipo |
| Credencial inválida o caducada | 401, no 500 | Bloqueante | Con su equipo |
| Audiencia ajena | Rechazada | Bloqueante | Con su equipo |
| Metadatos de recurso protegido (RFC 9728) | Publicados y coherentes. Aviso porque el nivel 2 (token rotable) no los requiere | Aviso | Con su equipo |
| TLS | Certificado válido y vigente | Bloqueante | Con su equipo |
Garantías de negocio
| Comprobación | Criterio | Severidad | Cómo se comprueba |
|---|---|---|---|
| Idempotencia | Misma clave de _meta dos veces, un solo efecto. Se ejerce cada herramienta de escritura de su catálogo, y solo contra su entorno de pruebas. Una que no la honre queda además marcada no apta para regla determinista. Los argumentos los derivamos de su inputSchema, y solo los required: un enum toma su primera opción, un número su minimum (o 1), un booleano false y un texto la letra X repetida hasta su minLength (mínimo 6). Si su entorno de pruebas exige que esos valores existan de verdad —el id de un préstamo, de una llamada— la rechazará, y la fila sale no observada con el mensaje de error de su servidor, no aprobada ni fallida | Bloqueante | Automática |
| Propiedad del registro | Identificador ajeno → PERMISSION | Bloqueante | Con su equipo |
| Estado terminal | Transición inválida → VALIDATION con el estado actual | Bloqueante | Con su equipo |
| Dato crítico | Franja ocupada y monto alterado rechazados | Bloqueante | Con su equipo |
| Fuga de datos | Sin identificadores internos, datos de terceros ni trazas | Bloqueante | Con su equipo |
| Forma del error | error_type de los seis canónicos + user_message | Bloqueante | Con su equipo |
| Sin resultados = éxito | Búsqueda vacía devuelve lista vacía y total: 0, no error | Bloqueante | Con su equipo |
| Vacío vs caído vs inexistente | Tres respuestas distinguibles | Bloqueante | Con su equipo |
Rendimiento
| Comprobación | Criterio | Severidad | Cómo se comprueba |
|---|---|---|---|
| Latencia p95 | ≤ 2 s sobre la muestra de la batería | Aviso | Con su equipo |
| Tiempo de espera | Ninguna llamada supera 30 s | Bloqueante | Con su equipo |
| Tamaño de respuesta | ≤ 3.000 caracteres | Bloqueante | Con su equipo |
| Paginación | Búsquedas con limit, offset y total, respetando el limit recibido | Bloqueante | Con su equipo |
| Forma para voz | Sin URLs ni correos; ≤ 3 elementos; fecha ISO + pronunciable | Bloqueante | Con su equipo |
Autoevaluación previa
Antes de registrar, verifique por su cuenta. Ahorra una vuelta completa:
- Cada herramienta probada con el Inspector y con un test automatizado.
- Esquemas cerrados en todas.
- 401 correcto sin credencial y con credencial inválida.
- Todo parámetro opcional acepta
nullen sutype. - Escritura invocada dos veces con la misma clave de
_meta: un solo efecto. - Escritura invocada con un identificador de otro contacto:
PERMISSION. - Operación sobre una entidad en estado terminal:
VALIDATION. - Búsqueda sin resultados: éxito con lista vacía y
total: 0, noerror. - Respuestas revisadas a ojo: sin identificadores internos ni campos administrativos, ≤ 3.000 caracteres.
- Solo los seis
error_typede la página 06. - Búsquedas respetan el
limitrecibido y devuelventotal,limityoffset. - Nombres ≤ 40 caracteres y descripciones ≤ 700.
- Cada herramienta declara
readOnlyHintcon un booleano. Sin él no se publica: no podemos saber si escribe. - Ninguna descripción da instrucciones al modelo ni trae caracteres invisibles.
- Ninguna herramienta deja elegir el método HTTP: una de lectura y una por cada acción que escribe.
- Cada herramienta declara
com.asixto/capabilityocapabilities(claves válidas) ycom.asixto/verb. - Cada dominio devuelve sus campos mínimos (página 04).
- Ningún token en sus logs.
Requisitos que no se verifican desde fuera
Estos no aparecen arriba porque ninguna batería puede comprobarlos desde el exterior de su sistema. Forman parte del criterio de aceptación igualmente, y se declaran en el registro:
| Requisito | Página | Por qué no es verificable desde fuera |
|---|---|---|
| TTL ≥ 7 días y escritura atómica del almacén de idempotencia | 05 | La batería solo observa dos llamadas seguidas; no ve su almacén ni espera una semana. |
| Consultar la clave de idempotencia antes de las guardas | 05 | Desde fuera, el orden correcto y el incorrecto se parecen hasta que ocurre un reintento real sobre una entidad ya modificada. |
| Guardar solo los éxitos | 05 | Requiere provocar un fallo transitorio en su dependencia. |
| Rotación con dos credenciales activas | 03 | Es un procedimiento operativo suyo. |
| Límites propios por credencial y comprobación de salud | 07 | Se verifican en la incorporación, no en cada ejecución. |
| Disponibilidad ≥ 99,5% | 07 | Se mide en producción a lo largo del mes, no en una batería. |
| No exponer borrado duro ni campos que el titular no deba cambiar | 04 · 02 | Se revisa al leer su catálogo, que es la única parte donde interviene una persona. |
Dicho de otro modo: la batería comprueba la forma; lo de esta tabla es compromiso, y es lo que se revisa si algún día hay un incidente.
Qué certifica Asixto y qué no
La certificación verifica que su servidor cumple este contrato, observado desde fuera: transporte, autenticación, garantías de negocio y rendimiento. Es determinista y repetible, y por eso puede correr sin que nadie lea su código.
Lo que no es: una auditoría de su código, de su infraestructura o de sus datos, ni un sustituto de sus propios controles. La operación, la disponibilidad, la seguridad y el comportamiento de su servidor —y de los sistemas que hay detrás— son suyos. Asixto ejecuta la batería, le entrega el resultado por comprobación y suspende un escenario cuando el servidor deja de responder (página 10); no administra ni supervisa su servidor.
Un resultado aprobado significa que el contrato se cumple en el momento de la ejecución. No es una garantía sobre el contenido de sus respuestas: los datos que devuelve son suyos y el agente los traslada al cliente final tal como los recibe (página 05).
Recertificación
| Cambio | Requiere |
|---|---|
| Herramienta nueva | Certificación de esa herramienta |
| Cambio de esquema de una herramienta existente | Recertificación de esa herramienta |
| Renombrar una herramienta | Certificación como nueva; la anterior se retira |
| Cambio de credencial o de URL | Nueva verificación de autenticación |
| Cambio interno sin efecto en el contrato | Nada. La vigilancia periódica lo cubre |