Tools: Yapay Zeka Ajanlarına Kalıcı Hafıza Ekleme (Dününü Hatırlaması İçin)

Tools: Yapay Zeka Ajanlarına Kalıcı Hafıza Ekleme (Dününü Hatırlaması İçin)

MCP Belleği Nedir?

Adım 1: Bir MCP Bellek Sunucusu Kurun

Seçenek A: Barındırılan bir bellek sunucusu kullanın

Seçenek B: Kendi yerel sunucunuzu yazın

Adım 2: Herhangi Bir Ajana Bellek Talimatları Ekleyin

Adım 3: Claude Code İçin Yapılandırın

Adım 4: Cursor İçin Yapılandırın

Gerçek İş Akışları İçin Bellek Kalıpları

Kalıp 1: Karar Günlüğü

Kalıp 2: Ajan Devirleri

Kalıp 3: Oturum Kontrol Noktaları

Kalıp 4: Hata Takibi

Sorun Giderme

Neler Yaptınız?

Sonraki Adımlar

Yaygın Sorun Giderme

Bellek Sunucusu Güvenlik Hususları

Sıkça Sorulan Sorular Yapay zeka ajanlarına 4 adımda kalıcı bellek ekleyin: (1) remember, recall, search ve rollback araçlarıyla bir MCP bellek sunucusu kurun, (2) Ajan istemlerine bellek talimatları ekleyin, (3) Claude Code için ~/.claude/settings.json veya Cursor için .cursor/mcp.json dosyasını yapılandırın, (4) Karar kaydı, ajan devirleri ve oturum kontrol noktaları için bellek kalıplarını kullanın. Ajanlar oturumlar arası bağlamı korur; artık önceki konuşmaları kopyala-yapıştırmaya gerek yok. Apidog'u bugün deneyin “Dünü hatırlamıyorum” sorununu çözün. MCP protokolünü kullanarak yapay zeka ajanlarına kalıcı bellek ekleyin, böylece önceki oturumlardaki kararları, teslim edilebilirleri ve bağlamı hatırlayacaklar. Sistemi biliyorsunuz: Önceki konuşmayı kopyalayıp yapıştırıyorsunuz. Ajan 2000 satır bağlamı okuyor. İkiniz de hızlanmak için 15 dakika harcıyorsunuz. Kalıcı bellek bunu düzeltir. MCP (Model Bağlam Protokolü) belleği ile ajanlar kararları otomatik olarak depolar ve gerektiğinde geri çağırır. Kopyala-yapıştır yok. Yeniden açıklama yok. Bu eğitimde, yapay zeka ajanları için MCP belleği kuracaksınız. Backend Architect oturumlarından alınan kararları nasıl depolayacağınızı, Database Optimizer'a geçerken bağlamı nasıl geri çağıracağınızı ve Frontend Developer'a teslim edilebilirleri nasıl devredeceğinizi—tüm bunları bağlamı kaybetmeden—öğreneceksiniz. Aynı bellek kalıpları, Apidog entegrasyonu ile API'ler oluşturuyor veya çok günlük geliştirme sprintlerini yönetiyor olsanız da işe yarar. MCP belleği, yapay zeka ajanlarının oturumlar arasında bilgi depolamasını ve almasını sağlar. Bunu, ajanların yazıp okuyabileceği ortak bir not defteri gibi düşünün. MCP belleğini destekleyen dört ana araç: Bellek araçlarını kullanabilmek için bir MCP sunucusu kurmanız gerekir. İki pratik yolunuz var: memory-server.js dosyası oluşturun: Ajan dosyalarını değiştirmeden bellek protokolünü kullanabilirsiniz. İstemlerinize aşağıdaki gibi talimatlar ekleyin: Bellek sunucusunu Claude Code'a eklemek için: ~/.claude/settings.json dosyanızı şu şekilde güncelleyin: Claude Code'u yeniden başlatın. Bellek araçları artık kullanılabilir. Projenizin köküne .cursor/mcp.json dosyası ekleyin: Her teknik kararı aşağıdaki gibi kaydedin: Ajan değiştirirken devri not alın: Frontend Developer başlarken: Bellek kalıcı olmuyor: Geri çağırmada çok fazla sonuç: Bellek dosyası büyüyor: Bellek sunucusunu genişletmek için: Ekip belleği oluşturmak için: Araç entegrasyonu için: Bellek oturumlar arasında kalıcı olmuyor: Geri çağırma boş sonuç dönüyor: Bellek dosyası çok büyüyor: Sunucu başlatılamıyor: Birden fazla ajan birbirinin anılarını üzerine yazıyor: API Anahtarı Depolama: Hassas veriler (API anahtarları, parolalar) kaydediyorsanız, şifreleme uygulayın: Erişim Kontrolü: Ekip bellek sunucularında kimlik doğrulama ekleyin: Yapay zeka ajanlarınız artık kalıcı belleğe sahip. Dünü hatırlıyorlar. Kararları geri çağırıyorlar. Kopyala-yapıştır yapmadan bağlamı devrediyorlar. Artık "Önceki oturumlardan bağlamım yok." yok. Artık yeniden açıklama yok. Artık zaman kaybı yok. MCP belleğinin gücü budur: ajanlarınıza ortak bir not defteri verin ve çok günlük projelerde gerçekten kullanışlı hale geldiklerini izleyin. MCP belleği nedir?

MCP belleği, yapay zeka ajanlarının oturumlar arasında bilgi depolamasını ve almasını sağlayan bir protokol uygulamasıdır. Ajanların tek konuşma ötesinde bağlamı kalıcı kılan ortak bir not defteri gibi davranır. Claude Code için kalıcı bellek nasıl kurarım?Bir MCP bellek sunucusu kurun, ardından sunucu komutu ve yolunu ~/.claude/settings.json dosyasına ekleyin. Claude Code'u yeniden başlatın ve bellek araçları (remember, recall, search, rollback) kullanılabilir olacaktır. Hangi yapay zeka ajanları MCP belleğini destekler?MCP uyumlu istemcilerde (Claude Code, Cursor, Windsurf) çalışan herhangi bir ajan bellek araçlarını kullanabilir. Ajan dosyalarını değiştirmenize gerek yok, sadece istemlerinize bellek talimatları ekleyin. Ajan devirleri için en iyi bellek kalıpları nelerdir?Bir sonraki ajan için bağlam bırakmak amacıyla remember'ı ["devir", "proje-adı"] gibi etiketlerle kullanın. Tamamlanan işleri, bekleyen öğeleri ve bilinen sorunları dahil edin. Alan ajan, recall(query="devir") çağrısı yaparak bunu alır. MCP sunucuları ne kadar bellek depolayabilir?Uygulamaya bağlıdır. Referans sunucu, süresiz olarak büyüyen bir JSON dosyası kullanır. Üretim sunucuları, büyük ölçek için sona erme politikaları, otomatik arşivleme veya bir veritabanı arka ucu eklemelidir. Ekipler merkezi bir bellek sunucusunu paylaşabilir mi?Evet. Bellek sunucusunu paylaşılan bir makinede veya bulutta çalıştırın, tüm ekip üyelerinin istemcilerini ona bağlayın ve düzenli geri alma için anıları projeye ve geliştiriciye göre etiketleyin. Bellek geri çağırma çok fazla sonuç döndürürse ne olur?

Anıları saklarken daha spesifik etiketler ekleyin. Geri çağırma sorgularında ajan adına göre filtreleyin. Tırnak içinde tam ifadeler kullanın. Daha akıllı geri alma için gömme ile anlamsal arama eklemeyi değerlendirin. Templates let you quickly answer FAQs or store snippets for re-use. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse

Code Block

Copy

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?" 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?" 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?" ┌─────────────────┐ ┌──────────────────┐ ┌─────────────┐ │ AI Agent │ │ MCP Memory │ │ Storage │ │ (Claude Code) │◄───────►│ Server │◄───────►│ (SQLite) │ └─────────────────┘ JSON └──────────────────┘ I/O └─────────────┘ ┌─────────────────┐ ┌──────────────────┐ ┌─────────────┐ │ AI Agent │ │ MCP Memory │ │ Storage │ │ (Claude Code) │◄───────►│ Server │◄───────►│ (SQLite) │ └─────────────────┘ JSON └──────────────────┘ I/O └─────────────┘ ┌─────────────────┐ ┌──────────────────┐ ┌─────────────┐ │ AI Agent │ │ MCP Memory │ │ Storage │ │ (Claude Code) │◄───────►│ Server │◄───────►│ (SQLite) │ └─────────────────┘ JSON └──────────────────┘ I/O └─────────────┘ npm install -g @example/mcp-memory-server npm install -g @example/mcp-memory-server npm install -g @example/mcp-memory-server 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 => (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") }] }; } ); // 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); 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 => (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") }] }; } ); // 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); 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 => (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") }] }; } ); // 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 node memory-server.js node memory-server.js Yapay zeka bellek araçlarına erişiminiz var: remember, recall, search, rollback. Bu bellek protokollerini uygulayın: **Bir oturum başlattığınızda:** 1. Bağlamı geri çağırın: recall(query="ecommerce-api", agent="Backend Architect") 2. Son oturumdan kalan bekleyen öğeleri gözden geçirin **İşi tamamladığınızda:** 1. Teslim edilebilirleri etiketlerle kaydedin: - remember(content="UUID birincil anahtarlı kullanıcı tablosu, bcrypt parola hash'leme, yenileme belirteçleriyle JWT kimlik doğrulaması oluşturuldu", tags=["ecommerce-api", "database", "auth"], agent="Backend Architect") 2. Alınan kararları ve bekleyen öğeleri dahil edin **Başka bir ajana devrettiğinizde:** 1. Alıcı ajan için bağlam bırakın: - remember(content="API uç noktaları: /auth/login, /auth/register, /products, /orders. Kimlik doğrulama akışı: JWT erişim belirteci (15dk) + yenileme belirteci (7 gün). Bilinen sorun: hız sınırlaması henüz uygulanmadı", tags=["ecommerce-api", "handoff"], agent="Backend Architect", for="Frontend Developer") **Bir şeyler başarısız olduğunda:** 1. Son bilinen iyi durumu arayın 2. Geri yüklemek için rollback kullanın Yapay zeka bellek araçlarına erişiminiz var: remember, recall, search, rollback. Bu bellek protokollerini uygulayın: **Bir oturum başlattığınızda:** 1. Bağlamı geri çağırın: recall(query="ecommerce-api", agent="Backend Architect") 2. Son oturumdan kalan bekleyen öğeleri gözden geçirin **İşi tamamladığınızda:** 1. Teslim edilebilirleri etiketlerle kaydedin: - remember(content="UUID birincil anahtarlı kullanıcı tablosu, bcrypt parola hash'leme, yenileme belirteçleriyle JWT kimlik doğrulaması oluşturuldu", tags=["ecommerce-api", "database", "auth"], agent="Backend Architect") 2. Alınan kararları ve bekleyen öğeleri dahil edin **Başka bir ajana devrettiğinizde:** 1. Alıcı ajan için bağlam bırakın: - remember(content="API uç noktaları: /auth/login, /auth/register, /products, /orders. Kimlik doğrulama akışı: JWT erişim belirteci (15dk) + yenileme belirteci (7 gün). Bilinen sorun: hız sınırlaması henüz uygulanmadı", tags=["ecommerce-api", "handoff"], agent="Backend Architect", for="Frontend Developer") **Bir şeyler başarısız olduğunda:** 1. Son bilinen iyi durumu arayın 2. Geri yüklemek için rollback kullanın Yapay zeka bellek araçlarına erişiminiz var: remember, recall, search, rollback. Bu bellek protokollerini uygulayın: **Bir oturum başlattığınızda:** 1. Bağlamı geri çağırın: recall(query="ecommerce-api", agent="Backend Architect") 2. Son oturumdan kalan bekleyen öğeleri gözden geçirin **İşi tamamladığınızda:** 1. Teslim edilebilirleri etiketlerle kaydedin: - remember(content="UUID birincil anahtarlı kullanıcı tablosu, bcrypt parola hash'leme, yenileme belirteçleriyle JWT kimlik doğrulaması oluşturuldu", tags=["ecommerce-api", "database", "auth"], agent="Backend Architect") 2. Alınan kararları ve bekleyen öğeleri dahil edin **Başka bir ajana devrettiğinizde:** 1. Alıcı ajan için bağlam bırakın: - remember(content="API uç noktaları: /auth/login, /auth/register, /products, /orders. Kimlik doğrulama akışı: JWT erişim belirteci (15dk) + yenileme belirteci (7 gün). Bilinen sorun: hız sınırlaması henüz uygulanmadı", tags=["ecommerce-api", "handoff"], agent="Backend Architect", for="Frontend Developer") **Bir şeyler başarısız olduğunda:** 1. Son bilinen iyi durumu arayın 2. Geri yüklemek için rollback kullanın You: "Backend Architect modunu etkinleştir. E-ticaret API'mız için kullanıcı sistemini tasarla." [Agent sistemi tasarlar, şema oluşturur, kimlik doğrulamayı uygular] Agent: "Kullanıcı sistemi tamamlandı. Bellek depolanıyor..." → Çağırır: remember("UUID, bcrypt, JWT + yenileme belirteçleriyle kullanıcı tablosu", tags: ["ecommerce-api", "auth", "database"]) [Oturum sona erer] [Ertesi gün] You: "Dünden devam et" Agent: "Bağlam geri çağrılıyor..." → Çağırır: recall(query="ecommerce-api") → Döndürür: "UUID, bcrypt, JWT + yenileme belirteçleriyle kullanıcı tablosu" Agent: "Dün UUID birincil anahtarlı kullanıcı tablosunu tasarladım, bcrypt parola hash'lemeyi uyguladım ve yenileme belirteçleriyle JWT kimlik doğrulamasını kurdum. Sonraki adım: ürün kataloğu şeması. Devam etmeye hazır." You: "Backend Architect modunu etkinleştir. E-ticaret API'mız için kullanıcı sistemini tasarla." [Agent sistemi tasarlar, şema oluşturur, kimlik doğrulamayı uygular] Agent: "Kullanıcı sistemi tamamlandı. Bellek depolanıyor..." → Çağırır: remember("UUID, bcrypt, JWT + yenileme belirteçleriyle kullanıcı tablosu", tags: ["ecommerce-api", "auth", "database"]) [Oturum sona erer] [Ertesi gün] You: "Dünden devam et" Agent: "Bağlam geri çağrılıyor..." → Çağırır: recall(query="ecommerce-api") → Döndürür: "UUID, bcrypt, JWT + yenileme belirteçleriyle kullanıcı tablosu" Agent: "Dün UUID birincil anahtarlı kullanıcı tablosunu tasarladım, bcrypt parola hash'lemeyi uyguladım ve yenileme belirteçleriyle JWT kimlik doğrulamasını kurdum. Sonraki adım: ürün kataloğu şeması. Devam etmeye hazır." You: "Backend Architect modunu etkinleştir. E-ticaret API'mız için kullanıcı sistemini tasarla." [Agent sistemi tasarlar, şema oluşturur, kimlik doğrulamayı uygular] Agent: "Kullanıcı sistemi tamamlandı. Bellek depolanıyor..." → Çağırır: remember("UUID, bcrypt, JWT + yenileme belirteçleriyle kullanıcı tablosu", tags: ["ecommerce-api", "auth", "database"]) [Oturum sona erer] [Ertesi gün] You: "Dünden devam et" Agent: "Bağlam geri çağrılıyor..." → Çağırır: recall(query="ecommerce-api") → Döndürür: "UUID, bcrypt, JWT + yenileme belirteçleriyle kullanıcı tablosu" Agent: "Dün UUID birincil anahtarlı kullanıcı tablosunu tasarladım, bcrypt parola hash'lemeyi uyguladım ve yenileme belirteçleriyle JWT kimlik doğrulamasını kurdum. Sonraki adım: ürün kataloğu şeması. Devam etmeye hazır." { "mcpServers": { "memory": { "command": "node", "args": ["/absolute/path/to/memory-server.js"], "env": { "HOME": "/Users/your-username" } } } } { "mcpServers": { "memory": { "command": "node", "args": ["/absolute/path/to/memory-server.js"], "env": { "HOME": "/Users/your-username" } } } } { "mcpServers": { "memory": { "command": "node", "args": ["/absolute/path/to/memory-server.js"], "env": { "HOME": "/Users/your-username" } } } } remember aracı ile "E-ticaret projesi için test belleği" kaydedin Tags: ["test", "ecommerce-api"] recall aracı ile "test" etiketli anıları sorgulayın remember aracı ile "E-ticaret projesi için test belleği" kaydedin Tags: ["test", "ecommerce-api"] recall aracı ile "test" etiketli anıları sorgulayın remember aracı ile "E-ticaret projesi için test belleği" kaydedin Tags: ["test", "ecommerce-api"] recall aracı ile "test" etiketli anıları sorgulayın { "mcpServers": { "memory": { "command": "node", "args": ["/absolute/path/to/memory-server.js"] } } } { "mcpServers": { "memory": { "command": "node", "args": ["/absolute/path/to/memory-server.js"] } } } { "mcpServers": { "memory": { "command": "node", "args": ["/absolute/path/to/memory-server.js"] } } } @memory remember "PostgreSQL ile e-ticaret API projesi başlatılıyor" Tags: ["ecommerce-api", "setup"] @memory recall query="ecommerce" @memory remember "PostgreSQL ile e-ticaret API projesi başlatılıyor" Tags: ["ecommerce-api", "setup"] @memory recall query="ecommerce" @memory remember "PostgreSQL ile e-ticaret API projesi başlatılıyor" Tags: ["ecommerce-api", "setup"] @memory recall query="ecommerce" remember({ content: "PostgreSQL'i MySQL yerine seçme nedenleri: (1) Esnek ürün nitelikleri için JSONB desteği, (2) daha iyi tam metin arama, (3) yerel UUID desteği", tags: ["ecommerce-api", "database", "decision"], agent: "Backend Architect" }) remember({ content: "PostgreSQL'i MySQL yerine seçme nedenleri: (1) Esnek ürün nitelikleri için JSONB desteği, (2) daha iyi tam metin arama, (3) yerel UUID desteği", tags: ["ecommerce-api", "database", "decision"], agent: "Backend Architect" }) remember({ content: "PostgreSQL'i MySQL yerine seçme nedenleri: (1) Esnek ürün nitelikleri için JSONB desteği, (2) daha iyi tam metin arama, (3) yerel UUID desteği", tags: ["ecommerce-api", "database", "decision"], agent: "Backend Architect" }) recall(query="PostgreSQL MySQL karar") recall(query="PostgreSQL MySQL karar") recall(query="PostgreSQL MySQL karar") remember({ content: "Backend tamamlandı. Uç noktalar: POST /auth/login, POST /auth/register, GET /products, POST /orders. Kimlik doğrulama: JWT 15dk erişim + 7 gün yenileme. Bekleyenler: hız sınırlaması, e-posta doğrulama. Frontend ihtiyaçları: giriş formu, ürün listesi, sepet, ödeme.", tags: ["ecommerce-api", "handoff", "backend-complete"], agent: "Backend Architect", for: "Frontend Developer" }) remember({ content: "Backend tamamlandı. Uç noktalar: POST /auth/login, POST /auth/register, GET /products, POST /orders. Kimlik doğrulama: JWT 15dk erişim + 7 gün yenileme. Bekleyenler: hız sınırlaması, e-posta doğrulama. Frontend ihtiyaçları: giriş formu, ürün listesi, sepet, ödeme.", tags: ["ecommerce-api", "handoff", "backend-complete"], agent: "Backend Architect", for: "Frontend Developer" }) remember({ content: "Backend tamamlandı. Uç noktalar: POST /auth/login, POST /auth/register, GET /products, POST /orders. Kimlik doğrulama: JWT 15dk erişim + 7 gün yenileme. Bekleyenler: hız sınırlaması, e-posta doğrulama. Frontend ihtiyaçları: giriş formu, ürün listesi, sepet, ödeme.", tags: ["ecommerce-api", "handoff", "backend-complete"], agent: "Backend Architect", for: "Frontend Developer" }) recall(query="handoff", agent="Backend Architect") recall(query="handoff", agent="Backend Architect") recall(query="handoff", agent="Backend Architect") remember({ content: "Oturum tamamlandı. Yapılanlar: kullanıcı tablosu, kimlik doğrulama uç noktaları, ürün şeması. Sonraki oturum: sipariş sistemi, ödeme web kancası. Engelleyiciler: Stripe API anahtarları bekleniyor.", tags: ["ecommerce-api", "checkpoint", "session-1"], agent: "Backend Architect" }) remember({ content: "Oturum tamamlandı. Yapılanlar: kullanıcı tablosu, kimlik doğrulama uç noktaları, ürün şeması. Sonraki oturum: sipariş sistemi, ödeme web kancası. Engelleyiciler: Stripe API anahtarları bekleniyor.", tags: ["ecommerce-api", "checkpoint", "session-1"], agent: "Backend Architect" }) remember({ content: "Oturum tamamlandı. Yapılanlar: kullanıcı tablosu, kimlik doğrulama uç noktaları, ürün şeması. Sonraki oturum: sipariş sistemi, ödeme web kancası. Engelleyiciler: Stripe API anahtarları bekleniyor.", tags: ["ecommerce-api", "checkpoint", "session-1"], agent: "Backend Architect" }) recall(query="checkpoint session-1") recall(query="checkpoint session-1") recall(query="checkpoint session-1") remember({ content: "HATA: Çıkış yaptıktan sonra yenileme belirteci sona ermiyor. Belirteç bellekte depolanıyor, kalıcı değil. Düzeltme: Redis'e TTL ile taşı.", tags: ["ecommerce-api", "bug", "auth"], agent: "Code Reviewer", severity: "high" }) remember({ content: "HATA: Çıkış yaptıktan sonra yenileme belirteci sona ermiyor. Belirteç bellekte depolanıyor, kalıcı değil. Düzeltme: Redis'e TTL ile taşı.", tags: ["ecommerce-api", "bug", "auth"], agent: "Code Reviewer", severity: "high" }) remember({ content: "HATA: Çıkış yaptıktan sonra yenileme belirteci sona ermiyor. Belirteç bellekte depolanıyor, kalıcı değil. Düzeltme: Redis'e TTL ile taşı.", tags: ["ecommerce-api", "bug", "auth"], agent: "Code Reviewer", severity: "high" }) search(tags=["bug", "ecommerce-api"]) search(tags=["bug", "ecommerce-api"]) search(tags=["bug", "ecommerce-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'); } 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'); } 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'); } - Bellek dosyası yolunu kontrol edin (~/.mcp-memory/memories.json) - MCP sunucusunun çalıştığından emin olun - Claude Code/Cursor'ın MCP yapılandırmasını doğrulayın - Daha spesifik etiketler ekleyin - Ajan adına göre filtreleyin - Tırnak içinde tam ifadeler kullanın - Eski anıları periyodik olarak arşivleyin - Tamamlanan projeleri temizlemek için rollback kullanın - Bellek verinize son kullanma tarihi ekleyin - Gömme ile anlamsal arama ekleyin - Bellek sona erme (30 gün sonra otomatik arşivleme) uygulayın - Bellek özetleme (uzun oturumları yoğunlaştırma) ekleyin - Merkezî bir bellek sunucusu paylaşın - Anıları projeye ve geliştiriciye göre etiketleyin - Yeni ekip üyeleri için işe alım akışları oluşturun - Git commit'lerini otomatik anı olarak kaydedin - Proje yönetimi araçları (Jira, Linear) ile senkronize edin - Anıları dökümana aktarın - Claude Code'u başlatmadan önce MCP sunucusunun çalıştığını kontrol edin - Bellek dosyası yolunun mevcut olduğunu doğrulayın: ls -la ~/.mcp-memory/memories.json - Dosya izinlerinin okuma/yazmaya izin verdiğinden emin olun: chmod 644 ~/.mcp-memory/memories.json - ~/.claude/settings.json içindeki sunucu yolunun doğru olduğundan emin olun - Sorgunun depolanan etiketlerle eşleştiğini kontrol edin (büyük/küçük harf duyarlı) - Daha genel aramalar veya belirli etiketlerle search deneyin - Anıların kaydedildiğini doğrulayın: cat ~/.mcp-memory/memories.json - agent filtresi aktifse doğru ajan adını kullandığınızdan emin olun - 30 günden eski anılar için otomatik arşivleme uygulayın - Tarih aralığına göre silme yapan bir prune aracı ekleyin - Anıları projeye veya tarihe göre ayrı dosyalara bölün - Büyük ölçekli kullanımda JSON yerine SQLite gibi bir veritabanı arka ucu kullanın - Node.js sürümünü kontrol edin: node --version (18+ olmalı) - Eksik bağımlılıkları yükleyin: npm install @modelcontextprotocol/sdk zod - Sunucu kodunda sözdizimi hatalarını kontrol edin - Hataları görmek için doğrudan çalıştırın: node memory-server.js - remember çağrılarında mutlaka agent alanını doldurun - Proje başına benzersiz etiketler kullanın: ["project-x", "backend", "auth"] - Geri çağırırken ajan adına göre filtreleyin - Gerekirse proje başına ayrı bellek dosyaları kullanın - Bellek aracı çağrılarında API anahtarı isteyin - Kullanıcıya özel namespace kullanın - Tüm bellek işlemlerini denetim amaçlı kaydedin - Kullanıcı başına hız limiti ekleyin