AI Automation

Hết context, claude code mất trí nhớ? Hướng dẫn giữ trạng thái

Bạn đang code với Claude Code trong VS Code, đang làm dở một tính năng quan trọng, mọi thứ đã được giải thích rõ ràng với AI... rồi vô tình refresh, tạo tab mới, hoặc restart extension, và Claude Code như thể "anh là ai, chúng ta đang làm gì ở đây?". Không chỉ bạn gặp chuyện này. Đây là câu hỏi top trên Reddit, GitHub Issues và Discord của Anthropic, đặc biệt với dân dev chạy Claude Code trên thuê VPS Linux hoặc môi trường remote qua SSH. Bài viết này sẽ cho bạn cách giữ trạng thái triệt để, không chỉ copy-paste hội thoại cũ.

Tóm tắt nhanh, giải quyết vấn đề mất ngữ cảnh Claude Code

  • Claude Code bản 0.x mặc định KHÔNG tự động lưu lịch sử hội thoại giữa các session, mỗi session mới bắt đầu từ trạng thái "sạch".
  • Giải pháp chính: dùng claude_code_memory.json (local memory file) và .claude_project.md (project context file) để "tiêm" ngữ cảnh cốt lõi vào mỗi lần chat mới.
  • Cách mạnh hơn: thiết lập MCP (Model Context Protocol) server tự xây, lưu trạng thái Redis/SQLite cho Claude truy vấn lại.
  • Kết hợp với prompt engineering: soạn system prompt chuẩn + checkpoint file, bảo toàn được tiến độ cả project.

Vì sao Claude Code "quên" khi qua session mới?

Không phải bug. Đó là cách hoạt động có chủ ý của kiến trúc AI hiện tại. Mỗi lần bạn bắt đầu một cuộc trò chuyện mới với Claude Code, nó tạo một "context window" mới, giống như bạn mở một tab Chrome trắng tinh. Mọi thông tin từ session trước (kể cả code vừa viết, lỗi vừa sửa, kiến trúc vừa giải thích) đều biến mất, trừ khi bạn chủ động lưu chúng bằng memory hoặc file context.

Với dân dev chạy trên VPS Việt Nam qua Remote-SSH của VS Code, việc mất kết nối mạng hay restart service càng dễ mất session hơn. Đừng lo, sau đây là cách giữ lại 95% ngữ cảnh, kể cả khi session "bay màu" giữa chừng.

Bước 1, Thiết lập file memory cho Claude Code

Đây là cách đơn giản nhất: tạo một file JSON ở thư mục gốc của project. Claude Code sẽ được hướng dẫn ghi và đọc file này mỗi lần làm việc.

# Tạo file memory ngay trong project
touch claude_code_memory.json
nano claude_code_memory.json

Nội dung mẫu:

{
  "project": "tên_project",
  "technologies": ["Node.js", "Express", "PostgreSQL", "React"],
  "current_feature": "Đang làm tính năng đăng nhập OAuth 2.0 với Google",
  "last_action": "Viết xong model User và migration cho bảng users",
  "known_bugs": ["Chưa xử lý trường hợp token hết hạn", "Cần validate email registration"],
  "decision_log": [
    {"date": "2026-03-20", "decision": "Dùng Passport.js làm middleware auth"},
    {"date": "2026-03-21", "decision": "JWT token lưu ở httpOnly cookie, không localStorage"}
  ]
}

Verification: File này phải nằm cùng cấp với .claude/settings.json. Mỗi khi bắt đầu session mới, hãy mở file này ra và yêu cầu Claude Code "đọc claude_code_memory.json để tiếp tục". Bạn cũng có thể tự động hóa bằng cách thêm vào .claude_project.md ở bước sau.

Lưu ý: File này không tự động được Claude Code đọc khi mới mở. Bạn phải chủ động gửi nội dung file đó vào prompt đầu tiên hoặc cấu hình trong .claude/settings.json để nó luôn được include.

Bước 2, Tạo .claude_project.md, file ngữ cảnh cốt lõi

Đây là file markdown ở thư mục gốc project, mô tả kiến trúc, quy tắc, convention, và trạng thái hiện tại. Khác với memory JSON ghi chi tiết từng bước, file này là "bộ não cố định" của dự án.

# Tạo file ở thư mục project
touch .claude_project.md

Nội dung mẫu:

# Project MyApp - Context cho Claude

## Kiến trúc
- Backend: Node.js (Express) trên port 3000
- Frontend: React (Vite) trên port 5173
- Database: PostgreSQL 16, tên db "myapp_dev"
- Auth: Passport.js với Google Strategy, JWT token

## Coding conventions
- Sử dụng ES modules (import/export), không CommonJS
- Tên file: PascalCase cho components, camelCase cho utils
- API trả về JSON format: { success: bool, data: ?, error: string? }
- Tất cả route handler phải có try-catch

## Trạng thái hiện tại (cập nhật thủ công)
- [x] Khởi tạo project, setup Express + React
- [x] Kết nối database, tạo model User
- [ ] Đang làm: Google OAuth login (đang ở bước frontend redirect)
- [ ] Cần làm: callback route /auth/google/callback

## Lưu ý cho Claude
- Trước khi sửa file, hãy kiểm tra file có đang được sử dụng bởi module khác không
- Không thay đổi cấu trúc database migration đã chạy
- Luôn kiểm tra log lỗi ở /var/log/myapp/error.log

Cách dùng: Khi mở session mới, dùng prompt: "Hãy đọc .claude_project.md và claude_code_memory.json, sau đó tiếp tục công việc hiện tại.", Claude sẽ nạp toàn bộ ngữ cảnh và biết ngay đang làm gì.

Bước 3, Dùng MCP Server để lưu trạng thái chuyên nghiệp

MCP (Model Context Protocol) là giao thức cho phép Claude truy cập các công cụ bên ngoài. Một MCP server (viết bằng Python hoặc Node.js) có thể kết nối tới Redis, SQLite, hoặc PostgreSQL để lưu và truy xuất trạng thái tự động, không cần gõ lệnh mỗi lần.

Cài đặt MCP server đơn giản (chạy trên VPS hoặc local):

# Tạo thư mục cho MCP server
mkdir ~/mcp-memory-server && cd ~/mcp-memory-server
npm init -y
npm install @anthropic-ai/mcp-server sqlite3 better-sqlite3

# Tạo file server.js
nano server.js

Code mẫu server.js:

const { Server } = require('@anthropic-ai/mcp-server');
const Database = require('better-sqlite3');

const db = new Database('claude_memory.db');
db.exec('CREATE TABLE IF NOT EXISTS memories (key TEXT PRIMARY KEY, value TEXT)');

const server = new Server({
  name: 'memory-server',
  version: '1.0.0'
}, {
  capabilities: {
    tools: {}
  }
});

server.setRequestHandler('tools/list', async () => ({
  tools: [{
    name: 'save_memory',
    description: 'Lưu một mẩu thông tin vào bộ nhớ dài hạn',
    inputSchema: {
      type: 'object',
      properties: {
        key: { type: 'string' },
        value: { type: 'string' }
      }
    }
  }, {
    name: 'get_memory',
    description: 'Lấy thông tin từ bộ nhớ',
    inputSchema: {
      type: 'object',
      properties: {
        key: { type: 'string' }
      }
    }
  }]
}));

server.setRequestHandler('tools/call', async (request) => {
  const { name, arguments: args } = request.params;
  if (name === 'save_memory') {
    const stmt = db.prepare('INSERT OR REPLACE INTO memories (key, value) VALUES (?, ?)');
    stmt.run(args.key, args.value);
    return { content: [{ type: 'text', text: 'Đã lưu' }] };
  } else if (name === 'get_memory') {
    const stmt = db.prepare('SELECT value FROM memories WHERE key = ?');
    const row = stmt.get(args.key);
    return { content: [{ type: 'text', text: row ? row.value : 'Không tìm thấy' }] };
  }
});

server.listen(3001);
console.log('MCP Memory Server running on port 3001');

Kết nối với VS Code: Cấu hình trong .vscode/settings.json của project:

{
  "claude.mcpServers": {
    "memory-server": {
      "command": "node",
      "args": ["/home/you/mcp-memory-server/server.js"],
      "autoStart": true
    }
  }
}

Verification: Khởi động lại VS Code, mở Claude Code, gõ /tools, bạn sẽ thấy save_memoryget_memory trong danh sách tool. Từ giờ Claude có thể tự động lưu trạng thái vào SQLite và đọc lại khi session mới. Đây là giải pháp chuyên nghiệp nhất cho team và cá nhân làm dự án phức tạp.

Bước 4, Prompt engineering để "tự nhắc" Claude

Ngay cả khi có file memory và MCP server, bạn vẫn nên soạn một system prompt mạnh trong .claude/settings.json để định hướng Claude Code cách xử lý session mới:

// .claude/settings.json (tạo nếu chưa có)
{
  "settings": {
    "systemPrompt": "Bạn là trợ lý lập trình của tôi cho dự án này. Mỗi khi session mới bắt đầu, hãy tự động:\n1. Đọc file .claude_project.md để biết kiến trúc và convention\n2. Đọc file claude_code_memory.json để biết trạng thái hiện tại\n3. Kết nối tới MCP server memory-server và gọi get_memory('project_state') để lấy ngữ cảnh đã lưu\n4. Nếu tất cả đều trống, hỏi tôi muốn bắt đầu từ đâu\nLuôn giữ style code có comment rõ ràng bằng tiếng Anh. Không viết code mới khi chưa hiểu rõ file hiện tại đang làm gì.",
    "maxTokens": 8192,
    "model": "claude-sonnet-4-20250514"
  }
}

Bước kiểm tra reaction: Sau khi cấu hình, mở session mới, chỉ gõ "Bắt đầu", Claude Code sẽ tự động chạy vào file memory và MCP tool. Nếu nó không làm vậy, hãy dùng prompt: "Hãy chạy đúng quy trình trong system prompt của bạn."

Bước 5, Checkpoint manual: tạo file snapshot định kỳ

Dù tự động hóa đến đâu, vẫn có lúc cần checkpoint bằng tay. Đây là script Bash bạn chạy trên server (hoặc local) để snapshot trạng thái Claude Code:

#!/bin/bash
# save_claude_state.sh, chạy cuối mỗi phiên làm việc

TIMESTAMP=$(date +%Y%m%d_%H%M%S)
SNAPSHOT_DIR="./.claude_snapshots"
mkdir -p $SNAPSHOT_DIR

# Lưu memory hiện tại
cp claude_code_memory.json "$SNAPSHOT_DIR/memory_$TIMESTAMP.json"

# Lưu project context
cp .claude_project.md "$SNAPSHOT_DIR/context_$TIMESTAMP.md"

# Lưu danh sách file đã sửa gần đây (dùng git log hoặc ls -lt)
find . -name "*.js" -o -name "*.jsx" -o -name "*.ts" -o -name "*.tsx" 2>/dev/null | head -20 > "$SNAPSHOT_DIR/recent_files_$TIMESTAMP.txt"

echo "Snapshot saved: $TIMESTAMP"

Tạo alias trong ~/.bashrc hoặc ~/.zshrc:

alias claude-save="bash /path/to/save_claude_state.sh"

Cuối ngày: gõ claude-save, ngày hôm sau khi vào session mới, chỉ cần nói "Đọc snapshot mới nhất trong .claude_snapshots".

Xử lý lỗi thường gặp

Lỗi: MCP server không kết nối được sau khi cấu hình

Kiểm tra log Claude Code trong VS Code: mở View → Output → Claude Code, tìm dòng lỗi. Hay gặp nhất là port bị conflict hoặc path đến server.js sai. Kiểm tra bằng lệnh node /path/to/server.js trực tiếp từ terminal, nếu chạy được, lỗi là do cấu hình path.

Lỗi: Claude Code không chịu đọc file memory

Thử ép nó đọc bằng lệnh: "file claude_code_memory.json có nội dung gì? Đọc toàn bộ file và hiển thị." Nếu vẫn không, kiểm tra quyền đọc file (ls -la claude_code_memory.json). Claude Code chạy dưới quyền VS Code process, nếu file do root tạo, nó không đọc được.

Lỗi: Mất session khi chạy Claude Code trên VPS qua Remote-SSH

Mạng không ổn định thường xuyên ngắt kết nối VS Code. Giải pháp: cài screen hoặc tmux trên VPS, chạy MCP server trong tmux session để nó không bị kill khi SSH timeout. Dùng tmux new -s claude-mcp rồi start server, lần sau SSH vào gõ tmux attach -t claude-mcp.

Câu hỏi thường gặp

Có cách nào để Claude Code tự động lưu trạng thái mà không cần cấu hình không?

Bản 0.x hiện tại không có sẵn tính năng tự động lưu session-to-session. Anthropic đang thử nghiệm "project memory" trong các bản beta, nhưng chưa ra stable. Cấu hình MCP server và file memory là cách nhanh nhất hiện nay.

Dùng MCP server có ảnh hưởng đến hiệu năng không?

Hầu như không, MCP server nhẹ, chạy ngầm và chỉ ghi/đọc dữ liệu khi Claude gọi tool. Ngay cả trên thuê VPS giá rẻ 2GB RAM, bạn vẫn có thể chạy MCP server song song với code mà không thấy lag. Tốt hơn nên dùng SQLite thay vì PostgreSQL cho memory server vì nhẹ hơn.

Nếu tôi làm việc nhiều project, mỗi project có cần MCP server riêng không?

Không cần. Một MCP server dùng chung với database riêng cho từng project (dùng key: "project_name:state"). Hoặc bạn có thể viết MCP server nhận tham số project từ Claude. Nhưng đơn giản nhất: mỗi project có file memory riêng và .claude_project.md riêng, như vậy là đủ cho đa số trường hợp.

Làm sao để Claude Code nhận biết được tôi đang dùng project nào?

Claude Code hoạt động theo thư mục project. Mỗi lần bạn mở VS Code ở thư mục A, nó sẽ dùng file config trong đó. Cấu hình .claude/settings.json và .claude_project.md nằm trong thư mục project, mỗi project có bộ cấu hình riêng, Claude tự động nhận diện.

Memory file có bị leak thông tin nhạy cảm (API key, password) không?

Có nguy cơ, vì file này thường được commit vào git hoặc share qua Cloud Sync. rất cao không ghi API key, database password, secret token vào memory file. Dùng .env cho secret, memory file chỉ ghi trạng thái và quyết định kỹ thuật. Thêm claude_code_memory.json vào .gitignore.

Bài viết liên quan

Lưu ý: Bài viết mang tính tham khảo, tổng hợp kiến thức chung. Mỗi hệ thống, hạ tầng và nhu cầu có đặc thù riêng, nên kiểm thử trong môi trường an toàn và tham vấn kỹ sư trước khi triển khai thực tế.