{"name":"io.github.skynetcmd/m3-memory","slug":"skynetcmd-m3-memory","title":"M3 Memory","description":"Local-first memory — 100+ tools, 99.2% LongMemEval-S retrieval@10, hybrid search, GDPR, no cloud.","url":"https://mcp.market/server/skynetcmd-m3-memory","rating":null,"grade":"A","score":92,"certified":false,"status":"active","category":"search","tags":["search"],"presence":{"score":48,"stars":25,"forks":3,"downloads_week":1742,"last_push_at":"2026-09-19T12:27:59.000Z","license":"Apache-2.0"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/skynetcmd/m3-memory","website":"https://github.com/skynetcmd/m3-memory","version":"2026.9.19.0","remotes":[],"packages":[{"registryType":"pypi","identifier":"m3-memory","version":"2026.9.19.0","runtimeHint":"python","transport":{"type":"stdio"}}],"tools":[{"name":"files_corpus_create","description":"Register a new corpus with optional default overrides. `default=True` marks this corpus as the installation's default (clears the flag on any prior default in the same transaction).","write_action":true,"price_micros":0,"input_schema":null},{"name":"files_corpus_delete","description":"Delete a corpus's settings row. Cascade=True also deletes its file_nodes and all dependent rows — DESTRUCTIVE. Without cascade, refuses when the corpus has file_nodes.","write_action":true,"price_micros":0,"input_schema":null},{"name":"files_corpus_get","description":"Fetch a single corpus's settings + counts.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_corpus_list","description":"Enumerate corpora with row counts.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_corpus_set","description":"Update settings for an existing corpus. None args are no-ops. Creates the corpus_settings row if absent.","write_action":true,"price_micros":0,"input_schema":null},{"name":"files_dedup","description":"Scan leaf embeddings for near-duplicates. Detection only — pairs land in semantic_dedup_candidates for human review.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_dedup_list","description":"List near-duplicate candidate pairs with text snippets and paths.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_dedup_review","description":"Record a review decision: 'kept' | 'merged' | 'ignored'.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_entity_coalesce","description":"Detect provisional-entity coalescing candidates (quarantine noise + flag near-duplicate entities). Detection only — never merges, never auto-applies; candidates land in entity_coalesce_candidates for review. dry_run=True estimates without writing or embedding.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_entity_coalesce_apply","description":"Apply the reversible same_as/cluster overlay. Union of explicit candidate_uuids (reviewed 'merge' or 'unapplied' tombstone) and — if include_auto_merge — the LATEST run's 'merge' band (or resolution_run). Members are never deleted; reverse with files_entity_coalesce_unapply. WRITES the core graph: a real apply MUST pass confirm=True; dry_run=True previews without writing.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_entity_coalesce_list","description":"List entity-coalescing candidate pairs (name + score + band).","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_entity_coalesce_review","description":"Record review decisions in BULK: pass a list of {uuid, action} where action is 'merge' | 'related' | 'reject' | 'defer'. Records intent only; materialize decisions with files_entity_coalesce_apply.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_entity_coalesce_unapply","description":"Reverse one coalescence cluster (drop edges, clear flags, strip aliases, tombstone the candidate so auto-merge won't resurrect it). Members are never deleted; re-apply via files_entity_coalesce_apply with candidate_uuids.","write_action":true,"price_micros":0,"input_schema":null},{"name":"files_extract_pending","description":"Drain leaves with extraction_status='pending' through the LLM extractor. Used after a queue-mode ingest. Safe to call repeatedly.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_get","description":"Fetch one record by UUID. Tries file_nodes then leaves.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_health","description":"DB integrity + FTS5 sync check. Set rebuild=True to fix drift.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_index","description":"Return file-level summaries for triage. Cheap-first retrieval — no leaf content. Use BEFORE files_search.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_ingest","description":"Walk a directory and ingest supported files into files.db. Idempotent: same content_sha256 → no-op; changed content → new file_node version supersedes prior. Use extract_mode to opt into fact extraction; use original_path (or a <path>.m3meta.json sidecar) to point search results at a source-of-truth file when the ingested file is a conversion.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_link_rename","description":"Re-point an existing file_node at a new path (rename / move). NOT a supersession — content stays identical. Use this only when staleness review surfaces a rename candidate.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_promotable","description":"List top promotion candidates by usage-weighted heuristic score. Suggestion-only; use files_promote to actually ascend any.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_promote","description":"Promote (ascend) a fact / leaf / file_summary from files.db to memory.db. Source stays untouched; copy lands in memory.db with a metadata back-pointer. Idempotent.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_promotion_list","description":"List existing promotions. source_superseded=True surfaces promotions whose source file has since been superseded — candidates for review.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_search","description":"Hybrid FTS5 + vector search over leaves. Default: current versions only. Set include_history=True for time-travel.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_staleness_review","description":"Compare filesystem against files.db. Surfaces stale, touched-only, missing, new, failed-extraction, drifted-promotion files, and rename candidates (missing files whose content reappeared elsewhere on disk). Report-only: does not modify anything.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_stats","description":"Corpus-level counters: file_nodes, leaves, embed coverage.","write_action":false,"price_micros":0,"input_schema":null},{"name":"files_watch_once","description":"Single-pass staleness check + notification dispatch. Suitable for cron / scheduled runners. Notifications are emitted via the memory.db notifications inbox; cooldown suppresses duplicates.","write_action":false,"price_micros":0,"input_schema":null},{"name":"forget","description":"Delete a memory by its id (from a prior ``recall`` result).","write_action":true,"price_micros":0,"input_schema":null},{"name":"recall","description":"Search long-term memory for facts relevant to ``query``.","write_action":false,"price_micros":0,"input_schema":null},{"name":"remember","description":"Save a fact to long-term memory so it can be recalled in future turns.","write_action":false,"price_micros":0,"input_schema":null},{"name":"save_handoff","description":"Saves the current AI session state for another agent to resume.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":92,"grade":"A","scanned_at":"2026-09-19T21:08:38.493Z","report":{"scannerVersion":"0.1.8","scannedAt":"2026-09-19T21:08:38.231Z","components":{"code":{"score":25,"max":25,"notes":["362 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 0 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"m3-memory","version":"2026.9.19.0","found":true,"weeklyDownloads":1742,"license":"Apache-2.0","dependencyCount":50,"publishedAt":"2026-09-19T11:58:20.130284Z","repositoryUrl":"https://github.com/skynetcmd/m3-memory"}],"repo":{"found":true,"owner":"skynetcmd","repo":"m3-memory","archived":false,"pushedAt":"2026-09-19T12:27:59Z","stars":25,"forks":3,"openIssues":1,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/158001261?v=4","ownerCreatedAt":"2024-01-28T23:55:07Z","license":"Apache-2.0"},"icon":{"url":null,"source":"none"},"presence":{"stars":25,"forks":3,"downloadsWeek":1742,"license":"Apache-2.0","lastPushAt":"2026-09-19T12:27:59.000Z","score":48}}}},"grade_history":[{"kind":"restore","fromGrade":"D","toGrade":"A","reason":"score 92","createdAt":"2026-09-19T21:08:39.216Z"},{"kind":"restore","fromGrade":"F","toGrade":"D","reason":"score 54: Whole environment serialized (possible credential exfil); Base64 decoded then executed; curl | sh in a script","createdAt":"2026-09-19T18:55:47.271Z"}],"reviews":[]}