Skip to content

Audit event schema

Every MCP tool call through Wicket writes an audit entry — whether allowed or denied. Entries are visible in the dashboard Audit tab and queryable via the REST API.

Entry fields

FieldTypeDescription
idstringUnique entry ID
timestampISO 8601When the decision was made
agentIdstringAgent UUID
agentNamestringAgent display name
memberIdstringAgent member UUID
memberNamestringMember’s email or display name
memberKeyIdstringKey record ID (not the key itself)
sessionIdstringMCP session ID, if applicable
servicestringConnector: github, slack, linear, etc.
toolstringTool name: e.g. search_repositories
actionstringCedar action URI: e.g. GitHubMCP::Action::"search_repositories"
resourcestringCedar resource the action targeted
callerIpstringIP address the call originated from. Not redacted — visible to all members
toolArgsobjectArguments passed to the tool (may be redacted)
decisionALLOW | DENYProxy verdict
reasonstringHuman-readable explanation of the decision
matchedPolicyIdsstring[]Policy keys that matched this call
matchedPolicyNamesstring[]Human-readable names of matched policies
durationMsnumberTotal proxy time in milliseconds, including upstream
principalstringCedar principal string used for evaluation

Querying audit logs

GET /api/audit?service=github&result=DENY&limit=50

Query parameters

ParameterTypeDescription
fromISO dateStart of time range (inclusive)
toISO dateEnd of time range (inclusive)
agentstringSubstring match on agent name (case-insensitive)
servicestringExact connector key — github, slack, …
toolstringSubstring match on tool name (case-insensitive)
resultALLOW | DENYFilter by decision
memberstringExact member ID (the memberId UUID from an entry) — not an email
policystringExact policy database ID (the policyId UUID from an entry) — not the policy key
limitnumberMax results (default: 500, max: 500)
offsetnumberPagination offset

The member and policy filters take internal IDs, not human-friendly values — there is no email or policy-key lookup. In the dashboard this is automatic: clicking a member or a matched policy in the Audit view fills the right ID for you. To filter by ID directly, read memberId / policyId off any entry first (or list members via GET /api/audit/members).

Export

Use the dedicated CSV export endpoint with the same filters:

GET /api/audit/export?from=2026-01-01&to=2026-01-31&result=DENY

Add exportAll=true with max (up to 500) and page with offset for bulk pulls. Columns: timestamp, agent, member, tool, service, resource, decision, reason, duration, and matched policy identifiers. Note that callerIp is currently not included in the CSV export.

On trusted agents, exports for non-owner members redact policy identities — the same visibility rule the dashboard applies.

Example entry

{
"id": "aev_01j9xk...",
"timestamp": "2026-05-19T14:32:01.123Z",
"agentId": "a1b2c3d4-...",
"agentName": "my-first-agent",
"memberId": "m9z8y7x6-...",
"memberName": "alice@example.com",
"service": "github",
"tool": "search_repositories",
"action": "GitHubMCP::Action::\"search_repositories\"",
"decision": "ALLOW",
"reason": "No forbid policy matched",
"matchedPolicyIds": [],
"matchedPolicyNames": [],
"durationMs": 312
}