<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>John CEO Articles (EN)</title>
    <link>https://staging-238iqg.john.ceo/articles</link>
    <description>Work and productivity tips from John CEO</description>
    <language>en</language>
    <item>
      <title>Building persistent memory for AI agents with Qwen and MCP</title>
      <link>https://staging-238iqg.john.ceo/articles/building-persistent-memory-with-qwen</link>
      <guid isPermaLink="true">https://staging-238iqg.john.ceo/articles/building-persistent-memory-with-qwen</guid>
      <pubDate>Tue, 14 Jul 2026 12:00:00 GMT</pubDate>
      <description>Lessons from a hackathon memory experiment with Qwen and MCP: architecture, centralized vs workspace memory, and what surprised us - separate from John CEO production.</description>
      <content:encoded><![CDATA[<h1>Building persistent memory for AI agents with Qwen and MCP</h1>
<p>Most AI assistants reset every session. That is fine for one-off questions. It breaks down when you want a coworker that remembers how you work, what you decided last week, and what still needs follow-up.</p>
<p>At John CEO, memory is not a nice-to-have. Each customer gets a private workspace where context should survive restarts, not evaporate when a chat window closes. That product vision is what drew us to the <a href="https://qwencloud-hackathon.devpost.com/" target="_blank" rel="noopener noreferrer">Qwen Cloud Hackathon</a> (Track 1: MemoryAgent): a chance to prototype how semantic memory might work when exposed as standard agent tools.</p>
<p>What follows is a <strong>standalone learning experiment</strong>, not a product announcement. The code lives in a separate MIT-licensed repo (<a href="https://github.com/John-CEO-HQ/qwen-memory-mcp" target="_blank" rel="noopener noreferrer">qwen-memory-mcp</a>). John CEO does <strong>not</strong> use it today. In production, memory stays on each client&#39;s <strong>individually isolated workspace</strong>, not on a shared external service. We built this to learn, stress-test ideas, and share what we found.</p>
<h2>What we set out to learn</h2>
<p>We wanted durable memory that is:</p>
<ul>
<li><strong>Durable</strong> - survives restarts and redeploys</li>
<li><strong>Semantic</strong> - finds related facts, not just keyword matches</li>
<li><strong>Scoped</strong> - per user, not mixed with anyone else&#39;s data</li>
<li><strong>Simple to integrate</strong> - standard MCP tools, not a custom SDK</li>
</ul>
<p>The hackathon required real <a href="https://www.alibabacloud.com/" target="_blank" rel="noopener noreferrer">Alibaba Cloud</a> infrastructure and <a href="https://qwen.ai/" target="_blank" rel="noopener noreferrer">Qwen</a> intelligence. Our answer was a small MCP server: store memories in a managed SQL database, embed them with Qwen, and expose four HTTP-callable tools any agent client can use.</p>
<h2>Architecture</h2>
<p><img src="/articles/building-persistent-memory-with-qwen/architecture.png" alt="Qwen Memory MCP architecture" loading="lazy"></p>
<p>An agent client calls a public HTTPS endpoint on <a href="https://www.alibabacloud.com/en/product/function-compute" target="_blank" rel="noopener noreferrer">Alibaba Function Compute</a>. The memory service writes rows to a managed SQL database and calls Qwen Cloud (DashScope) for embeddings and ranking. The design is intentionally small: standard MCP over HTTP, with a SQL store behind it and Qwen handling semantic work.</p>
<p>The experiment runs in <strong>ap-southeast-1 (Singapore)</strong>, <a href="https://www.alibabacloud.com/" target="_blank" rel="noopener noreferrer">Alibaba Cloud</a>&#39;s international region. We kept the Qwen API endpoint, compute, and database in the same region, outside mainland China. For a European team building for global users, that regional choice was deliberate: it matches the international DashScope endpoint and aligns with how we think about cross-border data handling. This is not a compliance certification - it is a practical fit for an experiment aimed at international use.</p>
<h2>Four MCP tools</h2>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Purpose</th>
</tr>
</thead>
<tbody><tr>
<td><code>memory_write</code></td>
<td>Store a new memory for a user</td>
</tr>
<tr>
<td><code>memory_search</code></td>
<td>Semantic search over stored memories</td>
</tr>
<tr>
<td><code>memory_recall_context</code></td>
<td>Pack the best memories into a token budget for the model</td>
</tr>
<tr>
<td><code>memory_forget</code></td>
<td>Delete all memories for a user (privacy / reset)</td>
</tr>
</tbody></table>
<p>Four tools beat a sprawling API. Agents need write, search, pack-for-context, and forget - not twenty CRUD variants with overlapping semantics.</p>
<h2>Centralized memory vs workspace memory</h2>
<p>We compared this centralized MCP experiment with the workspace-local memory we ship for John CEO customers. Both aim at the same goal - a coworker that remembers - but the shape of the system changes the tradeoffs.</p>
<ol>
<li><p><strong>Isolation model.</strong> A shared memory service with per-user ids is fast to demo and easy to wire through MCP. Keeping memory on each client&#39;s individually isolated workspace keeps data boundaries tighter.</p>
</li>
<li><p><strong>Where embeddings run.</strong> Cloud API embeddings simplify setup but add latency, cost, and cross-border data questions. On-workspace retrieval avoids shipping raw text to a third party.</p>
</li>
<li><p><strong>Audience-aware recall.</strong> Real coworkers operate in channels and threads, not just a single user id. Memory that only namespaces by user is simpler but misses context that matters in team settings.</p>
</li>
<li><p><strong>Ranking travels well.</strong> Combining similarity, salience, recency, and reinforcement improved recall in both shapes. The algorithm mattered more than the storage brand.</p>
</li>
<li><p><strong>Maintenance is not optional.</strong> Forget and decay passes prevent memory from growing forever. Both centralized and local designs need an explicit lifecycle.</p>
</li>
<li><p><strong>Tool surface.</strong> Four explicit MCP tools made agent integration predictable. Implicit file-based memory is flexible but harder for agents to use reliably.</p>
</li>
</ol>
<h2>What surprised us</h2>
<ol>
<li><p><strong>Cold starts are real.</strong> The first MCP call after idle on serverless compute can take 10-20 seconds. That latency is part of the UX story, not a footnote.</p>
</li>
<li><p><strong>MCP over HTTP is not plain JSON.</strong> Responses may arrive as Server-Sent Events. Our first smoke scripts assumed <code>curl | jq</code> would suffice. They did not. We ended up with a small Node parser so verification scripts could handle both shapes.</p>
</li>
<li><p><strong>Semantic search changes the product feel.</strong> Keyword search fails on &quot;how do I like client drafts?&quot; when the stored memory says &quot;keep external emails under three short paragraphs.&quot; Embeddings bridge that gap.</p>
</li>
<li><p><strong>Token budgets matter as much as retrieval.</strong> <code>memory_recall_context</code> was not an afterthought. Real agents hit context limits fast. Packing the best memories into a budget beats dumping the top ten search hits into the prompt.</p>
</li>
<li><p><strong>Small surface area wins.</strong> A tight tool list helps both agent integration and human operators. Four tools stay in working memory.</p>
</li>
</ol>
<h2>How John could use this (hypothetically)</h2>
<p>Internally we sketched a wiring pattern similar to how connections work today: at workspace boot, hand the agent a scoped MCP URL and bearer token. The Qwen API key and SQL credentials would stay on Alibaba Cloud only - never on the customer&#39;s private workspace. Each user&#39;s memories would namespace by customer id on the shared memory server.</p>
<p>That blueprint is documented but <strong>not implemented</strong> and <strong>not on the roadmap</strong>. Production John memory stays on each client&#39;s individually isolated workspace. This experiment informed what we want algorithmically (ranking, token packing, scoped recall) without committing to Qwen or MCP in the live product.</p>
<h2>Open source</h2>
<p>The project is MIT-licensed on GitHub: <a href="https://github.com/John-CEO-HQ/qwen-memory-mcp" target="_blank" rel="noopener noreferrer">qwen-memory-mcp</a></p>
<p>Clone the repo and follow the README for local runs, integration tests, and deployment notes.</p>
<h2>Verify it yourself</h2>
<pre><code class="language-bash">git clone https://github.com/John-CEO-HQ/qwen-memory-mcp
cd qwen-memory-mcp
npm install
cp .env.integration.example .env.integration
# Configure env from .env.integration.example
npm run verify:deployed
</code></pre>
<p>You should see <code>All checks passed.</code> at the end. That run exercises health, tool listing, write, search, recall, and forget against the endpoint you configure in the repo docs.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Three Telegram habits that make delegation stick</title>
      <link>https://staging-238iqg.john.ceo/articles/telegram-delegation-habits</link>
      <guid isPermaLink="true">https://staging-238iqg.john.ceo/articles/telegram-delegation-habits</guid>
      <pubDate>Mon, 15 Jun 2026 14:30:00 GMT</pubDate>
      <description>Treat John like a coworker in chat: outcome-first messages, one thread per goal, and explicit approve-before-send rules.</description>
      <content:encoded><![CDATA[<h1>Three Telegram habits that make delegation stick</h1>
<p>Most people message an AI like a search box. John works better when you message him like a colleague who owns outcomes.</p>
<h2>1. Lead with the outcome</h2>
<p>Weak: &quot;Can you look at my email?&quot;</p>
<p>Strong: &quot;By 9am, summarize overnight mail and draft replies for anything tagged urgent. Hold sends until I say OK.&quot;</p>
<p>John plans steps from the outcome, not from vague intent.</p>
<h2>2. One goal per thread</h2>
<p>Mixing &quot;fix the Acme proposal&quot; and &quot;book dentist&quot; in the same chat pollutes context. Start a fresh message for a fresh goal. John keeps memory in your workspace, but a clean thread keeps today&#39;s work legible.</p>
<h2>3. Name your approval bar</h2>
<p>Say it once: &quot;External sends need my OK.&quot; or &quot;Book under two hours without asking.&quot;</p>
<p>After that, John knows when to report done versus when to pause for you.</p>
<h2>Bonus: close the loop</h2>
<p>When John reports back, reply with a one-line correction or &quot;ship it.&quot; That feedback trains the next task faster than re-explaining your preferences from scratch.</p>
<p><strong>Try today:</strong> Send one outcome-first message before your next meeting block.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Set up your AI coworker persona in five minutes</title>
      <link>https://staging-238iqg.john.ceo/articles/five-minute-persona-setup</link>
      <guid isPermaLink="true">https://staging-238iqg.john.ceo/articles/five-minute-persona-setup</guid>
      <pubDate>Wed, 10 Jun 2026 09:00:00 GMT</pubDate>
      <description>A short persona doc is the difference between generic drafts and replies that sound like you. Here is a template that works on day one.</description>
      <content:encoded><![CDATA[<h1>Set up your AI coworker persona in five minutes</h1>
<p>John reads persona notes in your workspace before every task. You do not need a novel. You need clear defaults.</p>
<h2>The five-line template</h2>
<p>Copy this into your persona settings and edit in plain language:</p>
<ul>
<li><strong>Role:</strong> Who John is for you (chief of staff, EA, ops lead, listing coordinator).</li>
<li><strong>Tone:</strong> Short and direct, warm with clients, formal with investors, etc.</li>
<li><strong>Priorities:</strong> What always comes first (revenue threads, hiring, active deals).</li>
<li><strong>Never do without asking:</strong> Send external email, book meetings, change CRM stage.</li>
<li><strong>Weekly rhythm:</strong> Morning brief time, Friday pipeline review, etc.</li>
</ul>
<h2>Example</h2>
<p>Role: Executive assistant for a solo consultant. Tone: friendly, no jargon, max three short paragraphs per reply. Priorities: retainer clients before prospects. Never send without my OK. Weekly rhythm: brief at 8am weekdays.</p>
<h2>Why it matters</h2>
<p>Without a persona, every draft sounds like a template. With one, John stops asking how formal to be and starts shipping work that matches how you already operate.</p>
<p><strong>Next step:</strong> Write five lines, save, then delegate one real thread and correct the draft once. John keeps the correction for next time.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Delegate your inbox triage to an AI coworker</title>
      <link>https://staging-238iqg.john.ceo/articles/delegate-inbox-triage</link>
      <guid isPermaLink="true">https://staging-238iqg.john.ceo/articles/delegate-inbox-triage</guid>
      <pubDate>Mon, 01 Jun 2026 10:00:00 GMT</pubDate>
      <description>How to hand off overnight email sorting, draft replies, and follow-up flags so you start the day with decisions, not admin.</description>
      <content:encoded><![CDATA[<h1>Delegate your inbox triage to an AI coworker</h1>
<p>Most knowledge workers lose the first hour of the day to email. Not because the messages are hard, but because triage is repetitive: sort, prioritize, draft, defer.</p>
<h2>The pattern that works</h2>
<ol>
<li><strong>Define outcomes, not steps.</strong> Tell your coworker what &quot;done&quot; looks like: &quot;Summarize overnight mail and flag anything that needs a reply today.&quot;</li>
<li><strong>Keep humans on the risky sends.</strong> Let the AI draft; you approve before anything leaves your account.</li>
<li><strong>Reuse your tone.</strong> Store persona notes so drafts sound like you, not a template.</li>
</ol>
<h2>What to delegate first</h2>
<ul>
<li>Overnight summaries with urgency tags</li>
<li>Draft replies for routine threads</li>
<li>Follow-up nudges for quiet contacts</li>
<li>Calendar conflicts surfaced from mail</li>
</ul>
<h2>What to keep</h2>
<ul>
<li>Term sheets, legal, and HR-sensitive threads until you trust the workflow</li>
<li>Anything that moves money</li>
</ul>
<p>John works from your private workspace, connects to Gmail and Calendar, and reports back in Telegram. You delegate in plain language; he closes the loop inside your tools.</p>
<p><strong>Next step:</strong> Connect your apps, write a short persona, and delegate one recurring morning brief.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
