HackZero.ai is now Compliance Everywhere. Read why →

Technical description

How the evidence collector actually works.

A SOC 2 auditor does not want a screenshot. They want to know what was run, on what, when, by whom, and whether they can run it again and get the same answer. This page describes the program that produces that record, including the places where our guarantees stop.

This is not our penetration testing MCP. That one is at /product/mcp and it does a different job.

What it is

A small Node program that your coding assistant runs on your own machine, published as @complianceeverywhere/mcp. It has one dependency, the Model Context Protocol SDK. It ships with no knowledge of SOC 2: it asks our server at startup what the controls are, what your company runs, and what is still missing, and everything it knows comes from that call.

Your assistant then proposes a command that would satisfy a control, runs it against systems you are already logged in to, and files the result. You never paste a cloud credential into Compliance Everywhere, because the commands run where your credentials already are.

Installing it

Generate a key in the dashboard, paste one line, restart your editor. The key is shown once and stored as a hash, so we cannot recover it for you.

claude mcp add compliance-everywhere -- npx -y @complianceeverywhere/mcp@latest --token hz_pat_YOUR_KEY

Cursor and Codex take the same command through their own config files. The token can also come from a COMPLIANCE_EVERYWHERE_TOKEN environment variable (the older HACKZERO_TOKEN also works) if you would rather not have it in a config file.

What lands on one piece of evidence

This is the part that matters to your auditor. Every collected artifact carries all of it, and the server refuses the upload outright if the command or the exit code is missing.

source_command
The command, in full, never truncated. Refused if absent.
output
Everything it printed, byte for byte, encrypted at rest.
exit_code
Whether it succeeded. Refused if absent.
executed_at
When your machine ran it.
uploaded_at
When our server received it. Set by us, never accepted from a caller.
sha256
Computed by our server over the bytes we store, and compared to yours.
uploaded_by
The account behind the key.
uploaded_by_token
Which key. Both resolved server-side, never self-reported.
host, cwd, tool_version
Which machine, which directory, which client version.
system
Which of your systems this proves.

Output is stored exactly as captured. We do not truncate it and we do not edit it: an artifact over 8 MB is refused, with a message asking for a narrower command, rather than being silently cut. There is no redaction pass, deliberately. A secret scrubber over an open set of credential formats buys the appearance of safety rather than safety, and editing the bytes would destroy the one property that makes the artifact worth having.

Two timestamps are kept separately on purpose. Your machine says when the command ran; our server records when it arrived, and will not accept that value from a caller. An artifact cannot be backdated.

Everything it can do

Reads: nothing changes

soc2_status
Where you are, what is due, what is blocking each control.
soc2_coverage
Which parts of your observation window a control has evidence for.
soc2_read_control
One control: what it accepts, what is on file, what is still missing.
soc2_read_document
Reads a policy back, with its signature state and any blanks.
soc2_recommend_connectors
Which integrations matter for your stack, and which you can ignore.
soc2_open_questions
The setup questions still unanswered.
soc2_check_tool
Checks whether a CLI exists on your machine. Never leaves it.

Writes: these change your workspace

soc2_collect
Runs one command and files its output as evidence. The main one.
soc2_record_attempt
Records a command that failed, as an obstacle rather than a finding.
soc2_add_systems
Proposes the infrastructure in scope. Marked proposed until you confirm.
soc2_add_vendors
Proposes the third parties you use. Also proposed until confirmed.
soc2_add_people
Proposes your roster: names, emails, roles, start dates.
soc2_invite_people
Sends real email to real people. Refuses until it has shown you the list.
soc2_draft
Writes a policy. It cannot sign one.
soc2_edit_document
Changes a policy, including a signed one, which makes the signature stale.
soc2_fill_control
Fills the structured tables a control asks for.
soc2_answer
Records answers to setup questions, tagged as coming from the agent.
soc2_accounts
Records who can sign in to which system.
soc2_claim_account
Attaches a login to a person.

It cannot sign a policy. Signing happens in a browser, by a named person, and no key can do it. It cannot mark a system as internet-facing, because that is something a connector observed rather than something an agent may assert. Six controls are declared uncollectable and no command may touch them: the penetration test, the incident response exercise, security training, the access review, the management review meeting, and the backup restore test. Those have to actually happen.

The key, and what a stolen one could do

A 256-bit token, stored as a SHA-256 hash, pinned to one workspace, expiring after a year. It carries two scopes and can never reach the penetration testing side of the product, in either direction. Every write, every denial and every sensitive read is logged with the account, the key, the method, the path, the address and the agent.

Assume it leaks. It could read your whole compliance workspace, download the complete audit packet, create and edit your registers and policies, and email your team. It could not touch another customer, and it could not reach a pentest, a finding or a report. Treat it as you would a read-write API key for your compliance data, because that is what it is. Revoke it in the dashboard and it stops working immediately.

Where our guarantees stop

Four things worth knowing before you install it. We would rather you read them here than discover them later.

  1. Read-only is an instruction, not an enforced boundary. We tell the assistant to propose only read-only commands, and the client runs the exact string it is given so that the recorded command and the executed command can never differ. There is no allowlist. If you want a hard boundary, run it under an account whose permissions are the boundary.
  2. The confirmation prompt is your editor's, not ours. Claude Code, Cursor and the rest ask you to approve each tool call. That is a real and good control, and it belongs to your editor, so it follows whatever you have configured there, including turning it off.
  3. Collected output is read by a large language model. When an artifact arrives we grade it against the control's criteria and tell you whether an auditor would accept it. That grading sends the beginning of the artifact to a third-party model provider. If a command's output would contain something you are not willing to send to a model, do not collect it that way. Upload it instead, or ask us and we will turn grading off for your workspace.
  4. Your code does not reach us. It may still reach your model. Nothing sends your repository to Compliance Everywhere. But the assistant reading it is your editor's, talking to your editor's model, under your editor's terms. That is worth being precise about rather than letting our sentence imply more than it means.

On which commands to run

We are often asked for the list of commands to run each quarter. There is not one, and we would rather say so than invent it.

What the platform declares, per control, is what evidence would satisfy it, whose job it is, what is still missing by name, and how often it has to be refreshed. The assistant composes a command from that and from your actual stack, because the command for "prove every datastore encrypts at rest" is different on Supabase, on RDS and on a Postgres you run yourself. A fixed library would be wrong for most customers on most controls.

What you get instead is stronger for an audit: the exact command is recorded on every artifact, and every one of them can be re-performed by your auditor. The command set is not a controlled inventory we can hand over in advance. Every command we actually ran is.

On timing: evidence collected by command refreshes every 90 days, dated from when the command ran rather than when it was uploaded. Controls the matrix marks annual stay annual.

Questions

Does my source code reach Compliance Everywhere?

No. The agent reads your repository using your editor's own file tools, and only the command output you see is sent to us. Note that your editor is separately sending your code to whichever model you have configured, which is a matter between you and your editor.

Can it run something destructive?

We ask the assistant for read-only commands, and the client records and executes the exact string it is given. There is no allowlist enforcing that. Your editor prompts before each run, which is the real control, and it is your editor's prompt, not ours.

Can an auditor re-run what it collected?

Yes. Every artifact carries the full command, the exit code, when it ran and on which machine. That is the point of recording the command rather than a screenshot.

Where is the evidence stored?

Encrypted at rest in your workspace. An artifact over 8 MB is refused rather than cut.

Something here not precise enough for your review? Ask us and we will answer from the source, or change the source.