Ứng dụng MCP Architecture trong lập trình hệ thống Microservices

1. Core architecture

Hiểu cách MCP kết nối client, server và LLM (*)

Giao thức ngữ cảnh mô hình (MCP) được xây dựng trên kiến ​​trúc linh hoạt, có thể mở rộng cho phép giao tiếp liền mạch giữa các service và tích hợp LLM. Tài liệu này đề cập đến các thành phần và khái niệm kiến ​​trúc cốt lõi (Core architecture).

(*) Mô hình ngôn ngữ lớn, còn gọi là LLM 

Tổng quan

MCP tuân theo kiến ​​trúc client-server trong đó:

  • Hosts là các ứng dụng LLM (như Claude Desktop hoặc IDE) khởi tạo kết nối
  • Client duy trì kết nối 1:1 với server, bên trong host application
  • Server cung cấp ngữ cảnh, công cụ và lời nhắc cho client

https://prnt.sc/gKt-q1D8_9Fm

2. Core components

2.1. Protocol layer

Lớp giao thức xử lý việc đóng khung tin nhắn, liên kết  request/response và các mẫu giao tiếp cấp cao.

Demo code:

class ProtocolRequest Notification Result<,,> {
    // Handle incoming requests
    setRequestHandler<T>(schema: T, handler: (request: T, extra: RequestHandlerExtra) => Promise<Result>): void

    // Handle incoming notifications
    setNotificationHandler<T>(schema: T, handler: (notification: T) => Promise<void>): void

    // Send requests and await responses
    request<T>(request: Request, schema: T, options?: RequestOptions): Promise<T>

    // Send one-way notifications
    notification(notification: Notification): Promise<void>
}

Các lớp chính bao gồm:

  • Protocol
  • Client
  • Server

2.2. Transport layer

Lớp vận chuyển xử lý giao tiếp thực tế giữa client và server. MCP hỗ trợ nhiều cơ chế vận chuyển:

  1. Stdio transport

    • Sử dụng đầu vào/đầu ra chuẩn để giao tiếp
    • Lý tưởng cho các quy trình cục bộ
  2. HTTP with SSE transport

    • Sử dụng Sự kiện do server gửi cho các tin nhắn từ server đến client
    • HTTP POST cho các tin nhắn từ client đến server

Tất cả các phương tiện truyền tải đều sử dụng JSON-RPC 2.0 để trao đổi tin nhắn. Xem thông số kỹ thuật để biết thông tin chi tiết về định dạng tin nhắn Model Context Protocol.

2.3. Message types

MCP có các loại message chính sau:

  1. Yêu cầu mong đợi phản hồi từ phía bên kia:

    Demo code:

    interface Request {
      method: string;
      params?: { ... };
    }
    
  2. Kết quả là phản hồi thành công cho các yêu cầu:

    Demo code:

    interface Result {
      [key: string]: unknown;
    }
    
  3. Lỗi cho biết yêu cầu đã không thành công:

    Demo code:

    interface Error {
      code: number;
      message: string;
      data?: unknown;
    }
    
  4. Thông báo là tin nhắn một chiều và không mong đợi phản hồi:

    Demo code:

    interface Notification {
      method: string;
      params?: { ... };
    }
    

2.4. Connection lifecycle

1. Khởi tạo - Initialization

  1. Máy khách gửi initialize yêu cầu với phiên bản giao thức và khả năng
  2. Máy chủ phản hồi với phiên bản giao thức và khả năng của nó
  3. Khách hàng gửi initialized thông báo như một xác nhận
  4. Trao đổi tin nhắn bình thường bắt đầu

2. Trao đổi tin nhắn - Message exchange

Sau khi khởi tạo, các mẫu sau được hỗ trợ:

  • Yêu cầu-Phản hồi : Máy khách hoặc máy chủ gửi yêu cầu, máy chủ kia phản hồi
  • Thông báo : Mỗi bên gửi tin nhắn một chiều

3. Chấm dứt - Termination

Bất kỳ bên nào cũng có thể chấm dứt kết nối:

  • Đóng kết nối close()
  • Ngắt kết nối vận chuyển
  • Điều kiện lỗi

3. Error handling

MCP định nghĩa các mã lỗi tiêu chuẩn sau:

enum ErrorCode {
  // Standard JSON-RPC error codes
  ParseError = -32700,
  InvalidRequest = -32600,
  MethodNotFound = -32601,
  InvalidParams = -32602,
  InternalError = -32603
}

SDK và ứng dụng có thể xác định mã lỗi riêng của chúng ở mức trên -32000.

Lỗi được lan truyền thông qua:

  • Lỗi phản hồi yêu cầu
  • Sự kiện lỗi trên phương tiện vận chuyển
  • Trình xử lý lỗi cấp giao thức

Ví dụ thực hiện

Sau đây là một ví dụ cơ bản về việc triển khai máy chủ MCP:

import { Server } from "@modelcontextprotocol/sdk/server/index.js";

import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

const server = new Server({
  name: "example-server",
  version: "1.0.0"
}, {
  capabilities: {
    resources: {}
  }
});

// Handle requests
server.setRequestHandler(ListResourcesRequestSchema, async () => {
  return {
    resources: [
      {
        uri: "example://resource",
        name: "Example Resource"
      }
    ]
  };
});

// Connect transport
const transport = new StdioServerTransport();
await server.connect(transport);

4. Best practices

  1. Giao tiếp địa phương

    • Sử dụng stdio transport cho các quy trình cục bộ
    • Hiệu quả cho giao tiếp giữa các máy
    • Quản lý quy trình đơn giản
  2. Giao tiếp từ xa

    • Sử dụng SSE cho các tình huống yêu cầu khả năng tương thích HTTP
    • Xem xét các tác động bảo mật bao gồm xác thực và ủy quyền

5. Message handling

  1. Yêu cầu xử lý

    • Xác thực đầu vào một cách kỹ lưỡng
    • Sử dụng lược đồ an toàn kiểu
    • Xử lý lỗi một cách khéo léo
    • Thực hiện thời gian chờ
  2. Báo cáo tiến độ

    • Sử dụng mã thông báo tiến trình cho các hoạt động dài
    • Báo cáo tiến độ theo từng bước
    • Bao gồm tổng tiến độ khi biết
  3. Quản lý lỗi

    • Sử dụng mã lỗi thích hợp
    • Bao gồm các thông báo lỗi hữu ích
    • Dọn dẹp tài nguyên khi có lỗi

6. Security considerations

  1. An ninh vận chuyển

    • Sử dụng TLS cho kết nối từ xa
    • Xác thực nguồn gốc kết nối
    • Thực hiện xác thực khi cần thiết
  2. Xác thực tin nhắn

    • Xác thực tất cả các tin nhắn đến
    • Vệ sinh đầu vào
    • Kiểm tra giới hạn kích thước tin nhắn
    • Xác minh định dạng JSON-RPC
  3. Bảo vệ tài nguyên

    • Thực hiện kiểm soát truy cập
    • Xác thực đường dẫn tài nguyên
    • Giám sát việc sử dụng tài nguyên
    • Yêu cầu giới hạn tỷ lệ
  4. Xử lý lỗi

    • Không tiết lộ thông tin nhạy cảm
    • Ghi lại các lỗi liên quan đến bảo mật
    • Thực hiện vệ sinh đúng cách
    • Xử lý các tình huống DoS

7. Debugging and monitoring

  1. Ghi logs

    • Ghi lại sự kiện giao thức
    • Theo dõi luồng tin nhắn
    • Theo dõi hiệu suất
    • Ghi lại lỗi
  2. Chẩn đoán

    • Thực hiện kiểm tra kết nối
    • Theo dõi trạng thái kết nối
    • Theo dõi việc sử dụng tài nguyên
    • Hiệu suất hồ sơ
  3. Kiểm tra

    • Kiểm tra các phương tiện vận chuyển khác nhau
    • Xác minh xử lý lỗi
    • Kiểm tra các trường hợp ngoại lệ
    • Tải thử máy chủ
AI
Thiên Vũ

Thiên Vũ

whochoice@gmail.com

Bình luận

wave

Nhập từ khóa tìm kiếm