Xuất bản: Ngày 18 tháng 5 năm 2026, Lần cập nhật gần đây nhất: Ngày 1 tháng 9 năm 2026
| Video giải thích | Web | Phần mở rộng | Trạng thái của Chrome | Mục đích |
|---|---|---|---|---|
| GitHub | Xem | Ý định thử nghiệm |
Bạn có thể sử dụng WebMCP Imperative API để xác định nhiều loại công cụ bằng JavaScript tiêu chuẩn. Các công cụ của bạn có thể thực hiện nhiều chức năng, chẳng hạn như nhập biểu mẫu, điều hướng trang web và quản lý trạng thái.
Trước khi sử dụng API này, hãy đọc về các trường hợp sử dụng ví dụ.
Cung cấp bối cảnh mô hình
Sử dụng giao diện modelContext để đăng ký các công cụ. Để đăng ký công cụ, bạn cần có tên, nội dung mô tả và giản đồ đầu vào có các thuộc tính liên quan.
Dùng registerTool để thêm một công cụ vào ngữ cảnh mô hình.
WebMCPza Maker
await document.modelContext.registerTool({
name: 'toggle_layer',
description: 'Control pizza layers (sauce, cheese). Use "add", "remove", or "toggle".',
inputSchema: {
type: 'object',
properties: {
layer: { type: 'string', enum: ['sauce-layer', 'cheese-layer'] },
action: { type: 'string', enum: ['add', 'remove', 'toggle'] },
},
required: ['layer'],
},
execute: async ({ layer, action }) => {
await toggleLayer(layer, action);
return `Performed ${action || 'toggle'} on layer: ${layer}`;
},
});
Lấy trạng thái đơn đặt hàng
await document.modelContext.registerTool({
name: 'get_order_status',
description: 'Search orders in a given timeframe. Returns order number, shipping status and location',
inputSchema: {
"type": "object",
"properties": {
"timeframe": { "type": "string", "oneOf": [
{ "type": "string", "const": "today", "title": "Today" },
{ "type": "string", "const": "yesterday", "title": "Yesterday" },
{ "type": "string", "const": "last_7_days", "title": "Last 7 Days" },
{ "type": "string", "const": "last_30_days", "title": "Last 30 Days" },
{ "type": "string", "const": "last_6_months", "title": "Last 6 Months" }],
"enum": [ "today", "yesterday", "last_7_days", "last_30_days", "last_6_months" ],
"description": "Timeframe for the order lookup." }
},
"required": [ "timeframe" ]
},
execute: async ({ timeframe }) => {
// Add your API or database logic here to fetch and return the order data as a string.
},
});
Chú thích công cụ (không bắt buộc)
Khi đăng ký một công cụ, bạn có thể thêm các gợi ý về siêu dữ liệu trong thuộc tính annotations.
Những gợi ý này giúp các tác nhân và trình duyệt hiểu được các đặc điểm an toàn của một công cụ, các tác dụng phụ dự kiến và độ tin cậy của đầu ra:
readOnlyHint(boolean, mặc định làfalse): Khitrue, cho biết rằng công cụ chỉ đọc thông tin và không sửa đổi trạng thái của ứng dụng hoặc hệ thống (ví dụ: tìm kiếm danh mục sản phẩm hoặc truy xuất trạng thái đơn đặt hàng). Điều này giúp các tác nhân xác định xem có thể gọi công cụ một cách an toàn mà không có tác dụng phụ hay không.untrustedContentHint(boolean, mặc định làfalse): Khitrue, cho biết đầu ra của công cụ chứa dữ liệu không đáng tin cậy theo quan điểm của tác giả công cụ (ví dụ: nội dung do người dùng tạo, bài đánh giá hoặc dữ liệu web bên ngoài). Điều này báo hiệu cho tác nhân và ứng dụng rằng tải trọng được trả về yêu cầu xử lý bảo mật nâng cao, chẳng hạn như dọn dẹp hoặc phân định, để giảm thiểu tiêm câu lệnh gián tiếp (prompt injection).consequentialHint(boolean, mặc định làfalse): Khitrue, cho biết rằng việc thực thi công cụ sẽ dẫn đến các hành động quan trọng, thực tế hoặc không thể đảo ngược (ví dụ: đặt vé máy bay, chuyển tiền hoặc xoá dữ liệu). Điều này cho phép các tác nhân và trình duyệt thực thi lời nhắc xác nhận bắt buộc của người dùng trước khi thực thi các công cụ có mức độ rủi ro cao, giảm thiểu nguy cơ vô tình hoặc cố ý xuyên tạc ý định của người dùng.
await document.modelContext.registerTool({
name: 'book_flight',
description: 'Book a flight for the user with confirmed flight details.',
inputSchema: {
type: 'object',
properties: {
flightId: { type: 'string', description: 'ID of the flight to book' },
passengers: { type: 'number', description: 'Number of tickets to purchase' },
},
required: ['flightId', 'passengers'],
},
annotations: {
readOnlyHint: false,
consequentialHint: true,
untrustedContentHint: false,
},
execute: async ({ flightId, passengers }) => {
// Add your flight booking transaction logic here.
return `Booked ${passengers} passenger(s) on flight ${flightId}.`;
},
});
Công cụ huỷ đăng ký
Bạn có thể xoá một công cụ bằng AbortSignal khi được truyền dưới dạng một tham số không bắt buộc.
const addTodoTool = {
name: "addTodo",
description: "Add a new item to the to-do list",
inputSchema: {
type: "object",
properties: { text: { type: "string" } },
},
execute: async ({ text }) => {
// You should handle the persistence logic here (omitted for demo)
return `Added to-do: ${text}`;
},
annotations: {
readOnlyHint: false,
untrustedContentHint: true
},
};
const controller = new AbortController();
await document.modelContext.registerTool(addTodoTool, { signal: controller.signal });
// Unregister the tool later...
controller.abort();
Kể từ Chrome 153, bạn có thể huỷ đăng ký một công cụ mà không cần huỷ và làm gián đoạn các hoạt động đang diễn ra. Điều này giúp ngăn chặn các tác dụng phụ không mong muốn khi quản lý vòng đời của công cụ trong các khung thành phần.
Xử lý việc huỷ công cụ
Hàm execute nhận một tham số AbortSignal có tên là signal làm đối số thứ hai để xử lý một cách thích hợp các yêu cầu huỷ thực thi do người dùng hoặc tác nhân khởi tạo. Việc truyền tín hiệu này đến các tác vụ không đồng bộ chạy trong thời gian dài hoặc các thao tác mạng (chẳng hạn như fetch()) giúp ngăn chặn các thao tác không cần thiết, cải thiện khả năng quản lý tài nguyên tổng thể và tránh rò rỉ dữ liệu tiềm ẩn.
await document.modelContext.registerTool({
name: 'fetch_tool',
description: 'Fetch the text content of a URL and stream the response.',
inputSchema: {
type: 'object',
properties: {
url: { type: 'string', description: 'The URL to fetch' },
priority: { type: 'string', enum: ['high', 'low', 'auto'] },
},
required: ['url'],
},
execute: async ({ url, priority }, { signal }) => {
// Abort the fetch request when tool execution is aborted.
const response = await fetch(url, { priority, signal });
const stream = response.body.pipeThrough(new TextDecoderStream());
for await (const chunk of stream) {
document.querySelector('pre').textContent += chunk;
}
return 'Success';
},
});
Khám phá các công cụ
Sử dụng document.modelContext.getTools() để truy xuất các công cụ có sẵn. Phương thức không đồng bộ này trả về danh sách các công cụ được sắp xếp theo bảng chữ cái mà tài liệu gọi được phép truy cập.
const [tool] = await document.modelContext.getTools();
console.log(tool);
// {
// annotations: { consequentialHint: false, readOnlyHint: false, untrustedContentHint: true }, // Optional hints
// description: "Add a new item to the to-do list",
// inputSchema: {"type":"object","properties":{…}},
// name: "addTodo",
// origin: "https://example.com",
// title: ""
// window: Window {window: Window, self: Window, …},
// }
Theo mặc định, getTools() chỉ trả về các công cụ cùng nguồn gốc do tài liệu gọi hoặc các tài liệu cùng nguồn gốc khác trong cây khung đăng ký. Để truy xuất các công cụ khác nguồn gốc, bạn phải liệt kê rõ ràng nguồn gốc của các công cụ đó trong lựa chọn fromOrigins. Mảng này chỉ hỗ trợ các nguồn an toàn.
Các công cụ từ tài liệu khác nguồn gốc chỉ được đưa vào nếu:
- Nguồn gốc lưu trữ được liệt kê trong lựa chọn
fromOrigins. - Công cụ này đã được hiển thị rõ ràng cho nguồn của bạn.
// https://example.com
// Get same-origin tools only
const sameOriginTools = await document.modelContext.getTools();
// Get same-origin tools plus tools from specific cross-origin documents
const allTools = await document.modelContext.getTools({
fromOrigins: ['https://partner.org']
});
Hãy xem bản minh hoạ WebMCP Page Agent để biết ví dụ về cách truy xuất các công cụ từ một iframe và thực thi các công cụ đó trong giao diện trò chuyện dựa trên web.
Thực thi công cụ
Để thực thi một công cụ được phát hiện trong getTools() theo cách thủ công, hãy gọi document.modelContext.executeTool() bằng các đối số đầu vào dưới dạng một chuỗi JSON hợp lệ. Phương thức không đồng bộ này trả về kết quả thực thi công cụ hoặc giá trị rỗng khi một thao tác điều hướng được kích hoạt.
const result = await document.modelContext.executeTool(tool, '{"text": "Buy milk"}');
console.log(result);
// 'Added to-do: Buy milk'
Bạn có thể huỷ một lệnh thực thi công cụ đang chờ xử lý bằng AbortSignal khi được truyền dưới dạng một tham số không bắt buộc.
const controller = new AbortController();
document.modelContext.executeTool(tool, '{"text": "Buy milk"}', {
signal: controller.signal,
});
// Cancel tool execution later...
controller.abort();
Sự kiện
Khung có thể theo dõi sự kiện toolchange trên document.modelContext để nhận thông báo khi danh sách các công cụ hiện có thay đổi.
document.modelContext.addEventListener("toolchange", (event) => {
// Tools have changed.
});
Iframe khác nguồn gốc
WebMCP hỗ trợ các iframe khác nguồn gốc sử dụng cả chính sách về quyền và cơ chế kiểm soát nguồn gốc rõ ràng.
Chính sách về quyền
Theo mặc định, tính năng đăng ký công cụ bị tắt trong iframe khác nguồn gốc. Một trang phải uỷ quyền truy cập bằng tools
Chính sách về quyền:
<iframe src="https://example.com" allow="tools"></iframe>
Tiếp xúc với nguồn gốc
Theo mặc định, các công cụ không có sẵn cho tài liệu khác nguồn gốc. Bạn có thể sử dụng mảng exposedTo trong registerTool để liệt kê các nguồn cụ thể được phép xem và thực thi một công cụ. Mảng này chỉ hỗ trợ các nguồn an toàn.
// https://partner.org
await document.modelContext.registerTool({
name: 'my_shared_tool',
description: 'Shared across origins',
// ...
}, {
exposedTo: ['https://example.com']
});
Hỗ trợ React
React có tính năng hỗ trợ thử nghiệm cho WebMCP bằng cách sử dụng gói usewebmcp. Nếu ứng dụng của bạn đã được viết bằng React, bạn có thể đăng ký các công cụ bằng cách sử dụng các hook độc lập được liên kết với vòng đời gắn kết và tháo gỡ của thành phần. Hook useWebMCP cũng cung cấp tính năng suy luận kiểu dựa trên giản đồ và cho thấy trạng thái thực thi cục bộ.
Hỗ trợ Angular
Angular có tính năng hỗ trợ thử nghiệm cho WebMCP. Nếu ứng dụng của bạn đã được viết bằng Angular, bạn có thể đăng ký các công cụ được liên kết với vòng đời chèn phần phụ thuộc của ứng dụng và chuyển các Biểu mẫu tín hiệu thành công cụ WebMCP.
Tương tác và chia sẻ ý kiến phản hồi
WebMCP đang được thảo luận tích cực và có thể thay đổi trong tương lai. Nếu bạn dùng thử API này và có ý kiến phản hồi, chúng tôi rất mong được lắng nghe.
- Đọc phần giải thích về WebMCP, đặt câu hỏi và tham gia thảo luận.
- Đọc các phương pháp hay nhất về WebMCP.
- Xem xét việc triển khai cho Chrome trên Trạng thái của Chrome.
- Tham gia chương trình xem trước sớm để xem trước các API mới và truy cập vào danh sách gửi thư của chúng tôi.
- Nếu bạn có ý kiến phản hồi về cách Chrome triển khai tính năng này, hãy báo cáo lỗi Chromium.