{"name":"io.github.oleksiijko/pmb-ai","slug":"oleksiijko-pmb-ai","title":"PMB AI","description":"Local-first persistent memory for AI coding agents.","url":"https://mcp.market/server/oleksiijko-pmb-ai","rating":null,"grade":"C","score":66,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":49,"stars":280,"forks":26,"downloads_week":131,"last_push_at":"2026-09-23T18:04:47.000Z","license":"Apache-2.0"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/oleksiijko/pmb","website":null,"version":"1.1.0","remotes":[],"packages":[{"registryType":"pypi","identifier":"pmb-ai","version":"1.1.0","transport":{"type":"stdio"}}],"tools":[{"name":"apply_daily_decay","description":"Apply forgetting curve to all events.","write_action":false,"price_micros":0,"input_schema":null},{"name":"arc_detail","description":"Get full detail of one arc: title, summary, member events.","write_action":false,"price_micros":0,"input_schema":null},{"name":"auto_resolve_conflicts","description":"Auto-archive obvious 'supersede' conflicts.","write_action":false,"price_micros":0,"input_schema":null},{"name":"chain_current","description":"Latest milestone of a chain - the 'current state'. Use to answer 'how many X do we have now?' / 'what's the latest?'.","write_action":false,"price_micros":0,"input_schema":null},{"name":"chain_history","description":"Full chronological history of a state-chain. Reconstructs the evolution: state_1 → state_2 → ... → state_N with the reason at each step.","write_action":false,"price_micros":0,"input_schema":null},{"name":"clear_predictive_cache","description":"Clear all entries from the predictive cache.","write_action":false,"price_micros":0,"input_schema":null},{"name":"cluster_into_arcs","description":"PMB v2 Phase 3: LLM groups events into narrative arcs (story threads). Arcs help recall on 'tell me about X' style queries.","write_action":false,"price_micros":0,"input_schema":null},{"name":"cold_stats","description":"Get info about cold storage (archived events database).","write_action":false,"price_micros":0,"input_schema":null},{"name":"compact_storage","description":"Compact storage: move old archived events to cold storage and VACUUM.","write_action":false,"price_micros":0,"input_schema":null},{"name":"consolidate_recent","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"dedupe_list_pending","description":"List borderline duplicate pairs awaiting verdict (L2.5). These are pairs that scored cosine 0.80-0.92 - too risky to auto-merge, but worth review.","write_action":false,"price_micros":0,"input_schema":null},{"name":"dedupe_run_pending","description":"Drain the borderline pair queue via LLM verify. backend: 'auto' (try Ollama then Anthropic) | 'ollama' | 'anthropic'","write_action":true,"price_micros":0,"input_schema":null},{"name":"dedupe_sweep","description":"Improvement U: one-shot dedup over all active events.","write_action":false,"price_micros":0,"input_schema":null},{"name":"dedupe_undo","description":"Restore events archived by previous dedup runs. Reversible.","write_action":false,"price_micros":0,"input_schema":null},{"name":"detect_conflicts","description":"Find conflicting facts between different timestamps.","write_action":false,"price_micros":0,"input_schema":null},{"name":"extract_facts","description":"Improvement D (mem0-style): LLM extracts atomic facts from recent events. Each fact becomes a new searchable event.","write_action":false,"price_micros":0,"input_schema":null},{"name":"feedback_summary","description":"Aggregate user recall feedback. Returns useful_rate and top flagged-wrong events. This is the real-user health metric.","write_action":false,"price_micros":0,"input_schema":null},{"name":"file_correlations","description":"Find files that are often modified together with the given file.","write_action":false,"price_micros":0,"input_schema":null},{"name":"file_history","description":"Get commit history for a specific file.","write_action":false,"price_micros":0,"input_schema":null},{"name":"find_lessons","description":"Pull procedural lessons (project rules / gotchas) relevant to a topic. Use this BEFORE making a project-shaping choice - picking a library, setting up tooling, choosing an approach - to see what worked or failed before.","write_action":false,"price_micros":0,"input_schema":null},{"name":"forget","description":"Archive a memory. Not deleted, can be restored.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_subfacts","description":"Return all subfacts linked to a parent event (Improvement P).","write_action":false,"price_micros":0,"input_schema":null},{"name":"graph_neighbors","description":"Co-occurrence neighbors of an entity. Useful for 'what relates to X'.","write_action":false,"price_micros":0,"input_schema":null},{"name":"graph_stats","description":"Counts of entities and edges in this workspace's association graph.","write_action":false,"price_micros":0,"input_schema":null},{"name":"graph_top_entities","description":"Most-mentioned entities. kind = 'file' | 'tech' | 'concept' or None.","write_action":false,"price_micros":0,"input_schema":null},{"name":"health_trend","description":"Get trend of self-test accuracy over time.","write_action":false,"price_micros":0,"input_schema":null},{"name":"index_pdf","description":"📄 Extract text from a PDF and persist it as searchable memory.","write_action":false,"price_micros":0,"input_schema":null},{"name":"index_project","description":"📂 Index a code project's structure - per-file symbols, imports, languages - so the agent can recall things like \"where is the auth flow\", \"which files import LanceDB\", \"show me the recall pipeline\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"lesson_impact","description":"📊 Earned Memory: which lessons actually HELP outcomes (not just which were read or followed). Joins each surfaced lesson to the OUTCOME of the turn it was active in - tests pass/fail, red->green, build, deploy (no LLM) - and returns per-lesson success_rate, lift vs the no-lesson baseline, and churn. Use to spot dead-weight or HARMFUL rules (negative lift). Worst lift first.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_arcs","description":"List narrative arcs in the current workspace.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_goals","description":"List goals (optionally filter by status).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_recent","description":"List the most recent active events in the workspace.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mark_lesson_followed","description":"Confirm whether a previously surfaced lesson actually changed your behaviour on the current task. Call this AFTER acting on a lesson - the self-improvement loop uses this signal to identify useful vs dead lessons.","write_action":false,"price_micros":0,"input_schema":null},{"name":"overview","description":"Get a structured OVERVIEW of everything memory knows about a topic.","write_action":false,"price_micros":0,"input_schema":null},{"name":"pin","description":"Pin a memory: max importance, never auto-archived.","write_action":false,"price_micros":0,"input_schema":null},{"name":"precompute_predictive_cache","description":"Improvement F (PMB-unique): during sleep, LLM predicts likely questions and pre-runs recall. Future near-identical queries get instant (~3ms) responses via cosine match.","write_action":false,"price_micros":0,"input_schema":null},{"name":"prepare","description":"⭐⭐⭐ Call this ONCE at the START of any substantive user task.","write_action":false,"price_micros":0,"input_schema":null},{"name":"project_overview","description":"⭐ Use at the START of any project work - returns the FULL project context in ONE call, sourced from the entity graph (not recall):","write_action":false,"price_micros":0,"input_schema":null},{"name":"project_structure","description":"🗺️ Pull a project's STRUCTURE straight from memory - no filesystem scan.","write_action":false,"price_micros":0,"input_schema":null},{"name":"recall","description":"Search PMB long-term memory. CALL THIS FIRST when user asks about: - past decisions (why did we choose X, what port did we set) - project history (when did we, what happened with) - people (who is X, what did Alice say) - any fact the user might have recorded earlier","write_action":false,"price_micros":0,"input_schema":null},{"name":"recall_deep","description":"DEEP recall - explicitly opt into the slow, thorough path.","write_action":false,"price_micros":0,"input_schema":null},{"name":"recall_exploration","description":"💡 BEFORE re-exploring the codebase, check if a PAST session already figured this out. Returns memoized conclusions matching `intent`, each with a freshness check: • `fresh: true` -> every source file is unchanged, trust the conclusion and skip the re-reading entirely. • `fresh: false` -> `stale_files` lists what changed since; re-check ONLY those, reuse the rest.","write_action":false,"price_micros":0,"input_schema":null},{"name":"recall_smart","description":"Auto-escalating recall, but FAST and deadline-bounded. Starts with a normal local recall; if confidence is low it escalates only with cheap local steps (wider pool + a local rerank when that model is already warm). It NEVER blocks on an LLM / Claude CLI on this path and always returns within `recall.smart_deadline_ms` (default 15s), returning the best result found so far if the budget is hit.","write_action":false,"price_micros":0,"input_schema":null},{"name":"recent_activity","description":"Improvement Q: working memory dump - instant, no search.","write_action":false,"price_micros":0,"input_schema":null},{"name":"record_activity","description":"Improvement Q: log a working-memory activity.","write_action":false,"price_micros":0,"input_schema":null},{"name":"record_batch","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"record_code","description":"Record code content. For Python, AST entities (functions, classes, imports) are auto-extracted into the graph layer (Improvement J).","write_action":false,"price_micros":0,"input_schema":null},{"name":"record_exploration","description":"💡 AFTER researching something in the codebase (reading/grepping several files to reach a conclusion), memoize it so a FUTURE session can reuse the conclusion instead of re-deriving it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"record_fact","description":"STORE a fact for long-term recall. CALL THIS PROACTIVELY whenever the user mentions:","write_action":false,"price_micros":0,"input_schema":null},{"name":"record_fact_tree","description":"Improvement P: store a main fact + multiple linked sub-facts in ONE call.","write_action":false,"price_micros":0,"input_schema":null},{"name":"record_goal","description":"Improvement R: create a goal/intent (12-th semantic layer).","write_action":false,"price_micros":0,"input_schema":null},{"name":"record_image","description":"Record an image (screenshot/diagram) in memory (Improvement J).","write_action":false,"price_micros":0,"input_schema":null},{"name":"record_keyed_fact","description":"⭐ Use for SINGULAR personal attributes that CHANGE over time.","write_action":false,"price_micros":0,"input_schema":null},{"name":"record_milestone","description":"Improvement R: record a milestone in a named state-chain.","write_action":false,"price_micros":0,"input_schema":null},{"name":"record_recall_feedback","description":"Record real recall feedback for an event.","write_action":false,"price_micros":0,"input_schema":null},{"name":"reflect_batch","description":"PMB v2 sleep operation: LLM reflects on recent un-reflected events.","write_action":false,"price_micros":0,"input_schema":null},{"name":"remember","description":"Store a Q/A interaction in memory.","write_action":false,"price_micros":0,"input_schema":null},{"name":"run_self_test","description":"Quantify memory health: system asks itself questions from old memories.","write_action":true,"price_micros":0,"input_schema":null},{"name":"search_images_by_text","description":"Cross-modal image search. Encodes the query via CLIP text encoder and finds nearest stored image embeddings.","write_action":false,"price_micros":0,"input_schema":null},{"name":"session_brief","description":"Re-orient in a long session: a digest of what was decided / done / learned so far THIS session.","write_action":false,"price_micros":0,"input_schema":null},{"name":"session_current","description":"Get current active session info (or None).","write_action":false,"price_micros":0,"input_schema":null},{"name":"session_end","description":"End the current session. Returns the closed session's info.","write_action":false,"price_micros":0,"input_schema":null},{"name":"session_start","description":"Start a new memory session. Used to group related events.","write_action":false,"price_micros":0,"input_schema":null},{"name":"session_timeline","description":"Chronological dump of CURRENT session events. Use for post-mortem 'summarize this session' style questions.","write_action":false,"price_micros":0,"input_schema":null},{"name":"stats","description":"Get workspace and memory statistics.","write_action":false,"price_micros":0,"input_schema":null},{"name":"sync_git","description":"Capture recent git commits into memory.","write_action":false,"price_micros":0,"input_schema":null},{"name":"update_goal","description":"Update goal status / progress. Creates a goal_update event so the full history of changes is preserved.","write_action":true,"price_micros":0,"input_schema":null},{"name":"what_just_happened","description":"Quick: last N events of any type from current session. Use to answer 'what were we doing?' / 'recap of this session'. Instant, no search.","write_action":false,"price_micros":0,"input_schema":null},{"name":"workspace_info","description":"Identify the current PMB workspace.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":66,"grade":"C","scanned_at":"2026-09-26T16:35:03.026Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-26T16:35:02.989Z","components":{"code":{"score":8,"max":25,"notes":["172 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 3 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"exec.shell-concat","severity":"high","component":"code","title":"Shell command built from a string (injection risk)","evidence":"pmb_ai-1.1.0/src/pmb/cli/commands/config.py: …ad\" if os.name == \"nt\" else \"nano\") os.system(f'{editor} \"{path}\"') …"},{"id":"exec.eval","severity":"medium","component":"code","title":"eval / new Function used","evidence":"pmb_ai-1.1.0/src/pmb/config.py: …fault - and a real-workspace \" \"eval (June 8 2026) with the default MiniLM emb…"}],"inputs":{"packages":[{"registryType":"pypi","identifier":"pmb-ai","version":"1.1.0","found":true,"weeklyDownloads":131,"license":"Apache-2.0","dependencyCount":23,"publishedAt":"2026-06-26T00:16:00.250959Z","repositoryUrl":"https://github.com/oleksiijko/pmb"}],"repo":{"found":true,"owner":"oleksiijko","repo":"pmb","archived":false,"pushedAt":"2026-09-23T18:04:47Z","stars":280,"forks":26,"openIssues":4,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/63553329?v=4","ownerCreatedAt":"2020-04-12T16:14:40Z","license":"Apache-2.0"},"icon":{"url":"https://avatars.githubusercontent.com/u/63553329?v=4&s=128","source":"github"},"presence":{"stars":280,"forks":26,"downloadsWeek":131,"license":"Apache-2.0","lastPushAt":"2026-09-23T18:04:47.000Z","score":49}}}},"grade_history":[],"reviews":[]}