SSD Nodes Learn 🎉 VPS เริ่ม $5.50/เดือน
คู่มือ Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-08-13

เปรียบเทียบ Agent skills, MCP servers และ rules files

สรุปความแตกต่างของ Agent skills, MCP servers และ rules files ในการให้บริบทแก่ AI วิเคราะห์ต้นทุน Token และประสิทธิภาพในการใช้งานจริง เพื่อเลือกวิธีที่เหมาะสมที่สุดสำหรับโปรเจกต์ของคุณ

ความแตกต่างระหว่าง Agent skills, MCP servers และ rules files: คำตอบโดยย่อ

Agent skills, MCP servers และ rules files ต่างก็เป็นการนำความรู้ไปใส่ไว้ให้ coding agent ใช้งาน ให้เลือกใช้โดยพิจารณาจากลักษณะของความรู้นั้นๆ MCP (model context protocol) เหมาะสำหรับข้อมูลที่อาจเปลี่ยนแปลงได้ทุกครั้งที่คุณเรียกดู ส่วน skill เหมาะสำหรับขั้นตอนการทำงานที่คุณสามารถเขียนบันทึกไว้ในวันนี้และยังคงถูกต้องแม้เวลาผ่านไป 6 สัปดาห์ สำหรับ rules file นั้นเหมาะสำหรับข้อเท็จจริงเพียงไม่กี่ประการที่ต้องยึดถือในทุกเซสชัน

การเลือกดังกล่าวมีต้นทุน และต้นทุนนั้นคือ context ทุก token ที่เสียไปกับคำสั่งที่ agent ไม่จำเป็นต้องใช้ คือ token ที่หายไปจากการอ่านโค้ด นอกจากนี้ยังเป็น token ที่คุณต้องจ่ายซ้ำในทุกรอบการสนทนา เนื่องจาก context window ทั้งหมดจะถูกส่งใหม่ในทุกคำขอ ดังนั้นคำถามที่มีประโยชน์จึงไม่ใช่กลไกใดที่ สามารถ ทำงานนี้ได้ (เพราะส่วนใหญ่ทำได้ทั้งสามอย่าง) แต่เป็นคำถามที่ว่ากลไกใดมีต้นทุนต่ำที่สุดในขณะที่ไม่ได้ถูกเรียกใช้งาน

ต้นทุนของแต่ละส่วนก่อนเริ่มใช้งาน

ทั้งสามส่วนโหลดข้อมูลในเวลาที่ต่างกัน และจังหวะเวลานี้คือความแตกต่างทั้งหมด

ไฟล์กฎ (rules file) จะโหลดข้อมูลทั้งหมดเมื่อเริ่มการทำงานในทุกเซสชัน ไม่ว่าส่วนนั้นจะเกี่ยวข้องหรือไม่ก็ตาม Claude Code จะอ่าน CLAUDE.md ตั้งแต่เริ่มการสนทนาและโหลดข้อมูลทั้งหมดโดยไม่คำนึงถึงความยาว เป้าหมายที่แนะนำคือไม่เกิน 200 บรรทัดต่อไฟล์ เนื่องจากไฟล์ที่ยาวกว่านั้นจะสิ้นเปลือง context มากขึ้น และ มีโอกาสที่โมเดลจะปฏิบัติตามได้แม่นยำน้อยลง ผลกระทบทั้งสองประการนี้ส่งผลไปในทิศทางเดียวกัน ซึ่งเป็นเหตุผลว่าทำไมไฟล์กฎขนาด 900 บรรทัดจึงแย่ยิ่งกว่าไม่มีประโยชน์

ทักษะ (skill) จะโหลดข้อมูลเป็นสองขั้นตอน ในช่วงเริ่มต้นจะมีเพียงบรรทัด description จากส่วน frontmatter ของแต่ละ SKILL.md เท่านั้นที่เข้าสู่ context เพื่อให้โมเดลทราบว่าทักษะนี้มีอยู่และทราบโดยประมาณว่าควรเรียกใช้เมื่อใด ส่วนเนื้อหาหลักจะถูกโหลดเมื่อมีการเรียกใช้ทักษะนั้น ดังนั้นเอกสารอ้างอิงขนาด 400 บรรทัดจึงแทบไม่มีต้นทุนเลยจนกว่าจะถึงเวลาที่จำเป็นต้องใช้

MCP server เคยเป็นส่วนที่มีต้นทุนสูง และนี่คือจุดที่ข้อมูลเปรียบเทียบส่วนใหญ่ที่คุณอ่านอาจล้าสมัยไปแล้ว ปัจจุบัน Claude Code เปิดใช้งานการค้นหาเครื่องมือ (tool search) เป็นค่าเริ่มต้น โดยจะมีเพียงชื่อเครื่องมือและช่องคำสั่ง (instructions field) ของเซิร์ฟเวอร์เท่านั้นที่โหลดเมื่อเริ่มเซสชัน ส่วน JSON (JavaScript object notation) schema ฉบับเต็มจะถูกเลื่อนการโหลดออกไปจนกว่า Claude จะค้นหาเครื่องมือนั้น การเพิ่มเซิร์ฟเวอร์จึงไม่ทำให้เสีย token จำนวนหลายพันในทันทีอีกต่อไป อย่างไรก็ตาม ยังคงมีต้นทุนอยู่บ้าง และหากตั้งค่าในรูปแบบที่ปิดการค้นหาเครื่องมือไว้ ต้นทุนทั้งหมดจะถูกเรียกใช้ตั้งแต่เริ่มต้น

ChartStartup and post-use context cost, estimated tokens
The data behind this chart
[
  {
    "label": "Rules file, 200 lines",
    "at_startup": "2,500",
    "after_use": "2,500"
  },
  {
    "label": "Skill, 12 KB body",
    "at_startup": 40,
    "after_use": "3,000"
  },
  {
    "label": "MCP server, tool search on",
    "at_startup": 500,
    "after_use": "3,200"
  },
  {
    "label": "MCP server, tool search off",
    "at_startup": "4,500",
    "after_use": "4,500"
  }
]

ตัวเลขเหล่านี้เป็นการประมาณการ ไม่ใช่การวัดผลจากเครื่องของคุณ โดยคำนวณจากขนาดของข้อความที่แต่ละกลไกโหลด ซึ่งคิดเป็นประมาณสี่ตัวอักษรต่อหนึ่ง token: ไฟล์กฎขนาด 200 บรรทัดจะมีขนาดประมาณ 10 KB ในรูปแบบ markdown, คำอธิบายทักษะมีความยาวประมาณ 160 ตัวอักษร และเซิร์ฟเวอร์ที่เปิดใช้งานเครื่องมือสิบสองรายการจะมีข้อมูล schema ประมาณ 18 KB รวมกับบล็อกคำสั่งอีก 2 KB ทั้งนี้ Claude Code จะตัดคำอธิบายเครื่องมือและช่องคำสั่งของเซิร์ฟเวอร์แต่ละรายการที่เกิน 2 KB ดังนั้นส่วนนี้จึงมีเพดานจำกัด ส่วนถัดไปจะแสดงวิธีอ่านตัวเลขจริงของคุณเอง

ให้พิจารณาสองแถวแรกประกอบกัน ไฟล์กฎมีต้นทุน 2,500 tokens ในเซสชันที่ไม่มีใครเรียกใช้มัน ส่วนทักษะมีต้นทุน 40 tokens ในเซสชันเดียวกัน และมีต้นทุน 3,000 ในเซสชันที่หนึ่งในสิบซึ่งมีการเรียกใช้ทักษะนั้น สองแถวสุดท้ายคือเซิร์ฟเวอร์เดียวกันเปรียบเทียบระหว่างการเปิดและปิดการค้นหาเครื่องมือ: 500 tokens เทียบกับ 4,500 ช่องว่างระหว่างตัวเลขนี้คือเหตุผลที่คำแนะนำเก่าๆ เกี่ยวกับปัญหา context บวมจาก MCP ยังคงถูกพูดถึงอยู่

การค้นหาเครื่องมือจำเป็นต้องใช้โมเดลที่รองรับบล็อก tool_reference ซึ่ง ณ เดือนสิงหาคม 2026 หมายถึง Claude Sonnet 4.5, Haiku 4.5, Opus 4.5 และรุ่นที่ใหม่กว่า Claude Code จะปิดการทำงานนี้เมื่อ ANTHROPIC_BASE_URL ชี้ไปยังโฮสต์ที่ไม่ใช่ของบริษัท (first party) เนื่องจาก proxy ส่วนใหญ่ไม่ส่งต่อบล็อกดังกล่าว คุณสามารถตั้งค่า ENABLE_TOOL_SEARCH เพื่อควบคุมการทำงานนี้ได้: false จะโหลดทุก schema ตั้งแต่เริ่มต้น, true จะเลื่อนการโหลดทั้งหมดออกไป และ auto จะโหลดข้อมูลทั้งหมดตั้งแต่ต้นเฉพาะเมื่อขนาดรวมกันไม่เกิน 10% ของ context window เท่านั้น

# Load schemas up front only if they fit in 5% of the window
ENABLE_TOOL_SEARCH=auto:5 claude

คำถามตัดสินใจ: ข้อมูลมีการเปลี่ยนแปลงระหว่างการเรียกใช้งานหรือไม่?

ให้ถามคำถามนี้เป็นอันดับแรก เพราะจะช่วยตัดตัวเลือกที่ไม่ใช่ออกไปได้ทันที หากเอเจนต์จำเป็นต้องอ่านหรือเขียนสิ่งที่อาจเปลี่ยนแปลงไปในครั้งถัดไปที่เรียกใช้งาน คุณจำเป็นต้องมีเซิร์ฟเวอร์ เช่น ระบบติดตามปัญหา (issue tracker), ฐานข้อมูล, แดชบอร์ดสำหรับตรวจสอบสถานะ หรือ API (application programming interface) ภายในของคุณเอง การจดบันทึกไว้ไม่ได้ช่วยอะไร เพราะสิ่งที่คุณเขียนจะกลายเป็นข้อมูลที่ล้าสมัยทันทีที่มีคนอื่นแก้ไขบันทึกนั้น

หากคำตอบยังคงถูกต้องแม้เวลาผ่านไป 6 สัปดาห์โดยไม่มีใครดูแล คุณควรใช้ทักษะ (skill) เช่น รายการตรวจสอบการปล่อยซอฟต์แวร์ (release checklist), ขั้นตอนการย้ายระบบ (migration procedure), รูปแบบการตอบกลับเมื่อเกิดข้อผิดพลาด หรือวิธีการเขียนทดสอบที่ repository นี้ต้องการ ทักษะคือไฟล์ที่อยู่ใน git ซึ่งไม่มีพอร์ต ไม่มีกระบวนการทำงาน (process) และไม่มีโหมดความล้มเหลวอื่นใดนอกจากความผิดพลาดของเนื้อหา ซึ่งสามารถตรวจสอบได้ผ่านการทำ code review

หากเป็นข้อเท็จจริงเพียงหนึ่งประการที่ต้องนำไปใช้กับงานที่คุณยังไม่ได้คิดถึง ให้ใส่ไว้ในไฟล์กฎ (rules file) Run make lint before committing. Never push to main. Handlers live in src/api/handlers/. โดยให้เขียนบรรทัดละหนึ่งรายการ ทันทีที่รายการใดขยายความยาวจนกลายเป็นขั้นตอนการทำงาน รายการนั้นจะไม่ใช่ข้อเท็จจริงอีกต่อไป แต่จะกลายเป็นขั้นตอนปฏิบัติ และควรย้ายไปอยู่ในส่วนของทักษะแทน

เมื่อไฟล์กฎเพียงพอแล้ว

ไฟล์กฎจะถูกโหลดจากหลายตำแหน่ง โดยเรียงลำดับจากกว้างที่สุดไปจนถึงเฉพาะเจาะจงที่สุด ได้แก่ ไฟล์นโยบายที่จัดการโดยระบบ, ~/.claude/CLAUDE.md ส่วนตัวของคุณ, ./CLAUDE.md หรือ ./.claude/CLAUDE.md ของโปรเจกต์ และ ./CLAUDE.local.md ที่ถูกละเว้นโดย git ไฟล์ทั้งหมดที่พบจะถูกนำมาต่อกันแทนที่จะเขียนทับกัน และไฟล์ที่อยู่ใกล้กับไดเรกทอรีทำงานของคุณมากที่สุดจะถูกอ่านเป็นลำดับสุดท้าย

Claude Code อ่าน CLAUDE.md ไม่ใช่ AGENTS.md หาก repository ของคุณมี AGENTS.md สำหรับเครื่องมืออื่นอยู่แล้ว อย่าเก็บสำเนาไว้สองชุดเพราะข้อมูลจะคลาดเคลื่อนจากกันในภายหลัง

ln -s AGENTS.md CLAUDE.md

การสร้าง symlink จะไม่แสดงผลลัพธ์ใดๆ หากสำเร็จ ให้เริ่มเซสชัน รัน /context และยืนยันว่า CLAUDE.md ปรากฏขึ้นภายใต้ Memory files หากไม่มีรายการดังกล่าวแสดงอยู่ แสดงว่าเอเจนต์ไม่เคยพบไฟล์นั้น และการปรับแก้ข้อความก็จะไม่ช่วยอะไร หากคุณต้องการเพิ่มบรรทัดเฉพาะสำหรับ Claude ให้ใช้รูปแบบการ import แทน และวางบรรทัดเหล่านั้นไว้ใต้คำสั่ง import

@AGENTS.md

## Claude Code

Use plan mode for changes under `src/billing/`.

มีกับดักหนึ่งจุดที่ต้องระวัง การ import ด้วย @path ไม่ได้เป็นการบันทึกบริบท ไฟล์ที่ถูก import จะถูกขยายและโหลดในขณะเริ่มต้นทำงานพร้อมกับไฟล์ที่อ้างอิงถึง โดยรองรับการเชื่อมโยงลึกสูงสุดสี่ระดับ การแยกไฟล์กฎขนาด 600 บรรทัดออกเป็นหกไฟล์ import ช่วยให้มนุษย์จัดการได้ง่ายขึ้น แต่ไม่ได้เปลี่ยนแปลงค่าใช้จ่ายด้าน token เลยแม้แต่น้อย การอ่าน ข้อตกลงเบื้องหลัง AGENTS.md และคู่แฝดที่เน้นมนุษย์เป็นศูนย์กลาง ถือว่าคุ้มค่าก่อนที่คุณจะตัดสินใจเลือกโครงสร้างไฟล์

สิ่งที่ช่วยลดค่าใช้จ่ายได้จริงคือ .claude/rules/ ที่มีฟิลด์ paths ไฟล์กฎที่มี frontmatter แบบ paths จะถูกโหลดก็ต่อเมื่อเอเจนต์เข้าถึงไฟล์ที่ตรงกับรูปแบบที่กำหนดไว้เท่านั้น

---
paths:
  - "src/api/**/*.ts"
---

# API rules

- Every endpoint validates its input.
- Use the standard error response shape.

กฎที่ไม่มีฟิลด์ paths จะถูกโหลดในขณะเริ่มต้นทำงานด้วยลำดับความสำคัญเดียวกับ .claude/CLAUDE.md ดังนั้นรูปแบบการทำงานที่เหมาะสมคือการใช้กฎแบบไม่มีเงื่อนไขสั้นๆ ร่วมกับรายการ paths สำหรับสิ่งที่สำคัญเฉพาะภายในไดเรกทอรีใดไดเรกทอรีหนึ่งเท่านั้น

เมื่อคุณต้องการใช้ skill

Skill คือไดเรกทอรีที่มีไฟล์ SKILL.md อยู่ภายใน Personal skill จะเก็บไว้ที่ ~/.claude/skills/<name>/SKILL.md และมีผลกับทุกโปรเจกต์บนเครื่องของคุณ ส่วน Project skill จะเก็บไว้ที่ .claude/skills/<name>/SKILL.md ซึ่งจะติดไปกับ repository และสามารถตรวจสอบผ่าน pull request ได้เหมือนไฟล์อื่นๆ

mkdir -p ~/.claude/skills/summarize-changes
---
name: summarize-changes
description: Summarizes uncommitted changes and flags anything risky. Use when the user asks what changed, wants a commit message, or asks to review their diff.
---

Run `git status` and `git diff` against the merge base.
Group the changes by intent, not by file.
Call out anything touching auth, migrations or deletions.

ส่วน description เป็นเพียงส่วนเดียวของไฟล์ที่ถูกนำมาพิจารณาก่อนที่ skill จะเริ่มทำงาน จึงทำหน้าที่สองอย่างพร้อมกัน คือระบุว่า skill นี้ทำอะไร และระบุว่าควรเรียกใช้เมื่อใด หากคำอธิบายระบุว่า "ช่วยในการ deploy" จะไม่มีข้อมูลเพียงพอให้โมเดลจับคู่กับคำขอได้ ส่งผลให้ skill ไม่ถูกเรียกใช้งานและคุณอาจสรุปไปเองว่า skill ไม่ทำงาน

ชื่อไดเรกทอรีจะกลายเป็นชื่อคำสั่ง ดังนั้นตัวอย่างข้างต้นจะทำให้คุณได้คำสั่ง /summarize-changes สำหรับ personal skill หรือ project skill นั้น frontmatter name จะกำหนดเพียงป้ายกำกับที่แสดงในรายการเท่านั้น

เมื่อ skill ถูกเรียกใช้งาน เนื้อหาที่ประมวลผลแล้วจะเข้าสู่บทสนทนาในรูปแบบข้อความเดียวและคงอยู่ตลอดช่วงเซสชันนั้น Claude Code จะไม่อ่านไฟล์ซ้ำในภายหลัง ให้เขียนเป็นคำสั่งที่ใช้ได้ตลอดแทนการระบุขั้นตอนแบบครั้งเดียว และรักษาเนื้อหาให้กระชับ เพราะหลังจากจุดนั้น ทุกบรรทัดจะมีต้นทุนในการประมวลผลทุกครั้งที่มีการส่งคำขอ หลังจากกระบวนการ auto-compaction แล้ว Claude Code จะแนบการเรียกใช้ล่าสุดของแต่ละ skill กลับเข้ามา โดยเก็บเนื้อหา 5,000 token แรกของแต่ละ skill ไว้ภายใต้งบประมาณรวม 25,000 token หากคุณเรียกใช้ skill ขนาดใหญ่หลายรายการในเซสชันเดียว skill ที่เก่าที่สุดจะถูกตัดออกไปทั้งหมด ซึ่งเป็นเหตุผลว่าทำไม skill ถึงดูเหมือนไม่มีผลอีกต่อไปหลังจากสนทนาไปนานๆ หากต้องการใช้งานอีกครั้งให้เรียกใช้ใหม่ เมื่อมีขั้นตอนการทำงานที่ใช้ได้กับ codebase มากกว่าหนึ่งแห่ง ให้ แชร์ skill เดียวกันข้ามหลาย repository แทนการคัดลอกไฟล์ไปมา

เมื่อคุณต้องการ MCP server

การเพิ่มเซิร์ฟเวอร์ทำได้ด้วยคำสั่งเดียว โดยรูปแบบการเชื่อมต่อจะเป็นตัวกำหนดลักษณะของเซิร์ฟเวอร์นั้น

# Remote HTTP server
claude mcp add --transport http notion https://mcp.notion.com/mcp

# Remote HTTP server behind a bearer token
claude mcp add --transport http secure-api https://api.example.com/mcp \
  --header "Authorization: Bearer your-token"

# Local stdio server: everything after -- is passed through untouched
claude mcp add --env AIRTABLE_API_KEY=YOUR_KEY --transport stdio airtable \
  -- npx -y airtable-mcp-server

ตัว -- มีความสำคัญ สำหรับเซิร์ฟเวอร์แบบ stdio มันทำหน้าที่แยกตัวเลือกของ Claude Code ออกจากบรรทัดคำสั่งที่ใช้เริ่มเซิร์ฟเวอร์ของคุณ หากคุณละเว้นส่วนนี้ --port 8080 ที่ตั้งใจส่งให้เซิร์ฟเวอร์จะถูกตีความว่าเป็นตัวเลือกของ claude mcp add ซึ่งจะส่งผลให้เกิดข้อผิดพลาดในการประมวลผล

claude mcp list
claude mcp get notion

claude mcp add จะยืนยันด้วยบรรทัด Added ... ซึ่งแจ้งเพียงว่าการตั้งค่าถูกบันทึกลงดิสก์แล้ว claude mcp list คือคำสั่งที่แสดงสถานะจริง เนื่องจากจะพิมพ์สถานะความพร้อมใช้งานข้างชื่อเซิร์ฟเวอร์แต่ละตัว ได้แก่ ✔ Connected, ! Needs authentication หรือ ✘ Failed to connect สถานะความล้มเหลวหมายความว่า Claude Code ไม่สามารถติดต่อเซิร์ฟเวอร์นั้นได้ ไม่ได้หมายความว่าคำสั่งแสดงรายการทำงานผิดพลาด ภายในเซสชัน /mcp จะแสดงมุมมองเดียวกันสำหรับแต่ละเซิร์ฟเวอร์พร้อมจำนวนเครื่องมือที่มี

การเรียกใช้งาน MCP server แต่ละครั้งจะเป็นอิสระต่อกันและนำข้อมูลที่จำเป็นไปด้วย ซึ่งเป็น เหตุผลที่ MCP server ไม่จดจำคำขอก่อนหน้าของคุณ นี่คือการตัดสินใจเชิงออกแบบที่มีผลตามมาที่คุณต้องรับผิดชอบ: สถานะใดก็ตามที่ต้องการเก็บรักษาไว้จะต้องถูกจัดการที่ฝั่งเซิร์ฟเวอร์ ในฐานข้อมูลหรือไฟล์ ซึ่งเป็นสิ่งที่คุณต้องดูแลในตอนนี้

MCP server คือกระบวนการที่คุณต้องรัน

นี่คือต้นทุนที่การเปรียบเทียบของผู้จำหน่ายมักมองข้าม Skill คือไฟล์หนึ่งไฟล์ แต่ MCP server คือซอฟต์แวร์ที่รันอยู่ที่ใดที่หนึ่ง และเมื่อที่นั่นคือ VPS (virtual private server) ของคุณ คุณก็ต้องรับผิดชอบต่อ uptime ของมันด้วย

stdio server เป็นกรณีที่มีต้นทุนต่ำ Claude Code จะสร้างมันขึ้นมาเป็น child process เมื่อเซสชันเริ่มต้น และมันจะสิ้นสุดลงเมื่อเซสชันจบลง ไม่จำเป็นต้องเฝ้าระวัง ไม่จำเป็นต้องแพตช์ตามกำหนดการของมันเอง ส่วน remote HTTP server เป็นบริการที่ต้องรันอยู่ตลอดเวลา ซึ่งต้องการสิ่งที่บริการระยะยาวทุกอย่างจำเป็นต้องมี

[Unit]
Description=Notes MCP server
After=network-online.target
Wants=network-online.target

[Service]
User=mcp
WorkingDirectory=/srv/notes-mcp
ExecStart=/usr/bin/node /srv/notes-mcp/dist/server.js
Environment=PORT=8931
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now notes-mcp
systemctl is-active notes-mcp
journalctl -u notes-mcp -n 50 --no-pager

systemctl is-active ควรแสดงผลเป็น active หากมันแสดงผลเป็น failed บันทึกใน journal จะระบุสาเหตุไว้ และในการรันครั้งแรก สาเหตุเกือบทั้งหมดมักเกิดจาก environment variable ที่ขาดหายไป หรือพอร์ตที่ถูกใช้งานโดยกระบวนการอื่นไปแล้ว Restart=on-failure ไม่ใช่สิ่งที่เลือกได้ในกรณีนี้ เพราะ MCP server ที่ล่มไปจะไม่แจ้งเตือนด้วยตัวเอง คุณจะทราบก็ต่อเมื่อ agent แจ้งว่าไม่สามารถอ่าน issue tracker ของคุณได้

ให้ bind กระบวนการไว้ที่ 127.0.0.1 และวาง reverse proxy ที่มี TLS (transport layer security) ไว้ด้านหน้า MCP server ที่เข้าถึงฐานข้อมูลของคุณและตอบสนองบนพอร์ตสาธารณะโดยไม่มีการยืนยันตัวตน คือการเปิดเผยฐานข้อมูลของคุณสู่สาธารณะ การรัน MCP server บน VPS ครอบคลุมเรื่อง proxy, certificate และ firewall อย่างถูกต้อง

จากนั้นให้คำนวณงานที่ต้องทำซ้ำอย่างตรงไปตรงมา บริการนี้ต้องได้รับการอัปเดตความปลอดภัยตามกำหนดการของมันเอง ซึ่งไม่เกี่ยวข้องกับ agent ที่สื่อสารกับมัน OAuth token ของมันจะหมดอายุ และ claude mcp list จะเริ่มแสดงผล ! Needs authentication ในช่วงเวลาที่ไม่เหมาะสม ข้อมูลประจำตัวของมันจะอยู่ในไฟล์ config หรือ Authorization header ดังนั้นจึงต้องได้รับการดูแลเช่นเดียวกับ secret อื่นๆ ซึ่งเป็นหัวข้อใหญ่ในตัวเอง: การเก็บรักษา secret ให้พ้นจากมือของ AI agent งานทั้งหมดนี้ไม่มีอยู่สำหรับ skill

จงชั่งน้ำหนักกับทางเลือกอื่นก่อนที่คุณจะลงมือสร้าง หากข้อมูลที่อยู่เบื้องหลังเซิร์ฟเวอร์ที่วางแผนไว้มีการเปลี่ยนแปลงประมาณไตรมาสละครั้ง การใช้ skill ที่บอก agent ว่าต้องดูที่ไหนและฟิลด์ต่างๆ หมายถึงอะไรนั้น มีต้นทุนที่ถูกกว่าการรันบริการที่คุณต้องคอยดูแลให้ทำงานอยู่ตลอดเวลา

วิธีวัดต้นทุนบริบทของคุณเอง

เลิกคาดเดาแล้วรัน /context ภายในเซสชัน คำสั่งนี้จะแสดงรายละเอียดการเริ่มต้นระบบ: system prompt, ไฟล์หน่วยความจำ, เครื่องมือ และ MCP servers พร้อมน้ำหนักโทเค็นของแต่ละรายการ

ให้ตรวจสอบสองสิ่ง ภายใต้หัวข้อ Memory files ให้ยืนยันว่าไฟล์กฎทั้งหมดที่คุณคาดหวังนั้นปรากฏอยู่ในรายการ หากไฟล์หายไป เอเจนต์จะไม่สามารถมองเห็นไฟล์นั้นได้ ดังนั้นนี่คือสิ่งแรกที่ต้องตรวจสอบเมื่อคำสั่งถูกเพิกเฉย จากนั้นให้ดูว่าเซิร์ฟเวอร์ของคุณมีต้นทุนเท่าใด หากเซิร์ฟเวอร์ที่คุณใช้งานเพียงเดือนละสองครั้งเป็นหนึ่งในรายการที่มีขนาดใหญ่ที่สุด ให้ปิดการใช้งานใน /mcp แล้วค่อยเปิดกลับมาใหม่สำหรับเซสชันที่จำเป็นต้องใช้ การตั้งค่าจะยังคงถูกเก็บไว้ไม่ว่าจะเลือกทางใด

เซิร์ฟเวอร์ระยะไกลอาจรายงานสถานะเช่น cached 2h ago · connects on first use · 5 tools ซึ่งหมายความว่า Claude Code อ่านรายการเครื่องมือจากเซสชันก่อนหน้าแทนที่จะเชื่อมต่อในขณะเริ่มต้นระบบ และมันจะเชื่อมต่อในครั้งแรกที่มีการเรียกใช้เครื่องมือ เครื่องมือเหล่านี้พร้อมใช้งานตั้งแต่ข้อความแรกของคุณ ดังนั้นจึงไม่มีสิ่งใดที่ต้องแก้ไข ให้ตั้งค่า MCP_DISCOVERY_CACHE=0 หากคุณต้องการให้ทุกเซิร์ฟเวอร์เชื่อมต่อในขณะเริ่มต้นระบบ สำหรับภาพรวมที่กว้างขึ้น การจัดการหน้าต่างบริบทของ Claude Code จะครอบคลุมถึงสิ่งที่ยังคงอยู่หลังจากการบีบอัด และ โทเค็นเหล่านั้นมีต้นทุนเท่าใด จะเปลี่ยนตัวเลขเหล่านั้นให้เป็นมูลค่าเงินจริง

ทำไมสกิลของฉันถึงไม่ทำงาน?

สาเหตุที่พบบ่อยที่สุดคือ description เนื่องจากเป็นข้อความเดียวในบริบทก่อนที่สกิลจะเริ่มทำงาน ดังนั้นหากข้อความดังกล่าวไม่ได้ระบุถึงสถานการณ์นั้นไว้ ก็จะไม่มีสิ่งใดที่ตรงกับเงื่อนไข ให้เขียนตัวกระตุ้น (trigger) ลงในประโยค เช่น "Use when the user asks what changed, wants a commit message, or asks to review their diff." คำอธิบายที่คลุมเครือจะล้มเหลวโดยไม่มีการแจ้งเตือน ซึ่งทำให้สังเกตเห็นปัญหาได้ยาก

สาเหตุที่สองคือการพิมพ์ผิดในส่วนของ frontmatter ซึ่งกรณีนี้จะมีการแจ้งเตือนที่ชัดเจน คีย์ที่ไม่รู้จักจะถูกปฏิเสธทันที:

Unexpected key(s) in SKILL.md frontmatter: argument-hint. Allowed properties are: allowed-tools, compatibility, description, license, metadata, name

สาเหตุที่สามคือตำแหน่งที่ตั้ง สกิลของโปรเจกต์จะถูกโหลดจาก .claude/skills/ ในไดเรกทอรีทำงานของคุณและในทุกไดเรกทอรีแม่จนถึงระดับ root ของ repository สกิลที่อยู่ในไดเรกทอรีย่อย ใต้ จุดที่คุณเริ่มต้นจะไม่ถูกโหลดเมื่อเปิดใช้งาน สกิลเหล่านั้นจะปรากฏขึ้นในครั้งแรกที่เอเจนต์อ่านหรือแก้ไขไฟล์ภายในไดเรกทอรีย่อยนั้น ดังนั้นจนกว่าจะถึงตอนนั้น สกิลจะไม่แสดงผลการเติมคำอัตโนมัติและไม่สามารถเรียกใช้งานด้วยชื่อได้

สิ่งที่เทียบเท่ากับความล้มเหลวโดยไม่มีการแจ้งเตือนนี้ในส่วนของ MCP คือรายการ .mcp.json ที่มี url แต่ไม่มี type โดย Claude Code จะอ่านรายการใดก็ตามที่ไม่มี type ว่าเป็น stdio server ดังนั้นมันจึงข้ามรายการนั้นไปและรายงานว่า:

MCP server "notes" has a "url" but no "type"; add "type": "http" (or "sse" / "ws") to this entry

การใช้งานทั้งสามส่วนร่วมกัน

กลไกเหล่านี้ไม่ได้แย่งพื้นที่การทำงานกัน การตั้งค่าที่ใช้งานได้จริงจะเลือกใช้แต่ละส่วนในจุดที่ประหยัดทรัพยากรที่สุด ไฟล์ rules จะเก็บคำสั่งเพียงไม่กี่บรรทัดที่เป็นจริงในทุกสถานการณ์ ส่วน Skills จะเก็บขั้นตอนการทำงานและจะถูกโหลดขึ้นมาก็ต่อเมื่อจำเป็นต้องใช้งานเท่านั้น สำหรับ MCP server นั้น ให้ใช้เพียงหนึ่งตัว หรืออย่างมากสองตัว เพื่อเชื่อมต่อกับระบบที่คุณไม่สามารถคาดเดาเนื้อหาล่วงหน้าได้ หากคุณยังคงสร้างแบบจำลองทางความคิดเกี่ยวกับส่วนแรกนี้ ทักษะของเอเจนต์คืออะไร จะอธิบายรูปแบบการทำงานไว้อย่างละเอียด

การทดสอบเพียงหนึ่งวิธีสามารถยุติข้อถกเถียงส่วนใหญ่เกี่ยวกับตำแหน่งที่เหมาะสมของแต่ละส่วนได้ ให้ลบส่วนนั้นออก เริ่มเซสชันใหม่ แล้วมอบหมายงานให้เอเจนต์ หากเอเจนต์ทำงานช้าลงเพียงเล็กน้อย แสดงว่าส่วนนั้นควรอยู่ใน Skill หากเอเจนต์ให้ข้อมูลที่ผิดอย่างมั่นใจ แสดงว่าส่วนนั้นควรอยู่ในไฟล์ rules แต่หากเอเจนต์ไม่สามารถเข้าถึงข้อมูลได้เลย แสดงว่าคุณจำเป็นต้องมี server และตอนนี้คุณก็ต้องมีแผนสำหรับการดูแลให้ server นั้นทำงานได้อย่างต่อเนื่องด้วย

FAQ

ฉันควรเขียน skill หรือสร้าง MCP server ขึ้นมาใช้งาน?

ให้ตัดสินใจโดยพิจารณาว่าข้อมูลมีการเปลี่ยนแปลงระหว่างการเรียกใช้งานแต่ละครั้งหรือไม่ หากเอเจนต์จำเป็นต้องอ่านสถานะแบบเรียลไทม์ที่มีผู้อื่นแก้ไขได้ เช่น ระบบติดตามปัญหา (issue tracker), ฐานข้อมูล หรือแดชบอร์ด คุณจำเป็นต้องใช้ MCP server เพราะข้อมูลใดก็ตามที่คุณเขียนบันทึกไว้จะกลายเป็นข้อมูลเก่าทันทีที่มีการเปลี่ยนแปลงในระบบ หากคุณสามารถเขียนคำตอบลงไปครั้งเดียวแล้วข้อมูลนั้นยังคงถูกต้องแม้เวลาผ่านไป 6 สัปดาห์ ให้เลือกเขียนเป็น skill แทน skill เป็นเพียงไฟล์ใน git ที่ไม่มีกระบวนการทำงานเบื้องหลัง ไม่ต้องเปิดพอร์ต และไม่ต้องมีตารางการแพตช์ จึงเป็นทางเลือกที่ประหยัดทรัพยากรกว่าในทุกกรณีที่สามารถทำได้

MCP server ยังคงทำให้ context window ของฉันเต็มอยู่หรือไม่?

น้อยลงกว่าแต่ก่อนมาก ปัจจุบัน Claude Code เปิดใช้งานการค้นหาเครื่องมือ (tool search) เป็นค่าเริ่มต้น ดังนั้นเมื่อเริ่มเซสชันจะมีเพียงชื่อเครื่องมือและช่องคำสั่งของเซิร์ฟเวอร์เท่านั้นที่ถูกโหลดเข้ามา ส่วน schema ฉบับเต็มจะถูกดึงมาก็ต่อเมื่อ Claude ค้นหาเครื่องมือนั้นๆ การโหลดข้อมูลทั้งหมดล่วงหน้าจะยังคงเกิดขึ้นหากปิดการใช้งาน tool search ได้แก่ เมื่อใช้ ENABLE_TOOL_SEARCH=false, เมื่อใช้ ANTHROPIC_BASE_URL ชี้ไปยังพร็อกซีที่ไม่ใช่ของทางการ หรือเมื่อใช้โมเดลที่เก่ากว่ารุ่น Claude 4.5 ให้รัน /context เพื่อตรวจสอบว่าคุณอยู่ในสถานการณ์ใด เนื่องจากตัวเลขในบทความเปรียบเทียบรุ่นเก่าๆ นั้นตั้งอยู่บนสมมติฐานของการโหลดข้อมูลล่วงหน้าทั้งหมด

Claude Code อ่านไฟล์ AGENTS.md หรือไม่?

ไม่ Claude Code จะอ่านไฟล์ CLAUDE.md หาก repository ของคุณมีไฟล์ AGENTS.md สำหรับเอเจนต์ตัวอื่นอยู่แล้ว ให้ใช้การอ้างอิงไปยังไฟล์นั้นแทนการเก็บไฟล์ซ้ำซ้อนกันสองชุด ให้รัน ln -s AGENTS.md CLAUDE.md เพื่อสร้าง symlink แบบปกติ หรือใส่ @AGENTS.md ไว้ที่บรรทัดแรกของไฟล์ CLAUDE.md แล้วเพิ่มคำสั่งเฉพาะสำหรับ Claude ไว้ด้านล่าง จากนั้นเริ่มเซสชันและรัน /context เพื่อยืนยันว่า CLAUDE.md ปรากฏขึ้นภายใต้ Memory files

ทำไม skill ของฉันถึงไม่มีผลอีกต่อไปหลังจากใช้งานไปได้ครึ่งทางของเซสชัน?

สาเหตุส่วนใหญ่มักเกิดจากระบบ auto-compaction เมื่อบทสนทนาถูกสรุป Claude Code จะแนบการเรียกใช้งานล่าสุดของแต่ละ skill กลับเข้ามา โดยจะเก็บเนื้อหา 5,000 token แรกของแต่ละ skill ไว้ ภายใต้งบประมาณรวม 25,000 token สำหรับทุก skill รวมกัน ระบบจะเติมงบประมาณนี้โดยเริ่มจาก skill ที่ถูกเรียกใช้งานล่าสุด ดังนั้นหากคุณเรียกใช้งาน skill ขนาดใหญ่หลายตัว skill ที่เก่ากว่าจะถูกตัดออกไปทั้งหมด ให้เรียกใช้งาน skill นั้นอีกครั้งเพื่อกู้คืนเนื้อหาฉบับเต็ม

ฉันจะหยุดไม่ให้ไฟล์กฎ (rules file) ขนาดใหญ่โหลดเข้ามาในทุกเซสชันได้อย่างไร?

ให้ย้ายส่วนที่จำเป็นต้องใช้เฉพาะบางโอกาสไปไว้ในไฟล์ .claude/rules/ โดยกำหนดฟิลด์ paths ไว้ในส่วน frontmatter เพื่อให้แต่ละไฟล์โหลดเฉพาะเมื่อเอเจนต์เข้าถึงไฟล์ที่ตรงกับเงื่อนไขเท่านั้น การแยกไฟล์ด้วยการใช้ @path import ไม่ช่วยแก้ปัญหานี้ เนื่องจากไฟล์ที่ถูก import จะถูกขยายและโหลดเข้ามาพร้อมกับไฟล์ที่อ้างอิงถึงตั้งแต่ตอนเริ่มต้น สิ่งใดที่เป็นขั้นตอนการทำงานหลายขั้นตอนมากกว่าจะเป็นข้อเท็จจริงถาวร ควรเปลี่ยนให้เป็น skill แทน เนื่องจากเนื้อหาของ skill จะไม่เสียค่าใช้จ่ายใดๆ จนกว่าจะถูกเรียกใช้งาน