Server data from the Official MCP Registry
Record AI decisions to a tamper-evident audit ledger from any MCP-compatible agent.
Record AI decisions to a tamper-evident audit ledger from any MCP-compatible agent.
audit-ledger-mcp is a well-architected MCP server with strong security foundations. PII hashing occurs locally before transit, credentials are properly managed through environment variables, and permissions are appropriately scoped to the server's audit logging purpose. Minor observations around input validation and error handling do not rise to significant security concerns. Supply chain analysis found 2 known vulnerabilities in dependencies (0 critical, 2 high severity). Package verification found 1 issue.
7 files analyzed · 7 issues found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
This plugin requests these system permissions. Most are normal for its category.
Set these up before or after installing:
Environment variable: AUDIT_API_URL
Environment variable: AUDIT_WRITE_KEY
Environment variable: AUDIT_READ_KEY
Environment variable: AUDIT_TIMEOUT_MS
Environment variable: AUDIT_RETRY_ATTEMPTS
Add this to your MCP configuration file:
{
"mcpServers": {
"io-github-shahidh68-audit-ledger-mcp": {
"env": {
"AUDIT_API_URL": "your-audit-api-url-here",
"AUDIT_READ_KEY": "your-audit-read-key-here",
"AUDIT_WRITE_KEY": "your-audit-write-key-here",
"AUDIT_TIMEOUT_MS": "your-audit-timeout-ms-here",
"AUDIT_RETRY_ATTEMPTS": "your-audit-retry-attempts-here"
},
"args": [
"-y",
"audit-ledger-mcp"
],
"command": "npx"
}
}
}From the project's GitHub README.
MCP server for the AI Audit Ledger. Lets any AI agent — Claude Desktop, Cursor, LangGraph, custom — record decisions to a tamper-evident audit trail with one line of config.
Built for teams shipping AI in regulated contexts: EU AI Act Article 12 logging, FCA SS1/23 model risk evidence, GDPR data minimisation. Personal data is hashed locally before any payload leaves the server — the ledger only ever sees fingerprints.
Try the live dashboard → · 30 synthetic decisions written via this MCP server, queryable and verifiable.
A LangGraph workflow calls
record_decisionafter each agent step. Three audit events written to the live ledger; every one independently verifiable.
Exposes three tools to any MCP-compatible agent:
| Tool | What it does |
|---|---|
record_decision | Log an AI decision. Hashes inputs locally, then writes through to the ledger. Returns an event ID. |
verify_decision | Cross-check a stored record against the immutable S3 Object Lock copy. Returns integrity_verified: true/false. |
list_decisions | Query recent decisions, optionally filtered by time window. Tenant-scoped by API key. |
Each call ends up as a regulator-grade audit record in your deployed ledger — DynamoDB for query, S3 Object Lock COMPLIANCE mode for the immutable copy, 7-year retention by default.
npx -y audit-ledger-mcp
That's it. With no environment variables, the server boots into sandbox mode and writes records to a shared public tenant on a hosted ledger. You can try every tool — record_decision, verify_decision, list_decisions — without provisioning anything.
When sandbox mode is active, you'll see a banner on stderr:
[audit-ledger-mcp] ─────────────── SANDBOX MODE ───────────────
[audit-ledger-mcp] No AUDIT_API_URL configured.
[audit-ledger-mcp] Using the public sandbox at sandbox-public.
[audit-ledger-mcp] View: https://d2pfirb2397ixy.cloudfront.net
[audit-ledger-mcp] Do NOT write real personal data...
| Hosted by | github.com/shahidh68/audit-ledger (same AWS deployment) |
| Tenant | sandbox-public (shared, public) |
| Rate limit | 100 requests/minute per IP |
| Retention | 7 years (records cannot be deleted) |
| Audience | Tyre-kickers, integration tests, framework demos |
| NOT for | Production data, customer PII, real compliance records |
{
"mcpServers": {
"audit-ledger-sandbox": {
"command": "npx",
"args": ["-y", "audit-ledger-mcp"]
}
}
}
Restart Claude Desktop. The three tools appear in the MCP menu immediately. Try asking Claude to "record this decision: should X be approved?" and watch a record land in the sandbox dashboard.
For real workloads, deploy your own audit ledger and point the MCP server at it:
npm install -g audit-ledger-mcp
Configure with all three env vars (any of them being set switches off sandbox mode):
export AUDIT_API_URL="https://<api-id>.execute-api.<region>.amazonaws.com/prod"
export AUDIT_WRITE_KEY="<your-tenant-write-key>"
export AUDIT_READ_KEY="<your-tenant-read-key>"
# Optional
export AUDIT_TIMEOUT_MS=5000 # default 5000
export AUDIT_RETRY_ATTEMPTS=3 # default 3
The full template lives in .env.example.
Edit your claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json, Windows: %APPDATA%\Claude\claude_desktop_config.json):
{
"mcpServers": {
"audit-ledger": {
"command": "npx",
"args": ["-y", "audit-ledger-mcp"],
"env": {
"AUDIT_API_URL": "https://<api-id>.execute-api.<region>.amazonaws.com/prod",
"AUDIT_WRITE_KEY": "<your-tenant-write-key>",
"AUDIT_READ_KEY": "<your-tenant-read-key>"
}
}
}
}
Restart Claude Desktop. You'll see "audit-ledger" in the MCP tools menu. Ask Claude something like "Record this decision: I declined the application because…" and watch it call record_decision automatically.
In Cursor settings → MCP → add server:
{
"mcpServers": {
"audit-ledger": {
"command": "npx",
"args": ["-y", "audit-ledger-mcp"],
"env": {
"AUDIT_API_URL": "https://<api-id>.execute-api.<region>.amazonaws.com/prod",
"AUDIT_WRITE_KEY": "<your-tenant-write-key>",
"AUDIT_READ_KEY": "<your-tenant-read-key>"
}
}
}
}
Using langchain-mcp-adapters:
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.prebuilt import create_react_agent
from langchain_anthropic import ChatAnthropic
import os
client = MultiServerMCPClient({
"audit-ledger": {
"command": "npx",
"args": ["-y", "audit-ledger-mcp"],
"transport": "stdio",
"env": {
"AUDIT_API_URL": os.environ["AUDIT_API_URL"],
"AUDIT_WRITE_KEY": os.environ["AUDIT_WRITE_KEY"],
"AUDIT_READ_KEY": os.environ["AUDIT_READ_KEY"],
},
}
})
tools = await client.get_tools()
agent = create_react_agent(
ChatAnthropic(model="claude-sonnet-4-7-20251022"),
tools,
)
# The agent can now call record_decision, verify_decision, list_decisions
result = await agent.ainvoke({
"messages": [{"role": "user", "content": "Triage this loan application…"}]
})
AUDIT_API_URL=... AUDIT_WRITE_KEY=... npx -y audit-ledger-mcp
The server speaks MCP over stdio. Send initialize, tools/list, and tools/call requests per the MCP specification.
record_decision call flowsAgent audit-ledger-mcp AWS (your ledger)
| | |
|--- record_decision ----->| |
| raw_user_input | (hash locally — no PII over |
| raw_system_prompt | the wire from this point) |
| decision_output | |
| human_in_loop | |
| |--- HTTPS POST /audit/events --->|
| | {hashes + decision + |
| | x-api-key} |
| | |
| |<--- 202 Accepted ---------------|
| | { event_id, ... } |
|<--- event_id ------------| |
| recorded_at | |
| note | |
Storage on the AWS side happens asynchronously through SQS → Processor Lambda → DynamoDB + S3 Object Lock. See the main repo's ARCHITECTURE.md for the full path.
record_decisionRecord an AI decision to the ledger.
| Parameter | Type | Required | Notes |
|---|---|---|---|
model_version | string | Yes | e.g. "claude-sonnet-4-7-20251022" |
raw_system_prompt | string | Yes | Hashed locally |
raw_user_input | string | Yes | Hashed locally |
ai_decision_output | object | Yes | Stored verbatim — must not contain raw PII |
human_in_loop | boolean | Yes | Critical for EU AI Act Article 14 |
event_id | uuid v4 | No | Auto-generated if omitted |
timestamp | ISO 8601 | No | Defaults to now |
verify_decisionTamper-check a stored record.
| Parameter | Type | Required | Notes |
|---|---|---|---|
event_id | uuid v4 | Yes | The ID of the record to verify |
Returns the DynamoDB record, the S3 record, and integrity_verified: true/false.
list_decisionsList recent decisions for the calling tenant.
| Parameter | Type | Required | Notes |
|---|---|---|---|
from | ISO 8601 | No | Defaults to 7 days ago |
to | ISO 8601 | No | Defaults to now |
limit | integer 1–500 | No | Defaults to 100 |
x-api-key header, and are never echoed back to the agent or written to disk.git clone https://github.com/shahidh68/audit-ledger-mcp.git
cd audit-ledger-mcp
npm install
npm run build
npm test
The server is TypeScript on Node 20+, ESM, stdio transport, using @modelcontextprotocol/sdk.
Apache License 2.0 — see LICENSE.
The patent grant is intentional. Compliance infrastructure sits adjacent to enterprise legal review and the explicit grant matters there.
Built by Shahid. Available for Principal AI Engineering and Head of AI Engineering roles, and fractional advisory engagements, in UK regulated fintech.
Be the first to review this server!
by Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.
by mcp-marketplace · Developer Tools
Create, build, and publish Python MCP servers to PyPI — conversationally.
by Microsoft · Content & Media
Convert files (PDF, Word, Excel, images, audio) to Markdown for LLM consumption