AI Agents

Model Context Protocol (MCP) Là Gì? Từ Tool Calling Đến Kiến Trúc Kết Nối AI Với Hệ Thống Thật

MCP không phải chỉ là một cách gọi tool. Bài viết giải thích từ Host–Client–Server, Resources, Tools và Prompts đến cách MCP tạo ra một protocol chung để AI Agent kết nối với dữ liệu và hệ thống bên ngoài.

Minh họa cho bài Model Context Protocol (MCP) Là Gì? Từ Tool Calling Đến Kiến Trúc Kết Nối AI Với Hệ Thống Thật
Mục lục bài viết

Hãy tưởng tượng bạn đang xây một AI assistant cho đội engineering.

Ban đầu yêu cầu khá đơn giản:

“Cho AI đọc tài liệu nội bộ để trả lời câu hỏi.”

Bạn kết nối Google Drive hoặc một vector database. Xong.

Sau đó team muốn AI có thể đọc GitHub issue. Bạn viết thêm một integration.

Rồi họ muốn nó kiểm tra PostgreSQL.

Bạn viết thêm một integration nữa.

Sau đó là Slack, Jira, Sentry, filesystem, internal APIs, cloud infrastructure...

Đến một thời điểm, vấn đề không còn nằm ở khả năng của LLM nữa. Model đủ thông minh để hiểu câu hỏi và quyết định nó cần thông tin gì, nhưng application lại bị mắc kẹt trong một mạng lưới integration riêng biệt.

Text
AI Application
 ├── Google Drive connector
 ├── GitHub connector
 ├── PostgreSQL connector
 ├── Slack connector
 ├── Jira connector
 ├── Sentry connector
 ├── Internal CRM connector
 └── ...

Tệ hơn, nếu công ty có nhiều AI applications — chẳng hạn một coding assistant, một support agent và một internal knowledge assistant — phần lớn integration có thể phải được xây lại cho từng application.

Đây chính là một trong những vấn đề nền tảng dẫn tới sự xuất hiện của Model Context Protocol (MCP): làm thế nào để AI applications có một cách chuẩn hóa để khám phá dữ liệu, gọi công cụ và tương tác với các hệ thống bên ngoài mà không phải phát minh lại integration protocol cho từng cặp application–service. Research ban đầu cũng đặt trọng tâm vào sự cô lập dữ liệu của LLM và chi phí ngày càng lớn của các custom connector.

Anthropic giới thiệu MCP vào ngày 25/11/2024 như một open standard để kết nối AI assistants với những hệ thống nơi dữ liệu thực sự tồn tại. Ý tưởng của MCP chịu ảnh hưởng từ Language Server Protocol: thay vì mỗi editor phải tự hiểu từng programming language, editor và language server thống nhất nói chung một protocol.

Nhưng để hiểu MCP đúng, có một điều cần làm rõ ngay từ đầu:

MCP không làm model thông minh hơn. MCP chuẩn hóa cách AI application kết nối với thế giới bên ngoài.

Đó là distinction quan trọng nhất của toàn bộ bài viết này.


MCP thực chất là gì?

Model Context Protocol — MCP — là một protocol chuẩn hóa cách AI applications trao đổi context và capabilities với các hệ thống bên ngoài.

Một MCP server có thể cho AI application biết:

  • tôi có những dữ liệu nào;
  • tôi cung cấp những công cụ nào;
  • input của công cụ có cấu trúc ra sao;
  • cách gọi công cụ;
  • kết quả trả về theo format nào;
  • tôi cung cấp những workflow prompt nào.

AI application phía bên kia không cần biết GitHub API hoạt động khác PostgreSQL như thế nào hay filesystem khác Slack ở đâu. Nó tương tác thông qua một interface chung.

Mental model đơn giản nhất có thể hình dung MCP như một USB-C cho AI integrations.

Text
Trước MCP

AI App A ───── GitHub
AI App A ───── Slack
AI App A ───── PostgreSQL

AI App B ───── GitHub
AI App B ───── Slack
AI App B ───── PostgreSQL


Với một protocol chung

              ┌── GitHub MCP Server ───── GitHub
AI App ─ MCP ─┼── Slack MCP Server ────── Slack
              └── DB MCP Server ───────── PostgreSQL

So sánh này hữu ích để hiểu intuition, nhưng MCP không đơn giản chỉ là một adapter format. Nó còn định nghĩa message structure, capabilities, primitives, transports và nhiều lifecycle behavior cần thiết để client và server có thể interoperable.

Một cách mô hình hóa thường gặp là nói MCP biến bài toán integration từ M × N thành 1 × N. Ý này đúng về trực giác nhưng chưa hoàn toàn chính xác về engineering.

Giả sử có:

Text
M = số AI applications
N = số external systems

Nếu mọi cặp integration phải xây riêng:

Text
M × N integrations

Với một protocol chung, mỗi AI application cần hỗ trợ MCP và mỗi external system cần có MCP server:

Text
M client implementations
+
N server implementations

Vì vậy cách nhìn chính xác hơn là:

Text
M × N
   ↓
M + N

Protocol không làm integration biến mất. Nó thay đổi nơi integration complexity được đặt và làm cho các implementation có thể tái sử dụng qua nhiều host khác nhau.

Đây cũng là lý do MCP không phải là một “API mới thay thế tất cả API cũ”. Một GitHub MCP server cuối cùng vẫn có thể gọi GitHub REST hoặc GraphQL API. MCP nằm ở layer phía trên để chuẩn hóa cách AI application khám phá và sử dụng capability đó.


MCP không phải là Tool Calling, Agent Framework hay RAG

Trước khi đi sâu hơn, cần loại bỏ một vài khái niệm rất dễ bị trộn lẫn.

Khái niệm Nó giải quyết vấn đề gì?
Tool Calling Cho model biểu diễn ý định gọi function/tool
MCP Chuẩn hóa cách application khám phá và giao tiếp với external capabilities
RAG Retrieve dữ liệu liên quan rồi đưa vào context của model
Agent Framework Điều phối reasoning loop, state, tools, workflow
API Interface của một service cụ thể
MCP Server Adapter chuẩn hóa capability của một hoặc nhiều hệ thống theo MCP

MCP và Tool Calling

Giả sử model nhìn thấy:

Json
{
  "name": "get_weather",
  "arguments": {
    "city": "Da Nang"
  }
}

Đây là tool calling: model quyết định một function nên được gọi.

Nhưng model vẫn cần một application thực sự thực thi function đó.

MCP giải quyết lớp integration xung quanh nó:

Text
LLM
 │
 │ quyết định cần tool
 ▼
Host Application
 │
 │ MCP tools/call
 ▼
MCP Server
 │
 │ API / database / filesystem
 ▼
External System

Model không trực tiếp mở TCP connection đến MCP server. Host application vẫn là thành phần điều phối thực tế.

MCP và RAG

RAG thường giải quyết câu hỏi:

“Tài liệu nào nên được đưa vào context?”

MCP giải quyết câu hỏi rộng hơn:

“AI application có thể khám phá và tương tác với capability bên ngoài theo một protocol chung như thế nào?”

Một MCP server hoàn toàn có thể expose một vector search tool:

Text
search_documents(query)

Nhưng MCP không quyết định embedding model nào được dùng, chunking ra sao, retrieval dùng HNSW hay BM25, hoặc reranking hoạt động thế nào.

Đó vẫn là responsibility của hệ thống retrieval bên dưới.

MCP và Agent Framework

LangGraph, AutoGen hay các orchestration layer tương tự có thể quản lý:

Text
plan
→ reason
→ call tool
→ inspect result
→ update state
→ call another tool

MCP không định nghĩa agent reasoning loop đó.

MCP chỉ giúp một agent framework có thể nói:

“Tôi cần danh sách tools.”

hoặc:

“Hãy gọi tool này với arguments này.”

mà không cần biết implementation cụ thể phía server.

💡 Mental model

Text
Agent Framework = ai sẽ làm gì tiếp theo?

Tool Calling    = model muốn gọi capability nào?

MCP             = application tìm và gọi capability đó bằng protocol nào?

API             = capability cuối cùng được hệ thống thật thực thi như thế nào?

Kiến trúc MCP: Host, Client và Server

MCP được xây quanh mô hình Host–Client–Server. Tài liệu kiến trúc của MCP mô tả Host là coordinator, Client chịu trách nhiệm kết nối tới Server, còn Server expose resources, tools và prompts.

Một architecture điển hình có thể hình dung như sau:

Text
┌───────────────────────────────────────┐
│              MCP Host                 │
│                                       │
│  User                                 │
│    │                                  │
│    ▼                                  │
│  ┌─────────┐                          │
│  │   LLM   │                          │
│  └────┬────┘                          │
│       │                               │
│  ┌────▼─────┐   ┌──────────┐          │
│  │ Client A │   │ Client B │          │
│  └────┬─────┘   └────┬─────┘          │
└───────┼──────────────┼────────────────┘
        │ MCP          │ MCP
        ▼              ▼
┌──────────────┐  ┌──────────────┐
│ GitHub MCP   │  │ Database MCP │
│ Server       │  │ Server       │
└──────┬───────┘  └──────┬───────┘
       │                  │
       ▼                  ▼
    GitHub             PostgreSQL

Host

Host là application mà người dùng thực sự sử dụng.

Đó có thể là:

  • coding assistant;
  • desktop AI application;
  • internal enterprise agent;
  • IDE;
  • autonomous workflow system.

Host chịu phần orchestration quan trọng nhất:

Text
user interaction
LLM integration
permissions
context management
MCP client lifecycle
security policy
tool approval

Nói cách khác, MCP server không phải trung tâm của agent.

Host mới là nơi có bức tranh tổng thể.

Đây là một design decision quan trọng. Một server cung cấp GitHub capability không nhất thiết phải biết toàn bộ conversation của user, cũng không cần biết host đang kết nối thêm PostgreSQL hay Slack server nào khác. Documentation của MCP nhấn mạnh việc server được tách biệt và host kiểm soát security boundary giữa các server.

Client

MCP Client nằm trong Host.

Trong kiến trúc MCP truyền thống, một client tương ứng với một connection tới một server cụ thể.

Text
Host
 ├── MCP Client ─── GitHub MCP Server
 ├── MCP Client ─── Slack MCP Server
 └── MCP Client ─── PostgreSQL MCP Server

Client chịu trách nhiệm cho protocol communication:

Text
discover capabilities
list tools
call tools
read resources
retrieve prompts
handle protocol messages

Đừng nhầm “MCP Client” với toàn bộ AI application. Client thường chỉ là protocol component bên trong application lớn hơn.

Server

MCP Server expose capabilities cho client.

Server có thể wrap:

Text
PostgreSQL
GitHub
Slack
filesystem
internal REST API
SaaS platform
data warehouse
browser automation
CI/CD system

Ví dụ, một database MCP server có thể expose:

Text
Resources:
  db://schema/users
  db://schema/orders

Tools:
  execute_read_query(sql)
  explain_query(sql)

Server không cần chứa LLM.

Nó cũng không nhất thiết phải “agentic”.

Một MCP server tốt thường làm ngược lại: giữ responsibility càng hẹp và deterministic càng tốt.


Resources, Tools và Prompts: ba primitive quan trọng nhất

Phần lớn developer lần đầu tiếp xúc MCP đều tập trung ngay vào Tools. Nhưng MCP server historically được xây quanh ba server primitives quan trọng:

Text
Resources
Tools
Prompts

Documentation mô tả ba primitive này với ba control model khác nhau: Resources thiên về application-controlled, Tools model-controlled và Prompts user-controlled.

Primitive Mục tiêu Thường do ai quyết định sử dụng?
Resources Cung cấp context/data Application
Tools Thực thi operation Model
Prompts Cung cấp reusable interaction template User

Sự khác biệt này không chỉ mang tính naming. Nó thể hiện ba kiểu interaction rất khác nhau.


Resources: “Đây là dữ liệu mà application có thể đưa vào context”

Resource là dữ liệu server expose cho client.

Ví dụ:

Text
file://project/README.md

git://repository/main/src/app.py

db://schema/orders

docs://api/payment

Resource thường phù hợp với thông tin mà application cần đọc.

Ví dụ một IDE muốn đưa file hiện tại vào context:

Text
Host
 │
 ├── resources/list
 │
 ▼
MCP Server
 │
 ├── file://src/main.py
 ├── file://src/database.py
 └── file://README.md

Application có thể chọn:

Text
file://src/database.py

sau đó gọi:

Text
resources/read

và đưa content vào model context.

Điểm quan trọng ở đây là Resource không đồng nghĩa với RAG document.

MCP chỉ định nghĩa một interface để expose và retrieve resource. Application vẫn có thể:

  • tự chọn resource;
  • cho user chọn;
  • search trước;
  • rank resources;
  • chỉ inject một phần content.

MCP không quyết định chiến lược context management.


Tools: “Đây là những hành động AI có thể yêu cầu thực hiện”

Tools thường là primitive quan trọng nhất với AI Agent.

Một server có thể expose:

Text
search_issues(query)
get_customer(customer_id)
create_ticket(title, description)
run_query(sql)
send_message(channel, text)

Mỗi tool có:

Text
name
description
input schema
optional output schema

Ví dụ:

Json
{
  "name": "get_order",
  "description": "Get an order by its ID",
  "inputSchema": {
    "type": "object",
    "properties": {
      "order_id": {
        "type": "string"
      }
    },
    "required": ["order_id"]
  }
}

LLM nhìn thấy description và schema rồi có thể suy luận rằng:

Text
User:
"Kiểm tra đơn hàng ORD-1024 cho tôi."

↓

LLM:
I need get_order(order_id="ORD-1024")

Sau đó Host/Client mới thực hiện MCP request.

Text
User
 │
 ▼
LLM
 │
 │ decides to use get_order
 ▼
Host
 │
 │ tools/call
 ▼
MCP Server
 │
 │ calls internal Order API
 ▼
Order Service
 │
 ▼
MCP Server
 │ result
 ▼
Host
 │
 ▼
LLM
 │
 ▼
Natural-language answer

Đây là nơi MCP trở thành một component quan trọng của agent architecture: model có thể khám phá tool interface mà không cần application hard-code riêng communication mechanism cho từng service.


Prompts: “Đây là những workflow template server cung cấp”

Prompts dễ bị hiểu nhầm nhất.

MCP Prompt không giống system prompt bí mật của application.

Server có thể expose một reusable template như:

Text
/review-pull-request

/summarize-incident

/analyze-query-plan

Client lấy template, điền arguments và đưa resulting messages vào model.

Ví dụ:

Text
Prompt:
review-pr

Arguments:
pull_request = 182
focus = "database performance"

Server có thể trả lại structured messages để Host đưa vào conversation.

Prompts vì vậy phù hợp với reusable workflow mà server/domain expert muốn cung cấp cho user.

Trong nhiều agent architectures thực tế, Tools được dùng nhiều hơn. Nhưng hiểu Prompts giúp ta thấy MCP không chỉ là “remote function calling protocol”.


Một MCP Tool Call thực sự diễn ra như thế nào?

Hãy lấy một ví dụ cụ thể.

User hỏi coding assistant:

“Có issue nào đang mở liên quan đến timeout của payment service không?”

GitHub MCP server expose tool:

Text
search_issues(query, state)

Flow có thể diễn ra như sau:

Text
1. Client khám phá available tools

        tools/list
            │
            ▼
GitHub MCP Server


2. Tool definition được cung cấp cho LLM

search_issues(
    query: string,
    state: "open" | "closed"
)


3. Model quyết định gọi tool

search_issues(
    query="payment service timeout",
    state="open"
)


4. Host gửi MCP request

        tools/call
            │
            ▼
GitHub MCP Server


5. Server gọi GitHub API

GitHub MCP Server
        │
        ▼
GitHub API


6. Result quay về

GitHub API
   ↓
MCP Server
   ↓
Host
   ↓
LLM


7. LLM tạo câu trả lời cho user

Một misunderstanding phổ biến là:

“LLM gọi MCP server.”

Về conceptual level có thể nói như vậy, nhưng ở implementation level thì không hoàn toàn chính xác.

LLM sinh tool-selection decision.

Host thực hiện network/process operation.

Đây là distinction quan trọng với security.

Model có thể đề xuất:

Text
delete_database("production")

nhưng chính Host mới quyết định request đó có thực sự được phép đi qua hay không.


Bên dưới MCP: JSON-RPC và Transport

MCP không chỉ định nghĩa semantic primitives. Nó còn cần một wire protocol để Client và Server thực sự giao tiếp.

MCP sử dụng JSON-RPC 2.0 làm message format. Các phiên bản specification trước và sau 2026 đều sử dụng JSON-RPC làm nền tảng.

Một request có mental model như sau:

Json
{
  "jsonrpc": "2.0",
  "id": 42,
  "method": "tools/call",
  "params": {
    "name": "get_order",
    "arguments": {
      "order_id": "ORD-1024"
    }
  }
}

Trong đó:

Text
id
→ dùng để correlate request với response

method
→ operation cần thực hiện

params
→ input của operation

Server trả response tương ứng.

Json
{
  "jsonrpc": "2.0",
  "id": 42,
  "result": {
    "...": "..."
  }
}

MCP sau đó định nghĩa ý nghĩa cụ thể của:

Text
tools/list
tools/call
resources/list
resources/read
prompts/list
prompts/get
...

Transport không phải Protocol

Một distinction quan trọng khác:

Text
MCP protocol
≠
transport

Protocol định nghĩa nói gì.

Transport định nghĩa message được chuyển như thế nào.

MCP historically hỗ trợ hai transport quan trọng:

Text
stdio
Streamable HTTP

stdio

Với local MCP server:

Text
Host
 │
 │ launch subprocess
 ▼
MCP Server Process

stdin  ──► requests
stdout ◄── responses

Ví dụ coding assistant có thể chạy một local filesystem server như child process.

Ưu điểm:

  • setup đơn giản;
  • không cần HTTP server;
  • hợp với local tooling;
  • process lifecycle do client kiểm soát.

Nhưng có một detail rất dễ gây bug: vì protocol message đi qua stdout, server không thể tùy tiện dùng:

Python
print("debug")

vào stdout.

Một dòng debug text chen giữa JSON-RPC messages có thể làm hỏng protocol stream. Vì vậy log thường phải đi qua stderr hoặc logging mechanism phù hợp. Đây cũng là lưu ý được nhấn mạnh trong research ban đầu.

Streamable HTTP

Với remote MCP server:

Text
AI Host
   │
   │ HTTPS
   ▼
API Gateway
   │
   ▼
MCP Server
   │
   ▼
Internal Services

Điều này phù hợp hơn cho:

  • cloud deployment;
  • enterprise integrations;
  • shared servers;
  • centrally managed authorization;
  • multi-user infrastructure.

Và chính layer này đã thay đổi rất lớn trong MCP 2026.


MCP 2026 thay đổi điều gì? Từ session-oriented sang stateless core

Đây là phần mà nhiều tutorial MCP cũ sẽ nhanh chóng trở nên outdated.

Bản specification chính thức 2026-07-28 chuyển MCP sang stateless protocol core. initialize/initialized handshake và Mcp-Session-Id của modern protocol revision đã được loại bỏ; request hiện mang đủ metadata để một server instance có thể xử lý độc lập.

Trước đây, remote MCP có thể cần lifecycle kiểu:

Text
Client
  │
  │ initialize
  ▼
Server
  │
  │ Mcp-Session-Id
  ▼
Client

subsequent requests
must preserve session

Trong distributed deployment, điều này tạo ra một bài toán quen thuộc:

Text
              Load Balancer
             /      |      \
            /       |       \
       Server A  Server B  Server C

Nếu session state nằm ở Server A, request tiếp theo không thể tùy ý sang Server B trừ khi có:

Text
sticky session

hoặc:

Text
shared session store

Với modern MCP 2026-07-28, request được thiết kế self-contained hơn.

Text
Request 1 ─────► Server B

Request 2 ─────► Server A

Request 3 ─────► Server C

Không có requirement rằng request phải quay lại instance trước.

Official Python SDK documentation cũng mô tả modern 2026-07-28 request là sessionless và có thể được phục vụ bởi bất kỳ worker nào.

🏗️ Production Note

Đây không đơn giản là một protocol cleanup.

Nó thay đổi deployment architecture:

Text
Before

Client
  │
  ▼
Load Balancer
  │ sticky
  ▼
Server A
  │
  ▼
Session State


2026-07-28

Client
  │
  ▼
Load Balancer
 ├────► Server A
 ├────► Server B
 └────► Server C

MCP server nhờ vậy gần với một HTTP workload thông thường hơn.


Nhưng stateless protocol không có nghĩa application không được có state

Đây là nuance rất quan trọng.

Giả sử shopping agent có flow:

Text
create_cart()
→ add_product()
→ checkout()

Ta vẫn cần biết ba calls đang thao tác cùng một cart.

Stateless protocol không cấm state.

Thay vì giấu state trong transport session:

Text
Mcp-Session-Id → server-side state

application có thể expose state explicitly:

Text
create_cart()
→ cart_id = "cart_82"

add_product(
    cart_id="cart_82",
    product_id="P20"
)

Official 2026 release cũng khuyến khích explicit handles cho những application cần carry state giữa calls.

Điều này có một architectural advantage khá thú vị: state trở thành một phần visible của domain operation thay vì hidden transport metadata.

Text
Hidden state

HTTP session
    ↓
magic server state


Explicit state

cart_id
job_id
transaction_id
conversation_handle

Explicit handle thường:

  • dễ debug hơn;
  • dễ retry hơn;
  • dễ log hơn;
  • dễ distribute hơn;
  • dễ kiểm soát authorization hơn.

Multi Round-Trip Requests: làm sao server hỏi ngược lại khi protocol stateless?

Stateless tạo ra một câu hỏi khó.

Giả sử tool:

Text
delete_files(files)

đang chạy và server phát hiện ba files đặc biệt nhạy cảm.

Server muốn hỏi:

“Bạn có chắc muốn xóa ba file này không?”

Trong architecture cũ, server có thể cần một back-channel đang mở.

MCP 2026-07-28 đưa vào Multi Round-Trip Requests — MRTR.

Flow mới có dạng:

Text
Client
 │
 │ tools/call
 ▼
Server
 │
 │ input_required
 ▼
Client
 │
 │ ask user / obtain input
 │
 │ retry original request
 ▼
Server
 │
 │ complete
 ▼
Client

Server có thể trả một result kiểu:

Text
input_required

kèm những input cần bổ sung. Client lấy input, sau đó gửi lại original operation cùng responses.

Mental model:

Text
Không giữ connection state để "đợi user".

Thay vào đó:

Server:
"Tôi chưa hoàn thành.
Đây là dữ liệu tôi còn thiếu."

Client:
"Đây là dữ liệu.
Tiếp tục operation."

Cách tiếp cận này phù hợp hơn với retryable distributed systems.


Một MCP server Python hiện đại trông như thế nào?

Một điểm cần cập nhật so với nhiều tutorial cũ là Python SDK v2 đã đổi high-level server class từ FastMCP sang MCPServer. SDK v2 hiện là stable line và triển khai MCP 2026-07-28.

Ví dụ đơn giản:

Python
from mcp.server import MCPServer

mcp = MCPServer("Inventory")


@mcp.tool()
def get_stock(sku: str) -> dict:
    """Return current inventory for a product SKU."""

    # Simplified example.
    inventory = {
        "KB-001": 24,
        "MS-002": 8,
    }

    return {
        "sku": sku,
        "quantity": inventory.get(sku, 0),
    }


if __name__ == "__main__":
    mcp.run()

Đoạn code ngắn, nhưng phía sau decorator:

Python
@mcp.tool()

SDK có thể xây tool metadata từ:

Text
function name
type hints
docstring

Application phía client không cần biết code Python bên trong.

Nó chỉ cần nhìn thấy conceptual interface:

Text
get_stock(
    sku: string
)

Đây là một ví dụ nhỏ nhưng cho thấy giá trị thật của MCP.

Không phải việc decorator giúp code ngắn hơn.

Giá trị nằm ở chỗ:

capability vừa được expose theo một contract mà bất kỳ compatible MCP client nào cũng có thể hiểu.


Tool Schema rất quan trọng — nhưng không phải security boundary hoàn chỉnh

Tool definition thường sử dụng JSON Schema để mô tả input.

Ví dụ:

Json
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "required": ["limit"]
}

Schema có thể ngăn input kiểu:

Json
{
  "limit": "banana"
}

nếu limit bắt buộc là integer.

Nhưng cần tránh một kết luận quá mạnh:

“Có JSON Schema nên tool an toàn trước injection.”

Không đúng.

Schema validation giải quyết chủ yếu:

Text
structure
type
required fields
allowed shape

Nó không tự biết string:

Text
"DROP TABLE users"

có nguy hiểm hay không nếu schema chỉ quy định:

Text
sql: string

Tương tự, schema không phân biệt:

Text
user_id = "123"

là account mà current user được phép xem hay account của người khác.

Security thực sự cần nhiều layer:

Text
LLM-generated arguments
        │
        ▼
Schema validation
        │
        ▼
Authentication
        │
        ▼
Authorization
        │
        ▼
Business validation
        │
        ▼
Policy enforcement
        │
        ▼
External system

Schema là một layer quan trọng.

Nhưng nó không phải authorization system, prompt-injection defense hay SQL-injection defense hoàn chỉnh.


MCP không tự động làm AI Agent an toàn

Đây có lẽ là misconception nguy hiểm nhất khi MCP được sử dụng trong production.

Một application có MCP không đồng nghĩa với:

Text
trusted tools
safe actions
correct permissions
secure agent

Official tool specification khuyến nghị application giữ human-in-the-loop và cho user khả năng từ chối tool invocation, đặc biệt khi operation có impact. Nhưng đây là responsibility của implementation; protocol không magically ngăn model gọi một operation nguy hiểm.

Hãy xét architecture:

Text
Untrusted Web Page
        │
        ▼
       LLM
        │
        │ generated tool call
        ▼
   MCP Client
        │
        ▼
   Email MCP Server
        │
        ▼
     Send Email

Nếu webpage chứa malicious instruction và application cho model quyền gửi email tự động, MCP chỉ giúp request được thực hiện theo một protocol chuẩn.

MCP không biết instruction đến từ:

Text
system prompt
user
webpage
retrieved document
attacker

Do đó security boundary phải nằm ngoài model reasoning.

Một architecture an toàn hơn:

Text
Untrusted Content
        │
        ▼
       LLM
        │
        ▼
Structured Tool Proposal
        │
        ▼
┌───────────────────────┐
│ Authorization         │
│ Policy                │
│ Scope validation      │
│ Business rules        │
└──────────┬────────────┘
           │
           ▼
    User confirmation
           │
           ▼
       MCP Tool

Principle of Least Privilege

Nếu agent chỉ cần đọc orders:

Text
orders:read

đừng cấp:

Text
orders:*

Nếu tool chỉ cần query analytics database, dùng read-only credential thay vì database admin account.

Nếu tool cần filesystem:

Text
/project/reports

đừng mặc định expose:

Text
/

Đây là security engineering truyền thống.

MCP không thay thế nó.


MCP Server tốt không nhất thiết expose càng nhiều tools càng tốt

Một trong những lesson quan trọng nhất khi hệ sinh thái MCP lớn dần là:

Tool catalog cũng tiêu tốn context và attention của model.

Giả sử một server expose:

Text
5 tools

Model có thể dễ phân biệt.

Nhưng nếu host kết nối nhiều servers:

Text
GitHub     80 tools
Cloud     120 tools
CRM        60 tools
Database   40 tools
Analytics  90 tools

thì model phải xử lý gần 400 tool definitions.

Vấn đề không chỉ là token cost.

Tool-selection accuracy cũng có thể giảm khi có quá nhiều capabilities tương tự nhau.

Text
search_customer
find_customer
lookup_customer
query_customer
customer_search

Model phải phân biệt subtle semantic differences trước khi thực hiện task.

Roadmap MCP công bố ngày 22/8/2026 cũng xác định scale của tool catalog là một vấn đề cần giải quyết, với hướng progressive discovery: server có thể expose một entry point nhỏ rồi reveal thêm capability khi task được thu hẹp.

🏗️ Production Note

Đừng thiết kế MCP Server như một dump của toàn bộ backend API.

Thay vì:

Text
341 endpoint → 341 tools

hãy nghĩ:

Text
Những capability nào thực sự có ý nghĩa với AI?

Tool interface cho agent và API interface cho frontend không nhất thiết phải giống nhau.


API endpoint tốt chưa chắc là MCP tool tốt

Giả sử backend có API:

Http
PATCH /orders/{id}

body:

Json
{
  "status": "cancelled"
}

Có thể expose trực tiếp thành:

Text
update_order(id, fields)

Nhưng với model, interface như vậy quá general.

Một tool tốt hơn có thể là:

Text
cancel_order(
    order_id,
    reason
)

Tại sao?

Bởi vì tool name và schema đồng thời là semantic interface dành cho model.

Model không đọc implementation.

Nó suy luận từ:

Text
tool name
description
arguments
schema

Do đó:

Text
generic CRUD tool

thường khó kiểm soát hơn:

Text
domain-specific capability

So sánh:

Text
database_execute(sql)

với:

Text
get_customer_orders(customer_id)

get_failed_payments(
    from_date,
    to_date
)

Tool thứ nhất rất mạnh nhưng permission surface khổng lồ.

Tool phía sau hẹp hơn, dễ reason hơn và dễ secure hơn.

Đây là điểm nơi protocol design gặp application design.

MCP giúp chuẩn hóa contract.

Nhưng chất lượng contract vẫn là trách nhiệm của developer.


Error handling cũng là một phần của Agent Design

Trong software truyền thống, error thường được xử lý cho developer hoặc UI.

Với AI Agent, error còn trở thành feedback cho model.

Giả sử tool trả:

Text
Invalid customer_id

Model có thể thử lại.

Nhưng nếu server trả:

Text
Error

model gần như không biết phải sửa gì.

Một useful error có thể nói:

Text
customer_id must use format CUS-xxxx.
Received: 1234.

LLM có khả năng dùng information đó để sửa operation:

Text
1234
↓
CUS-1234

Điều này tạo ra một interesting loop:

Text
LLM
 │
 │ tool call
 ▼
Tool
 │
 │ actionable error
 ▼
LLM
 │
 │ corrected call
 ▼
Tool

MCP giúp standardized communication, nhưng quality của agent loop phụ thuộc rất nhiều vào quality của:

Text
tool descriptions
schemas
errors
results

Nói cách khác, xây MCP server không chỉ là expose function.

Bạn đang thiết kế một machine-readable interface cho một reasoning model.


MCP làm thay đổi cách chúng ta nghĩ về AI architecture

Không có MCP, integration thường bị embed trực tiếp trong agent:

Text
Agent
 ├── github.py
 ├── slack.py
 ├── database.py
 ├── jira.py
 └── drive.py

Agent và integrations bị coupled.

Với protocol-based architecture:

Text
                    ┌── GitHub MCP Server
                    │
Agent Host ── MCP ──┼── Database MCP Server
                    │
                    ├── Slack MCP Server
                    │
                    └── Internal MCP Server

ta có thể thay host:

Text
Host A
Host B
Host C

mà vẫn reuse servers.

Hoặc thay server implementation mà client không cần hiểu internal mechanics.

Đây chính là lợi ích lớn nhất của standards.

REST không làm business logic biến mất.

SQL không làm database design biến mất.

HTTP không làm distributed systems trở nên đơn giản.

Tương tự:

MCP không loại bỏ integration complexity. Nó tạo ra một boundary chuẩn để complexity không còn phải được giải quyết lại cho từng cặp hệ thống.


Khi nào MCP thực sự đáng dùng?

Không phải mọi application gọi một API đều cần MCP.

Nếu application chỉ có:

Text
LLM
+
1 internal function

và function đó chỉ được sử dụng ở đúng một nơi, một tool wrapper đơn giản có thể đủ.

MCP bắt đầu có giá trị rõ hơn khi:

Text
nhiều tools
+
nhiều AI hosts
+
nhiều external systems
+
nhu cầu interoperability

Ví dụ:

Một organization có nhiều AI products

Text
Coding Assistant
Support Agent
Ops Agent
Internal Search

và muốn chúng reuse:

Text
GitHub
Jira
Slack
Database
Observability

MCP giúp separation rất đáng kể.

Bạn xây một capability muốn nhiều AI clients sử dụng

Ví dụ:

Text
Company Knowledge Server

Nếu expose qua MCP, nhiều compatible host có thể sử dụng mà không cần viết connector riêng.

Bạn xây AI development tooling

IDE là môi trường rất phù hợp bởi coding agent thường cần:

Text
filesystem
Git
GitHub
database
browser
CI/CD
documentation
observability

Số integrations tăng nhanh, nên shared protocol tạo giá trị lớn.


Khi nào không nên ép MCP vào kiến trúc?

MCP không phải default answer cho mọi integration.

Nếu flow của bạn đơn giản:

Text
API endpoint
→ LLM
→ answer

thêm:

Text
MCP Host
MCP Client
MCP Server

có thể chỉ tạo thêm abstraction.

Tương tự, nếu application có một deterministic backend workflow:

Text
validate payment
→ charge card
→ generate invoice

không có lý do để biến mọi step thành LLM-selected MCP tool.

Một rule hữu ích là:

MCP đáng giá nhất khi interoperability và dynamic capability discovery quan trọng hơn chi phí abstraction mà protocol thêm vào.

Không phải:

“Dùng AI thì phải dùng MCP.”


Những hiểu nhầm phổ biến về MCP

1. “MCP làm LLM truy cập trực tiếp database”

Không.

Thông thường flow là:

Text
LLM
→ Host
→ MCP Client
→ MCP Server
→ Database

Host và Server vẫn enforce execution.


2. “Có MCP thì không cần viết integration”

Vẫn cần.

Bạn vẫn phải viết logic:

Text
MCP tool
→ GitHub API

MCP tool
→ PostgreSQL

MCP tool
→ internal service

MCP chỉ làm integration reusable và interoperable hơn.


3. “MCP chính là tool calling”

Tool calling là model capability.

MCP là integration protocol.

Hai thứ thường đi cùng nhau nhưng không phải một.


4. “MCP Server phải có AI bên trong”

Không.

Một server hoàn toàn có thể deterministic:

Python
def get_stock(sku):
    return database.lookup(sku)

LLM nằm phía Host.


5. “JSON Schema làm MCP tools an toàn”

Schema validation giúp kiểm tra structure.

Security vẫn cần:

Text
authentication
authorization
least privilege
business validation
rate limits
audit
user confirmation

6. “Expose tất cả backend APIs thành MCP tools là tốt”

Không nhất thiết.

Tool catalog quá lớn làm tăng context cost và có thể làm tool selection khó hơn.

MCP roadmap hiện cũng đang hướng tới progressive capability discovery để xử lý chính vấn đề scale này.


🔬 Deep Dive — Vì sao MCP quan trọng hơn một bộ SDK tiện dụng?

Nếu nhìn MCP chỉ qua code:

Python
@mcp.tool()

developer rất dễ kết luận:

“Đây chỉ là framework giúp tạo function calling.”

Nhưng decorator không phải phần quan trọng nhất.

Hãy tưởng tượng thế giới không có shared protocol.

Một AI application hỗ trợ GitHub có thể định nghĩa:

Json
{
  "operation": "github_search",
  "payload": {}
}

Application khác lại dùng:

Json
{
  "action": "searchGithub",
  "args": {}
}

Application thứ ba dùng REST endpoint riêng.

Mỗi GitHub integration phải hiểu từng representation.

Đây chính là pairwise coupling.

Một protocol tiêu chuẩn tạo ra contract chung:

Text
AI Host
   │
   │ MCP
   ▼
Capability Provider

Khi đủ nhiều clients và servers cùng implement contract, network effect bắt đầu xuất hiện.

Một server mới:

Text
Company Analytics MCP Server

không chỉ tích hợp với một assistant.

Về nguyên tắc, nó có thể tích hợp với cả ecosystem những host hỗ trợ MCP.

Và một host mới không cần tự viết connectors cho mọi vendor nếu ecosystem đã có MCP servers tương ứng.

Đây chính là lý do Language Server Protocol là analogy phù hợp.

Không phải vì MCP và LSP có cùng use case.

Mà vì cả hai cùng chuyển ecosystem từ:

Text
pairwise integrations

sang:

Text
shared protocol boundary

Đó mới là architectural significance thực sự.


MCP đang đi về đâu?

MCP bắt đầu tại Anthropic nhưng hiện không còn đơn thuần là một Anthropic-specific interface. Cuối năm 2025, Anthropic đã đóng góp MCP cho Agentic AI Foundation thuộc Linux Foundation, trong bối cảnh protocol được nhiều AI platforms và infrastructure vendors hỗ trợ.

Bản 2026-07-28 tiếp tục đẩy protocol theo hướng phù hợp hơn với production infrastructure:

Text
stateless core
header-based routing
cacheable discovery/list results
MRTR
extension framework
authorization hardening

Roadmap ngày 22/8/2026 cho thấy các hướng tiếp theo tập trung vào:

Text
agentic messaging
HTTP transport unification
agent identity
enterprise security
progressive discovery
SDK ergonomics

Trong security, roadmap đang tiếp tục công việc quanh DPoP, Workload Identity Federation và delegation cho cloud agents — nhưng đây là hướng phát triển đang tiếp tục hoàn thiện, không nên nhầm với việc mọi MCP deployment hiện tại đã tự động có workload identity an toàn.

Điểm này cho thấy MCP đang chuyển từ một protocol chủ yếu nổi tiếng nhờ local developer tools sang một infrastructure layer được thiết kế ngày càng nhiều cho distributed agent systems.


Kết luận

Quay lại bài toán ban đầu.

Bạn có một AI application cần:

Text
đọc GitHub
query database
xem Sentry
gửi Slack
đọc filesystem
gọi internal APIs

Vấn đề không phải LLM không hiểu những hệ thống này.

Vấn đề là mỗi hệ thống có interface khác nhau, authentication khác nhau, data model khác nhau và integration code khác nhau.

Nếu mỗi AI application tự xây toàn bộ connectors của riêng mình, architecture nhanh chóng trở thành một ma trận pairwise integrations khó tái sử dụng.

MCP đưa vào một boundary mới:

Text
AI Application
      │
      │ standardized protocol
      ▼
   MCP Server
      │
      ▼
External System

Từ đó, ta có một mental model rõ ràng hơn:

  1. LLM reasoning không phải MCP. Model chỉ quyết định nó cần context hoặc capability nào.
  2. Host mới là coordinator. Host quản lý model, permissions, context và MCP clients.
  3. MCP Server expose capability thông qua một contract chuẩn.
  4. Resources cung cấp context, Tools cung cấp actions, Prompts cung cấp reusable interaction templates.
  5. MCP không loại bỏ integration hay security complexity — nó đặt chúng sau một interoperability boundary tốt hơn.

Và đó là cách hữu ích nhất để hiểu MCP.

Không phải:

“Một framework mới để gọi tools.”

Mà là:

một protocol layer giúp các AI applications và thế giới phần mềm bên ngoài có thể phát triển độc lập hơn nhưng vẫn hiểu cách nói chuyện với nhau.

Nguồn tham khảo

  • Anthropic — Introducing the Model Context Protocol (25/11/2024).
  • Model Context Protocol — Architecture.
  • Model Context Protocol — Resources.
  • Model Context Protocol — Tools.
  • Model Context Protocol — Prompts.
  • Model Context Protocol — The 2026-07-28 Specification.
  • MCP Python SDK — What's new in v2.
  • Model Context Protocol — The New MCP Roadmap, 22/8/2026.
  • Anthropic — Donating the Model Context Protocol and establishing the Agentic AI Foundation.