Skip to main content
The @frontmcp/adapters/skills module provides a tamper-evident, hash-chained audit log for skill action executions. Every authority pass / authority fail / HTTP success / HTTP failure phase emitted by the skill action runner is captured, signed, and chained so any later mutation breaks signature verification.

Why tamper-evident?

Skill action audit trails are often subject to compliance review. A plain log file can be edited; a hash-chained, signed log cannot be modified, reordered, or partially deleted without breaking verification. Pair the log with an out-of-band notarization channel (planned for v1.3.0) and even tail truncation becomes detectable.

Architecture

Each SkillAuditRecord carries:

Configuring via skillsConfig.audit

Wire the audit subsystem through skillsConfig.audit on @FrontMcp. The SDK does not statically depend on @frontmcp/adapters/skills — call setSkillAuditFactory(...) once at boot to inject the audit module. This keeps the static dependency graph clean and works in Edge / CSP runtimes.

Built-in signers

Rs256AuditSigner uses rsaSignBase64Url from @frontmcp/utils under the hood.

Built-in stores

Custom stores

A custom store implements:
This is the right extension point for streaming records to S3, Postgres, or a SIEM.

Verifying the chain

verifyChain returns { ok: true } | { ok: false; breakAt: number; reason: string }. defaultAuditSignatureVerifier understands HS256 and RS256 records and dispatches based on record.signatureAlg.

DI integration

SkillAuditWriterToken is the DI token for the active writer. Plugins that need to emit additional audit records (e.g., a custom authority gate) can resolve it:
Plugins should always go through SkillAuditWriterToken rather than rolling their own audit log so the chain stays unified.

Threat model

What the audit log catches:
  • Record mutation — any byte-level change breaks the signature.
  • Record reordering — the prevHash chain breaks.
  • Record deletion in the middleprevHash mismatch on the next record.
What it does not catch by default:
  • Tail truncation — if an attacker deletes the tail, no record survives to flag it. Mitigation: anchor the chain head out-of-band (queued for v1.3.0 to be wired into the CAS-based atomic head update).
  • Multi-pod races — v1.2.0 is single-writer only. Multiple pods writing to the same store will produce a loud warning and may interleave sequences. CAS-based atomic chain head updates are queued for v1.3.0.

Operational concerns

  • Key rotation: signers carry a keyId; verifiers map keyId → public key. Keep historical keys in your verifier’s trust map for as long as you keep the records.
  • Storage growth: plan for a retention policy. The chain only needs to be intact within the retention window.
  • Compliance: RS256 + a persistent store + a CI verifier give you a forensic-grade trail.

@FrontMcp

Configure skillsConfig.audit on the server

Telemetry API

frontmcp_skills_audit_dropped_total counter and other skill metrics