Tiêu chuẩn tích hợp ứng dụng kết nối với MCP

Máy chủ MCP thiết lập khung để kết nối các chức năng của ứng dụng (công cụ MCP) với Connected Apps Platform. Để cho phép Gemini chọn, gọi và xử lý kết quả của dịch vụ một cách đáng tin cậy hơn, cấu hình MCP của bạn phải tuân thủ nghiêm ngặt các tiêu chuẩn sau.

Nguyên tắc chỉ đạo

Đối với mỗi chức năng, hãy tập trung vào ý định của người dùng và các trường hợp sử dụng, chứ không phải khả năng của chức năng đó. Nội dung mô tả là cách chính để bạn cho mô hình biết công cụ của bạn dùng để làm gì và có thể phản hồi những trường hợp sử dụng nào.

Lập phiên bản

Để hỗ trợ các hoạt động triển khai MCP mạnh mẽ và có thể mở rộng, hãy áp dụng cấu trúc URI có cấu trúc sử dụng tính năng tạo phiên bản dựa trên đường dẫn, ví dụ: /v1, /v2. Việc này giúp bạn duy trì khả năng tương thích ngược và kiểm soát các tính năng mới. Việc bổ sung các miền con dành riêng cho nhà cung cấp, chẳng hạn như https://gemini.mcp.company.com/mcp/v1, cho phép quản lý lưu lượng truy cập một cách chi tiết và tối ưu hoá các định nghĩa công cụ phù hợp với bối cảnh riêng và hành vi xử lý của các mô hình AI khác nhau.

Khả năng tương thích với phiên bản giao thức MCP

Nền tảng ứng dụng được kết nối hỗ trợ quy cách của Giao thức ngữ cảnh mô hình (MCP) lên đến phiên bản 2025-11-25. Các bản phát hành thông số kỹ thuật mới hơn chưa được hỗ trợ.

  • Trách nhiệm của nhà phát triển: Bạn có trách nhiệm đảm bảo máy chủ MCP của mình tuân thủ nghiêm ngặt phiên bản giao thức mà Nền tảng ứng dụng đã kết nối (2025-11-25) hỗ trợ trong quá trình bắt tay initialize và trên tất cả các định nghĩa về công cụ và giản đồ.
  • Khả năng tương thích ngược của nền tảng: Khi Connected Apps Platform áp dụng các phiên bản thông số kỹ thuật MCP mới hơn trong tương lai, ứng dụng khách của chúng tôi sẽ duy trì khả năng tương thích ngược với các phiên bản giao thức được hỗ trợ trước đó để các hoạt động tích hợp chính thức hiện có tiếp tục hoạt động mà không bị gián đoạn.
  • Quản lý việc nâng cấp: Khi bạn đã sẵn sàng áp dụng quy cách MCP mới được hỗ trợ hoặc giới thiệu các thay đổi về giản đồ, hãy hiển thị các bản cập nhật đó trên một đường dẫn URI mới có phiên bản (ví dụ: /mcp/v2) trong khi vẫn duy trì điểm cuối hiện có (/mcp/v1) cho lưu lượng truy cập đang hoạt động.

Bạn có thể thay đổi giản đồ MCP giữa các phiên bản ứng dụng. Bạn nên tận dụng tính năng này và tạo phiên bản cho các điểm cuối MCP để hỗ trợ việc triển khai các tính năng mới một cách nhẹ nhàng hoặc chỉ dựa vào các thay đổi có khả năng tương thích ngược.

Quy cách của giao thức truyền tải

Connected Apps Platform chỉ hỗ trợ quy cách Giao thức ngữ cảnh mô hình vận chuyển HTTP có thể truyền trực tuyến phiên bản 2025-03-26 trở lên. Phiên bản này không hỗ trợ giao thức truyền tải HTTP cũ có SSE được mô tả trong quy cách ngày 5 tháng 11 năm 2024.

  • Một điểm cuối HTTP. Điểm cuối MCP được cung cấp trong Connected Console (ví dụ: https://api.example.com/mcp) là URL duy nhất mà các sản phẩm Google có thể áp dụng gửi tất cả yêu cầu JSON-RPC (initialize, tools/list, tools/call) thông qua HTTP POST tiêu chuẩn.
  • Truyền trực tuyến SSE trong HTTP có thể truyền trực tuyến. Phương thức truyền tải SSE nhiều điểm cuối cũ không được hỗ trợ, nhưng các Sự kiện do máy chủ gửi như text/event-stream được hỗ trợ trong Streamable HTTP. Các yêu cầu gửi đi từ các sản phẩm Google hiện hành bao gồm Accept: application/json, text/event-stream, nghĩa là máy chủ của bạn có thể trả về tải trọng application/json tiêu chuẩn hoặc truyền trực tuyến các phản hồi gia tăng bằng cách sử dụng Content-Type: text/event-stream trực tiếp trong nội dung phản hồi HTTP POST.
  • GET stream và 405 Method Not Allowed. Ứng dụng có thể thử một luồng GET không bắt buộc trên điểm cuối cho thông báo từ máy chủ đến ứng dụng. Nếu máy chủ của bạn không có trạng thái hoặc chỉ có yêu cầu-phản hồi, thì việc trả về HTTP 405 Method Not Allowed sẽ được proxy ứng dụng của sản phẩm Google hiện hành hỗ trợ và xử lý rõ ràng.

Hướng dẫn về máy chủ

Connected Apps Platform được tối ưu hoá để tiếp nhận các chỉ dẫn của máy chủ, cho phép kiểm soát hành vi của mô hình ở mức độ mà các phương tiện khác không thể thực hiện được.

Làm theo hướng dẫn về máy chủ.

Xem như một "gợi ý cho mô hình" kèm theo bối cảnh sử dụng

Hãy làm theo các nguyên tắc sau đây khi cung cấp gợi ý cho mô hình.

  • Viết hướng dẫn dưới dạng "gợi ý" hoặc hướng dẫn tổng quan để giúp LLM hiểu được mục đích và chức năng tổng thể của máy chủ.
  • Mô tả những việc mà công cụ có thể làm, thay vì liệt kê các tính năng hoặc mô tả cách mô hình nên sử dụng các công cụ và tài nguyên của máy chủ. Nếu hiểu đúng "nội dung", mô hình có thể xác định cách thức khá chính xác dựa trên hành trình của người dùng.
  • Giả sử văn bản này sẽ được thêm trực tiếp vào câu lệnh hệ thống của mô hình. Hãy giữ cho câu lệnh rõ ràng, mang tính chỉ dẫn và tiết kiệm mã thông báo.

Bổ sung chứ không lặp lại

Sử dụng không gian này cho bối cảnh chung áp dụng cho tất cả các công cụ, tránh sự dư thừa với các mô tả công cụ riêng lẻ.

Ví dụ về hướng dẫn cho máy chủ

Các ví dụ sau đây cho thấy những việc nên làm và không nên làm liên quan đến việc viết đúng cách hướng dẫn máy chủ.

Recommended (Nên dùng) Không nên

Hãy đóng vai người duy trì kho lưu trữ GitHub chuyên nghiệp. Máy chủ này cung cấp quyền truy cập sâu vào siêu dữ liệu kho lưu trữ, trình theo dõi sự cố và quy trình PR. Hãy sử dụng công cụ này để duy trì tình trạng dự án, tự động hoá quy trình phân loại và đảm bảo các tiêu chuẩn về mã. Giả sử tất cả hành động đều được thực hiện trong bối cảnh của tổ chức đã xác thực, trừ phi có quy định khác. Ưu tiên xác định các chuỗi không hoạt động hoặc PR không liên kết để giữ cho kho lưu trữ luôn ngăn nắp.

Ngắn gọn, mang tính chỉ dẫn và bổ sung cho mô hình

  • Xác định "nội dung" (tình trạng dự án, phân loại) thay vì "cách thức"
  • Đề cập đến phạm vi xác thực áp dụng cho tất cả công cụ

Máy chủ này có các công cụ cho GitHub. Bạn nên sử dụng công cụ list_issues khi người dùng hỏi về các vấn đề. Bạn có thể sử dụng create_pull_request để tạo PR. Hãy sử dụng các công cụ này một cách cẩn thận để giúp người dùng quản lý mã của họ. Luôn kiểm tra tên kho lưu trữ trước khi gọi một công cụ. Nếu người dùng yêu cầu tóm tắt, hãy gọi các công cụ trước rồi tóm tắt kết quả

  • không liệt kê lại tên công cụ,
  • đừng hướng dẫn mô hình "cách" suy nghĩ, vì điều này có thể xung đột với khả năng suy luận tích hợp của mô hình, vốn sử dụng bối cảnh của người dùng để đưa ra lựa chọn phù hợp.
  • không giải thích bản chất của quyền truy cập của máy chủ hoặc các quy tắc ràng buộc cụ thể của quyền truy cập đó)

Nguyên tắc về công cụ

Các nguyên tắc sau đây mô tả các phương pháp hay nhất để tạo cấu hình máy chủ MCP cho nhiều chức năng hoặc công cụ trong ứng dụng của bạn.

Quy ước đặt tên công cụ

Hãy tuân thủ các nguyên tắc sau khi đặt tên cho công cụ:

Sử dụng tên trực quan, con người có thể đọc được

Sử dụng tên mà con người có thể đọc được, có ý nghĩa rõ ràng, trực quan thay vì tên mơ hồ. Ví dụ: get_user_information dễ hiểu hơn userInfo.

Tuân thủ kiểu viết hoa phù hợp

Tuân thủ các quy tắc viết hoa sau đây đối với tên hàm của công cụ và điều kiện kích hoạt ứng dụng:

  • Vỏ bọc chức năng của công cụ. Sử dụng snake_case hoặc camelCase cho tên hàm công cụ được xác định trong giản đồ MCP (ví dụ: get_user_information hoặc publishDraft).
  • Vỏ tay cầm kích hoạt ứng dụng. Các điều kiện kích hoạt và lượt đề cập đến ứng dụng (ví dụ: @MyTwoWordApp) không phân biệt chữ hoa chữ thường. Nền tảng này chuẩn hoá dữ liệu đầu vào của người dùng trên chữ thường (@mytwowordapp), PascalCase (@MyTwoWordApp) và camelCase (@myTwoWordApp).
  • Định dạng tên hiển thị. Đăng ký tiêu đề chính thức của ứng dụng bằng cách sử dụng PascalCase hoặc dấu cách chuẩn để hiển thị rõ ràng trong các phần tử trên giao diện người dùng.
  • Xử lý lỗi chính tả. Mặc dù các biến thể viết hoa được xử lý tự động, nhưng lỗi chính tả ký tự (ví dụ: @mytwowrodapp) dựa vào tính năng nhận dạng ý định dự phòng thay vì so khớp chuỗi trực tiếp. Nhà phát triển nên khuyến khích việc viết đúng chính tả tên người dùng trong tài liệu.

Sử dụng cách đặt tên rõ ràng theo dạng động từ-danh từ

Sử dụng cách đặt tên verb_noun cụ thể và tránh mơ hồ, ví dụ: publish_draft tốt hơn handle_content.

Độ chi tiết của công cụ

Hãy tuân thủ các nguyên tắc sau đây về mức độ chi tiết của công cụ.

Xem công cụ là điểm cuối nguyên tử

Hãy coi các công cụ là điểm cuối nguyên tử mà không có điều kiện bên trong công cụ hoặc nhiều chức năng có các tham số bắt buộc tương ứng. Các công cụ chi tiết cho phép mô hình liên kết các bước một cách logic, giúp giảm thiểu hiện tượng ảo tưởng.

Sử dụng giản đồ phẳng hơn

Nếu bạn cần các đối tượng lồng nhau sâu hoặc logic giản đồ oneOf/anyOf phức tạp để xác thực dữ liệu đầu vào, thì công cụ của bạn có thể quá rộng.

Tuân thủ các biện pháp bảo vệ về tải trọng và tổng hợp trước

Mặc dù giao thức không bắt buộc phải tổng hợp trước dữ liệu đối với các tải trọng nhỏ, có phạm vi, nhưng trên thực tế, việc tổng hợp trước ở phần phụ trợ là rất cần thiết khi làm việc với các tập bản ghi lớn, nhật ký theo chiều dọc và tập dữ liệu nhiều nguồn. Connected Apps Platform thực thi các biện pháp bảo vệ liên quan đến giới hạn cửa sổ ngữ cảnh, độ trễ thực thi và các bước suy luận của mô hình. Để tuân thủ các rào chắn bảo vệ này, hãy làm theo các nguyên tắc sau:

  • Lọc và tóm tắt trên phần phụ trợ. Luôn lọc, tổng hợp trước hoặc tóm tắt các luồng dữ liệu lớn trên máy chủ MCP trước khi trả về phản hồi cho các sản phẩm Google có liên quan.
  • Tránh kết xuất thô. Tuyệt đối không đưa các hàng cơ sở dữ liệu thô hoặc nhật ký hoàn chỉnh chưa được lập chỉ mục vào tải trọng trả về của công cụ.

Bỏ qua các công cụ nội bộ và siêu công cụ

Chỉ hiển thị các chức năng dành cho mô hình trong phản hồi tools/list của máy chủ:

  • Lọc các công cụ trợ giúp: Bỏ qua mọi công cụ nội bộ, công cụ quản trị hoặc công cụ meta không dành cho mô hình gọi (ví dụ: kiểm tra tình trạng máy chủ, quy trình thiết lập nội bộ hoặc trình trợ giúp tiện ích cho nhà phát triển).
  • Hiệu quả của cửa sổ ngữ cảnh: Việc loại trừ các công cụ không cần thiết giúp giản lược giản đồ MCP, giảm mức tiêu thụ mã thông báo trong cửa sổ ngữ cảnh và ngăn mô hình nhầm lẫn khi định tuyến công cụ. Các máy chủ MCP hiển thị hàng chục công cụ hoặc giản đồ "siêu công cụ" lồng nhau sâu sẽ bị gắn cờ trong quá trình xem xét để khắc phục.

Việc nên làm và không nên làm khi chọn mức độ chi tiết của công cụ

Các ví dụ sau đây cho thấy những việc nên làm và không nên làm liên quan đến việc đặt tên công cụ và mức độ chi tiết.

Recommended (Nên dùng) Không nên

Các công cụ chi tiết có tên và tham số rõ ràng

Giản đồ đầu vào cho mỗi công cụ là nghiêm ngặt. Nếu muốn tạo người dùng, LLM phải cung cấp email. Nếu muốn xoá, ứng dụng phải cung cấp mã nhận dạng. Không cần phải đoán.

...
@mcp.tool()
def create_user(email: str, role: str = "viewer") -> str:
    """Register a new user. Returns the new User ID."""
    # Logic is purely creation
    return "user_123"

@mcp.tool()
def delete_user(user_id: str) -> str:
    """Permanently remove a user by their ID."""
    # Logic is purely deletion
    return f"User {user_id} deleted"

@mcp.tool()
def update_user_role(user_id: str, new_role: str) -> str:
    """Change an existing user's permission level."""
    return f"User {user_id} is now {new_role}"

    ...

Tên công cụ: manage_user

Nội dung mô tả: "Sử dụng công cụ này để tạo, cập nhật, xoá hoặc truy xuất người dùng".

...
@mcp.tool()
def manage_user(
    action: Literal["create", "update", "delete", "get"],
    user_id: Optional[str] = None,
    email: Optional[str] = None,
    role: Optional[str] = "viewer"
) -> str:
    """
    Use this to manage users.
    WARNING: logic is hidden inside Python, not visible in the schema.
    """
    if action == "create":
        if not email: return "Error: Email required for creation" # Runtime error, not schema error
        return f"Created user {email}"
    elif action == "delete":
        if not user_id: return "Error: User ID required"
        return f"Deleted {user_id}"
    
    return "Action completed"
    """
    ...

Khai báo chú thích về công cụ để đảm bảo an toàn

Định cấu hình chú thích giao thức bên trong định nghĩa công cụ để truyền tải hành vi thực thi và kích hoạt các cổng an toàn tích hợp sẵn trên các sản phẩm Google có liên quan:

  • Cổng xác nhận trong thời gian chạy: các sản phẩm Google có liên quan sử dụng annotations.destructiveHint: true và annotations.openWorldHint: true làm cờ chính để kích hoạt lời nhắc xác nhận của người dùng trong thời gian chạy. Khai báo destructiveHint: true về các hành động thay đổi trạng thái, ghi hoặc huỷ và đặt openWorldHint: true cho các công cụ tương tác với môi trường thế giới mở hoặc môi trường bên ngoài để nền tảng nhắc người dùng xác nhận trước khi thực thi.
  • Gợi ý truy vấn chỉ có thể đọc: đặt readOnlyHint: true trên các công cụ truy vấn chỉ tìm nạp dữ liệu mà không sửa đổi trạng thái của phần phụ trợ.
  • Giá trị mặc định của chú thích rõ ràng: theo thông số kỹ thuật của Giao thức ngữ cảnh mô hình, việc bỏ qua readOnlyHint sẽ khiến ứng dụng giả định readOnlyHint: false và destructiveHint: true theo mặc định để đảm bảo an toàn. Việc khai báo rõ ràng chú thích trên tất cả các công cụ đảm bảo định tuyến mô hình có thể dự đoán được và đảm bảo an toàn thực thi thích hợp.

Nội dung mô tả công cụ

Nội dung mô tả là bối cảnh duy nhất mà mô hình có để quyết định xem công cụ của bạn có thể giải quyết vấn đề hiện tại hay không. Hãy tuân thủ các nguyên tắc sau khi viết nội dung mô tả:

Viết chỉ dẫn, không viết nhận xét

Viết nội dung mô tả công cụ dưới dạng hướng dẫn, chứ không phải dưới dạng chú thích mã (thường là thụ động). LLM phản hồi tốt với các chỉ thị.

Giải thích "cách thức"

Một nội dung mô tả tốt sẽ giúp thu hẹp khoảng cách giữa "Tôi có một công cụ" và "Tôi biết cách kết nối công cụ này vào một cuộc trò chuyện".

Giải thích "lý do"

Phân biệt công cụ này với các công cụ tương tự, ví dụ: "Dùng công cụ này cho người dùng nội bộ, dùng customer_update cho người dùng bên ngoài".

Cho mô hình biết nơi tìm đối số, ví dụ: "từ công cụ order_search".

Chỉ định định dạng

Chỉ định đơn vị (mét so với feet) và định dạng (ngày ISO, phiên bản ngữ nghĩa).

Tránh để mô hình tự quyết định

Đừng hướng dẫn mô hình sử dụng "phán đoán tốt nhất" hoặc đề xuất các hành động không bắt buộc, không có hướng dẫn.

Ví dụ về nội dung mô tả công cụ

Các ví dụ sau đây cho thấy những điều nên làm và không nên làm liên quan đến việc viết nội dung mô tả công cụ.

Recommended (Nên dùng) Không nên

Nguồn đáng tin cậy

"Cập nhật email của người dùng. Phải sử dụng chính xác UUID "id" do công cụ search_users trả về. Đừng suy luận hoặc đoán mã nhận dạng người dùng."

(Nó liên kết rõ ràng kết quả của một công cụ với dữ liệu đầu vào của công cụ này.)

"Cập nhật địa chỉ email của người dùng".

(Mô hình có thể đoán một mã nhận dạng như 12345.)

Định dạng và quy tắc ràng buộc

"Lên lịch cuộc họp. "date" phải ở định dạng ISO 8601 (YYYY-MM-DD). Nếu người dùng nói "ngày mai" hoặc một mốc thời gian tương đối khác, hãy tính ngày dựa trên bối cảnh hiện tại."

"Lên lịch cuộc họp cho ngày đã cho."

(trông có vẻ chính xác đối với con người (ví dụ: "ngày mai") nhưng không vượt qua được quy trình xác thực giản đồ (cần "2025-10-12"))

Kỳ vọng về kết quả đầu ra

"Truy xuất nhật ký máy chủ. Trả về 50 dòng văn bản thô cuối cùng. Để phân tích, hãy yêu cầu khung thời gian nhỏ hơn để tránh giới hạn về mã thông báo."

"Lấy nhật ký máy chủ".

(Mô hình có thể gọi một công cụ cần có bản tóm tắt, nhận được một tệp kết xuất JSON thô 5 MB và có thể dẫn đến trải nghiệm người dùng không tốt.)

@mcp.tool()
def update_campaign_status(campaign_id: str, status: str) -> str:
    """
    Promotes or pauses an advertising campaign.
    
    CRITICAL USAGE RULES:
    1. 'campaign_id': Must be the 32-character UUID retrieved from 'list_campaigns'.
    2. 'status': Must be exactly one of: ['active', 'paused', 'archived'].
    
    Returns: A confirmation string with the new status and timestamp.
    """
    # Logic...

    ...

Nội dung mô tả này đóng vai trò như một hướng dẫn sử dụng thu nhỏ. Lớp này xử lý Nguồn (nơi lấy mã nhận dạng), Quy tắc ràng buộc (enum hợp lệ) và Hành động.

@mcp.tool()
def update_campaign_status(id: str, status: str) -> str:
    """
    Updates the campaign status in the database.
    """
    # Logic...

Điều này dựa vào tên biến để thực hiện tất cả công việc. Điều này khiến mô hình phải đoán các giá trị hợp lệ cho "status"

Tham số của công cụ

Ngoài bản thân công cụ, hãy mô tả các tham số để làm rõ chúng.

Các loại rõ ràng

Sử dụng các loại mạnh, cụ thể (string, integer, boolean, array).

Sử dụng enum cho các tập hợp giá trị cố định

Nếu một tham số chỉ chấp nhận một tập hợp giá trị cố định (ví dụ: daylight, cool, warm), hãy liệt kê các giá trị đó trong một mảng enum. Điều này giúp cải thiện đáng kể độ chính xác.

Nêu rõ các tham số bắt buộc

Xác định rõ những tham số bắt buộc để hàm hoạt động.

Áp dụng tính năng so khớp giản đồ ngữ nghĩa

Khi tích hợp ứng dụng, bạn có thể cần phải so khớp giản đồ ngữ nghĩa từ các tham số của công cụ với ngành dọc mà bạn đang phát triển. Bạn sẽ nhận được giản đồ dọc dự kiến (giản đồ JSON) trong quá trình tham gia.

Ví dụ về tham số của công cụ

Các ví dụ sau đây cho thấy những việc nên làm và không nên làm liên quan đến việc xử lý các tham số của công cụ.

Recommended (Nên dùng) Không nên

Định dạng và đơn vị của đối số

radius: "Bán kính tính bằng mét. Phải là số thực động > 0."

(ngăn chặn ảo tưởng về đơn vị)

radius: "Bán kính của hình tròn."

Định dạng và bối cảnh của mã nhận dạng

user_id: "UUID của cơ sở dữ liệu (ví dụ: 550e8400-e29b...). Đừng nhập địa chỉ email ở đây."

Lưu ý: Theo phương pháp hay nhất, tất cả các trường mã nhận dạng dạng số phải được coi là giá trị Chuỗi. Cụ thể, nếu mã nhận dạng của bạn có thể có từ 10 chữ số trở lên, thì bạn có nguy cơ bị các hệ thống nội bộ cắt bớt (buộc phải chuyển vào vùng chứa 32 bit) và phiên bản này sẽ được mô hình sử dụng trong các lệnh gọi công cụ trong tương lai.

(ngăn lỗi loại)

user_id: "Mã nhận dạng của người dùng".

Kỳ vọng về giá trị trả về

"Cập nhật bản ghi và trả về đối tượng JSON đã cập nhật, bao gồm cả dấu thời gian mới."

(Cho mô hình biết rằng mô hình không cần gọi công cụ "get" ngay sau công cụ "update" để xác minh thay đổi.)

"Cập nhật bản ghi".


@mcp.tool()
def search_logs(query: str, limit: int = 10) -> str:
    """
    Searches server error logs using Lucene syntax (e.g. 'level:ERROR AND service:auth').
    
    Args:
        query: A Lucene-formatted search string.
        limit: Max results to return. capped at 50.
    
    Returns:
        A formatted string of log entries with timestamps.
    """
    ...
  
@mcp.tool()
def search_logs(query: str, limit: int = 10) -> str:
    """Searches the logs."""
    ...

LLM không biết "truy vấn" hỗ trợ cú pháp nào (SQL? Biểu thức chính quy? Văn bản thuần tuý?) Nó không biết "giới hạn" tối đa là bao nhiêu.

Xử lý phản hồi và lỗi

Theo nguyên tắc cốt lõi của Câu trả lời là câu lệnh tiếp theo, công cụ này báo cáo kết quả thực thi cơ bản bằng cách trả về một tải trọng dữ liệu, sau đó được dán trực tiếp vào cửa sổ ngữ cảnh của LLM. Kết quả thành công hay thất bại sẽ quyết định điều gì xảy ra tiếp theo:

  • Nếu thành công: mô hình cần giá trị trả về để biết điều gì đã xảy ra và quyết định bước tiếp theo.
  • Nếu không thành công: mô hình cần biết lý do không thành công và cách khắc phục. Sự cố (lỗi 500) sẽ dừng cuộc trò chuyện; thông báo lỗi mô tả cho phép mô hình tự sửa lỗi.

Cho dù logic cơ bản của công cụ thành công hay thất bại, bạn đều phải định dạng tải trọng giá trị trả về để mô hình có thể dễ dàng phân tích cú pháp. Hãy làm theo các phương pháp hay nhất sau đây khi đóng gói tải trọng phản hồi.

Sử dụng JSON

Định dạng dữ liệu có cấu trúc trong TextContent (Quy tắc ràng buộc tạm thời). Vì structuredContent chưa được hỗ trợ trong Connected Apps Platform, nên hãy chuyển đổi tuần tự dữ liệu của bạn theo cách thủ công. Ngay cả khi trả về một danh sách đơn giản, hãy json.dumps() danh sách đó.

Đưa URL vào câu trả lời

URL được trả về phải tương đối ngắn và không có nhiều tham số. Bạn nên sử dụng các dịch vụ rút ngắn URL để tiết kiệm số lượng mã thông báo và giảm nguy cơ ảo tưởng.

Nội dung tự mô tả để chống ảo tưởng

Luôn ghép nối mã thô hoặc mã nhận dạng nội bộ với tên hiển thị mà con người có thể đọc được, đơn vị đo lường rõ ràng và phạm vi tham chiếu. Tuyệt đối không trả về khoá từ điển nén hoặc mã số chưa được liên kết, vì điều này sẽ buộc mô hình phải suy luận ngữ cảnh.

Triển khai biện pháp xử lý lỗi hữu ích

Trả về thông báo lỗi rõ ràng, có ý nghĩa để mô hình có thể hiểu được vấn đề và thông báo cho người dùng. Xem phần Xử lý lỗi MCP.

Sử dụng try/except

Gói logic công cụ trong các khối try/except và trả về lỗi được chuyển đổi thành chuỗi.

Cung cấp lỗi có thể xử lý

Đề xuất bước tiếp theo trong thông báo lỗi (ví dụ: "Trước tiên, hãy thử dùng công cụ X").

Xác nhận tác vụ

Đừng trả về chuỗi trống cho các công cụ có tác dụng phụ (tạo/cập nhật/xoá).

Ví dụ về phản hồi và xử lý lỗi

Các ví dụ sau đây cho thấy những việc nên làm và không nên làm liên quan đến phản hồi và xử lý lỗi.

Recommended (Nên dùng) Không nên

Chuyển đổi tuần tự rõ ràng


...
import json

@mcp.tool()
def query_metrics(metric_id: str) -> str:
    result = {"id": metric_id, "value": 42, "unit": "ms"}
    # GOOD: Returns '{"id": "cpu", "value": 42}' -> Valid JSON
    return json.dumps(result, indent=2)

...
@mcp.tool()
def query_metrics(metric_id: str) -> str:
    result = {"id": metric_id, "value": 42, "unit": "ms"}
    # BAD: Returns "{'id': 'cpu', 'value': 42}" -> Invalid JSON
    return str(result)

Bắt và thông báo


...
@mcp.tool()
def get_user_details(user_id: str) -> str:
    try:
        user = db.get_user(user_id)
        if not user:
             # GOOD: Informative error returned as content
            return f"Error: User with ID '{user_id}' not found. Please verify the ID using 'search_users'."
        return json.dumps(user)
    except Exception as e:
        return f"Error: Database connection failed ({str(e)}). Please try again later."

(Công cụ "thành công" về mặt kỹ thuật (trả về một chuỗi), nhưng chuỗi đó chứa thông tin chi tiết về lỗi. Mô hình đọc thông tin này, nhận ra "Ồ, mã nhận dạng đó không tồn tại" và có thể yêu cầu người dùng cung cấp mã nhận dạng chính xác.)


...
@mcp.tool()
def get_user_details(user_id: str) -> str:
    # BAD: Unhandled exception if ID not found
    user = db.get_user(user_id)
    return json.dumps(user)

(Nếu get_user không thành công, máy chủ sẽ gửi lỗi 500. LLM nhận được lỗi thực thi chung chung và không biết lý do (Mã nhận dạng có sai không? Cơ sở dữ liệu ngừng hoạt động? Quyền bị từ chối?). Có thể ứng dụng sẽ thử lại chính xác dữ liệu đầu vào không hợp lệ đó.)

Câu trả lời trống

...
@mcp.tool()
def post_story(story_content: str) -> str:
    service_name = "story_service"
    api_client.post("/stories", json={"content": story_content})
    # GOOD: Explicit confirmation of state change.
    return f"Service '{service_name}' successfully posted content. Status is now 'posted'."

...
@mcp.tool()
def post_story(storyContent: str):
    subprocess.post(["postsrv", "story", storyContent])
    # BAD: Returns null/empty string. Model is confused.

LLM thường bị nhầm lẫn khi nhận được phản hồi trống. Chúng có thể bịa ra thông báo "Công cụ không hoạt động" hoặc chỉ lặp lại lệnh gọi.

Tải trọng tự mô tả chống ảo giác

Luôn ghép nối mã thô hoặc mã nhận dạng nội bộ với tên hiển thị mà con người có thể đọc được, đơn vị đo lường rõ ràng và phạm vi tham chiếu thông thường.

{"lab_code": "2345-7", "display_name": "Glucose [Mass/volume] in Blood", "value": 105, "unit": "mg/dL", "reference_range": "70-99 mg/dL"}

(Điều này cho mô hình biết chính xác ý nghĩa của giá trị mà không buộc mô hình phải suy luận đơn vị hoặc ngưỡng tham chiếu.)

Mã nhận dạng thô, mã nén tuỳ chỉnh hoặc mã chưa được liên kết

Trả về mã nhận dạng nội bộ thô, từ viết tắt trong từ điển tuỳ chỉnh hoặc mã số không có nhãn.

{"code": "2345-7", "v": 105}

(Buộc mô hình phải đoán xem 105 là gì, dẫn đến việc tạo ra đơn vị ảo, thiếu ngữ cảnh hoặc giải thích không chính xác.)

Xử lý lỗi MCP

Điều quan trọng là phải xử lý lỗi một cách linh hoạt.

  • Đối với các lỗi có thể khôi phục (chẳng hạn như mã nhận dạng người dùng không hợp lệ hoặc thiếu tham số không bắt buộc), hãy trả về một chuỗi văn bản thông thường chứa thông tin chi tiết về lỗi trong phản hồi của công cụ. Điều này cho phép mô hình kiểm tra ý kiến phản hồi, hiểu được điều gì đã xảy ra và tự sửa hoặc nhắc người dùng làm rõ.
  • Đối với các lỗi nghiêm trọng (chẳng hạn như giới hạn tốc độ, lỗi xác thực hoặc lỗi quyền, hoặc lỗi máy chủ phụ trợ), hãy gửi McpError kèm theo mã lỗi thích hợp để nền tảng có thể xử lý lỗi một cách có hệ thống.

Ví dụ về nội dung phản hồi lỗi (JSON)

{
  "jsonrpc": "2.0",
  "error": {
    "code": -32302,
    "message": "User permission denied for the requested operation.",
    "data": null
  },
  "id": 1
}

Message chứa tệp kết xuất JSON của trường ErrorData của MCP. Bằng cách trả về code chính xác và message mà mô hình có thể nhìn thấy, Connected Apps Platform có thể đọc thông báo lỗi và chuyển tiếp nội dung giải thích hữu ích, bằng ngôn ngữ tự nhiên cho người dùng. Ví dụ: "Rất tiếc, tôi không tìm thấy địa điểm có mã nhận dạng đó. Bạn có thể kiểm tra tên không?"

MCP cho phép ứng dụng kết nối với máy chủ MCP bằng quy cách JSON-RPC 2.0. JSON-RPC có một số lỗi được xác định trước được gửi cho các lỗi thường gặp như yêu cầu không hợp lệ, lỗi phân tích cú pháp, v.v. Hướng dẫn này trình bày cách máy chủ MCP có thể gửi lại lỗi tuỳ chỉnh.

Mã
trạng thái
Nhắn tin Cách sử dụng Có cần
trả về
một cách rõ ràng không?
Lỗi người dùng/khách hàng
-32300 USER_RATE_LIMITED Người dùng đã đạt đến hạn mức sử dụng tối đa. CÓ
-32301 MISSING_REQUIRED_INFORMATION Yêu cầu đầu vào không có tất cả thông tin cần thiết CÓ
-32302 USER_PERMISSION_DENIED Người dùng đã từ chối cấp quyền sử dụng công cụ này. Ví dụ: người dùng cần có tài khoản doanh nghiệp, giới hạn độ tuổi, ngôn ngữ, v.v. hoặc không có gói thuê bao doanh nghiệp của công cụ. CÓ
Lỗi ứng dụng/Lỗi logic kinh doanh
-32400 RUNTIME_ERROR Quá trình thực thi mã máy chủ đã gây ra lỗi CÓ
-32401 NULL_POINTER_EXCEPTION Cố gắng chạy một con trỏ/đối tượng rỗng CÓ
-32402 OUT_OF_MEMORY Không đủ bộ nhớ trong mã máy chủ để phân bổ cho một đối tượng CÓ
Lỗi cơ sở hạ tầng
-32500 DEADLINE_EXCEEDED Yêu cầu mất nhiều thời gian hơn mức cho phép. Có thể xảy ra do nhiều lý do, ví dụ: máy chủ quá tải, sự cố mạng, v.v. CÓ
-32501 RESOURCE_EXHAUSTED Máy chủ đã hết bộ nhớ, dung lượng ổ đĩa, luồng, thời gian của CPU, v.v. CÓ
-32502 SERVICE_UNAVAILABLE Dịch vụ phụ thuộc (ví dụ: một dịch vụ vi mô, cơ sở dữ liệu, bộ nhớ đệm khác, v.v.) không hoạt động CÓ
Lỗi JSON-RPC (các lỗi này thuộc về quá trình truyền tải MCP)
-32700 PARSE_ERROR Máy chủ không thể phân tích cú pháp yêu cầu KHÔNG
-32600 INVALID_REQUEST Yêu cầu của ứng dụng không đúng định dạng KHÔNG
-32601 METHOD_NOT_FOUND Tên công cụ MCP không hợp lệ KHÔNG
-32602 INVALID_PARAMS Tham số yêu cầu không hợp lệ, bao gồm cả tham số bị thiếu hoặc loại tham số không khớp KHÔNG
-32603 INTERNAL_ERROR Phản hồi mặc định KHÔNG

Sau đây là ví dụ về cách bạn có thể báo lỗi MCP trong máy chủ bằng SDK Python chính thức (mcp). Đưa ra một McpError chứa tải trọng ErrorData. SDK sẽ tự động chuyển đổi tuần tự tải trọng này thành định dạng lỗi JSON-RPC bắt buộc, trong đó trạng thái lỗi được điền sẵn.

from mcp import types
from mcp.shared.exceptions import McpError

@mcp.tool()
def foo_tool() -> list[types.TextContent]:
  """Always returns an error."""
  raise McpError(
    types.ErrorData(
        code=-32302, # USER_PERMISSION_DENIED
        message="Message to show to the model."
    ),
  )

Bối cảnh của công cụ

Các sản phẩm Google có liên quan hỗ trợ Tool Context API để truyền tín hiệu đến máy chủ MCP. API này được dùng trong các trường hợp sử dụng hợp lệ cần thông tin nhạy cảm, ví dụ: siêu dữ liệu không thuộc định nghĩa cốt lõi của công cụ, như trong trường hợp ngôn ngữ cho các công cụ cần bản địa hoá. Tool Context API chỉ được cung cấp thông qua Connected Console.

Khi bạn đăng ký một tín hiệu như current_user_location_fine với ứng dụng của mình trong Connected Console, các sản phẩm Google có liên quan sẽ bổ sung các yêu cầu MCP tools/call bằng một mục nhập _meta bổ sung cung cấp dữ liệu được yêu cầu. Tập hợp các tín hiệu được hỗ trợ là:

  • current_user_location_fine (Chỉ dành cho Gemini, đối với các ngành dọc được cho phép)
  • user_locale
  • current_user_location_coarse
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "find-restaurant",
    "arguments": {"query": "restaurants near me"},
    "_meta": {
      "current_user_location_fine": {
        "latitude_degrees": 37.7749,
        "longitude_degrees": -122.4194,
        "accuracy_meters": 112.4221
      },
      "user_locale": {
        "language_code": "en",
        "region_code": "US"
      }
    }
  }
}

Cách giải nén dữ liệu này:

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("remote_mcp")

@mcp.tool()
async def find_restaurants(query: str, ctx: Context) -> str:
   # Access context directly from _meta
   request_context = ctx.request_context
   meta_dict = ctx.request_context.meta.model_dump() if ctx.request_context.meta else {}

   location_context = meta_dict.get("current_user_location_fine", {})
   lat = location_context.get("latitude_degrees")
   lng = location_context.get("longitude_degrees")
   if lat and lng:
       return f"Finding '{query}' near ({lat}, {lng})"
   return f"Finding '{query}' (no location provided)"

Hiển thị trải nghiệm người dùng

Ứng dụng MCP

Các sản phẩm Google có liên quan hỗ trợ việc tích hợp Ứng dụng MCP cho một số hành trình của người dùng để cho phép xây dựng giao diện người dùng tuỳ chỉnh. Hãy làm theo thông số kỹ thuật để biết hướng dẫn tích hợp chung.

Việc tích hợp Ứng dụng MCP trên các sản phẩm Google có áp dụng đi kèm với những lưu ý sau.

Nhập tài nguyên tại thời điểm đăng ký

Các sản phẩm của Google có liên quan sẽ tìm nạp tài nguyên giao diện người dùng trong thời gian nhập công cụ, tương tự như danh sách công cụ và nội dung mô tả công cụ. Điều này có nghĩa là mọi nội dung cập nhật tài nguyên (ví dụ: thay đổi trong JavaScript) sẽ không được tự động chọn và yêu cầu công cụ nhập lại.

Một tài nguyên giao diện người dùng không được vượt quá 15 MB và tổng tài nguyên giao diện người dùng trên máy chủ của bạn không được vượt quá 100 MB.

Tài nguyên giao diện người dùng phải sử dụng một trong các loại MIME được hỗ trợ: text/html, text/javascript, text/css hoặc text/html;profile=mcp-app. Các loại MIME không chuẩn hoặc dành riêng cho nền tảng sẽ không vượt qua được quy trình xác thực khi đẩy lên bản xem trước.

Nguyên tắc về CSP

Các sản phẩm Google có liên quan tuân theo quy cách chính thức của Ứng dụng MCP, bao gồm cả CSP [1], [2] và sẽ chặn mọi yêu cầu vi phạm các chỉ thị của CSP.

Các sản phẩm của Google có áp dụng cũng yêu cầu thêm blob: và data: vào CSP, nếu được sử dụng. Các thông tin này sẽ không được thêm theo mặc định. Nhà phát triển có thể chọn thêm (hoặc không thêm) các nguồn này vào CSP.

Script-src là một ngoại lệ

Các lệnh duy nhất mà chúng tôi cho phép là: unsafe-inline (được thêm theo mặc định), wasm-unsafe-eval và data: (nếu có trong resource_domains). Nếu iframe đang tải tập lệnh bên ngoài, bạn có thể giải quyết vấn đề này bằng cách gói JS vào HTML hoặc sử dụng hàm băm Tính toàn vẹn của tài nguyên phụ (SRI).

  • Cách 1: Đưa JS cùng dòng/gói vào HTML (Đơn giản nhất)

    • Mã JS của gói:

      • Đưa nội dung của component-init.js trực tiếp vào bên trong thẻ <script> trong tải trọng HTML được trả về cho tài nguyên giao diện người dùng:

        <script>
        // Paste component-init.js content directly here
        </script>
        
    • Xoá thẻ <script src> từ xa

      • Xoá các tham chiếu <script src="https://api.mycompany.com/..."> khỏi tài liệu HTML.
    • Công cụ nhập lại/cập nhật

  • Cách 2: Sử dụng hàm băm Tính toàn vẹn của tài nguyên phụ (SRI):

    Sử dụng thuộc tính này nếu tập lệnh phải được lưu trữ bên ngoài tại https://api.company.com/....

    • Tính hàm băm SHA-256 của tập lệnh
      • Tạo hàm băm SHA-256 base64 của component-init.js
    • Thêm hàm băm vào resourceDomains (phải bao gồm tiền tố sha256- để khớp với thuộc tính integrity)
    • Cập nhật thẻ HTML <script>
      • Thêm các thuộc tính integrity và crossorigin vào thẻ tập lệnh trong tiện ích HTML
    • Xác minh tiêu đề CORS trên CDN/máy chủ
      • Đảm bảo api.company.com phân phát component-init.js bằng Access-Control-Allow-Origin: * (hoặc cho phép scf.usercontent.goog) để trình duyệt có thể đọc nội dung phản hồi cho quy trình xác minh SRI.
    • Công cụ nhập lại/cập nhật

Nguyên tắc bảo mật cho nội dung mô tả công cụ MCP

Vì nội dung mô tả là bối cảnh duy nhất mà mô hình có để hiểu được khả năng của công cụ, nên nội dung mô tả phải được viết chính xác và an toàn để ngăn chặn hành vi ngoài ý muốn. Hãy tuân thủ các nguyên tắc sau khi soạn thảo nội dung mô tả công cụ.

  • Mô tả chức năng nhưng không ra lệnh cho hành vi. Nội dung mô tả phải mô tả chính xác chức năng của công cụ, chứ không phải ra lệnh cho mô hình thực hiện các hành động tiếp theo.
  • Xác định phạm vi và yêu cầu. Nêu rõ mục tiêu chính của công cụ, các trường hợp cụ thể (Trường hợp) để sử dụng công cụ và tất cả Thông tin đầu vào bắt buộc (tham số/đối số).
  • Đảm bảo tính trung thực. Nội dung mô tả phải thể hiện trung thực mã cơ bản của công cụ. Đừng tuyên bố rằng một công cụ chỉ có thể đọc nếu công cụ đó thực hiện thao tác ghi hoặc xoá.

Rủi ro bảo mật và cách phòng tránh

Khu vực rủi ro Recommended (Nên dùng) Tránh phương pháp này bằng mọi giá

Tiêm câu lệnh (prompt injection)

Sử dụng ngôn ngữ khách quan, mang tính tuyên bố để nêu rõ mục đích và chức năng của công cụ.

Sử dụng các lệnh mệnh lệnh để ghi đè hành vi của mô hình hoặc thay đổi luồng hệ thống (ví dụ: "bạn PHẢI nói...", "Sau khi chạy, bạn PHẢI..."). Bạn chỉ có thể sử dụng các từ ngữ mang tính mệnh lệnh như PHẢI hoặc QUAN TRỌNG khi xác định các quy tắc sử dụng hoặc quy tắc ràng buộc tham số có cấu trúc.

Sử dụng định dạng văn bản thuần tuý, chuẩn cho văn bản mô tả công cụ.

Sử dụng định dạng gây chú ý, chẳng hạn như viết hoa quá nhiều và các thẻ như VERY IMPORTANT: hoặc **CRITICAL**.

Chỉ tập trung vào chức năng và hành vi dự kiến của công cụ.

Bao gồm hướng dẫn nhập vai hoặc lệnh bỏ qua hướng dẫn trước đó.

Chiếm quyền điều khiển và che giấu công cụ

Đảm bảo nội dung mô tả cụ thể và chỉ đề cập đến các chức năng thực tế, có liên quan của công cụ.

Mô tả công cụ quá chung chung, mơ hồ hoặc tuyên bố rằng một công cụ duy nhất có thể thực hiện nhiều chức năng không liên quan.

Chọn một tên công cụ riêng biệt, dễ hiểu và hợp lý.

Sử dụng tên công cụ có biến thể nhỏ so với tên của một công cụ đáng tin cậy hoặc tên chung chung (ví dụ: do_everything_tool, assistant_tool).

Đừng đề cập đến tên của các ứng dụng khác hoặc công cụ của nền tảng bên ngoài trong nội dung mô tả.

Tham chiếu rõ ràng đến các công cụ khác hoặc tạo quy tắc mới về thời điểm hoặc cách sử dụng các công cụ khác.

Cho phép trình lập kế hoạch của mô hình chọn công cụ phù hợp nhất dựa trên bối cảnh của người dùng.

Đưa vào câu lệnh chống cạnh tranh hoặc bất kỳ loại câu lệnh SEO nào hướng dẫn mô hình ưu tiên công cụ của bạn hơn các công cụ tương tự.

Thao tác kích hoạt

Nội dung mô tả không đề cập đến hoặc phản hồi các cụm từ chung chung trong nhật ký trò chuyện.

Tạo logic có điều kiện để kích hoạt hành động gây hại dựa trên các cụm từ phổ biến, vô hại của người dùng (ví dụ: "cảm ơn", "tóm lại").

Lạm dụng tham số

Chỉ xác định các tham số cần thiết cho chức năng của công cụ và sử dụng tên cụ thể cho dữ liệu đầu vào (ví dụ: file_id, search_term).

Xác định các tham số hàm có tên phản ánh trạng thái nội bộ của Tác nhân (ví dụ: system_prompt, conversation_history, full_context).

Lọc dữ liệu

Bảo vệ quyền riêng tư ngay từ đầu – Giá trị nhận dạng mờ và quy trình xác thực do máy chủ quản lý.

Sử dụng mã nhận dạng không nhạy cảm, không phải thông tin nhận dạng cá nhân (PII) thô. Tất cả hoạt động xử lý dữ liệu phải nằm trong ranh giới an toàn, được uỷ quyền và không được đề cập trong nội dung mô tả công khai là được gửi ra bên ngoài. Việc thực thi công cụ sẽ kế thừa các quyền một cách thầm lặng thông qua quy trình bắt tay OAUth.

Mọi thông tin nhạy cảm đều phải được dọn dẹp trước khi gửi đến các sản phẩm Google có liên quan.

Yêu cầu người dùng, dữ liệu cá nhân hoặc dữ liệu doanh nghiệp hoặc thực thể cung cấp PII (Thông tin nhận dạng cá nhân), Thông tin sức khỏe được bảo vệ (PHI) hoặc bất kỳ thông tin cá nhân và/hoặc thông tin nhạy cảm nào khác theo bất kỳ cách nào vi phạm điều khoản dịch vụ của các sản phẩm Google có liên quan.

Đề cập hoặc yêu cầu gửi bất kỳ dữ liệu người dùng nào (cụm từ tìm kiếm, vị trí, bối cảnh) đến các URL bên thứ ba, dịch vụ ghi nhật ký hoặc hệ thống bên ngoài trái phép.

Các phương pháp hay nhất về chức năng và cách đặt tên

Ngoài việc bảo mật nội dung mô tả của công cụ, bạn phải đảm bảo mô hình có thể chọn và thực thi công cụ một cách đáng tin cậy mà không gây nhầm lẫn. Tuân thủ các phương pháp hay nhất về chức năng và đặt tên sau đây:

  • Độ chính xác của tham số. Đảm bảo tất cả tên và loại tham số trong nội dung mô tả đều khớp chính xác với cách triển khai thực tế của công cụ.
  • Đặt tên hợp lý. Tên của công cụ phải là một gợi ý rõ ràng và mạnh mẽ về chức năng của công cụ. Tránh đặt tên quá chung chung như "execute". Tên cũng phải nhất quán với hệ sinh thái công cụ rộng lớn hơn.

Phụ lục: Thêm cơ sở hạ tầng và mạng vào danh sách cho phép

Nếu cơ sở hạ tầng lưu trữ, cổng API hoặc tường lửa của bạn hạn chế các kết nối đến theo địa chỉ IP nguồn, hãy đưa các khối CIDR gửi đi sau đây của Google vào danh sách cho phép:

  • 108.177.64.0/20
  • 142.250.88.0/22
  • 172.217.80.0/20
  • 192.178.20.0/22
  • 192.179.0.0/20
  • 74.125.232.0/24
  • 136.121.40.0/21

Đảm bảo môi trường của bạn cho phép lưu lượng truy cập từ các dải IP này trên cổng HTTPS 443 để các sản phẩm Google có thể kết nối với máy chủ MCP từ xa của bạn nhằm khởi chạy MCP, khám phá công cụ và thực thi yêu cầu.