0

Giới thiệu về Model Context Protocol (MCP)

Trong kỷ nguyên bùng nổ của trí tuệ nhân tạo, chúng ta đã chứng kiến những bước tiến vượt bậc về khả năng suy luận và chất lượng của các mô hình ngôn ngữ lớn (LLM). Tuy nhiên, có một vấn đề vẫn luôn tồn tại đó là sự cô lập của các mô hình này với dữ liệu thực tế. Chúng thường bị "mắc kẹt" trong thế giới riêng của chúng và hệ thống cũ kỹ, khiến việc truy cập và tương tác với kho dữ liệu và công cụ bên ngoài mà chúng cần để thực sự hưu ích trong thế giới thực trở nên phức tạp. Mỗi khi cần kết nối với một nguồn dữ liệu mới, các nhà phát triển lại phải xây dựng một giải pháp tích hợp tùy chỉnh, dẫn đến tình trạng phân mảnh và khó mở rộng. Để giải quyết vấn đề này thì Model Context Protocol (MCP) xuất hiện như một lời giải, một "mảnh ghép còn thiếu" để AI có thể kết nối toàn diện hơn.

Trong bài viết này chúng ta sẽ cùng tìm hiểu về MCP, khái niệm, kiến trúc cho đến những ứng dụng thực tiễn. Các bạn hãy cùng theo dõi đến hết bài viết nhé.

Model Context Protocol (MCP) là gì?

Model Context Protocol (MCP) được Anthropic giới thiệu vào cuối năm 2024 , ra đời để giúp các hệ thống AI kết nối với nhiều nguồn dữ liệu khác nhau giúp các công cụ AI có thể tạo ra các phản hồi tốt hơn, phù hợp hơn với ngữ cảnh. Đây là một giao thức mã nguồn mở giúp chuẩn hóa cách các ứng dụng cung cấp ngữ cảnh (context) cho các mô hình ngôn ngữ lớn (LLM).

Hãy tưởng tượng MCP như một chiếc cổng USB-C đa năng cho thế giới AI. Thay vì phải vật lộn với vô số cổng kết nối và adapter khác nhau cho mỗi thiết bị (tương tự như việc xây dựng các trình kết nối riêng lẻ cho mỗi nguồn dữ liệu), MCP cung cấp một giao diện chuẩn hóa duy nhất. Điều này không chỉ đơn giản hóa quá trình tích hợp mà còn tăng cường độ tin cậy, cho phép các hệ thống AI truy cập dữ liệu một cách dễ dàng và nhất quán. Đối với các nhà phát triển, điều này giúp giảm thiểu đáng kể thời gian và công sức xây dựng các kết nối tùy chỉnh. Đối với toàn bộ hệ sinh thái AI, MCP hứa hẹn một tương lai nơi các hệ thống AI có thể duy trì ngữ cảnh khi di chuyển giữa các công cụ và bộ dữ liệu khác nhau, tạo nên một kiến trúc bền vững hơn so với các giải pháp tích hợp rời rạc hiện nay.

Kiến trúc tổng quát của MCP

Để hiểu rõ hơn về MCP, chúng ta cùng tìm hiểu về kiến trúc và các thành phần cấu tạo nên nó. MCP được xây dựng dựa trên một mô hình client-server và định nghia ba "primitives" cơ bản để quản lý ngữ cảnh.

Bạn có thể quan sát kiến trúc của MCP như hình bên trên cụ thể:

  • MCP Hosts: các chương trình như Claude Desktop, IDE hoặc công cụ AI (LLM) muốn truy cập dữ liệu thông qua MCP
  • MCP Clients: được nhúng vào các ứng dụng AI(như chatbot, trợ lý IDE, ...). Clients này sẽ khởi tạo và quản lý kết nối đến các MCP servers bằng một connection duy nhất.
  • MCP Servers: là thành phần trung gian, đóng vai trò cầu nối giữa mô hình AI và các nguồn dữ liệu hoặc công cụ bên ngoài. Server sẽ cũng cấp các khả năng của mình thông qua giao thức MCP.
  • Local Data Sources: các tập tin, file database và các dịch vụ trong máy tính của người dùng mà các MCP servers có thể truy cập một cách an toàn.
  • Remote Services: các hệ thống, dịch vụ từ xa sẵn có trên Internet mà các MCP Server có thể kết nối và sử dụng.

MCP định nghĩa ba loại "primitives" chuẩn hóa để tổ chức tương tác và quản lý ngữ cảnh. Cụ thể:

  • Prompts: Đây là các mẫu hướng dẫn hoặc lệnh được định sẵn, thường do người dùng trực tiếp kích hoạt thông qua các hành động như gõ lệnh slash hoặc chọn từ menu trong ứng dụng AI.
  • Resources: Đại diện cho các luồng dữ liệu có cấu trúc mà server cung cấp. Đó có thể là tệp tin, log, hoặc phản hồi từ API. Client (ứng dụng AI) sẽ kiểm soát việc truy cập và sử dụng các tài nguyên này.
  • Tools: Đây là các hàm có thể thực thi mà server cung cấp, ví dụ như gọi một API bên ngoài, truy vấn cơ sở dữ liệu, hoặc thực hiện một hành động như ghi tệp. Mô hình AI (LLM) sẽ tự quyết định khi nào và làm thế nào để sử dụng các công cụ này dựa trên ngữ cảnh của cuộc hội thoại hoặc yêu cầu.

Hướng dẫn sử dụng MCP Server với Github Copilot Extension trong VSCode

Trong bài viết này mình sẽ hướng dẫn các bạn tự tạo một MCP Server đơn giản giúp cung cấp dữ liệu lương của nhân viên và tích hợp nó với Github Copilot.

Tạo MCP Server

Cài đặt môi trường

Trong ví dụ này mình sẽ tạo MCP server với Node.js nên điều đầu tiên chúng ta cần chắc chắn rằng máy của mình đã cài đặt Node.js version 16 hoặc cao hơn. Để kiểm tra bạn đã cài đặt hay chưa hãy mở terminal và chạy command:

node --version
npm --version

Máy mình hiện tại đang sử dụng Node.js version 18.

Tiếp theo hãy tạo một dự án Node.js mới với những commands sau:

# Initialize a new npm project
npm init -y

# Install dependencies
npm install @modelcontextprotocol/sdk zod
npm install -D @types/node typescript

# Create our files
mkdir src
touch src/index.ts

Sau khi đã init xong tiến hành cập nhật lại file package.json và thêm type module với nội dung sau:

{
  "type": "module",
  "bin": {
    "weather": "./build/index.js"
  },
  "scripts": {
    "build": "tsc && chmod 755 build/index.js"
  },
  "files": [
    "build"
  ],
}

Tạo file tsconfig.json với nội dung sau:

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "Node16",
    "moduleResolution": "Node16",
    "outDir": "./build",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}

Sau khi đã init xong chúng ta sẽ tiến hành xây dựng server.

Tạo MCP Server

Cập nhật file index.ts đã tạo ở bước trên với nội dung sau:

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

// Create server instance
const server = new McpServer({
  name: "employee-salary",
  version: "1.0.0",
  capabilities: {
    resources: {},
    tools: {},
  },
});

Bổ sung tool lấy thông tin lương của nhân viên cho MCP Server

Tool này sẽ trả về thông tin lương của nhân viên, ở đây để cho đơn giản thì mình sẽ hash code thông tin của nhân viên nhưng trong thực tế chúng ta phải bổ sung logic gọi API bên ngoài, đọc dữ liệu từ trong database để trả về cho client.

interface Employee {
  id: number;
  name: string;
  salary: number;
}

server.tool(
  "get-employee-salary",
  "Get employee salary information",
  {
    name: z
      .string()
      .optional()
      .describe("Employee name. If not provided, returns all employee"),
  },
  async ({ name }) => {
    const employees: Employee[] = [
      {
        id: 1,
        name: "Nguyen Van A",
        salary: 500,
      },
      {
        id: 2,
        name: "Nguyen Van B",
        salary: 650,
      },
      {
        id: 3,
        name: "Nguyen Van C",
        salary: 450,
      },
      {
        id: 4,
        name: "Nguyen Van D",
        salary: 250,
      },
      {
        id: 5,
        name: "Nguyen Van B E",
        salary: 800,
      },
    ];

    if (name) {
      const employee = employees.find(
        ({ name: employeeName }) => employeeName == name
      );
      return {
        content: [
          {
            type: "text",
            text: JSON.stringify(employee, null, 2),
          },
        ],
      };
    }

    return {
      content: [
        {
          type: "text",
          text: JSON.stringify(employees, null, 2),
        },
      ],
    };
  }
);

Trong đoạn code trên mình có tạo một interface định nghĩa thông tin của nhân viên và trả về thông tin nhân viên nếu có truy vấn cần thông tin nhân viên tên bất kỳ, nếu không có truy vấn tên thì mình sẽ trả về toàn bộ nhân viên cho client.

Chạy server

Sau khi đã khởi tạo và bổ sung tool cho server thì ta sẽ tiến hành bổ sung script để chạy server và build server.

async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.log("Employee staff MCP Server running on stdio");
}

main().catch((error) => {
  console.error("Fatal error in main():", error);
  process.exit(1);
});

Sau khi đã thêm script ta tiến hành chạy command để build server:

npm run build

Sau khi đã build xong server ta sẽ tiến hành tích hợp MCP Server vào Github Copilot.

Thêm MCP Server vào Github Copilot

Đầu tiên hay chắc chăn rằng ta đã enable setting chat.mcp.enabled. Tiến hành mở cửa sổ VSCode mới và tạo thư mục và file sau .vscode/mcp.json. Sau khi tạo file bạn sẽ thấy một button Add Server ... hiện lên khi mở file.

Nhấn vào Add Server thêm nội dung với option sau.

Command (stdio) > node (path-đến-file-index.js-sau-khi-chạy-npm-run-build-ở-bước-trước) > employee-salary

Sau khi thêm xong ta sẽ có nội dung file json như sau:

{
    "servers": {
        "employee-salary": {
            "type": "stdio",
            "command": "node",
            "args": [
                "/xxx/xxx/xxx/xxx/build/index.js"
            ]
        }
    }
}

Nếu file mcp.json của bạn đã có nội dung như trên thì tiến hành mở cửa sổ Github Copilot Chat và chuyển sang Agent mode. Ta sẽ có tool và hình như sau là Copilot đã nhận MCP Server

Hỏi đáp thông tin sau khi tích hợp MCP Server

Sau khi thực hiện các bước bên trên thì ta đã thêm thành công tool lấy danh sách nhân viên kèm lương của họ. Bây giờ ta sẽ tiến hành hỏi đáp với Copilot xem có hoạt động hay không. Minh sẽ lần lượt hỏi các câu hỏi sau xem Copilot có trả lời được không nhé:

  • Công ty hiện tại có bao nhiêu nhân viên?
  • Hiện tại ai là người có lương cao nhất?
  • Cho tôi thông tin lương của Nguyen Van A

Như bạn có thể thấy mình đã tích hợp thành công MCP Server vào Github Copilot.

Kết bài

Hy vọng bài viết đã mang đến cho bạn một cái nhìn tổng quan, dễ hiểu về MCP – từ lý khái niệm, kiến trúc cho đến thực hành xây dựng MCP Server. Nếu bạn thấy nội dung hữu ích hoặc có góc nhìn khác, đừng ngần ngại để lại bình luận hoặc chia sẻ thêm suy nghĩ. Cảm ơn bạn đã đồng hành đến cuối bài viết! 🙌


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí