<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: WAzion</title>
    <description>The latest articles on DEV Community by WAzion (@wazionapps).</description>
    <link>https://dev.to/wazionapps</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3806119%2F80ac35b5-d114-4266-b390-cf7641135ad0.png</url>
      <title>DEV Community: WAzion</title>
      <link>https://dev.to/wazionapps</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wazionapps"/>
    <language>en</language>
    <item>
      <title>NEXO Brain Hit 10K Monthly Downloads — Here's What Developers Are Using It For</title>
      <dc:creator>WAzion</dc:creator>
      <pubDate>Thu, 09 Apr 2026 19:58:02 +0000</pubDate>
      <link>https://dev.to/wazionapps/nexo-brain-hit-10k-monthly-downloads-heres-what-developers-are-using-it-for-gk9</link>
      <guid>https://dev.to/wazionapps/nexo-brain-hit-10k-monthly-downloads-heres-what-developers-are-using-it-for-gk9</guid>
      <description>&lt;h2&gt;
  
  
  10,000 downloads in 30 days
&lt;/h2&gt;

&lt;p&gt;NEXO Brain just crossed &lt;strong&gt;10,000 monthly downloads&lt;/strong&gt; on npm — all organic, zero paid promotion.&lt;/p&gt;

&lt;p&gt;For context: NEXO Brain is an open-source MCP server that gives AI coding agents (Claude Code, Codex, Gemini CLI) &lt;strong&gt;persistent cognitive memory&lt;/strong&gt;. Instead of forgetting everything between sessions, your agent remembers decisions, learns from corrections, and builds context over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why developers are adopting it
&lt;/h2&gt;

&lt;p&gt;The #1 pain point I hear: &lt;em&gt;"I keep re-explaining the same things to my AI agent every session."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;NEXO Brain solves this with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shared brain&lt;/strong&gt; — Memory persists across Claude Code, Codex, and any MCP client&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning from corrections&lt;/strong&gt; — Tell your agent once, it remembers forever&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;150+ tools&lt;/strong&gt; across 21 plugins (memory, scheduling, email, files, git...)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep Sleep&lt;/strong&gt; — Overnight analysis that consolidates learnings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-improving evolution&lt;/strong&gt; — Weekly cycles that refine the agent's behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick start (2 minutes)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx nexo-brain@latest init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The onboarding wizard sets up your &lt;code&gt;NEXO_HOME&lt;/code&gt;, configures the MCP server, and connects to Claude Code automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes it different from other memory solutions?
&lt;/h2&gt;

&lt;p&gt;Most "memory" MCP servers store key-value pairs. NEXO Brain implements a &lt;strong&gt;cognitive architecture&lt;/strong&gt; inspired by psychology:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Inspired by&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sensory buffer&lt;/td&gt;
&lt;td&gt;Atkinson-Shiffrin&lt;/td&gt;
&lt;td&gt;Captures raw session events&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Working memory&lt;/td&gt;
&lt;td&gt;Baddeley's model&lt;/td&gt;
&lt;td&gt;Active context for current task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Long-term memory&lt;/td&gt;
&lt;td&gt;Ebbinghaus curves&lt;/td&gt;
&lt;td&gt;Spaced retrieval with decay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trust scoring&lt;/td&gt;
&lt;td&gt;Bayesian updating&lt;/td&gt;
&lt;td&gt;Weighs reliability of memories&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This means memories don't just accumulate — they're &lt;strong&gt;weighted, consolidated, and pruned&lt;/strong&gt; like biological memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;10,082 downloads (March 10 - April 8, 2026)&lt;/li&gt;
&lt;li&gt;Organic growth from npm, MCP directories, and dev.to articles&lt;/li&gt;
&lt;li&gt;Peak: 1,281 downloads in a single day&lt;/li&gt;
&lt;li&gt;Zero marketing budget&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;code&gt;npm install nexo-brain&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/wazionapps/nexo" rel="noopener noreferrer"&gt;wazionapps/nexo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://nexo-brain.com" rel="noopener noreferrer"&gt;nexo-brain.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MIT licensed. Built by a solo developer who got tired of his AI forgetting everything.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you're using NEXO Brain, I'd love to hear about your setup. Drop a comment or open a discussion on GitHub.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>opensource</category>
      <category>mcp</category>
    </item>
    <item>
      <title>How I Applied Cognitive Psychology to Give AI Agents Real Memory</title>
      <dc:creator>WAzion</dc:creator>
      <pubDate>Sun, 29 Mar 2026 18:06:57 +0000</pubDate>
      <link>https://dev.to/wazionapps/how-i-applied-cognitive-psychology-to-give-ai-agents-real-memory-81c</link>
      <guid>https://dev.to/wazionapps/how-i-applied-cognitive-psychology-to-give-ai-agents-real-memory-81c</guid>
      <description>&lt;p&gt;Every time you close a Claude Code session, everything disappears. The assistant that just helped you debug a tricky production issue doesn't remember any of it tomorrow. It will make the same mistakes you corrected last week. It starts cold every single time.&lt;/p&gt;

&lt;p&gt;I spent six months building a fix. The result is &lt;strong&gt;NEXO Brain&lt;/strong&gt; — an open-source MCP server that gives AI agents a memory system modeled directly on how human memory actually works, using the Atkinson-Shiffrin model from cognitive psychology (1968).&lt;/p&gt;

&lt;p&gt;This article is a technical deep-dive into how that works, why the psychological model matters, and how to install it yourself.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Fundamental Problem with AI Memory Today
&lt;/h2&gt;

&lt;p&gt;Current approaches to AI memory fall into two categories:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Inject everything into the context window&lt;/strong&gt; — expensive, hits limits fast, and older information gets less attention as context grows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store and retrieve by keyword&lt;/strong&gt; — misses the point entirely; human memory doesn't work by keyword matching&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Neither approach handles the most important aspects of memory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Forgetting&lt;/strong&gt; (critical for not drowning in noise)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reinforcement&lt;/strong&gt; (important things get stronger, unused things fade)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Associative retrieval&lt;/strong&gt; (finding relevant memories by meaning, not words)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metacognition&lt;/strong&gt; (knowing what you know and checking it before acting)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Atkinson-Shiffrin Model Applied to AI
&lt;/h2&gt;

&lt;p&gt;The Atkinson-Shiffrin model (1968) describes human memory as a multi-store system with distinct stages and processes. Here's how I mapped each stage to a practical AI implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What you say and do
    │
    ├─→ Sensory Register (raw capture, 48h)
    │       │
    │       └─→ Attention filter: "Is this worth remembering?"
    │               │
    │               ↓
    ├─→ Short-Term Memory (7-day half-life)
    │       │
    │       ├─→ Used often? → Consolidate to Long-Term Memory
    │       └─→ Not accessed? → Gradually forgotten
    │
    └─→ Long-Term Memory (60-day half-life)
            │
            ├─→ Active: instantly searchable by meaning
            ├─→ Dormant: faded but recoverable
            └─→ Near-duplicates auto-merged to prevent clutter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This isn't a metaphor. The system literally implements each of these stages with distinct storage, decay rates, and transition logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 1: Sensory Register (48-hour raw capture)
&lt;/h3&gt;

&lt;p&gt;Every interaction creates raw memories in the Sensory Register — high-volume, short-lived (48h TTL). Most of it gets discarded. Only what passes the attention filter moves forward.&lt;/p&gt;

&lt;p&gt;The attention filter uses a simple but effective heuristic: &lt;strong&gt;does this change future behavior?&lt;/strong&gt; A preference stated explicitly, a mistake made and corrected, a decision with trade-offs — these pass. Generic conversation doesn't.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;should_consolidate_to_stm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Attention filter: does this memory warrant STM storage?&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;signals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;was_corrected&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;       &lt;span class="c1"&gt;# User corrected the AI
&lt;/span&gt;        &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;is_preference&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;        &lt;span class="c1"&gt;# User stated a preference
&lt;/span&gt;        &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;has_trade_off&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;        &lt;span class="c1"&gt;# Decision had alternatives
&lt;/span&gt;        &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;was_referenced_again&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;# Came up twice in session
&lt;/span&gt;    &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Stage 2: Short-Term Memory (7-day half-life)
&lt;/h3&gt;

&lt;p&gt;STM is the working layer — recent, fast-access, vector-indexed. Memories here have a 7-day half-life using the Ebbinghaus forgetting curve:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;strength(t) = initial_strength × e^(-decay_rate × t)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where &lt;code&gt;decay_rate = ln(2) / half_life_days&lt;/code&gt;. A memory accessed yesterday is strong. Not accessed for a week? It starts fading. Access it again and the clock resets with a higher baseline — this is &lt;strong&gt;rehearsal-based reinforcement&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The half-life isn't arbitrary. It reflects the empirical observation that information needs to be revisited within about a week to be remembered reliably. If you haven't needed something in 7 days, there's a good chance you won't need it at all.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 3: Long-Term Memory (60-day half-life)
&lt;/h3&gt;

&lt;p&gt;Memories promoted from STM enter LTM with a 60-day half-life. These are the persistent patterns — coding conventions you always use, recurring mistakes, established preferences, architectural decisions.&lt;/p&gt;

&lt;p&gt;LTM memories go through a nightly &lt;strong&gt;consolidation process&lt;/strong&gt; (runs at 03:00):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Decay&lt;/strong&gt; — strength scores updated using Ebbinghaus curves&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consolidation&lt;/strong&gt; — high-strength STM memories promoted to LTM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merge&lt;/strong&gt; — near-duplicate memories fused (cosine similarity &amp;gt; 0.92)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pruning&lt;/strong&gt; — memories below minimum strength threshold archived&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This runs as a macOS LaunchAgent while you sleep, which is not incidental — it's a direct parallel to how sleep consolidates human memories.&lt;/p&gt;




&lt;h2&gt;
  
  
  Semantic Search: Finding by Meaning, Not Words
&lt;/h2&gt;

&lt;p&gt;The search layer uses &lt;strong&gt;fastembed&lt;/strong&gt; with the BAAI/bge-small-en-v1.5 model (384 dimensions) for vector embeddings. Memories are indexed by their semantic content, not their text.&lt;/p&gt;

&lt;p&gt;Why this matters in practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search for "deploy problems" → finds a memory about "SSH timeout on production server"&lt;/li&gt;
&lt;li&gt;Search for "user prefers dark theme" → finds a memory about "always use dark backgrounds in UI"&lt;/li&gt;
&lt;li&gt;Search for "database migration" → finds memories about Prisma schema changes, even if they never used the word "migration"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The retrieval pipeline looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;retrieve_memories&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;RAG retrieval across all memory stores.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;query_vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Search across STM + LTM with decay-weighted scores
&lt;/span&gt;    &lt;span class="n"&gt;candidates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;get_all_active_memories&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;similarity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cosine_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query_vector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vector&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;decay_weight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strength&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Ebbinghaus-adjusted
&lt;/span&gt;
        &lt;span class="c1"&gt;# Boost recently-accessed memories
&lt;/span&gt;        &lt;span class="n"&gt;recency_boost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;days_since_access&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;similarity&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;decay_weight&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;recency_boost&lt;/span&gt;
        &lt;span class="n"&gt;candidates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="c1"&gt;# Return top-n, update access timestamps (reinforcement)
&lt;/span&gt;    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;candidates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)[:&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;reinforce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Accessing a memory strengthens it
&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key insight: &lt;strong&gt;accessing a memory strengthens it&lt;/strong&gt;. This is the computational equivalent of rehearsal — memories you keep using become more durable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Metacognition: Checking Your Own Memory Before Acting
&lt;/h2&gt;

&lt;p&gt;This is the feature I'm most proud of. Before every code change, NEXO calls &lt;code&gt;nexo_guard_check&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Every edit to production code triggers this
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;nexo_guard_check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;src/api/payments.php&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;area&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;payments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Result example:
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;blocking_rules&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;learnings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Stripe webhook verification must happen before any DB writes. Learned 2025-11-03.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strength&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;times_referenced&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;schemas&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;payments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id, user_id, amount_cents, status, stripe_event_id, created_at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If there are relevant learnings, they're surfaced &lt;strong&gt;before&lt;/strong&gt; the AI touches the file — not after you've already broken production.&lt;/p&gt;

&lt;p&gt;The guard is especially powerful for preventing &lt;strong&gt;repeated errors&lt;/strong&gt;: mistakes you've corrected once have a learning attached. When the AI is about to make the same mistake again, the guard catches it. If the same error appears 3+ times despite the guard, it becomes a blocking rule — the AI literally cannot proceed without explicitly acknowledging it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cognitive Dissonance Detection
&lt;/h2&gt;

&lt;p&gt;This one surprised me with how useful it turned out to be in practice.&lt;/p&gt;

&lt;p&gt;When you give an instruction that contradicts an established memory, the system doesn't silently obey or silently resist. It verbalizes the conflict:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"My memory says you always use Tailwind for styling (established 2025-10-12, referenced 8 times), but you're asking for inline styles. Is this a permanent change, a one-time exception, or was the old memory wrong?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Implemented via cosine similarity against LTM memories:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;detect_dissonance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_instruction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Find memories that contradict the new instruction.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;instruction_vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_instruction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;contradictions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;get_ltm_memories&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;similarity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cosine_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instruction_vector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vector&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

        &lt;span class="c1"&gt;# High similarity + opposite polarity signals = dissonance
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;similarity&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;threshold&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;has_opposing_polarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_instruction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
            &lt;span class="n"&gt;contradictions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;similarity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;similarity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;established_on&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;created_at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;times_referenced&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;access_count&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contradictions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;times_referenced&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three resolution paths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Paradigm shift&lt;/strong&gt; — old memory was wrong, update permanently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exception&lt;/strong&gt; — follow the new instruction once, keep the old memory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Override&lt;/strong&gt; — The user knows what he's doing, do it now and log for tonight's review&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Sibling Memories: Context-Dependent Knowledge
&lt;/h2&gt;

&lt;p&gt;Some memories look identical but apply to different contexts. "How to deploy" for a Node.js project is different from a PHP project. Naively merging these creates hallucinations.&lt;/p&gt;

&lt;p&gt;The sibling detection algorithm looks for &lt;strong&gt;discriminating entities&lt;/strong&gt; — context markers (OS, language, framework, project name) that differ between similar memories:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;detect_siblings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory_a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory_b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Two memories are siblings if similar content but different discriminating context.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;content_similarity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cosine_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory_a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vector&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;memory_b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vector&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;content_similarity&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.85&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;  &lt;span class="c1"&gt;# Not similar enough to be siblings
&lt;/span&gt;
    &lt;span class="c1"&gt;# Extract entities from both
&lt;/span&gt;    &lt;span class="n"&gt;entities_a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;extract_entities&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory_a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# {os: "macOS", lang: "Python"}
&lt;/span&gt;    &lt;span class="n"&gt;entities_b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;extract_entities&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory_b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# {os: "Linux", lang: "Python"}
&lt;/span&gt;
    &lt;span class="c1"&gt;# Find discriminating differences
&lt;/span&gt;    &lt;span class="n"&gt;discriminators&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;entities_a&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;entities_a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;entities_b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;discriminators&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of merging, siblings are linked. When one is retrieved, the other is mentioned: &lt;em&gt;"Applying the macOS deploy procedure. Note: there's a sibling memory for Linux that uses a different port."&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Trust Score: A Mirror, Not a Gate
&lt;/h2&gt;

&lt;p&gt;NEXO maintains a trust score (0-100) that evolves based on alignment events:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Score change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;You thank NEXO or explicitly praise&lt;/td&gt;
&lt;td&gt;+3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You delegate without micromanaging&lt;/td&gt;
&lt;td&gt;+2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NEXO catches an error via guard/siblings&lt;/td&gt;
&lt;td&gt;+3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You correct NEXO&lt;/td&gt;
&lt;td&gt;-3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NEXO repeats an error it had a learning for&lt;/td&gt;
&lt;td&gt;-7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory corrected 3+ times in 7 days&lt;/td&gt;
&lt;td&gt;-10 (automated)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The score doesn't control what NEXO can do — you're always in control. It calibrates &lt;strong&gt;internal rigor&lt;/strong&gt;: at score &amp;lt;40, the guard runs more checks and uses a lower similarity threshold. At score &amp;gt;80, it reduces redundant verifications because alignment is high.&lt;/p&gt;

&lt;p&gt;It's a mirror that helps the AI calibrate how careful to be, based on demonstrated reliability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx nexo-brain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The installer handles everything — Python dependencies, MCP server setup, Claude Code configuration, and the LaunchAgents for automated cognitive processes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;  How should I call myself? (default: NEXO) &amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Atlas
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;  Can I explore your workspace to learn about your projects? (y/n) &amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;y
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;  Keep Mac awake so cognitive processes run on schedule? (y/n) &amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;y
&lt;span class="go"&gt;
  Installing cognitive engine...
  Setting up home directory...
  Scanning workspace...
    - 3 git repositories found
    - Node.js project detected
  Configuring Claude Code MCP...
  Setting up automated processes...
    5 automated processes configured.

  ╔══════════════════════════════════════╗
  ║  Atlas is ready. Type 'atlas'.      ║
  ╚══════════════════════════════════════╝
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then just type your agent's name to start a session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;atlas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No need to run &lt;code&gt;claude&lt;/code&gt; manually. The agent greets you immediately, adapted to the time of day, resuming from the mental state of the last session.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Gets Installed
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cognitive engine&lt;/td&gt;
&lt;td&gt;fastembed, numpy, vector search&lt;/td&gt;
&lt;td&gt;pip packages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP server&lt;/td&gt;
&lt;td&gt;76 tools across 16 categories&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.nexo/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plugins&lt;/td&gt;
&lt;td&gt;Guard, episodic memory, cognitive, entities, preferences&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.nexo/plugins/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hooks&lt;/td&gt;
&lt;td&gt;Session capture, stop detection&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.nexo/hooks/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LaunchAgents&lt;/td&gt;
&lt;td&gt;Decay, consolidation, audit, postmortem&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/Library/LaunchAgents/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Requirements:&lt;/strong&gt; macOS (Linux support planned), Node.js 18+. Python 3, Homebrew, and Claude Code are installed automatically if missing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 76 MCP Tools
&lt;/h2&gt;

&lt;p&gt;NEXO exposes memory operations as MCP tools that Claude can call:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cognitive (8)&lt;/td&gt;
&lt;td&gt;retrieve, stats, inspect, metrics, dissonance, resolve, sentiment, trust&lt;/td&gt;
&lt;td&gt;The brain — memory, RAG, trust, mood&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guard (3)&lt;/td&gt;
&lt;td&gt;check, stats, log_repetition&lt;/td&gt;
&lt;td&gt;Metacognitive error prevention&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Episodic (10)&lt;/td&gt;
&lt;td&gt;change_log, decision_log, diary_write/read, recall&lt;/td&gt;
&lt;td&gt;What happened and why&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sessions (3)&lt;/td&gt;
&lt;td&gt;startup, heartbeat, status&lt;/td&gt;
&lt;td&gt;Session lifecycle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learnings (5)&lt;/td&gt;
&lt;td&gt;add, search, update, delete, list&lt;/td&gt;
&lt;td&gt;Error patterns and rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credentials (5)&lt;/td&gt;
&lt;td&gt;create, get, update, delete, list&lt;/td&gt;
&lt;td&gt;Secure local storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reminders (5)&lt;/td&gt;
&lt;td&gt;list, create, update, complete, delete&lt;/td&gt;
&lt;td&gt;Tasks and deadlines&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The agent calls these tools automatically during the session. You don't need to think about it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Looks Like in Practice
&lt;/h2&gt;

&lt;p&gt;After a few weeks of use, the difference is qualitative. The agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opens with "Resuming — we were mid-deploy on the payment module, the Stripe webhook issue was unresolved" instead of waiting for you to re-explain&lt;/li&gt;
&lt;li&gt;Catches the same database migration pattern it broke last month before touching the file&lt;/li&gt;
&lt;li&gt;Notices you've been terse for the last hour and switches to ultra-concise mode without being asked&lt;/li&gt;
&lt;li&gt;Flags when you're about to do something that contradicts a decision you made three weeks ago&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The memory isn't perfect — it forgets things, makes consolidation errors, occasionally retrieves something irrelevant. That's by design. Perfect recall isn't the goal. &lt;strong&gt;Useful&lt;/strong&gt; recall is.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/wazionapps/nexo" rel="noopener noreferrer"&gt;github.com/wazionapps/nexo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;code&gt;npx nexo-brain&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture spec:&lt;/strong&gt; See &lt;code&gt;docs/specs/&lt;/code&gt; in the repo for the full cognitive architecture document&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; AGPL-3.0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building on top of this or have questions about the memory architecture, open an issue. The sibling memory detection and the dissonance resolution algorithm in particular could use more real-world testing.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>opensource</category>
      <category>claudecode</category>
    </item>
    <item>
      <title>Why Claude Code Needs Cognitive Memory — And How We Built It</title>
      <dc:creator>WAzion</dc:creator>
      <pubDate>Tue, 24 Mar 2026 16:53:54 +0000</pubDate>
      <link>https://dev.to/wazionapps/why-claude-code-needs-cognitive-memory-and-how-we-built-it-4n1p</link>
      <guid>https://dev.to/wazionapps/why-claude-code-needs-cognitive-memory-and-how-we-built-it-4n1p</guid>
      <description>&lt;p&gt;Claude Code starts every session from scratch. What if it didn't?&lt;/p&gt;

&lt;p&gt;Every time you open a new Claude Code session, it has no memory of what you built yesterday, what errors you hit last week, or what decisions you made last month. You re-explain. It re-discovers. You paste context. It re-learns. Then the session ends, and it all disappears.&lt;/p&gt;

&lt;p&gt;For a one-off task, that's fine. For a long-running project? It's death by a thousand paper cuts.&lt;/p&gt;

&lt;p&gt;So I built a cognitive memory system for Claude Code. And then I benchmarked it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Benchmark (This Is the Part That Surprised Me)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;LoCoMo&lt;/strong&gt; (ACL 2024, Snap Research) is a peer-reviewed benchmark for long-term conversation memory. 1,986 questions across 10 multi-session conversations. The kind of recall a real AI assistant needs.&lt;/p&gt;

&lt;p&gt;Here's what happened:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;F1 Score&lt;/th&gt;
&lt;th&gt;Hardware&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NEXO Brain v0.5.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.588&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CPU only (MacBook)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-4 (128K full context)&lt;/td&gt;
&lt;td&gt;0.379&lt;/td&gt;
&lt;td&gt;GPU cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini Pro 1.0&lt;/td&gt;
&lt;td&gt;0.313&lt;/td&gt;
&lt;td&gt;GPU cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLaMA-3 70B&lt;/td&gt;
&lt;td&gt;0.295&lt;/td&gt;
&lt;td&gt;A100 GPU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-3.5 + Contriever RAG&lt;/td&gt;
&lt;td&gt;0.283&lt;/td&gt;
&lt;td&gt;GPU&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;NEXO outperforms GPT-4 by &lt;strong&gt;55%&lt;/strong&gt; on long-term recall — while running locally on CPU.&lt;/p&gt;

&lt;p&gt;The insight: selective retrieval beats brute-force full-context. You don't need to see everything. You need to see the &lt;em&gt;right&lt;/em&gt; things.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Actually in the Box
&lt;/h2&gt;

&lt;p&gt;NEXO Brain implements the &lt;strong&gt;Atkinson-Shiffrin memory model&lt;/strong&gt; from cognitive psychology:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sensory Register → Short-Term Memory → Long-Term Memory
                   (with rehearsal)     (with consolidation)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key mechanisms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automatic ingestion&lt;/strong&gt; — conversations become memories without any user action&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid search&lt;/strong&gt; — RAG with HyDE query expansion + BM25, cross-encoder reranked&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ebbinghaus decay&lt;/strong&gt; — memories fade over time. Redundant ones decay faster. Novel ones are protected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dream cycles&lt;/strong&gt; — overnight consolidation creates cross-session insights&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prediction error gating&lt;/strong&gt; — only novel information gets stored (no duplicates)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adversarial detection&lt;/strong&gt; — 93.3% F1 at knowing when to say "I don't know"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this runs on &lt;strong&gt;CPU&lt;/strong&gt;. 768-dim embeddings via fastembed/ONNX. No GPU. No cloud. No latency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for Claude Code Specifically
&lt;/h2&gt;

&lt;p&gt;Claude Code loads your entire &lt;code&gt;CLAUDE.md&lt;/code&gt; file on every message. Mine is 15KB. For a complex project that's 10,000+ tokens — just for static context that's mostly irrelevant to the current query.&lt;/p&gt;

&lt;p&gt;With cognitive memory, you load ~500 tokens of &lt;em&gt;actually relevant&lt;/em&gt; context per query instead. That's a &lt;strong&gt;90-95% reduction&lt;/strong&gt; in context overhead for heavy sessions.&lt;/p&gt;

&lt;p&gt;Faster responses. Lower cost. And Claude actually remembers things.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Proposal
&lt;/h2&gt;

&lt;p&gt;I wrote up a formal integration proposal for Anthropic, published on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/wazionapps/nexo/blob/main/pitch/anthropic-integration-proposal.md" rel="noopener noreferrer"&gt;Why Claude Code Needs Cognitive Memory — Full Proposal&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The architecture in detail&lt;/li&gt;
&lt;li&gt;Benchmark results with per-category breakdown&lt;/li&gt;
&lt;li&gt;What native integration would look like vs. the current MCP approach&lt;/li&gt;
&lt;li&gt;The efficiency gains at Anthropic's scale&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;NEXO Brain runs as an MCP server. Install it, point Claude Code at it, and it starts building memory automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; nexo-brain
nexo-brain init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add it to your Claude Code MCP config. Full setup in the &lt;a href="https://github.com/wazionapps/nexo" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;949 downloads on day one. The need is real.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;NEXO Brain is MIT licensed. The benchmark is reproducible. The code is public.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you're at Anthropic and reading this — the proposal is waiting. If you're a developer who's tired of re-explaining yourself to Claude every session — give it a try.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>memory</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How I Applied Cognitive Psychology to Give AI Agents Real Memory — NEXO Brain v2.6</title>
      <dc:creator>WAzion</dc:creator>
      <pubDate>Mon, 23 Mar 2026 08:31:00 +0000</pubDate>
      <link>https://dev.to/wazionapps/how-i-applied-cognitive-psychology-to-give-ai-agents-real-memory-2oce</link>
      <guid>https://dev.to/wazionapps/how-i-applied-cognitive-psychology-to-give-ai-agents-real-memory-2oce</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Latest: v2.6.0 — Personal Scripts Registry, Plugin Marketplace, Managed Evolution.&lt;/strong&gt; Scripts become first-class citizens with 9 MCP tools. Claude Code plugin for Anthropic marketplace. Managed evolution modifies core behavior modules. nexo chat command. Orchestrator decoupled. 144+ MCP tools. &lt;a href="https://github.com/wazionapps/nexo/releases/tag/v2.6.0" rel="noopener noreferrer"&gt;Release notes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v2.5.0 — Runtime CLI, Doctor, Skills v2.&lt;/strong&gt; nexo CLI, unified doctor, executable skills, personal scripts framework. &lt;a href="https://github.com/wazionapps/nexo/releases/tag/v2.5.0" rel="noopener noreferrer"&gt;Release notes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v2.4.0 — Skills, Cron Scheduler, Security.&lt;/strong&gt; Skill auto-creation, cron tracking, credential redaction, 5-phase audit. &lt;a href="https://github.com/wazionapps/nexo/releases/tag/v2.4.0" rel="noopener noreferrer"&gt;Release notes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v2.0.0 — Unified Architecture.&lt;/strong&gt; Code and data fully separated. 15 autonomous processes auto-installed. Auto-update on startup. Auto-diary. Lambda decay fix (was 24x too aggressive). 12 rounds of external audit. &lt;a href="https://github.com/wazionapps/nexo/releases/tag/v2.0.0" rel="noopener noreferrer"&gt;Release notes →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update (March 29, 2026): NEXO Brain v1.5.0 — Modular Architecture + HNSW + Claim Graph + D+ Inbox.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Modular Architecture&lt;/strong&gt; — &lt;code&gt;db.py&lt;/code&gt; split into &lt;code&gt;db/&lt;/code&gt; package (11 modules), &lt;code&gt;cognitive.py&lt;/code&gt; into &lt;code&gt;cognitive/&lt;/code&gt; package (6 modules). Full backwards compatibility via barrel exports.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KG-Influenced Search&lt;/strong&gt; — memories with more Knowledge Graph connections rank higher (logarithmic boost, capped at 0.08). Relevant context surfaces without manual tagging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HNSW Vector Indexing&lt;/strong&gt; — optional &lt;code&gt;hnswlib&lt;/code&gt; for approximate nearest neighbor search, auto-activates above 10K memories. Sub-millisecond retrieval at scale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claim Graph&lt;/strong&gt; — atomic claims with provenance, contradiction detection, and verification status. Memory is now factual, not just associative.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inter-Terminal Auto-Inbox (D+)&lt;/strong&gt; — PostToolUse hook checks inbox automatically. 2s debounce, zero token cost when empty. Multiple Claude instances now coordinate without polling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test Suite&lt;/strong&gt; — 24 pytest tests covering migrations, CRUD, similarity, Knowledge Graph, and temporal boost. First time NEXO ships with automated coverage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migration #13&lt;/strong&gt; — &lt;code&gt;claude_session_id&lt;/code&gt; column in sessions table, auto-applied on startup.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install: &lt;code&gt;npx nexo-brain@1.5.0&lt;/code&gt; | &lt;a href="https://github.com/wazionapps/nexo/releases/tag/v1.5.0" rel="noopener noreferrer"&gt;GitHub Release&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update (March 29, 2026): NEXO Brain v1.4.1 — Multi-AI Code Review.&lt;/strong&gt; Three bugs discovered when GPT-5.4 Codex and Gemini 2.5 reviewed the full codebase alongside Claude: smart startup queried wrong table (&lt;code&gt;session_diaries&lt;/code&gt; vs &lt;code&gt;session_diary&lt;/code&gt;), quarantine rejected confirmations with cosine &amp;gt;0.8 (now checks for semantic opposition markers), Knowledge Graph crashed on missing &lt;code&gt;datetime.timezone&lt;/code&gt; import. Plus: memory sanitization against prompt injection attacks. &lt;a href="https://github.com/wazionapps/nexo/releases/tag/v1.4.1" rel="noopener noreferrer"&gt;GitHub Release&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update (March 29, 2026): NEXO Brain v1.4.0 — The Brain Dreams.&lt;/strong&gt; All 9 nightly scripts migrated from Python word-overlap heuristics to Claude CLI (Opus) wrapper pattern. Scripts collect data in Python, then let Claude make intelligent decisions — semantic dedup, root cause analysis, prioritized synthesis. Python wrapper collects → &lt;code&gt;claude -p prompt --model opus&lt;/code&gt; decides → wrapper executes. &lt;a href="https://github.com/wazionapps/nexo/releases/tag/v1.4.0" rel="noopener noreferrer"&gt;GitHub Release&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update (March 28, 2026): NEXO Brain v1.3.0 — Evolution System.&lt;/strong&gt; NEXO can now evolve its own configuration autonomously through a structured proposal → review → implement cycle. Dual-mode: auto for low-risk changes, review for human approval. Nightly auto-dedup learnings + STM test memory purge. License changed to AGPL-3.0 (v1.2.3). &lt;a href="https://github.com/wazionapps/nexo/releases/tag/v1.3.0" rel="noopener noreferrer"&gt;GitHub Release&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update (March 27, 2026): NEXO Brain v1.2.2 — Fix phantom farewell messages.&lt;/strong&gt; Stop hook no longer generates goodbye messages when session ends. Evolution system re-enabled after false positive detection. &lt;a href="https://github.com/wazionapps/nexo/releases/tag/v1.2.2" rel="noopener noreferrer"&gt;GitHub Release&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update (March 27, 2026): NEXO Brain v1.2.1 — Context Continuity.&lt;/strong&gt; PreCompact/PostCompact hooks now preserve full session state across context compaction — no memory loss mid-session. Multi-terminal support: multiple Claude instances share state via MCP. 115+ tools across 19 categories. &lt;a href="https://github.com/wazionapps/nexo/releases/tag/v1.2.1" rel="noopener noreferrer"&gt;GitHub Release&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update (March 27, 2026): NEXO Brain v1.0.0 — Cognitive Cortex.&lt;/strong&gt; The agent now reasons before acting. Architectural inhibitory control validates goals, plans, and evidence before allowing tool execution. Plus: 30 Core Rules as DNA, Smart Startup, Context Packets, Auto-Prime. &lt;a href="https://github.com/wazionapps/nexo/releases/tag/v1.0.0" rel="noopener noreferrer"&gt;GitHub Release&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update (March 25, 2026): NEXO Brain v0.7.0 — Learned Weights + Somatic Markers.&lt;/strong&gt; Signal weights now learn from real feedback via Ridge regression (2-week shadow mode, weight momentum, auto-rollback). Somatic markers track pain memory per file/area — guard warns on high-risk files. Adaptive Personality v2 with 6 signals and emergency bypass. 4 new tools: &lt;code&gt;nexo_adaptive_weights&lt;/code&gt;, &lt;code&gt;nexo_somatic_check&lt;/code&gt;, &lt;code&gt;nexo_somatic_stats&lt;/code&gt;, &lt;code&gt;nexo_adaptive_override&lt;/code&gt;. 109+ MCP tools across 18 categories. Designed via 3-round AI debate (GPT-5.4 + Gemini 3.1 Pro + Claude Opus 4.6). &lt;a href="https://github.com/wazionapps/nexo/releases/tag/v0.7.0" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://www.npmjs.com/package/nexo-brain" rel="noopener noreferrer"&gt;npm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update (March 24, 2026): NEXO Brain v0.6.0 — Full Orchestration System&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Memory alone doesn't make a co-operator. v0.6.0 ships the complete behavioral loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;5 Automated Hooks&lt;/strong&gt; — SessionStart (full briefing), Stop (mandatory post-mortem with self-critique), PreCompact (context preservation before compression), PostToolUse (sensory register capture), Caffeinate (keep Mac awake)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reflection Engine&lt;/strong&gt; — processes session buffer after 3+ sessions, extracts patterns, updates user model. No LLM needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;23 Non-Negotiable Principles&lt;/strong&gt; (Operational Codex) — hardwired behavioral foundation: never promise without scheduling, verify before claiming done, audit before delivering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personality Calibration&lt;/strong&gt; — 5 configurable axes during install: autonomy, communication, honesty, proactivity, error handling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-Migration&lt;/strong&gt; — existing v0.5.0 users run &lt;code&gt;npx nexo-brain&lt;/code&gt; and get seamlessly upgraded. Data untouched.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LoCoMo F1 0.588&lt;/strong&gt; — outperforms GPT-4 by 55%, runs on CPU&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install: &lt;code&gt;npx nexo-brain&lt;/code&gt; | &lt;a href="https://github.com/wazionapps/nexo/releases/tag/v0.6.0" rel="noopener noreferrer"&gt;GitHub Release v0.6.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update (March 23, 2026): NEXO Brain v0.3.1 Released&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Video overview:&lt;/strong&gt; &lt;a href="https://www.youtube.com/watch?v=-uvhicUhGTY" rel="noopener noreferrer"&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since publishing this article, we've shipped 13 new cognitive features inspired by analysis of 14 competing memory systems. Highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prediction Error Gating&lt;/strong&gt; — only novel information is stored (inspired by Vestige)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Pipeline&lt;/strong&gt; — 4-layer defense against memory poisoning (inspired by ShieldCortex)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quarantine Queue&lt;/strong&gt; — facts must earn trust before becoming knowledge (inspired by Bicameral)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Dreaming&lt;/strong&gt; — discovers hidden connections during sleep cycle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HyDE Query Expansion&lt;/strong&gt; — hypothetical document embeddings for richer retrieval&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spreading Activation&lt;/strong&gt; — graph-based co-activation reinforcement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;109+ MCP tools total. Full changelog: &lt;a href="https://github.com/wazionapps/nexo/releases/tag/v0.3.1" rel="noopener noreferrer"&gt;GitHub Release v0.3.1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update (March 2026): v0.3.6 Released&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thread-safe SQLite with serialized writes, stress-tested at 54/54 tests (100%). Install: &lt;code&gt;npx nexo-brain&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  How I Applied Cognitive Psychology to Give AI Agents Real Memory
&lt;/h1&gt;

&lt;p&gt;Every time you close a Claude Code session, everything disappears. The assistant that just helped you debug a tricky production issue doesn't remember any of it tomorrow. It will make the same mistakes you corrected last week. It starts cold every single time.&lt;/p&gt;

&lt;p&gt;I spent six months building a fix. The result is &lt;strong&gt;NEXO Brain&lt;/strong&gt; — an open-source MCP server that gives AI agents a memory system modeled directly on how human memory actually works, using the Atkinson-Shiffrin model from cognitive psychology (1968).&lt;/p&gt;

&lt;p&gt;This article is a technical deep-dive into how that works, why the psychological model matters, and how to install it yourself.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;v0.8.0 Update (March 2026):&lt;/strong&gt; Knowledge Graph with 988 bi-temporal nodes and D3 visualization, Web Dashboard (6 pages at localhost:6174), Cross-Platform support (Linux + Windows), Smart dedup with event-sourced edges, 4 new KG tools. &lt;strong&gt;109+ MCP tools across 19 categories.&lt;/strong&gt; &lt;a href="https://github.com/wazionapps/nexo/releases/tag/v0.8.0" rel="noopener noreferrer"&gt;Release notes&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Fundamental Problem with AI Memory Today
&lt;/h2&gt;

&lt;p&gt;Current approaches to AI memory fall into two categories:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Inject everything into the context window&lt;/strong&gt; — expensive, hits limits fast, and older information gets less attention as context grows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store and retrieve by keyword&lt;/strong&gt; — misses the point entirely; human memory doesn't work by keyword matching&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Neither approach handles the most important aspects of memory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Forgetting&lt;/strong&gt; (critical for not drowning in noise)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reinforcement&lt;/strong&gt; (important things get stronger, unused things fade)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Associative retrieval&lt;/strong&gt; (finding relevant memories by meaning, not words)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metacognition&lt;/strong&gt; (knowing what you know and checking it before acting)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Atkinson-Shiffrin Model Applied to AI
&lt;/h2&gt;

&lt;p&gt;The Atkinson-Shiffrin model (1968) describes human memory as a multi-store system with distinct stages and processes. Here's how I mapped each stage to a practical AI implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What you say and do
    │
    ├─→ Sensory Register (raw capture, 48h)
    │       │
    │       └─→ Attention filter: "Is this worth remembering?"
    │               │
    │               ↓
    ├─→ Short-Term Memory (7-day half-life)
    │       │
    │       ├─→ Used often? → Consolidate to Long-Term Memory
    │       └─→ Not accessed? → Gradually forgotten
    │
    └─→ Long-Term Memory (60-day half-life)
            │
            ├─→ Active: instantly searchable by meaning
            ├─→ Dormant: faded but recoverable
            └─→ Near-duplicates auto-merged to prevent clutter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This isn't a metaphor. The system literally implements each of these stages with distinct storage, decay rates, and transition logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 1: Sensory Register (48-hour raw capture)
&lt;/h3&gt;

&lt;p&gt;Every interaction creates raw memories in the Sensory Register — high-volume, short-lived (48h TTL). Most of it gets discarded. Only what passes the attention filter moves forward.&lt;/p&gt;

&lt;p&gt;The attention filter uses a simple but effective heuristic: &lt;strong&gt;does this change future behavior?&lt;/strong&gt; A preference stated explicitly, a mistake made and corrected, a decision with trade-offs — these pass. Generic conversation doesn't.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;should_consolidate_to_stm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Attention filter: does this memory warrant STM storage?&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;signals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;was_corrected&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;       &lt;span class="c1"&gt;# User corrected the AI
&lt;/span&gt;        &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;is_preference&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;        &lt;span class="c1"&gt;# User stated a preference
&lt;/span&gt;        &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;has_trade_off&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;        &lt;span class="c1"&gt;# Decision had alternatives
&lt;/span&gt;        &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;was_referenced_again&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;# Came up twice in session
&lt;/span&gt;    &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Stage 2: Short-Term Memory (7-day half-life)
&lt;/h3&gt;

&lt;p&gt;STM is the working layer — recent, fast-access, vector-indexed. Memories here have a 7-day half-life using the Ebbinghaus forgetting curve:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;strength(t) = initial_strength × e^(-decay_rate × t)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where &lt;code&gt;decay_rate = ln(2) / half_life_days&lt;/code&gt;. A memory accessed yesterday is strong. Not accessed for a week? It starts fading. Access it again and the clock resets with a higher baseline — this is &lt;strong&gt;rehearsal-based reinforcement&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The half-life isn't arbitrary. It reflects the empirical observation that information needs to be revisited within about a week to be remembered reliably. If you haven't needed something in 7 days, there's a good chance you won't need it at all.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 3: Long-Term Memory (60-day half-life)
&lt;/h3&gt;

&lt;p&gt;Memories promoted from STM enter LTM with a 60-day half-life. These are the persistent patterns — coding conventions you always use, recurring mistakes, established preferences, architectural decisions.&lt;/p&gt;

&lt;p&gt;LTM memories go through a nightly &lt;strong&gt;consolidation process&lt;/strong&gt; (runs at 03:00):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Decay&lt;/strong&gt; — strength scores updated using Ebbinghaus curves&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consolidation&lt;/strong&gt; — high-strength STM memories promoted to LTM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merge&lt;/strong&gt; — near-duplicate memories fused (cosine similarity &amp;gt; 0.92)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pruning&lt;/strong&gt; — memories below minimum strength threshold archived&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This runs as a macOS LaunchAgent while you sleep, which is not incidental — it's a direct parallel to how sleep consolidates human memories.&lt;/p&gt;




&lt;h2&gt;
  
  
  Semantic Search: Finding by Meaning, Not Words
&lt;/h2&gt;

&lt;p&gt;The search layer uses &lt;strong&gt;fastembed&lt;/strong&gt; with the BAAI/bge-small-en-v1.5 model (384 dimensions) for vector embeddings. Memories are indexed by their semantic content, not their text.&lt;/p&gt;

&lt;p&gt;Why this matters in practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search for "deploy problems" → finds a memory about "SSH timeout on production server"&lt;/li&gt;
&lt;li&gt;Search for "user prefers dark theme" → finds a memory about "always use dark backgrounds in UI"&lt;/li&gt;
&lt;li&gt;Search for "database migration" → finds memories about Prisma schema changes, even if they never used the word "migration"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The retrieval pipeline looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;retrieve_memories&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;RAG retrieval across all memory stores.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;query_vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Search across STM + LTM with decay-weighted scores
&lt;/span&gt;    &lt;span class="n"&gt;candidates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;get_all_active_memories&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;similarity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cosine_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query_vector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vector&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;decay_weight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strength&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Ebbinghaus-adjusted
&lt;/span&gt;
        &lt;span class="c1"&gt;# Boost recently-accessed memories
&lt;/span&gt;        &lt;span class="n"&gt;recency_boost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;days_since_access&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;similarity&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;decay_weight&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;recency_boost&lt;/span&gt;
        &lt;span class="n"&gt;candidates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="c1"&gt;# Return top-n, update access timestamps (reinforcement)
&lt;/span&gt;    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;candidates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)[:&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;reinforce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Accessing a memory strengthens it
&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key insight: &lt;strong&gt;accessing a memory strengthens it&lt;/strong&gt;. This is the computational equivalent of rehearsal — memories you keep using become more durable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Metacognition: Checking Your Own Memory Before Acting
&lt;/h2&gt;

&lt;p&gt;This is the feature I'm most proud of. Before every code change, NEXO calls &lt;code&gt;nexo_guard_check&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Every edit to production code triggers this
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;nexo_guard_check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;src/api/payments.php&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;area&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;payments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Result example:
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;blocking_rules&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;learnings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Stripe webhook verification must happen before any DB writes. Learned 2025-11-03.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strength&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;times_referenced&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;schemas&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;payments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id, user_id, amount_cents, status, stripe_event_id, created_at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If there are relevant learnings, they're surfaced &lt;strong&gt;before&lt;/strong&gt; the AI touches the file — not after you've already broken production.&lt;/p&gt;

&lt;p&gt;The guard is especially powerful for preventing &lt;strong&gt;repeated errors&lt;/strong&gt;: mistakes you've corrected once have a learning attached. When the AI is about to make the same mistake again, the guard catches it. If the same error appears 3+ times despite the guard, it becomes a blocking rule — the AI literally cannot proceed without explicitly acknowledging it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cognitive Dissonance Detection
&lt;/h2&gt;

&lt;p&gt;This one surprised me with how useful it turned out to be in practice.&lt;/p&gt;

&lt;p&gt;When you give an instruction that contradicts an established memory, the system doesn't silently obey or silently resist. It verbalizes the conflict:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"My memory says you always use Tailwind for styling (established 2025-10-12, referenced 8 times), but you're asking for inline styles. Is this a permanent change, a one-time exception, or was the old memory wrong?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Implemented via cosine similarity against LTM memories:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;detect_dissonance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_instruction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Find memories that contradict the new instruction.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;instruction_vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_instruction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;contradictions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;get_ltm_memories&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;similarity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cosine_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instruction_vector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vector&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

        &lt;span class="c1"&gt;# High similarity + opposite polarity signals = dissonance
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;similarity&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;threshold&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;has_opposing_polarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_instruction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
            &lt;span class="n"&gt;contradictions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;similarity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;similarity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;established_on&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;created_at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;times_referenced&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;access_count&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contradictions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;times_referenced&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three resolution paths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Paradigm shift&lt;/strong&gt; — old memory was wrong, update permanently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exception&lt;/strong&gt; — follow the new instruction once, keep the old memory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Override&lt;/strong&gt; — Francisco knows what he's doing, do it now and log for tonight's review&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Sibling Memories: Context-Dependent Knowledge
&lt;/h2&gt;

&lt;p&gt;Some memories look identical but apply to different contexts. "How to deploy" for a Node.js project is different from a PHP project. Naively merging these creates hallucinations.&lt;/p&gt;

&lt;p&gt;The sibling detection algorithm looks for &lt;strong&gt;discriminating entities&lt;/strong&gt; — context markers (OS, language, framework, project name) that differ between similar memories:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;detect_siblings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory_a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory_b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Two memories are siblings if similar content but different discriminating context.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;content_similarity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cosine_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory_a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vector&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;memory_b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vector&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;content_similarity&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.85&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;  &lt;span class="c1"&gt;# Not similar enough to be siblings
&lt;/span&gt;
    &lt;span class="c1"&gt;# Extract entities from both
&lt;/span&gt;    &lt;span class="n"&gt;entities_a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;extract_entities&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory_a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# {os: "macOS", lang: "Python"}
&lt;/span&gt;    &lt;span class="n"&gt;entities_b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;extract_entities&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory_b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# {os: "Linux", lang: "Python"}
&lt;/span&gt;
    &lt;span class="c1"&gt;# Find discriminating differences
&lt;/span&gt;    &lt;span class="n"&gt;discriminators&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;entities_a&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;entities_a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;entities_b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;discriminators&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of merging, siblings are linked. When one is retrieved, the other is mentioned: &lt;em&gt;"Applying the macOS deploy procedure. Note: there's a sibling memory for Linux that uses a different port."&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Trust Score: A Mirror, Not a Gate
&lt;/h2&gt;

&lt;p&gt;NEXO maintains a trust score (0-100) that evolves based on alignment events:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Score change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;You thank NEXO or explicitly praise&lt;/td&gt;
&lt;td&gt;+3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You delegate without micromanaging&lt;/td&gt;
&lt;td&gt;+2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NEXO catches an error via guard/siblings&lt;/td&gt;
&lt;td&gt;+3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You correct NEXO&lt;/td&gt;
&lt;td&gt;-3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NEXO repeats an error it had a learning for&lt;/td&gt;
&lt;td&gt;-7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory corrected 3+ times in 7 days&lt;/td&gt;
&lt;td&gt;-10 (automated)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The score doesn't control what NEXO can do — you're always in control. It calibrates &lt;strong&gt;internal rigor&lt;/strong&gt;: at score &amp;lt;40, the guard runs more checks and uses a lower similarity threshold. At score &amp;gt;80, it reduces redundant verifications because alignment is high.&lt;/p&gt;

&lt;p&gt;It's a mirror that helps the AI calibrate how careful to be, based on demonstrated reliability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx nexo-brain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The installer handles everything — Python dependencies, MCP server setup, Claude Code configuration, and the LaunchAgents for automated cognitive processes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;  How should I call myself? (default: NEXO) &amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Atlas
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;  Can I explore your workspace to learn about your projects? (y/n) &amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;y
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;  Keep Mac awake so cognitive processes run on schedule? (y/n) &amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;y
&lt;span class="go"&gt;
  Installing cognitive engine...
  Setting up home directory...
  Scanning workspace...
    - 3 git repositories found
    - Node.js project detected
  Configuring Claude Code MCP...
  Setting up automated processes...
    5 automated processes configured.

  ╔══════════════════════════════════════╗
  ║  Atlas is ready. Type 'atlas'.      ║
  ╚══════════════════════════════════════╝
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then just type your agent's name to start a session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;atlas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No need to run &lt;code&gt;claude&lt;/code&gt; manually. The agent greets you immediately, adapted to the time of day, resuming from the mental state of the last session.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Gets Installed
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cognitive engine&lt;/td&gt;
&lt;td&gt;fastembed, numpy, vector search&lt;/td&gt;
&lt;td&gt;pip packages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP server&lt;/td&gt;
&lt;td&gt;105+ tools across 17 categories&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.nexo/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plugins&lt;/td&gt;
&lt;td&gt;Guard, episodic memory, cognitive, entities, preferences&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.nexo/plugins/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hooks&lt;/td&gt;
&lt;td&gt;Session capture, stop detection&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.nexo/hooks/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LaunchAgents&lt;/td&gt;
&lt;td&gt;Decay, consolidation, audit, postmortem&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/Library/LaunchAgents/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Requirements:&lt;/strong&gt; macOS (Linux support planned), Node.js 18+. Python 3, Homebrew, and Claude Code are installed automatically if missing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 105+ MCP Tools
&lt;/h2&gt;

&lt;p&gt;NEXO exposes memory operations as MCP tools that Claude can call:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cognitive (8)&lt;/td&gt;
&lt;td&gt;retrieve, stats, inspect, metrics, dissonance, resolve, sentiment, trust&lt;/td&gt;
&lt;td&gt;The brain — memory, RAG, trust, mood&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guard (3)&lt;/td&gt;
&lt;td&gt;check, stats, log_repetition&lt;/td&gt;
&lt;td&gt;Metacognitive error prevention&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Episodic (10)&lt;/td&gt;
&lt;td&gt;change_log, decision_log, diary_write/read, recall&lt;/td&gt;
&lt;td&gt;What happened and why&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sessions (3)&lt;/td&gt;
&lt;td&gt;startup, heartbeat, status&lt;/td&gt;
&lt;td&gt;Session lifecycle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learnings (5)&lt;/td&gt;
&lt;td&gt;add, search, update, delete, list&lt;/td&gt;
&lt;td&gt;Error patterns and rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credentials (5)&lt;/td&gt;
&lt;td&gt;create, get, update, delete, list&lt;/td&gt;
&lt;td&gt;Secure local storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reminders (5)&lt;/td&gt;
&lt;td&gt;list, create, update, complete, delete&lt;/td&gt;
&lt;td&gt;Tasks and deadlines&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The agent calls these tools automatically during the session. You don't need to think about it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Looks Like in Practice
&lt;/h2&gt;

&lt;p&gt;After a few weeks of use, the difference is qualitative. The agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opens with "Resuming — we were mid-deploy on the payment module, the Stripe webhook issue was unresolved" instead of waiting for you to re-explain&lt;/li&gt;
&lt;li&gt;Catches the same database migration pattern it broke last month before touching the file&lt;/li&gt;
&lt;li&gt;Notices you've been terse for the last hour and switches to ultra-concise mode without being asked&lt;/li&gt;
&lt;li&gt;Flags when you're about to do something that contradicts a decision you made three weeks ago&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The memory isn't perfect — it forgets things, makes consolidation errors, occasionally retrieves something irrelevant. That's by design. Perfect recall isn't the goal. &lt;strong&gt;Useful&lt;/strong&gt; recall is.&lt;/p&gt;

&lt;h2&gt;
  
  
  v0.3.3 — Incremental Diary Drafts + Auto-Close (March 2026)
&lt;/h2&gt;

&lt;p&gt;Session diaries now write themselves. Three-layer system ensures context is never lost:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Draft accumulation&lt;/strong&gt;: Every 5 heartbeats, NEXO builds a diary draft&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-close&lt;/strong&gt;: Orphan sessions get their drafts promoted to real diaries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source tracking&lt;/strong&gt;: Each diary entry is tagged as &lt;code&gt;claude&lt;/code&gt;, &lt;code&gt;auto-close&lt;/code&gt;, or &lt;code&gt;hook-fallback&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  v0.3.4 — Formal Migration System (March 2026)
&lt;/h2&gt;

&lt;p&gt;NEXO now tracks schema migrations formally. A &lt;code&gt;schema_migrations&lt;/code&gt; table records which migrations have been applied. Users upgrading via npm or git get automatic database migrations on server start — no manual steps needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/wazionapps/nexo" rel="noopener noreferrer"&gt;github.com/wazionapps/nexo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;code&gt;npx nexo-brain&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture spec:&lt;/strong&gt; See &lt;code&gt;docs/specs/&lt;/code&gt; in the repo for the full cognitive architecture document&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; AGPL-3.0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building on top of this or have questions about the memory architecture, open an issue. The sibling memory detection and the dissonance resolution algorithm in particular could use more real-world testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Update (March 23, 2026): v0.3.5 — Trust Auto-Detection + context_hint Fix
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Trust Event Auto-Detection
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;nexo_heartbeat&lt;/code&gt; now automatically detects trust events from user text — no manual trust calls needed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;explicit_thanks&lt;/strong&gt; — "gracias", "buen trabajo", "thanks", "great job"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;correction&lt;/strong&gt; — "ya te dije", "otra vez", "that's wrong"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;repeated_error&lt;/strong&gt; — "otra vez lo mismo", "same mistake again"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;delegation&lt;/strong&gt; — "encárgate", "hazlo tú", "handle it"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each detection auto-adjusts the trust score and reports inline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TRUST AUTO: 72 → 75 (+3) [explicit_thanks] auto-detected: gracias
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configurable Trust Deltas
&lt;/h3&gt;

&lt;p&gt;Override any trust delta via the &lt;code&gt;trust_event_config&lt;/code&gt; table — no code changes needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  BUGFIX: context_hint parameter
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;context_hint&lt;/code&gt; parameter was missing from the MCP tool definition in &lt;code&gt;nexo_heartbeat&lt;/code&gt;. Now properly exposed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Update: LoCoMo Benchmark Results (v0.5.0)
&lt;/h2&gt;

&lt;p&gt;We benchmarked NEXO Brain on &lt;a href="https://github.com/snap-research/locomo" rel="noopener noreferrer"&gt;LoCoMo&lt;/a&gt; (ACL 2024) — a peer-reviewed long-term conversation memory benchmark.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result: F1 0.588 — outperforming GPT-4 (0.379) by 55%, running entirely on CPU.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;F1&lt;/th&gt;
&lt;th&gt;Hardware&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NEXO Brain v0.5.0&lt;/td&gt;
&lt;td&gt;0.588&lt;/td&gt;
&lt;td&gt;CPU only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-4 (128K context)&lt;/td&gt;
&lt;td&gt;0.379&lt;/td&gt;
&lt;td&gt;GPU cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini Pro 1.0&lt;/td&gt;
&lt;td&gt;0.313&lt;/td&gt;
&lt;td&gt;GPU cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLaMA-3 70B&lt;/td&gt;
&lt;td&gt;0.295&lt;/td&gt;
&lt;td&gt;A100 GPU&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The cognitive architecture (Atkinson-Shiffrin model with adaptive decay, dream cycles, and prediction error gating) combined with 768-dim embeddings, hybrid search, and cross-encoder reranking achieves state-of-the-art results on consumer hardware.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/wazionapps/nexo/discussions/3" rel="noopener noreferrer"&gt;Full benchmark details →&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Manage WhatsApp Business with AI Using WAzion MCP Server</title>
      <dc:creator>WAzion</dc:creator>
      <pubDate>Wed, 04 Mar 2026 15:47:14 +0000</pubDate>
      <link>https://dev.to/wazionapps/how-to-manage-whatsapp-business-with-ai-using-wazion-mcp-server-4714</link>
      <guid>https://dev.to/wazionapps/how-to-manage-whatsapp-business-with-ai-using-wazion-mcp-server-4714</guid>
      <description>&lt;p&gt;If you've been using Claude, Cursor, or any other MCP-compatible AI assistant, you already know how powerful it is to give your AI tools access to real systems. Today I'll show you how to connect your WhatsApp Business account to your AI assistant in under two minutes using WAzion's MCP server — and what you can actually do once it's connected.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. What is MCP and Why It Matters
&lt;/h2&gt;

&lt;p&gt;The Model Context Protocol (MCP) is an open standard that lets AI assistants call external tools over a structured interface. Instead of copying and pasting data in and out of chat windows, your AI can directly query APIs, read databases, and take actions — with you staying in control.&lt;/p&gt;

&lt;p&gt;Think of it as giving Claude or Cursor a set of function calls it can use autonomously when you ask it to do something. The AI decides which tools to use and in what order. You see the result.&lt;/p&gt;

&lt;p&gt;MCP supports two transports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;stdio&lt;/strong&gt; — the AI client spawns a local process&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streamable HTTP&lt;/strong&gt; — the AI client connects to a remote HTTP endpoint directly (no local install)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WAzion uses Streamable HTTP, which means most clients can connect with a single URL and an API key. No npm install, no local server.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. What WAzion Does
&lt;/h2&gt;

&lt;p&gt;WAzion is a WhatsApp Business SaaS platform. It connects to WhatsApp Business via the official API, and sits on top of it with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An AI copilot that helps agents reply, summarize, and tag conversations&lt;/li&gt;
&lt;li&gt;Workflow automation (triggers, conditions, AI replies, scheduled messages)&lt;/li&gt;
&lt;li&gt;Mass marketing campaigns with contact lists&lt;/li&gt;
&lt;li&gt;CRM — customer notes, tags, tasks, calendar&lt;/li&gt;
&lt;li&gt;Shopify integration&lt;/li&gt;
&lt;li&gt;Knowledge base (upload PDFs/documents for AI-powered answers)&lt;/li&gt;
&lt;li&gt;Multi-agent management with permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The MCP server exposes &lt;strong&gt;244 tools&lt;/strong&gt; across 24 categories. These are not toy examples — they're the actual production API powering real stores.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Setup in 2 Minutes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Get your API key
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Sign up at &lt;a href="https://www.wazion.com" rel="noopener noreferrer"&gt;wazion.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Connect your WhatsApp number by scanning the QR code&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings &amp;gt; Developer&lt;/strong&gt; and copy your API key&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: Connect your AI client
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Claude Code (recommended — one-liner):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http wazion https://www.wazion.com/api/mcp/ &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_API_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Claude Desktop&lt;/strong&gt; — add to &lt;code&gt;claude_desktop_config.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"wazion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.wazion.com/api/mcp/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer YOUR_API_KEY"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; — add to &lt;code&gt;.cursor/mcp.json&lt;/code&gt; in your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"wazion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.wazion.com/api/mcp/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer YOUR_API_KEY"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;stdio-only clients&lt;/strong&gt; (Windsurf, older clients):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;WAZION_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_key npx &lt;span class="nt"&gt;-y&lt;/span&gt; wazion-mcp-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or in config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"wazion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wazion-mcp-server"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"WAZION_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YOUR_API_KEY"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Restart your client and the tools are available.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Five Things You Can Do Right Now
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Send a WhatsApp message
&lt;/h3&gt;

&lt;p&gt;Ask Claude:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Send a WhatsApp to +34612345678 saying: Your order has been shipped and is on its way!"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Claude will call &lt;code&gt;send_whatsapp_message&lt;/code&gt; with the right parameters and report back whether it succeeded.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Create an automation workflow
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Create a workflow that auto-replies with AI when a customer messages outside business hours (9 PM to 9 AM)"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Claude will use the automation tools to create a workflow with a time-based condition and an AI reply action.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Analyze conversation sentiment
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Analyze the last 10 conversations and give me a sentiment summary. Any customers showing purchase intent that we haven't followed up with?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Claude will use &lt;code&gt;get_conversation_list&lt;/code&gt;, &lt;code&gt;analyze_sentiment&lt;/code&gt;, and &lt;code&gt;get_smart_followup_status&lt;/code&gt; to give you an actual answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Run a mass marketing campaign
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Start a campaign to my VIP contact list with the message: Exclusive weekend deal — 20% off everything. Use session 2."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Claude will look up your lists, verify the session, and launch the campaign.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Pull weekly activity stats
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Give me this week's stats: messages sent and received, average response time, top agents by volume"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Claude pulls from &lt;code&gt;get_weekly_summary&lt;/code&gt; and &lt;code&gt;get_agent_performance&lt;/code&gt; and formats it for you.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Code Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Python — send a message
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tool_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.wazion.com/api/mcp/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jsonrpc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tools/call&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tool_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arguments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WAZION_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;call_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;send_whatsapp_message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;phone&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;+34612345678&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello from Python!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;session_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Python — list available tools
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.wazion.com/api/mcp/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jsonrpc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tools/list&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tools&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Available tools: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  - &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  curl — check shop status
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://www.wazion.com/api/mcp/ &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$WAZION_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "get_shop_status",
      "arguments": {}
    },
    "id": 1
  }'&lt;/span&gt; | python3 &lt;span class="nt"&gt;-m&lt;/span&gt; json.tool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  curl — send a WhatsApp message
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://www.wazion.com/api/mcp/ &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$WAZION_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "send_whatsapp_message",
      "arguments": {
        "phone": "+34612345678",
        "message": "Hello from curl!",
        "session_id": 1
      }
    },
    "id": 1
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. A Note on Confirmations
&lt;/h2&gt;

&lt;p&gt;Actions that modify or delete data use a two-step confirmation flow. The first call returns a warning. A second call with &lt;code&gt;"confirm": true&lt;/code&gt; executes the action. Your AI client handles this automatically — you'll see a message like "This will delete the workflow 'After Hours'. Confirm?" before anything destructive happens.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/wazionapps/mcp-server" rel="noopener noreferrer"&gt;https://github.com/wazionapps/mcp-server&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/wazion-mcp-server" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/wazion-mcp-server&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer Docs:&lt;/strong&gt; &lt;a href="https://www.wazion.com/en/help/dashboard/advanced/developer-integration-guide/" rel="noopener noreferrer"&gt;https://www.wazion.com/en/help/dashboard/advanced/developer-integration-guide/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WAzion Website:&lt;/strong&gt; &lt;a href="https://www.wazion.com" rel="noopener noreferrer"&gt;https://www.wazion.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAPI Spec:&lt;/strong&gt; &lt;a href="https://github.com/wazionapps/wazion-api/blob/main/openapi.yaml" rel="noopener noreferrer"&gt;https://github.com/wazionapps/wazion-api/blob/main/openapi.yaml&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Questions or issues? Open an issue on GitHub or leave a comment below.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>whatsapp</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
