Octelium documentation · Latest
Visibility
An MCP Service emits identity-aware, protocol-specific AccessLogs in real time. The common part identifies the User, Session, Device, Service, Namespace, authorization decision and policy match. The entry.info.mcp part records the normalized JSON-RPC exchange (read more about visibility here).
Body and Header Visibility
MCP request and response bodies are recorded by default because tool arguments and results are often required for auditing. They can also contain secrets, personal information, prompts and proprietary data. Disable body capture when the audit backend must not store that content:
Individual HTTP headers can be recorded as follows:
All headers can be enabled with explicit exclusions:
Sensitive authentication and session headers are excluded even when all headers are enabled. Body and event capture is bounded, so large values can be omitted from an AccessLog.
Entry Types
The type field describes the response lifecycle:
COMPLETEis a request with a finite response.STREAM_STARTis emitted when an SSE response starts.STREAM_ENDis the final record and carries accumulated stream details.
Tool Call
The following is the MCP-specific part of an example tools/call AccessLog. Common identity and policy fields are omitted for brevity:
method is the JSON-RPC method. name is its logical target: a tool name for tools/call, a prompt name for prompts/get, or a resource URI for resources/read. It is empty for methods without a target, such as tools/list.
requestID is normalized into a string whether the downstream used a string or number. isNotification is true when no identifier was supplied and no response is expected.
Client and Session Information
client contains the name, version and title reported by the downstream. sessionID is the Mcp-Session-Id transport identifier used by applicable MCP protocol revisions.
Neither value is authenticated identity. The client can choose them, and an MCP session is unrelated to an Octelium Session. Use the AccessLog's common User, Session and Device references for identity and security decisions.
Client capabilities reported by the downstream are available in request policy context. They remain self-reported context rather than identity.
Streamed Response
The final entry of an SSE response records event and notification counts as well as any result metadata observed during the stream:
eventCount counts SSE events and notificationCount counts JSON-RPC notifications observed within them. ttlMs and cacheScope record cache freshness metadata returned by the MCP server when present. Integer values whose protobuf type is 64-bit are represented as JSON strings.
A response guardrail buffers the complete stream before it is released, but the resulting successful exchange still uses the MCP stream entry types.
Protocol and Tool Errors
A JSON-RPC error is recorded independently of the HTTP status code:
isProtocolError, errorCode and errorMessage describe a JSON-RPC error object. A provider can return it with HTTP status 200, so dashboards should not infer MCP success from the HTTP status alone.
A successful JSON-RPC result from tools/call can still contain isError: true. Octelium records that separately:
Track protocol errors and tool errors independently.
Notifications
A JSON-RPC notification has no request identifier and expects no response:
Metrics and Export
AccessLogs are exported through OpenTelemetry and can be sent to an observability or SIEM backend. Useful dimensions include Service, User, protocol version, method, target name, result type, protocol error, tool error and stream type. Avoid using downstream-controlled client, request or MCP session identifiers as trusted security dimensions.
Read more about the MCP configuration and MCP plugins.