Docs
Data collected
Every field Zevruna stores, what turns it off, and what it defaults to. Two things collect anything at all, and they are independent: the cloud monitor, which needs no code from you, and the optional telemetry you send — from one of the SDKs (@zevruna/observe, zevruna for Python, zevruna-go) or straight from an OpenTelemetry exporter.
The short version
The monitor reads schemas that servers publish to every client, it never invokes a tool and never sits in your execution path. An SDK does sit in your execution path, by design, and reports execution metadata: what ran, in what order, how long it took, and whether it failed. One field can carry your data, and it is off until you turn it on. Sending OpenTelemetry instead moves that judgement to you — we store the spans you export, and nothing is withheld on your behalf.
The monitor
| Field | What it is | Your control | Default |
|---|---|---|---|
| Advertised contract | The tools, prompts and resources a server publishes to every client that connects, stored as a canonical, content-hashed snapshot. | Stop monitoring the server. | on |
| Endpoint and schedule | The URL you registered and how often it is polled. | Stop monitoring the server. | on |
| Auth header | Only if you supply one for a private server. Sealed with AES-256-GCM, decrypted solely to poll that server, never returned by the API. | Omit it; public servers need none. | off |
The SDK
| Field | What it is | Your control | Default |
|---|---|---|---|
| Run boundary | Agent name, environment, start and end time, duration, status, and the outcome string you pass to markSuccess or markFailure. | Do not install the SDK. The monitor works without it. | on |
| Step metadata | Step name, kind, parent, attempt number, start and end time, duration, and whether it succeeded. | Wrap fewer boundaries. | on |
| Step attributes | Whatever you pass yourself. instrumentMcpClient (instrument_mcp_client, InstrumentMCP) adds only the server and tool name. | redact in init() runs on every value before it is sent. | on |
| Run attributes | Whatever you pass to observeAgent, observe_agent or StartTrace. | Also covered by redact. | on |
| Error class and message | The constructor name and message of an error thrown inside a wrapped boundary. Messages your own code writes are sent as written. | redact receives them under the key error_message. | on |
| MCP error text | The text an MCP server returns alongside isError. The server writes it, and it can quote the arguments it rejected, so this is the one field here that can carry your data. With it off, the step records that the tool returned isError and nothing more. | captureErrorText: true in init(), or ZEVRUNA_CAPTURE_ERROR_TEXT=1. | off |
One difference worth knowing if you send OpenTelemetry. The SDKs refuse to transmit error text a remote server wrote unless you opt in, because that text can quote the arguments it rejected. An exporter has no such gate: a span carries exactly what you put on it, and we store what arrives. The key-name redaction on write still applies either way.
Never collected
- Tool arguments. Nothing we ship reads them.
- Tool return values, other than the MCP error text above when you enable it.
- Your source code. The scanner runs locally and uploads only the manifest it produces.
- Request or response bodies of your own HTTP calls.
Two layers of scrubbing
The redact hook runs inside your process, before anything is sent, so a value it removes never leaves your infrastructure. Independently, every write is scrubbed on ingest: attribute keys that look like credentials, password, token, secret, authorization and similar, are stored as [redacted], and oversized values are truncated. That second layer protects you even on a pinned SDK with no hook configured.
It is a key-name denylist, not content inspection. We do not guess at whether a value looks sensitive: a scrubber that guessed would either mangle real diagnostics or hand you false confidence.
Retention
Run telemetry is deleted on your plan’s retention window, three days on Free, thirty on Pro, ninety on Scale, by a sweep that runs daily. Contract snapshots and incidents are kept until you delete the project: a ninety-day stability strip means nothing if the history behind it was swept.