{"name":"io.github.hjqcan/goodmemory","slug":"hjqcan-goodmemory","title":"GoodMemory","description":"Durable user/project memory for MCP clients: recall context and remember selected facts.","url":"https://mcp.market/server/hjqcan-goodmemory","rating":null,"grade":"A","score":85,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":42,"stars":20,"forks":2,"downloads_week":232,"last_push_at":"2026-10-20T03:50:24.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/hjqcan/GoodMemory","website":"https://github.com/hjqcan/GoodMemory#readme","version":"0.7.5","remotes":[],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"goodmemory","version":"0.7.5","runtimeHint":"npx","transport":{"type":"stdio"},"packageArguments":[{"value":"mcp","type":"positional"},{"value":"serve","type":"positional"},{"description":"Run the standalone read-only MCP server without an installed host.","type":"named","name":"--standalone"},{"description":"Stable GoodMemory user id that scopes this client's memory.","isRequired":true,"value":"{user_id}","variables":{"user_id":{"description":"Your stable GoodMemory user id.","isRequired":true,"format":"string"}},"type":"named","name":"--user-id"}]}],"tools":[{"name":"goodmemory_get_context","description":"Fetch a compact memory context fragment for a specific question about this workspace. Call it when hook-injected context is missing or insufficient, or when you need memory for a different question than the current prompt.","write_action":false,"price_micros":0,"input_schema":null},{"name":"goodmemory_get_records","description":"Advanced recall. Use this for progressive GoodMemory recall after search_index or timeline returns recordRefs that need detail.","write_action":false,"price_micros":0,"input_schema":null},{"name":"goodmemory_inspect_memory","description":"Diagnostic (beyond the primary goodmemory_get_context / goodmemory_remember tools). Use this when you need a read-only snapshot of durable and runtime GoodMemory state for the current workspace.","write_action":false,"price_micros":0,"input_schema":null},{"name":"goodmemory_read_artifacts","description":"Diagnostic. Use this when you need the accepted host-adapter artifact projection for the current workspace.","write_action":false,"price_micros":0,"input_schema":null},{"name":"goodmemory_remember","description":"Use this to persist a memory-worthy statement as durable GoodMemory. The write is governed: classification and dedupe may reject or merge it (see accepted/rejected and per-event outcomes in the result). If accepted is 0, the explanation field says why. Accepted installed-mode writes are also recorded in the writeback audit ledger; the result's auditEventId works with `goodmemory <host> writeback i","write_action":false,"price_micros":0,"input_schema":null},{"name":"goodmemory_search_index","description":"Advanced recall (past goodmemory_get_context). Progressive GoodMemory recall step 1: fetch a compact recordRef index for a query, then call goodmemory_get_records for detail. Prefer this over goodmemory_get_context when you need specific records rather than a rendered summary.","write_action":false,"price_micros":0,"input_schema":null},{"name":"goodmemory_stats","description":"Diagnostic. Record counts and runtime metadata (embedding/retrieval status via the `retrieval` field) for the current GoodMemory scope. Call it to check whether memory exists here before assuming an empty store.","write_action":false,"price_micros":0,"input_schema":null},{"name":"goodmemory_timeline","description":"Advanced recall. Use this for progressive GoodMemory recall when you need compact chronological context before drilling into recordRefs.","write_action":false,"price_micros":0,"input_schema":null},{"name":"goodmemory_trace_recall","description":"Diagnostic. Explain a recall: routing, hits, per-candidate scores, and suppression reasons. Call it when a memory that should exist did not surface, or when a surfaced memory looks wrong.","write_action":false,"price_micros":0,"input_schema":null},{"name":"json","description":"Respond with a JSON object.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":85,"grade":"A","scanned_at":"2026-11-01T13:28:46.144Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-11-01T13:28:46.101Z","components":{"code":{"score":20,"max":25,"notes":["234 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 12 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"exec.eval","severity":"medium","component":"code","title":"eval / new Function used","evidence":"dist/chunk-3jepk63r.js: …ludes(\"Cloudflare\"))return!1;try{return new Function(\"\"),!0}catch($){return!1}});function f4(…"}],"inputs":{"packages":[{"registryType":"npm","identifier":"goodmemory","version":"0.7.5","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":8,"publishedAt":"2026-08-19T04:28:33.083Z","repositoryUrl":"git+https://github.com/hjqcan/GoodMemory.git","weeklyDownloads":232}],"repo":{"found":true,"owner":"hjqcan","repo":"GoodMemory","archived":false,"pushedAt":"2026-10-20T03:50:24Z","stars":20,"forks":2,"openIssues":2,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/4464006?v=4","ownerCreatedAt":"2013-05-18T10:23:25Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/4464006?v=4&s=128","source":"registry","width":128,"height":128},"presence":{"stars":20,"forks":2,"downloadsWeek":232,"license":"MIT","lastPushAt":"2026-10-20T03:50:24.000Z","score":42}}}},"grade_history":[],"reviews":[]}