Bỏ qua để đến nội dung

Mở rộng Claude Code

Bài viết đã được kiểm duyệt bởi con người - có dấu tick xanh

Claude Code kết hợp một model biết suy luận với các tool có sẵn cho thao tác xử lý file, tìm kiếm, thực thi lệnh và truy cập web. Các tool có sẵn đã đủ cho phần lớn việc lập trình hằng ngày. Bài viết này nói về cách mở rộng Claude Code: những tính năng bạn thêm vào để tuỳ biến điều Claude biết, kết nối Claude Code với dịch vụ (services) bên ngoài ngoài, và tự động hoá quy trình.

Nếu bạn mới bắt đầu dùng Claude Code? Cứ dùng CLAUDE.md trước để thiết lập quy ước dự án, rồi thêm các phần mở rộng khác khi thực sự cần - xem Xây dựng dần theo thời gian bên dưới.

Các phần mở rộng (extension) được sử dụng/tích hợp vào những thành phần khác nhau trong vòng lặp agentic:

  • CLAUDE.md - thêm ngữ cảnh cố định, Claude thấy ở mọi session
  • Skill - thêm kiến thức/quy trình có thể tái sử dụng nhiều lần, có thể gọi bằng /tên-skill
  • Code intelligence - cho Claude khả năng đọc và quản lý code như một IDE: nhảy thẳng tới định nghĩa của một hàm/biến (symbol), tìm mọi nơi nó được dùng, và thấy ngay lỗi kiểu dữ liệu - nhờ kết nối với language server của ngôn ngữ bạn dùng
  • MCP - kết nối Claude với dịch vụ và dữ liệu bên ngoài
  • Subagent - chạy vòng lặp riêng trong ngữ cảnh tách biệt, chỉ trả về tóm tắt cho agent chính
  • Agent team - điều phối nhiều session độc lập bằng cách nhắn tin trực tiếp cho nhau (peer-to-peer), cộng thêm một danh sách tác vụ (task list) dùng chung cho các agent có Task tool
  • Hooks - chạy script/HTTP request/prompt/subagent khi có sự kiện xảy ra trong vòng đời của session
  • Plugin và marketplace - đóng gói và phân phối các tính năng trên

Cách nạp ngữ cảnh: CLAUDE.md nạp lúc phiên bắt đầu và ở lại trong mọi request. Tên tool MCP nạp lúc bắt đầu, schema đầy đủ chỉ nạp khi dùng. Skill nạp mô tả lúc bắt đầu, nội dung đầy đủ khi được gọi. Subagent nhận ngữ cảnh cô lập riêng. Hooks chạy bên ngoài vòng lặp.

Skill là phần mở rộng linh hoạt nhất - một file markdown chứa kiến thức, quy trình, hoặc chỉ dẫn. Bạn có thể gọi bằng lệnh như /deploy, hoặc để Claude tự dùng khi phù hợp. Skill có thể chạy ngay trong hội thoại hiện tại, hoặc chạy tách biệt qua subagent.

Tính năng trải dài từ ngữ cảnh luôn bật (Claude thấy mỗi phiên), đến khả năng gọi theo yêu cầu (bạn hoặc Claude tự gọi), đến tự động hoá chạy nền theo sự kiện cụ thể.

Tính năngLàm gìDùng khi nàoVí dụ
CLAUDE.mdNgữ cảnh cố định, nạp mỗi hội thoạiQuy ước dự án, quy tắc “luôn luôn làm X”“Dùng pnpm, không dùng npm. Chạy test trước khi commit.”
SkillChỉ dẫn, kiến thức, quy trình Claude có thể dùngNội dung tái sử dụng, tài liệu tham khảo, việc lặp lại/deploy chạy checklist triển khai; skill tài liệu API
SubagentNgữ cảnh thực thi tách biệt, chỉ trả kết quả tóm tắtCách ly ngữ cảnh, việc song song, worker chuyên biệtViệc nghiên cứu đọc nhiều file nhưng chỉ cần trả về kết luận
Agent teamĐiều phối nhiều phiên Claude Code độc lậpNghiên cứu song song, xây tính năng mới, debug với nhiều giả thuyết cạnh tranhGiao nhiều reviewer kiểm tra bảo mật, hiệu năng, và test cùng lúc
Code intelligenceĐiều hướng và chẩn đoán qua language serverNgôn ngữ có kiểu tĩnh, codebase lớn nơi grep chậm hoặc thiếu chính xácNhảy thẳng đến định nghĩa của một symbol thay vì đọc cả file
MCPKết nối dịch vụ bên ngoàiCần dữ liệu hoặc hành động ngoàiTruy vấn database, đăng lên Slack, điều khiển trình duyệt
HookScript/lệnh chạy theo sự kiệnViệc bắt buộc phải chạy đúng mỗi lần khớp sự kiệnChạy ESLint sau mỗi lần sửa file
ArtifactXuất kết quả phiên thành trang web riêng tư, tương tácKết quả bạn muốn xem/chia sẻ trực quan thay vì đọc trong terminalTimeline sự cố tự cập nhật khi Claude đang điều tra

Plugin là lớp đóng gói - gộp skill, hook, subagent, MCP server thành một gói cài đặt duy nhất. Skill trong plugin có namespace riêng (ví dụ /my-plugin:review) nên nhiều plugin cùng tồn tại không xung đột. Dùng plugin khi muốn tái sử dụng cùng một thiết lập ở nhiều repo hoặc chia sẻ cho người khác qua marketplace.

Xây dựng các cấu hình dần theo thời gian

Phần tiêu đề “Xây dựng các cấu hình dần theo thời gian”

Không cần cấu hình mọi thứ ngay từ đầu. Mỗi tính năng có một “tín hiệu” nhận biết rõ ràng khi nào nên thêm vào và hầu hết các team thêm chúng vào theo thứ tự sau:

Tín hiệuNên thêm
Claude làm sai một quy ước hoặc lệnh lần thứ haiThêm vào CLAUDE.md
Bạn cứ gõ đi gõ lại cùng một prompt để bắt đầu một việcLưu thành skill gọi được bằng /tên
Bạn dán đi dán lại cùng một quy trình nhiều bước vào chat lần thứ baĐóng gói thành skill
Bạn cứ phải copy dữ liệu từ một tab trình duyệt mà Claude không thấy đượcKết nối hệ thống đó qua MCP server
Một việc phụ làm “ngập” hội thoại bằng output bạn sẽ không dùng lạiGiao việc đó cho subagent
Bạn muốn một việc luôn xảy ra mà không cần hỏiViết một hook
Một repo thứ hai cần đúng thiết lập nàyĐóng gói thành plugin

Chính những tín hiệu này cũng cho biết khi nào nên cập nhật các cấu hình đã có. Một lỗi lặp lại hay một góp ý review lặp đi lặp lại là dấu hiệu cần sửa CLAUDE.md, không phải chỉ sửa trong khi chat. Một quy trình bạn cứ phải tự tay chỉnh đi chỉnh lại là dấu hiệu một skill cần được cập nhật.

Skill và Subagent giải quyết hai vấn đề khác nhau:

  • Skill: nội dung tái sử dụng, có thể nạp vào bất kỳ ngữ cảnh nào.
  • Subagent: worker cách ly, chạy tách biệt khỏi hội thoại chính.
SkillSubagent
Là gìChỉ dẫn, kiến thức, hoặc quy trình tái sử dụngWorker cách ly, có ngữ cảnh riêng
Lợi ích chínhChia sẻ nội dung giữa nhiều ngữ cảnhCách ly ngữ cảnh - việc diễn ra tách biệt, chỉ trả về phần tóm tắt
Ảnh hưởng tới context windowCộng thêm vào cửa sổ ngữ cảnh chính của bạnDùng một cửa sổ riêng, với input/output token riêng
Phù hợp choTài liệu tham khảo, quy trình gọi đượcViệc đọc nhiều file, việc chạy song song, worker chuyên biệt

Skill có thể thuộc loại tham khảo (reference) hoặc loại hành động (action). Skill tham khảo cung cấp kiến thức Claude dùng xuyên suốt phiên làm việc (như style guide API của bạn). Skill hành động bảo Claude làm một việc cụ thể (như /deploy chạy quy trình triển khai của bạn).

Dùng subagent khi cần cách ly ngữ cảnh, hoặc khi cửa sổ ngữ cảnh của bạn sắp đầy. Subagent có thể đọc hàng chục file hoặc chạy nhiều lượt tìm kiếm, nhưng hội thoại chính của bạn chỉ nhận về phần tóm tắt. Vì việc subagent làm không tốn ngữ cảnh chính, cách này còn hữu ích khi bạn không cần giữ lại các bước trung gian để xem lại. Subagent tuỳ biến có thể có chỉ dẫn riêng và nạp sẵn skill.

Hai thứ này có thể kết hợp. Một subagent có thể nạp sẵn skill cụ thể (field skills). Một skill cũng có thể chạy trong ngữ cảnh tách biệt bằng context: fork. Xem Chạy skill trong subagent để biết chi tiết.

Cả hai đều lưu chỉ dẫn, nhưng nạp khác nhau và phục vụ mục đích khác nhau.

CLAUDE.mdSkill
Nạp khi nàoMỗi phiên, tự độngTheo yêu cầu
Có thể @path import file?
Có thể trigger quy trình?KhôngCó, bằng /tên
Phù hợp choQuy tắc “luôn luôn làm X”Tài liệu tham khảo, quy trình gọi được

Đặt vào CLAUDE.md nếu Claude cần biết điều đó mọi lúc: quy ước code, lệnh build, cấu trúc dự án, quy tắc “không bao giờ làm X”. Đặt vào skill nếu đó là tài liệu tham khảo Claude chỉ cần thỉnh thoảng (API docs, style guide), hoặc một quy trình bạn tự gọi bằng /<tên> (deploy, review, release).

Nguyên tắc chung: giữ CLAUDE.md dưới 200 dòng. Nếu đang phình to, chuyển nội dung tham khảo sang skill hoặc tách thành .claude/rules/.

Cả ba đều lưu chỉ dẫn, nhưng nạp khác nhau:

CLAUDE.md.claude/rules/Skill
Nạp khi nàoMỗi phiênMỗi phiên, hoặc khi file khớp mẫu được mởTheo yêu cầu, khi được gọi hoặc thấy phù hợp
Phạm viToàn dự ánGiới hạn theo đường dẫn fileTheo từng tác vụ
Phù hợp choQuy ước cốt lõi, lệnh buildHướng dẫn riêng cho ngôn ngữ hoặc thư mụcTài liệu tham khảo, quy trình lặp lại

Dùng CLAUDE.md cho chỉ dẫn mọi phiên đều cần: lệnh build, quy ước test, kiến trúc dự án. Dùng rule để giữ CLAUDE.md gọn - rule có frontmatter paths: chỉ nạp khi Claude làm việc với file khớp mẫu, tiết kiệm ngữ cảnh. Dùng skill cho nội dung Claude chỉ thỉnh thoảng cần, như tài liệu API hay checklist deploy gọi bằng /<tên>.

Cả hai đều chạy việc song song, nhưng khác nhau về kiến trúc:

  • Subagent chạy bên trong phiên của bạn và báo kết quả về ngữ cảnh chính.
  • Agent team là các phiên Claude Code độc lập, giao tiếp trực tiếp với nhau.
SubagentAgent team
Ngữ cảnhNgữ cảnh riêng; kết quả trả về cho bên gọiNgữ cảnh riêng; hoàn toàn độc lập
Giao tiếpChỉ báo kết quả về agent chínhCác thành viên nhắn tin trực tiếp cho nhau
Điều phốiAgent chính quản lý toàn bộ công việcTự điều phối qua tin nhắn, cộng thêm danh sách task dùng chung cho các agent có Task tool
Phù hợp choViệc gọn, chỉ cần kết quả cuốiViệc phức tạp cần thảo luận và phối hợp
Chi phí tokenThấp hơn - kết quả được tóm tắt vềCao hơn - mỗi thành viên là một Claude riêng

Dùng subagent khi cần một worker gọn, tập trung: nghiên cứu một câu hỏi, xác minh một luận điểm, review một file - subagent làm việc và trả về tóm tắt, hội thoại chính của bạn luôn gọn gàng.

Dùng agent team khi các thành viên cần chia sẻ phát hiện, phản biện lẫn nhau, và tự phối hợp - phù hợp cho nghiên cứu với nhiều giả thuyết cạnh tranh, review code song song, hay phát triển tính năng mới khi mỗi thành viên phụ trách một phần riêng.

Điểm chuyển tiếp: nếu bạn đang chạy nhiều subagent song song nhưng chạm giới hạn ngữ cảnh, hoặc các subagent cần giao tiếp với nhau, agent team là bước tiếp theo tự nhiên. Với các phiên độc lập chỉ cần nhắn tin qua lại mà không cần lập thành team, xem Nhắn tin giữa các phiên.

MCP kết nối Claude với dịch vụ bên ngoài. Skill mở rộng những gì Claude biết, gồm cả cách dùng các dịch vụ đó hiệu quả.

MCPSkill
Là gìGiao thức để kết nối với dịch vụ bên ngoàiKiến thức, quy trình, và tài liệu tham khảo
Cung cấpTool và quyền truy cập dữ liệuKiến thức, quy trình, tài liệu tham khảo
Ví dụTích hợp Slack, truy vấn database, điều khiển trình duyệtChecklist code review, quy trình deploy, style guide API

Hai thứ này giải quyết vấn đề khác nhau và phối hợp tốt với nhau:

  • MCP cho Claude tool chuyên dụng để thao tác trên một hệ thống ngoài, với việc kết nối và xác thực do server xử lý.
  • Skill cho Claude kiến thức về cách dùng các tool đó hiệu quả, cộng thêm các quy trình bạn có thể gọi bằng /<tên>. Một skill có thể chứa schema database và pattern truy vấn quen thuộc của team bạn, hoặc một quy trình /post-to-slack theo đúng quy tắc định dạng tin nhắn của team.

Claude Code chạy một hook tại một sự kiện vòng đời; nó nạp một skill vào ngữ cảnh để Claude áp dụng.

HookSkill
Chạy gìLệnh shell, HTTP request, prompt cho LLM, hoặc subagentChỉ dẫn Claude đọc và làm theo
Được kích hoạt bởiSự kiện vòng đời (PostToolUse, SessionStart…)Bạn gõ /tên, hoặc Claude khớp mô tả với tác vụ đang làm
Độ chắc chắnLuôn kích hoạt đúng sự kiện, đảm bảo chạyClaude diễn giải chỉ dẫn, kết quả có thể khác nhau
Chi phí ngữ cảnhBằng 0, trừ khi hook trả về outputMô tả nạp mỗi phiên; nội dung đầy đủ nạp khi dùng
Phù hợp choLint sau khi sửa, chặn lệnh nguy hiểm, ghi log, thông báoQuy trình cần suy luận, tài liệu tham khảo, việc nhiều bước

Dùng hook khi hành động phải diễn ra giống hệt nhau mỗi lần và không cần Claude suy nghĩ. Ví dụ: format khi lưu file, chặn rm -rf /, đăng tin nhắn Slack khi phiên kết thúc.

Dùng skill khi Claude cần tự quyết định cách áp dụng các bước, hoặc khi nội dung là kiến thức chứ không phải một script. Ví dụ: checklist /release, style guide API của bạn, một playbook debug.

Đặt rào chắn (guardrail) vào hook. Một chỉ dẫn kiểu “không bao giờ sửa .env” trong CLAUDE.md hay skill chỉ là một đề nghị, không phải một đảm bảo. Một PreToolUse hook chặn thao tác đó mới là thực thi bắt buộc. Nếu một quy tắc bắt buộc phải đúng mọi lúc, hãy biến nó thành hook thay vì chỉ dặn trong prompt.

Output của hook đi vào ngữ cảnh. Một PostToolUse hook chạy linter sẽ đưa kết quả trở lại dưới dạng văn bản để Claude đọc; còn một skill /fix-lint thì bảo Claude cách sửa các lỗi đó.

Tính năng có thể định nghĩa ở nhiều cấp: toàn user, theo dự án, qua plugin, hoặc qua policy do tổ chức quản lý (managed). Bạn cũng có thể lồng CLAUDE.md trong thư mục con, hoặc đặt skill riêng cho từng package của một monorepo. Khi cùng một tính năng tồn tại ở nhiều cấp, cách chúng chồng lên nhau như sau:

  • CLAUDE.md là cộng dồn: mọi cấp đều đóng góp nội dung vào ngữ cảnh của Claude cùng lúc. File từ thư mục làm việc trở lên nạp lúc khởi động; file trong thư mục con nạp khi bạn làm việc ở đó. Khi chỉ dẫn mâu thuẫn nhau, Claude tự phán đoán để dung hoà, thường ưu tiên chỉ dẫn cụ thể hơn.
  • Skill và subagent ghi đè theo tên: khi cùng một tên tồn tại ở nhiều cấp, một định nghĩa duy nhất thắng theo thứ tự ưu tiên (managed > user > project với skill; managed > CLI flag > project > user > plugin với subagent). Skill của plugin có namespace riêng nên không xung đột.
  • MCP server ghi đè theo tên: local > project > user.
  • Hooks cộng dồn: mọi hook đã đăng ký đều chạy cho sự kiện khớp, bất kể nguồn nào.

Mỗi phần mở rộng giải quyết một vấn đề khác nhau: CLAUDE.md lo phần ngữ cảnh cố định, skill lo kiến thức/quy trình theo yêu cầu, MCP lo kết nối bên ngoài, subagent lo cách ly ngữ cảnh, hook lo tự động hoá. Một thiết lập thực tế thường kết hợp chúng dựa trên quy trình làm việc - ví dụ: CLAUDE.md cho quy ước dự án, một skill cho quy trình deploy, MCP để kết nối database, và một hook để lint sau mỗi lần sửa file.

Kết hợpCách hoạt độngVí dụ
Skill + MCPMCP lo kết nối; skill dạy Claude dùng kết nối đó cho tốtMCP kết nối database, skill mô tả schema và pattern truy vấn
Skill + SubagentSkill khởi động nhiều subagent làm song songSkill /audit khởi động các subagent kiểm tra bảo mật, hiệu năng, style riêng biệt
CLAUDE.md + SkillCLAUDE.md giữ quy tắc luôn-đúng; skill giữ tài liệu tham khảo nạp khi cầnCLAUDE.md nói “theo quy ước API của chúng ta”, skill chứa toàn bộ style guide
Hook + MCPHook kích hoạt hành động ra ngoài qua MCPHook sau khi sửa gửi thông báo Slack khi Claude sửa file quan trọng

Mỗi tính năng bạn thêm vào đều tốn một phần ngữ cảnh của Claude. Quá nhiều có thể làm đầy cửa sổ ngữ cảnh, hoặc gây nhiễu khiến Claude kém hiệu quả hơn (skill không được gọi đúng lúc, Claude quên mất quy ước…). Xem mô phỏng trực quan hơn tại Cửa sổ ngữ cảnh.

Tính năngNạp khi nàoChi phí ngữ cảnh
CLAUDE.mdĐầu phiênToàn bộ nội dung, mỗi request
SkillĐầu phiên + khi dùngThấp (chỉ mô tả) cho tới khi thực sự gọi*
MCP serverĐầu phiênChỉ tên tool; schema đầy đủ nạp khi cần
Code intelligenceSau khi sửa file + theo yêu cầuThấp - thường giảm số lần đọc file ở nơi khác
SubagentKhi được gọiNgữ cảnh riêng, tách biệt khỏi phiên chính
HookKhi triggerGần như bằng 0, trừ khi hook trả thêm ngữ cảnh

*Mặc định mô tả skill nạp vào đầu session để Claude biết khi nào nên dùng. Đặt disable-model-invocation: true trong frontmatter của skill để ẩn nó hoàn toàn khỏi Claude cho tới khi bạn tự gọi - chi phí ngữ cảnh về gần như 0 với skill chỉ bạn tự trigger. Với skill không phải do bạn viết, đặt skillOverrides trong settings để làm điều tương tự mà không cần sửa file skill đó.

  • Khi nào nạp: lúc bắt đầu session.
  • Nạp cái gì: toàn bộ nội dung mọi file CLAUDE.md (cấp managed, user, và project).
  • Kế thừa: Claude đọc file CLAUDE.md từ thư mục làm việc lên tới thư mục gốc, và phát hiện thêm các file lồng trong thư mục con khi nó truy cập tới các file trong đó. Xem Cách CLAUDE.md được nạp để biết chi tiết.

Bài viết đã được dịch, biên tập và kiểm tra nội dung bởi Phuc Tran.