AI-native development⏱ 9 phút đọc · 25 thg 9, 2026

Claude Code nâng cao: CLAUDE.md, subagents, skills, hooks và MCP

Dùng Claude Code được vài tuần, câu hỏi tiếp theo là làm sao để nó làm việc theo cách của bạn và team. Bài này đi qua các công cụ tùy biến chính: CLAUDE.md, subagents, skills, hooks, MCP và plugins, kèm file cấu hình mẫu và cách chọn công cụ nào cho việc nào.

HOLETEX · POST
CLAUDE CODE
nâng cao

Bài Claude Code là gì giới thiệu cách Claude Code đọc codebase, sửa file và chạy lệnh ngay trong terminal. Sau vài tuần dùng, đa số dev gặp chung một nhóm vấn đề: phải nhắc đi nhắc lại cùng một quy ước, phải dán lại cùng một quy trình, phiên chat ngập output sau vài lần điều tra, hoặc lo Claude lỡ tay sửa file không nên sửa.

Claude Code có sẵn bộ công cụ để giải quyết từng vấn đề đó. Bài này đi qua các công cụ chính: CLAUDE.md, subagents, skills, hooks, MCP và plugins, kèm file mẫu dùng được ngay và cách chọn công cụ nào cho tình huống nào. Bài viết theo Claude Code v2.1.282 (model mặc định Claude Opus 5.5).

Một lưu ý trước khi bắt đầu: nhiều tính năng dưới đây mới được thêm hoặc thay đổi gần đây. Chạy claude update để chắc bạn đang ở bản mới nhất.

Bức tranh tổng: công cụ nào cho việc gì

Công cụDùng khiNạp vào context
CLAUDE.mdQuy tắc "luôn luôn làm X" cho dự ánMọi phiên, từ đầu
SkillQuy trình dùng lại, gọi bằng /ten-skill hoặc Claude tự gọiChỉ mô tả, nội dung nạp khi dùng
SubagentViệc phụ cần context riêng, chỉ trả về kết luậnContext tách biệt
HookViệc bắt buộc chạy mỗi khi có sự kiện, không phụ thuộc Claude có nhớ hay khôngKhông tốn context tới khi chạy
MCPKết nối dịch vụ bên ngoài (Notion, database, GitHub...)Tên tool (schema nạp khi dùng)
PluginĐóng gói các thứ trên để chia sẻTùy thành phần

Docs Claude Code gợi ý thời điểm nên thêm từng thứ:

  • Claude sai cùng một quy ước hai lần → thêm vào CLAUDE.md.
  • Bạn dán cùng một quy trình lần thứ ba → biến nó thành skill.
  • Một việc phụ làm ngập phiên chat → giao cho subagent.
  • Bạn muốn một việc luôn xảy ra mà không cần nhắc → viết hook.

Đừng setup tất cả từ ngày đầu. Mỗi thứ thêm vào đều có chi phí context và bảo trì, nên chỉ thêm khi nó giải quyết một vấn đề bạn đã thật sự gặp. Khi cả team cần cùng một setup, commit thư mục .claude/ vào repo, sau đó mới tính tới plugin.

CLAUDE.md: bộ nhớ của dự án

CLAUDE.md là file markdown Claude Code tự đọc khi bắt đầu phiên. Có nhiều cấp, được ghép lại với nhau chứ không ghi đè:

CấpĐường dẫnDùng cho
User~/.claude/CLAUDE.mdThói quen cá nhân, áp dụng mọi dự án
Project./CLAUDE.md hoặc ./.claude/CLAUDE.mdQuy tắc chung của team, commit vào git
Local./CLAUDE.local.mdGhi chú riêng của bạn, thêm vào .gitignore

CLAUDE.md ở thư mục con chỉ được nạp khi Claude làm việc với file trong thư mục đó, rất hợp với monorepo.

Chạy /init để Claude tự tạo bản CLAUDE.md đầu tiên từ codebase. Sau đó cắt gọt: docs khuyên giữ mỗi file dưới 200 dòng. Với từng dòng, tự hỏi "xóa dòng này thì Claude có làm sai không?". Không thì xóa.

Hai tính năng giúp tổ chức CLAUDE.md:

  • Import: viết @duong/dan/file trong CLAUDE.md để kéo nội dung file khác vào, ví dụ Xem @README.md để biết tổng quan dự án. Import lồng nhau được tối đa 4 cấp. Lưu ý file import vẫn được nạp ngay từ đầu, nên import giúp tách file cho dễ quản lý chứ không giảm context.
  • Rule theo đường dẫn: đặt file trong .claude/rules/, thêm frontmatter paths để rule chỉ nạp khi Claude làm việc với file khớp mẫu. Đây mới là cách thực sự giảm context.
text
---
paths:
  - "src/api/**/*.ts"
---

# Quy tắc API

- Mọi handler trả lỗi qua hàm `apiError()` trong `src/lib/errors.ts`
- Validate input bằng zod schema đặt cạnh handler

Nếu dự án đã có AGENTS.md (định dạng chung mà Codex, Cursor, Copilot cũng đọc), Claude Code từ v2.1.277 tự đọc nó khi không có CLAUDE.md. Nếu có cả hai, cách đơn giản là thêm dòng @AGENTS.md vào CLAUDE.md. Lưu ý: có CLAUDE.local.md cũng tính là có CLAUDE.md.

Lệnh /memory cho xem và mở các file memory đang dùng, còn /context cho biết file nào thực sự đã được nạp.

Subagents: giao việc phụ cho "trợ lý riêng"

Subagent là một trợ lý chuyên biệt chạy trong context window riêng, có system prompt, quyền tool và model riêng, xong việc chỉ trả về bản tóm tắt cho phiên chính. Lợi ích lớn nhất là giữ phiên chính sạch: subagent đọc vài chục file để điều tra thì chúng không nằm trong context của bạn.

Claude Code có sẵn vài subagent: Explore (chỉ đọc, dùng để tìm hiểu codebase), Plan (dùng trong plan mode) và general-purpose (đủ mọi tool). Bạn tạo thêm subagent riêng bằng file markdown trong .claude/agents/ (theo dự án) hoặc ~/.claude/agents/ (dùng mọi nơi):

text
---
name: code-reviewer
description: Review code vừa sửa, tìm bug, lỗ hổng bảo mật và chỗ vi phạm quy ước. Dùng chủ động sau khi hoàn thành một thay đổi.
tools: Read, Glob, Grep
model: sonnet
---

Bạn là reviewer khó tính cho dự án này. Khi được gọi:
1. Đọc các file được chỉ định trong yêu cầu, tìm thêm file liên quan bằng Glob/Grep.
2. Liệt kê vấn đề theo mức độ: nghiêm trọng, nên sửa, góp ý.
3. Với mỗi vấn đề, chỉ rõ file, dòng và cách sửa cụ thể.
Không tự sửa code.

Vài điểm cần biết:

  • name và description là bắt buộc. Claude dựa vào description để tự quyết định khi nào giao việc, nên viết rõ "dùng khi nào". Thêm cụm như "dùng chủ động" sẽ khuyến khích Claude tự gọi.
  • tools giới hạn quyền. Reviewer ở trên chỉ đọc được, không sửa được.
  • model cho phép chọn model khác phiên chính, ví dụ haiku cho việc đơn giản để tiết kiệm, hoặc inherit để dùng cùng model.
  • Gọi trực tiếp bằng cách nói rõ tên ("dùng subagent code-reviewer review thay đổi vừa rồi") hoặc @-mention để chắc chắn subagent đó chạy.

Nhiều tutorial cũ hướng dẫn tạo subagent qua wizard của lệnh /agents. Từ v2.1.198, /agents không còn wizard nữa: bạn tạo file trực tiếp như trên, hoặc nhờ Claude viết file đó cho bạn.

Skills: đóng gói quy trình dùng lại

Skill là một thư mục chứa file SKILL.md (frontmatter YAML + hướng dẫn), có thể kèm script hoặc tài liệu phụ. Bạn gọi bằng /ten-skill, hoặc Claude tự nạp khi thấy phù hợp với yêu cầu.

Điểm mạnh của skill là progressive disclosure: lúc đầu chỉ phần mô tả nằm trong context, nội dung đầy đủ chỉ nạp khi skill được dùng, file phụ chỉ nạp khi cần. Bạn có thể có nhiều skill mà context tăng không đáng kể, vì mỗi skill chỉ tốn phần mô tả. Đây là khác biệt chính so với CLAUDE.md, thứ luôn được nạp.

Ví dụ skill tóm tắt thay đổi trước khi commit, đặt ở .claude/skills/tom-tat-thay-doi/SKILL.md:

text
---
name: tom-tat-thay-doi
description: Tóm tắt các thay đổi chưa commit và chỉ ra rủi ro. Dùng khi người dùng hỏi đã đổi gì, cần commit message, hoặc muốn review diff.
---

## Thay đổi hiện tại

!`git status --short`

!`git diff HEAD`

## Hướng dẫn

Tóm tắt thay đổi ở trên trong 2-3 gạch đầu dòng, sau đó liệt kê rủi ro:
thiếu xử lý lỗi, giá trị hardcode, test cần cập nhật.
Đề xuất một commit message theo Conventional Commits.

Cú pháp ` !lệnh `` chạy lệnh shell và chèn output vào skill trước khi Claude đọc, nên Claude luôn thấy trạng thái mới nhất (git status` để thấy cả file mới chưa track).

Hai lưu ý thực tế:

  • Custom slash command đã được gộp vào skill. File cũ ở .claude/commands/deploy.md vẫn chạy, nhưng cách mới là .claude/skills/deploy/SKILL.md, cả hai đều tạo lệnh /deploy.
  • Với skill có tác dụng phụ (deploy, gửi tin nhắn, xóa dữ liệu), thêm disable-model-invocation: true vào frontmatter để chỉ bạn mới gọi được, Claude không tự kích hoạt. Skill loại này cũng không tốn context tới khi bạn gọi.

Skill theo chuẩn mở Agent Skills, nên cùng một skill có thể dùng lại ở các công cụ khác hỗ trợ chuẩn này.

Hooks: thứ bắt buộc phải xảy ra

CLAUDE.md là lời dặn, Claude thường làm theo. Hook là code, nó luôn chạy. Khi một việc không được phép quên (format code sau khi sửa, chặn sửa file nhạy cảm, chạy lint), hãy dùng hook.

Hook là lệnh shell (hoặc HTTP, MCP tool, prompt, subagent) chạy tự động tại các sự kiện trong vòng đời Claude Code. Hiện có hơn 30 sự kiện, những cái hay dùng nhất:

  • PreToolUse: trước khi Claude dùng một tool, có thể chặn.
  • PostToolUse: sau khi tool chạy xong, ví dụ format file vừa sửa.
  • UserPromptSubmit: khi bạn gửi prompt, có thể thêm ngữ cảnh.
  • SessionStart: khi mở phiên, ví dụ nạp thông tin branch hiện tại.
  • Stop: khi Claude trả lời xong.
  • Notification: khi Claude cần bạn chú ý.

Hook cấu hình trong .claude/settings.json (dùng chung team) hoặc ~/.claude/settings.json (cá nhân). Ví dụ gộp hai hook: tự chạy Prettier sau khi Claude sửa file, và chặn tool Edit/Write sửa file .env (lệnh Bash cần permission rule riêng):

json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-files.sh"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "jq -j '.tool_input.file_path' | xargs -0 npx prettier --write --ignore-unknown"
          }
        ]
      }
    ]
  }
}

Script .claude/hooks/protect-files.sh nhận thông tin tool qua stdin dạng JSON:

bash
#!/bin/bash
# Chặn Claude sửa file nhạy cảm
command -v jq >/dev/null || { echo "Thiếu jq, hook chặn để an toàn" >&2; exit 2; }

FILE_PATH=$(jq -r '.tool_input.file_path // empty')
FILE_PATH="${FILE_PATH//\\//}"   # đổi \ thành / cho path Windows
NAME="${FILE_PATH##*/}"

case "$NAME" in
  .env.example) exit 0 ;;
  .env|.env.*|package-lock.json)
    echo "Không được sửa $FILE_PATH" >&2
    exit 2
    ;;
esac

case "$FILE_PATH" in
  */.git/*) echo "Không được sửa $FILE_PATH" >&2; exit 2 ;;
esac

exit 0

Script cần jq (Git Bash trên Windows không có sẵn, nên script tự chặn nếu thiếu jq thay vì để lọt), và trên macOS/Linux nhớ chmod +x. Một lỗi dễ mắc: với script không in JSON, chỉ exit 2 mới chặn được hành động. Nội dung stderr sẽ được gửi cho Claude để nó biết vì sao bị chặn. Các exit code khác, kể cả exit 1, chỉ là lỗi không chặn và hành động vẫn tiếp tục. Hook bảo vệ mà dùng exit 1 thì coi như không có.

Về matcher: Edit|Write là khớp chính xác tên tool. Nếu có ký tự đặc biệt, matcher được hiểu là regex và không neo đầu cuối, nên Edit.* sẽ khớp cả NotebookEdit. Gõ /hooks để xem danh sách hook đang được cấu hình.

Với quyền truy cập, còn một lớp đơn giản hơn hook là permission rules trong settings.json, ví dụ cho phép Bash(npm run *) mà không cần hỏi, cấm Bash(git push *), hoặc cấm Read(./.env) để các tool đọc file của Claude không mở được .env (lưu ý rule này không chặn cat qua Bash).

MCP và plugins: mở rộng ra ngoài

MCP (Model Context Protocol) cho Claude Code kết nối với dịch vụ bên ngoài: Notion, Sentry, database, trình duyệt... Thêm server bằng lệnh:

bash
# Server HTTP từ xa
claude mcp add --transport http notion https://mcp.notion.com/mcp

# Server chạy local qua stdio
claude mcp add --env AIRTABLE_API_KEY=YOUR_KEY --transport stdio airtable -- npx -y airtable-mcp-server

Mỗi server có một trong ba scope:

  • local (mặc định): chỉ bạn, chỉ dự án hiện tại.
  • project: lưu vào .mcp.json ở gốc dự án, commit để cả team dùng chung. Claude sẽ hỏi xác nhận trước khi dùng server từ file này.
  • user: chỉ bạn, dùng cho mọi dự án.

Thêm --scope project vào lệnh để chọn scope. Trong phiên, gõ /mcp để xem trạng thái và tắt server không dùng. Mặc định Claude Code chỉ nạp tên tool, schema đầy đủ nạp khi cần, nhưng server không dùng vẫn nên tắt cho gọn.

Plugin đóng gói skills, subagents, hooks và MCP server thành một gói cài một lệnh. Gõ /plugin trong phiên Claude Code để duyệt marketplace chính thức (được thêm sẵn), hoặc cài trực tiếp:

text
/plugin install commit-commands@claude-plugins-official
/plugin marketplace add owner/repo

Plugin hợp khi team muốn chia sẻ cùng một bộ setup cho nhiều repo. Nhớ rằng mỗi plugin bật lên đều thêm mô tả skill và agent của nó vào context ở mọi lượt.

Vài tính năng khác đáng biết

  • Plan mode (nhấn Shift+Tab để chuyển chế độ): Claude chỉ nghiên cứu và đề xuất kế hoạch, không sửa file tới khi bạn duyệt. Hợp với task chạm nhiều file.
  • Checkpoint: /rewind hoặc nhấn Esc hai lần để quay lại trạng thái trước, chọn khôi phục code, hội thoại hoặc cả hai. Lưu ý thay đổi do lệnh Bash tạo ra không được theo dõi.

Tóm lại

CLAUDE.md dạy Claude quy ước, skill đóng gói quy trình, subagent tách việc phụ, hook đảm bảo luật được thực thi, MCP và plugin mở rộng ra ngoài. Dùng đúng chỗ, Claude Code sẽ làm việc sát quy ước của team hơn và bạn ít phải nhắc lại hơn. Cách quản lý context tổng thể có ở bài Context engineering là gì.

Để viết được CLAUDE.md sắc bén hay hook đúng chỗ, bạn cần hiểu dự án của mình đủ sâu, biết đâu là quy ước quan trọng và đâu là rủi ro thật. Nếu bạn làm frontend và muốn có nền đó, khóa React PRO của HoleTex giúp bạn làm chủ React tới mức điều khiển được AI thay vì chạy theo nó.

Bài liên quan

Nguồn tham khảo: Features overview (code.claude.com), Memory (CLAUDE.md), Subagents, Skills, Hooks reference, Hooks guide, MCP, Plugins, Permission modes, Model configuration, Equipping agents with Agent Skills (anthropic.com), Steering Claude Code (claude.com), Claude pricing. Cập nhật 2026-09-26.

Thấy hay? Chia sẻ