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

Ashley Innocent

Ashley Innocent

19 مارس 2026

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

enterprise.banner.title

enterprise.banner.feature1

enterprise.banner.feature2

enterprise.banner.feature3

enterprise.banner.ctaB

TL;DR

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

حل مشكلة "لا أتذكر الأمس". أضف ذاكرة مستمرة لوكلاء الذكاء الاصطناعي باستخدام بروتوكول 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?"

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

الذاكرة المستمرة تصلح هذا. باستخدام ذاكرة MCP (بروتوكول سياق النموذج)، يقوم الوكلاء بتخزين القرارات تلقائيًا واستدعائها عند الحاجة. لا يوجد نسخ ولصق. لا يوجد إعادة شرح.

في هذا البرنامج التعليمي، ستقوم بإعداد ذاكرة MCP لوكلاء الذكاء الاصطناعي. ستتعلم كيفية تخزين القرارات من جلسات مهندس الواجهة الخلفية (Backend Architect)، واستدعاء السياق عند التبديل إلى مُحسِّن قواعد البيانات (Database Optimizer)، وتسليم المنتجات إلى مطور الواجهة الأمامية (Frontend Developer)—كل ذلك دون فقدان السياق. تعمل أنماط الذاكرة نفسها سواء كنت تقوم ببناء واجهات برمجة تطبيقات (APIs) مع تكامل Apidog أو إدارة دورات تطوير تمتد لأيام متعددة.

زر

ما هي ذاكرة MCP؟

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

أربع أدوات تشغل ذاكرة MCP:

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

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

تحتاج إلى خادم MCP يكشف أدوات الذاكرة. توجد العديد من التطبيقات مفتوحة المصدر.

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

npm install -g @example/mcp-memory-server

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

أنشئ ملف `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"
});

// Ensure memory file exists
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([]));
  }
}

// Tool: 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(", ")}` }] };
  }
);

// Tool: 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 => {
      const matchesQuery = m.content.toLowerCase().includes(query.toLowerCase()) ||
                          m.tags.some(t => t.toLowerCase().includes(query.toLowerCase()));
      const matchesAgent = !agent || m.agent === agent;
      return matchesQuery && matchesAgent;
    });
    return {
      content: [{
        type: "text",
        text: results.length === 0
          ? "No memories found"
          : results.map(m => `[${m.timestamp}] ${m.content}`).join("\n\n")
      }]
    };
  }
);

// Tool: 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")
      }]
    };
  }
);

// Tool: 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);

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

node memory-server.js

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

لا تحتاج إلى تعديل ملفات الوكيل. أضف تعليمات الذاكرة في طلبك:

لديك وصول إلى أدوات ذاكرة 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")
2. تضمين القرارات المتخذة والعناصر المعلقة

**عند تسليم المهام لوكيل آخر:**
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 للاستعادة

مثال عملي:

أنت: "تفعيل وضع مهندس الواجهة الخلفية. صمم نظام المستخدمين لواجهة برمجة تطبيقات التجارة الإلكترونية الخاصة بنا."

[يقوم الوكيل بتصميم النظام، وإنشاء المخطط، وتنفيذ المصادقة]

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

[تنتهي الجلسة]

[اليوم التالي]

أنت: "تابع من الأمس"

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

الوكيل: "بالأمس قمت بتصميم جدول المستخدمين بمفاتيح أساسية UUID، ونفذت تجزئة كلمات المرور bcrypt، وأعددت مصادقة JWT مع رموز التحديث. الخطوة التالية: مخطط كتالوج المنتجات. جاهز للمتابعة."

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

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

عدّل `~/.claude/settings.json`:

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

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

اختبرها:

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

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

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

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

اختبرها:

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

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

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

في كل مرة تتخذ فيها قرارًا تقنيًا، قم بتسجيله:

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

لاحقًا، عندما يسأل أحدهم "لماذا PostgreSQL؟":

recall(query="PostgreSQL MySQL decision")

النمط 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")

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

في نهاية كل جلسة عمل:

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

استئناف الجلسة التالية:

recall(query="checkpoint session-1")

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

عندما تجد خطأ:

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

ابحث عن الأخطاء لاحقًا:

search(tags=["bug", "ecommerce-api"])

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

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

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

ملف الذاكرة ينمو بشكل كبير:

ما قمت ببنائه

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

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

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

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

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

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

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

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

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

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

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

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

تخزين مفتاح API:إذا كان خادم الذاكرة الخاص بك يخزن بيانات حساسة (مفاتيح 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');
}

التحكم في الوصول:لخوادم ذاكرة الفريق، أضف المصادقة:

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

لا مزيد من "ليس لدي سياق من الجلسات السابقة." لا مزيد من إعادة الشرح. لا مزيد من الوقت الضائع.

هذه هي قوة ذاكرة MCP: امنح وكلاءك دفتر ملاحظات مشتركًا، وشاهدهم يصبحون مفيدين حقًا عبر المشاريع التي تستغرق عدة أيام.

زر

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

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

كيف أقوم بإعداد ذاكرة مستمرة لـ Claude Code؟قم بتثبيت خادم ذاكرة MCP، ثم أضفه إلى `~/.claude/settings.json` مع أمر الخادم والمسار. أعد تشغيل Claude Code وستصبح أدوات الذاكرة (`remember`، `recall`، `search`، `rollback`) متاحة.

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

ما هي أفضل أنماط الذاكرة لتسليم المهام بين الوكلاء؟استخدم `remember` مع علامات مثل `["handoff", "project-name"]` لترك السياق للوكيل التالي. قم بتضمين العمل المكتمل، والعناصر المعلقة، والمشكلات المعروفة. يستدعي الوكيل المستلم `recall(query="handoff")` لاستردادها.

كم يمكن لخوادم MCP تخزين الذاكرة؟يعتمد ذلك على التنفيذ. يستخدم الخادم المرجعي ملف JSON ينمو إلى أجل غير مسمى. يجب أن تضيف خوادم الإنتاج سياسات انتهاء الصلاحية، أو الأرشفة التلقائية، أو قواعد البيانات الخلفية للاستخدام على نطاق واسع.

هل يمكن للفرق مشاركة خادم ذاكرة مركزي؟نعم. قم بتشغيل خادم الذاكرة على جهاز مشترك أو في مثيل سحابي، وقم بتكوين جميع عملاء أعضاء الفريق للاتصال به، ووضع علامات على الذكريات حسب المشروع والمطور لتنظيم الاسترجاع.

ماذا لو أعاد استدعاء الذاكرة نتائج كثيرة جدًا؟أضف علامات أكثر تحديدًا عند تخزين الذكريات. قم بالتصفية حسب اسم الوكيل في استعلامات الاستدعاء الخاصة بك. استخدم عبارات دقيقة بين علامتي اقتباس. فكر في تنفيذ البحث الدلالي باستخدام التضمينات لاسترجاع أكثر ذكاءً.

ممارسة تصميم API في Apidog

اكتشف طريقة أسهل لبناء واستخدام واجهات برمجة التطبيقات