spinny:~/writing $ less mcp-model-context-protocol-guide.md
12**Model Context Protocol (MCP)** là một tiêu chuẩn mở được tạo bởi Anthropic, định nghĩa cách các mô hình AI giao tiếp với công cụ bên ngoài, nguồn dữ liệu và dịch vụ. Hãy coi nó như "USB-C của AI" - một đầu nối phổ quát cho phép bất kỳ tác tử AI nào giao tiếp với bất kỳ công cụ nào thông qua giao diện chuẩn hóa.34Kể từ khi ra mắt, MCP đã vượt qua **97 triệu lượt tải SDK hàng tháng** và đã được tất cả các nhà cung cấp AI lớn áp dụng: Anthropic, OpenAI, Google, Microsoft và Amazon. Trong hướng dẫn này, chúng ta sẽ khám phá mọi thứ bạn cần biết để xây dựng với MCP.56## Tại Sao MCP Tồn Tại78Trước MCP, mỗi ứng dụng AI phải xây dựng tích hợp tùy chỉnh cho mỗi công cụ muốn sử dụng. Muốn AI đọc tệp? Viết mã tùy chỉnh. Truy vấn cơ sở dữ liệu? Thêm mã tùy chỉnh. Đăng lên Slack? Thêm một tích hợp nữa.910Điều này tạo ra **vấn đề N×M**: N ứng dụng AI mỗi cái cần M tích hợp tùy chỉnh, dẫn đến nỗ lực trùng lặp và hệ sinh thái phân mảnh.1112```mermaid13graph TD14 subgraph "Before MCP (N×M)"15 A1[AI App 1] --> T1[GitHub Integration]16 A1 --> T2[Slack Integration]17 A1 --> T3[DB Integration]18 A2[AI App 2] --> T4[GitHub Integration]19 A2 --> T5[Slack Integration]20 A2 --> T6[DB Integration]21 end22```2324MCP giải quyết điều này bằng **một giao thức duy nhất** mà bất kỳ máy khách AI nào cũng có thể sử dụng để giao tiếp với bất kỳ máy chủ MCP nào:2526```mermaid27graph TD28 subgraph "With MCP (N+M)"29 A1[AI App 1] --> MCP[MCP Protocol]30 A2[AI App 2] --> MCP31 MCP --> S1[GitHub Server]32 MCP --> S2[Slack Server]33 MCP --> S3[DB Server]34 end35```3637## Các Khái Niệm Cốt Lõi3839MCP có ba nguyên thủy cơ bản:4041### 1. Công Cụ (Tools)42Công cụ là các hàm mà AI có thể gọi. Chúng đại diện cho các hành động như "tạo tệp", "truy vấn cơ sở dữ liệu" hoặc "gửi tin nhắn". Mỗi công cụ có tên, mô tả và JSON Schema cho các tham số.4344```typescript45{46 name: "create_issue",47 description: "Create a new GitHub issue",48 inputSchema: {49 type: "object",50 properties: {51 title: { type: "string", description: "Issue title" },52 body: { type: "string", description: "Issue body" },53 repo: { type: "string", description: "Repository name" }54 },55 required: ["title", "repo"]56 }57}58```5960### 2. Tài Nguyên (Resources)61Tài nguyên là dữ liệu mà AI có thể đọc. Chúng đại diện cho tệp, bản ghi cơ sở dữ liệu, phản hồi API hoặc bất kỳ nguồn dữ liệu nào khác. Tài nguyên được xác định bằng URI.6263```typescript64{65 uri: "file:///Users/dev/project/README.md",66 name: "Project README",67 mimeType: "text/markdown"68}69```7071### 3. Lời Nhắc (Prompts)72Lời nhắc là các mẫu có thể tái sử dụng giúp cấu trúc hóa các tương tác. Chúng có thể bao gồm tham số động và hữu ích cho việc chuẩn hóa các quy trình công việc phổ biến.7374```typescript75{76 name: "code_review",77 description: "Review code changes for quality and security",78 arguments: [79 { name: "diff", description: "The code diff to review", required: true }80 ]81}82```8384## Kiến Trúc8586MCP tuân theo kiến trúc máy khách-máy chủ:8788```mermaid89graph LR90 subgraph "Host Application"91 Client[MCP Client]92 end9394 subgraph "MCP Server"95 Server[Server Process]96 Server --> Tools[Tools]97 Server --> Resources[Resources]98 Server --> Prompts[Prompts]99 end100101 Client -- "JSON-RPC 2.0\n(stdio or SSE)" --> Server102```103104- **Host**: Ứng dụng AI (Claude Desktop, Cursor, ứng dụng tùy chỉnh của bạn)105- **Client**: Duy trì kết nối 1:1 với máy chủ MCP106- **Server**: Cung cấp công cụ, tài nguyên và lời nhắc cho máy khách107- **Transport**: Giao tiếp diễn ra qua JSON-RPC 2.0 trên stdio (cục bộ) hoặc Server-Sent Events (từ xa)108109## Xây Dựng Máy Chủ MCP110111Hãy xây dựng một máy chủ MCP thực tế tương tác với danh sách việc cần làm được lưu trong tệp JSON.112113### Cài Đặt114115```bash116mkdir mcp-todo-server && cd mcp-todo-server117npm init -y118npm install @modelcontextprotocol/sdk zod119```120121### Triển Khai Máy Chủ122123```typescript124// src/index.ts125import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";126import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";127import { z } from "zod";128import fs from "fs";129130const TODO_FILE = "./todos.json";131132function readTodos(): { id: number; text: string; done: boolean }[] {133 if (!fs.existsSync(TODO_FILE)) return [];134 return JSON.parse(fs.readFileSync(TODO_FILE, "utf-8"));135}136137function writeTodos(todos: { id: number; text: string; done: boolean }[]) {138 fs.writeFileSync(TODO_FILE, JSON.stringify(todos, null, 2));139}140141const server = new McpServer({142 name: "todo-server",143 version: "1.0.0",144});145146// Tool: Add a todo147server.tool(148 "add_todo",149 "Add a new todo item",150 { text: z.string().describe("The todo text") },151 async ({ text }) => {152 const todos = readTodos();153 const newTodo = { id: Date.now(), text, done: false };154 todos.push(newTodo);155 writeTodos(todos);156 return { content: [{ type: "text", text: `Added: "${text}"` }] };157 }158);159160// Tool: List todos161server.tool(162 "list_todos",163 "List all todo items",164 {},165 async () => {166 const todos = readTodos();167 const list = todos168 .map((t) => `${t.done ? "✅" : "⬜"} [${t.id}] ${t.text}`)169 .join("\n");170 return { content: [{ type: "text", text: list || "No todos yet." }] };171 }172);173174// Tool: Complete a todo175server.tool(176 "complete_todo",177 "Mark a todo as completed",178 { id: z.number().describe("The todo ID to complete") },179 async ({ id }) => {180 const todos = readTodos();181 const todo = todos.find((t) => t.id === id);182 if (!todo) return { content: [{ type: "text", text: "Todo not found." }] };183 todo.done = true;184 writeTodos(todos);185 return { content: [{ type: "text", text: `Completed: "${todo.text}"` }] };186 }187);188189// Resource: Current todos as a readable resource190server.resource(191 "todos://list",192 "Current todo list",193 async () => ({194 contents: [{195 uri: "todos://list",196 mimeType: "application/json",197 text: JSON.stringify(readTodos(), null, 2),198 }],199 })200);201202// Start the server203const transport = new StdioServerTransport();204await server.connect(transport);205```206207### Cấu Hình208209Để sử dụng máy chủ này với Claude Desktop, thêm nó vào cấu hình:210211```json212{213 "mcpServers": {214 "todo": {215 "command": "npx",216 "args": ["tsx", "/path/to/mcp-todo-server/src/index.ts"]217 }218 }219}220```221222## Xây Dựng Máy Khách MCP223224Bạn cũng có thể xây dựng máy khách tùy chỉnh kết nối với bất kỳ máy chủ MCP nào:225226```typescript227import { Client } from "@modelcontextprotocol/sdk/client/index.js";228import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";229230const transport = new StdioClientTransport({231 command: "npx",232 args: ["tsx", "./src/index.ts"],233});234235const client = new Client({ name: "my-client", version: "1.0.0" });236await client.connect(transport);237238// List available tools239const { tools } = await client.listTools();240console.log("Available tools:", tools.map((t) => t.name));241242// Call a tool243const result = await client.callTool({244 name: "add_todo",245 arguments: { text: "Write MCP blog post" },246});247console.log(result);248```249250## Các Máy Chủ MCP Phổ Biến251252Hệ sinh thái MCP đã phát triển nhanh chóng. Dưới đây là một số máy chủ phổ biến nhất:253254| Máy Chủ | Mô Tả | Trường Hợp Sử Dụng |255|---------|--------|---------------------|256| **GitHub** | Tạo issue, PR, quản lý repo | Quy trình phát triển |257| **Slack** | Gửi tin nhắn, quản lý kênh | Giao tiếp nhóm |258| **PostgreSQL** | Truy vấn và quản lý cơ sở dữ liệu | Truy cập dữ liệu |259| **Filesystem** | Đọc, ghi và tìm kiếm tệp | Phát triển cục bộ |260| **Puppeteer** | Tự động hóa trình duyệt và thu thập dữ liệu | Kiểm thử web |261| **Sentry** | Giám sát lỗi và gỡ lỗi | Hỗ trợ sản xuất |262| **Supabase** | Cơ sở dữ liệu, xác thực, lưu trữ | Vận hành backend |263264## MCP so với A2A (Agent-to-Agent)265266Trong khi MCP xử lý giao tiếp **tác tử-công cụ**, giao thức **A2A (Agent-to-Agent)** của Google xử lý giao tiếp **tác tử-tác tử**. Chúng bổ sung cho nhau:267268```mermaid269graph TD270 Agent1[Agent 1] -- "A2A Protocol" --> Agent2[Agent 2]271 Agent1 -- "MCP Protocol" --> Tool1[GitHub MCP Server]272 Agent2 -- "MCP Protocol" --> Tool2[Database MCP Server]273```274275- **MCP**: Cách tác tử AI sử dụng công cụ (tích hợp dọc)276- **A2A**: Cách các tác tử AI hợp tác với nhau (tích hợp ngang)277278## Các Thực Hành Tốt Nhất2792801. **Giữ máy chủ tập trung**: Một máy chủ cho mỗi lĩnh vực (máy chủ GitHub, máy chủ Slack, v.v.). Không xây dựng máy chủ nguyên khối.2812. **Xác thực đầu vào với Zod**: Luôn xác thực đầu vào công cụ với schema phù hợp.2823. **Xử lý lỗi một cách duyên dáng**: Trả về thông báo lỗi có ý nghĩa, không phải stack trace.2834. **Sử dụng tài nguyên cho dữ liệu chỉ đọc**: Nếu AI chỉ cần đọc dữ liệu, hãy cung cấp nó dưới dạng tài nguyên thay vì công cụ.2845. **Thêm mô tả phù hợp**: Mô tả công cụ và tham số tốt giúp AI hiểu khi nào và cách sử dụng mỗi công cụ.2856. **Kiểm thử với MCP Inspector**: Sử dụng `npx @modelcontextprotocol/inspector` để kiểm thử máy chủ một cách tương tác.286287## Bắt Đầu288289```bash290# Create a new MCP server from template291npx @modelcontextprotocol/create-server my-server292293# Test with the MCP Inspector294npx @modelcontextprotocol/inspector npx tsx ./src/index.ts295```296297## Kết Luận298299MCP đã trở thành tiêu chuẩn thực tế cho việc sử dụng công cụ AI vào năm 2026. Dù bạn đang xây dựng tác tử AI tùy chỉnh, mở rộng Claude Code hay tạo tích hợp cho các nền tảng hiện có, hiểu MCP là điều cần thiết. Giao thức đủ đơn giản để học trong một buổi chiều nhưng đủ mạnh mẽ để xây dựng quy trình làm việc AI cấp sản xuất.300301**Bước tiếp theo:**302- Khám phá [Đặc tả MCP](https://spec.modelcontextprotocol.io/)303- Duyệt [các máy chủ MCP hiện có](https://github.com/modelcontextprotocol/servers) để lấy cảm hứng304- Xây dựng máy chủ đầu tiên với TypeScript hoặc Python SDK305- Kiểm thử với Claude Desktop hoặc MCP Inspector306
:MCP (Model Context Protocol): Hướng Dẫn Toàn Diện cho Lập Trình Viênlines 1-306 (END) — press q to close