# Mod, hook, skill hay MCP: bốn tầng tuỳ biến Claude Code

[TechWhistle](https://homus.dev/speakers/techwhistle) · [TechWhistle](https://homus.dev/orgs/techwhistle)

> Giải một yêu cầu 'không làm lộ secret' bằng skill, MCP, hook và mod, rồi dùng flowchart bốn câu hỏi để chọn tầng nhẹ nhất cho Claude Code.

Topics: Coding Agents, Skills, Plugins, Security

Canonical: https://homus.dev/talks/mods-vs-hooks-vs-skills-vs-mcp-claude-codes-4-layers

## 1. Một yêu cầu, bốn cách giải

Video mở đầu bằng một khẳng định: có bốn cách khác nhau để ngăn Claude Code làm lộ API key của bạn, đó là một skill, một MCP server, một hook, hoặc một mod. Theo TechWhistle (video đăng ngày 27/10/2026), hai trong số đó không chặn được gì cả, một cách thì quá tay, và chỉ một cách là đúng công cụ. Hết video, bạn sẽ biết đó là cách nào và vì sao.

![Tiêu đề Stop Claude Code leaking your API keys, 4 ways, với một file .env có API_KEY và DB_PASSWORD đã che](https://homus.dev/photos/1dRsdI9dERY-0003.jpg)

Bài toán của cả video: một file `.env` chứa `API_KEY` và `DB_PASSWORD` (giá trị đã che bằng dấu chấm), và câu hỏi làm sao để Claude Code không làm lộ chúng, với bốn cách được thử trong video đăng ngày 27/10/2026.

Vấn đề, theo TechWhistle (video đăng ngày 27/10/2026): Claude Code giờ có bốn cách để tuỳ biến, và tutorial nào cũng chỉ đi tham quan một tầng riêng lẻ. Kết quả là bạn có một skill đang làm việc của hook, hoặc một mod đang làm việc mà một dòng config là đủ. Hôm nay video chỉ lấy một yêu cầu duy nhất: không bao giờ làm lộ secret, và giải nó theo bốn cách khác nhau. Sau đó là một flowchart bạn dùng được cho bất cứ việc gì.

## 2. Claude là nhân viên mới: bốn tầng, bốn động từ

Hãy hình dung Claude là một nhân viên mới vào công ty bạn. Theo cách so sánh của TechWhistle (video đăng ngày 27/10/2026):

- **Skills** là cuốn sổ tay nhân viên mà người đó đọc. Nó thay đổi những gì Claude biết (theo video đăng ngày 27/10/2026).

- **MCP** là thẻ từ để vào các toà nhà khác. Nó thay đổi những gì Claude với tới được (theo video đăng ngày 27/10/2026).

- **Hooks** là cổng an ninh kiểm tra từng chiếc túi. Nó thay đổi những gì xảy ra khi có sự kiện (theo video đăng ngày 27/10/2026).

- **Mods** thì sửa sang lại chính văn phòng: màn hình mới, nút bấm mới. Nó thay đổi cách Claude Code trông và hành xử (theo video đăng ngày 27/10/2026).

![Slide Now stack it, one verb per layer: Mods interface and behavior, Hooks events, MCP reach, Skills knowledge](https://homus.dev/photos/1dRsdI9dERY-0103.jpg)

Bốn tầng xếp chồng lên nhau, theo slide trong video đăng ngày 27/10/2026: Skills ở dưới cùng (knowledge), rồi MCP (reach), Hooks (events), và trên cùng là Mods (interface & behavior).

Giờ xếp chồng chúng lại: knowledge, reach, events, interface và behavior. Mỗi tầng một động từ: **know, reach, enforce, show** (biết, với tới, cưỡng chế, hiển thị), theo video đăng ngày 27/10/2026.

Và đây là chiếc hộp đựng cả bốn: theo TechWhistle (video đăng ngày 27/10/2026), một **plugin** có thể chứa cả bốn thứ cùng lúc. Vậy plugin không phải là một tầng, nó là chiếc xe tải giao hàng. Trang so sánh trong docs của Claude Code cũng ghi rằng một plugin có thể chứa tất cả, nên một mod có thể đi chung plugin với một skill và một MCP server (đọc ngày 29/10/2026).

Một plugin có thể chở cả bốn tầng cùng lúc; mỗi tầng gắn với một động từ, theo cách chia trong video đăng ngày 27/10/2026.

## 3. Cách 1: một skill

Lần thử đầu tiên là một skill. Theo TechWhistle (video đăng ngày 27/10/2026), phần lớn mọi người nghĩ skill là một quy tắc mà Claude bắt buộc phải tuân theo. Không phải vậy. Một skill là một file markdown chứa hướng dẫn. Claude nạp nó khi task của bạn khớp với phần description của skill.

Vậy bạn viết một skill về secret: không bao giờ in nội dung file `.env`, dùng placeholder trong ví dụ. Theo video đăng ngày 27/10/2026, phần lớn thời gian Claude làm theo khá ngoan.

![File .claude/skills/secrets-hygiene/SKILL.md với frontmatter name và description, bên dưới là ba quy tắc về secret](https://homus.dev/photos/1dRsdI9dERY-0123.jpg)

Skill mẫu trong video đăng ngày 27/10/2026, nằm ở `.claude/skills/secrets-hygiene/SKILL.md`: phần frontmatter (được tô sáng) chứa tên và description quyết định khi nào Claude nạp skill, bên dưới là ba quy tắc. Dòng chú thích: "A skill is just a markdown file of instructions".

Nội dung skill trên màn hình:

```
---
name: secrets-hygiene
description: Use when showing config, env files,
or examples that could contain credentials.
---
# Secrets hygiene
- Never print the contents of .env files.
- Use placeholders like  in examples.
- Never echo an API key back to the user.
```

Nhưng "làm theo" không giống "cưỡng chế". Theo TechWhistle (video đăng ngày 27/10/2026), một skill là chữ nằm trong context window. Nó cạnh tranh với mọi thứ khác Claude đang đọc. Nó không theo dõi được một tool call, và cũng không huỷ được tool call nào.

Bảng so sánh của chính Anthropic nói thẳng điều này: chọn skill khi bạn cứ phải dán đi dán lại cùng một hướng dẫn vào chat (docs Mods overview, đọc ngày 29/10/2026). Theo TechWhistle (video đăng ngày 27/10/2026), đó là huấn luyện, không phải ổ khoá.

## 4. Cách 2: một MCP server

Lần thử thứ hai là MCP, Model Context Protocol. Theo TechWhistle (video đăng ngày 27/10/2026), mental model sai là "MCP làm Claude thông minh hơn". Mental model đúng là "MCP cho Claude thêm tool mới". Một server chạy bên ngoài Claude Code và mở ra các hành động: query một database, đọc một ticket, gọi một vault.

Vậy bạn thêm một server Secrets Manager. Theo video đăng ngày 27/10/2026, giờ Claude lấy credential vào lúc deploy, và bạn không bao giờ phải dán key vào chat nữa. Điều đó hữu ích.

![Slide Look at the direction: bốn ô mở khoá database, tickets, vault, docs và một ô đỏ .env room; nhãn ADDS reach, còn REMOVES reach bị gạch](https://homus.dev/photos/1dRsdI9dERY-0223.jpg)

"Look at the direction": MCP mở khoá thêm các cánh cửa database, tickets, vault, docs, còn căn phòng `.env` vẫn mở như cũ. Nhãn "ADDS ↑ reach" sáng, "REMOVES ↓ reach" bị gạch bỏ, theo slide trong video đăng ngày 27/10/2026.

Nhưng hãy nhìn vào chiều tác động. Theo TechWhistle (video đăng ngày 27/10/2026), MCP thêm khả năng với tới, nó không bao giờ lấy bớt đi. Một MCP server không thể ngăn Claude chạy `cat` lên file `.env` của bạn. Nó chỉ thêm cửa. Với yêu cầu của chúng ta, MCP đang giải một bài toán khác.

## 5. Cách 3: một hook

Lần thử thứ ba là hooks. Theo TechWhistle (video đăng ngày 27/10/2026), nhiều người coi hook là thứ "có thì tốt": tự format code, một cái ping trên desktop. Thực ra hook là tầng đầu tiên trong bốn tầng này mang tính deterministic. Một hook là một script mà Claude Code chạy khi có một lifecycle event.

Theo video đăng ngày 27/10/2026, có hơn 30 event. `PreToolUse` chạy trước mọi tool call. Script của bạn đọc tool call đó dưới dạng JSON. Thoát với exit code 2 thì tool call bị chặn.

Vậy đây là secrets guard dạng hook, như video đăng ngày 27/10/2026 mô tả: match các tool Read, Edit và Bash. Nếu input nhắc tới `.env`, thoát với code 2. Claude thấy lý do bạn đưa ra và chuyển sang việc khác. Không cần thuyết phục, không có chuyện quên. Nó chạy mỗi lần, không trừ lần nào.

![Cửa sổ claude: Read(.env) bị chặn với dòng PreToolUse hook: Secrets stay local.](https://homus.dev/photos/1dRsdI9dERY-0303.jpg)

Kết quả trên màn hình trong demo của video đăng ngày 27/10/2026: tool call `Read(.env)` bị chặn, Claude nhận dòng lý do "PreToolUse hook: Secrets stay local."

Quay lại với nhân viên mới: cuốn sổ tay ghi "không mang laptop về nhà", còn cổng an ninh thì thực sự kiểm tra cái túi (theo cách so sánh trong video đăng ngày 27/10/2026).

## 6. Giới hạn của hook, và hai thứ cùng tên "hook"

Nhưng hook có những giới hạn. Thứ nhất, theo TechWhistle (video đăng ngày 27/10/2026), pattern matching chỉ là best effort: một lệnh khéo léo có thể lọt qua regex. Hooks docs của Anthropic nói thẳng: muốn allow hay deny cứng thì dùng permission system. Vì vậy hãy đi kèm hook một deny rule cho việc đọc `.env`.

![Slide Edge 1, pattern matching is best effort: grep -q '\.env' và lệnh cat .e""nv bị đóng dấu SLIPPED PAST](https://homus.dev/photos/1dRsdI9dERY-0323.jpg)

Ví dụ trên slide (video đăng ngày 27/10/2026): hook kiểm bằng `grep -q '\.env'`, nhưng lệnh `cat .e""nv` chèn hai dấu nháy vào giữa tên file nên không khớp pattern và được đóng dấu "SLIPPED PAST".

Hooks reference hiện ghi: vì bộ lọc `if` chỉ là best effort, hãy dùng permission system thay vì hook để cưỡng chế một quy tắc allow hoặc deny cứng (đọc ngày 29/10/2026).

Thứ hai, theo video đăng ngày 27/10/2026, một settings hook chạy bên ngoài Claude Code. Nó có thể chặn, cho phép và ghi log. Nó không vẽ được gì cả, không thể cho bạn xem một cái nút.

Và đây là chỗ cách đặt tên gây rối. Theo TechWhistle (video đăng ngày 27/10/2026), mở docs về mods ra thì handler nào cũng được gọi là hook. Còn cái script trong file settings của bạn, giờ Anthropic gọi là **settings hook**. Cùng một từ, hai thứ khác nhau. Và khác biệt không nằm ở chỗ chúng phản ứng với cái gì, mà ở chỗ code chạy ở đâu: bên ngoài Claude Code hay bên trong nó.

![Hai ô HOOK đặt cạnh nhau với dấu hỏi, bên dưới là trích dẫn từ Claude Code docs, Mods overview](https://homus.dev/photos/1dRsdI9dERY-0343.jpg)

Hai chữ "HOOK" đặt cạnh nhau, kèm câu trích từ trang Mods overview của docs Claude Code: "On these pages, "hook" means a mod's handler, and the settings-file kind is a "settings hook"." (slide trong video đăng ngày 27/10/2026; câu này vẫn có trong docs, đọc ngày 29/10/2026).

## 7. Cách 4: một mod

Lần thử thứ tư là mods. Theo TechWhistle (video đăng ngày 27/10/2026), mental model sai là "mod là theme", là skin trang trí. Đây là định nghĩa của Anthropic mà video dẫn: mod là một plugin thay đổi cách Claude Code trông và hành xử. Nó được làm từ các event handler viết bằng JavaScript hoặc TypeScript, và chúng chạy bên trong chính process của Claude Code.

Theo video đăng ngày 27/10/2026, mỗi handler làm được ba việc: **quan sát** một event, **viết lại** nó, hoặc **tự trả lời** nó để hành vi mặc định không bao giờ chạy. Trang Mods overview gọi ba việc này là Observe, Rewrite và Answer (đọc ngày 29/10/2026).

Và vì mod sống bên trong, nó vẽ được. Theo TechWhistle (video đăng ngày 27/10/2026): một pane bên cạnh khung hội thoại, một dải phía trên ô prompt, một status line bên dưới nó, một toast ở góc màn hình. Nó còn vẽ lại được cả spinner hay một dòng tool call. Nó có thể thêm một slash command chạy ngay lập tức, không cần một lượt của Claude. Và pane `/diff` bạn vẫn dùng? Đó là một mod có sẵn.

![Cửa sổ claude với prompt fix the login redirect bug, pane /diff bên phải, nhãn built-in mod: cc-plugin-diff](https://homus.dev/photos/1dRsdI9dERY-0443.jpg)

Minh hoạ trong video đăng ngày 27/10/2026: người dùng gõ `/diff` trong lúc Claude đang sửa lỗi redirect khi login, và một pane hiện bên phải với các dòng thêm/bớt. Nhãn bên dưới ghi đó là mod có sẵn `cc-plugin-diff`; bảng mod có sẵn trong docs cũng liệt kê tên này (đọc ngày 29/10/2026).

Vậy đây là secrets guard dạng mod, như video đăng ngày 27/10/2026 mô tả: một handler cho tool call kiểm tra `.env` và từ chối lệnh gọi. Cùng logic với hook. Nhưng giờ có một toast bật lên: "Blocked a read of .env", và status line giữ một bộ đếm chạy liên tục. Mẫu **blast-radius** của Anthropic còn đi xa hơn: nó giữ lại một lệnh nguy hiểm và cho bạn hai nút Proceed và Cancel.

![Anthropic's blast-radius sample: held: rm -rf build/, WOULD DELETE ba mục, hai nút Proceed và Cancel](https://homus.dev/photos/1dRsdI9dERY-0503.jpg)

Mẫu blast-radius của Anthropic như trong video đăng ngày 27/10/2026: lệnh `rm -rf build/` bị giữ lại, mục "WOULD DELETE" liệt kê `build/index.js`, `build/assets/` (212 files) và `build/manifest.json`, kèm hai nút Proceed và Cancel.

Vậy mod có phải đúng công cụ không? Theo TechWhistle (video đăng ngày 27/10/2026), để chặn thì không. Nó quá tay.

## 8. Đối xử với mod như code: cài, xem, gỡ và tắt mod

Và đây là điều mà phần lớn tutorial về mod bỏ qua, theo TechWhistle (video đăng ngày 27/10/2026): docs của Anthropic cảnh báo rằng mod không được sandbox. Một mod chạy với quyền của chính bạn. Nó đọc được biến môi trường, file settings và API key của bạn. Hãy nghĩ về điều đó: tầng mạnh nhất để canh giữ secret cũng có thể đọc từng cái một trong số chúng. Thứ duy nhất nó không chạm tới được là permission prompt; không mod nào vẽ lại được thứ đó. Trang Mods overview hiện ghi "Mods aren't sandboxed" và mod không thể đổi những gì permission prompt hiển thị (đọc ngày 29/10/2026).

Vì vậy, theo TechWhistle (video đăng ngày 27/10/2026), hãy đối xử với mod như mọi đoạn code bạn cài vào máy:

- **Cài:** mod được cài dưới dạng plugin từ một marketplace (theo video đăng ngày 27/10/2026).

- **Ở đâu:** bản sao nằm trong thư mục home, dưới `.claude/plugins/cache` (theo video đăng ngày 27/10/2026).

- **Liệt kê:** chạy `claude plugin list` để xem từng plugin cùng version, scope và trạng thái (theo video đăng ngày 27/10/2026).

- **Đang chạy:** trong một session, `/plugin` cho biết mod nào đang active (theo video đăng ngày 27/10/2026).

- **Kiểm trước khi cài:** chạy `claude plugin validate` trên thư mục của mod. Theo video đăng ngày 27/10/2026, lệnh này liệt kê mọi event mà mod xử lý và mọi lệnh gọi nó thực hiện.

- **Gỡ:** dùng xong thì chạy `claude plugin uninstall` với tên và marketplace (theo video đăng ngày 27/10/2026).

![Terminal zsh chạy claude plugin list, hiện secrets-guard@your-org Version 1.2.0 Scope user Status enabled và context-pane@community](https://homus.dev/photos/1dRsdI9dERY-0543.jpg)

Ví dụ đầu ra của `claude plugin list` trong video đăng ngày 27/10/2026: plugin mẫu `secrets-guard@your-org` với Version 1.2.0, Scope user, Status enabled, bên dưới là `context-pane@community`. Thanh trên cùng đánh dấu các bước install, where, list, active, validate, remove.

```
$ claude plugin list
```

Và nếu một mod chạy sai, theo TechWhistle (video đăng ngày 27/10/2026): khởi động Claude Code với Safe Mode để có một session sạch, hoặc đặt "disable all hooks" thành true trong user settings. Cẩn thận: cách thứ hai cũng dừng luôn các settings hook và custom status line của bạn. Trên trang Mods overview, hai cách này là cờ `--safe-mode` (cho một session) và `"disableAllHooks": true` trong `~/.claude/settings.json` (cho mọi session), kèm đúng lời cảnh báo đó (đọc ngày 29/10/2026).

## 9. Phán quyết cho bốn cách

Vậy phán quyết cho bốn lần thử, theo TechWhistle (video đăng ngày 27/10/2026):

- **Skill** dạy thói quen, nhưng không chặn được (theo video đăng ngày 27/10/2026).

- **MCP** cho quyền truy cập an toàn tới secret, nhưng cũng không chặn được (theo video đăng ngày 27/10/2026).

- **Mod** chặn được và cho bạn thấy mọi thứ, nhưng nó nặng và chạy với toàn bộ quyền của bạn (theo video đăng ngày 27/10/2026).

- **Hook cộng một permission deny rule** là đúng công cụ: deterministic, nhỏ gọn, bạn audit được nó trong 10 giây (theo video đăng ngày 27/10/2026).

![Slide The verdict on our four attempts: Skill teaches, can't block; MCP gives access; Hook; Mod; file .env ở giữa](https://homus.dev/photos/1dRsdI9dERY-0623.jpg)

"The verdict on our four attempts" trong video đăng ngày 27/10/2026: file `.env` ở giữa, Skill gắn nhãn "TEACHES, can't block", MCP gắn nhãn "GIVES ACCESS", còn Hook và Mod chưa hiện nhãn ở thời điểm này của slide.

Tầng mạnh nhất không phải lúc nào cũng là tầng đúng (video đăng ngày 27/10/2026).

## 10. Flowchart bốn câu hỏi và năm yêu cầu thật

Giờ tới flowchart: bốn câu hỏi, hỏi theo thứ tự (theo video đăng ngày 27/10/2026).

- Claude có cần **biết** cách làm một việc gì đó không? Skill (theo video đăng ngày 27/10/2026).

- Claude có cần **với tới** một hệ thống mà hôm nay nó chưa chạm được không? MCP (theo video đăng ngày 27/10/2026).

- Có việc gì phải xảy ra **mỗi lần, không ngoại lệ** không? Hook (theo video đăng ngày 27/10/2026).

- Bạn có cần **thấy** nó, **bấm** nó, hoặc thay đổi chính Claude Code không? Mod (theo video đăng ngày 27/10/2026).

Rồi thử trên năm yêu cầu thật; video mời bạn dừng lại và đoán từng cái trước khi nghe đáp án (video đăng ngày 27/10/2026):

- "Luôn viết commit theo format của team mình." Đó là kiến thức: skill (theo video đăng ngày 27/10/2026).

- "Cho Claude đọc các ticket Linear của mình." Đó là reach: MCP (theo video đăng ngày 27/10/2026).

- "Chạy formatter sau mỗi lần edit." Mỗi lần: hook (theo video đăng ngày 27/10/2026).

- "Hiện mức dùng context của mình live bên cạnh khung chat." Bạn cần nhìn thấy nó: mod (theo video đăng ngày 27/10/2026).

- Và yêu cầu thứ năm: "Research toàn bộ codebase này mà không làm phình session của mình." Không thuộc tầng nào trong bốn. Đó là một sub-agent, một context mới tinh làm việc rồi trả về một bản tóm tắt (theo video đăng ngày 27/10/2026).

![Flowchart bốn câu hỏi KNOW, REACH, EVERY TIME, SEE/PRESS dẫn tới Skill, MCP, Hook, Mod; none of the four dẫn tới Subagent; bên phải là Request 5/5](https://homus.dev/photos/1dRsdI9dERY-0723.jpg)

Flowchart trong video đăng ngày 27/10/2026: bốn ô quyết định KNOW?, REACH?, EVERY TIME?, SEE / PRESS?, mỗi câu "YES" dẫn tới Skill, MCP, Hook, Mod, câu "NO" đi xuống câu tiếp; "none of the four" dẫn tới SUBAGENT. Bên phải là yêu cầu 5/5 "Research this whole codebase without bloating my session." với thanh thời gian để đoán.

## 11. Mental model để mang theo

Đây là mental model để giữ lại, theo TechWhistle (video đăng ngày 27/10/2026): skills thay đổi những gì Claude biết, MCP thay đổi những gì nó với tới được, hooks thay đổi những gì xảy ra khi có event, mods thay đổi chính Claude Code. Bắt đầu với tầng nhẹ nhất giải được bài toán. Chỉ leo lên tầng trên khi bạn đụng tường.

Mental model cuối video đăng ngày 27/10/2026: bốn tầng xếp từ nhẹ (skills) tới nặng (mods); bắt đầu ở tầng nhẹ nhất giải được bài toán và chỉ leo lên khi đụng tường.

## Nguồn và liên kết

- Tên gốc: Mods vs Hooks vs Skills vs MCP: Claude Code's 4 Layers
- Sự kiện: [YouTube](https://homus.dev/events/youtube)
- Video gốc: [https://www.youtube.com/watch?v=1dRsdI9dERY](https://www.youtube.com/watch?v=1dRsdI9dERY)

- Kênh YouTube TechWhistle (TechWhistle): [youtube.com/channel/UCnH4476A44losQ--_162NGA](https://www.youtube.com/channel/UCnH4476A44losQ--_162NGA)

- Claude Code docs, Mods overview (bảng so sánh mod, settings hook, skill, MCP server; "Mods aren't sandboxed"; cách tắt mod; mod có sẵn `cc-plugin-diff`), đọc ngày 29/10/2026: [code.claude.com/docs/en/plugins/mods/overview](https://code.claude.com/docs/en/plugins/mods/overview)

- Claude Code docs, vẽ trong giao diện bằng mod (đọc ngày 29/10/2026): [code.claude.com/docs/en/plugins/mods/interface](https://code.claude.com/docs/en/plugins/mods/interface)

- Claude Code docs, Hooks reference (exit code 2, permission system cho allow/deny cứng), đọc ngày 29/10/2026: [code.claude.com/docs/en/hooks](https://code.claude.com/docs/en/hooks)

- Claude Code docs, cài và quản lý plugin (`claude plugin list` với Version, Scope, Status), đọc ngày 29/10/2026: [code.claude.com/docs/en/plugins/install](https://code.claude.com/docs/en/plugins/install)

- Claude Code docs, plugin loading reference (đọc ngày 29/10/2026): [code.claude.com/docs/en/plugins/loading](https://code.claude.com/docs/en/plugins/loading)

- Các mod mẫu của Anthropic (thư mục có blast-radius và token-weather, đọc ngày 29/10/2026): [github.com/anthropics/claude-code-playground/tree/main/claude-code/mods](https://github.com/anthropics/claude-code-playground/tree/main/claude-code/mods)

- Model Context Protocol (đọc ngày 29/10/2026): [modelcontextprotocol.io](https://modelcontextprotocol.io)

Nguồn: https://homus.dev/talks/mods-vs-hooks-vs-skills-vs-mcp-claude-codes-4-layers · cập nhật 2026-10-29
