Giới thiệu

Trong hành trình phát triển của trí tuệ nhân tạo (AI), một thách thức lớn luôn tồn tại: làm sao để các mô hình AI có thể hiểu rõ bối cảnh đang diễn ra và duy trì sự nhất quán trong những tương tác dài hạn? Model Context Protocol (MCP) là một chuẩn giao thức mới ra đời nhằm giải quyết vấn đề này – cung cấp cho mô hình ngôn ngữ một cách thống nhất để lưu trữ, truy cập và chia sẻ ngữ cảnh trong các ứng dụng phức tạp.

Trong bài viết này, chúng ta sẽ tìm hiểu về:

  • Bối cảnh: Trước và Sau khi có MCP
  • Các thành phần và cách hoạt động của MCP
  • Các MCP Server chính thức
  • Tự xây dựng MCP Server và tương tác với Github Copilot Chat

Bối cảnh: Trước và Sau khi có MCP

Trước MCP

Các mô hình ngôn ngữ như GPT hoạt động chủ yếu dựa vào prompt (văn bản đầu vào), nghĩa là mọi thông tin cần thiết để tạo ra câu trả lời đều phải nằm trong prompt hiện tại. Điều này có nhiều hạn chế:

  • Không có khả năng nhớ dài hạn: Nếu người dùng trò chuyện trong nhiều phiên hoặc cần theo dõi trạng thái liên tục, mô hình không thể duy trì ngữ cảnh.
  • Khó tích hợp với hệ thống bên ngoài: Khi muốn kết nối với các hệ thống quản lý dữ liệu hoặc luồng công việc phức tạp, việc truyền tải ngữ cảnh trở nên cồng kềnh.
  • Tái sử dụng hạn chế: Không thể chia sẻ ngữ cảnh giữa các mô hình hoặc dịch vụ khác nhau.

Sau MCP

Với sự ra đời của Model Context Protocol, ngữ cảnh được lưu trữ theo chuẩn định dạng và có thể truy xuất hoặc cập nhật một cách linh hoạt. Điều này mang lại nhiều lợi ích:

  • Nhớ dài hạn và liên phiên làm việc.
  • Chia sẻ ngữ cảnh giữa nhiều công cụ, mô hình hoặc người dùng.
  • Giao tiếp hai chiều giữa mô hình và hệ thống MCP Server.

Các thành phần và cách hoạt động của MCP

1WFhoFVkgNPJaSHwygpUtyESpfooAgZw1

Model Context Protocol (MCP) định nghĩa một cách chuẩn để mô hình AI truy xuất và cập nhật thông tin ngữ cảnh thông qua MCP Server.

  • MCP Hosts: Các chương trình như Claude Desktop, các môi trường phát triển (IDE) hoặc công cụ AI muốn truy cập dữ liệu thông qua giao thức MCP.
  • MCP Clients: Các ứng dụng giao thức duy trì kết nối 1:1 với máy chủ.
  • MCP Servers: Các chương trình nhẹ, mỗi chương trình cung cấp một số khả năng cụ thể thông qua Giao thức Ngữ cảnh Mô hình (Model Context Protocol) chuẩn hóa.
  • Local Data Sources: Tệp, cơ sở dữ liệu và dịch vụ trên máy tính của bạn mà máy chủ MCP có thể truy cập một cách an toàn.
  • Remote Services: Các hệ thống bên ngoài có sẵn qua internet (ví dụ: thông qua API) mà máy chủ MCP có thể kết nối đến.

Ví dụ:
Giả sử bạn đang làm việc với một AI quản lý dự án. MCP cho phép mô hình lưu lại thông tin các nhiệm vụ, trạng thái hoàn thành, thời hạn, và người chịu trách nhiệm. Mỗi lần truy cập, AI có thể lấy lại dữ liệu dựa trên ID của người dùng hoặc dự án.

Một vài MCP Server chính thức

Với việc ra đời của MCP, hiện nay có rất nhiều các dịch vụ đã cung cấp miễn phí mã nguồn MCP Server để LLM tương tác với các dịch vụ đó:

  • Github MCP Server: Được phát triển chính thức bởi Github, LLM hoàn toàn có thể tương tác với các repository từ public, private cho đến enterprise.

  • AWS MCP Server: Được phát triển chính bởi AWS Labs.

  • Azure MCP Server: Được phát triển chính thức bởi Azure.

  • Docker MCP Toolkit: Được phát triển bởi Docker, ở đây có hàng trăm MCP Server khác nhau, giúp chúng ta có thể tương tác với hàng trăm services, systems.

Tự xây dựng MCP Server và tương tác với Github Copilot Chat

Ở phần này, chúng ta thử bắt tay xây dựng 1 MCP Server đơn giản mô phỏng việc lấy tasks, thêm, hoàn thành task cho Doraemon.
Chúng ta sẽ không đi sâu vào việc cài đặt python, nodejs,...

Xây dựng Doraemon API

Ở đây, chúng ta sẽ xây dựng nhanh 1 CRUD API gồm các endpoint:

GET /tasks : Lấy về danh sách tasks
POST /tasks : Thêm mới task
DELETE /tasks/:id : Hoàn thành/xoá task trong danh sách
const express = require('express')
const app = express()
const port = 3000

// body-parser middleware to parse JSON bodies
const bodyParser = require('body-parser')
app.use(bodyParser.json())

const tasks = [
    { id: 1, name: 'Collect bamboo', description: 'Collect bamboo for the bamboo forest' },
    { id: 2, name: 'Help Nobita', description: 'Assist Nobita with his homework' },
    { id: 3, name: 'Repair the time machine', description: 'Fix the time machine for future travels' },
    { id: 4, name: 'Feed Dorami', description: 'Make sure Dorami has enough food' },
    { id: 5, name: 'Organize gadgets', description: 'Sort and organize all the gadgets in the pocket' }
];

app.get('/tasks', (req, res) => {
    res.json(tasks)
})

app.post('/tasks', (req, res) => {
    const body = req.body;
    const task = body.task;

    console.log(`Received task: ${task}`)

    if (!task) {
        return res.status(400).json({
            error: 'Task is required'
        })
    }

    // appen the task to the list (mocking a database save)
    const newTask = {
        id: tasks.length + 1,
        name: task.name || 'Unnamed Task',
        description: task.description || 'No description provided'
    };
    tasks.push(newTask);

    return res.status(201).json({
        message: 'Task received successfully',
        task: task
    })
})

app.delete('/tasks/:id', (req, res) => {
    console.log(`Received delete request for task ID: ${req.params.id}`)
    const taskId = parseInt(req.params.id, 10);
    const taskIndex = tasks.findIndex(t => t.id === taskId);
    console.log(`Task index found: ${taskIndex}`)

    if (taskIndex === -1) {
        console.log(`Task with ID ${taskId} not found`)
        return res.status(404).json({
            error: 'Task not found'
        });
    }

    tasks.splice(taskIndex, 1);
    console.log(`Task with ID ${taskId} deleted successfully`)
    return res.status(204).json({
        message: 'Task deleted successfully'
    });
})

app.listen(port, () => {
    console.log(`Example app listening on port ${port}`)
})

Xây dựng MCP Server

Chúng ta sẽ sử dụng MCP Python SDK được phát triển bởi Anthropic. Bạn có thể tìm thấy các SDK cho các ngôn ngữ lập trình khác mà bạn quen thuộc ở đây

Tạo folder có tên doraemon_mcp_server

mkdir doraemon_mcp_server
cd doraemon_mcp_server

Tạo vitural enviroment cho project:

python3 -m venv .venv

Tạo file requiments.txt

mcp
requests

Cài đặt các thư viện cần thiết trong requirements.txt

pip install -r requirements.txt

Tạo doraemon_mcp_server.py

# doraemon_mcp_server.py
from mcp.server.fastmcp import FastMCP
import requests
import json 


# Create an MCP server
mcp = FastMCP("Demo")

@mcp.tool()
def get_tasks() -> list:
    """Get tasks of doraemon"""
    
    # Fetch tasks from api
    res = requests.get("http://localhost:3000/tasks")
    tasks = json.loads(res.text)

    return tasks

@mcp.tool()
def add_task(task: str, description: str = "") -> str:
    """Add a task to doraemon"""
    
    # Post task to api
    res = requests.post("http://localhost:3000/tasks", json={"task": {
        "name": task,
        "description": description
    }})
    
    if res.status_code == 201:
        return "Task added successfully"
    else:
        return "Failed to add task"
    
@mcp.tool()
def delete_task(task_id: int) -> str:
    """Delete a task from doraemon"""
    
    # Delete task from api
    res = requests.delete(f"http://localhost:3000/tasks/{task_id}")
    
    if res.status_code == 204:
        return "Task deleted successfully"
    else:
        return "Failed to delete task"
    

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

Kết nối MCP Server với Github Copilot Chat (Bạn hoàn toàn có thể sử dụng Claude Desktop, Cursor,...)
Ở Visual Studio Code, mở Settings > tìm mcp.
12wYFSkM9Hv1YGR0bc0XDs3Zl14t9L35L

Mở settings.json và thêm nội dung sau ở mục mcp.servers

"doraemon_mcp_server": {
    "type": "stdio",
    "command": "python",
    "args": [
        "<đường dẫn tuyệt đối đến file>/doraemon_mcp_server/doraemon_mcp_server.py"
    ],
}

Start mcp server bằng cách hover vào doraemon_mcp_server rồi click Start
1BYwoPyLkMc4FQlOz_Wfg2JGYByqDHAFT

Mở Copilot Chat, chúng ta hãy test thử khi chưa sử dụng MCP Server thì sẽ thế nào (ở đây tôi sử dụng GPT-4o)
1d5Cu4TpLtQ8z4N_OCB-uw0FQlxFrgSfP
Kết quả: GPT-4o không thể trả lời vì nó không có thông tin về task của Doraemon

Thử sử dụng Doraemon MCP Server và hỏi về task hôm nay
1eASZ6la54nnXzaf_G2E17yJtTMJhSWeG

Kết quả: Bằng việc cung cấp get_tasks tool cho GPT-4o, nó đã có thể trả lời về task của Doraemon.

Kết luận

Model Context Protocol (MCP) mở ra một chương mới trong việc xây dựng các ứng dụng AI có trí nhớ dài hạn, hiểu bối cảnh sâu sắc, và dễ dàng tích hợp vào hệ sinh thái số. Đối với các nhà phát triển, việc nắm bắt và triển khai MCP sớm sẽ giúp tạo ra trải nghiệm người dùng tốt hơn, đặc biệt trong các sản phẩm AI đòi hỏi tính cá nhân hóa và liên tục.

Các tài nguyên tham khảo

https://modelcontextprotocol.io/introduction
https://modelcontextprotocol.io/examples