Engram
Gives coding agents a persistent, searchable project memory stored locally in SQLite
Searchable store of past coding-agent failures and their fixes, looked up by error text
By Ikalus1988 (individual) Python Remote (hosted) · Streamable HTTPLocal · stdio Knowledge and memoryDeveloper tools
67 popularity score ★ 555 ↓ 2.1k/wk
Opens the app, which asks before it adds the server.
claude mcp add --transport http misakanet https://misakanet.org/mcp{
"mcpServers": {
"misakanet": {
"url": "https://misakanet.org/mcp"
}
}
}[mcp_servers.misakanet]
url = "https://misakanet.org/mcp"Opens the app, which asks before it adds the server.
pip install misakanetclaude mcp add misakanet -- python3 -m misakanet.server{
"mcpServers": {
"misakanet": {
"command": "python3",
"args": [
"-m",
"misakanet.server"
]
}
}
}{
"mcpServers": {
"misakanet": {
"command": "python3",
"args": [
"-m",
"misakanet.server"
]
}
}
}{
"servers": {
"misakanet": {
"type": "stdio",
"command": "python3",
"args": [
"-m",
"misakanet.server"
]
}
}
}[mcp_servers.misakanet]
command = "python3"
args = ["-m", "misakanet.server"]gemini mcp add --scope user misakanet python3 -- -m misakanet.serverOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
git clone https://github.com/Ikalus1988/MisakaNet.git
cd MisakaNet
python3 -m venv .venv && . .venv/bin/activate
pip install -r requirements.txtclaude mcp add misakanet -- '<ABSOLUTE_PATH_TO_CLONE>/.venv/bin/python3' '<ABSOLUTE_PATH_TO_CLONE>/scripts/mcp_server.py'{
"mcpServers": {
"misakanet": {
"command": "<ABSOLUTE_PATH_TO_CLONE>/.venv/bin/python3",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/scripts/mcp_server.py"
]
}
}
}{
"mcpServers": {
"misakanet": {
"command": "<ABSOLUTE_PATH_TO_CLONE>/.venv/bin/python3",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/scripts/mcp_server.py"
]
}
}
}{
"servers": {
"misakanet": {
"type": "stdio",
"command": "<ABSOLUTE_PATH_TO_CLONE>/.venv/bin/python3",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/scripts/mcp_server.py"
]
}
}
}[mcp_servers.misakanet]
command = "<ABSOLUTE_PATH_TO_CLONE>/.venv/bin/python3"
args = ["<ABSOLUTE_PATH_TO_CLONE>/scripts/mcp_server.py"]gemini mcp add --scope user misakanet '<ABSOLUTE_PATH_TO_CLONE>/.venv/bin/python3' -- '<ABSOLUTE_PATH_TO_CLONE>/scripts/mcp_server.py'MISAKANET_GAP_LOG |
Optional: File where searches with no match are logged. |
|---|---|
MISAKANET_USAGE_DISABLE_REMOTE |
Optional: Set to 1 to keep usage reports from being sent to the project. |
MisakaNet keeps a corpus of failure lessons. Each is a Markdown file in its GitHub repository that records an error, why it happened, the fix and how the fix was checked, and each carries an evidence level from E0 (an intake nobody has reviewed) up to E4 (seen reused by two or more separate clients). An agent that hits an error sends the error text and gets back the closest lessons, ranked by BM25 keyword scoring. On the hosted endpoint a semantic fallback with embeddings kicks in only when BM25 finds nothing. If there is still no match, the reply is no_match plus an intake the agent can file so the gap turns into a lesson later.
You can reach it two ways. The hosted endpoint at https://misakanet.org/mcp takes reads without an account and offers 8 tools. The local stdio server comes from PyPI (`python3 -m misakanet.server`) or a clone (`scripts/mcp_server.py`) and registers 11 tools, five misaka:// resources and three prompts. The three extra tools are misakanet_submit_usage, misakanet_usage_status and misakanet_memory_context, and they work against the local checkout. Write tools hand an intake or a full lesson over for review instead of publishing it, and misakanet_me_inbox lets the agent come back later to see whether anyone answered.
Most of the install routes the README lists don't install this server at all. The npm package called misakanet is a plugin for DeepSeek Harness and Codex. Claude Code can add the repository as a plugin marketplace, and Cindy has its own plugin with the id misakanet. The npm installer @misaka-net/misakanet-setup writes the hosted endpoint into each client's config, and for DeepSeek Harness it writes only the rules file, so the plugin still has to be added by hand. Per the comments in pyproject.toml, the PyPI package's search engine reads `lessons/` from a repository checkout and the package has no way to fetch the corpus remotely.
| To run it yourself | Python 3.11+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| Also |
|
Hosted: any MCP client that speaks streamable HTTP, with no account needed to read. Local: the PyPI package brings the code but no lessons, so clone the repository for its lessons/ folder. Writing lessons through misakanet_write_lesson needs a token from misakanet_register.
It only knows the failures that have been indexed. Local search is BM25 keyword matching, so a query phrased as a goal rather than with concrete error words finds little. The hosted endpoint adds an embedding fallback only when BM25 returns nothing. The hosted endpoint answers tools/list and tools/call only, so resources and prompts are local-only (docs/mcp.md). A pip install without a checkout has no lessons to search: per pyproject.toml the engine reads `lessons/` from a checkout, and without an index the search tool returns an 'index not built' error. Lessons are community-contributed and marked indexed, not verified. Hosted reads have a per-address burst limit.
Suits developers running coding agents who keep hitting the same environment and tooling errors (Docker, WSL, CI, pip, MCP setup) and want the agent to check known fixes first. The hosted endpoint is the quick route, with nothing to install and no sign-in for reads. Pick the local clone if you want resources, prompts and the memory-context tool, or to search offline. It is a poor fit for storing your own project notes or general cross-session memory, which its makers say it is not built for, and for teams that cannot run community-written commands without review.
7 only read, 4 change things. A ? marks an optional parameter.
misakanet_searchquery: stringdomain?: stringtop?: integerexplain?: booleandetail?: enumkind?: enumbm25_weight?: numbermetadata_weight?: numberbaseline_weight?: numberinclude_stale?: booleanmisakanet_get_lessonpath?: stringid?: stringmisakanet_submit_usage changeslesson_id: stringtool?: stringoutcome?: stringmisakanet_submit_intake changeskind?: enumproblem: stringerror?: stringwhat_tried?: stringfix?: stringverification?: stringmatched_lesson_id?: stringsource?: stringmisakanet_write_lesson changestitle: stringdomain: stringproblem: stringroot_cause: stringfix: stringverification?: stringtags?: arraytoken?: stringsource?: stringmisakanet_preflightintent: stringcontext?: stringmisakanet_usage_statususer?: stringmisakanet_register changesagent_type?: stringclient_id?: stringmisakanet_memory_contexttask: stringdomain?: stringtop_n?: integermisakanet_me_eventslesson_id?: stringlesson_path?: stringmisakanet_me_inboxintake_id?: stringdedup_key?: stringmisaka://lessons/indexmisaka://protocol/overviewmisaka://docs/readmemisaka://docs/faqmisaka://docs/changelogsearch_lessontriage_failurerelease_audit