Local, LLM-free memory for AI agents. A single offline Rust binary — deterministic and auditable — that learns from use, forgets the irrelevant, and strengthens what matters. No cloud, no API keys.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · http
verified
reported
listed in the official MCP registry counts 0 tools · 0 res
· 0 prompts
permission surface via code analysis
No tools enumerated yet for this server.
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 5a8ea85 · analyzer v30 · 3d ago
skills & prompt files 3
danger signals1
- credential in logs credential in log varun29ankuS-shodh-memory-5a8ea85/mcp-server/index.ts :202
console.error(`[shodh-memory] API key loaded from ${apiKeySource}.`);
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 400
filesystem 17
- fs varun29ankuS-shodh-memory-5a8ea85/hooks/memory-hook.ts :43
const fs = require("fs"); - fs varun29ankuS-shodh-memory-5a8ea85/mcp-server/api-key-store.ts :24
import * as fs from "fs"; - fs varun29ankuS-shodh-memory-5a8ea85/mcp-server/backend-lifecycle.ts :22
import * as fs from "fs"; - fs varun29ankuS-shodh-memory-5a8ea85/mcp-server/index.ts :29
import * as fs from "fs"; - fs (weak) varun29ankuS-shodh-memory-5a8ea85/mcp-server/scripts/postinstall.cjs :9
const fs = require('fs'); - fs (weak) varun29ankuS-shodh-memory-5a8ea85/mcp-server/scripts/setup-hooks.cjs :14
const fs = require('fs'); - fs (weak) varun29ankuS-shodh-memory-5a8ea85/mcp-server/tests/api-key-store.test.ts :2
import * as fs from "fs"; - fs (weak) varun29ankuS-shodh-memory-5a8ea85/mcp-server/tests/backend-lifecycle.test.ts :2
import * as fs from "fs"; - fs (weak) varun29ankuS-shodh-memory-5a8ea85/mcp-server/tests/ipc-client.test.ts :2
import { existsSync, rmSync } from "node:fs"; - fs varun29ankuS-shodh-memory-5a8ea85/mcp-server/version.ts :1
import fs from "fs"; - fs varun29ankuS-shodh-memory-5a8ea85/seat/eval/lessons-ab.mjs :38
import { copyFileSync, existsSync, mkdirSync, mkdtempSync, rmSync } from "node:fs"; - fs varun29ankuS-shodh-memory-5a8ea85/seat/eval/memory-guidance-ab.mjs :86
import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs"; - fs varun29ankuS-shodh-memory-5a8ea85/seat/eval/run-e2e.mjs :17
import { mkdtempSync, rmSync } from "node:fs"; - fs varun29ankuS-shodh-memory-5a8ea85/seat/src/credentials.ts :22
import * as fs from "node:fs"; - fs varun29ankuS-shodh-memory-5a8ea85/seat/src/index.ts :5
import * as fsp from "node:fs/promises"; - fs varun29ankuS-shodh-memory-5a8ea85/seat/src/ledger.ts :21
import * as fs from "node:fs"; - fs varun29ankuS-shodh-memory-5a8ea85/seat/src/store.ts :29
import * as fs from "node:fs";
shell / exec 8
- shell varun29ankuS-shodh-memory-5a8ea85/mcp-server/index.ts :27
import { spawn, ChildProcess } from "child_process"; - shell varun29ankuS-shodh-memory-5a8ea85/mcp-server/ipc-client.ts :2
import { spawn, type ChildProcessWithoutNullStreams } from "node:child_process"; - shell (weak) varun29ankuS-shodh-memory-5a8ea85/mcp-server/scripts/postinstall.cjs :12
const { execFileSync } = require('child_process'); - shell (weak) varun29ankuS-shodh-memory-5a8ea85/mcp-server/scripts/setup-hooks.cjs :17
const { execSync } = require('child_process'); - shell (weak) varun29ankuS-shodh-memory-5a8ea85/mcp-server/tests/backend-lifecycle.test.ts :5
import { spawnSync } from "child_process"; - shell varun29ankuS-shodh-memory-5a8ea85/seat/eval/lessons-ab.mjs :37
import { spawn } from "node:child_process"; - shell varun29ankuS-shodh-memory-5a8ea85/seat/eval/memory-guidance-ab.mjs :85
import { spawn } from "node:child_process"; - shell varun29ankuS-shodh-memory-5a8ea85/seat/eval/run-e2e.mjs :16
import { spawn } from "node:child_process";
network 17
- net varun29ankuS-shodh-memory-5a8ea85/demo/spatial-map/seed.js :5
const http = require('http'); - net varun29ankuS-shodh-memory-5a8ea85/front/ui/src/lib/api/client.ts :51
res = await fetch(path, { - net varun29ankuS-shodh-memory-5a8ea85/front/ui/src/lib/seat/client.ts :66
const res = await fetch(`/seat/v1/providers/${encodeURIComponent(providerId)}/key`, { - net varun29ankuS-shodh-memory-5a8ea85/hooks/memory-hook.ts :263
const response = await fetch(`${SHODH_API_URL}${endpoint}`, { - net varun29ankuS-shodh-memory-5a8ea85/mcp-server/index.ts :680
const response = await fetch(`${API_URL}${endpoint}`, { - net varun29ankuS-shodh-memory-5a8ea85/mcp-server/ipc-client.ts :3
import { createConnection, type Socket } from "node:net"; - net (weak) varun29ankuS-shodh-memory-5a8ea85/mcp-server/scripts/postinstall.cjs :11
const https = require('https'); - net (weak) varun29ankuS-shodh-memory-5a8ea85/mcp-server/scripts/setup-hooks.cjs :116
const https = require('https'); - net (weak) varun29ankuS-shodh-memory-5a8ea85/mcp-server/tests/ipc-client.test.ts :3
import { createServer, type Server, type Socket } from "node:net"; - net varun29ankuS-shodh-memory-5a8ea85/seat/eval/fixture-model.mjs :24
import { createServer } from "node:http"; - net varun29ankuS-shodh-memory-5a8ea85/seat/eval/lessons-ab.mjs :119
const res = await fetch(url, { signal: AbortSignal.timeout(2000) }); - net varun29ankuS-shodh-memory-5a8ea85/seat/eval/memory-guidance-ab.mjs :436
const res = await fetch(url, { signal: AbortSignal.timeout(2000) }); - net varun29ankuS-shodh-memory-5a8ea85/seat/eval/run-e2e.mjs :84
const res = await fetch(url, { headers, signal: AbortSignal.timeout(2000) }); - net varun29ankuS-shodh-memory-5a8ea85/seat/eval/seed-demo-corpus.mjs :148
const res = await fetch(`${BASE}${path}`, { method: "POST", headers: H, body: JSON.stringify(body) }); - net varun29ankuS-shodh-memory-5a8ea85/seat/src/backend.ts :253
response = await fetch(url, { - net varun29ankuS-shodh-memory-5a8ea85/seat/src/models-registry.ts :120
const response = await fetch(`${options.baseUrl}/models`, { - net varun29ankuS-shodh-memory-5a8ea85/seat/src/server.ts :32
import * as http from "node:http";
secrets 4
- secrets (weak) varun29ankuS-shodh-memory-5a8ea85/front/ui/vite.config.ts :17
const API_KEY = process.env.SHODH_API_KEY ?? ""; - secrets varun29ankuS-shodh-memory-5a8ea85/hooks/memory-hook.ts :40
if (process.env.SHODH_API_KEY) { - secrets varun29ankuS-shodh-memory-5a8ea85/mcp-server/index.ts :120
if (process.env.SHODH_API_KEY) { - secrets varun29ankuS-shodh-memory-5a8ea85/seat/eval/seed-demo-corpus.mjs :142
const KEY = process.env.SHODH_API_KEY ?? process.env.SHODH_API_KEYS?.split(",")[0]?.trim();
install hooks 2
- postinstall varun29ankuS-shodh-memory-5a8ea85/mcp-server/package.json :18
node scripts/postinstall.cjs - prepublishOnly (suspicious) varun29ankuS-shodh-memory-5a8ea85/mcp-server/package.json :19
npm run build && node -e "require('fs').mkdirSync('hooks',{recursive:true});require('fs').copyFileSync('../hooks/memory-hook.ts','hooks/memory-hook.ts')"
declared dependencies 71
- @modelcontextprotocol/sdk@^1.24.0
- rmcp@1.4
- @vitest/coverage-v8@^2.1.9
- vitest@^2.1.8
- spacy-rusty@*
- clap@4.5
- mimalloc@0.1
- anyhow@1.0
- thiserror@2.0
- dotenvy@0.15
- tokio@1.48
- tokio-stream@0.1
- tokio-util@0.7
- futures@0.3
- axum@0.8
- tower@0.5
- tower-http@0.6
- tower_governor@0.8
- serde@1.0
- serde_json@1.0
- form_urlencoded@1
- postcard@1
- bincode@2
- bincode1@1.3
- rmp-serde@1.3
- lz4@1.28
- parking_lot@0.12
- dashmap@6.1
- moka@0.12
- uuid@1.19
- chrono@0.4
- lru@0.16.3
- regex@1.12
- rust-stemmers@1.2
- dirs@6.0
- dateparser@0.2
- glob@0.3
- yake-rust@1.0
- tracing@0.1
- tracing-subscriber@0.3
- prometheus@0.14
- tracing-opentelemetry@0.33
- opentelemetry@0.32
- opentelemetry-otlp@0.32
- opentelemetry_sdk@0.32.1
- ordered-float@5.0
- memmap2@0.9
- rand@0.8
- ort@2.0.0-rc.11
- tokenizers@0.21
- ndarray@0.16
- petgraph@0.8
- tantivy@0.26
- bloomfilter@3.0
- base64@0.22
- sha2@0.10
- hex@0.4
- aes-gcm@0.10
- hmac@0.12
- subtle@2.6
- reqwest@0.12
- ureq@3.0
- zip@7.0
- flate2@1.1
- tar@0.4
- pyo3@0.29
- numpy@0.29
- zenoh@1.1
- criterion@0.5
- http-body-util@0.1
- tempfile@3.24
perm:untrusted 2
- untrusted varun29ankuS-shodh-memory-5a8ea85/seat/eval/memory-guidance-ab.mjs :730
const health = await (await fetch(`${base}/healthz`)).json(); - untrusted varun29ankuS-shodh-memory-5a8ea85/seat/eval/run-e2e.mjs :183
const models = await (await fetch(`${seatBase()}/v1/models?refresh=1`)).json();