# Qué detecta y qué no

> Qué texto revisa MCP Shield, sus detectores de inyección de instrucciones y patrones DLP, y qué pasa sin revisar.

MCP Shield revisa el texto con patrones deterministas. Esta página dice exactamente qué texto, con qué detectores y qué pasa sin que nadie lo mire.

## Qué texto se revisa

| Dirección | Ajuste | Texto |
|---|---|---|
| Del cliente al servidor | `inspect_requests` | `params.arguments` de `tools/call`, los `params` de `resources/read`, `params.arguments` de `prompts/get` |
| Del servidor al cliente | `inspect_responses` | Todas las cadenas de `result` y de `error` de las respuestas del servidor a peticiones con id (resultados de herramientas, contenido de recursos, prompts y las descripciones de herramientas de `tools/list`), y los `params` de las peticiones que el servidor manda al cliente (`sampling/createMessage`, `elicitation/create`) |

Las respuestas JSON se leen enteras, hasta 2 MiB. Los flujos de eventos del servidor (`text/event-stream`, de un `POST` o del flujo `GET`) se revisan evento a evento según llegan; cada evento se reenvía en cuanto está revisado, así que el streaming y el vaciado del búfer siguen funcionando.

## Inyección de instrucciones y exfiltración

Los mismos 27 detectores que protegen los endpoints de IA, en inglés y en español. Cada uno solo se ejecuta si aparece alguna de sus palabras clave en el texto, así que el tráfico normal se salta casi todos. Sus ids empiezan por:

- `pi.`: anulación de instrucciones, extracción del prompt de sistema, personajes y modos de jailbreak, avisos de sistema o de cumplimiento falsos, órdenes de ocultar algo al usuario, tokens de plantilla de chat, llamadas, resultados de herramientas y turnos de conversación falsificados, envenenamiento de memoria, órdenes de llamar a una herramienta, saltarse la aprobación, e instrucciones dentro de comentarios HTML, en base64 o codificadas por porcentaje o en hexadecimal.
- `agent.`: órdenes destructivas como `rm -rf /` o `DROP TABLE`.
- `exfil.`: scripts remotos pasados a una shell, recolección de secretos, envío de datos del equipo, exfiltración por una imagen o un enlace renderizados.
- `hidden.`: texto escondido a quien lee: caracteres de ancho cero, caracteres de etiqueta Unicode, texto oculto con CSS.

## Fugas de credenciales (DLP)

| Id | Qué encuentra |
|---|---|
| `dlp.aws_access_key` | Ids de clave de acceso de AWS (`AKIA…`) |
| `dlp.github_token` | Tokens personales y de servidor de GitHub (`ghp_…`, `ghs_…`) |
| `dlp.stripe_secret_key`, `dlp.stripe_test_key` | Claves secretas de Stripe (`sk_live_…`, `sk_test_…`) |
| `dlp.private_key` | Cabeceras de clave privada PEM |
| `dlp.database_url` | URL de conexión de PostgreSQL, MySQL y MongoDB |
| `dlp.slack_token` | Tokens de Slack (`xox…`) |
| `dlp.sendgrid_key`, `dlp.mailgun_key` | Claves de SendGrid y Mailgun |
| `dlp.openai_key`, `dlp.anthropic_key` | Claves de proyecto, de cuenta de servicio y de administración de OpenAI, claves de Anthropic (`sk-ant-…`) |
| `dlp.openwaf_token`, `dlp.openwaf_egress_token` | Tokens de API de OpenWAF (`owf_…`) y marcadores de OpenWAF Egress (`OWE_TOKEN_…`) |
| `dlp.generic_api_secret` | Un valor entre comillas de 20 caracteres o más asignado a `api_secret` o `secret_key` |

Un hallazgo DLP se guarda redactado: solo sus cuatro primeros caracteres seguidos de `…`. El secreto nunca llega a los eventos, al panel ni a la API.

## Comprobaciones de política

Además de la revisión, cada mensaje JSON-RPC del cliente se compara con la política del endpoint. Sus ids de detección son `mcp.method_not_allowed`, `mcp.tool_denied`, `mcp.tool_not_allowed`, `mcp.rate_limited`, `mcp.parse_error`, `mcp.invalid_request` y `mcp.too_large`.

## Qué no se detecta

- **Lo que ningún patrón describe.** No hay clasificador semántico ni modelo de lenguaje. Las instrucciones parafraseadas, otros idiomas y las codificaciones que los detectores no cubren pasan. Un resultado limpio no demuestra que un mensaje sea seguro.
- **Las notificaciones.** Su contenido no se revisa, en ninguna dirección. Las del cliente sí pasan por los métodos permitidos.
- **Las peticiones del servidor al cliente** (`sampling/createMessage`, `elicitation/create`) se revisan pero solo se anotan; nunca se sustituyen.
- **Las respuestas del cliente** a esas peticiones no se revisan.
- **Respuestas grandes o codificadas.** Una respuesta JSON de más de 2 MiB, un evento SSE de más de 2 MiB y una respuesta que sigue llegando comprimida (`Content-Encoding`) pasan sin cambios. El informe las cuenta como **sin revisar**.
- **Peticiones grandes en modo registro.** Un cuerpo de más de `max_request_kb` pasa sin revisar en modo registro; en modo aplicar se rechaza.
- **Los parámetros de otros métodos.** `completion/complete`, `logging/setLevel`, los métodos de listado y el resto solo se comparan con los métodos permitidos.
- **Recursos y prompts por nombre.** Las listas de herramientas solo valen para `tools/call`; no hay lista de URI de recursos ni de nombres de prompt.
- **Cabeceras y query string.**
- **Autenticación.** MCP Shield nunca valida el token; lo hace tu servidor.

## Falsos positivos

Una herramienta que devuelve material de seguridad, como registros de ataques bloqueados, una página sobre inyección de instrucciones o un `.env` de ejemplo, disparará detecciones con contenido legítimo. Por eso la revisión empieza en `log`: lee primero los ids y los fragmentos de las detecciones en los eventos, y deja `block` para los endpoints en los que un resultado sustituido es aceptable.
