Assay

El cortafuegos para llamadas de herramientas MCP. Bloquea llamadas inseguras, audita cada decisión, reproduce cualquier cosa. Aplicación de políticas determinista con paquetes de evidencia reproducibles.

Documentación

Assay

El perfil de evidencia abierto y recomputable para acciones privilegiadas de herramientas MCP.
Assay registra qué decidió una llamada de herramienta privilegiada, qué se observó y qué permanece sin probar, para que un revisor pueda reproducir la afirmación fuera de línea en lugar de confiar en el relato del agente sobre sí mismo. La aplicación es determinista y de cierre ante fallos, y el proxy que la aplica es el productor de referencia, no el contrato en sí. La instrumentación opcional eBPF/LSM en hosts Linux compatibles añade observaciones a nivel de kernel. Nativo para CI, sin backend, acotado por diseño.

Crates.io CI License

Inicio rápido · Cómo funciona · Verlo en acción · Ejemplo MCP · OWASP MCP Top 10 · Discusiones


Los agentes obtuvieron acceso real a herramientas a través de MCP — y con ello llegaron el envenenamiento de herramientas, los tirón de alfombra y el OAuth de diputado confundido. Assay se sitúa en el límite de la llamada a herramientas y hace tres cosas, en orden.

Un camino dorado: el recorrido del agente fijado a una versión registra los nueve pasos CLI/MCP dirigidos y sus contratos de salida/stdout. Su fixture de acción protegida vive en examples/privileged-action-gate/.

Aplicar, probar, mantenerse honesto

  • Aplicar. En modo de aplicación, la puerta decide tools/call solicitudes enrutadas a través de ella antes de reenviarlas, con la razón precisa de cada permiso o denegación. En Linux añade aplicación real a nivel de kernel — un bloqueo de salida de conexión IPv4/TCP eBPF/LSM y una lista de permitidos de puerto de conexión TCP Landlock, ambos opt-in y de cierre ante fallos. Una política que no puede expresar exactamente es rechazada, nunca aplicada a medias.
  • Probar. Los productores configurados pueden registrar decisiones y observaciones acotadas para exportarlas en paquetes de evidencia verificables fuera de línea y a prueba de manipulación. El flujo de acción privilegiada lleva el veredicto, el recorrido de establecimiento previo a la llamada y la conformidad declarada vs. observada para revisión en CI sin un backend alojado. assay mcp wrap básico no crea automáticamente un paquete; habilite los pasos de registro y exportación requeridos.
  • Mantenerse honesto. La Base de Confianza clasifica las afirmaciones admitidas como verified, self_reported, inferred o absent; sus puertas verifican los límites de afirmación declarados. Una herramienta que devuelve "éxito" es la aserción del proveedor, nunca una prueba. Assay no incluye una puntuación de seguridad única; lea la fuente, la cobertura y las no-afirmaciones de cada artefacto antes de confiar en él.

Inicio rápido

# Fast path: release installer for Linux and macOS.
curl -fsSL https://getassay.dev/install.sh | sh

# Confirm the command resolves; if setup fails, run `assay doctor`.
assay --version

# Source-build alternative (requires Rust):
cargo install assay-cli --version 6.9.0 --locked

python3 examples/mcp-quickstart/run.py

Para v6.9.0, ejecute el último comando desde un checkout de la fuente o un archivo CLI publicado extraído. El instalador es solo binario y no incluye los activos acotados de inicio rápido. El instalador en vivo getassay.dev verifica el archivo seleccionado contra su sidecar SHA-256 publicado antes de la extracción. Establezca ASSAY_REQUIRE_PROVENANCE=1 para requerir adicionalmente procedencia de artefactos de GitHub; el valor predeterminado informa provenance_not_requested y el éxito estricto informa provenance_verified. Una suma de verificación prueba la igualdad de bytes con el sidecar publicado, no la identidad del productor. La procedencia identifica la fuente y la compilación, no la seguridad en tiempo de ejecución ni la corrección semántica.

Salida capturada del runner (el mock local incluido no realiza ninguna acción externa):

assay quickstart: PASS
mcp_requests=initialize,tools/list,tools/call
decision=allow tool=read_file
decision_artifact=.assay/quickstart/decisions.ndjson
non_claim=forwarded_to_local_mock_only

Assay decides each MCP tool call before it runs, fail-closed, with the reason

Superficies publicadas:

  • Los manifiestos de proyecto estáticos se envían para Claude Code y Cursor; Codex usa la entrada TOML equivalente documentada en la receta MCP para editores. La presencia del manifiesto no es prueba de descubrimiento de host. assay mcp config-path admite solo Claude Desktop y Cursor.
  • Los archivos CLI publicados de v6.9.0 cubren Linux x86_64/arm64, macOS x86_64/arm64 y Windows x86_64. Las ruedas de Python cubren CPython 3.12, 3.13 y 3.14 en macOS x86_64/arm64 y Linux x86_64; otros intérpretes y plataformas no están reclamados.
  • Los archivos assay-mcp-server publicados cubren Linux x86_64/arm64. También se publican descriptores de paquetes MCPB y server.json; su presencia no es prueba de descubrimiento de host.
  • CI: Acción de GitHub. Los flujos principales no necesitan backend alojado ni clave API. ¿Nuevo en el modelo de amenazas? El mapeo OWASP MCP Top 10 indica, por riesgo, qué cubre Assay y qué deliberadamente no.

Qué incluye

SalidaQué es
Puerta de políticaassay mcp wrap — permiso/denegación determinista antes de que las herramientas se ejecuten, con la razón.
Paquete de evidenciaArchivo verificable fuera de línea y a prueba de manipulación para auditoría y reproducción.
Base de Confianza / Tarjeta de Confianzatrust-basis.json canónico (clasificación de afirmaciones acotada) más trustcard.{json,md,html} amigable para revisión.
Recibos externosResultados de evaluación, decisiones de tiempo de ejecución e inventario de modelos como recibos acotados con contratos JSON Schema.
Registros de decisiones de herramientasPara llamadas de herramientas conocidas manejadas, el servidor stdio assay-mcp-server emite un evento tool_decision a nivel de info cuando su filtro de registro lo habilita; decision contiene una entrada de decisión observada codificada en JSON con campos de destino proyectados.
SARIF / CIAcción de GitHub, integración en la pestaña de Seguridad, puertas de política en PRs.
AtestaciónFirmar un paquete de evidencia como una Declaración in-toto v1 envuelta en DSSE con el predicado evidence-bundle/v1.
  Agent ──► Assay ──► MCP Server
              ├─ ✅ ALLOW / ❌ DENY  (policy, with reason)
              ├─► 📋 Evidence bundle (offline-verifiable)
              └─► 📊 Trust Basis → Trust Card → SARIF / CI

Versión actual: v6.9.0. CHANGELOG.md y las notas de versión siguen siendo la autoridad para el comportamiento publicado; los cambios fusionados después de la etiqueta son Unreleased, y la publicación en crates.io es separada del estado de fusión. Definición de lanzamiento y compromiso de soporte: docs/LAUNCH.md.

¿Es esto para mí?

Sí si ya tiene salidas de evaluación, decisiones de tiempo de ejecución, artefactos de inventario o pruebas de llamadas a herramientas MCP, y quiere un artefacto CI pequeño y revisable en lugar de un panel — auditabilidad acotada, no una insignia de confianza escalar.

Aún no si necesita que Assay juzgue la corrección del modelo por usted, quiere un panel alojado como producto, o quiere una afirmación de cumplimiento en lugar de un límite de evidencia acotado. Assay no es un motor de puntuación de confianza, un panel de evaluación genérico ni un producto de observabilidad alojado — vea qué es y qué no es.

Verlo en acción

Un agente intenta una acción privilegiada — github.add_deploy_key — a través del proxy de aplicación, decidida por llamada antes de reenviarla, fuera de línea contra un mock local (sin credenciales reales):

cd examples/privileged-action-gate && ./run.sh

privileged-action PR-gate demo

Una denegación es precaución de cierre ante fallos, no un veredicto sobre la intención; un permiso es la decisión de reenviar, nunca prueba de que la acción ocurrió. La conformidad declarada vs. observada se registra junto al veredicto, nunca como puerta. Recorrido completo: privileged-action-gate.

Elija su camino

Usted tieneLo que obtieneEmpiece aquí
Promptfoo JSONL de evaluaciones CIRecibos de resultados de evaluación + paquete verificado + diff de Base de ConfianzaPromptfoo JSONL
OpenFeature EvaluationDetailsRecibo de decisión + paquete verificadoOpenFeature
Componente de modelo CycloneDX ML-BOMRecibo de inventario + paquete verificadoCycloneDX ML-BOM
Llamadas a herramientas MCPRastro de auditoría de permiso/denegación + evidencia de comportamiento observadoInicio rápido MCP
Una puerta de PR de GitHubDiff de Base de Confianza, estado de puerta, salida lista para SARIF/JUnitGuía de CI
Un archivo Runner / anotación de coberturaDescriptores de cobertura + celdas de clase de afirmación + verificación reclamada vs. observadaRecorrido de honestidad de cobertura

El flujo de trabajo sigue siendo pequeño: importe o registre un resultado acotado, empaquete y verifíquelo, compile trust-basis.json, aplique la puerta al diff de Base de Confianza. Assay no convierte la herramienta ascendente en la fuente de verdad; hace inspeccionable el límite de evidencia. Para acciones privilegiadas de herramientas, el proxy MCP registra cada tools/call como una superficie de decisión de herramienta estructurada — manteniendo honesta la línea entre lo afirmado y lo verificado.

La política es simple

version: "2.0"
name: "my-policy"
tools:
  allow: ["read_file", "list_dir"]
  deny: ["exec", "shell", "write_file"]
schemas:
  read_file:
    type: object
    properties:
      path: { type: string, pattern: "^/app/.*" }
    required: ["path"]

assay init --from-trace trace.jsonl genera la política de observación en tiempo de ejecución utilizada por el flujo de generación de rastros (files, network y processes); no es una política de autorización MCP. Migre una política MCP constraints: heredada con assay policy migrate. Vea Archivos de política.

Por qué Assay

Evidencia canónicaEl modelo de evidencia de Assay es el contrato estable; OpenTelemetry y los adaptadores de protocolo (perfil de proyección ACP / A2A / UCP) se mapean en él.
DeterministaLa puerta de política usa reglas explícitas; su decisión depende de la solicitud, la política y el estado de sesión aplicable. Esto no hace deterministas a los evaluadores en vivo ni a los efectos externos.
Afirmaciones acotadasExplícito sobre verificado vs visible vs ausente — sin UX de puntuación primero.
Primero fuera de líneaNo se requiere backend para la aplicación central y la verificación de paquetes.
Procedencia comprobableQué pieza del modelo de clase de fuente y cobertura se envió cuándo, como commits que puede git log en lugar de afirmaciones que debe aceptar — procedencia, trabajo previo acreditado primero.

Aprenda más

Epistemología de la evidencia, latencia y el Runner interno

Las afirmaciones de confianza usan epistemología explícita, no una puntuación de seguridad única: verified (evidencia directa o verificación fuera de línea), self_reported (emitida sin corroboración independiente), inferred (reglas acotadas y documentadas), absent (sin evidencia confiable). Assay no incluye una puntuación de confianza agregada ni una insignia safe/unsafe como salida principal — vea ADR-033.

Los resultados de experimentos históricos de IPI fragmentado, fechados el 2026-03-02 y nombrando el commit 289a43ecc144, reportan 0.771ms p50 / 1.913ms p95 para el conjunto determinista. El arnés cronometra rondas completas de tools/call mock local, incluido el transporte JSON-RPC y la respuesta de la herramienta. Estos tiempos reportados no aíslan la sobrecarga de decisión de política ni establecen el rendimiento del modelo de la versión actual o de extremo a extremo.

Assay-Runner es un subsistema interno/experimental de ejecución medida detrás de la ruta de aceptación delegada Linux/eBPF. Sus crates se incluyen en el proceso de publicación del workspace para que los paquetes dependientes puedan resolverlos; la publicación no convierte a Runner en un producto independiente ni da a sus APIs un compromiso de estabilidad separado.

Ecosistema

Proyectos relacionados para generación, verificación y revisabilidad de evidencia; cada uno tiene su propia interfaz y alcance:

  • assay-action — Acción de GitHub: verifica paquetes, resúmenes de PR, SARIF (Marketplace).
  • Assay-Harness — capa de recetas, compuertas e informes sobre artefactos de evidencia canónicos.
  • observed-effect-v0 — ejemplos trabajados del registro de evidencia de efecto observado acotado y sus portadores neutrales (in-toto, SCITT, MCP evidenceRef).
  • gateway-evidence-replay — verificador de reproducción offline determinista para paquetes de evidencia de ruta de gateway.
  • RGE-Bench — kit de conformidad para la revisabilidad de evidencia, mantenido por separado bajo su propia guarda de neutralidad verificada por máquina. La reproducción allí está limitada por digest y no se transfiere: el digest v1 de 71 vectores sha256:e769822bc6c9e31085da7b1a17b163b9747fe0d04314fbb8685d4e612087c7cb y el digest histórico v2 sha256:ba0e3795d75c788fa48313ab462493f22d78759851d1b3275d8117051bb22fd0 (95 vectores) cada uno reporta una implementación independiente por un segundo autor en una pila diferente. JM-Lab reportó la reproducción v2 95/95 el 2026-08-24, a partir del texto del contrato y las entradas proporcionadas por el autor sin leer expected. Ninguna reproducción se transfiere al digest candidato actual v3 de 104 vectores sha256:93f8ae9654eb5a16dee28d882087669cae5183e02e116ba1e8071a30594cfb6a, que el registro lista como no reproducido. Consulte su REPRODUCTIONS.md.

Perfil abierto: privileged-mcp-action/v0

privileged-mcp-action/v0 es un contrato de composición y verificación sobre registros de evidencia que ya existen: lo que una llamada de herramienta MCP privilegiada decidió, lo que se observó de su efecto y lo que permanece sin probar. No añade un nuevo sobre ni un veredicto agregado.

Se distribuye con un corpus de conformidad de 14 vectores (5 aceptan, 9 rechazan) cuyo digest es un candidato: no se considera reproducido hasta que una implementación de un no autor derive los resultados esperados únicamente del texto de la especificación.

Esa reproducción está abierta y la invitación es real: #1840. Cualquier lenguaje, cualquier pila. La invitación nombra el commit exacto que describe el digest actual. El protocolo de sala limpia proporciona un paquete de entradas opaco y atestiguado, una acción de puntuación de un comando y una plantilla de informe de implementación sin proporcionar lógica de verificador ni resultados esperados. El README del corpus establece el límite de autoría y el techo de afirmaciones.

Contribuciones

cargo test --workspace
cargo clippy --workspace --all-targets -- -D warnings

Consulte CONTRIBUTING.md y GitHub Discussions.

Licencia

MIT