Imperative API, JavaScript araçlarını programatik olarak tanımlamak için document.modelContext.registerTool() kullanır. Bu, mevcut rotaya veya kullanıcı durumuna göre araçların eklenmesi ya da kaldırılması gereken tek sayfalık uygulamalar (SPA'lar) için idealdir.
WebMCP, üretici/tüketici mimarisi üzerinde çalışır:
- Web sayfaları araç üreticileridir: Araçları
document.modelContext.registerTool()kullanarak tanımlar ve kaydedersiniz. Bir web sayfasının uygulaması gereken tek şey budur. Araçları temsilcilere göstermek için sayfadagetTools()veyaexecuteTool()yöntemini çağırmanız gerekmez. - Tarayıcı ve uzantı temsilcileri birincil tüketicilerdir: Tarayıcı tarafından veya tarayıcı aracılığıyla sağlanan temsilciler (tarayıcının yerleşik temsilcisi, tarayıcı uzantıları, Geliştirici Araçları ve sistem düzeyindeki asistanlar dahil), kayıtlı araçları dahili platform mekanizmaları aracılığıyla bant dışı olarak keşfeder ve çağırır.
- Sayfa içi temsilciler ve test bantları:
getTools()veexecuteTool(), özellikle sayfa içi JavaScript asistanları (ör. yerleşik sohbet widget'ı veya<iframe>) ve araçları doğrudan sayfa bağlamında keşfedip çağırması gereken otomatik test paketleri için mevcuttur.
Kayıt ve Yaşam Döngüsü
Araçlar, bir araç tanımı nesnesi ve isteğe bağlı bir seçenek nesnesi (ModelContextRegisterToolOptions) iletilerek kaydedilir. Bu nesne, isteğe bağlı iki üyeyi destekler:
signal: Artık ihtiyaç duyulmadığında aracın kaydını iptal etmek için kullanılan birAbortSignal.exposedTo: Belge ağacındaki hangi belgelerin, çerçeve sınırları genelinde aracı keşfetmesine ve yürütmesine izin verildiğini kontrol eden kaynak dizeleri dizisi.
AbortController ile Yaşam Döngüsü Yönetimi
WebMCP, unregisterTool() yöntemi sağlamıyor. Bir aracın kaydını iptal etmek için kayıt sırasında bir AbortSignal iletmeniz ve araca artık ihtiyaç duyulmadığında bu sinyali iptal etmeniz gerekir.
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();
Kayıt sinyalinin iptal edilmesi yalnızca aracın kaydını iptal eder. Halihazırda çalışan yürütme işlemlerini iptal etmez. Uzun süreli işleri başlatan araçlar, aşağıda açıklanan yürütme başına sinyale de uymalıdır. Aksi takdirde, kaydın iptal edilmesi sahipsiz istekler ve eski kullanıcı arayüzü güncellemeleri bırakır.
exposedTo ile çapraz kaynak araç kullanımını kontrol etme
Kayıtlı bir araç, varsayılan olarak tescil belgesine ve aynı kaynak çerçevelere özeldir. Uygulamanız bir <iframe> içine yerleştirildiğinde (veya üçüncü taraf widget'ları yerleştirdiğinde) ve aracı bulup çağırmak için üst veya kardeş çerçevelere ihtiyacınız olduğunda exposedTo kullanarak izin verilen kaynakları belirtin.
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"],
});
- Karşılıklı etkinleştirme el sıkışması: Çapraz kaynak araç keşfi, iki yönlü bir etkinleştirme işlemidir. Araç sağlayıcı çerçevesi, tüketici kaynağını
exposedToaracılığıyla yetkilendirir ve tüketici çerçevesi, sağlayıcı kaynağınıgetTools({ fromOrigins: [...] })aracılığıyla açıkça istemelidir.fromOriginsolmadangetTools()yalnızca aynı kaynaklı dokümanları sorgular. - Kaynak eşleştirme: Tescil belgesinin kendi kaynağı her zaman erişime sahiptir.
exposedToiçinde belirtilen kaynaklara, aracıdocument.modelContext.getTools({ fromOrigins: [...] })üzerinden keşfetme vedocument.modelContext.executeTool()üzerinden yürütme izni verilir. - Güvenlik şartı:
exposedToiçindeki her kaynak güvenilir olmalıdır (HTTPS veya localhost). Geçersiz veya güvenli olmayan bir kaynak iletildiğinderegisterTool(),SecurityErrorile reddedilir. - Kapsam:
exposedTo, doküman ağacındaki çerçeveler arasında sayfa içi dokümanlar arası keşfi kontrol eder.
Parametreleri tanımlama
Parametreler (params), inputSchema özelliği kullanılarak tanımlanır. Bu, aracın beklediği yapılandırılmış verileri açıklayan bir JSON Şeması nesnesi olmalıdır.
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 }
});
Yazma Aracı ve Parametre Açıklamaları
Temsilci zaten tam inputSchema değerini aldığından description yalnızca aracın ne yaptığını ve ne zaman kullanılacağını belirtmelidir. ASLA parametre adlarını, türlerini, enum değerlerini, varsayılan değerlerini veya sınırlarını tekrarlamayın. Bunları şemada (enum, default, minimum/maximum) tanımlayın. Parametre açıklamaları da aynı kurala tabidir: Değerin türünü veya izin verilen değerleri değil, ne anlama geldiğini belirtin.
Tarayıcı, bağımsız değişkenleri inputSchema ile karşılaştırarak doğrulamaz veya default değerlerini uygulamaz. Bu nedenle, her ikisini de execute içinde yapın.
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 },
});
Yürütme kalıpları
execute geri çağırma işlevi her zaman iki bağımsız değişken alır: giriş nesnesi ve AbortSignal içeren bir seçenekler nesnesi (execute(inputObject, { signal })).
async execute ne zaman kullanılır?
Araç, Promise döndüren veya tamamlanması zaman alan işlemler içeriyorsa async kullanın:
- Ağ çağrıları: API'den veri alma.
- Eşzamansız depolama: IndexedDB'ye erişim.
- Harici Etkinlikler: Belirli bir durum değişikliğinin veya animasyonun tamamlanmasını bekleme.
async execute(input, { signal }) {
const response = await fetch(`/api/data/${input.id}`, { signal });
return await response.json();
}
execute (Eşzamanlı) ne zaman kullanılır?
Anında işlemler için standart bir eşzamanlı işlev kullanın. Senkronize bir araç, iptal işlemi gözlemlenmeden önce tamamlanır. Bu nedenle sinyali yoksayabilir:
- Saf mantık: Matematik, filtreleme veya bellekteki verileri sıralama.
- Eşzamanlı durum:
localStorageveya eşzamanlı durum yöneticisinden okuma.
execute(input) {
return input.items.filter(item => item.active);
}
execute uygulamasında hataları işleme
execute bir hata verdiğinde (veya reddedilen bir promise döndürdüğünde) temsilci yalnızca genel bir yürütme hatası alır. Hata mesajı temsilciye iletilmez. Aracınız işlem yapılabilir veya kurtarılabilir bir hatayla (ör. geçersiz giriş, eksik öğeler veya başarısız HTTP durumu) karşılaşırsa throw new Error(...) YAPMAYIN. Bunun yerine, yapay zeka ajanı teşhis ayrıntılarını alıp kendi kendini düzeltebilmesi veya yeniden deneyebilmesi için aracın normal dönüş değeri aracılığıyla yapılandırılmış bir hata yükü döndürün:
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;
}
Yalnızca yürütme iptal edildiğinde yeniden oluşturun (signal.aborted, true).
Devam eden yürütmeler iptal ediliyor
İptal işlemi kullanıcı veya müşteri temsilcisi tarafından başlatılır. ZORUNLU: Ağ istekleri veya uzun süren diğer eş zamansız işlemleri gerçekleştiren tüm araçlar signal'yi dikkate ALMALIDIR. Aksi takdirde, iptal edilen yürütmeler kaynak tüketmeye devam eder ve temsilci başka bir işleme geçtikten sonra kullanıcı arayüzüne eski veriler yazabilir.
- Sinyal kabul eden API'ler (
fetch(),addEventListener(),ReadableStreamokuyucular):signaldoğrudan iletilir. - Bunu yapmayan API'ler (
setTimeout,setInterval, yoklama döngüleri,awaityoğun ardışık düzenler): Adımlar arasındasignal.throwIfAborted()çağrısı yapın ve/veyasignal.addEventListener('abort', ...)üzerinde reddedin. Zamanlayıcılar sinyal kabul etmediğinden, iptal dinleyicisinde bunları kendiniz temizlemeniz gerekir.
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 }
});
Sonuçları olan araçları işaretleme
Chrome 154'ten itibaren annotations, consequentialHint özelliğini destekliyor. Seyahat rezervasyonu yapma, para transferi, mesaj gönderme veya veri silme gibi önemli, geri alınamaz ya da gerçek dünyada etkisi olan işlemler gerçekleştiren araçlar için bu değeri true olarak ayarlayın. Temsilcilere, yürütmeden önce kullanıcıdan açık onay istemelerini bildirir.
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.
}
});
ZORUNLU: consequentialHint'yi bir yaptırım mekanizması olarak değil, ipucu olarak değerlendirin. Yürütmeyi kendi başına engellemez ve ipucundan önce gelen tarayıcılar hiç istemde bulunmaz. İşlemin gerektirdiği uygulama içi onayları olduğu gibi bırakın.
Hata Ayıklama Araçlarını İşaretleme
Chrome 156'dan itibaren annotations, debugging özelliğini destekliyor. Son kullanıcı görevleri yerine hata ayıklama ve geliştirici araçları için oluşturulan araçlarda annotations.debugging değerini true olarak ayarlayın. Örnekler: dahili uygulama durumunu dökme, özellik bayraklarını açma/kapatma veya test verilerini ekleme. Bu sayede temsilciler, yalnızca geliştiricilere yönelik araçları kullanıcı için tasarlanmış araçlardan ayırt edebilir. Varsayılan olarak false değerine ayarlanır. Sayfa içi temsilciler ve test bantları, getTools() üzerinden RegisteredTool.annotations.debugging adresinden okuyabilir.
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.
}
});
Sayfa İçi Temsilciler ve Test (getTools ve executeTool)
Web sayfalarının, araçları yapay zeka ajanlarına göstermek için getTools() veya executeTool() kullanması gerekmez. Tarayıcı temsilcileri, tarayıcı uzantıları, Geliştirici Araçları ve sistem düzeyindeki asistanların araçlarınızı bant dışı olarak keşfedip yürütmesi için document.modelContext.registerTool() yöntemini çağırmanız yeterlidir.
getTools() ve executeTool() yöntemleri, özellikle JavaScript ortamında çalışan tüketiciler için mevcuttur:
- Sayfa içi JavaScript temsilcileri: Doğrudan sayfaya yerleştirilmiş (veya bir
<iframe>içinde çalışan) bir yapay zeka asistanı, yardımcı pilot widget'ı ya da sohbet arayüzü, çevreleyen sayfanın veya doküman ağacındaki erişilebilir çerçevelerin hangi araçları sunduğunu keşfetmeli ve bunları kullanıcı adına çağırmalıdır. - Otomatik test ve hata ayıklama: Kayıtlı araç meta verilerini inceleyen ve canlı bir harici LLM donanımı gerektirmeden temsilci araç çağrılarını simüle eden test paketleri (ör. Playwright, Vitest veya tarayıcı içi birim testleri).
getTools() ile kullanılabilen araçları keşfetme
Sayfa içi temsilciler, geçerli dokümandan ve doküman ağacındaki erişilebilir çerçevelerden bir RegisteredTool nesnesi dizisi almak için document.modelContext.getTools() yöntemini çağırır.
Chrome 155 sürümünden itibaren RegisteredTool.inputSchema, doğrudan JavaScript nesnesi (kayıt sırasında sağlanan şemanın derin kopyası) olarak döndürülür. Bu nesneyi değiştirmek, kayıtlı aracın gerçek şemasını değiştirmez.
// 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(", ")}`);
});
Çapraz kaynak alt iFrame'lerinde kayıtlı araçları keşfetmek için (kayıt sırasında exposedTo aracılığıyla açıkça erişim izni verilmelidir) seçenekler sözlüğünde fromOrigins değerini iletin:
// 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"],
});
executeTool() ile araçları çağırma
Sayfa içi temsilciler ve test komut dosyaları, kayıtlı bir aracı çalıştırmak için document.modelContext.executeTool(tool, inputObject, options) yöntemini çağırır. Araç, kayıtlı olduğu dokümanda çalışır ve promise, aracın execute geri çağırma işlevi tarafından döndürülen dizeye dönüştürülmüş sonuca çözümlenir.
Chrome 155'ten itibaren executeTool(), inputObject için doğrudan düz bir JavaScript nesnesini kabul eder. Bu, aracınızın execute geri çağırma işlevinin aldığı giriş biçimiyle eşleşir.
// 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);
}
Döndürülen promise şu durumlarda reddedilir:
inputObjectbir nesne değil veya JSON dizesi olarak serileştirilemiyor (ör. döngüsel referanslar veyaBigIntdeğerleri). JSON serileştirme tarafından atlanan değerlerin (ör. işlevler veundefined), reddedilmeye neden olmak yerine araç tarafından alınan nesneden çıkarılacağını unutmayın.- Yürütme
options.signalüzerinden iptal edildi. - Araç, yürütülmeden önce kaydı silinmiş veya işlenmemiş bir çalışma zamanı hatasıyla karşılaşmış.
Araç Fabrikası Deseni
Araçlarınıza bağlam (ör. mağazalar veya uygulama örnekleri) iletmek için fabrika işlevlerini kullanın.
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 }
};
}
TypeScript Türleri
TypeScript projelerinde document.modelContext için bildirimleri manuel olarak YAZMAYIN. Resmi webmcp-types paketini (npm install --save-dev webmcp-types) yükleyin ve otomatik olarak alınmadığı için tsconfig.json dosyasına ekleyin:
{
"compilerOptions": {
"types": ["webmcp-types"]
}
}
document.modelContextisteğe bağlı olarak yazıldığından kullanmadan önceif (document.modelContext)ile koruyun.- Satır içi
inputSchemaileexecutegiriş türü şemadan tahmin edilir. WebMCP.ModelContextToolgibi adlandırılmış türler geneldir (içe aktarma gerekmez) ve araç fabrikalarını yazmak için kullanışlıdır.
Çerçeve desteği
ZORUNLU: Uygulama React, Angular veya Vue kullanıyorsa araçları, aşağıda listelenen ilgili çerçevenin resmi WebMCP entegrasyonu aracılığıyla kaydedin. Bileşenlerden document.modelContext.registerTool() yöntemini ÇAĞIRMAYIN veya kendi yaşam döngüsü sarmalayıcınızı yazmayın. Her entegrasyon; özellik algılama, AbortSignal temizleme ve araçları bileşen veya enjektör yaşam döngüsüne göre kapsamlandırma işlemlerini zaten gerçekleştirir. Bu API'ler deneyseldir. Bu nedenle, kod yazmadan önce paketin türlerinde veya belgelerinde mevcut imzayı kontrol edin.
| Çerçeve | Paket | API | Belgeler |
|---|---|---|---|
| React 18+ | use-webmcp-tool |
useWebMCP(options): araç başına bir çağrı |
npmjs.com/package/use-webmcp-tool |
| Angular | @angular/core, @angular/forms/signals |
provideExperimentalWebMcpTools([...]) (uygulama veya rota sağlayıcılar), declareExperimentalWebMcpTool(...) (içerideki hizmetler), provideExperimentalWebMcpForms() + Signal Forms'daki experimentalWebMcpTool seçeneği |
angular.dev/ai/webmcp |
| Vue | @vueuse/core |
useWebMCP(options) composable |
vueuse.org/core/usewebmcp |
Bu entegrasyonları kullandığınızda bu kılavuzdaki tüm kurallar geçerli olmaya devam eder:
- Araç tanımı şeklini aynı tutun:
name,description,inputSchema,execute(input, { signal })veannotations. - Açıklamalar ve ek açıklamalarla ilgili kurallara uyun.
executeiçinde girişi doğrulayın ve varsayılanları uygulayın.- Uzun süren işlere
signalparametresini iletin. - Bir aracı yalnızca belirli zamanlarda sunmak için
enabled(React, Vue) değerini iletin. Kancayı veya composable çağrısını bir koşula SARMAYIN. - Entegrasyonlar, sonuçları ve hataları sarmalayabilir (ör.
{ content, isError }olarak). Hataların temsilciye nasıl ulaştığına güvenmeden önce entegrasyonun belgelerini kontrol edin.
API Notları
- annotations: (İsteğe bağlı) Araç meta verileri için bir sözlük.
- readOnlyHint: (İsteğe bağlı) Araç herhangi bir durumu değiştirmiyorsa ve yalnızca verileri okuyorsa
trueolarak ayarlayın. Bu, temsilcilerin aracı ne zaman çağırmanın güvenli olduğuna karar vermesine yardımcı olur. - consequentialHint: (İsteğe bağlı, Chrome 154+) Önemli, geri alınamaz veya gerçek dünyadaki işlemler için
trueolarak ayarlanır. Böylece temsilciler önce kullanıcı onayı ister. - untrustedContentHint: (İsteğe bağlı) Araç, sitenizin kontrol etmediği içerikleri (ör. kullanıcı tarafından oluşturulan metinler veya üçüncü taraf API yanıtları) döndürdüğünde
trueolarak ayarlanır. - debugging: (İsteğe bağlı, Chrome 156+) Araç, son kullanıcı görevleri için değil, hata ayıklama ve geliştirici araçları için tasarlandığında
trueolarak ayarlanır. Varsayılan değer:false.
- readOnlyHint: (İsteğe bağlı) Araç herhangi bir durumu değiştirmiyorsa ve yalnızca verileri okuyorsa
- Kayıt seçenekleri:
- signal: (İsteğe bağlı) Artık ihtiyaç duyulmadığında aracın kaydını iptal etmek için kullanılan bir
AbortSignal. - exposedTo: (İsteğe bağlı) Belge ağacındaki hangi belgelerin, çerçeve sınırları genelinde aracı keşfetmesine ve yürütmesine izin verildiğini kontrol eden güvenli kaynak dizeleri dizisi.
- signal: (İsteğe bağlı) Artık ihtiyaç duyulmadığında aracın kaydını iptal etmek için kullanılan bir
- Araç Keşfi Seçenekleri (
ModelContextGetToolOptions):- fromOrigins: (İsteğe bağlı) Erişilebilir çerçevelerde sorgulanacak güvenli kaynak dizeleri dizisi.
getTools()yönteminifromOriginsolmadan çağırmak yalnızca aynı kaynaklı dokümanları sorgular.
- fromOrigins: (İsteğe bağlı) Erişilebilir çerçevelerde sorgulanacak güvenli kaynak dizeleri dizisi.
- Dönüş biçimi:
executeişlevi, JSON olarak serileştirilebilen herhangi bir değeri (nesne, dizi, dize, sayı, Boole) döndürebilir.executetarafından oluşturulan bir istisnanın mesajı temsilciye iletilmez.Bu nedenle, temsilcinin okuyup işlem yapabilmesi için uygulanabilir hataları aracın dönüş değeri aracılığıyla yapılandırılmış hata yükleri (ör.{ error: "..." }) olarak döndürün. - Güvenli Bağlam: WebMCP için HTTPS gerekir.
exposedTovefromOriginsiçindeki tüm kaynaklar da potansiyel olarak güvenilir olmalıdır. - Desteği sonlandırıldı/Kaldırıldı:
navigator.modelContext(Chromium 150'de desteği sonlandırıldı),unregisterTool(),provideContext()veclearContext()artık desteklenmiyor.
Yedek stratejiler
WebMCP Imperative API, henüz WebMCP'yi desteklemeyen tarayıcılarla uyumluluğu sağlamak için özellik algılama ile birlikte kullanılmalıdır.
if ('modelContext' in document) {
// Register tools
}