Compliance-grade audit logging for MCP client operations
Project description
lokryn-mcp-log
Compliance-grade audit logging for MCP (Model Context Protocol) client operations.
What It Does
Wraps the official MCP Python SDK's ClientSession and logs every operation—tool calls, resource access, prompt executions—in a format that satisfies SOC2, HIPAA, and PCI audit requirements.
Logs conform to the lokryn-compliance-log-schema, an open standard for audit logging (schema vendored in this package, will be extracted to separate PyPI package).
Installation
pip install lokryn-mcp-log
Or with uv:
uv add lokryn-mcp-log
Quick Start
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from lokryn_mcp_log import with_logging, StdoutSink
server_params = StdioServerParameters(command="python", args=["server.py"])
async def main():
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
# Wrap with logging
logged = with_logging(
session,
sink=StdoutSink(),
environment="development",
)
# Use exactly like normal
await logged.call_tool("add", {"a": 1, "b": 2})
Sinks
StdoutSink
from lokryn_mcp_log import StdoutSink
sink = StdoutSink() # JSON to stdout
sink = StdoutSink(pretty=True) # Pretty-printed
FileSink
from lokryn_mcp_log import FileSink
sink = FileSink("/var/log/mcp-audit.jsonl")
HTTPSink
from lokryn_mcp_log import HTTPSink
# JSON format (default)
sink = HTTPSink(
endpoint="https://your-log-collector.com/ingest",
headers={"Authorization": "Bearer <token>"},
)
# Protobuf format
sink = HTTPSink(
endpoint="https://your-log-collector.com/ingest/proto",
format="protobuf",
)
# With HMAC signing
sink = HTTPSink(
endpoint="https://your-log-collector.com/ingest",
hmac_key="your-secret-key",
)
Custom Sink
Implement the Sink protocol:
from lokryn_mcp_log.schema import log_pb2
class MySink:
async def emit(self, record: log_pb2.LogRequest) -> None:
# Your logic here
pass
Configuration
from lokryn_mcp_log import with_logging
from lokryn_mcp_log.schema import log_pb2
logged = with_logging(
session,
sink=my_sink,
environment="production", # Required
actor_id="agent-001", # Optional, auto-generated if omitted
component="my-agent", # Defaults to "mcp-client"
policy_tags=["SOC2", "HIPAA"], # Optional compliance tags
default_sensitivity=log_pb2.SENSITIVITY_CONFIDENTIAL,
)
What Gets Logged
| Operation | Event Type | Resource |
|---|---|---|
initialize() |
EVENT_LOGIN |
session/initialize |
list_tools() |
EVENT_TOOL_INVOCATION |
tools/list |
call_tool(name, args) |
EVENT_TOOL_INVOCATION |
tools/{name} |
list_resources() |
EVENT_RESOURCE_ACCESS |
resources/list |
read_resource(uri) |
EVENT_CONTEXT_ACCESS |
{uri} |
list_prompts() |
EVENT_PROMPT_EXECUTION |
prompts/list |
get_prompt(name) |
EVENT_PROMPT_EXECUTION |
prompts/{name} |
| (session close) | EVENT_LOGOUT |
session/close |
Each log includes:
- Timestamp
- Actor ID (session/agent identifier)
- Duration (milliseconds)
- Correlation ID (for tracing)
- Input arguments
- Outcome (success/failure)
- Error details (on failure)
Error Handling
This is a library, not a service. If the sink fails, the exception propagates to your code. Handle it as appropriate for your use case.
Field Notes Integration
Send logs directly to Field Notes for tamper-evident storage and querying:
from lokryn_mcp_log import FieldNotesSink
# Configure via environment variables:
# FIELDNOTES_HMAC_KEY=your-secret-key
# FIELDNOTES_FORMAT=json (or "protobuf")
sink = FieldNotesSink()
# Or pass explicitly
sink = FieldNotesSink(hmac_key="your-secret-key", format="protobuf")
License
AGPL-3.0. Commercial license available—contact license@lokryn.com.
Links
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file lokryn_mcp_log-0.3.0.tar.gz.
File metadata
- Download URL: lokryn_mcp_log-0.3.0.tar.gz
- Upload date:
- Size: 67.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f2b3f74795fddca7c6b5d15c153d4c57eda4d304ef10bb4c6f5fb37888a8eca5
|
|
| MD5 |
0722f69d62cdc146f72e8f744df8c955
|
|
| BLAKE2b-256 |
398bfacb799ec58b498984b14075688d485eb1d1e4d10a96565647035da79743
|
Provenance
The following attestation bundles were made for lokryn_mcp_log-0.3.0.tar.gz:
Publisher:
publish.yml on lokryn-llc/mcp-log
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lokryn_mcp_log-0.3.0.tar.gz -
Subject digest:
f2b3f74795fddca7c6b5d15c153d4c57eda4d304ef10bb4c6f5fb37888a8eca5 - Sigstore transparency entry: 779534756
- Sigstore integration time:
-
Permalink:
lokryn-llc/mcp-log@83f2012d6ba70824a4fdeb1daae9aaa15e5c801d -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/lokryn-llc
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@83f2012d6ba70824a4fdeb1daae9aaa15e5c801d -
Trigger Event:
release
-
Statement type:
File details
Details for the file lokryn_mcp_log-0.3.0-py3-none-any.whl.
File metadata
- Download URL: lokryn_mcp_log-0.3.0-py3-none-any.whl
- Upload date:
- Size: 13.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9b4a63c1d62fa5e3094bc7224191046112cb9bccb6018001e1333da832574594
|
|
| MD5 |
9c0924c6aa703000d0d95fcbdcf286c0
|
|
| BLAKE2b-256 |
849dfe76cee59fedbf7aafac6931f04268864323c147ef2674b389a19c29e4c1
|
Provenance
The following attestation bundles were made for lokryn_mcp_log-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on lokryn-llc/mcp-log
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lokryn_mcp_log-0.3.0-py3-none-any.whl -
Subject digest:
9b4a63c1d62fa5e3094bc7224191046112cb9bccb6018001e1333da832574594 - Sigstore transparency entry: 779534757
- Sigstore integration time:
-
Permalink:
lokryn-llc/mcp-log@83f2012d6ba70824a4fdeb1daae9aaa15e5c801d -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/lokryn-llc
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@83f2012d6ba70824a4fdeb1daae9aaa15e5c801d -
Trigger Event:
release
-
Statement type: