Ajan Tabanlı JavaScript Araçları

Web özellikleri: document.modelContext

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 sayfada getTools() veya executeTool() 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() ve executeTool(), ö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 bir AbortSignal.
  • 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ı exposedTo aracılığıyla yetkilendirir ve tüketici çerçevesi, sağlayıcı kaynağını getTools({ fromOrigins: [...] }) aracılığıyla açıkça istemelidir. fromOrigins olmadan getTools() yalnızca aynı kaynaklı dokümanları sorgular.
  • Kaynak eşleştirme: Tescil belgesinin kendi kaynağı her zaman erişime sahiptir. exposedTo içinde belirtilen kaynaklara, aracı document.modelContext.getTools({ fromOrigins: [...] }) üzerinden keşfetme ve document.modelContext.executeTool() üzerinden yürütme izni verilir.
  • Güvenlik şartı: exposedTo içindeki her kaynak güvenilir olmalıdır (HTTPS veya localhost). Geçersiz veya güvenli olmayan bir kaynak iletildiğinde registerTool(), SecurityError ile 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: localStorage veya 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(), ReadableStream okuyucular): signal doğrudan iletilir.
  • Bunu yapmayan API'ler (setTimeout, setInterval, yoklama döngüleri, await yoğun ardışık düzenler): Adımlar arasında signal.throwIfAborted() çağrısı yapın ve/veya signal.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:

  1. 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.
  2. 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:

  • inputObject bir nesne değil veya JSON dizesi olarak serileştirilemiyor (ör. döngüsel referanslar veya BigInt değerleri). JSON serileştirme tarafından atlanan değerlerin (ör. işlevler ve undefined), 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.modelContext isteğe bağlı olarak yazıldığından kullanmadan önce if (document.modelContext) ile koruyun.
  • Satır içi inputSchema ile execute giriş türü şemadan tahmin edilir.
  • WebMCP.ModelContextTool gibi 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 }) ve annotations.
  • Açıklamalar ve ek açıklamalarla ilgili kurallara uyun.
  • execute içinde girişi doğrulayın ve varsayılanları uygulayın.
  • Uzun süren işlere signal parametresini 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 true olarak 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 true olarak 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 true olarak 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 true olarak ayarlanır. Varsayılan değer: false.
  • 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.
  • Araç Keşfi Seçenekleri (ModelContextGetToolOptions):
    • fromOrigins: (İsteğe bağlı) Erişilebilir çerçevelerde sorgulanacak güvenli kaynak dizeleri dizisi. getTools() yöntemini fromOrigins olmadan çağırmak yalnızca aynı kaynaklı dokümanları sorgular.
  • Dönüş biçimi: execute işlevi, JSON olarak serileştirilebilen herhangi bir değeri (nesne, dizi, dize, sayı, Boole) döndürebilir. execute tarafı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. exposedTo ve fromOrigins iç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() ve clearContext() 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
}