- Một skill là một thư mục có tệp
SKILL.md: phần đầu ghi tên và mô tả, phần thân ghi cách làm. Có thể kèm script và tài liệu tham khảo. - Agent chỉ nạp tên và mô tả của skill lúc khởi động; thân skill chỉ được đọc khi yêu cầu khớp. Nhờ vậy có thể gắn nhiều skill mà ngữ cảnh vẫn nhẹ.
- Skill hợp với quy trình nhiều bước hay lặp lại. Quy tắc luôn đúng ở mọi việc thì nên ghi vào tệp hướng dẫn dự án.
Bài này dựa trên bài kỹ thuật của Anthropic, trang của định dạng mở Agent Skills và tài liệu Claude Code, đọc ngày 11/11/2026. Tên trường và đường dẫn tệp dưới đây là điều tài liệu hiện ghi; công cụ AI đổi nhanh, nên khi làm thật hãy đối chiếu lại với tài liệu của hãng.
Agent Skills là gì?
Agent Skills là một định dạng nhẹ và mở để mở rộng khả năng của AI agent bằng kiến thức chuyên biệt và quy trình làm việc. Trang chủ của định dạng mô tả lõi của nó rất đơn giản: một skill là một thư mục chứa tệp SKILL.md; tệp này gồm siêu dữ liệu (tối thiểu là name và description) cùng chỉ dẫn cho agent cách làm một việc cụ thể. Trong bài đăng ngày 16/10/2025, Anthropic gọi skill là các thư mục có tổ chức gồm chỉ dẫn, script và tài nguyên, để agent tìm và nạp khi cần, nhờ đó làm tốt hơn các việc chuyên biệt.
Hãy hình dung bạn thuê một bạn thực tập rất giỏi nhưng chưa biết quy trình của nhóm bạn. Mỗi lần giao việc, bạn phải giải thích lại: báo cáo theo mẫu nào, đặt tên nhánh ra sao, kiểm tra những gì trước khi nộp. Skill là cuốn sổ tay quy trình của bạn thực tập đó: viết một lần, để trong ngăn kéo, và bạn ấy chỉ giở ra khi gặp việc tương ứng.
Định dạng này do Anthropic phát triển ban đầu, rồi công bố thành chuẩn mở, và theo trang chủ của nó đã được một số lượng ngày càng nhiều sản phẩm agent áp dụng. Danh sách công cụ hỗ trợ được cập nhật ở trang agentskills.io, nên bài này không liệt kê để tránh lỗi thời. Riêng phía Anthropic, bài đăng nói skill dùng được trong Claude.ai, Claude Code, Claude Agent SDK và nền tảng dành cho nhà phát triển của hãng.
Một skill gồm những gì?
Về hình thức, một skill là một thư mục. Theo định dạng mở, cấu trúc như sau:
tom-tat-thay-doi/
├── SKILL.md # bắt buộc: siêu dữ liệu + chỉ dẫn
├── scripts/ # tùy chọn: mã chạy được
├── references/ # tùy chọn: tài liệu tham khảo
└── assets/ # tùy chọn: mẫu, tài nguyên
Chỉ SKILL.md là bắt buộc. Các thư mục còn lại để chứa những thứ bạn không muốn nhét hết vào một tệp: script để agent chạy, tài liệu dài chỉ đọc khi cần, mẫu biểu. Nội dung của SKILL.md gồm hai phần: khối YAML nằm giữa hai dòng ---, rồi đến chỉ dẫn viết bằng Markdown. Một skill tối giản trông như sau:
---
name: tom-tat-thay-doi
description: Tóm tắt các thay đổi chưa commit và nêu rủi ro. Dùng khi người dùng hỏi đã đổi gì hoặc cần thông điệp commit.
---
Tóm tắt thay đổi trong hai hoặc ba gạch đầu dòng, rồi liệt kê rủi ro.
Nếu cần mẫu thông điệp, đọc references/mau-commit.md.
Trường description là phần quan trọng nhất, vì đó là thứ agent đọc để quyết định có dùng skill hay không. Hãy viết nó trả lời hai câu hỏi: skill này làm gì, và khi nào nên dùng. Mô tả như "giúp làm việc với tệp" quá chung, agent không biết lúc nào nên chọn nó.
Một điểm cần lưu ý: chuẩn mở và bài của Anthropic nêu name và description là hai trường tối thiểu, trong khi tài liệu Claude Code cho biết trong Claude Code mọi trường đều không bắt buộc, name lấy theo tên thư mục nếu bỏ, và description được khuyến nghị. Ngoài ra Claude Code mở rộng chuẩn bằng một số trường riêng, ví dụ để chặn việc agent tự gọi skill hoặc để chạy skill trong một subagent. Nếu bạn định dùng skill ở nhiều công cụ khác nhau, hãy bám vào hai trường tối thiểu để skill chạy được ở khắp nơi.
Skill hoạt động thế nào: nạp dần theo ba mức
Điểm thông minh của skill nằm ở cách nạp. Nếu mọi skill đều nằm sẵn trong ngữ cảnh thì chỉ cần vài chục skill là ngữ cảnh đầy. Vì vậy agent nạp theo ba mức, gọi là nạp dần (progressive disclosure):
- Khám phá (discovery). Lúc khởi động, agent chỉ đọc tên và mô tả của từng skill, vừa đủ để biết khi nào skill có thể hữu ích.
- Kích hoạt (activation). Khi yêu cầu của bạn khớp với mô tả của một skill, agent mới đọc toàn bộ nội dung
SKILL.mdvào ngữ cảnh. - Thực thi (execution). Agent làm theo chỉ dẫn, và nếu cần thì chạy script đi kèm hoặc đọc thêm tệp tham khảo.
Bài của Anthropic lấy ví dụ một skill xử lý PDF: agent đọc SKILL.md, và chỉ khi phải điền biểu mẫu mới đọc thêm tệp forms.md đi kèm. Việc tách nội dung chuyên biệt ra tệp riêng giữ cho phần lõi gọn, và cho phép một skill chứa lượng kiến thức lớn hơn nhiều so với một tệp duy nhất.
Đoạn code Python dưới đây mô phỏng chính cơ chế đó, để bạn thấy nó chẳng có gì bí ẩn. Nó tạo ba skill mẫu, đọc mức 1 (chỉ tên và mô tả), chọn skill theo yêu cầu, rồi mới đọc mức 2. Ở agent thật, việc chọn skill do mô hình suy luận từ mô tả; ở đây dùng so khớp từ khóa đơn giản để chạy được mà không cần mạng.
"""Mô phỏng cách agent nạp skill dần dần (progressive disclosure).
Mức 1: lúc khởi động chỉ đọc tên và mô tả của mọi skill.
Mức 2: khi yêu cầu khớp một skill thì mới đọc phần thân của SKILL.md.
Mức 3: tệp kèm theo (ví dụ references/...) chỉ đọc khi thân skill nhắc tới và cần dùng.
Việc "chọn skill nào" ở agent thật do mô hình suy luận từ mô tả. Ở đây dùng so khớp từ khóa đơn giản
để chạy được mà không cần mạng.
"""
import os
import tempfile
import unicodedata
def bo_dau(s):
s = unicodedata.normalize("NFD", s.lower())
return "".join(c for c in s if unicodedata.category(c) != "Mn").replace("đ", "d")
def doc_frontmatter(noi_dung):
"""Tách khối YAML đầu tệp và phần thân. Chỉ hiểu dạng 'khóa: giá trị' trên một dòng."""
if not noi_dung.startswith("---\n"):
return {}, noi_dung
dau, _, than = noi_dung[4:].partition("\n---\n")
meta = {}
for dong in dau.splitlines():
khoa, sep, gia_tri = dong.partition(":")
if sep:
meta[khoa.strip()] = gia_tri.strip()
return meta, than.lstrip("\n")
def nap_muc_1(thu_muc):
"""Đọc tên và mô tả của từng skill. Đây là phần luôn nằm trong ngữ cảnh."""
ds = []
for ten_thu_muc in sorted(os.listdir(thu_muc)):
duong_dan = os.path.join(thu_muc, ten_thu_muc, "SKILL.md")
if os.path.isfile(duong_dan):
with open(duong_dan, encoding="utf-8") as f:
meta, _ = doc_frontmatter(f.read())
ds.append({
"name": meta.get("name", ten_thu_muc),
"description": meta.get("description", ""),
"duong_dan": duong_dan,
})
return ds
def chon_skill(ds, yeu_cau):
"""Chọn skill có mô tả trùng nhiều từ nhất với yêu cầu. Trả None nếu không từ nào trùng."""
tu_yeu_cau = set(bo_dau(yeu_cau).split())
tot_nhat, diem_cao = None, 0
for s in ds:
diem = len(tu_yeu_cau & set(bo_dau(s["description"]).replace(".", " ").replace(",", " ").split()))
if diem > diem_cao:
tot_nhat, diem_cao = s, diem
return tot_nhat
def nap_muc_2(skill):
"""Đọc phần thân SKILL.md. Chỉ làm khi đã chọn skill."""
with open(skill["duong_dan"], encoding="utf-8") as f:
return doc_frontmatter(f.read())[1]
def tao_skill_mau(goc):
mau = {
"tom-tat-thay-doi": (
"Tóm tắt các thay đổi chưa commit và nêu rủi ro. Dùng khi người dùng hỏi đã đổi gì hoặc cần thông điệp commit.",
"Tóm tắt thay đổi trong hai hoặc ba gạch đầu dòng, rồi liệt kê rủi ro.\nNếu cần mẫu thông điệp, đọc references/mau-commit.md.\n",
),
"viet-test": (
"Viết bài test cho hàm Python vừa sửa. Dùng khi người dùng muốn thêm test hoặc kiểm tra hàm.",
"Đọc hàm, liệt kê ca thường và ca biên, viết test bằng pytest.\n",
),
"dich-tai-lieu": (
"Dịch tài liệu kỹ thuật sang tiếng Việt, giữ nguyên tên hàm và đoạn code.",
"Dịch từng đoạn, không dịch tên hàm, không dịch nội dung trong khối code.\n",
),
}
for ten, (mo_ta, than) in mau.items():
os.makedirs(os.path.join(goc, ten), exist_ok=True)
with open(os.path.join(goc, ten, "SKILL.md"), "w", encoding="utf-8") as f:
f.write(f"---\nname: {ten}\ndescription: {mo_ta}\n---\n\n{than}")
def chay_thu():
with tempfile.TemporaryDirectory() as goc:
tao_skill_mau(goc)
ds = nap_muc_1(goc)
muc_1 = sum(len(s["name"]) + len(s["description"]) for s in ds)
print(f"Mức 1 (luôn nạp): {len(ds)} skill, {muc_1} ký tự")
yeu_cau = "hãy tóm tắt các thay đổi chưa commit"
skill = chon_skill(ds, yeu_cau)
print(f"Yêu cầu: {yeu_cau}")
print(f"Chọn: {skill['name'] if skill else 'không có'}")
if skill:
than = nap_muc_2(skill)
print(f"Mức 2 (nạp khi dùng): {len(than)} ký tự")
return ds, skill
if __name__ == "__main__":
chay_thu()
Chạy đoạn code sẽ in ra:
Mức 1 (luôn nạp): 3 skill, 310 ký tự
Yêu cầu: hãy tóm tắt các thay đổi chưa commit
Chọn: tom-tat-thay-doi
Mức 2 (nạp khi dùng): 124 ký tự
Con số nói lên điều quan trọng. Ba skill chỉ tốn 310 ký tự ở mức 1, và thân của skill được chọn mới nạp thêm 124 ký tự. Nếu mỗi skill thật dài vài nghìn ký tự thì chênh lệch còn rõ hơn nhiều: bạn có thể giữ hàng chục skill mà ngữ cảnh gần như không bị chiếm chỗ cho tới khi cần.
Trong Claude Code, theo tài liệu, tên và mô tả của skill luôn có sẵn trong ngữ cảnh, còn nội dung đầy đủ chỉ nạp khi skill được dùng. Claude dùng skill tự động khi yêu cầu khớp với mô tả, hoặc bạn gọi thẳng bằng cách gõ dấu gạch chéo và tên skill ở đầu tin nhắn. Phần mô tả (cộng thêm trường when_to_use nếu có) bị cắt ở 1.536 ký tự khi liệt kê, nên hãy đặt trường hợp dùng quan trọng nhất ở đầu.
Skill khác gì tệp hướng dẫn dự án, prompt, MCP và subagent?
Bốn khái niệm này hay bị nhầm với skill vì cùng "chỉ cho AI biết điều gì đó". Điểm khác nằm ở lúc nào nội dung vào ngữ cảnh và nó để làm gì.
| Nội dung vào ngữ cảnh khi nào | Dùng để | |
|---|---|---|
| Tệp hướng dẫn dự án (CLAUDE.md) | Mỗi phiên, từ đầu | Quy ước và bối cảnh luôn đúng cho cả dự án |
| Skill | Tên và mô tả luôn có; thân khi dùng | Quy trình cho một loại việc cụ thể |
| Prompt gõ trực tiếp | Một lần, trong cuộc trò chuyện | Yêu cầu của lúc đó |
| MCP | Công cụ do máy chủ MCP cung cấp | Cho AI kết nối hệ thống bên ngoài |
| Subagent | Chạy trong ngữ cảnh riêng | Giao việc để giữ ngữ cảnh chính gọn |
Tài liệu Claude Code nêu rõ sự khác biệt đầu tiên: khác với nội dung CLAUDE.md, phần thân skill chỉ nạp khi dùng, nên tài liệu tham khảo dài tốn rất ít cho tới khi cần. Vì thế quy tắc như "mọi thay đổi phải có test" nên nằm trong tệp hướng dẫn dự án (xem viết hướng dẫn dự án cho AI), còn quy trình như "cách soạn một báo cáo tuần theo mẫu của nhóm" nên là skill.
Skill và MCP bổ sung nhau chứ không thay nhau. MCP cho AI công cụ để chạm vào hệ thống bên ngoài, còn skill dạy AI quy trình dùng các công cụ đó cho đúng. Bài MCP là gì giải thích phần đầu.
Skill nằm ở đâu trên máy bạn?
Với Claude Code, vị trí của skill quyết định ai dùng được nó. Theo tài liệu hiện hành:
| Phạm vi | Đường dẫn |
|---|---|
| Cá nhân (mọi dự án của bạn) | ~/.claude/skills/<tên>/SKILL.md |
| Dự án | .claude/skills/<tên>/SKILL.md, commit vào git để cả nhóm dùng chung |
| Plugin | <plugin>/skills/<tên>/SKILL.md |
| Doanh nghiệp | Trong thư mục cấu hình do tổ chức quản lý |
Vì skill chỉ là thư mục tệp văn bản nên chúng có thể được quản lý như code: đưa lên GitHub, xem lịch sử thay đổi, nhờ đồng nghiệp xem lại. Điều này cũng giải thích vì sao có nhiều bộ skill chia sẻ công khai; bài cài skill cho Claude Code từ GitHub hướng dẫn cách cài chúng, và 10 skill hữu ích gợi ý nên bắt đầu từ đâu.
Khi nào nên viết skill, khi nào không?
Nên viết skill khi:
- bạn thấy mình giải thích cùng một quy trình cho AI từ lần thứ ba trở đi;
- quy trình có nhiều bước hoặc có tiêu chí chất lượng riêng (mẫu báo cáo, cách viết commit, cách xử lý một loại tệp);
- cả nhóm cần làm việc theo cùng một chuẩn;
- cần kèm script hay mẫu mà không muốn nhét hết vào mỗi cuộc trò chuyện.
Chưa cần skill khi:
- việc chỉ làm một lần: gõ thẳng yêu cầu là đủ;
- quy tắc luôn đúng với mọi việc: ghi vào tệp hướng dẫn dự án;
- bạn cần điều gì đó luôn xảy ra, không phụ thuộc mô hình có "nhớ" hay không: dùng hook (xem hooks cho AI), vì hook chạy tự động còn skill là chữ để mô hình đọc.
Một dấu hiệu tốt để biết skill đang làm việc: bạn nhờ AI một việc thuộc loại đó mà không nhắc tên skill, và nó vẫn làm theo đúng quy trình của bạn. Nếu nó không tự dùng skill, nguyên nhân thường là phần mô tả quá chung hoặc thiếu tình huống dùng cụ thể.
An toàn: skill có thể chứa code chạy được
Vì skill gồm chỉ dẫn và có thể kèm script, một skill độc hại có thể đưa lỗ hổng vào, làm lộ dữ liệu hoặc hướng agent làm điều không mong muốn. Anthropic khuyên chỉ cài skill từ nguồn đáng tin; với skill ít tin cậy thì kiểm tra trước khi dùng, gồm đọc các tệp đi kèm, xem các thư viện phụ thuộc, và để ý những chỉ dẫn yêu cầu kết nối ra nguồn mạng bên ngoài.
Thói quen đơn giản nên có: mở thư mục skill, đọc SKILL.md, đọc từng tệp trong scripts/, rồi mới cài. Mất vài phút nhưng đáng, vì agent sẽ chạy những gì skill bảo nó chạy với quyền trên máy của bạn.
- Viết mô tả quá chung ("giúp làm việc với tài liệu"): agent không biết khi nào nên dùng skill.
- Nhồi cả quy trình dài, tài liệu tham khảo và mọi ngoại lệ vào một
SKILL.md: hãy tách phần dài sangreferences/để chỉ nạp khi cần. - Đưa vào skill những quy tắc luôn đúng ở mọi việc: chúng nên nằm trong tệp hướng dẫn dự án.
- Cài skill từ GitHub mà không đọc script đi kèm.
- Viết skill cho việc chỉ làm một lần, rồi quên mất nó, trong khi mô tả của nó vẫn chiếm chỗ trong ngữ cảnh.
Câu hỏi thường gặp
Agent Skills có phải của riêng Claude không?
Định dạng do Anthropic phát triển ban đầu, nhưng được công bố thành chuẩn mở và nhiều công cụ agent khác đã hỗ trợ. Một skill viết đúng chuẩn có thể dùng lại ở các công cụ tương thích. Xem trang agentskills.io để biết công cụ nào đang hỗ trợ.
Skill khác CLAUDE.md ở điểm nào?
CLAUDE.md được nạp ngay từ đầu mỗi phiên và chứa quy ước chung của dự án. Skill chỉ nạp tên và mô tả lúc đầu, còn phần thân nạp khi dùng, nên phù hợp với quy trình dài hoặc ít khi cần.
Một skill dài bao nhiêu là hợp lý?
Không có con số cố định trong các tài liệu. Nguyên tắc là giữ phần thân gọn, chuyển tài liệu tham khảo dài sang tệp riêng và để agent đọc khi cần.
Có cần biết lập trình để viết skill không?
Không bắt buộc. Một skill chỉ cần tệp SKILL.md viết bằng Markdown. Biết lập trình chỉ cần khi bạn muốn kèm script chạy được.
Skill có làm AI tốn thêm tiền không?
Mức 1 luôn chiếm một phần nhỏ của ngữ cảnh, và khi skill được dùng thì thân của nó cũng được tính. Vì vậy hãy viết gọn và đừng cài những skill bạn không dùng.
Học tiếp
- Muốn hiểu bức tranh lớn hơn về agent, đọc AI agent là gì.
- Muốn thử ngay, đọc cài skill cho Claude Code từ GitHub rồi tự viết skill đầu tiên.
- Muốn tìm ý tưởng skill nên có, đọc 10 skill hữu ích.
Nếu bạn muốn học cách làm việc với AI một cách có hệ thống, tham khảo khóa học AI của Big-O Coding.
Khóa AI – Introduction to Machine Learning: nền tảng Máy học từ thuật toán cơ bản đến Neural Networks và LLM, học bằng Python. Học thử buổi 1 miễn phí.


