ข้ามไปยังเนื้อหา
26/30บทที่ 26 จาก 30

อธิบาย MCP เทียบกับสเปก: เซิร์ฟเวอร์จริง ๆ คืออะไร

ส่ง JSON หนึ่งบรรทัดเข้า subprocess แล้วได้ tool 13 รายการ เทียบกับ revision 2026-07-28 ที่ตัด handshake ออก

ในหน้านี้

ติดตั้ง MCP server ที่เผยแพร่แล้ว ส่ง JSON หนึ่งบรรทัดให้มัน แล้วอ่านสิ่งที่ตอบกลับมา

terminalBASH
npm i @modelcontextprotocol/server-everything@2026.8.31
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' \
  | npx @modelcontextprotocol/server-everything stdio
TEXT
{"result":{"tools":[{"name":"echo","title":"Echo Tool","description":"Echoes
back the input string","inputSchema":{"$schema":"http://json-schema.org/draft-07/
schema#","type":"object","properties":{"message":{"type":"string","description":
"Message to echo"}},"required":["message"]},"annotations":{"readOnlyHint":true,
…                                        … 7,663 bytes on one line …
"jsonrpc":"2.0","id":1}

tool definitions สิบสามรายการ ในบรรทัดเดียว จาก process ที่อ่านหนึ่งบรรทัดจาก standard input ของตัวเอง ตอนนี้คุณได้พูดภาษา Model Context Protocol แล้ว โดยไม่มี SDK, ไม่มี client library และไม่มี framework ทั้งหมดมีแค่นี้: transport หนึ่งแบบ, รูปแบบข้อความหนึ่งแบบ และชุด method ที่มีชื่อไม่กี่รายการ

บทที่ 18 นิยาม tool ไว้เป็นสองอย่าง — JSON Schema ที่ model เห็น และ endpoint ในโค้ดของคุณที่ model ไม่เคยเห็น บทที่ 23 สร้าง harness ที่ถือ catalogue ของสิ่งเหล่านั้นไว้ แต่ทั้งสองบทยังไม่ตอบคำถามที่ตัดสินว่าสิ่งนี้นำกลับมาใช้ซ้ำได้หรือไม่: ใครเป็นคนเขียน schema และมันเดินทางจากคนเขียนเข้าไปใน prompt ของคุณอย่างไร MCP คือหนึ่งคำตอบของคำถามนั้น และควรอ่านจากต้นฉบับ เพราะแทบทุกอย่างที่เขียนถึงมันอธิบาย revision ที่ไม่มีอยู่อีกแล้ว

มีสามอย่างในคำสั่งที่คุณเพิ่งรันซึ่งผิด และแต่ละอย่างคือหนึ่งส่วนของบทนี้ มันไม่ได้ส่ง protocol version ดังนั้น server ที่ conform กับสเปกควรปฏิเสธ มันยังได้คำตอบกลับมาอยู่ดี ด้วยเหตุผลที่ specification เรียกว่า hazard มากกว่าจะเป็น feature และมันถาม primitive หนึ่งในสามอย่าง โดยไม่เคย discover เลยว่าอีกสองอย่างมีอยู่

ปัญหาที่มันแก้ และอุปมาที่สเปกใช้เอง

ลิงก์ไปยังส่วน: ปัญหาที่มันแก้ และอุปมาที่สเปกใช้เอง

ก่อนพูดถึง wire มาดูเลขก่อน คุณมีแอป AI NN ตัว และสิ่งที่มันควรเข้าถึงได้ MM อย่าง — calendar, ticket tracker, warehouse database, design tool หากไม่มีสัญญาร่วมกัน ใครสักคนต้องเขียน integration N×MN \times M ชุด และทุกชุดคือ schema บวก endpoint บวกเรื่อง authentication บวกภาระ maintenance ถ้ามีสัญญาร่วมกัน tool vendor เขียน server, application vendor เขียน client และยอดรวมคือ N+MN + M

นี่ไม่ใช่ข้อสังเกตใหม่ และ specification บอกไว้ว่าได้แรงบันดาลใจจากใคร:

MCP takes some inspiration from the Language Server Protocol, which standardizes how to add support for programming languages across a whole ecosystem of development tools. In a similar way, MCP standardizes how to integrate additional context and tools into the ecosystem of AI applications.1

จงอ่านการเปรียบเทียบนั้นตามตัวอักษร ไม่ใช่เป็นคำชม ก่อน protocol นั้น การรองรับภาษาใน editor หมายถึง plugin ต่อ editor หนึ่งตัว หลังจากนั้น ทีมภาษาส่ง server ตัวเดียว แล้ว editor ทุกตัวก็ใช้ได้ ตัวชี้วัดความสำเร็จไม่ใช่ความสง่างาม แต่คือจำนวน integration หยุดทวีคูณ เหตุผลเดียวกันใช้กับที่นี่: คุณค่าอยู่ที่จำนวน implementation ไม่ใช่ที่ดีไซน์ protocol ที่มีผลิตภัณฑ์สองตัวพูดได้ ก็เป็น data format ที่มีพิธีรีตองเพิ่มขึ้นเท่านั้น

ข้อความ MCP คือ JSON-RPC 2.0 request คือ object ที่มี jsonrpc, id, method และ params ที่เป็น optional; response ถือ id เดียวกัน และมี result หรือ error อย่างใดอย่างหนึ่ง; notification คือ request ที่ไม่มี id และไม่มี reply specification เพิ่มข้อจำกัดอีกสามอย่าง: id ต้องเป็น string หรือ number และ ต้องไม่ เป็น null, ต้องไม่ชนกับ request อื่นที่ยังค้างอยู่ และทุก result ต้องมี field resultType2

บน stdio transport — ตัวที่คำสั่งข้างบนใช้ — กฎ framing คือหนึ่งข้อความต่อหนึ่งบรรทัด:

Messages are delimited by newlines, and MUST NOT contain embedded newlines. […] The server MUST NOT write anything to its stdout that is not a valid MCP message.3

ประโยคท้ายคือวิธีที่ server ทำเองพังบ่อยที่สุด และมันพังแบบเงียบ ๆ: console.log ที่หลุดมา, progress bar, deprecation warning จาก dependency แล้ว line parser ของ client ก็ชนสิ่งที่ไม่ใช่ JSON ทางหนีอยู่ใน section เดียวกัน — server may เขียนอะไรก็ได้ที่ต้องการไปที่ stderr และ client should not ถือว่านั่นเป็น error reference server ข้างบนพิมพ์ Starting default (STDIO) server... ทุกครั้งที่ launch บน stderr จึงเป็นเหตุผลที่ pipe ยังทำงานได้

transport มาตรฐานอีกแบบคือ Streamable HTTP: แต่ละข้อความเป็น POST ไปยัง endpoint เดียว และ reply เป็น JSON object หรือ stream ของ Server-Sent Events ที่ scoped กับ request — wire format ที่บทที่ 14 parse ด้วยมือ semantic เหมือนกันทั้งสองแบบ เพราะ transport คือ binding: มันกำหนด framing และ delivery ไม่ใช่ความหมาย4

คำสั่งข้างบนส่ง tools/list และไม่มีอะไรอีก ภายใต้ revision ปัจจุบัน request นี้ malformed และ server ที่ conform ต้อง reject

ตั้งแต่ 2026-07-28 เป็นต้นมา MCP เป็น stateless protocol และ specification ระบุโดยไม่อ้อมค้อม:

The Model Context Protocol (MCP) is a stateless protocol: all the information needed to process a request is contained in the request itself. A server processes each request independently; no state should be inferred from previous requests, even those on the same connection or stream.2

ดังนั้นทุก request จึงพก protocol version ของตัวเองและ client capabilities ของตัวเอง ใน object ที่ reserve ไว้ชื่อ _meta ภายใน params field สองรายการในนั้น required ในทุก request; request ที่ขาดรายการใดรายการหนึ่งถือว่า malformed และ server must ตอบ -32602:2

key ของ _metarequiredคืออะไร
io.modelcontextprotocol/protocolVersionใช่revision ที่ request นี้พูด เช่น "2026-07-28"
io.modelcontextprotocol/clientCapabilitiesใช่client ทำอะไรให้ server ได้บ้างใน request นี้
io.modelcontextprotocol/clientInfoไม่ใช่ แต่ shouldชื่อและ version ของ client สำหรับแสดงผลและ log เท่านั้น
io.modelcontextprotocol/logLevelไม่ใช่log level ขั้นต่ำที่ server ควร emit สำหรับ request นี้

ถ้าเขียนเต็ม tools/list ที่ถูกต้องจะเป็นแบบนี้ — และนี่เป็นครั้งสุดท้ายที่บทนี้แสดง metadata แบบเต็ม เพราะจากนี้ไปมันอยู่ในทุก request:

one line, split for the pageTEXT
{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{"_meta":{
  "io.modelcontextprotocol/protocolVersion":"2026-07-28",
  "io.modelcontextprotocol/clientCapabilities":{"elicitation":{"form":{}}},
  "io.modelcontextprotocol/clientInfo":{"name":"bare-hands","version":"0.0.1"}}}}

capability object นั่นแหละคือการ negotiation ไม่มีขั้นตอน negotiation แยกต่างหากอีกแล้ว: client ประกาศว่าตัวเองทำอะไรได้ในแต่ละ request, server ประกาศว่าตัวเองทำอะไรได้ใน result และทั้งสองฝั่งห้ามใช้ feature ที่อีกฝั่งไม่ได้ claim server ที่ต้องการ capability ซึ่ง client ไม่ได้ประกาศ must ตอบ -32021 และระบุ capability ที่ขาดใน data.requiredCapabilities server ที่พูด version ที่ขอมาไม่ได้ must ตอบ -32022 และ list version ที่พูดได้2

client ที่ต้องการคำตอบล่วงหน้าถามได้: server/discover เป็น RPC แบบ mandatory ที่ return supported versions, capabilities, identity และ block optional ของ instructions ในหนึ่ง round trip5 การเรียกเป็น optional แต่การ implement ไม่ใช่

คำสั่งทำงานได้ ภายใต้ revision ปัจจุบันมันไม่ควรทำงาน และเหตุผลที่มันทำงานควรถูกวัดมากกว่าถูกเล่าเป็นย่อหน้า เพราะมันคือสภาพของ ecosystem ทั้งหมดในหนึ่งบรรทัด

probe reference server ตามวิธีที่ specification บอกให้ client สมัยใหม่ probe:

terminalBASH
echo '{"jsonrpc":"2.0","id":1,"method":"server/discover","params":{"_meta":{
  "io.modelcontextprotocol/protocolVersion":"2026-07-28",
  "io.modelcontextprotocol/clientCapabilities":{}}}}' \
  | npx @modelcontextprotocol/server-everything stdio
TEXT
{"jsonrpc":"2.0","id":1,"error":{"code":-32601,"message":"Method not found"}}

นั่นคือ branch ที่สามของ compatibility rule: DiscoverResult หมายถึง modern, error สมัยใหม่ที่ recognize ได้หมายถึง modern-but-wrong-version และ อย่างอื่นทั้งหมด — รวมถึง -32601 — หมายถึง legacy ให้ fallback ไป handshake initialize3 ดังนั้นทำแบบนั้น โดยขอ revision ปัจจุบัน:

TEXT
→ {"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2026-07-28",
   "capabilities":{},"clientInfo":{"name":"bare-hands","version":"0.0.1"}}}

← {"result":{"protocolVersion":"2025-11-25","capabilities":{"tools":{"listChanged":true},
   "prompts":{"listChanged":true},"resources":{"subscribe":true,"listChanged":true},
   "logging":{},"tasks":{…},"completions":{}},"serverInfo":{"name":"mcp-servers/everything",
   "title":"Everything Reference Server","version":"2.0.0"},"instructions":"…"}}

client ขอ 2026-07-28 และ server ตอบ 2025-11-25 วันที่ 7 กันยายน 2026 official reference server — npm package @modelcontextprotocol/server-everything, version 2026.8.31, เผยแพร่ 31 สิงหาคม 2026 — ยังไม่ implement revision ปัจจุบัน TypeScript SDK ที่มันสร้างอยู่บนก็เช่นกันตามวันที่: release 1.30.0 ออกวันที่ 27 กรกฎาคม 2026 หนึ่งวันก่อน revision นี้

อ่านผลลัพธ์ ไม่ใช่ซุบซิบ เกือบทุกอย่างที่เขียนเกี่ยวกับ MCP อธิบาย protocol ที่มี handshake initialize, session, request roots/list ที่ server ส่งให้ client และ HTTP+SSE transport ทั้งสี่อย่างหายไปแล้วหรือกำลังจะหายไป เวลาอ่านอะไรก็ตามเกี่ยวกับ MCP รวมถึงหน้านี้ สิ่งแรกที่ต้องมองหาคือ revision number

และเหตุผลที่คำสั่งแรกสุดทำงานได้ระบุไว้ใน specification ว่าเป็น hazard ไม่ใช่ feature:

some legacy servers do not validate that a request arrives after initialize and would process an era-ambiguous method (such as tools/call) under legacy semantics. Probing yields a deterministic failure instead.3

วัดแล้ว: ส่ง tools/list ไปยัง server นั้นโดยไม่มี handshake เลย return catalogue เต็ม method ที่ควรถูกปฏิเสธกลับถูกให้บริการ ซึ่งเป็นเหตุผลตรง ๆ ที่ specification บอกให้ probe ด้วย server/discover ก่อน แม้คุณจะ support เฉพาะ version สมัยใหม่ก็ตาม

สามบทบาท และประโยคที่ควร quote จากเอกสารทั้งฉบับ

ลิงก์ไปยังส่วน: สามบทบาท และประโยคที่ควร quote จากเอกสารทั้งฉบับ

MCP มีสามฝ่าย และความแตกต่างระหว่างสองฝ่ายแรกคือสิ่งที่คนมักยุบรวมกัน:

Host. แอปพลิเคชัน: chat product, editor, agent มันเป็นเจ้าของ conversation, model, credentials และ consent ของผู้ใช้ มันสร้าง client และ enforce security boundary ระหว่าง client เหล่านั้น

Client. connector ภายใน host client แต่ละตัวคุยกับ server หนึ่งตัวพอดี — ความสัมพันธ์ 1:1 อย่างเคร่งครัด — และแนบ protocol version กับ capabilities ไปในทุก request ที่ route

Server. process หรือ service ที่ expose resources, tools และ prompts อาจเป็น local หรือ remote ก็ได้ มันทำงานเป็นอิสระ และงานทั้งหมดของมันคือพื้นที่โฟกัสเดียว6

กฎ “server หนึ่งตัวพอดี” ไม่ใช่ bookkeeping แต่มันคือสิ่งที่ทำให้ design principle ด้านล่าง implement ได้ และนี่คือประโยคที่ควรเก็บจาก specification หากคุณจะเก็บเพียงประโยคเดียว:

Servers should not be able to read the whole conversation, nor “see into” other servers. Servers receive only necessary contextual information. Full conversation history stays with the host. Each server maintains isolation. Cross-server interactions are controlled by the host.6

นี่พลิก mental model ที่คนส่วนใหญ่มีตอนเข้ามา weather server ที่คุณเชื่อมกับ assistant ของคุณ ไม่ได้ เห็นสิ่งที่คุณถาม มันเห็น tools/call พร้อม arguments ที่ model เลือก และไม่มีอะไรอีก — ไม่เห็น turns ก่อนหน้า ไม่เห็น system prompt ของคุณ ไม่เห็นผลลัพธ์ที่ calendar server เพิ่ง return เมื่อกี้ หาก server สองตัวต้องร่วมมือกัน host จะถือ value จากตัวหนึ่งไปอีกตัวหนึ่งอย่างตั้งใจ เพราะ model ขอให้ทำ นี่คือเหตุผลที่ isolation เป็น security property ที่บทที่ 30 พึ่งพา: server ที่ถูก compromise มี blast radius เล็กและชัดเจน และการขยาย radius นั้นต้องให้ host ร่วมมือ

สิ่งที่สาม: primitive สามอย่าง เรียงตามว่าใครคุม

ลิงก์ไปยังส่วน: สิ่งที่สาม: primitive สามอย่าง เรียงตามว่าใครคุม

คำสั่งแรกขอ tools จาก server นั้นและได้สิบสามรายการ ถามคำถามอีกสองแบบ มันก็ตอบเช่นกัน: resources/list return เจ็ดรายการ, prompts/list return สี่รายการ ไม่มีรายการใดโผล่มา เพราะไม่มีอะไรถาม และนี่พาเรามาถึงแกนการสอนของ MCP ซึ่งอยู่ใน specification เป็นตารางที่แทบไม่มีใคร quote:

PrimitiveControlDescriptionExample
PromptsUser-controlledtemplate แบบ interactive ที่ invoke ด้วยการเลือกของผู้ใช้Slash commands, menu options
ResourcesApplication-controlledcontextual data ที่ client แนบและจัดการFile contents, git history
ToolsModel-controlledfunction ที่ expose ให้ LLM เพื่อทำ actionAPI POST requests, file writing

ไม่ใช่ “สามวิธีในการ expose capability” แต่คือสามคำตอบของคำถามว่า ใครตัดสินใจว่าสิ่งนี้เกิดขึ้น model ตัดสินใจ call tool แอปพลิเคชันตัดสินใจแนบ resource คนตัดสินใจ run prompt ถ้าคุณเข้าใจผิด feature ยังทำงานได้ แต่มันทำงานผิดจังหวะและผิดเหตุผล

วิธีที่ชัดที่สุดในการรู้สึกถึงมันคือ calendar นี่คือ server ที่ expose calendar เดียวกันสามครั้ง หนึ่งครั้งต่อ primitive ใน Node เปล่า ๆ ร้อยบรรทัด ไม่มี dependency:

calendar.mjs — the parts that matterJS
const TOOL = {
  name: "create_event",
  description: "Create a calendar event. Writes to the calendar.",
  inputSchema: {
    type: "object",
    properties: {
      title:    { type: "string", description: "Event title." },
      startsAt: { type: "string", format: "date-time", description: "Start, ISO 8601 UTC." },
    },
    required: ["title"],
  },
};

switch (method) {
  case "resources/read":                                          
    return ok(id, { contents: [{ uri: "calendar://week",
      mimeType: "application/json", text: JSON.stringify(EVENTS) }],
      ttlMs: 60000, cacheScope: "private" });

  case "prompts/get":                                             
    return ok(id, { description: PROMPT.description, messages: [{ role: "user",
      content: { type: "text", text: `Read calendar://week and draft a plan. ` +
        `Focus: ${params.arguments?.focus ?? "balance"}.` } }] });

  case "tools/list":                                              
    return ok(id, { tools: [TOOL], ttlMs: 300000, cacheScope: "public" });
}

รันมันและถามทั้งสามแบบ output จริง หนึ่งข้อความต่อหนึ่งบรรทัดบน wire ห่อบรรทัดไว้ที่นี่เพื่อแสดงบนหน้า โดยละ _meta ของ request และ identity block ของ server:

TEXT
→ resources/read  {"uri":"calendar://week"}
← {"resultType":"complete","contents":[{"uri":"calendar://week",
   "mimeType":"application/json","text":"[{\"id\":\"e1\",\"title\":\"Standup\",
   \"startsAt\":\"2026-09-07T09:00:00Z\"},{\"id\":\"e2\",\"title\":\"Design review\",
   \"startsAt\":\"2026-09-09T15:00:00Z\"}]"}],"ttlMs":60000,"cacheScope":"private"}

→ prompts/get    {"name":"prepare_week","arguments":{"focus":"deep work"}}
← {"resultType":"complete","description":"Read the week and draft a plan.",
   "messages":[{"role":"user","content":{"type":"text",
   "text":"Read calendar://week and draft a plan. Focus: deep work."}}]}

→ tools/call     {"name":"create_event","arguments":{"title":"Dentist",
                  "startsAt":"2026-09-10T08:30:00Z"}}
← {"resultType":"complete","content":[{"type":"text",
   "text":"Created e3: Dentist at 2026-09-10T08:30:00Z"}],
   "structuredContent":{"id":"e3","title":"Dentist","startsAt":"2026-09-10T08:30:00Z"},
   "isError":false}

สาม method, สาม shape, calendar เดียว ทีนี้ประเด็นคือ:

มันถูก address ด้วย URI, มัน inert และ แอปพลิเคชัน ตัดสินใจว่าจะ attach มันกับ conversation หรือไม่ ไม่มีอะไรใน protocol ที่เปิดให้ model เอื้อมไปหยิบเอง result ถือ ttlMs และ cacheScope ซึ่งใหม่ใน revision นี้ เพื่อให้ client cache สัปดาห์นั้นไว้หนึ่งนาทีแทนที่จะ polling

มันมี schema, มันมี side effects และ model ตัดสินใจว่าจะ call เมื่อไร result ของมันถือ isError ซึ่งเป็น field ที่บทที่ 18 โต้แย้งไว้: validation failure กลับมาเป็น tool result ที่ model อ่านและแก้ได้ ไม่ใช่ protocol error

มันคือ template ที่มีชื่อและรับ argument ซึ่ง คน เป็นผู้ invoke — slash command ในเมนู มัน return messages ไม่ใช่คำตอบ มันเป็นวิธีให้ server author ส่ง phrasing ที่ทำงานกับ tools ของตัวเอง ซึ่งเป็นความรู้ที่ server author มีและผู้ใช้ไม่มี

แทบทุกคนทำทั้งสามอย่างนี้ให้เป็น tools ผลลัพธ์คือ catalogue ที่การอ่านซึ่งแอปพลิเคชันควร attach เงียบ ๆ ต้องแข่งขันเพื่อ attention ของ model กับการเขียนที่ต้อง approval และสิ่งหนึ่งที่คนอยากได้เป็นปุ่มกลับถูกฝังอยู่ใน schema การทำให้ถูกไม่เสียอะไร และตัดสินได้ก่อนเขียนโค้ดสักบรรทัด

calendar tool มี required argument หนึ่งตัวคือ title และ optional startsAt ลองขอให้มันสร้าง event โดยไม่มี date แล้วสิ่งที่น่าสนใจจะกลับมา:

TEXT
→ tools/call {"name":"create_event","arguments":{"title":"Dentist"}}

← {"resultType":"input_required",
   "inputRequests":{"when":{"method":"elicitation/create","params":{"mode":"form",
     "message":"When should \"Dentist\" start?",
     "requestedSchema":{"type":"object",
       "properties":{"startsAt":{"type":"string","format":"date-time"}},
       "required":["startsAt"]}}}},
   "requestState":"eyJ0aXRsZSI6IkRlbnRpc3QifQ=="}

server ไม่ได้ส่ง request มัน ตอบ request ที่ได้รับ ด้วย resultType: "input_required" และ description ว่ายังต้องการอะไร client เก็บคำตอบจากคน แล้วส่ง call เดิมอีกครั้ง — ด้วย id ใหม่ โดยถือ inputResponses และ echo requestState แบบ opaque กลับไป:

TEXT
→ tools/call {"name":"create_event","arguments":{"title":"Dentist"},
   "inputResponses":{"when":{"action":"accept",
     "content":{"startsAt":"2026-09-10T08:30:00Z"}}},
   "requestState":"eyJ0aXRsZSI6IkRlbnRpc3QifQ=="}

← {"resultType":"complete","content":[{"type":"text",
   "text":"Created e3: Dentist at 2026-09-10T08:30:00Z"}],"isError":false}

นี่คือ Multi Round-Trip Requests ที่ introduce ใน revision ปัจจุบัน และมันแทนที่ design เก่าที่ server ส่ง JSON-RPC requests กลับไปหา clients transport specification ตอนนี้ระบุกฎแบบตรง ๆ: “servers do not initiate JSON-RPC requests and clients do not send JSON-RPC responses”4 มี initiative ทิศทางเดียว และมันเป็นของ host

client-side features สองอย่างวิ่งบนกลไกนั้น และหนึ่งในนั้นมีชื่อที่จะทำให้คุณสะดุด

Elicitation คือ server ขออะไรบางอย่างจาก คน: form ที่มี JSON Schema จำกัดอย่างตั้งใจ — flat objects, primitive properties, ไม่มี nesting — เพื่อให้ client ใด ๆ render ได้โดยไม่ต้องมี layout engine มันมีกฎแข็ง: servers must not ใช้ form mode เพื่อขอ “passwords, API keys, access tokens, or payment credentials” และ must ใช้ URL mode สำหรับสิ่งเหล่านั้น ซึ่งส่งผู้ใช้ไปยังหน้าที่ client ไม่เคยอ่าน7

Sampling คือ server ขอ generation จาก model ของ host เพื่อให้ server ฉลาดได้โดยไม่ต้องถือ API key และนี่คือคำเตือนด้านศัพท์ เพราะคำนี้มีความหมายอื่นในคอร์สนี้อยู่แล้ว: นี่ไม่ใช่ sampling ของบทที่ 17 ไม่มีอะไรเกี่ยวกับ temperature, top-p หรือ shape ของ probability distribution ตรงนี้คือ nested model call ที่เดินทางย้อนกลับผ่าน protocol

มีเหตุผลที่สองที่ไม่ควรรีบหยิบมันมาใช้: ณ revision นี้ sampling ถูก deprecate แล้ว พร้อมกับ roots และ logging ภายใต้ SEP-2577 พร้อม migration ที่พูดตรงมาก — “integrate directly with LLM provider APIs instead of Sampling”8 ไอเดียไม่ได้ล้มเหลวทางเทคนิค แต่มันอธิบาย surface area ของตัวเองให้คุ้มไม่ได้ และ protocol ที่ลบสิ่งต่าง ๆ ได้สุขภาพดีกว่า protocol ที่ทำไม่ได้

Statelessness ฟังดูเหมือนรายละเอียด wire-format จนกว่าคุณจะทดสอบ ลองเอา exchange สามข้อความข้างบน แล้วรันแต่ละข้อความใน process แยกกันnode calendar.mjs ใหม่เอี่ยม ไม่มี shared memory ไม่มีอะไรถูกถือข้ามไป:

TEXT
process A   tools/call (no date)   → resultType: input_required
                                     requestState: eyJ0aXRsZSI6IkRlbnRpc3QifQ==
process B   tools/call (with the answer, same requestState)
                                   → resultType: complete
                                     "Created e3: Dentist at 2026-09-10T08:30:00Z"
process C   resources/read calendar://week
                                   → events: 2  (Standup, Design review)

Process B ซึ่งไม่เคยเห็นคำถาม กลับ complete multi-round-trip call ที่ process A เริ่มไว้ได้ นั่นคือประเด็นของ requestState: continuation เดินทางในข้อความ ดังนั้นไม่มีอะไรขึ้นกับว่า process เป็นตัวเดิมหรือไม่

Process C คือความล้มเหลว event ถูกสร้างแล้วแต่ไม่อยู่ตรงนั้น — เพราะ toy server เก็บ EVENTS ไว้ใน module-level array และ module-level array คือ connection state note ของ specification เรียกความผิดพลาดนี้อย่างแม่นยำ:

an open connection, such as a STDIO process, is not a conversation or session: clients may interleave unrelated requests on the same transport, and a server must not treat connection or process identity as a proxy for conversation or session continuity.2

วิธีแก้ที่กำหนดไม่ใช่ session แต่คือ explicit handle: creation tool return opaque identifier และทุก call ภายหลังรับมันเป็น argument ธรรมดา protocol ไม่มี concept ของมันเลย — “from the wire's perspective a handle is an ordinary string in a tool result and an ordinary argument to subsequent tool calls”9 ซึ่งทำให้ model เป็นฝ่ายถือมัน และทำให้ server เป็นฝ่าย validate ว่า caller นี้ได้รับอนุญาตให้ใช้มันในทุก call เพราะ handle คือชื่อ ไม่ใช่ permission

server มีต้นทุนอะไรก่อนจะทำอะไรด้วยซ้ำ

ลิงก์ไปยังส่วน: server มีต้นทุนอะไรก่อนจะทำอะไรด้วยซ้ำ

ทุก tool ที่ server expose คือ schema ที่เข้าไปใน prompt ของคุณทุก request และบทที่ 24 วัดไว้แล้วว่าสิ่งนั้นทำอะไรกับ window MCP เพิ่ม line item ที่สองซึ่งมองข้ามง่าย ดังนั้นทั้งสองอย่างควรถูกนับบน reference server ข้างบน

o200k_base tokensTEXT
13 tool definitions (name + description + inputSchema):  1,307 tokens
  cheapest tool, get-tiny-image                              52
  costliest tool, gzip-file-as-resource                     235
server `instructions`, returned by discovery:               312 tokens
                                                          ------
one server, connected, before it is used:                 1,619 tokens

ข้อสังเกตสองอย่าง อย่างแรกคือเลขคณิต: เชื่อม server ขนาดนี้ห้าตัว แล้วประมาณแปดพัน tokens ของ window จะถูกจับจองทุก turn ตลอดไป ไม่ว่า model จะใช้มันหรือไม่ — ซึ่งเป็นกลไกเบื้องหลังการลดจาก 150,000 เหลือ 2,000 ที่บทที่ 24 quote และเป็นเหตุผลที่ just-in-time tool discovery มีอยู่

อย่างที่สองคือ security note ที่สวมชุดบัญชี instructions คือ natural-language text ที่ server author เขียน ซึ่งลงไปอยู่ใน prompt ของ host และ tool descriptions ข้าง ๆ ก็เหมือนกัน specification บอกว่าควรทำอย่างไรกับสิ่งนี้ใน security principles ของตัวเอง: tool annotations และ descriptions “should be considered untrusted, unless obtained from a trusted server” และ hosts “must obtain explicit user consent before invoking any tool”1 การเชื่อม MCP server ไม่ใช่การเพิ่ม dependency แต่คือการให้คนแปลกหน้า 1,619 tokens ใน system prompt ของคุณ และสิทธิ์ที่จะถูก call บทที่ 30 คือสิ่งที่เกิดขึ้นเมื่อคนแปลกหน้านั้นเป็นศัตรู

ส่วนที่ลงวันที่: revision 2026-07-28 และสิ่งที่มันทำให้พัง

ลิงก์ไปยังส่วน: ส่วนที่ลงวันที่: revision 2026-07-28 และสิ่งที่มันทำให้พัง

ทุกอย่างในส่วนนี้เป็นจริงสำหรับ protocol revision 2026-07-28 ซึ่งเป็น version ปัจจุบัน อ่านเมื่อ 7 กันยายน 2026 revision ลงวันที่เป็น YYYY-MM-DD และวันที่คือครั้งล่าสุดที่มี backwards-incompatible change10 normative document คือ TypeScript file ชื่อ schema/2026-07-28/schema.ts; JSON Schema ข้าง ๆ generated จากมัน นั่นคือเหตุผลที่ specification ในที่นี้ถูกอ่านเป็น TypeScript และเหตุผลที่การสอน MCP จากอย่างอื่นคือการสอนคำแปล

เปลี่ยนอะไรเดิมตอนนี้ทำให้อะไรพัง
Handshakeinitialize + notifications/initialized หนึ่งครั้งต่อ connectionremoved; ทุก request ถือ version และ capabilities ของ _metaclient ทุกตัวที่เขียนก่อน revision นี้
Sessionsheader Mcp-Session-Id, state ตาม connectionremoved; state เดินทางใน explicit handles ที่ server mintlist endpoints ที่เปลี่ยนไปตาม connection
Discoveryinfer จาก result ของ initializeserver/discover ซึ่ง servers must implementไม่มี แต่ตอนนี้ต้อง implement
Server-to-client callsserver ส่ง roots/list, sampling/createMessage, elicitation/createInputRequiredResult และ client retryserver ทุกตัวที่ push request ไปหา client
Result shapeobject ใดก็ได้required resultType: "complete" หรือ "input_required"ไม่มี: field ที่หายไปต้องอ่านเป็น "complete"
SubscriptionsHTTP GET stream, resources/subscribestream subscriptions/listen หนึ่งเส้นพร้อม opt-in typesGET endpoint หายไปแล้ว
Stream resumptionreplay Last-Event-ID บน Streamable HTTPremoved; stream ที่ขาดทำให้ request หาย ต้อง re-issue ด้วย id ใหม่clients ที่พึ่งพา redelivery
Rootsclient feature ที่ servers ขอใช้ได้deprecated (SEP-2577); ส่ง paths เป็น tool arguments หรือ resource URIsยังไม่มี — window สิบสองเดือน
Sampling and loggingclient featuresdeprecated (SEP-2577)ยังไม่มี — window สิบสองเดือน
HTTP+SSE transportdeprecated ตั้งแต่ 2025-03-26Deprecated ภายใต้ lifecycle policy (SEP-2596)migrate ไป Streamable HTTP
Client registrationOAuth 2.0 Dynamic Client Registration, RFC 7591deprecated เพื่อใช้ Client ID Metadata Documentsเก็บไว้สำหรับ authorization servers ที่ไม่มีสิ่งนั้น
Error codes-32002 สำหรับ resource not found-32602; -32020-32099 reserved สำหรับ speccodes ใหม่ -32020, -32021, -32022

governance change ที่อยู่ใต้ตารางนั้นสำคัญกว่าแต่ละแถว revision นี้รับ feature lifecycle and deprecation policy: features มีสถานะ Active, Deprecated หรือ Removed, feature ที่ deprecated จะ document migration path ของตัวเองและอยู่ใน specification อย่างน้อยสิบสองเดือนก่อนมีสิทธิ์ถูก remove และมี registry ที่ list ทุกอย่างที่ตอนนี้อยู่ในสถานะ Deprecated8 ก่อน policy นี้ “deprecated” ใน AI protocol หมายถึงอะไรก็ตามที่ blog post ล่าสุดพูด ตอนนี้มันหมายถึงวันที่

แสดงรายละเอียด

Extensions ซึ่งเป็นส่วนที่ยังแทบไม่มีใครเขียนถึง

นอกเหนือจาก core แล้ว MCP นิยาม extensions แบบ optional — “always opt-in and require explicit support from both client and server” โดยประกาศผ่าน field extensions ใน capabilities ของ client และ server1 มีสามอย่างที่ควรรู้ชื่อ:

  • Tasks (io.modelcontextprotocol/tasks), ย้ายออกจาก core protocol ไปเป็น official extension ใน revision นี้: asynchronous execution สำหรับ long-running operations, polling ผ่าน tasks/get, mid-flight input ผ่าน tasks/update และ durable handles มันคือคำตอบของ tool ที่ใช้เวลายี่สิบนาที ซึ่งบทที่ 23 จัดการด้วย progress event และ signal ที่ไปถึง tool
  • Skills over MCP, working group ที่ทำให้ agent skills — หัวข้อของบทที่ 28 — discoverable และ consumable ผ่าน protocol
  • MCP Apps, interactive UI ที่ render inline ใน conversation: charts, forms, video players

และสังเกตว่า “negotiated” ตอนนี้หมายถึงอะไร: ไม่มี initialization ให้ negotiate แล้ว ดังนั้น extension จึงถูกประกาศต่อ request เหมือนทุกอย่าง

MCP อยู่ตรงไหน เมื่อเทียบกับทุกอย่างที่คนสับสนกับมัน

ลิงก์ไปยังส่วน: MCP อยู่ตรงไหน เมื่อเทียบกับทุกอย่างที่คนสับสนกับมัน

นี่คือคำศัพท์ของทั้ง block ในที่เดียว

มันคืออะไรใครคุยกับใครเมื่อไรจึงเป็นคำตอบ
API ธรรมดาinterface สำหรับ programโค้ดของคุณ ↔ serviceคุณกำลังเขียน caller คุณควบคุม schema, auth และ error handling และไม่มีปัญหา discovery ให้แก้
MCPprotocol สำหรับ expose tools, data และ templates ให้ AI applicationhost ↔ server, client หนึ่งตัวต่อหนึ่ง serverคนอื่นเขียน capability แล้ว และหลาย hosts ควรใช้ได้โดยไม่ต้องมี bespoke integration
RAGเทคนิคในการหา text แล้วใส่เข้า promptโค้ดของคุณ ↔ index ของคุณmodel ต้อง รู้ บางอย่าง บทที่ 19 MCP เป็นวิธีส่ง retriever; มันไม่ใช่ retriever
Agent skillsfolder ที่มี SKILL.md ซึ่ง model อ่านmodel ↔ documentความรู้เป็น procedural — เรา ทำสิ่งนี้อย่างไร — และเป็น prose ไม่ใช่ function บทที่ 28
A2Aprotocol ให้ agents ทำงานร่วมกันแบบ peersagent ↔ agentอีกฝั่ง reasoning, planning และถือ state ข้าม long task แทนที่จะตอบ call
ACPเคยเป็น agent-communication protocol แยกต่างหากมันไม่ใช่ comparison ที่ยัง live แล้ว ดูด้านล่าง

สองรายการในนั้นควรมีประโยคของตัวเอง เพราะเป็นจุดที่ความสับสนอยู่จริง

MCP เทียบกับ A2A ไม่ใช่ rivalry และทั้งสอง specification ก็พูดแบบนั้น A2A documentation ขีดเส้นด้วยสิ่งที่อยู่ปลายทางอีกฝั่ง: MCP “defines how an AI agent interacts with and utilizes individual tools and resources, such as a database or an API” โดย tool ทำ “specific, often stateless, functions”; A2A address agents ซึ่งเป็น “more autonomous systems” ที่ “reason, plan, use multiple tools, maintain state over longer interactions, and engage in complex, often multi-turn dialogues” summary ของมันเองคือประโยคที่ควรจำ: “A2A is about agents partnering on tasks, while MCP is more about agents using capabilities.”11 ทั้งสองซ้อนกันได้ — application ใช้ A2A เพื่อไปถึง agents อื่น และ agent แต่ละตัวใช้ MCP เพื่อไปถึง tools ของตัวเอง บทที่ 25 ขีดเส้นนั้นใน process เดียว ระหว่างการถาม sub-agent กับการส่ง conversation ให้มัน; A2A ขีดเส้นนั้นระหว่างองค์กร

MCP เทียบกับ ACP คือ comparison ที่ premise เก่าแล้ว ซึ่งเป็นเหตุผลที่ควรตอบ Agent Communication Protocol เคยเป็น open standard แยกสำหรับ agent-to-agent messaging documentation ของมันเองตอนนี้เปิดด้วย notice: “ACP is now part of A2A under the Linux Foundation!”12 คำตอบตรงไปตรงมาสำหรับ “MCP or ACP?” ในเดือนกันยายน 2026 คือคำถามนี้มี option น้อยกว่าที่หน้าที่ติดอันดับแนะนำอยู่หนึ่งตัว

และ comparison ที่คนถามมากที่สุด mcp vs api มีคำตอบที่น่าสนใจน้อยที่สุด: MCP คือ API สิ่งที่มันเพิ่มไม่ใช่พลัง แต่คือ conventions — ชุด method names คงที่, discovery call, control hierarchy เหนือ primitives และ isolation model คุณยอมเสียเสรีภาพในการออกแบบ interface เอง และได้ทุก host ที่พูด protocol นี้กลับมา ซึ่งเป็น trade ที่ทุก protocol เคยเสนอมาเสมอ

ตอนนี้คุณอ่าน specification ได้โดยไม่ต้องมีคนแปล แยก resource จาก tool จาก prompt ได้ด้วยการดูว่าใครคุมมัน พิมพ์ request เองได้เมื่อ client library โกหกคุณ และลงวันที่บทความ MCP ใด ๆ ที่อ่านได้จาก deprecated features ที่มันยังสอนว่าเป็นของปัจจุบัน

สิ่งที่คุณยังไม่ได้ทำคือ ship server หนึ่งตัว บทที่ 27 เขียน server เดียวกันสองครั้ง — TypeScript และ Python วางคู่กัน เพราะ MCP เป็นพื้นที่ที่ bilingual จริง ๆ หนึ่งเดียวในคอร์สนี้ และตัวเลขบอกเช่นนั้นทั้งสองทาง บทนั้นครอบคลุม live transports ทั้งสองอย่างให้ถูกต้อง, inspector, packaging และอีกครึ่งของ protocol ที่บทนี้ตั้งใจเว้นไว้: authorization เพราะทันทีที่ server ของคุณเป็น remote แทนที่จะเป็น subprocess บน laptop ของคุณเอง client ของคนแปลกหน้าจะยื่น token มา และกฎของ specification ว่าคุณทำอะไรกับมันได้บ้างนั้นเข้มผิดปกติ

ซึ่งนำไปสู่คำถามที่บทถัดไปต้องตอบ และมันไม่ใช่คำถามที่เป็นมิตร: หาก token มาถึง server ของคุณ และมันถูก issue ให้ audience ของคนอื่น อะไรกันแน่ที่หยุดคุณไม่ให้ forward มันต่อ


ทุก quotation, method name, error code และ rule ในบทนี้อ่านจาก Model Context Protocol specification, revision 2026-07-28, เมื่อ 7 กันยายน 2026 ทุก trace ผลิตขึ้น locally บน Node 22: toy calendar server ยาว 101 บรรทัด ไม่มี dependency และ reference server คือ npm package ที่เผยแพร่ตามชื่อด้านล่าง ไม่มี paid API ถูก call เพื่อเขียนบทนี้ — ไม่มีอะไรในนี้ต้องใช้ model ซึ่งในตัวมันเองก็คือประเด็น

Measurements: @modelcontextprotocol/server-everything@2026.8.31, เผยแพร่ 31 สิงหาคม 2026, built on @modelcontextprotocol/sdk@1.30.0, เผยแพร่ 27 กรกฎาคม 2026 — หนึ่งวันก่อน revision ที่บทนี้อธิบาย มันตอบ server/discover ด้วย -32601, negotiate 2025-11-25 เมื่อถูกขอ 2026-07-28 และ serve tools/list โดยไม่มี handshake เลย catalogue ของมันคือ 13 tools ใน 7,663 bytes; token counts คือ o200k_base ผ่าน tiktoken บน name, description และ inputSchema ของแต่ละ definition ซึ่งเป็นสิ่งที่ provider render เข้า prompt ของคุณ ไม่ใช่น้ำหนักของ JSON-RPC frame

Anthropic, Code execution with MCP: building more efficient agents, 4 November 2025, คือแหล่งที่มาของตัวเลข 150,000-to-2,000 ที่ quote และใช้ในบทที่ 24 และเพียง reference ที่นี่

  1. Specification, modelcontextprotocol.io/specification/latest (redirect ไป /2026-07-28), อ่าน 7 กันยายน 2026 แหล่งที่มาของการเปรียบเทียบกับ Language Server Protocol; ข้อความที่ว่า specification “based on the TypeScript schema in schema.ts”; summary ของ base-protocol (“Stateless, self-contained requests”, “Per-request capability negotiation”); extension list (Tasks, Skills over MCP, MCP Apps) และ statement ว่า extensions “are always opt-in and require explicit support from both client and server”; และ Security and Trust & Safety principles รวมถึง “Hosts must obtain explicit user consent before invoking any tool” และการปฏิบัติต่อ tool annotations ว่า untrusted 2 3

  2. Base Protocol, modelcontextprotocol.io/specification/2026-07-28/basic แหล่งที่มาของ JSON-RPC constraints (non-null id, no id reuse, required resultType); section Statelessness และ note ว่า open stdio process ไม่ใช่ session; reserved-key table ของ _meta และสถานะ required/optional ของแต่ละ per-request field; กฎ -32602 สำหรับ required field ที่หายไป; กฎ MissingRequiredClientCapability (-32021); และ error-code allocation policy 2 3 4 5

  3. stdio transport, modelcontextprotocol.io/specification/2026-07-28/basic/transports/stdio แหล่งที่มาของ newline-delimited framing rules, requirement ความบริสุทธิ์ของ stdout, allowance ของ stderr และ backward-compatibility probe แบบสาม outcome — รวมถึง warning ว่า legacy servers บางตัว process era-ambiguous methods โดยไม่มี handshake ซึ่ง measurement ในบทนี้ reproduce 2 3

  4. Transports overview, modelcontextprotocol.io/specification/2026-07-28/basic/transports แหล่งที่มาของ framing ว่า “a transport is a binding” และ statement ว่า servers ไม่ initiate JSON-RPC requests และ clients ไม่ส่ง JSON-RPC responses 2

  5. Discovery, modelcontextprotocol.io/specification/2026-07-28/server/discover แหล่งที่มาของสถานะ mandatory ของ server/discover, shape ของ DiscoverResult และ field instructions ที่อธิบายว่า “optional natural-language guidance for LLMs on how to use this server effectively”

  6. Architecture, modelcontextprotocol.io/specification/2026-07-28/architecture แหล่งที่มาของ definitions ของ host/client/server, กฎ client-to-server แบบ 1:1, design principles สี่ข้อ ซึ่ง isolation principle ถูก quote ที่นี่โดยไม่รวม bullet ที่ห้า “Host process enforces security boundaries” และ section capability-negotiation 2

  7. Elicitation, .../client/elicitation, และ Sampling, .../client/sampling แหล่งที่มาของ elicitation modes สองแบบและ restricted schema ของมัน; ข้อห้ามในการขอ credentials ผ่าน form mode; definition ของ sampling, requirement human-in-the-loop ของมัน และ deprecation warning ที่แนบมากับมัน

  8. Key Changes, modelcontextprotocol.io/specification/2026-07-28/changelog, และ Feature lifecycle and deprecation policy, .../community/feature-lifecycle แหล่งที่มาของทุกแถวใน change table: removal of sessions และ header Mcp-Session-Id (SEP-2567); statelessness และ removal of initialize (SEP-2575); server/discover (SEP-2575); subscriptions/listen (SEP-2575); Multi Round-Trip Requests และ resultType (SEP-2322); removal of stream resumability (SEP-2575); deprecation ของ Roots, Sampling และ Logging (SEP-2577); reclassification ของ HTTP+SSE (SEP-2596); deprecation ของ Dynamic Client Registration เพื่อใช้ Client ID Metadata Documents; error-code renumbering; และ deprecation window สิบสองเดือน 2

  9. Tools, modelcontextprotocol.io/specification/2026-07-28/server/tools, และ Server Features, .../server แหล่งที่มาของ control-hierarchy table ที่ reproduce ข้างบน; shapes ของ tools/list และ tools/call; distinction ของ isError ระหว่าง protocol errors กับ tool execution errors; tool-name rules และ namespace note ที่แนะนำ “prefixing tool names with a server identifier”; และ guidance แบบ non-normative “Stateful Tools” เรื่อง explicit handles

  10. Versioning, modelcontextprotocol.io/specification/versioning แหล่งที่มาของ scheme YYYY-MM-DD, revision states Draft/Current/Final, confirmation ว่า 2026-07-28 เป็น current และ per-request negotiation rules ตาราง SDK tier ที่ modelcontextprotocol.io/docs/sdk list TypeScript, Python, C#, Go และ Rust ที่ Tier 1, Java และ Ruby ที่ Tier 2, และ Swift, PHP และ Kotlin ที่ Tier 3

  11. A2A Protocol, version 1.0.0, a2a-protocol.org — specification และหน้า A2A and MCP: Relationship and Distinction, อ่าน 7 กันยายน 2026 แหล่งที่มาของ distinction tools-against-agents, statement ว่า protocol ทั้งสอง “address distinct but highly complementary needs” และ formulation partnering/using

  12. Agent Communication Protocol, agentcommunicationprotocol.dev, อ่าน 7 กันยายน 2026: “ACP is now part of A2A under the Linux Foundation!”, banner ที่เพิ่มเหนือ specification ซึ่งยังถูก serve ทั้งฉบับ — architecture, agent manifest, agent discovery, message structure, stateful agents, run lifecycle และ REST endpoint list ทั้งหมดยังตอบ 200 specification ไม่ได้หายไป; project ต่างหากที่หายไป


สร้างโดย

David Vicente Campos

ผู้ก่อตั้ง NeuraLIA Labs และผู้ร่วมก่อตั้ง MyRealFood

ผมเป็นวิศวกรคอมพิวเตอร์ที่จบจากมหาวิทยาลัยเลออน ผมร่วมก่อตั้ง MyRealFood ที่ที่ผมในฐานะ CTO ได้สร้างแอปซึ่งผู้คนหลายล้านคนใช้เพื่อกินให้ดีขึ้น และผมก่อตั้ง NeuraLIA Labs ที่ที่ผมสร้างผลิตภัณฑ์ AI ที่นี่ผมเขียนถึงสิ่งที่ผมต้องทำความเข้าใจระหว่างทาง ในแบบที่ผมเคยหวังว่าจะมีใครสักคนอธิบายให้ผมฟัง

เพิ่มเติมเกี่ยวกับผู้เขียน

เผยแพร่โดย NeuraLIA Labs

รับโพสต์ใหม่ในกล่องจดหมาย

ข่าว AI คู่มือ และอัปเดตผลิตภัณฑ์ — อีเมลสั้น ๆ เมื่อเรามีสิ่งที่คุ้มเวลาของคุณ

ชอบแบบข้อความมากกว่าไหม รับเนื้อหาเดียวกันได้ที่นี่:คอมมูนิตี้ WhatsApp (เปิดในแท็บใหม่)ช่อง Telegram (เปิดในแท็บใหม่)

ดัชนีคอร์ส

Abstract software decision engine with branching paths, probability nodes, and glowing gates.
jevอ่าน 5 นาที

โมเดล AI Jev สร้างมาเพื่อการตัดสินใจ ไม่ใช่การเขียนความเรียง

Jev ของ TypeSafe AI กำลังได้รับความสนใจ เพราะมองความฉลาดของซอฟต์แวร์เป็นปัญหาความน่าจะเป็น: เลือกกิ่งที่ถูกต้อง แนบความมั่นใจ และหลีกเลี่ยงการจ่ายเงินให้ LLM เขียนข้อความเมื่อโค้ดต้องการการตัดสินใจ

Abstract legal research workspace with documents, search nodes and governance controls.
openaiอ่าน 4 นาที

Astra for Law ของ OpenAI คือระบบ AI ด้านกฎหมาย ไม่ใช่โมเดลใหม่

การเปิดตัวด้านกฎหมายของ OpenAI ไม่ได้เน้นโมเดลฐานรากใหม่เท่ากับระบบที่ล้อมรอบโมเดลนั้น: การค้นคืนเฉพาะโดเมน เครื่องมือที่เชื่อถือได้ สิทธิ์ เบนช์มาร์ก และเส้นทางการตรวจทาน

Abstract agent runtime sorting documents, memory blocks and pointer nodes inside a bounded context frame.
context-engineeringอ่าน 4 นาที

วิศวกรรมบริบทสำหรับเอเจนต์ AI ที่ทำงานระยะยาว

เอเจนต์ที่ทำงานต่อเนื่องไม่ได้ล้มเหลวเพียงเพราะหน้าต่างบริบทเล็กเกินไป แต่ล้มเหลวเมื่อไฟล์ ผลลัพธ์จากเครื่องมือ และประวัติที่ค้างเก่าบดบังงานที่เอเจนต์ควรทำให้เสร็จ

พร้อมให้ LIA เลือกโมเดลให้แล้วหรือยัง?

สร้างงานด้วยโมเดล AI ทุกตัวในที่เดียว เริ่มฟรีวันนี้