โหมดมืด
บทที่ 04 — Claude Code: เครื่องมือสำหรับนักพัฒนา
ส่วนหนึ่งของ Claude Book · บทนี้ระดับ ระดับกลาง → ระดับสูง (Skills/Hooks/MCP)
ต้องรู้อะไรก่อน: ใช้ terminal เป็นเบื้องต้น, รู้จัก git, เคยทำงานในโปรเจกต์โค้ดจริง
ทำไมต้องมี Claude Code ในเมื่อมี claude.ai อยู่แล้ว
บน claude.ai คุณต้อง คัดลอกโค้ดไปวาง แล้วเอาคำตอบ คัดลอกกลับมาวาง ในไฟล์เอง — ทำซ้ำ ๆ จนเมื่อย และมันไม่เห็นโปรเจกต์ทั้งก้อนของคุณ
Claude Code คือ Claude ในรูปแบบ command-line (CLI — ซี-แอล-ไอ) ทำงานในเทอร์มินัล (terminal — เทอร์-มิ-นั่ล)
- CLI = โปรแกรมที่สั่งงานด้วยการพิมพ์คำสั่งเป็นบรรทัด ๆ ไม่มีหน้าจอปุ่มกด
- terminal = หน้าต่างดำ ๆ ที่ใช้พิมพ์คำสั่ง (บน Windows คือ PowerShell หรือ Windows Terminal; บน macOS/Linux คือ Terminal)
จุดต่างจาก claude.ai คือ Claude Code ลงมือทำกับไฟล์ในเครื่องคุณได้โดยตรง — อ่าน/แก้ไฟล์ในโปรเจกต์ รันคำสั่ง รันเทสต์ แล้วแก้ต่อจนเสร็จ
🔍 มองให้ถูก: โดยเนื้อแท้แล้ว Claude Code คือ AI agent ตัวหนึ่ง (เดี๋ยวเจาะลึกในบทที่ 06) — มันวนลูป "อ่านบริบท → ลงมือ → ตรวจผล" ให้คุณเอง คุณแค่บอกเป้าหมายเป็นภาษาคน
4.1 การติดตั้งและเริ่มใช้
ก่อนติดตั้ง: ต้องมี Node.js (โหนด-เจ-เอส) บนเครื่องก่อน — เป็นโปรแกรมที่ทำให้ใช้คำสั่ง npm ได้
- npm (เอ็น-พี-เอ็ม) = โปรแกรมจัดการแพ็กเกจ (package manager) ใช้ดาวน์โหลด/ติดตั้งไลบรารีหรือเครื่องมือจากอินเทอร์เน็ตด้วยคำสั่งเดียว เช่น
npm install ชื่อแพ็กเกจ— มากับ Node.js อัตโนมัติ ไม่ต้องติดตั้งแยก
- ดาวน์โหลดและติดตั้งจาก nodejs.org (เลือกเวอร์ชัน LTS — รุ่นเสถียร)
- เปิด terminal ใหม่ แล้วเช็คว่าติดตั้งสำเร็จ:
bash
node --version
npm --versionถ้าเห็นเลขเวอร์ชัน (เช่น v20.x.x) แปลว่าใช้งานได้แล้ว จากนั้นติดตั้ง Claude Code:
bash
npm install -g @anthropic-ai/claude-code(-g = ติดตั้งแบบ global ใช้ได้ทุกโปรเจกต์)
จากนั้นเข้าไปในโฟลเดอร์โปรเจกต์ของคุณ (เปลี่ยน my-project เป็นชื่อโฟลเดอร์โปรเจกต์จริงของคุณ — ถ้ายังไม่มีโปรเจกต์ ลองสร้างโฟลเดอร์เปล่า ๆ ก่อนก็ได้ด้วย mkdir my-project) แล้วสั่ง:
bash
cd my-project
claudeครั้งแรกจะให้ล็อกอิน — ใช้ได้ทั้งบัญชี Claude แบบ Pro/Max (รายเดือน) หรือ API key (จ่ายตาม token) นอกจาก CLI แล้ว Claude Code ยังใช้ได้ผ่าน:
- ส่วนขยาย IDE — VS Code, JetBrains (IntelliJ, PyCharm ฯลฯ)
- GitHub Actions — รัน Claude Code ใน CI/CD pipeline ของ repository (ดูที่ github.com/anthropics/claude-code-action)
text
⚠️ Pitfall: รัน `claude` นอกโฟลเดอร์โปรเจกต์ (เช่นที่ home directory)
มันจะไม่เห็นโค้ดของคุณ — ต้อง cd เข้าไปในโฟลเดอร์โปรเจกต์ก่อนเสมอ
เพราะ Claude Code ทำงานกับ "โฟลเดอร์ปัจจุบัน" เป็นขอบเขต4.2 การใช้งานพื้นฐาน
พิมพ์สิ่งที่ต้องการเป็นภาษาธรรมชาติ — ภาษาไทยก็ได้:
text
> เพิ่มฟังก์ชันตรวจสอบอีเมลในไฟล์ utils.js พร้อมเขียนเทสต์
> หา bug ที่ทำให้หน้า login ค้าง
> รันเทสต์ทั้งหมดแล้วแก้ตัวที่ fail
> อธิบายว่าโฟลเดอร์ src/ ทำงานยังไงClaude Code จะอ่านไฟล์ที่เกี่ยวข้องเอง วางแผน แก้โค้ด และรันคำสั่ง โดย ขออนุญาตก่อน ทำสิ่งที่กระทบไฟล์หรือระบบ (เรื่องสิทธิ์อยู่ใน 4.8)
4.3 Slash Commands และ CLAUDE.md
Slash Commands
คำสั่งที่ขึ้นต้นด้วย / เรียกใช้ความสามารถเฉพาะทาง คำสั่งเหล่านี้แบ่งเป็น 2 กลุ่ม:
Built-in (มาพร้อม Claude Code ตั้งแต่ติดตั้ง):
/help— ดูคำสั่งทั้งหมด/clear— ล้างบทสนทนาในเซสชันปัจจุบัน/compact— ย่อบริบทเก่าให้สั้นลงเพื่อประหยัด context/model— เปลี่ยนรุ่นโมเดล (เช่น Sonnet/Opus/Fable — ตรวจรายชื่อรุ่นปัจจุบันในเมนูของคุณเอง เพราะรุ่นออกใหม่เรื่อย ๆ)/permissions— จัดการสิทธิ์เครื่องมือ/agents— จัดการ subagent (ดู 4.7)/init— สร้างไฟล์CLAUDE.md(บริบทโปรเจกต์) ให้อัตโนมัติ/review— รีวิว PR (Pull Request — พูล-รีเควสต์ = คำขอรวมโค้ดเข้าโปรเจกต์หลัก)/mcp— จัดการ MCP server (ดู 4.6)
Custom (คุณเขียนเอง): วางไฟล์ Markdown ใน .claude/commands/ — ชื่อไฟล์คือชื่อคำสั่ง เนื้อหาคือสิ่งที่อยากให้ทำ ใช้ $ARGUMENTS รับอาร์กิวเมนต์ได้:
markdown
สรุป git log ตั้งแต่ tag ล่าสุดถึงปัจจุบัน
เขียนเป็น changelog รูปแบบ Keep a Changelog
หัวข้อที่ผู้ใช้ระบุเพิ่ม: $ARGUMENTS(บันทึกเป็น .claude/commands/changelog.md) เรียกใช้ด้วย /changelog v2.1
📎 หมายเหตุ: ในตัวอย่างหนังสือเล่มอื่น ๆ คุณอาจเห็นบรรทัด
<!-- .claude/commands/xxx.md -->ในตัวอย่าง — นั่นคือ HTML comment ที่ผู้เขียนใส่เพื่อบอก path ของไฟล์ เท่านั้น ไม่ใช่ส่วนของเนื้อหา slash command จริง คุณไม่ต้องใส่ในไฟล์ของคุณก็ได้
CLAUDE.md — บริบทประจำโปรเจกต์
ไฟล์บันทึกบริบทของโปรเจกต์ที่ Claude Code อ่านทุกครั้งที่เริ่มทำงาน — ใส่ข้อมูลอย่างวิธีรันเทสต์ โครงสร้างโปรเจกต์ คำสั่ง build หรือกฎการเขียนโค้ดของทีม สั่ง /init ให้สร้างให้อัตโนมัติได้
มีได้หลายระดับ:
- ระดับผู้ใช้ (
~/.claude/CLAUDE.md) — ใช้ทุกโปรเจกต์ - ระดับโปรเจกต์ (
./CLAUDE.md) — แชร์ผ่าน git - ระดับโฟลเดอร์ย่อย — บริบทเฉพาะส่วน
ตัวอย่างไฟล์ CLAUDE.md ของโปรเจกต์เว็บจริง:
markdown
# โปรเจกต์: ระบบจัดการคลังสินค้า
## เทคโนโลยีที่ใช้
- Frontend: React + TypeScript + Vite
- Backend: Node.js (Express) · ฐานข้อมูล PostgreSQL
## คำสั่งที่ใช้บ่อย
- `npm run dev` — รันเซิร์ฟเวอร์ระหว่างพัฒนา
- `npm test` — รันเทสต์ทั้งหมด (ต้องผ่านก่อน commit เสมอ)
- `npm run lint` — ตรวจสไตล์โค้ด
## กฎการเขียนโค้ดของทีม
- ใช้ async/await เท่านั้น ห้ามใช้ .then()
- ตั้งชื่อตัวแปรเป็นภาษาอังกฤษ ใช้ camelCase
- ทุกฟังก์ชันที่ export ต้องมี unit test คู่กัน
## สิ่งที่ห้ามแตะ
- โฟลเดอร์ `src/legacy/` — โค้ดเก่ากำลังจะถูกถอด อย่าแก้💡 เคล็ดลับ: เขียน CLAUDE.md เหมือนสอนพนักงานใหม่ — สั้น ตรง และเฉพาะสิ่งที่ Claude เดาเองไม่ได้ บริบทที่ดีลดความผิดพลาดได้มหาศาล ส่วนสิ่งที่เห็นได้จากโค้ดอยู่แล้วไม่ต้องเขียนซ้ำ
4.4 Skills — แพ็กเกจความเชี่ยวชาญเฉพาะทาง
Agent Skill คือโฟลเดอร์ที่บรรจุความสามารถเฉพาะทางไว้เป็นแพ็กเกจ ทำให้ Claude ทำงานเฉพาะด้านได้ตาม "วิธีที่ถูกต้อง" ที่ผู้เชี่ยวชาญกำหนดไว้ แทนที่จะให้ Claude คิดวิธีเองใหม่ทุกครั้ง
🔍 เปรียบเทียบ: Skill เหมือน "คู่มือขั้นตอนการทำงาน (SOP)" ที่บริษัทเขียนไว้ — พนักงานเก่งแค่ไหน ถ้ามี SOP ที่ดีก็ทำงานได้มาตรฐานเดียวกันทุกครั้ง ไม่ต้องคิดใหม่
โครงสร้างของสกิล
สกิลหนึ่งตัวคือหนึ่งโฟลเดอร์ ประกอบด้วย:
SKILL.md(บังคับ) — ไฟล์หลัก มี frontmatter (ฟร้อนต์-แมท-เทอร์ = ส่วนหัวไฟล์) บอกname(ชื่อ) กับdescription(คำอธิบาย) ตามด้วยขั้นตอนการทำงาน- ไฟล์ประกอบ (ไม่บังคับ) — สคริปต์, เทมเพลต, เอกสารอ้างอิง ที่สกิลเรียกใช้
📎 frontmatter เขียนด้วย YAML (ยา-เม่ิล) — ภาษาเก็บค่าตั้งค่าแบบอ่านง่าย ใช้
key: valueเช่น:yaml--- name: pdf-report description: สร้างรายงาน PDF ---เครื่องหมาย
---คือ "เปิด/ปิด frontmatter" ส่วนที่อยู่ระหว่าง 2 บรรทัดนี้คือค่าตั้งค่า
text
.claude/skills/
└── pdf-report/
├── SKILL.md # frontmatter + ขั้นตอนการทำงาน
├── template.html # เทมเพลตที่สกิลใช้
└── generate.py # สคริปต์ช่วยแปลงเป็น PDFตัวอย่าง SKILL.md:
markdown
---
name: pdf-report
description: สร้างรายงาน PDF จากข้อมูลสรุปรายเดือน — ใช้เมื่อผู้ใช้ขอรายงานหรือ export เป็น PDF
---
# วิธีสร้างรายงาน
1. รวบรวมข้อมูลยอดขายจากไฟล์ที่ผู้ใช้ระบุ
2. ใช้ template.html เป็นโครงหน้า
3. รัน `python generate.py` เพื่อแปลงเป็น PDF
4. ตรวจว่าไฟล์ผลลัพธ์ถูกสร้างจริงก่อนรายงานผู้ใช้Progressive disclosure (โปร-เกรส-สีฟ ดิส-โคล้-เชอร์ = การเปิดเผยข้อมูลทีละขั้น) — กลไกที่ทำให้สกิลไม่เปลือง context
สกิลฉลาดตรงที่มันโหลดข้อมูล ทีละชั้น:
- ตอนเริ่ม Claude เห็นแค่
name+descriptionของทุกสกิล (กินที่น้อยมาก) - เมื่อ description ตรงกับงาน ที่ผู้ใช้ขอ Claude จึงโหลดเนื้อหา
SKILL.mdเต็ม - ไฟล์ประกอบ จะถูกอ่านเฉพาะตอนจำเป็นจริง ๆ เท่านั้น
ผลคือมีสกิลติดตั้งไว้ได้เป็นร้อยตัวโดยไม่ทำให้ context รก
💡
descriptionคือหัวใจ — เป็นสิ่งเดียวที่ Claude ใช้ตัดสินใจว่าจะหยิบสกิลมาใช้ไหม เขียนให้ชัดทั้ง "ทำอะไร" และ "ใช้เมื่อไร"
ตำแหน่งและที่มาของสกิล
| ที่มา | ตำแหน่ง | ขอบเขต |
|---|---|---|
| ระดับผู้ใช้ | ~/.claude/skills/ | ใช้ได้ทุกโปรเจกต์ |
| ระดับโปรเจกต์ | .claude/skills/ | เฉพาะโปรเจกต์ แชร์ผ่าน git ได้ |
| Plugin | ติดตั้งมาเป็นชุด | ตามที่ plugin กำหนด |
| Built-in | มากับ Claude Code | เช่น สกิลสร้าง docx, pdf, pptx |
การเรียกใช้
- อัตโนมัติ — Claude เลือกใช้สกิลเองเมื่อ
descriptionตรงกับงานที่ผู้ใช้ขอ - เรียกตรง — ผู้ใช้พิมพ์
/<ชื่อสกิล>เพื่อสั่งใช้สกิลนั้นทันที
Skills เป็นมาตรฐานเดียวกันทั้งบน Claude Code, claude.ai และผ่าน API — เขียนครั้งเดียวใช้ได้หลายที่
4.5 Hooks — ทำงานอัตโนมัติเมื่อเกิดเหตุการณ์
Hook คือคำสั่ง shell ที่ระบบรันให้อัตโนมัติเมื่อเกิดเหตุการณ์ที่กำหนด
จุดสำคัญที่ทำให้ hook ต่างจากการบอก Claude ผ่าน prompt: "ระบบ" เป็นคนรัน ไม่ใช่ Claude ตัดสินใจ จึงเชื่อถือได้ 100% ว่าจะทำงานทุกครั้ง — ต่างจากการสั่งใน prompt ที่ Claude อาจลืมหรือข้าม
🔍 เปรียบเทียบ: prompt = "ช่วยปิดไฟก่อนออกนะ" (อาจลืม) · hook = "เซนเซอร์ที่ปิดไฟเองเมื่อไม่มีคนในห้อง" (ทำงานแน่นอนทุกครั้ง)
เหตุการณ์ (event) ที่ hook เกาะได้:
| Event | ทำงานเมื่อ | ตัวอย่างการใช้ |
|---|---|---|
PreToolUse | ก่อน Claude ใช้เครื่องมือ | บล็อกคำสั่งอันตราย ตรวจสิทธิ์ |
PostToolUse | หลังใช้เครื่องมือเสร็จ | รัน formatter/linter หลังแก้ไฟล์ |
UserPromptSubmit | เมื่อผู้ใช้ส่งข้อความ | เพิ่มบริบท ตรวจคำต้องห้าม |
Notification | เมื่อ Claude แจ้งเตือน (เช่นรอ permission) | ส่ง desktop notification |
Stop | เมื่อ Claude ตอบจบ | แจ้งเตือนว่างานเสร็จ |
SubagentStop | เมื่อ subagent ตอบจบ | log ผลของ subagent แต่ละตัว |
SessionStart | เมื่อเริ่ม session | โหลดสถานะ ตั้งค่าเริ่มต้น |
SessionEnd | เมื่อจบ session | สำรองสถานะ, ส่งสรุปการใช้งาน |
PreCompact | ก่อนบีบอัด context | สำรองข้อมูลสำคัญ |
JSON I/O contract — hook คุยกับ Claude ผ่าน stdin/stdout
📎 ต้องรู้ก่อน (สำหรับมือใหม่):
- stdin (สแตน-ดิน) = "ทางเข้า" ของโปรแกรม Claude Code ส่งข้อมูลให้ hook ผ่านช่องนี้
- stdout (สแตน-ดเอาท์) = "ทางออก" ของโปรแกรม hook เขียนคำตอบกลับให้ Claude ผ่านช่องนี้
- exit code = "เลขสถานะ" ที่โปรแกรมตอนจบ บอกว่าทำงานสำเร็จหรือไม่ (
0= สำเร็จ, อื่น ๆ = ไม่สำเร็จ)hook ก็คือโปรแกรมตัวเล็ก ๆ (shell script, Node, Python อะไรก็ได้) ที่ระบบเรียกพร้อมส่ง JSON เข้า stdin แล้วรอ JSON ออกจาก stdout
Walkthrough: hook ทำงานอย่างไรทีละขั้น
- ผู้ใช้สั่ง Claude แก้ไฟล์
app.js - ก่อน/หลังใช้เครื่องมือ ระบบรันโปรแกรม hook ของคุณ
- ระบบส่ง JSON แบบนี้เข้า stdin:json
{ "session_id": "abc123", "hook_event_name": "PostToolUse", "tool_name": "Edit", "tool_input": { "file_path": "/work/app.js" } } - โปรแกรม hook อ่าน JSON นี้ ตัดสินใจว่าจะทำอะไร แล้วเขียน JSON ตอบกลับทาง stdout (ตัวอย่างด้านล่าง)
- ระบบอ่าน stdout + exit code เพื่อรู้ว่า hook อนุญาต/ปฏิเสธ/ขอ approval
ตัวอย่าง JSON ที่ hook เขียนกลับ — บล็อกการใช้เครื่องมือ:
json
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "คำสั่งนี้รันใน production ห้ามให้ Claude ใช้ตรง ๆ ต้องมี approval"
}
}permissionDecision รับค่า "allow" (อนุญาต), "deny" (ปฏิเสธ), หรือ "ask" (ถามผู้ใช้ก่อน)
ตัวอย่าง: เพิ่มบริบทให้ Claude เห็น (ไม่บล็อก แค่ส่งข้อความเข้า session):
json
{
"systemMessage": "เพิ่มบริบทให้ Claude เห็น: deploy freeze เริ่ม 5 มิ.ย."
}exit code (ทางเลือกที่สอง): ถ้าไม่อยากเขียน JSON ใช้ exit code แทนได้ — 0 = ผ่าน, 2 = block พร้อมส่งข้อความใน stderr กลับให้ Claude เห็น, อื่น ๆ = ถือว่า hook พัง (Claude เห็น error)
📎 ไม่ต้องจำตอนนี้: JSON output ทาง stdout คือวิธีหลัก (canonical) ที่ docs แนะนำ — exit code
2เป็นทางสำรองสำหรับ shell script สั้น ๆ ที่ไม่อยากต้องสร้าง JSON เอง การใช้2แทน1เป็น ข้อตกลง (convention) เฉพาะของ Claude Code เอง ไม่ใช่มาตรฐาน Unix⚠️ schema เปลี่ยนตามเวอร์ชัน — ตรวจที่ docs.anthropic.com/en/docs/claude-code/hooks ก่อนใช้จริง
ตั้งค่าที่ไหน: เปิดไฟล์ .claude/settings.json ในรากโปรเจกต์ (ถ้ายังไม่มีให้สร้างเอง) — ตัวอย่างนี้รัน Prettier ทุกครั้งหลัง Claude แก้ไฟล์:
json
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [{
"type": "command",
"command": "jq -r '.tool_input.file_path' | xargs -r npx prettier --write"
}]
}
]
}
}อ่านโค้ดข้างบนทีละจุด:
matcher= บอกว่า hook นี้จะเกาะกับเครื่องมือไหน — ในที่นี้คือEdit(แก้ไฟล์) กับWrite(เขียนไฟล์ใหม่)|ในค่า"Edit|Write"= อ่านว่า "หรือ" คือเกาะกับ Edit หรือ Write ก็ได้command= คำสั่ง shell ที่จะรัน คำสั่งนี้:jq -r '.tool_input.file_path'= อ่าน JSON จาก stdin (ที่ระบบส่งให้) แล้วดึงเฉพาะค่าtool_input.file_path(path ของไฟล์ที่ Claude เพิ่งแก้)| xargs -r= ส่งค่านั้นเป็น argument ให้คำสั่งถัดไป (ถ้าค่าว่างไม่ต้องรัน)npx prettier --write= เรียก Prettier มาจัด format ไฟล์นั้น (npx= รัน package จาก npm โดยไม่ต้องติดตั้งถาวร)
รวมความ: "ทุกครั้งหลัง Claude แก้หรือเขียนไฟล์ ระบบส่ง JSON ให้ hook → hook ดึงชื่อไฟล์ออกมาแล้วเรียก prettier จัด format ไฟล์นั้นทันที"
⚠️ Windows/PowerShell: คำสั่งข้างบนใช้
jqและxargsซึ่งเป็นโปรแกรมสาย POSIX (มากับ macOS/Linux/WSL/Git Bash) — ไม่ได้มากับ PowerShell โดยตรง ถ้าใช้ PowerShell ล้วนต้องติดตั้งjqเพิ่มเอง หรือเขียน hook เป็นสคริปต์ Node.js/PowerShell ที่อ่าน JSON จาก stdin แทนตัวอย่างนี้ยังสมมติว่า
tool_inputมีคีย์file_pathตรง ๆ (ใช้ได้กับ Edit/Write) — เครื่องมืออื่นที่แก้หลายไฟล์พร้อมกัน (เช่น NotebookEdit) มีโครงtool_inputต่างออกไป ต้องปรับ jq query เอง
⚠️ อย่าใช้
$CLAUDE_FILE_PATHS— เป็น env var ที่หนังสือ/บทความเก่าหลายเล่มเขียนถึง แต่ไม่ใช่ contract ปัจจุบัน ของจริง hook ต้องอ่านtool_inputจาก JSON ทาง stdin (เช่นด้วยjqหรือprocess.stdinใน Node)
4.6 MCP — เชื่อมต่อเครื่องมือและข้อมูลภายนอก
MCP (เอ็ม-ซี-พี / Model Context Protocol — โม-เดล คอน-เท็กซ์ โปร-โท-คอล = โพรโทคอลแลกเปลี่ยนบริบทกับโมเดล) คือมาตรฐานเปิดสำหรับเชื่อม AI เข้ากับเครื่องมือและแหล่งข้อมูลภายนอก เปรียบเหมือน "พอร์ต USB-C ของ AI" — เสียบกับอะไรก็ได้ที่รองรับมาตรฐานเดียวกัน โดยไม่ต้องเขียน integration ใหม่ทุกครั้ง
MCP server เปิดให้ Claude เข้าถึง 3 อย่าง:
- Tools — ฟังก์ชันที่ Claude เรียกใช้ได้ (เช่น query ฐานข้อมูล, สร้าง issue)
- Resources — ข้อมูลที่ Claude อ่านได้ (เช่น ไฟล์, เอกสาร, เรคคอร์ด)
- Prompts — เทมเพลต prompt สำเร็จรูปที่ server เตรียมไว้
ตัวอย่าง MCP server ที่นิยม: GitHub, Slack, Google Drive, Postgres, Sentry, Playwright (ควบคุมเบราว์เซอร์)
ตั้งค่าได้ใน .mcp.json (แชร์ในทีมผ่าน git ได้) เชื่อมได้ 2 รูปแบบหลัก (transport = ช่องทางรับส่งข้อมูลระหว่าง Claude กับ server):
- local — รันเป็นโปรเซสในเครื่องคุณ ใช้ transport
stdio - remote — เซิร์ฟเวอร์อยู่ที่อื่น ใช้ transport
Streamable HTTP(มาตรฐานใหม่ตั้งแต่ มี.ค. 2025) หรือSSE(รูปแบบเดิม กำลังจะเลิกใช้)
คำย่อแต่ละตัว (ดูเฉพาะถ้าสนใจ):
- stdio (สแตน-ดิ-โอ) = standard input/output — ส่งข้อมูลผ่านทาง stdin/stdout ของโปรเซสที่รันในเครื่อง
- HTTP (เอช-ที-ที-พี) = โพรโทคอลของเว็บ ใช้คุยข้ามเครื่องผ่านอินเทอร์เน็ต
- SSE (เอส-เอส-อี / Server-Sent Events) = วิธีที่เซิร์ฟเวอร์ทยอยส่งข้อมูลกลับมาเรื่อย ๆ บน HTTP เดียวกัน
💡 ยังไม่ต้องจำศัพท์ทั้งหมดนี้ — จำแค่ local = รันในเครื่องเรา กับ remote = อยู่ที่เซิร์ฟเวอร์ข้างนอก ก็พอใช้งานได้แล้ว ส่วน transport ส่วนใหญ่เครื่องมือจัดการให้
ฟีเจอร์ Connectors บน claude.ai (บทที่ 02) ก็ทำงานบน MCP เช่นกัน — มาตรฐานเดียว ใช้ได้ทุกที่
ตัวอย่าง .mcp.json ที่เพิ่ม MCP server 2 ตัว — ตัวแรก local (stdio) ตัวที่สอง remote (Streamable HTTP):
json
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/folder"]
},
"internal-api": {
"type": "http",
"url": "https://mcp.mycompany.com/mcp"
}
}
}อธิบายทีละจุด:
command+args= รัน MCP server เป็นโปรเซสในเครื่อง — ใช้npx -yเพื่อให้ npm ดาวน์โหลดและรัน package โดยไม่ต้องติดตั้งถาวร (-y= ตอบ "yes" อัตโนมัติถ้าถามว่าจะดาวน์โหลดไหม)type: "http"= remote MCP server แบบ Streamable HTTP — endpoint โดยทั่วไปจะลงท้ายด้วย/mcp- ถ้าใช้ SSE (รูปแบบเดิม) ให้ใช้
"type": "sse"กับ URL ที่ลงท้าย/sseแทน — อย่ามิกซ์type: "http"กับ URL/sseเพราะเป็นคนละ transport
⚠️ ข้อมูล ณ มิถุนายน 2026 — ชื่อแพ็กเกจ MCP server และรูปแบบ config เปลี่ยนตามเวอร์ชัน เช่น GitHub MCP server เดิมที่ชื่อ
@modelcontextprotocol/server-githubถูกย้ายไปเป็น official server โดย GitHub เอง (เช่นghcr.io/github/github-mcp-serverแบบ Docker หรือ remote endpoint บนapi.githubcopilot.com/mcp) ตรวจที่ github.com/modelcontextprotocol/servers หรือ docs.anthropic.com ก่อนใช้จริง⚠️ ความปลอดภัย: อย่าใส่ token/secret (รหัสลับ) ตรง ๆ ใน
.mcp.jsonที่ commit ขึ้น git — ใช้รูปแบบอ้าง env var เช่น"env": { "GITHUB_TOKEN": "${env:GITHUB_TOKEN}" }แทน หรือใช้คำสั่งclaude mcp addที่เก็บ credentials (ข้อมูลยืนยันตัวตน) แยก (ดูบทที่ 07)📎 syntax
${env:VAR_NAME}เป็นรูปแบบของ Claude Code config (ไม่ใช่ shell มาตรฐาน) — ตอนรัน ระบบจะแทน${env:GITHUB_TOKEN}ด้วยค่าจาก environment variable ชื่อGITHUB_TOKENในเครื่องคุณ syntax อาจต่างกันตามเวอร์ชัน — ใช้claude mcp addผ่าน CLI ก็จัดการ env var ให้อัตโนมัติเช่นกัน
Scope ของ MCP server — เก็บไว้ที่ไหน ใช้กับงานไหน
| Scope | ตำแหน่ง (จัดการผ่าน claude mcp ดีกว่าแก้ไฟล์ตรง) | เห็นจาก |
|---|---|---|
| user | config ส่วนตัวของคุณใน home directory | ทุกโปรเจกต์ของคุณ — ใช้กับ MCP ส่วนตัว เช่น Linear/Notion ส่วนตัว |
| project | .mcp.json ในรากโปรเจกต์ (commit ขึ้น git ได้) | ทุกคนในทีมที่ clone โปรเจกต์ — ใช้กับ MCP ของทีม |
| local | .claude/settings.local.json (อยู่ใน .gitignore) | เฉพาะเครื่องคุณในโปรเจกต์นี้ — ใช้กับ credentials ส่วนตัวในโปรเจกต์ทีม |
ลำดับ precedence: local > project > user (เครื่องมือชื่อชนกัน อันที่แคบกว่าชนะ)
📎 ภาพง่าย ๆ ของ "ที่อยู่" 2 ระดับ:
- home directory = โฟลเดอร์ส่วนตัวของคุณบนเครื่อง (Windows:
C:\Users\<ชื่อ>· macOS/Linux:/Users/<ชื่อ>หรือ/home/<ชื่อ>) — config ที่นี่ใช้กับทุกโปรเจกต์- project root = โฟลเดอร์โปรเจกต์ที่คุณ
cdเข้าไป — config ที่นี่ใช้เฉพาะโปรเจกต์นี้ตำแหน่งไฟล์จริงของ user scope ต่างกันตามเวอร์ชัน/ระบบปฏิบัติการ — ใช้
claude mcpCLI จะปลอดภัยกว่า ไม่ต้องเดา path
CLI helpers แทนการแก้ JSON เอง
bash
# เพิ่ม stdio server เข้า user scope
# (ใช้ -- คั่นก่อน command ที่จะรัน เพื่อไม่ให้ flag ของ npx ปนกับ flag ของ claude mcp)
claude mcp add filesystem -s user -- npx -y @modelcontextprotocol/server-filesystem /path/to/folder
# เพิ่ม remote Streamable HTTP server เข้า project scope (commit ได้)
claude mcp add internal-api https://mcp.mycompany.com/mcp --transport http -s project
# list / remove / get
claude mcp list
claude mcp remove filesystem📎 ตรวจ flag ที่แท้จริง ด้วย
claude mcp add --helpเพราะ short flag (เช่น-t) อาจต่างกันตามเวอร์ชัน
Remote MCP + OAuth
Remote MCP server ที่ต้องล็อกอิน (เช่น Linear, Asana, Sentry official) ใช้ OAuth 2.0 (โอ-อ้อธ ทู-พ้อยท์-โอ) ไม่ใช่ static token (รหัสลับตายตัวที่ไม่หมดอายุ)
📎 OAuth คืออะไร?
OAuth คือวิธีมาตรฐานของเว็บที่ใช้ตอนคุณกด "ล็อกอินด้วย Google" หรือ "ล็อกอินด้วย Facebook" บนเว็บอื่น
หลักการคือ: เว็บที่คุณจะเข้า ไม่ต้องรู้รหัสผ่านของคุณ เลย แค่ขอสิทธิ์เข้าถึงเฉพาะเรื่องที่คุณอนุญาต
ใช้กับ MCP อย่างไร?
เมื่อรัน
claude mcp addหรือเข้า/mcpในเซสชัน Claude Code จะ:
- เปิดเบราว์เซอร์ให้คุณ approve (อนุมัติ)
- เก็บ token (รหัสยืนยันตัวตน) ที่ได้กลับมา
- ต่ออายุ token ให้อัตโนมัติเมื่อหมดอายุ
ผลคือ: ไม่ต้องวาง token ใน config เลย ปลอดภัยกว่ามาก เหมาะกับ MCP ระดับองค์กร (organization-level) ที่ต้องคุม permission ต่อผู้ใช้
OAuth ต่างจาก static token อย่างไร?
- static token = คุณก๊อปรหัสจากเว็บมาวางในไฟล์ config ด้วยมือ → ถ้าหลุดต้องเข้าไปยกเลิกเอง
- OAuth = approve ครั้งเดียวในเบราว์เซอร์ → ระบบจัดการ token ให้ทั้งหมด รวมถึงต่ออายุและถอนสิทธิ์
4.7 Subagents — แตกงานย่อยให้ agent ลูก
Claude Code แตกงานย่อยให้ "subagent" (agent ลูก) ทำได้ แต่ละตัวมีหน้าต่างบริบท (context) แยกของตัวเอง
ประโยชน์โดยย่อ: ไม่ทำให้ context หลักรก, ทำงานขนานกันได้, เชี่ยวชาญเฉพาะทาง — รายละเอียดเต็มและวิธีนิยาม subagent อยู่ใน บทที่ 06 — AI Agents ซึ่งว่าด้วยเรื่อง agent โดยเฉพาะ
4.8 โหมดการทำงานและสิทธิ์ (Permissions & Plan Mode)
Claude Code ควบคุมได้ว่าจะให้ลงมือมากแค่ไหน — นี่คือกลไกความปลอดภัยสำคัญ:
| โหมด | พฤติกรรม | เหมาะกับ |
|---|---|---|
| ปกติ | ถามอนุญาตก่อนทำสิ่งที่กระทบไฟล์/ระบบ | งานทั่วไป |
| Plan mode | สำรวจและเสนอ "แผน" ก่อน ไม่แก้อะไรจนกว่าจะอนุมัติ | งานใหญ่ งานเสี่ยง |
| Auto-accept | รับการแก้ไขอัตโนมัติ ไม่ต้องยืนยันทีละครั้ง | งานที่มั่นใจแล้ว |
นอกจากนี้ตั้ง permission allowlist ใน settings.json ล่วงหน้าได้ เพื่อลดการถามซ้ำ ๆ กับคำสั่งที่ปลอดภัย:
json
{
"permissions": {
"allow": ["Bash(npm test:*)", "Bash(npm run build:*)"]
}
}อธิบาย syntax ทีละส่วน:
| ส่วน | ความหมาย | ตัวอย่าง |
|---|---|---|
Bash(...) | อนุญาตเครื่องมือ Bash (รันคำสั่ง shell) เฉพาะ pattern ที่ตรงกับในวงเล็บ | Bash(npm test:*) = อนุญาตเฉพาะคำสั่งที่ขึ้นต้นด้วย npm test |
:* | wildcard (ไวลด์การ์ด) = สัญลักษณ์แทน "อะไรก็ได้ต่อจากนี้" | npm test:* จับได้ทั้ง npm test, npm test -- --coverage, npm test src/foo.test.js |
| pattern ของเครื่องมืออื่น | เครื่องมือแต่ละตัวมี pattern คล้ายกันแต่ต่างชื่อ | Read(src/**) = อ่านได้ทุกไฟล์ใต้ src/ · Edit(*.ts) = แก้ได้เฉพาะไฟล์ .ts |
💡 Plan mode คือเพื่อนของงานใหญ่ — บังคับให้ Claude วางแผนให้คุณตรวจก่อน ดีกว่าปล่อยให้มันลุยแก้ 20 ไฟล์แล้วค่อยมารู้ทีหลังว่าเดินผิดทาง
4.9 Memory — ความจำข้ามเซสชัน
Claude Code ไม่มี "ความจำ" แบบคนในตัวเอง — ทุกเซสชันเริ่มต้นใหม่ การข้ามเซสชันต้องอาศัย ไฟล์ ที่ระบบอ่านเข้ามาทุกครั้ง แยกได้ 3 ระดับ ตามว่าระบบรองรับเอง (built-in) หรือผู้ใช้ตั้งเอง:
| กลไก | ใครจัดการ | สถานะ |
|---|---|---|
| CLAUDE.md (ดู 4.3) | ระบบรองรับเอง — Claude Code อ่านอัตโนมัติทุกเซสชัน | ใช้ได้ทันที |
| Auto-memory ผ่าน skill/hook | ผู้ใช้/ทีมตั้งเอง (เช่น skill ที่เขียนไฟล์ลง ~/.claude/memory/ แล้วโหลดผ่าน SessionStart hook) | ต้องตั้งเอง |
memory_tool ของ Claude API (Claude 4.x — Sonnet/Opus) | API นิยาม action view/create/replace ให้ — ผู้พัฒนาเป็นคนเขียน storage layer เอง (ไฟล์, DB, อะไรก็ได้) Anthropic ไม่ได้ host memory ให้ (ดูบทที่ 05) | เฉพาะตอนเรียก API ตรง ไม่ใช่ใน Claude Code CLI default |
💡 อย่าสับสนระหว่าง 3 ระดับนี้ — ถ้าคุณอยากให้ Claude Code "จำ" ความชอบของคุณข้ามเซสชัน วิธีที่ตรงและเป็นทางการที่สุดคือเขียนลง CLAUDE.md หรือสร้าง skill memory เอง ·
memory_toolของ API เป็นเรื่องของคนทำ agent ของตัวเองผ่าน SDK ไม่ใช่ฟีเจอร์ CLI
4.10 เคล็ดลับการใช้ Claude Code ให้ได้ผล
- เขียน CLAUDE.md ให้ดี — บริบทที่ดีลดความผิดพลาดมหาศาล
- แตกงานใหญ่เป็นขั้น — สั่งทีละเฟส ตรวจผลก่อนไปต่อ ดีกว่าสั่งรวดเดียว
- ใช้ plan mode กับงานเสี่ยง — ให้ Claude เสนอแผนก่อนลงมือ
- ตรวจ diff ก่อนรับ — อ่านสิ่งที่มันแก้เสมอ อย่ารับรวด ๆ
- ทำงานบน git — commit บ่อย ๆ เพื่อย้อนกลับได้ถ้าผลไม่ดี
- ลงทุนกับ Skills/commands ที่ใช้ซ้ำ — งานที่ทำบ่อยควรเก็บเป็นสกิลหรือ slash command
🛠️ Lab — ตั้งค่าโปรเจกต์จริง
ถ้ามีโปรเจกต์โค้ดอยู่แล้ว (หรือสร้างโฟลเดอร์เปล่าใหม่ก็ได้) ลองทำ 3 ขั้นนี้:
- ติดตั้งและ init — ติดตั้ง Claude Code,
cdเข้าโปรเจกต์, รันclaudeแล้วสั่ง/initดูว่ามันสร้างCLAUDE.mdให้หน้าตาเป็นยังไง - เขียน slash command แรก — สร้างไฟล์
.claude/commands/summary.mdที่สั่งให้ "สรุปว่าโปรเจกต์นี้ทำอะไร โครงสร้างหลักมีอะไรบ้าง" แล้วเรียก/summary - ลอง plan mode — สั่งงานที่กระทบหลายไฟล์ (เช่น "เปลี่ยนชื่อฟังก์ชัน X ทั้งโปรเจกต์") ในโหมด plan แล้วอ่านแผนที่มันเสนอก่อนอนุมัติ
โจทย์คิดต่อ: เมื่อไรควรใช้ Skill เมื่อไรควรใช้ slash command?
- slash command = "prompt สำเร็จรูป" ที่คุณพิมพ์เรียกเอง เหมาะกับงานที่ คุณอยากสั่งเอง ซ้ำ ๆ (เช่น
/changelog) - Skill = แพ็กเกจขั้นตอน + ไฟล์ประกอบ ที่ Claude หยิบมาใช้เองอัตโนมัติ เมื่อ description ตรงงาน เหมาะกับงานที่ซับซ้อนมีหลายไฟล์/สคริปต์ และอยากให้ Claude รู้จักใช้เองโดยไม่ต้องสั่ง
โดยคร่าว: งานง่ายสั่งเอง → command · งานมีขั้นตอนมาตรฐานซับซ้อน + อยากให้เลือกใช้อัตโนมัติ → skill
📚 Glossary — ศัพท์สำคัญในบทนี้
| ศัพท์ | คำอ่าน | ความหมายสั้น |
|---|---|---|
| CLI | ซี-แอล-ไอ | โปรแกรมสั่งงานด้วยการพิมพ์คำสั่งเป็นบรรทัด |
| terminal | เทอร์-มิ-นั่ล | หน้าต่างสำหรับพิมพ์คำสั่ง |
| Node.js | โหนด-เจ-เอส | runtime ที่ทำให้รัน JavaScript นอกเบราว์เซอร์ได้ ใช้ npm |
| frontmatter | ฟร้อนต์-แมท-เทอร์ | ส่วนหัวไฟล์ (มักเขียนด้วย YAML) เก็บค่าตั้งค่า |
| YAML | ยา-เม่ิล | ภาษาเก็บค่าตั้งค่าแบบอ่านง่าย ใช้ key: value |
| Progressive disclosure | โปร-เกรส-สีฟ ดิส-โคล้-เชอร์ | การเปิดเผยข้อมูลทีละขั้น |
| stdin / stdout | สแตน-ดิน / สแตน-ดเอาท์ | ทางเข้า/ทางออกของโปรแกรมในระบบ Unix |
| exit code | เอ็ก-ซิต-โค้ด | เลขสถานะตอนโปรแกรมจบ (0 = สำเร็จ) |
| convention | คอน-เวน-ชั่น | ข้อตกลง/ธรรมเนียมปฏิบัติ (ไม่บังคับแต่ใช้กันแพร่หลาย) |
| MCP | เอ็ม-ซี-พี | Model Context Protocol — มาตรฐานเชื่อม AI กับเครื่องมือภายนอก |
| stdio | สแตน-ดิ-โอ | standard input/output ใช้รับส่งข้อมูลกับโปรเซสในเครื่อง |
| HTTP | เอช-ที-ที-พี | โพรโทคอลของเว็บ คุยข้ามเครื่อง |
| SSE | เอส-เอส-อี | Server-Sent Events — เซิร์ฟเวอร์ทยอยส่งข้อมูลกลับมา |
| OAuth 2.0 | โอ-อ้อธ ทู-พ้อยท์-โอ | วิธีล็อกอินมาตรฐาน เว็บอื่นไม่ต้องรู้รหัสผ่านของคุณ |
| PR | พี-อาร์ | Pull Request — คำขอรวมโค้ดเข้าโปรเจกต์หลัก |
| access token | แอ็กเซส-โท-เคน | รหัสยืนยันตัวตน (สตริงลับ ๆ ที่ระบบใช้เช็คว่าใครเป็นใคร) — คนละความหมาย กับ token ที่ใช้นับ/คิดราคาข้อความใน Claude API (ดูบทที่ 01, 05) |
✅ Checkpoint
- Claude Code ต่างจาก claude.ai ตรงไหนที่สำคัญที่สุด?
- CLAUDE.md มีไว้ทำอะไร และควรใส่/ไม่ควรใส่อะไร?
- Hook ต่างจากการสั่งใน prompt อย่างไร ทำไมจึงเชื่อถือได้กว่า?
- MCP แก้ปัญหาอะไร เปรียบเหมือนอะไร?
- Plan mode เหมาะกับงานแบบไหน เพราะอะไร?
➡️ บทที่ 05 — Claude API: เรียกใช้ผ่านโค้ด