Memex Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Memex Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A portable memory server for AI agents, built for the Model Context Protocol (MCP).
Smriti stores durable memories as plain markdown files with YAML frontmatter. This keeps your data readable, git-friendly, and easy to inspect outside any single agent runtime.
[[wikilinks]] to connect related memoriesSmriti MCP is published on PyPI as smriti-mcp.
Install into your current Python environment:
pip install smriti-mcpThen verify the CLI is available:
smriti-mcp --helpInstall Smriti as a persistent command-line tool:
uv tool install smriti-mcpOr run it directly without a separate install:
uvx smriti-mcp --helpgit clone https://github.com/deepak-bhardwaj-ps/smriti-mcp.git
cd smriti-mcp
pip install -e .smriti-mcp server --memory-root ~/.smriti/memoryBy default, Smriti uses ~/.smriti/memory. You can override it with:
export SMRITI_MEMORY_ROOT="$HOME/.smriti/memory"
smriti-mcp serverIf you prefer uvx, run the server with:
uvx smriti-mcp server --memory-root ~/.smriti/memoryClaude Desktop with pip or `uv tool install` (~/.config/claude_desktop_config.json):
{
"mcpServers": {
"smriti": {
"type": "stdio",
"command": "smriti-mcp",
"args": ["server", "--memory-root", "~/.smriti/memory"]
}
}
}Claude Desktop with `uvx`:
{
"mcpServers": {
"smriti": {
"type": "stdio",
"command": "uvx",
"args": ["smriti-mcp", "server", "--memory-root", "~/.smriti/memory"]
}
}
}Then restart Claude Desktop and Smriti will be available as a tool.
| Tool | Description |
|---|---|
create_memory | Create a new durable markdown memory with metadata |
get_memory | Retrieve a memory by ID and return its full content |
append_memory | Add content to the end of an existing memory |
update_memory | Patch metadata or replace memory content |
delete_memory | Permanently remove a memory |
remember | Agent-friendly write API that records a trace and can create, append, or update |
consolidate_memory | Create, append, or update a memory from reviewed trace content |
| Tool | Description |
|---|---|
search_memory | Full-text search across title, tags, categories, and body. Returns ranked results |
list_memories | Browse memory metadata without loading full content. Filter by status, category, tags |
| Tool | Description |
|---|---|
archive_memory | Mark a memory as archived (soft delete) |
build_memory_index | Generate a markdown index of all memories for easy browsing |
rebuild_memory | Fix frontmatter, apply/normalize wikilinks from titles and aliases, and rebuild indexes |
load_memory_index | Load the generated index as markdown |
Each memory is stored as a markdown file with YAML frontmatter:
---
id: project/Example Architecture Decision
title: Example Architecture Decision
category: project
tags:
- architecture
- decision
status: active
short_description: Decided to use async/await pattern
created_at: "2026-06-05T10:30:00+10:00"
updated_at: "2026-06-05T10:30:00+10:00"
---
## Background
We needed to handle concurrent requests efficiently.
## Decision
Use async/await with asyncio for I/O-bound operations.
## Consequences
- Improved throughput for concurrent operations
- Need to manage event loop carefully in multi-threaded contexts
See also: [[Async Migration]], [[Performance Metrics]]active, archived, or custom status~/.smriti/memory/
├── project/
│ ├── Example Architecture Decision.md
│ ├── Async Migration.md
│ └── Performance Metrics.md
├── research/
│ └── LLM Benchmarks.md
├── decisions/
│ └── Use Postgres.md
└── index.mdSmriti keeps default filenames aligned with memory titles so Obsidian-style wikilinks like [[API Rate Limiting Strategy]] resolve to API Rate Limiting Strategy.md.
When you run rebuild_memory, Smriti can automatically add missing wikilinks and normalize alias links. It matches longer titles and aliases first and only links whole phrases, so Durable Memory is preferred over durable, and able is not linked inside durable.
from smriti_mcp.store import MemoryStore
store = MemoryStore("~/.smriti/memory")
result = store.create_memory(
{
"title": "API Rate Limiting Strategy",
"category": "decisions",
"tags": ["api", "performance"],
"short_description": "Decided on sliding window rate limiting",
},
content="We chose sliding window over token bucket because...",
)
# Returns: {"id": "decisions/API Rate Limiting Strategy", ...}result = store.remember(
content="User prefers markdown-first durable memory with no mandatory vector database.",
id="preferences/Markdown First Memory",
meta={
"title": "Markdown First Memory",
"category": "preferences",
"memory_type": "preference",
"short_description": "Preference for markdown-first durable memory.",
"source_agent": "codex",
"confidence": "high",
},
mode="create",
)remember treats supplied meta as authoritative. If short_description is omitted, Smriti leaves it omitted instead of deriving a partial summary from the body. In auto mode, Smriti only appends to an existing memory when there is a strong deterministic match such as the same title; use id with append or update mode for explicit writes.
results = store.search_memory(
query="rate limiting",
include_content=False, # Just metadata
)
for result in results:
print(f"{result['id']}: {result['title']}")active_decisions = store.list_memories(
status="active",
category="decisions",
)
for memory in active_decisions:
print(f"{memory['title']} ({memory['status']})")result = store.rebuild_memory(
fix_frontmatter=True,
apply_wikilinks=True,
group_by_category=True,
)
print(result["wikilinks"]["links_added"])# Install test dependencies
pip install -e ".[dev]"
# Run all tests
pytest tests/ -v
# Run integration tests only
pytest tests/test_smriti_mcp_integration.py -vAll tests pass, including full MCP stdio round-trip integration tests.
The package has zero external database dependencies and works with Python 3.10+.
Contributions are welcome! Please:
git checkout -b feature/my-feature)pytest tests/ -v)MIT License - see LICENSE file for details.
Created by Deepak Bhardwaj.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.