DEV Community

Cover image for كيفية إضافة ذاكرة دائمة لأي وكيل ذكاء اصطناعي (ليتذكر الأمس)
Yusuf Khalidd
Yusuf Khalidd

Posted on • Originally published at apidog.com

كيفية إضافة ذاكرة دائمة لأي وكيل ذكاء اصطناعي (ليتذكر الأمس)

TL;DR

أضف ذاكرة مستمرة إلى وكلاء الذكاء الاصطناعي في 4 خطوات عملية:

  1. إعداد خادم ذاكرة MCP يوفر أدوات remember وrecall وsearch وrollback.
  2. أضف تعليمات استخدام أدوات الذاكرة إلى مطالبات الوكيل.
  3. عدّل إعدادات ~/.claude/settings.json لـ Claude Code أو .cursor/mcp.json لـ Cursor.
  4. استخدم أنماط الذاكرة لتسجيل القرارات، تسليم المهام بين الوكلاء، ونقاط حفظ الجلسات.

الوكلاء سيحتفظون بالسياق عبر الجلسات—لا مزيد من النسخ واللصق للمحادثات السابقة.

جرّب Apidog اليوم

حل مشكلة "لا أتذكر الأمس". أضف ذاكرة مستمرة لوكلاء الذكاء الاصطناعي باستخدام بروتوكول MCP ليحتفظوا بالسياق والقرارات عبر الجلسات.

المشكلة الشائعة:

Day 1: "Build the user authentication system"
Agent: [Builds JWT auth, creates users table, implements refresh tokens]

Day 2: "Continue from yesterday"
Agent: "I don't have context from previous sessions. Can you paste what we did?"
Enter fullscreen mode Exit fullscreen mode

تقوم بنسخ ولصق المحادثة السابقة. الوكيل يقرأ 2000 سطر من السياق وتضيع 15 دقيقة للعودة للعمل.

الحل: ذاكرة MCP تخزن القرارات تلقائيًا وتستدعيها عند الحاجة—لا نسخ ولصق، لا إعادة شرح.

في هذا الدليل، ستتعلم إعداد ذاكرة MCP للوكلاء، تخزين واسترجاع قرارات مهندس الواجهة الخلفية، تسليم المنتجات إلى مطور الواجهة الأمامية بدون فقدان السياق. نفس الأنماط مناسبة لبناء واجهات برمجة تطبيقات (APIs) مع تكامل Apidog أو لإدارة دورات تطوير متعددة الأيام.

ما هي ذاكرة MCP؟

ذاكرة MCP تمكّن وكلاء الذكاء الاصطناعي من تخزين واسترجاع المعلومات عبر الجلسات. فكر فيها كدفتر ملاحظات مشترك للوكلاء.

أدوات ذاكرة MCP:

الأداة الغرض مثال
remember تخزين المعلومات مع العلامات حفظ "جدول المستخدمين مع UUID، bcrypt"
recall البحث بكلمة مفتاحية أو علامة البحث عن "قرارات المصادقة"
rollback الاستعادة لحالة سابقة التراجع عن تغييرات المخطط السيئة
search البحث عبر الجلسات "ماذا قرر مهندس الواجهة الخلفية؟"
┌─────────────────┐         ┌──────────────────┐         ┌─────────────┐
│  وكيل الذكاء      │         │  ذاكرة MCP        │         │  التخزين     │
│  الاصطناعي       │◄───────►│  الخادم           │◄───────►│  (SQLite)   │
│  (Claude Code)  │   JSON  └──────────────────┘  I/O    └─────────────┘
└─────────────────┘
Enter fullscreen mode Exit fullscreen mode

الخطوة 1: إعداد خادم ذاكرة MCP

أ. استخدام خادم ذاكرة مستضاف:

npm install -g @example/mcp-memory-server
Enter fullscreen mode Exit fullscreen mode

ب. تشغيل خادم محلي بسيط:

أنشئ ملف memory-server.js:

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import fs from "fs/promises";
import path from "path";

const MEMORY_FILE = path.join(process.env.HOME, ".mcp-memory", "memories.json");

const server = new McpServer({
  name: "memory",
  version: "1.0.0"
});

async function initMemory() {
  await fs.mkdir(path.dirname(MEMORY_FILE), { recursive: true });
  try {
    await fs.access(MEMORY_FILE);
  } catch {
    await fs.writeFile(MEMORY_FILE, JSON.stringify([]));
  }
}

// remember
server.tool(
  "remember",
  {
    content: z.string().describe("Information to store"),
    tags: z.array(z.string()).describe("Tags for retrieval (e.g., ['backend', 'auth'])"),
    agent: z.string().optional().describe("Agent name for tagging")
  },
  async ({ content, tags, agent }) => {
    await initMemory();
    const memories = JSON.parse(await fs.readFile(MEMORY_FILE, "utf-8"));
    const memory = {
      id: Date.now().toString(),
      content,
      tags,
      agent,
      timestamp: new Date().toISOString()
    };
    memories.push(memory);
    await fs.writeFile(MEMORY_FILE, JSON.stringify(memories, null, 2));
    return { content: [{ type: "text", text: `Stored memory with tags: ${tags.join(", ")}` }] };
  }
);

// recall
server.tool(
  "recall",
  {
    query: z.string().describe("Search query or tag to find"),
    agent: z.string().optional().describe("Filter by agent name")
  },
  async ({ query, agent }) => {
    await initMemory();
    const memories = JSON.parse(await fs.readFile(MEMORY_FILE, "utf-8"));
    const results = memories.filter(m =>
      (m.content.toLowerCase().includes(query.toLowerCase()) ||
        m.tags.some(t => t.toLowerCase().includes(query.toLowerCase())))
      && (!agent || m.agent === agent)
    );
    return {
      content: [{
        type: "text",
        text: results.length === 0
          ? "No memories found"
          : results.map(m => `[${m.timestamp}] ${m.content}`).join("\n\n")
      }]
    };
  }
);

// search
server.tool(
  "search",
  {
    tags: z.array(z.string()).describe("Tags to search for"),
    limit: z.number().optional().default(10)
  },
  async ({ tags, limit }) => {
    await initMemory();
    const memories = JSON.parse(await fs.readFile(MEMORY_FILE, "utf-8"));
    const results = memories
      .filter(m => tags.some(t => m.tags.includes(t)))
      .slice(0, limit);
    return {
      content: [{
        type: "text",
        text: results.map(m => `[${m.agent || "unknown"}] ${m.content}`).join("\n\n")
      }]
    };
  }
);

// rollback
server.tool(
  "rollback",
  {
    agent: z.string().describe("Agent name to rollback"),
    timestamp: z.string().describe("Rollback to this timestamp")
  },
  async ({ agent, timestamp }) => {
    await initMemory();
    const memories = JSON.parse(await fs.readFile(MEMORY_FILE, "utf-8"));
    const rolledBack = memories.filter(m =>
      m.agent !== agent || new Date(m.timestamp) <= new Date(timestamp)
    );
    await fs.writeFile(MEMORY_FILE, JSON.stringify(rolledBack, null, 2));
    return {
      content: [{
        type: "text",
        text: `Rolled back ${agent} to ${timestamp}`
      }]
    };
  }
);

const transport = new StdioServerTransport();
await server.connect(transport);
Enter fullscreen mode Exit fullscreen mode

لتشغيل الخادم:

node memory-server.js
Enter fullscreen mode Exit fullscreen mode

الخطوة 2: إضافة تعليمات الذاكرة لأي وكيل

يمكنك تضمين تعليمات أدوات MCP مباشرة في مطالباتك بدون تعديل ملفات الوكيل.

نموذج تعليمات:

لديك وصول إلى أدوات ذاكرة MCP: remember, recall, search, rollback.

عند بدء جلسة:
1. recall(query="ecommerce-api", agent="Backend Architect")
2. مراجعة العناصر المعلقة

عند الإنهاء:
1. remember(content="تم إنشاء جدول المستخدمين بمفتاح أساسي UUID، وتجزئة كلمة المرور bcrypt، ومصادقة JWT مع رموز التحديث", tags=["ecommerce-api", "database", "auth"], agent="Backend Architect")

عند تسليم المهام:
1. remember(content="نقاط نهاية API: /auth/login, /auth/register, /products, /orders. تدفق المصادقة: رمز وصول JWT (15 دقيقة) + رمز تحديث (7 أيام). مشكلة معروفة: لم يتم تنفيذ تحديد المعدل بعد", tags=["ecommerce-api", "handoff"], agent="Backend Architect", for="Frontend Developer")

عند حدوث خطأ:
1. البحث عن آخر حالة جيدة
2. استخدم rollback
Enter fullscreen mode Exit fullscreen mode

تجربة عملية:

أنت: "تفعيل وضع مهندس الواجهة الخلفية. صمم نظام المستخدمين لواجهة برمجة تطبيقات التجارة الإلكترونية الخاصة بنا."
[الوكيل ينفذ العمل]
الوكيل: "نظام المستخدمين مكتمل. جاري تخزين الذاكرة..."
→ remember("جدول المستخدمين مع UUID، bcrypt، JWT + رموز التحديث", tags: ["ecommerce-api", "auth", "database"])

[اليوم التالي]
أنت: "تابع من الأمس"
الوكيل: "جاري استدعاء السياق..."
→ recall(query="ecommerce-api")
→ يعيد: "جدول المستخدمين مع UUID، bcrypt، JWT + رموز التحديث"
Enter fullscreen mode Exit fullscreen mode

الخطوة 3: التكوين لـ Claude Code

أضف خادم الذاكرة إلى تكوين MCP:

حرر الملف ~/.claude/settings.json:

{
  "mcpServers": {
    "memory": {
      "command": "node",
      "args": ["/absolute/path/to/memory-server.js"],
      "env": {
        "HOME": "/Users/your-username"
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

أعد تشغيل Claude Code. أدوات الذاكرة الآن متاحة.

اختبار سريع:

استخدم أداة remember لتخزين: "ذاكرة اختبار لمشروع التجارة الإلكترونية"
العلامات: ["test", "ecommerce-api"]

استخدم أداة recall للبحث عن ذكريات حول "test"
Enter fullscreen mode Exit fullscreen mode

الخطوة 4: التكوين لـ Cursor

أنشئ ملف .cursor/mcp.json في مشروعك:

{
  "mcpServers": {
    "memory": {
      "command": "node",
      "args": ["/absolute/path/to/memory-server.js"]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

اختبر الأدوات:

@memory remember "بدء مشروع واجهة برمجة تطبيقات التجارة الإلكترونية باستخدام PostgreSQL"
العلامات: ["ecommerce-api", "setup"]

@memory recall query="ecommerce"
Enter fullscreen mode Exit fullscreen mode

أنماط الذاكرة لسير العمل الحقيقي

النمط 1: تسجيل القرارات

remember({
  content: "اخترت PostgreSQL بدلاً من MySQL للأسباب التالية: (1) دعم JSONB لسمات المنتجات المرنة، (2) بحث نصي كامل أفضل، (3) دعم UUID الأصلي",
  tags: ["ecommerce-api", "database", "decision"],
  agent: "Backend Architect"
})
// لاحقاً...
recall(query="PostgreSQL MySQL decision")
Enter fullscreen mode Exit fullscreen mode

النمط 2: تسليم المهام بين الوكلاء

remember({
  content: "الواجهة الخلفية مكتملة. نقاط النهاية: POST /auth/login, POST /auth/register, GET /products, POST /orders. المصادقة: JWT وصول 15 دقيقة + تحديث 7 أيام. معلق: تحديد المعدل، التحقق من البريد الإلكتروني. احتياجات الواجهة الأمامية: نموذج تسجيل الدخول، قائمة المنتجات، سلة التسوق، الدفع.",
  tags: ["ecommerce-api", "handoff", "backend-complete"],
  agent: "Backend Architect",
  for: "Frontend Developer"
})

// في بداية عمل المطور الجديد:
recall(query="handoff", agent="Backend Architect")
Enter fullscreen mode Exit fullscreen mode

النمط 3: نقاط حفظ الجلسات

remember({
  content: "اكتملت الجلسة. تم: جدول المستخدمين، نقاط نهاية المصادقة، مخطط المنتجات. الجلسة التالية: نظام الطلبات، webhook الدفع. عوائق: انتظار مفاتيح API لـ Stripe.",
  tags: ["ecommerce-api", "checkpoint", "session-1"],
  agent: "Backend Architect"
})

// استئناف الجلسة التالية:
recall(query="checkpoint session-1")
Enter fullscreen mode Exit fullscreen mode

النمط 4: تتبع الأخطاء

remember({
  content: "خطأ: رمز التحديث لا تنتهي صلاحيته بعد تسجيل الخروج. الرمز مخزن في الذاكرة، وليس مستمرًا. الحل: الانتقال إلى Redis مع TTL.",
  tags: ["ecommerce-api", "bug", "auth"],
  agent: "Code Reviewer",
  severity: "high"
})
// لاحقاً:
search(tags=["bug", "ecommerce-api"])
Enter fullscreen mode Exit fullscreen mode

استكشاف الأخطاء وإصلاحها

الذاكرة لا تستمر:

  • تحقق من مسار ملف الذاكرة (~/.mcp-memory/memories.json)
  • تأكد من تشغيل خادم MCP
  • تحقق من إعدادات Claude Code/Cursor

نتائج كثيرة عند الاستدعاء:

  • أضف علامات أدق
  • صفِ حسب اسم الوكيل
  • استخدم عبارات دقيقة

ملف ذاكرة ضخم:

  • أرشف الذكريات القديمة دوريًا
  • استخدم rollback لتنظيف المشاريع المكتملة
  • أضف تواريخ انتهاء صلاحية

ما قمت ببنائه

المكون الغرض
خادم ذاكرة MCP تخزين واسترجاع المعلومات عبر الجلسات
أداة remember تسجيل القرارات، المنتجات، عمليات التسليم
أداة recall البحث عن السياق من الجلسات السابقة
أداة search الاستعلام بواسطة العلامات عبر جميع الذكريات
أداة rollback الاستعادة إلى حالة سابقة عند الحاجة
أنماط الذاكرة تسجيل القرارات، التسليم، نقاط الحفظ، تتبع الأخطاء

الخطوات التالية

توسيع خادم الذاكرة:

  • أضف البحث الدلالي باستخدام التضمينات
  • نفّذ انتهاء صلاحية الذاكرة (أرشفة بعد 30 يومًا)
  • أضف تلخيص الذاكرة

بناء ذاكرة الفريق:

  • شارك خادم ذاكرة مركزيًا عبر فريقك
  • ضع علامات على الذكريات حسب المشروع والمطور
  • أنشئ تدفقات تأهيل للأعضاء الجدد

التكامل مع الأدوات:

  • سجل التزامات Git تلقائيًا كذكريات
  • المزامنة مع إدارة المشاريع (Jira, Linear)
  • تصدير الذكريات إلى التوثيقات

استكشاف المشكلات الشائعة وإصلاحها

الذاكرة لا تستمر بين الجلسات:

  • تأكد من تشغيل خادم MCP قبل تشغيل Claude Code
  • تحقق من وجود ملف الذاكرة: ls -la ~/.mcp-memory/memories.json
  • تأكد من أذونات الملف: chmod 644 ~/.mcp-memory/memories.json
  • تحقق من صحة المسار في ~/.claude/settings.json

الاستدعاء يعيد نتائج فارغة:

  • تأكد من مطابقة الاستعلام للعلامات (حساس لحالة الأحرف)
  • جرب مصطلحات أوسع أو استخدم search مع علامات
  • تحقق من تخزين الذكريات: cat ~/.mcp-memory/memories.json
  • طابق اسم الوكيل إذا كنت تستخدم عامل تصفية

ملف الذاكرة كبير جداً:

  • نفّذ أرشفة تلقائية للذكريات الأقدم من 30 يومًا
  • أضف أداة "prune" لحذف الذكريات حسب النطاق الزمني
  • قسم الذكريات حسب المشروع أو التاريخ
  • استخدم قاعدة بيانات (SQLite) بدلاً من JSON

فشل الخادم في البدء:

  • تحقق من إصدار Node.js: node --version (18+)
  • ثبّت التبعيات: npm install @modelcontextprotocol/sdk zod
  • تحقق من أخطاء بناء الجملة
  • شغّل مباشرة لرؤية الأخطاء: node memory-server.js

وكلاء متعددون يكتبون فوق ذكريات بعضهم:

  • استخدم دائمًا حقل agent مع remember
  • استخدم علامات فريدة لكل مشروع
  • صفِ الاستدعاء باسم الوكيل
  • استخدم ملفات ذاكرة منفصلة لكل مشروع إذا لزم الأمر

اعتبارات أمان خادم الذاكرة

تخزين مفتاح API:
فعّل التشفير للبيانات الحساسة:

import crypto from 'crypto';

const ENCRYPTION_KEY = process.env.MEMORY_ENCRYPTION_KEY;
const ALGORITHM = 'aes-256-gcm';

function encrypt(text) {
  const iv = crypto.randomBytes(16);
  const cipher = crypto.createCipheriv(ALGORITHM, Buffer.from(ENCRYPTION_KEY), iv);
  const encrypted = cipher.update(text, 'utf8', 'hex');
  return {
    encryptedData: encrypted + cipher.final('hex'),
    iv: iv.toString('hex'),
    authTag: cipher.getAuthTag().toString('hex')
  };
}

function decrypt(encrypted) {
  const decipher = crypto.createDecipheriv(
    ALGORITHM,
    Buffer.from(ENCRYPTION_KEY),
    Buffer.from(encrypted.iv, 'hex')
  );
  decipher.setAuthTag(Buffer.from(encrypted.authTag, 'hex'));
  return decipher.update(encrypted.encryptedData, 'hex', 'utf8') + decipher.final('utf8');
}
Enter fullscreen mode Exit fullscreen mode

التحكم في الوصول:

  • اطلب مفتاح API عند استدعاء أدوات الذاكرة
  • نفّذ مساحات أسماء لكل مستخدم
  • سجل جميع العمليات لأغراض التدقيق
  • حدّد معدل الطلبات لكل مستخدم

الآن وكلاء الذكاء الاصطناعي يمتلكون ذاكرة مستمرة.
يتذكرون الأمس، يستدعون القرارات، ويسلمون السياق بدون نسخ ولصق.

هذه هي قوة ذاكرة MCP: دفتر ملاحظات مشترك يجعل الوكلاء أكثر إنتاجية في مشاريع تدوم لأيام أو أسابيع.

الأسئلة الشائعة

ما هي ذاكرة MCP؟

ذاكرة MCP تطبيق بروتوكول يمكّن وكلاء الذكاء الاصطناعي من تخزين واسترجاع المعلومات عبر الجلسات—دفتر ملاحظات مشترك يحافظ على السياق.

كيف أقوم بإعداد ذاكرة مستمرة لـ Claude Code؟

ثبّت خادم ذاكرة MCP، أضفه إلى ~/.claude/settings.json مع أمر الخادم والمسار، وأعد تشغيل Claude Code لتفعيل أدوات الذاكرة.

ما هي وكلاء الذكاء الاصطناعي التي تدعم ذاكرة MCP؟

أي وكيل يعمل على عملاء متوافقين مع MCP (Claude Code, Cursor, Windsurf) يمكنه استخدام الأدوات بدون تعديل ملفات الوكيل—فقط أضف تعليمات الذاكرة في مطالباتك.

ما هي أفضل أنماط الذاكرة لتسليم المهام بين الوكلاء؟

استخدم remember مع علامات مثل ["handoff", "project-name"] لتسليم السياق. استدعها باستخدام recall(query="handoff").

كم يمكن لخوادم MCP تخزين الذاكرة؟

يعتمد على التنفيذ. الخادم المرجعي يستخدم JSON ينمو بلا حد. الإنتاج يفضل سياسات انتهاء الصلاحية أو قواعد بيانات خلفية.

هل يمكن للفرق مشاركة خادم ذاكرة مركزي؟

نعم—شغّل الخادم مركزيًا ووجّه جميع أعضاء الفريق إليه، مع وضع علامات للذكريات حسب المشروع والمطور.

ماذا لو أعاد الاستدعاء نتائج كثيرة جدًا؟

استخدم علامات أكثر تحديدًا، صفِ حسب اسم الوكيل، أو نفذ بحثًا دلاليًا لاسترجاع أذكى.

Top comments (0)