API mệnh lệnh sử dụng document.modelContext.registerTool() để xác định các công cụ JavaScript theo phương thức lập trình. Điều này rất phù hợp với các Ứng dụng trang đơn (SPA) cần thêm hoặc xoá công cụ dựa trên tuyến đường hiện tại hoặc trạng thái của người dùng.
WebMCP hoạt động theo cấu trúc nhà sản xuất/người tiêu dùng:
- Trang web là nhà sản xuất công cụ: Bạn xác định và đăng ký công cụ bằng
document.modelContext.registerTool(). Đó là tất cả những gì một trang web cần triển khai. Bạn không cần gọigetTools()hoặcexecuteTool()trên trang để hiển thị công cụ cho tác nhân. - Tác nhân trình duyệt và tiện ích là đối tượng sử dụng chính: Các tác nhân do hoặc thông qua trình duyệt cung cấp (bao gồm cả tác nhân tích hợp sẵn của trình duyệt, tiện ích của trình duyệt, Công cụ cho nhà phát triển và trợ lý cấp hệ thống) sẽ khám phá và gọi các công cụ đã đăng ký ngoài băng tần thông qua các cơ chế nền tảng nội bộ.
- Tác nhân trong trang và khai thác kiểm thử:
getTools()vàexecuteTool()tồn tại dành riêng cho trợ lý JavaScript trong trang (ví dụ: tiện ích trò chuyện được nhúng hoặc<iframe>) và bộ kiểm thử tự động cần khám phá và gọi các công cụ ngay trong ngữ cảnh trang.
Đăng ký và vòng đời
Công cụ được đăng ký bằng cách truyền một đối tượng định nghĩa công cụ và một đối tượng tuỳ chọn không bắt buộc (ModelContextRegisterToolOptions), hỗ trợ hai thành phần không bắt buộc:
signal: MộtAbortSignaldùng để huỷ đăng ký công cụ khi không còn cần thiết nữa.exposedTo: Một mảng chuỗi gốc kiểm soát những tài liệu nào trong cây tài liệu được phép khám phá và thực thi công cụ trên các ranh giới khung.
Xử lý vòng đời bằng AbortController
WebMCP không cung cấp phương thức unregisterTool(). Để huỷ đăng ký một công cụ, bạn phải truyền AbortSignal trong quá trình đăng ký và huỷ tín hiệu đó khi không cần công cụ nữa.
const controller = new AbortController();
await document.modelContext.registerTool({
name: "get_user_preferences",
description: "Retrieves the user's saved preferences.",
inputSchema: { type: "object", properties: {} },
execute() {
const prefs = localStorage.getItem("user_prefs");
return prefs ? JSON.parse(prefs) : { theme: "light" };
},
annotations: { readOnlyHint: true }
}, { signal: controller.signal });
// To unregister the tool (e.g., on component unmount):
controller.abort();
Việc huỷ tín hiệu đăng ký chỉ huỷ đăng ký công cụ, chứ không huỷ các lượt thực thi đang chạy. Các công cụ bắt đầu công việc chạy trong thời gian dài cũng phải tuân thủ tín hiệu cho mỗi lần thực thi được mô tả bên dưới, nếu không, việc huỷ đăng ký sẽ để lại các yêu cầu mồ côi và các bản cập nhật giao diện người dùng cũ.
Kiểm soát việc hiển thị công cụ khác nguồn gốc bằng exposedTo
Theo mặc định, một công cụ đã đăng ký sẽ ở chế độ riêng tư đối với tài liệu đăng ký và các khung cùng nguồn gốc. Khi ứng dụng của bạn được nhúng trong một <iframe> (hoặc nhúng các tiện ích của bên thứ ba) và bạn cần các khung cấp trên hoặc khung đồng cấp để khám phá và gọi công cụ, hãy chỉ định các nguồn gốc được phép bằng exposedTo.
const controller = new AbortController();
await document.modelContext.registerTool({
name: "get_cart_items",
description: "Retrieves items currently in the user's shopping cart.",
inputSchema: { type: "object", properties: {} },
async execute(input, { signal }) {
return await cartService.getItems({ signal });
},
annotations: { readOnlyHint: true },
}, {
signal: controller.signal,
exposedTo: ["https://checkout.example.com"],
});
- Bắt tay chọn sử dụng lẫn nhau: Việc khám phá công cụ trên nhiều nguồn gốc là một quy trình chọn sử dụng hai chiều. Khung của nhà cung cấp công cụ uỷ quyền cho nguồn gốc của người tiêu dùng thông qua
exposedTovà khung của người tiêu dùng phải yêu cầu rõ ràng nguồn gốc của nhà cung cấp đó thông quagetTools({ fromOrigins: [...] }). Nếu không cófromOrigins,getTools()chỉ truy vấn các tài liệu có cùng nguồn gốc. - Khớp nguồn gốc: Nguồn gốc của giấy đăng ký luôn có quyền truy cập. Các nguồn gốc được chỉ định trong
exposedTođược cấp quyền khám phá công cụ thông quadocument.modelContext.getTools({ fromOrigins: [...] })và thực thi công cụ thông quadocument.modelContext.executeTool(). - Yêu cầu về bảo mật: Mọi nguồn gốc trong
exposedToĐỀU PHẢI có khả năng đáng tin cậy (HTTPS hoặc máy chủ cục bộ). Việc truyền một nguồn gốc không hợp lệ hoặc không an toàn sẽ khiếnregisterTool()từ chối bằngSecurityError. - Phạm vi:
exposedTokiểm soát việc khám phá nhiều tài liệu trên trang trên các khung trong cây tài liệu.
Xác định tham số
Các tham số (param) được xác định bằng thuộc tính inputSchema. Đây phải là một đối tượng Giản đồ JSON mô tả dữ liệu có cấu trúc mà công cụ mong đợi.
await document.modelContext.registerTool({
name: "calculate_area",
description: "Calculates the area of a rectangle.",
inputSchema: {
type: "object",
properties: {
width: { type: "number", description: "The width of the rectangle." },
height: { type: "number", description: "The height of the rectangle." }
},
required: ["width", "height"]
},
execute(input) {
// input is { width: 10, height: 20 }
return input.width * input.height;
},
annotations: { readOnlyHint: true }
});
Nội dung mô tả về công cụ viết và tham số
Tác nhân đã nhận được toàn bộ inputSchema, vì vậy, description chỉ cần cho biết chức năng của công cụ và thời điểm sử dụng công cụ đó. KHÔNG lặp lại tên tham số, loại, giá trị enum, giá trị mặc định hoặc giới hạn trong đó; thay vào đó, hãy khai báo các giá trị này trong giản đồ (enum, default, minimum/maximum). Nội dung mô tả tham số tuân theo cùng một quy tắc: cho biết ý nghĩa của giá trị, chứ không phải loại hoặc giá trị được phép.
Trình duyệt không xác thực đối số dựa trên inputSchema hoặc áp dụng giá trị default, vì vậy, hãy thực hiện cả hai việc này trong execute.
const SORT_ORDERS = ["newest", "price_low_to_high"];
await document.modelContext.registerTool({
name: "search_products",
// Don't list the sort orders here, even via SORT_ORDERS: `enum` already does.
description: "Searches the product catalog by keyword. Use when the user wants to find or compare products.",
inputSchema: {
type: "object",
properties: {
query: { type: "string", description: "Words to search for." },
sort: { type: "string", enum: SORT_ORDERS, default: "newest", description: "Order of the results." },
},
required: ["query"],
},
async execute({ query, sort = "newest" }, { signal }) {
if (typeof query !== "string" || !SORT_ORDERS.includes(sort)) {
return { error: "Pass a search query and a supported sort order.", sortOrders: SORT_ORDERS };
}
return await productService.search({ query, sort }, { signal });
},
annotations: { readOnlyHint: true },
});
Mẫu thực thi
Lệnh gọi lại execute luôn nhận được hai đối số: đối tượng đầu vào và đối tượng tuỳ chọn mang AbortSignal — execute(inputObject, { signal }).
Trường hợp sử dụng async execute
Sử dụng async khi công cụ liên quan đến các thao tác trả về một Promise hoặc mất thời gian để hoàn tất:
- Lệnh gọi mạng: Tìm nạp dữ liệu từ một API.
- Bộ nhớ không đồng bộ: Truy cập vào IndexedDB.
- Sự kiện bên ngoài: Đang chờ một thay đổi trạng thái hoặc ảnh động cụ thể kết thúc.
async execute(input, { signal }) {
const response = await fetch(`/api/data/${input.id}`, { signal });
return await response.json();
}
Trường hợp sử dụng execute (Đồng bộ)
Sử dụng hàm đồng bộ chuẩn cho các thao tác tức thì. Một công cụ đồng bộ chạy đến khi hoàn tất trước khi có thể quan sát thấy lệnh huỷ, vì vậy, công cụ này có thể bỏ qua tín hiệu:
- Logic thuần tuý: Toán học, lọc hoặc sắp xếp dữ liệu đã có trong bộ nhớ.
- Trạng thái đồng bộ: Đọc từ
localStoragehoặc trình quản lý trạng thái đồng bộ.
execute(input) {
return input.items.filter(item => item.active);
}
Xử lý lỗi trong execute
Khi execute gửi (hoặc trả về một lời hứa bị từ chối), tác nhân chỉ nhận được lỗi thực thi chung. Thông báo lỗi không được chuyển tiếp đến nhân viên hỗ trợ. Nếu công cụ của bạn gặp lỗi có thể xử lý hoặc có thể khôi phục (chẳng hạn như dữ liệu đầu vào không hợp lệ, thiếu mục hoặc trạng thái HTTP không thành công), thì bạn KHÔNG ĐƯỢC throw new Error(...). Thay vào đó, hãy trả về một tải trọng lỗi có cấu trúc thông qua giá trị trả về thông thường của công cụ để tác nhân AI nhận được thông tin chẩn đoán và có thể tự sửa hoặc thử lại:
execute({ itemName }) {
const item = menuItems.find((entry) => entry.name.toLowerCase() === itemName.toLowerCase());
if (!item) {
// Return the error as a value instead of throwing, so the agent receives the message:
return {
error: `Menu item "${itemName}" not found.`,
availableItems: menuItems.map((entry) => entry.name),
};
}
return item;
}
Chỉ gửi lại khi quá trình thực thi bị huỷ (signal.aborted là true).
Đang huỷ các quá trình thực thi đang diễn ra
Người dùng hoặc nhân viên hỗ trợ bắt đầu quy trình huỷ. BẮT BUỘC: Mọi công cụ thực hiện yêu cầu mạng hoặc công việc không đồng bộ khác chạy trong thời gian dài ĐỀU PHẢI tuân thủ signal, nếu không, các quá trình thực thi bị huỷ sẽ tiếp tục tiêu tốn tài nguyên và có thể ghi dữ liệu cũ vào giao diện người dùng sau khi tác nhân đã chuyển sang tác vụ khác.
- API chấp nhận tín hiệu (trình đọc
fetch(),addEventListener(),ReadableStream): truyền thẳngsignal. - Các API không hỗ trợ (
setTimeout,setInterval, vòng lặp thăm dò, quy trình nặngawait): gọisignal.throwIfAborted()giữa các bước và/hoặc từ chối trênsignal.addEventListener('abort', ...). Bộ tính giờ không chấp nhận tín hiệu, vì vậy, bạn phải tự xoá bộ tính giờ trong trình nghe huỷ.
await document.modelContext.registerTool({
name: "fetch_tool",
description: "Fetch the text content of a URL and show it on the page.",
inputSchema: {
type: "object",
properties: {
url: { type: "string", description: "The URL to fetch" },
priority: {
type: "string",
enum: ["high", "low", "auto"],
description: "Relative network priority for the request",
},
},
required: ["url"],
},
execute: async ({ url, priority }, { signal }) => {
const output = document.querySelector("pre");
output.textContent = "Loading…";
try {
// Passing `signal` aborts the network request the moment execution is cancelled.
const response = await fetch(url, { priority, signal });
if (!response.ok) {
output.textContent = "";
return { error: `Request failed with status ${response.status}` };
}
const text = await response.text();
output.textContent = text;
return text;
} catch (err) {
// Roll back the UI state this execution set, so a cancelled run leaves no trace.
output.textContent = "";
if (signal.aborted) {
// The execution was cancelled: re-throw instead of returning an error value.
throw err;
}
// Return other errors as a value instead of throwing, so the agent receives the message.
return { error: err instanceof Error ? err.message : String(err) };
}
},
annotations: { readOnlyHint: true }
});
Gắn cờ các công cụ có thể gây hậu quả nghiêm trọng
Kể từ Chrome 154, annotations hỗ trợ consequentialHint. Hãy đặt giá trị này thành true cho những công cụ thực hiện các hành động có rủi ro cao, không thể huỷ bỏ hoặc có tác động đến thế giới thực, chẳng hạn như đặt vé du lịch, chuyển tiền, gửi tin nhắn hoặc xoá dữ liệu. Chế độ này báo hiệu cho các tác nhân yêu cầu người dùng xác nhận rõ ràng trước khi thực thi.
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'],
},
execute: async ({ flightId, passengers }, { signal }) => {
// Forward `signal` to the transaction API to honor cancellation:
return await bookFlightReservation({ flightId, passengers }, { signal });
},
annotations: {
readOnlyHint: false, // This tool mutates state (it makes a booking).
consequentialHint: true, // Spends money and is not trivially reversible.
untrustedContentHint: false, // Output is first-party data, not third-party content.
}
});
BẮT BUỘC: Hãy coi consequentialHint là một gợi ý, chứ không phải là một cơ chế thực thi. Gợi ý này không tự chặn quá trình thực thi và các trình duyệt có trước gợi ý này sẽ không nhắc gì cả. Giữ lại mọi thông báo xác nhận trong ứng dụng mà hành động đó đã đảm bảo.
Công cụ gỡ lỗi gắn cờ
Kể từ Chrome 156, annotations hỗ trợ debugging. Đặt annotations.debugging thành true cho các công cụ được xây dựng để gỡ lỗi và công cụ cho nhà phát triển thay vì các tác vụ của người dùng cuối. Ví dụ: kết xuất trạng thái ứng dụng nội bộ, bật/tắt cờ tính năng hoặc gieo dữ liệu kiểm thử. Điều này giúp tác nhân phân biệt các công cụ chỉ dành cho nhà phát triển với các công cụ dành cho người dùng. Giá trị mặc định là false. Các tác nhân trong trang và khai thác kiểm thử có thể đọc dữ liệu này từ RegisteredTool.annotations.debugging thông qua getTools().
await document.modelContext.registerTool({
name: "dump_app_state",
description: "Returns a snapshot of the internal application store for debugging.",
execute() {
return appStore.getState();
},
annotations: {
readOnlyHint: true, // Only reads state.
debugging: true, // Developer tooling, not an end-user action.
}
});
Tác nhân và thử nghiệm trên trang (getTools và executeTool)
Các trang web không cần getTools() hoặc executeTool() để hiển thị công cụ cho tác nhân AI. Bạn chỉ cần gọi document.modelContext.registerTool() để các tác nhân trình duyệt, tiện ích của trình duyệt, Công cụ cho nhà phát triển và trợ lý cấp hệ thống có thể tìm và thực thi các công cụ của bạn ngoài băng tần.
Các phương thức getTools() và executeTool() tồn tại dành riêng cho người dùng chạy trong môi trường JavaScript:
- Tác nhân JavaScript trong trang: Trợ lý AI, tiện ích trợ lý hoặc giao diện trò chuyện được nhúng trực tiếp vào trang (hoặc chạy bên trong
<iframe>) cần khám phá những công cụ mà trang xung quanh hoặc khung có thể truy cập trong cây tài liệu cung cấp và gọi các công cụ đó thay mặt cho người dùng. - Kiểm thử và gỡ lỗi tự động: Bộ kiểm thử (chẳng hạn như Playwright, Vitest hoặc kiểm thử đơn vị trong trình duyệt) kiểm tra siêu dữ liệu công cụ đã đăng ký và mô phỏng lệnh gọi công cụ của tác nhân mà không cần khai thác LLM bên ngoài đang hoạt động.
Đang khám phá các công cụ hiện có bằng getTools()
Các tác nhân trong trang gọi document.modelContext.getTools() để truy xuất một mảng đối tượng RegisteredTool từ tài liệu hiện tại và mọi khung có thể truy cập trong cây tài liệu.
Kể từ Chrome 155, RegisteredTool.inputSchema được trả về trực tiếp dưới dạng đối tượng JavaScript (bản sao sâu của giản đồ được cung cấp khi đăng ký). Việc thay đổi đối tượng này không làm thay đổi giản đồ thực tế của công cụ đã đăng ký.
// Example: An in-page AI assistant discovering tools available on the page:
const tools = await document.modelContext.getTools();
// In-page agents can listen for tools being registered or unregistered dynamically:
document.modelContext.addEventListener("toolchange", async () => {
const updatedTools = await document.modelContext.getTools();
console.log(`Active tools updated: ${updatedTools.map((t) => t.name).join(", ")}`);
});
Để khám phá các công cụ đã đăng ký bên trong iframe con khác nguồn gốc (phải cấp quyền truy cập một cách rõ ràng thông qua exposedTo trong quá trình đăng ký), hãy truyền fromOrigins trong từ điển tuỳ chọn:
// Query tools registered in the embedded cart frame that exposed them to this checkout origin:
const cartTools = await document.modelContext.getTools({
fromOrigins: ["https://cart.example.com"],
});
Gọi công cụ bằng executeTool()
Tác nhân trong trang và tập lệnh kiểm thử gọi document.modelContext.executeTool(tool, inputObject, options) để thực thi một công cụ đã đăng ký. Công cụ này chạy trên tài liệu nơi công cụ được đăng ký và lời hứa sẽ phân giải thành kết quả được chuyển đổi thành chuỗi do lệnh gọi lại execute của công cụ trả về.
Kể từ Chrome 155, executeTool() chấp nhận trực tiếp một đối tượng JavaScript thuần tuý cho inputObject, khớp với định dạng đầu vào mà lệnh gọi lại execute của công cụ nhận được.
// 1. Discover the tool (typically done during agent initialization or test setup):
const tools = await document.modelContext.getTools();
const areaTool = tools.find((t) => t.name === "calculate_area");
if (areaTool) {
const controller = new AbortController();
// Example input payload matching the tool's inputSchema:
const inputObject = { width: 10, height: 20 };
const options = { signal: controller.signal };
// 2. Pass input arguments as a JavaScript object, with a JSON string fallback for Chrome <155:
let resultString;
try {
resultString = await document.modelContext.executeTool(areaTool, inputObject, options);
} catch (err) {
if (err?.message?.startsWith("Failed to parse input")) {
resultString = await document.modelContext.executeTool(
areaTool,
JSON.stringify(inputObject),
options
);
} else {
// Re-throw real tool execution or cancellation errors:
throw err;
}
}
console.log("Execution output string:", resultString);
}
Lời hứa được trả về sẽ từ chối nếu:
inputObjectkhông phải là một đối tượng hoặc không thể chuyển đổi tuần tự thành chuỗi JSON (ví dụ: tham chiếu vòng tròn hoặc giá trịBigInt). Xin lưu ý rằng các giá trị bị bỏ qua khi chuyển đổi tuần tự JSON (chẳng hạn như hàm vàundefined) sẽ bị bỏ qua khỏi đối tượng mà công cụ nhận được, thay vì bị từ chối.- Quá trình thực thi bị huỷ thông qua
options.signal. - Công cụ đã bị huỷ đăng ký trước khi thực thi hoặc gặp lỗi thời gian chạy không được xử lý.
Mẫu nhà máy công cụ
Để truyền ngữ cảnh (như cửa hàng hoặc thực thể ứng dụng) đến các công cụ, hãy sử dụng hàm nhà máy.
export function createInventoryTool(inventoryManager) {
return {
name: "get_inventory",
description: "Lists items in the inventory.",
inputSchema: { type: "object", properties: {} },
execute() {
return inventoryManager.getItems();
},
annotations: { readOnlyHint: true }
};
}
Kiểu TypeScript
Trong các dự án TypeScript, KHÔNG viết tay nội dung khai báo cho document.modelContext. Cài đặt gói webmcp-types chính thức (npm install --save-dev webmcp-types) và thêm gói đó vào tsconfig.json, vì gói này không được tự động chọn:
{
"compilerOptions": {
"types": ["webmcp-types"]
}
}
document.modelContextđược nhập dưới dạng không bắt buộc, vì vậy, hãy bảo vệ bằngif (document.modelContext)trước khi sử dụng.- Với
inputSchemacùng dòng, loại dữ liệu đầu vàoexecuteđược suy luận từ giản đồ. - Các loại được đặt tên như
WebMCP.ModelContextToollà loại chung (không cần nhập), hữu ích cho các nhà máy công cụ nhập.
Hỗ trợ khung
BẮT BUỘC: Nếu ứng dụng sử dụng React, Angular hoặc Vue, hãy đăng ký các công cụ thông qua tính năng tích hợp WebMCP chính thức của khung đó, được liệt kê bên dưới. KHÔNG gọi document.modelContext.registerTool() từ các thành phần hoặc viết trình bao bọc vòng đời của riêng bạn. Mỗi hoạt động tích hợp đều xử lý việc phát hiện tính năng, dọn dẹp AbortSignal và xác định phạm vi công cụ cho vòng đời của thành phần hoặc trình chèn. Các API này đang trong giai đoạn thử nghiệm, vì vậy, trước khi viết mã, hãy tra cứu chữ ký hiện tại trong các loại hoặc tài liệu của gói.
| Khung | Gói | API | Tài liệu |
|---|---|---|---|
| React 18 trở lên | use-webmcp-tool |
useWebMCP(options): một lệnh gọi cho mỗi công cụ |
npmjs.com/package/use-webmcp-tool |
| Angular | @angular/core, @angular/forms/signals |
provideExperimentalWebMcpTools([...]) (nhà cung cấp ứng dụng hoặc tuyến đường), declareExperimentalWebMcpTool(...) (dịch vụ nội bộ), provideExperimentalWebMcpForms() + lựa chọn experimentalWebMcpTool trên Biểu mẫu tín hiệu |
angular.dev/ai/webmcp |
| Vue | @vueuse/core |
composable useWebMCP(options) |
vueuse.org/core/usewebmcp |
Tất cả quy tắc trong hướng dẫn này vẫn áp dụng khi bạn sử dụng các công cụ tích hợp này:
- Giữ nguyên hình dạng định nghĩa công cụ:
name,description,inputSchema,execute(input, { signal })vàannotations. - Tuân thủ các quy tắc về nội dung mô tả và chú thích.
- Xác thực dữ liệu đầu vào và áp dụng giá trị mặc định bên trong
execute. - Truyền
signalvào tác vụ chạy trong thời gian dài. - Để chỉ cung cấp một công cụ trong một số trường hợp, hãy truyền
enabled(React, Vue). KHÔNG gói lệnh gọi hook hoặc composable trong một điều kiện. - Các công cụ tích hợp có thể gói kết quả và lỗi (ví dụ: dưới dạng
{ content, isError }). Hãy kiểm tra tài liệu của công cụ tích hợp trước khi dựa vào cách lỗi đến được với tác nhân.
Ghi chú về API
- annotations: (Không bắt buộc) Từ điển cho siêu dữ liệu của công cụ.
- readOnlyHint: (Không bắt buộc) Đặt thành
truenếu công cụ không sửa đổi trạng thái nào và chỉ đọc dữ liệu. Điều này giúp tác nhân quyết định thời điểm an toàn để gọi công cụ. - consequentialHint: (Không bắt buộc, Chrome 154 trở lên) Đặt thành
truecho các hành động có rủi ro cao, không thể huỷ bỏ hoặc có tác động đến thế giới thực để tác nhân yêu cầu người dùng xác nhận trước. - untrustedContentHint: (Không bắt buộc) Đặt thành
truekhi công cụ trả về nội dung mà trang web của bạn không kiểm soát, chẳng hạn như văn bản do người dùng tạo hoặc phản hồi của API bên thứ ba. - debugging: (Không bắt buộc, Chrome 156 trở lên) Đặt thành
truekhi công cụ này dùng để gỡ lỗi và công cụ cho nhà phát triển, chứ không phải cho các tác vụ của người dùng cuối. Mặc định làfalse.
- readOnlyHint: (Không bắt buộc) Đặt thành
- Các lựa chọn đăng ký:
- signal: (Không bắt buộc) Một
AbortSignaldùng để huỷ đăng ký công cụ khi không còn cần thiết. - exposedTo: (Không bắt buộc) Một mảng các chuỗi gốc bảo mật kiểm soát những tài liệu nào trong cây tài liệu được phép khám phá và thực thi công cụ trên các ranh giới khung.
- signal: (Không bắt buộc) Một
- Các lựa chọn khám phá công cụ (
ModelContextGetToolOptions):- fromOrigins: (Không bắt buộc) Một mảng các chuỗi gốc bảo mật để truy vấn trong các khung có thể truy cập. Việc gọi
getTools()mà không cófromOriginschỉ truy vấn các tài liệu cùng nguồn gốc.
- fromOrigins: (Không bắt buộc) Một mảng các chuỗi gốc bảo mật để truy vấn trong các khung có thể truy cập. Việc gọi
- Định dạng trả về: Hàm
executecó thể trả về bất kỳ giá trị nào có thể chuyển đổi tuần tự JSON (đối tượng, mảng, chuỗi, số, boolean). Thông báo về một ngoại lệ được gửi từexecutekhông được chuyển tiếp đến tác nhân, vì vậy, hãy trả về các lỗi có thể xử lý dưới dạng tải trọng lỗi có cấu trúc (ví dụ:{ error: "..." }) thông qua giá trị trả về của công cụ để tác nhân có thể đọc và xử lý các lỗi đó. - Bối cảnh bảo mật: WebMCP yêu cầu HTTPS. Tất cả các nguồn gốc trong
exposedTovàfromOriginscũng phải có khả năng đáng tin cậy. - Không dùng nữa/Đã xoá:
navigator.modelContext(không dùng nữa trong Chromium 150),unregisterTool(),provideContext()vàclearContext()không còn được hỗ trợ.
Chiến lược dự phòng
Bạn nên sử dụng WebMCP Imperative API cùng với tính năng phát hiện tính năng để đảm bảo khả năng tương thích với các trình duyệt chưa hỗ trợ WebMCP.
if ('modelContext' in document) {
// Register tools
}