# Immutable QC > Tamper-evident records for automated research labs. A one-file local agent seals every file an instrument writes into a signed ledger, records what AI agents read and wrote, and serves check_inputs, record_step, trace and audit_summary to AI agents over MCP on standard input and output. Nothing is uploaded; it never uses the network. Independent project · Open alpha · No customers yet. For biotechnology, microbiology, chemistry and materials science labs, and the people who build their AI agents and pipelines. Works today: - iqc.mjs 0.1.0: one file; Node.js 22 or later on Windows, macOS or Linux; no dependencies; it never uses the network. - iqc watch, iqc seal: seal every file in a folder by its bytes, from any instrument software (SHA-256, size, time), each record signed (ECDSA P-256) and linked to the one before, in /ImmutableQC/ledger.jsonl. - iqc record, iqc trace, iqc review: record an AI agent's step (what it read, wrote and did) in the agent's own ledger, trace a file back to sealed files, sign off steps. - iqc audit: check every ledger and every file under a lab folder: exit 0 pass, 3 review, 1 fail, 2 usage or read error. - iqc mcp: the same for AI agents over MCP on standard input and output. Protocol versions 2026-07-28, 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05. - The app, https://immutableqc.com/app/: audits a lab folder in the browser with nothing uploaded, traces agent outputs back through recorded steps to sealed files, sends untraced inputs to review, and signs off steps in its review mode. Upcoming: an npm package; a Windows installer and service; values read from inside files; per-person keys and signatures; Merkle batches; sealing inside the vendor's software; post-quantum signatures. Try it in one command (Linux; it runs only if the SHA-256 matches): curl -fsSO https://immutableqc.com/download/iqc.mjs && echo "bf946887b5c62c83ec630dbd9a0641890b622572cbfc789d702a0ac04f41895a iqc.mjs" | sha256sum -c - && node iqc.mjs help macOS: shasum -a 256 -c. Windows: certutil -hashfile iqc.mjs SHA256, then compare. If they differ, do not run it. Connect it from any MCP client that starts local servers over standard input and output: {"command": "node", "args": ["/path/to/iqc.mjs", "mcp", "--root", "/lab/agent-workspace", "--search", "/lab"]} - --root: the folder the agent works in; every path a tool takes must be inside it. - --search (repeatable): where the instruments' ledgers are. Give the lab folder, or a file sealed outside the root reads as untraced. The four tools (each result says which folders it searched): - check_inputs {paths}: per file, measured (a station's ledger sealed these exact bytes; its key id), derived (a recorded step wrote them) or untraced, and whether a sealed file changed after it was sealed. Only files a lab station sealed read as measured. Never run iqc seal or iqc watch on files yourself. Reads only. - record_step {action, inputs, outputs, input_refs?}: appends one signed record of a step (files by SHA-256 and size); the tool cannot remove it; a person reviews it. Recorded even when an input is untraced, with a warning. - trace {path}: a file's tree back to sealed files, and tracesToMeasured. - audit_summary {strict?}: pass, review or fail for every ledger under the search folders. Every tool but record_step reads only. The loop: check_inputs before you use lab files; tell the person about an untraced or changed input before you rely on it; record_step once per step, naming every file you read and wrote (from outside the root: copy it in, or use input_refs ::