---
title: "MCP là gì? Model Context Protocol và cách tạo MCP server"
description: "MCP (Model Context Protocol) là chuẩn mở nối app AI với dữ liệu và tool. Bài giải thích host, client, server và cách tạo MCP server trên Cloudflare Workers."
canonical: "https://200lab.io/blog/model-context-protocol-mcp-la-gi"
published: "2025-02-23T07:35:54Z"
updated: "2026-10-31T01:37:49Z"
authors: ["Việt Trần"]
tags: ["AI"]
reading_minutes: 12
access: "public"
---

Ngày 25/11/2024, Anthropic công bố và mở mã nguồn Model Context Protocol (MCP) trong [bài công bố của Anthropic](https://www.anthropic.com/news/model-context-protocol), kèm theo bộ spec, SDK và kho server mẫu cho Google Drive, Slack, GitHub, Git, Postgres hay Puppeteer. Hai đơn vị dùng sớm từ thời điểm đó là Block và Apollo.

Tài liệu chính thức ví MCP như cổng USB-C cho các app AI: giống như USB-C chuẩn hóa cách cắm thiết bị ngoại vi, MCP chuẩn hóa cách app AI kết nối với hệ thống bên ngoài. Bài viết này sẽ giải thích MCP là gì, kiến trúc hoạt động ra sao, sau đó hướng dẫn bạn dựng một MCP server remote trên Cloudflare Workers theo cách làm hiện tại.

> Cập nhật 10/2026: bài viết lần đầu ngày 23/02/2025. Bản này sửa lại ngày ra mắt MCP (25/11/2024), viết lại phần hướng dẫn theo template mới của Cloudflare (Streamable HTTP thay cho workers-mcp và Claude Desktop) và cập nhật theo spec MCP 2026-07-28.

## MCP là gì? Định nghĩa Model Context Protocol

Theo [tài liệu giới thiệu Model Context Protocol](https://modelcontextprotocol.io/docs/getting-started/intro), MCP là một chuẩn mã nguồn mở giúp kết nối các app AI với hệ thống bên ngoài. Nhờ chuẩn này, các app như Claude hay ChatGPT có thể nối tới nguồn dữ liệu (file local, database), tool (search engine, máy tính) và workflow (các prompt chuyên biệt).

Trước đây, mỗi app AI phải tự viết riêng từng phần tích hợp cho từng nguồn dữ liệu hoặc service. MCP đưa ra một chuẩn chung để dev chỉ cần viết MCP server một lần, sau đó bất kỳ app nào hỗ trợ chuẩn này đều kết nối vào dùng được.

Trong thực tế, bạn có thể dùng MCP để cho agent truy cập Google Calendar và Notion, để Claude Code tạo web app từ bản thiết kế Figma, hoặc làm chatbot doanh nghiệp nối nhiều database để phân tích dữ liệu qua giao diện chat. Hiện tại, MCP đã được hỗ trợ bởi Claude, ChatGPT, Visual Studio Code, Cursor và nhiều MCP client khác.

## Kiến trúc MCP: host, client và server

Theo [tài liệu spec của MCP](https://modelcontextprotocol.io/specification/latest), giao thức này truyền thông điệp bằng định dạng JSON-RPC 2.0 và chia hệ thống thành ba vai trò: host, client và server. Host là app AI khởi tạo kết nối, ví dụ như Claude Code hay Cursor mà bạn mở trên máy tính.

Bên trong mỗi host có các MCP client, là bộ kết nối. Mỗi MCP client giữ kết nối với một MCP server, còn MCP server là service đứng phía sau cung cấp ngữ cảnh và khả năng xử lý cho model.

![Sơ đồ kiến trúc MCP bản gốc năm 2024: host chứa MCP client, nối tới nhiều MCP server](https://assets.200lab.io/images/2025/02/23/mcp-architecture-9a2750c9b718faea1413.webp)

Sơ đồ trên là bản vẽ gốc từ năm 2024, thời điểm các MCP server chủ yếu chạy ngay trên máy tính của người dùng. Hiện nay, MCP server đã có thể chạy remote trên cloud như ví dụ ở phần hướng dẫn bên dưới.

### Tool, resource và prompt trong MCP server

Một MCP server có thể cung cấp ba thành phần chính sau, kèm theo một cơ chế ở phía client:

- Tool: các hàm để model gọi khi cần thực hiện một việc cụ thể.
- Resource: ngữ cảnh và dữ liệu cung cấp cho người dùng hoặc cho model đọc.
- Prompt: các message và workflow được đóng gói sẵn dưới dạng mẫu.
- Elicitation (nằm ở phía MCP client): cơ chế để server hỏi xin thêm thông tin từ người dùng khi đang chạy.

Trong ba thành phần của server, tool là thứ bạn sẽ bắt gặp thường xuyên nhất khi làm việc với MCP. Về nguyên tắc an toàn, spec quy định người dùng phải đồng ý trước khi cho phép truy cập dữ liệu cũng như trước khi model gọi bất kỳ tool nào.

### stdio và Streamable HTTP: MCP server local hay remote

MCP định nghĩa hai cơ chế truyền tải (transport) chuẩn là stdio và Streamable HTTP. Với stdio, MCP server chạy ngay trên máy local: MCP client sẽ bật server lên như một process con và trao đổi message theo từng dòng qua luồng stdin/stdout.

Với Streamable HTTP (ra đời tháng 3/2025), MCP server chạy ở dạng remote: mỗi message là một HTTP POST gửi tới một MCP endpoint, kết quả trả về có thể là JSON hoặc một luồng SSE tùy theo request. Kiểu transport SSE cũ trước đây nay đã bị đánh dấu deprecated.

Về xác thực, cơ chế authorization chỉ áp dụng cho transport HTTP, còn các server chạy qua stdio lấy credential từ môi trường trên máy. Ở bản spec hiện tại, mỗi request tự mang theo thông tin protocol version và capability của client, thay vì bắt buộc phải qua bước bắt tay initialize như các bản từ 2025-11-25 trở về trước.

## Hướng dẫn tạo MCP server trên Cloudflare Workers

Trong phần này, mình sẽ dùng template `remote-mcp-authless` để dựng một MCP server không yêu cầu đăng nhập, bám sát theo [hướng dẫn Build a Remote MCP server](https://developers.cloudflare.com/agents/model-context-protocol/guides/remote-mcp-server/) của Cloudflare. Bạn cần cài sẵn Node.js trên máy tính và có một tài khoản Cloudflare để chạy bước deploy. Mình có thói quen dùng `pnpm`, nếu bạn dùng `npm` thì chỉ cần đổi chữ `pnpm` trong câu lệnh thành `npm` là được.

### Bước 1: Tạo project từ template remote-mcp-authless

Bạn mở terminal và chạy lệnh dưới đây để khởi tạo project từ template của Cloudflare:

```bash
pnpm create cloudflare@latest remote-mcp-server-authless --template=cloudflare/ai/demos/remote-mcp-authless
cd remote-mcp-server-authless
```

Trong lúc chạy lệnh khởi tạo, công cụ dòng lệnh sẽ hỏi bạn vài câu cấu hình. Bạn lần lượt chọn No cho câu hỏi thêm file `AGENTS.md`, No cho việc khởi tạo git và No ở câu hỏi deploy ngay.

### Bước 2: Viết tool say_hello trong src/index.ts

Mở code trong template ra, bạn sẽ thấy có sẵn hai tool mẫu là `add` và `calculate`. Mình sẽ thay chúng bằng một tool `say_hello` đơn giản để giữ lại ý tưởng ví dụ chào hỏi từ bài viết cũ, giúp bạn dễ hình dung luồng chạy.

Bạn mở file `src/index.ts` và thay nội dung bằng đoạn code sau:

```ts
import { McpServer } from "@modelcontextprotocol/server";
import { createMcpHandler } from "agents/mcp/server";
import { z } from "zod";

function createServer() {
  const server = new McpServer({
    name: "My Hello MCP",
    version: "1.0.0",
  });

  server.registerTool(
    "say_hello",
    {
      description: "Chào người dùng theo tên",
      inputSchema: z.object({ name: z.string() }),
    },
    async ({ name }) => ({
      content: [{ type: "text", text: `Hello from an MCP Worker, ${name}!` }],
    }),
  );

  return server;
}

const handler = createMcpHandler(createServer);

export default {
  fetch(request: Request, env: Env, ctx: ExecutionContext) {
    return handler(request, env, ctx);
  },
} satisfies ExportedHandler<Env>;
```

Trong đoạn code trên, đối tượng `McpServer` dùng để khởi tạo thông tin tên và phiên bản của server. Hàm `registerTool` đăng ký tool `say_hello`, dùng thư viện `zod` ở `inputSchema` để quy định tham số đầu vào `name` là một chuỗi ký tự. Ở cuối file, hàm `createMcpHandler` bọc hàm khởi tạo server lại và trả về một handler dạng stateless theo chuẩn Streamable HTTP cho Cloudflare Worker.

### Bước 3: Chạy local và kiểm tra bằng MCP Inspector

Để bật server ở môi trường local, bạn chạy lệnh:

```bash
pnpm start
```

Khi server chạy lên, bạn hãy nhìn dòng chữ "Ready on" trên terminal để lấy đúng số port. Tài liệu của Cloudflare ghi port 8788, nhưng khi chạy thử bản cập nhật này ở máy local thì terminal của mình ra port 8787.

Tiếp theo, bạn mở một cửa sổ terminal khác và chạy công cụ MCP Inspector để kiểm tra:

```bash
npx @modelcontextprotocol/inspector@latest
```

Trên UI web của Inspector, bạn nhập địa chỉ `http://localhost:<port>/mcp` (thay đúng số port máy bạn), bấm nút Connect rồi bấm tiếp List Tools để xem danh sách tool. Nếu thích kiểm tra nhanh ngay trên terminal bằng chế độ CLI, bạn có thể gọi trực tiếp tool `say_hello` bằng lệnh sau:

```bash
npx @modelcontextprotocol/inspector@latest --cli http://localhost:8787/mcp \
  --transport http --method tools/call --tool-name say_hello --tool-arg name=Viet
```

Khi chạy thử bản cập nhật này ở máy local với tham số `name=Viet`, kết quả trả về trên terminal sẽ như sau:

```text
{
  "content": [
    {
      "type": "text",
      "text": "Hello from an MCP Worker, Viet!"
    }
  ]
}
```

### Bước 4: Deploy MCP server lên Cloudflare Workers

Theo hướng dẫn của Cloudflare, để đưa server lên chạy trên hạ tầng Cloudflare Workers, bạn dùng lệnh:

```bash
npx wrangler@latest deploy
```

Nếu đây là lần đầu bạn dùng `wrangler` trên máy tính, công cụ sẽ tự mở trình duyệt để bạn đăng nhập vào tài khoản Cloudflare. Trường hợp bạn đưa lệnh này vào chạy tự động trong hệ thống CI, bạn cần cấu hình biến môi trường `CLOUDFLARE_API_TOKEN` (lưu ý dùng API token chứ không phải API key).

Sau khi quá trình deploy kết thúc, MCP server của bạn sẽ hoạt động tại địa chỉ có dạng:

```text
https://remote-mcp-server-authless.your-account.workers.dev/mcp
```

### Bước 5: Kết nối MCP server với Claude Code

Cũng theo hướng dẫn từ Cloudflare, bạn có thể nối MCP server vừa deploy vào Claude Code bằng CLI như sau:

```bash
claude mcp add --transport http hello https://remote-mcp-server-authless.your-account.workers.dev/mcp
claude mcp list
```

Chạy xong hai lệnh trên, bạn có thể mở cuộc trò chuyện và yêu cầu Claude gọi thử tool chào hỏi vừa tạo. Với các app AI khác có hỗ trợ kết nối remote MCP server qua HTTP, bạn cũng điền URL có đuôi `/mcp` này vào phần cấu hình tương ứng của từng app.

### Thêm OAuth khi MCP server cần đăng nhập

Khi MCP server cần đọc hay ghi dữ liệu riêng của từng người dùng, bạn sẽ phải bật thêm cơ chế authorization. Theo [spec authorization của MCP](https://modelcontextprotocol.io/specification/latest/basic/authorization), việc phân quyền này là tùy chọn và chỉ dành cho các server giao tiếp qua HTTP.

Theo spec này, MCP server là một OAuth 2.1 resource server, còn MCP client là một OAuth 2.1 client. Khi client gửi một request chưa có token lên, server sẽ trả về mã lỗi HTTP 401 kèm theo header `WWW-Authenticate` trỏ tới Protected Resource Metadata để client tự tìm ra địa chỉ của authorization server.

Sau khi lấy được token, client phải đính kèm nó qua header `Authorization: Bearer <access-token>` trong mọi request HTTP gửi đi, không được đặt token nằm lộ trong query string của URL. Nếu triển khai trên nền tảng của Cloudflare, bạn có thể dùng thư viện Workers OAuth Provider (với hai thành phần `OAuthAuthorizationServer` và `OAuthResourceServer`) để dựng luồng đăng nhập này.

## Các mốc thay đổi của MCP từ 2024 đến 2026

Dưới đây là các cột mốc chính của giao thức này tính từ lúc ra mắt:

1. Ngày 25/11/2024: Anthropic công bố và mở mã nguồn giao thức MCP cùng bộ SDK và kho server mẫu.
2. Tháng 3/2025: Streamable HTTP ra đời cho các kết nối remote, thay cho kiểu transport SSE cũ (nay đã deprecated).
3. Ngày 9/12/2025: Theo [thông báo của Anthropic](https://www.anthropic.com/news/donating-the-model-context-protocol-and-establishing-of-the-agentic-ai-foundation), hãng đã tặng MCP cho Agentic AI Foundation (AAIF) thuộc Linux Foundation (do Anthropic, Block và OpenAI đồng sáng lập). Cách quản trị MCP giữ nguyên, maintainer vẫn quyết định hướng kỹ thuật. Lúc đó SDK MCP (Python, TypeScript) có hơn 97 triệu lượt tải mỗi tháng.
4. Bản spec 2026-07-28: Đây là phiên bản spec hiện tại, nơi mỗi request tự mang theo protocol version và capability của client thay vì dùng bước bắt tay initialize như các bản từ 2025-11-25 trở về trước.

Bản gốc của bài này viết hồi tháng 2/2025, lúc đó phần hướng dẫn còn dùng package cũ và phải cấu hình qua file JSON trên máy local. Tài liệu hiện tại của Cloudflare không còn hướng dẫn cách đó nữa mà dùng MCP server remote với Streamable HTTP như bạn vừa xem ở trên.

## Câu hỏi thường gặp về MCP

### MCP server là gì?

MCP server là chương trình cung cấp tool, resource và prompt cho app AI theo chuẩn Model Context Protocol. Server có thể chạy trên máy người dùng qua stdio hoặc chạy remote qua Streamable HTTP, như ví dụ trên Cloudflare Workers ở trên.

### MCP trong AI dùng để làm gì?

MCP cho app AI một cách chung để nối vào dữ liệu và tool bên ngoài. Dev viết một MCP server là dùng được trong Claude, ChatGPT, VS Code hay Cursor, thay vì viết tích hợp riêng cho từng app.

### MCP trong Claude là gì?

MCP do Anthropic tạo ra, và Claude dùng MCP để nối model với tool bên ngoài; tính đến 12/2025, Claude có thư mục hơn 75 connector chạy bằng MCP. Trong Claude Code, bạn thêm một MCP server remote bằng lệnh `claude mcp add` như ở Bước 5.

### MCP khác gì AI agent?

Theo bài [AI Agent là gì](https://200lab.io/blog/ai-agent-la-gi) trên 200Lab, agent là hệ thống tự lập kế hoạch và quyết định gọi tool để đạt mục tiêu. MCP không phải agent mà là chuẩn ở tầng kết nối: agent là phần điều phối, còn MCP là cách chuẩn để cắm thêm tool và dữ liệu cho agent dùng.

## Học tiếp về MCP và AI agent

Theo mình, viết một MCP server cơ bản như trên không khó. Phần đáng nghĩ khi đưa vào hệ thống thật là cho agent gọi những tool nào, đặt guardrail ở đâu và kiểm tra kết quả sau mỗi lần gọi tool ra sao. Muốn đi sâu vào phần khung kiểm soát quanh model này, bạn có thể xem khóa [Agent Harness Foundations](https://200lab.io/courses/agent-harness-foundations) của 200Lab, trong đó có bài "MCP và A2A: lấy capability về dùng hay giao việc cho một Agent khác".

![Agent Harness Foundations](https://assets.200lab.io/sha256/7d/7d10dab27b878eeb97b71bf30112001ee144303e521c32d1aa20dd5466b2f6d8/generations/3b7588991172f063d96597212486357a0e018d60bec854c770c2a5546b206488)

- [Agent Harness Foundations](https://200lab.io/courses/agent-harness-foundations.md)

## Đọc thêm

- [Thử dùng Jev gánh việc chọn lọc mỗi sáng để Grok Bot đỡ tốn token](https://200lab.io/blog/jev-grok-bot-decisions.md): Jev của TypeSafe AI giúp Grok Bot chọn lọc và ra quyết định bằng JSON xác suất: lọc tin, phân loại tin nhắn khách, kiểm tra bản nháp, giảm token mỗi ngày.
- [Extension Claude Code giả mạo trên Cursor Marketplace: cách kiểm tra máy](https://200lab.io/blog/claude-code-extension-cursor-ssh-backdoor.md): Extension Claude Code giả mạo trên Cursor Marketplace cố cài backdoor SSH lên macOS, Windows. Gỡ extension thôi chưa đủ, phải kiểm tra key lạ trong máy.
- [Diagram Director: template Grok Bot vẽ sơ đồ system design có chuyển động](https://200lab.io/blog/grok-bot-diagram-director.md): Diagram Director là template Grok Bot vẽ sơ đồ system design có chuyển động; mọi con số phải nằm trong solution sheet trước khi dựng diagram.
- [Self Evolution: cách để Grok Bot tự cải tiến liên tục từ kinh nghiệm làm việc và người dùng](https://200lab.io/blog/grok-bot-self-evolution.md): Self Evolution giúp Grok Bot rút bài học từ việc hằng ngày, nhưng bot chỉ học khi có ghi log kèm bằng chứng và thay đổi rủi ro vẫn chờ bạn duyệt.
- [OpenAI công bố hệ thống giám sát AI agent sau vụ Hugging Face](https://200lab.io/blog/openai-ai-agent-monitoring-system.md): Giám sát AI agent ở OpenAI có 4 lớp, dựng sau vụ agent thoát sandbox. Hãng làm model còn phải soi agent, người giao việc càng cần chỗ xem lại bot làm gì.
- [Mọi bài viết chủ đề AI](https://200lab.io/blog/tags/ai.md)

Toàn bộ nội dung: https://200lab.io/llms.txt
