Using Servers in Real Hosts
ส่วนใหญ่คุณไม่ได้เขียน host เอง
หัวข้อที่มีชื่อว่า “ส่วนใหญ่คุณไม่ได้เขียน host เอง”server ส่วนใหญ่ถูกใช้จาก host ที่คนอื่นสร้างไว้ การรู้ว่า host เหล่านั้น config ยังไงจะบอกคุณว่า server ของคุณต้องหน้าตาเป็นอย่างไรเมื่อมองจากข้างนอก: คำสั่งอะไรใช้เปิดมัน, มันอยู่ที่ URL ไหน, อ่าน environment variable ตัวไหน และผู้ใช้ authorize มันอย่างไร
flowchart LR cc["Claude Code"] cd["Claude Desktop"] api["Claude API MCP connector"] insp["MCP Inspector"] s["Your MCP server"] cc --> s cd --> s api --> s insp --> s
Claude Code
หัวข้อที่มีชื่อว่า “Claude Code”Claude Code เพิ่ม server ด้วย claude mcp add flag transport เป็นตัวเลือกว่าจะเชื่อมต่อแบบไหน
# Remote server over Streamable HTTPclaude mcp add --transport http notion https://mcp.notion.com/mcp
# Remote server with a static bearer tokenclaude mcp add --transport http secure-api https://api.example.com/mcp \ --header "Authorization: Bearer your-token"
# Local server over stdio — everything after -- is the launch commandclaude mcp add --transport stdio airtable --env AIRTABLE_API_KEY=YOUR_KEY \ -- npx -y airtable-mcp-serverตัวคั่น -- ไม่ใช่ของเลือกใส่สำหรับ stdio server: มันบอก CLI ว่า option ของตัวเองจบตรงไหนและคำสั่งของ server เริ่มตรงไหน
| Scope | เก็บที่ไหน | แชร์ไหม? | ใช้กับ |
|---|---|---|---|
local (ค่าเริ่มต้น) | ~/.claude.json แยกต่อ project | ไม่ | การทดลองส่วนตัว |
project | .mcp.json ที่ root ของ repo | แชร์ผ่าน git | server ที่ใช้ทั้งทีม |
user | ~/.claude.json | ไม่ | tool ที่อยากมีในทุก project |
claude mcp add --transport http stripe --scope project https://mcp.stripe.comclaude mcp add --transport stdio db --scope user -- npx -y @bytebase/dbhubไฟล์ของ project
หัวข้อที่มีชื่อว่า “ไฟล์ของ project”server ที่ scope เป็น project ก็แค่ entry หนึ่งใน .mcp.json commit มันเข้าไปเพื่อให้เพื่อนร่วมทีมได้ server ชุดเดียวกัน ค่าต่าง ๆ รองรับการขยาย ${VAR} และ ${VAR:-default} ใน command, args, env และ headers ทำให้ secret ไม่ต้องอยู่ใน repo
{ "mcpServers": { "shared-server": { "type": "http", "url": "https://example.com/mcp" }, "local-db": { "type": "stdio", "command": "/path/to/server", "args": ["--config", "${CLAUDE_PROJECT_DIR}/config.json"], "env": { "DB_URL": "${DB_URL:-postgresql://localhost}" }, "timeout": 600000 } }}authorization และงานดูแลทั่วไป
หัวข้อที่มีชื่อว่า “authorization และงานดูแลทั่วไป”remote server ที่ต้องใช้ OAuth จะถูก authorize แบบ interactive: รัน /mcp ใน session แล้วทำตาม flow ใน browser หรือใช้ claude mcp login <name> จาก shell ส่วน client credential ที่ลงทะเบียนไว้ล่วงหน้าใส่ได้ด้วย --client-id และ --client-secret (อ่านจาก MCP_CLIENT_SECRET ใน CI)
claude mcp list # every configured server and its statusclaude mcp get notion # details for one serverclaude mcp remove notion # drop itปุ่มปรับที่มีประโยชน์: MCP_TIMEOUT=10000 claude จำกัดเวลา startup ของ server เป็นมิลลิวินาที, timeout ต่อ server ใน .mcp.json จำกัดเวลารัน tool, MAX_MCP_OUTPUT_TOKENS จำกัดปริมาณ output ของ tool ที่ส่งให้ model ภายใน Claude Code tool ของคุณจะปรากฏเป็น mcp__<server>__<tool> ซึ่งเป็นแนวคิด namespace เดียวกับบทก่อนหน้า และเป็นชื่อที่คุณใช้ใน permission rule กับ hook
Claude Desktop
หัวข้อที่มีชื่อว่า “Claude Desktop”Claude Desktop อ่าน claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\) รูปแบบคือ map mcpServers แบบเดียวกัน
{ "mcpServers": { "filesystem": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/me/Desktop"] } }}restart แอปหลังแก้ไข เพราะ Desktop เป็นคนเปิด stdio server เอง command จึงต้องอยู่ใน PATH ของแอป ปัญหาที่เจอบ่อยคือ server ที่รันได้ใน shell ของคุณแต่รันจากแอปไม่ได้ เพราะ node อยู่ในไดเรกทอรีของ version manager
MCP connector ของ Claude API
หัวข้อที่มีชื่อว่า “MCP connector ของ Claude API”ถ้าคุณเรียก Messages API โดยตรง คุณให้ Anthropic เป็นคนเชื่อมต่อ MCP ฝั่ง server แทนที่จะรัน client เองได้ request ต้องมีสองส่วน คู่กัน: mcp_servers ประกาศการเชื่อมต่อ และ entry mcp_toolset ใน tools เปิดมันให้ model เห็น ขาดส่วนใดส่วนหนึ่งจะเป็น validation error และทุก server ต้องถูกอ้างถึงโดย toolset เพียงหนึ่งตัวเท่านั้น
import Anthropic from '@anthropic-ai/sdk';
const anthropic = new Anthropic();
const response = await anthropic.beta.messages.create({ model: 'claude-opus-5', max_tokens: 16000, betas: ['mcp-client-2025-11-20'], mcp_servers: [ { type: 'url', url: 'https://mcp.example.com/mcp', name: 'example-mcp', authorization_token: process.env.EXAMPLE_TOKEN }, ], tools: [ { type: 'mcp_toolset', mcp_server_name: 'example-mcp', default_config: { enabled: false }, // allowlist mode configs: { get_weather: { enabled: true } }, // only this tool is exposed }, ], messages: [{ role: 'user', content: 'What is the weather in Bangkok?' }],});import osimport anthropic
client = anthropic.Anthropic()
response = client.beta.messages.create( model="claude-opus-5", max_tokens=16000, betas=["mcp-client-2025-11-20"], mcp_servers=[ {"type": "url", "url": "https://mcp.example.com/mcp", "name": "example-mcp", "authorization_token": os.environ.get("EXAMPLE_TOKEN")}, ], tools=[ {"type": "mcp_toolset", "mcp_server_name": "example-mcp", "default_config": {"enabled": False}, "configs": {"get_weather": {"enabled": True}}}, ], messages=[{"role": "user", "content": "What is the weather in Bangkok?"}],)connector เข้าถึงได้เฉพาะ server ที่ route ได้แบบสาธารณะผ่าน HTTPS และ loop รันอยู่ฝั่ง Anthropic คุณได้ message สุดท้าย ไม่ได้ hook ต่อ call ใช้มันเมื่ออยากเขียนโค้ดน้อยที่สุด และรัน client ของคุณเองเมื่อต้องการ consent prompt, local stdio server หรือ routing แบบกำหนดเอง
Inspector ในฐานะ host
หัวข้อที่มีชื่อว่า “Inspector ในฐานะ host”ระหว่างพัฒนา MCP Inspector คือ host ที่เร็วที่สุดที่จะชี้ไปที่ server ของคุณ มันรัน server ให้, แสดง tool, resource และ prompt ทุกตัว และ log traffic ดิบของ protocol
# Web UI against a local stdio servernpx @modelcontextprotocol/inspector node build/index.js
# Web UI against a remote servernpx @modelcontextprotocol/inspector --server-url https://api.example.com/mcp --transport http
# CLI mode for scripts and CInpx @modelcontextprotocol/inspector --cli node build/index.js --method tools/listมัน negotiate ได้ทั้งสองยุคของ protocol จึงเป็นวิธีตรวจด้วยว่า client ที่รองรับแค่ยุคเก่ายังใช้ server ของคุณได้ไหม บทเรื่องการทดสอบลงลึกกว่านี้
ข้อคิดสำหรับคนเขียน server
หัวข้อที่มีชื่อว่า “ข้อคิดสำหรับคนเขียน server”- เผยแพร่คำสั่งเปิด server host ต้องการคำสั่งบรรทัดเดียว
npx -y your-packageหรือuvx your-packageคือธรรมเนียม - อ่าน secret จาก environment บน stdio อย่าขอมันเป็น argument ของ tool
- เปิด HTTPS URL ที่คงที่ สำหรับการใช้แบบ remote และ implement ฝั่ง OAuth resource server เพื่อให้
/mcpใน Claude Code authorize มันได้ - ทำชื่อ tool ให้ปลอดภัยสำหรับ header และไม่ซ้ำ เพราะ host จะใส่ prefix และอาจ mirror มันลงใน HTTP header