Skip to content

Observability Events

An observability event describes a single MCP tool call: who made it, what it did, how much it cost, and whether policy allowed it. Events are the raw material for every dashboard and metric in the platform.

When Lander mirrors an MCP, it produces an event for each tool call and:

  1. writes it to local JSONL audit logs on the endpoint, and
  2. batches it and streams it to the control plane at POST /v1/devices/events, signed with the device key.

Ingestion is best-effort and batched — transient control-plane outages don’t drop the local audit trail.

Each event carries identity, action, outcome, and usage fields:

FieldMeaning
event_timeWhen the call happened (endpoint clock)
agent_typeThe calling agent, e.g. claude-code
mcp_nameThe MCP server invoked
toolThe tool called on that server
event_typeThe kind of event (invocation, result, error)
resultallowed, denied, or error
deny_code / deny_reasonWhy a call was denied (when result = denied)
error_messageError detail (when result = error)
rule_appliedThe policy/rule that produced a deny
modelThe model driving the agent, when known
session_idGroups calls within one agent session
group / actor_emailOrg grouping and the human owner
tokens_in / tokens_outToken usage attributed to the call
duration_msHow long the call took
skillsSkill names involved in the call
promptThe request prompt, optionally truncated
metadataArbitrary additional JSON fields

The full reference, with example payloads, is in the Observability Event Schema.

Every event resolves to one of three outcomes, which is the primary lens for analysis:

flowchart LR
  Call["MCP tool call"] --> P{Policy}
  P -->|tool enabled| Allowed["allowed"]
  P -->|tool disabled / rule hit| Denied["denied\ndeny_code + rule_applied"]
  Call -->|upstream failure| Error["error\nerror_message"]
  • allowed — the call passed policy and was forwarded.
  • denied — the proxy blocked it (for example a disabled tool); deny_code, deny_reason, and rule_applied explain why.
  • error — the call was attempted but failed upstream; error_message carries the detail.

The control plane turns the event stream into browseable and summarized views:

  • Event browser (GET /admin/observability/events) — paginated, filterable list of individual events. Filter by date range, agent type, MCP name, result, and deny code.
  • Summary (GET /admin/observability/summary) — aggregates: total events, the allowed/denied/error split, summed tokens_in/tokens_out, and the count of unique MCP servers.

These also feed the per-MCP usage stats described in MCP servers and the dashboards covered in the Monitor guide.

In parallel with reporting, Lander writes per-MCP JSONL logs under ~/.lander/logs/<mcp-name>/:

  • access.log — metadata for every request: method, JSON-RPC id, agent id, duration, status.
  • query.log — full payloads for tool calls: tool name, arguments, and results.

Logs are size-rotated (default 10 MiB per file, up to 5 rotated siblings per MCP) and retained for off-box collection by your log pipeline. The query.log stream — which can contain sensitive arguments — can be disabled globally or per MCP from the Connector; see Security & audit for the redaction controls.