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.
Kể 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.
Tại Sao MCP Tồn Tại
Trướ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.
Đ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.
MCP 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:
Các Khái Niệm Cốt Lõi
MCP có ba nguyên thủy cơ bản:
1. Công Cụ (Tools)
Cô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ố.
{ name: "create_issue", description: "Create a new GitHub issue", inputSchema: { type: "object", properties: { title: { type: "string", description: "Issue title" }, body: { type: "string", description: "Issue body" }, repo: { type: "string", description: "Repository name" } }, required: ["title", "repo"] } }
2. Tài Nguyên (Resources)
Tà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.
{ uri: "file:///Users/dev/project/README.md", name: "Project README", mimeType: "text/markdown" }
3. Lời Nhắc (Prompts)
Lờ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.
{ name: "code_review", description: "Review code changes for quality and security", arguments: [ { name: "diff", description: "The code diff to review", required: true } ] }
Kiến Trúc
MCP tuân theo kiến trúc máy khách-máy chủ:
- Host: Ứng dụng AI (Claude Desktop, Cursor, ứng dụng tùy chỉnh của bạn)
- Client: Duy trì kết nối 1:1 với máy chủ MCP
- Server: Cung cấp công cụ, tài nguyên và lời nhắc cho máy khách
- 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)
Xây Dựng Máy Chủ MCP
Hã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.
Cài Đặt
mkdir mcp-todo-server && cd mcp-todo-server npm init -y npm install @modelcontextprotocol/sdk zod
Triển Khai Máy Chủ
// src/index.ts import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { z } from "zod"; import fs from "fs"; const TODO_FILE = "./todos.json"; function readTodos(): { id: number; text: string; done: boolean }[] { if (!fs.existsSync(TODO_FILE)) return []; return JSON.parse(fs.readFileSync(TODO_FILE, "utf-8")); } function writeTodos(todos: { id: number; text: string; done: boolean }[]) { fs.writeFileSync(TODO_FILE, JSON.stringify(todos, null, 2)); } const server = new McpServer({ name: "todo-server", version: "1.0.0", }); // Tool: Add a todo server.tool( "add_todo", "Add a new todo item", { text: z.string().describe("The todo text") }, async ({ text }) => { const todos = readTodos(); const newTodo = { id: Date.now(), text, done: false }; todos.push(newTodo); writeTodos(todos); return { content: [{ type: "text", text: `Added: "${text}"` }] }; } ); // Tool: List todos server.tool( "list_todos", "List all todo items", {}, async () => { const todos = readTodos(); const list = todos .map((t) => `${t.done ? "✅" : "⬜"} [${t.id}] ${t.text}`) .join("\n"); return { content: [{ type: "text", text: list || "No todos yet." }] }; } ); // Tool: Complete a todo server.tool( "complete_todo", "Mark a todo as completed", { id: z.number().describe("The todo ID to complete") }, async ({ id }) => { const todos = readTodos(); const todo = todos.find((t) => t.id === id); if (!todo) return { content: [{ type: "text", text: "Todo not found." }] }; todo.done = true; writeTodos(todos); return { content: [{ type: "text", text: `Completed: "${todo.text}"` }] }; } ); // Resource: Current todos as a readable resource server.resource( "todos://list", "Current todo list", async () => ({ contents: [{ uri: "todos://list", mimeType: "application/json", text: JSON.stringify(readTodos(), null, 2), }], }) ); // Start the server const transport = new StdioServerTransport(); await server.connect(transport);
Cấu Hình
Để sử dụng máy chủ này với Claude Desktop, thêm nó vào cấu hình:
{ "mcpServers": { "todo": { "command": "npx", "args": ["tsx", "/path/to/mcp-todo-server/src/index.ts"] } } }
Xây Dựng Máy Khách MCP
Bạ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:
import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js"; const transport = new StdioClientTransport({ command: "npx", args: ["tsx", "./src/index.ts"], }); const client = new Client({ name: "my-client", version: "1.0.0" }); await client.connect(transport); // List available tools const { tools } = await client.listTools(); console.log("Available tools:", tools.map((t) => t.name)); // Call a tool const result = await client.callTool({ name: "add_todo", arguments: { text: "Write MCP blog post" }, }); console.log(result);
Các Máy Chủ MCP Phổ Biến
Hệ 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:
| Máy Chủ | Mô Tả | Trường Hợp Sử Dụng |
|---|---|---|
| GitHub | Tạo issue, PR, quản lý repo | Quy trình phát triển |
| Slack | Gửi tin nhắn, quản lý kênh | Giao tiếp nhóm |
| PostgreSQL | Truy vấn và quản lý cơ sở dữ liệu | Truy cập dữ liệu |
| Filesystem | Đọc, ghi và tìm kiếm tệp | Phát triển cục bộ |
| Puppeteer | Tự động hóa trình duyệt và thu thập dữ liệu | Kiểm thử web |
| Sentry | Giám sát lỗi và gỡ lỗi | Hỗ trợ sản xuất |
| Supabase | Cơ sở dữ liệu, xác thực, lưu trữ | Vận hành backend |
MCP so với A2A (Agent-to-Agent)
Trong 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:
- MCP: Cách tác tử AI sử dụng công cụ (tích hợp dọc)
- A2A: Cách các tác tử AI hợp tác với nhau (tích hợp ngang)
Các Thực Hành Tốt Nhất
- 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.
- 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.
- 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.
- 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ụ.
- 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ụ.
- 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.
Bắt Đầu
# Create a new MCP server from template npx @modelcontextprotocol/create-server my-server # Test with the MCP Inspector npx @modelcontextprotocol/inspector npx tsx ./src/index.ts
Kết Luận
MCP đã 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.
Bước tiếp theo:
- Khám phá Đặc tả MCP
- Duyệt các máy chủ MCP hiện có để lấy cảm hứng
- Xây dựng máy chủ đầu tiên với TypeScript hoặc Python SDK
- Kiểm thử với Claude Desktop hoặc MCP Inspector