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.
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 khi | Nạp vào context |
|---|---|---|
| CLAUDE.md | Quy tắc "luôn luôn làm X" cho dự án | Mọi phiên, từ đầu |
| Skill | Quy trình dùng lại, gọi bằng /ten-skill hoặc Claude tự gọi | Chỉ mô tả, nội dung nạp khi dùng |
| Subagent | Việc phụ cần context riêng, chỉ trả về kết luận | Context tách biệt |
| Hook | Việc bắt buộc chạy mỗi khi có sự kiện, không phụ thuộc Claude có nhớ hay không | Không tốn context tới khi chạy |
| MCP | Kế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ẫn | Dùng cho |
|---|---|---|
| User | ~/.claude/CLAUDE.md | Thói quen cá nhân, áp dụng mọi dự án |
| Project | ./CLAUDE.md hoặc ./.claude/CLAUDE.md | Quy tắc chung của team, commit vào git |
| Local | ./CLAUDE.local.md | Ghi 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/filetrong 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 frontmatterpathsđể 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.
---
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 handlerNế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):
---
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:
namevàdescriptionlà bắt buộc. Claude dựa vàodescriptionđể 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.toolsgiới hạn quyền. Reviewer ở trên chỉ đọc được, không sửa được.modelcho phép chọn model khác phiên chính, ví dụhaikucho việc đơn giản để tiết kiệm, hoặcinheritđể 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:
---
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.mdvẫ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: truevà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):
{
"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:
#!/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 0Script 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:
# 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-serverMỗ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:
/plugin install commit-commands@claude-plugins-official
/plugin marketplace add owner/repoPlugin 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:
/rewindhoặc nhấnEschai 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
- Claude Code là gì
- Context engineering là gì
- AI workflow lập trình: một ngày code với AI trông thế nào
- Cursor vs Copilot vs Claude Code: nên chọn công cụ nào
- GitHub Copilot là gì
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.