From 05af6610fc976860e44c9da18563f864ce61c11e Mon Sep 17 00:00:00 2001 From: Emre Sokullu Date: Tue, 22 Sep 2026 13:53:59 -0700 Subject: [PATCH 1/4] feat: enable WebMCP by default --- docs/agent-tools.md | 6 +++--- docs/architecture.md | 6 +++--- docs/claude-chrome-comparison.md | 2 +- src/chrome/src/agent/agent.js | 8 ++++---- src/chrome/src/background.js | 4 ++-- src/chrome/src/config-transfer.js | 2 +- src/chrome/src/ui/locales/en.js | 2 +- src/chrome/src/ui/settings.html | 2 +- src/chrome/src/ui/settings.js | 2 +- src/firefox/src/config-transfer.js | 2 +- test/run.js | 31 +++++++++++++++--------------- test/webmcp-e2e.mjs | 2 ++ 12 files changed, 35 insertions(+), 34 deletions(-) diff --git a/docs/agent-tools.md b/docs/agent-tools.md index 0d8afe7fd..3681789cb 100644 --- a/docs/agent-tools.md +++ b/docs/agent-tools.md @@ -132,9 +132,9 @@ before the skill is loaded (or if it is removed), the tools are absent. Ask mode still filters out mutating and download tools even when their owning skill is loaded. See [skills](skills.md). -**WebMCP (experimental, opt-in).** The `list_webmcp_tools` / -`execute_webmcp_tool` rows apply only when **Experimental WebMCP** is enabled -under Settings → General → Advanced. The setting is off by default; while off, +**WebMCP (experimental, on by default).** The `list_webmcp_tools` / +`execute_webmcp_tool` rows apply when **Experimental WebMCP** is enabled +under Settings → General → Advanced. The setting is on by default; while off, the tools and their prompt guidance are omitted from model requests. WebMCP annotations such as `readOnly` are page-authored hints, not a security boundary. Every invocation requires Act or Dev, fresh per-call confirmation, and the diff --git a/docs/architecture.md b/docs/architecture.md index 5c2a525bc..46e26d80e 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -838,9 +838,9 @@ This does not handle browser permission requests, authentication windows, or OS file pickers. Firefox WebExtensions provide no equivalent native-dialog API; those dialogs still require manual handling in Firefox. -WebMCP is an experimental Chrome-only fast path that is off by default. The -user must enable **Experimental WebMCP** under Settings → General → Advanced; -until then, neither WebMCP tool schemas nor WebMCP prompt guidance enter model +WebMCP is an experimental Chrome-only fast path that is on by default. The +user can disable **Experimental WebMCP** under Settings → General → Advanced; +when disabled, neither WebMCP tool schemas nor WebMCP prompt guidance enter model requests. When enabled, `list_webmcp_tools` is available in Ask, Act, and Dev; `execute_webmcp_tool` is restricted to Act/Dev and every invocation requires fresh confirmation plus permission against the diff --git a/docs/claude-chrome-comparison.md b/docs/claude-chrome-comparison.md index 03cefe794..7b3d9aa81 100644 --- a/docs/claude-chrome-comparison.md +++ b/docs/claude-chrome-comparison.md @@ -99,7 +99,7 @@ core surface, including Dev-only `execute_js`, is shared. | Reading/extraction | `read_page`, `read_pdf`, `read_page_source`, `extract_data`, `inspect_element_styles`, `get_selection`, `find_text` | | Dev editing and diagnostics | `inject_css`, `remove_injected_css`, `patch_element`, `revert_patch`, `execute_js`, `read_console`, `inspect_network_requests`, `inspect_event_listeners`, `highlight_element` | | Shadow DOM and frames | `get_shadow_dom`, `shadow_dom_query` on Chrome, `get_frames`, `iframe_read`, `iframe_click`, `iframe_type`, `promote_iframe` | -| WebMCP (experimental) | `list_webmcp_tools`, `execute_webmcp_tool` on supported Chrome builds when enabled | +| WebMCP (experimental, on by default) | `list_webmcp_tools`, `execute_webmcp_tool` on supported Chrome builds when enabled | | Network and files | `fetch_url`, `research_url`, `list_downloads`, `read_downloaded_file`, `download_resource_from_page`, `download_files`, `upload_file` | | Long-running work | `schedule_resume`, `schedule_task`, `scratchpad_write`, `progress_update`, `progress_read` | | Safety/workflow | `verify_form`, `clarify`, `done`, `solve_captcha` | diff --git a/src/chrome/src/agent/agent.js b/src/chrome/src/agent/agent.js index 03864d006..c7ba30d23 100644 --- a/src/chrome/src/agent/agent.js +++ b/src/chrome/src/agent/agent.js @@ -1018,10 +1018,10 @@ export class Agent extends LoopDetector { // Defaults to true at extension runtime via background.js and Settings. this.strictSecretMode = false; - // Experimental Chrome WebMCP integration. Off by default so ordinary - // runs do not pay for unused tool schemas or prompt guidance. Users can - // opt in from Settings → General → Advanced. - this.webMcpEnabled = false; + // Experimental Chrome WebMCP integration. On by default so supported + // pages can expose structured tools without an opt-in step. Users can + // opt out from Settings → General → Advanced. + this.webMcpEnabled = true; // Profile auto-fill: when enabled, the user's profile text (name, // email, throwaway password, etc.) is appended to the system prompt diff --git a/src/chrome/src/background.js b/src/chrome/src/background.js index 879769a33..9b79e0cd4 100644 --- a/src/chrome/src/background.js +++ b/src/chrome/src/background.js @@ -593,7 +593,7 @@ const strictSecretModeReady = loadStrictSecretMode().catch(() => {}); async function loadWebMCPEnabled() { const stored = await chrome.storage.local.get('webMcpEnabled'); - agent.setWebMCPEnabled(stored.webMcpEnabled === true); + agent.setWebMCPEnabled(stored.webMcpEnabled !== false); } const webMcpEnabledReady = loadWebMCPEnabled().catch(() => {}); @@ -1264,7 +1264,7 @@ chrome.storage.onChanged.addListener((changes, areaName) => { refreshPrompts = true; } if (changes.webMcpEnabled) { - agent.setWebMCPEnabled(changes.webMcpEnabled.newValue === true); + agent.setWebMCPEnabled(changes.webMcpEnabled.newValue !== false); } if (changes.profileEnabled) { agent.profileEnabled = !!changes.profileEnabled.newValue; diff --git a/src/chrome/src/config-transfer.js b/src/chrome/src/config-transfer.js index 1aac9a21b..7ea6e1bb2 100644 --- a/src/chrome/src/config-transfer.js +++ b/src/chrome/src/config-transfer.js @@ -41,7 +41,7 @@ export const DEFAULT_CONFIG_SETTINGS = Object.freeze({ alwaysAllowApiMutations: true, apiMutationObserverEnabled: true, pdfViewerEnabled: true, - webMcpEnabled: false, + webMcpEnabled: true, openaiAskStreamingEnabled: true, planBeforeActMode: 'try', planBeforeAct: true, diff --git a/src/chrome/src/ui/locales/en.js b/src/chrome/src/ui/locales/en.js index 416efc5e1..ac6bc84f6 100644 --- a/src/chrome/src/ui/locales/en.js +++ b/src/chrome/src/ui/locales/en.js @@ -651,7 +651,7 @@ export default { 'st.display.api_mutation_observer.label': 'API mutation observer', 'st.display.api_mutation_observer.desc': 'Observe same-tab XHR/fetch request URLs and methods so WebBrain can detect repeated UI actions and suggest API shortcut patterns. On by default.', 'st.display.webmcp.label': 'Experimental WebMCP', - 'st.display.webmcp.desc': 'Allow WebBrain to discover and run structured tools exposed by supported Chrome pages. Enabling this adds experimental WebMCP tools and guidance to the model context. Off by default.', + 'st.display.webmcp.desc': 'Allow WebBrain to discover and run structured tools exposed by supported Chrome pages. Enabling this adds experimental WebMCP tools and guidance to the model context. On by default.', // TRANSLATORS: Updated for multi-provider Ask streaming and silent transport fallback. 'st.display.openai_ask_streaming.label': 'Stream Ask responses', 'st.display.openai_ask_streaming.desc': 'Show text as it arrives in Ask mode for supported providers. Interrupted streams show a notice and retry once without streaming; provider/API errors are still shown. Tool calls wait for stream completion; Act, Dev, scheduled, cloud, and Continue runs stay non-streaming. On by default.', diff --git a/src/chrome/src/ui/settings.html b/src/chrome/src/ui/settings.html index f3f40e4fd..f1ac29d1d 100644 --- a/src/chrome/src/ui/settings.html +++ b/src/chrome/src/ui/settings.html @@ -1770,7 +1770,7 @@

diff --git a/src/chrome/src/ui/settings.js b/src/chrome/src/ui/settings.js index c2086941e..145ad4676 100644 --- a/src/chrome/src/ui/settings.js +++ b/src/chrome/src/ui/settings.js @@ -863,7 +863,7 @@ async function init() { if (voiceInputToggle) voiceInputToggle.checked = stored.voiceInputEnabled ?? true; alwaysAllowApiMutationsToggle.checked = stored.alwaysAllowApiMutations === undefined || stored.alwaysAllowApiMutations === true; apiMutationObserverToggle.checked = stored.apiMutationObserverEnabled === undefined || stored.apiMutationObserverEnabled === true; - if (webMcpToggle) webMcpToggle.checked = stored.webMcpEnabled === true; // off by default + if (webMcpToggle) webMcpToggle.checked = stored.webMcpEnabled !== false; // on by default if (openAIAskStreamingToggle) openAIAskStreamingToggle.checked = stored.openaiAskStreamingEnabled !== false; if (planBeforeActModeSelect) { planBeforeActModeSelect.value = normalizePlanBeforeActMode(stored); diff --git a/src/firefox/src/config-transfer.js b/src/firefox/src/config-transfer.js index 1aac9a21b..7ea6e1bb2 100644 --- a/src/firefox/src/config-transfer.js +++ b/src/firefox/src/config-transfer.js @@ -41,7 +41,7 @@ export const DEFAULT_CONFIG_SETTINGS = Object.freeze({ alwaysAllowApiMutations: true, apiMutationObserverEnabled: true, pdfViewerEnabled: true, - webMcpEnabled: false, + webMcpEnabled: true, openaiAskStreamingEnabled: true, planBeforeActMode: 'try', planBeforeAct: true, diff --git a/test/run.js b/test/run.js index 4faa4ce7b..0b443fc79 100644 --- a/test/run.js +++ b/test/run.js @@ -61990,33 +61990,37 @@ test('MCP bridge settings are Chromium-only, live under Advanced, and keep setup } }); -test('Experimental WebMCP is Chrome-only, opt-in, and absent from default model context', async () => { +test('Experimental WebMCP is Chrome-only, on by default, and present in default model context', async () => { const html = fs.readFileSync(path.join(ROOT, 'src/chrome/src/ui/settings.html'), 'utf8'); const firefoxHtml = fs.readFileSync(path.join(ROOT, 'src/firefox/src/ui/settings.html'), 'utf8'); const settings = fs.readFileSync(path.join(ROOT, 'src/chrome/src/ui/settings.js'), 'utf8'); const background = fs.readFileSync(path.join(ROOT, 'src/chrome/src/background.js'), 'utf8'); const locale = fs.readFileSync(path.join(ROOT, 'src/chrome/src/ui/locales/en.js'), 'utf8'); - assert.match(html, /id="toggle-webmcp"/, 'Chrome Advanced settings should expose the opt-in'); - assert.doesNotMatch(html, /id="toggle-webmcp"\s+checked/, 'WebMCP must default off'); + assert.match(html, /id="toggle-webmcp"/, 'Chrome Advanced settings should expose the toggle'); + assert.match(html, /id="toggle-webmcp"\s+checked/, 'WebMCP must default on'); assert.doesNotMatch(firefoxHtml, /id="toggle-webmcp"/, 'Firefox should not show an unsupported toggle'); - assert.match(settings, /webMcpToggle\.checked = stored\.webMcpEnabled === true/, 'setting should load only explicit true'); + assert.match(settings, /webMcpToggle\.checked = stored\.webMcpEnabled !== false/, 'setting should default on unless explicitly disabled'); assert.match(settings, /webMcpEnabled:\s*webMcpToggle\.checked/, 'setting should persist changes'); - assert.match(background, /agent\.setWebMCPEnabled\(stored\.webMcpEnabled === true\)/, 'background should hydrate the default-off gate'); - assert.match(background, /changes\.webMcpEnabled[\s\S]*agent\.setWebMCPEnabled\(changes\.webMcpEnabled\.newValue === true\)/, 'storage changes should update the live gate'); + assert.match(background, /agent\.setWebMCPEnabled\(stored\.webMcpEnabled !== false\)/, 'background should hydrate the default-on gate'); + assert.match(background, /changes\.webMcpEnabled[\s\S]*agent\.setWebMCPEnabled\(changes\.webMcpEnabled\.newValue !== false\)/, 'storage changes should update the live gate'); assert.match(locale, /'st\.display\.webmcp\.label': 'Experimental WebMCP'/, 'English setting label missing'); - assert.equal(ConfigTransferCh.DEFAULT_CONFIG_SETTINGS.webMcpEnabled, false, 'Chrome config export should preserve the opt-in default'); - assert.equal(ConfigTransferFx.DEFAULT_CONFIG_SETTINGS.webMcpEnabled, false, 'Firefox config schema should preserve cross-browser config compatibility'); + assert.equal(ConfigTransferCh.DEFAULT_CONFIG_SETTINGS.webMcpEnabled, true, 'Chrome config export should preserve the default-on value'); + assert.equal(ConfigTransferFx.DEFAULT_CONFIG_SETTINGS.webMcpEnabled, true, 'Firefox config schema should preserve cross-browser config compatibility'); const originalDisableAll = cdpClientCh.disableAllWebMCP; let cleanupCalls = 0; cdpClientCh.disableAllWebMCP = async () => { cleanupCalls++; return 0; }; try { const agent = new AgentCh({}); - assert.equal(agent.webMcpEnabled, false); - assert.doesNotMatch(agent._buildSystemPrompt('ask'), /WEBMCP/i, 'default Ask prompt should not mention WebMCP'); - assert.equal(getToolsForModeCh('ask', { webMcpAvailable: agent.webMcpEnabled }).some(tool => tool.function.name === 'list_webmcp_tools'), false); + assert.equal(agent.webMcpEnabled, true); + assert.match(agent._buildSystemPrompt('ask'), /WEBMCP \(experimental/i, 'default Ask prompt should explain WebMCP'); + assert.equal(getToolsForModeCh('ask', { webMcpAvailable: agent.webMcpEnabled }).some(tool => tool.function.name === 'list_webmcp_tools'), true); + agent.setWebMCPEnabled(false); + await Promise.resolve(); + assert.equal(cleanupCalls, 1, 'turning the setting off should close active WebMCP sessions'); + assert.doesNotMatch(agent._buildSystemPrompt('ask'), /WEBMCP/i, 'disabling should remove prompt guidance again'); const disabledList = await agent.executeTool(77, 'list_webmcp_tools', {}); assert.equal(disabledList.featureDisabled, true); assert.equal(disabledList.noDispatch, true); @@ -62026,11 +62030,6 @@ test('Experimental WebMCP is Chrome-only, opt-in, and absent from default model agent.setWebMCPEnabled(true); assert.match(agent._buildSystemPrompt('ask'), /WEBMCP \(experimental/i, 'enabled Ask prompt should explain WebMCP'); assert.equal(getToolsForModeCh('ask', { webMcpAvailable: agent.webMcpEnabled }).some(tool => tool.function.name === 'list_webmcp_tools'), true); - - agent.setWebMCPEnabled(false); - await Promise.resolve(); - assert.equal(cleanupCalls, 1, 'turning the setting off should close active WebMCP sessions'); - assert.doesNotMatch(agent._buildSystemPrompt('ask'), /WEBMCP/i, 'disabling should remove prompt guidance again'); } finally { cdpClientCh.disableAllWebMCP = originalDisableAll; } diff --git a/test/webmcp-e2e.mjs b/test/webmcp-e2e.mjs index d511f54b3..8972dfbcf 100644 --- a/test/webmcp-e2e.mjs +++ b/test/webmcp-e2e.mjs @@ -272,6 +272,8 @@ async function initializeExtensionAgent(harness, tabId) { const { Agent } = await import(chrome.runtime.getURL('src/agent/agent.js')); const agent = new Agent({}); globalThis.__webMCPAgentSmoke = agent; + // Explicitly exercise the disabled gate before running the enabled flow. + agent.setWebMCPEnabled(false); const disabledCatalog = await agent.executeTool(targetTabId, 'list_webmcp_tools', {}); agent.setWebMCPEnabled(true); return disabledCatalog; From eea361a76f7a0ad63a61d9a39c60b916404cfba8 Mon Sep 17 00:00:00 2001 From: Emre Sokullu Date: Tue, 22 Sep 2026 14:22:50 -0700 Subject: [PATCH 2/4] fix: fail closed WebMCP hydration --- docs/fr/agent-tools.md | 4 ++-- docs/fr/claude-chrome-comparison.md | 2 +- docs/privacy-and-data-flow.md | 8 ++++---- docs/security-model.md | 2 +- docs/zh-CN/agent-tools.md | 4 ++-- docs/zh-CN/claude-chrome-comparison.md | 2 +- src/chrome/src/agent/agent.js | 7 +++---- src/chrome/src/background.js | 4 +++- src/chrome/src/ui/locales/ar.js | 2 +- src/chrome/src/ui/locales/bn.js | 2 +- src/chrome/src/ui/locales/es.js | 2 +- src/chrome/src/ui/locales/fa.js | 2 +- src/chrome/src/ui/locales/fr.js | 2 +- src/chrome/src/ui/locales/he.js | 2 +- src/chrome/src/ui/locales/hi.js | 2 +- src/chrome/src/ui/locales/id.js | 2 +- src/chrome/src/ui/locales/ja.js | 2 +- src/chrome/src/ui/locales/ko.js | 2 +- src/chrome/src/ui/locales/ms.js | 2 +- src/chrome/src/ui/locales/nl.js | 2 +- src/chrome/src/ui/locales/pl.js | 2 +- src/chrome/src/ui/locales/pt.js | 2 +- src/chrome/src/ui/locales/ru.js | 2 +- src/chrome/src/ui/locales/th.js | 2 +- src/chrome/src/ui/locales/tl.js | 2 +- src/chrome/src/ui/locales/tr.js | 2 +- src/chrome/src/ui/locales/uk.js | 2 +- src/chrome/src/ui/locales/vi.js | 2 +- src/chrome/src/ui/locales/zh.js | 2 +- test/run.js | 8 +++++++- 30 files changed, 45 insertions(+), 38 deletions(-) diff --git a/docs/fr/agent-tools.md b/docs/fr/agent-tools.md index c266f54c8..9f56a272a 100644 --- a/docs/fr/agent-tools.md +++ b/docs/fr/agent-tools.md @@ -121,9 +121,9 @@ absents. Le mode Ask filtre toujours les outils de mutation et de téléchargeme même lorsque la compétence propriétaire est chargée. Voir [compétences](skills.md). -**WebMCP (expérimental, sur activation).** Les lignes `list_webmcp_tools` / +**WebMCP (expérimental, activé par défaut).** Les lignes `list_webmcp_tools` / `execute_webmcp_tool` ne s'appliquent que lorsque **WebMCP expérimental** est -activé dans Paramètres → Général → Avancé. Le réglage est désactivé par défaut ; +activé dans Paramètres → Général → Avancé. Le réglage est activé par défaut ; tant qu'il l'est, les outils et leurs consignes de prompt sont omis des requêtes au modèle. Les annotations WebMCP telles que `readOnly` sont des indications écrites par la page, pas une frontière de sécurité. Chaque invocation exige Act diff --git a/docs/fr/claude-chrome-comparison.md b/docs/fr/claude-chrome-comparison.md index bb48c9242..1558c6ca0 100644 --- a/docs/fr/claude-chrome-comparison.md +++ b/docs/fr/claude-chrome-comparison.md @@ -101,7 +101,7 @@ de la surface de base, y compris `execute_js` réservé au mode Dev, est partag | Lecture/extraction | `read_page`, `read_pdf`, `read_page_source`, `extract_data`, `inspect_element_styles`, `get_selection`, `find_text` | | Édition et diagnostic Dev | `inject_css`, `remove_injected_css`, `patch_element`, `revert_patch`, `execute_js`, `read_console`, `inspect_network_requests`, `inspect_event_listeners`, `highlight_element` | | Shadow DOM et cadres | `get_shadow_dom`, `shadow_dom_query` sur Chrome, `get_frames`, `iframe_read`, `iframe_click`, `iframe_type`, `promote_iframe` | -| WebMCP (expérimental) | `list_webmcp_tools`, `execute_webmcp_tool` sur les versions Chrome compatibles lorsque l'option est activée | +| WebMCP (expérimental, activé par défaut) | `list_webmcp_tools`, `execute_webmcp_tool` sur les versions Chrome compatibles lorsque l'option est activée | | Réseau et fichiers | `fetch_url`, `research_url`, `list_downloads`, `read_downloaded_file`, `download_resource_from_page`, `download_files`, `upload_file` | | Travail longue durée | `schedule_resume`, `schedule_task`, `scratchpad_write`, `progress_update`, `progress_read` | | Sécurité/flux de travail | `verify_form`, `clarify`, `done`, `solve_captcha` | diff --git a/docs/privacy-and-data-flow.md b/docs/privacy-and-data-flow.md index b5e857823..e329db994 100644 --- a/docs/privacy-and-data-flow.md +++ b/docs/privacy-and-data-flow.md @@ -377,10 +377,10 @@ the URL + method to the active LLM conversation. ### Experimental WebMCP -WebMCP is off by default. A user must enable **Experimental WebMCP** under -Settings → General → Advanced before WebBrain sends its tool schemas or prompt -guidance to the configured LLM. On supporting Chrome pages, WebBrain can then -enable the experimental CDP `WebMCP` domain. Chrome reports the structured tools registered by the current page, +WebMCP is on by default. A user can disable **Experimental WebMCP** under +Settings → General → Advanced to prevent WebBrain from sending its tool schemas +or prompt guidance to the configured LLM. On supporting Chrome pages, WebBrain +can enable the experimental CDP `WebMCP` domain. Chrome reports the structured tools registered by the current page, including their page-supplied name, description, input schema, annotations, and registration frame. WebBrain keeps a bounded in-memory per-tab catalog, assigns opaque `wmcp_*` IDs, and removes it when the conversation/tab CDP session is diff --git a/docs/security-model.md b/docs/security-model.md index 8c54c7f19..3fd2f8ff5 100644 --- a/docs/security-model.md +++ b/docs/security-model.md @@ -137,7 +137,7 @@ The primary threat: a malicious page crafts content that, when read by the agent | **Tiered tool exposure** | Provider tiers (`compact | mid | full`) limit the normal browser-agent surface for smaller models. Compact gets the smallest action surface; Mid adds common task tools; Full adds advanced UI/DOM fallbacks. Compact Dev is blocked. | | **Plan before Act** | When enabled, action-mode runs first produce a structured plan and wait for side-panel approval before any browser tool executes. In Try mode, planner JSON that remains invalid after repair degrades that turn to Ask/read-only; Strict stops. Scheduled runs can auto-approve the plan only through scheduler policy. | | **Skill import boundary** | Skills can expose read-only HTTP tools and download-job tools through a `webbrain-tools` manifest. Importing or keeping the skill enabled is the trust decision for the declared HTTPS endpoint; declared skill tools use `credentials: "omit"` and should mark third-party results `resultPolicy: "untrusted"`. Download-job skill tools still require an action mode and the normal Downloads permission gate before saving files. | -| **WebMCP boundary** | Experimental WebMCP is off by default, so its tools and prompt guidance do not enter ordinary model requests unless the user opts in under Settings → General → Advanced. When enabled, Chrome page-registered names, descriptions, schemas, frame URLs, annotations, outputs, and errors are page-controlled and always use the untrusted-content wrapper. Calls use opaque IDs. Ask may list tools but cannot invoke them. Because a callback can run arbitrary page logic, every invocation requires Act/Dev, fresh per-call confirmation, and a permission grant for the actual registration-frame origin; a page-authored `readOnly` hint never bypasses those gates. Missing/opaque frame identity fails closed, and the frame plus effective HTTP(S) security origin are revalidated immediately before dispatch to prevent navigation races from borrowing an old grant. | +| **WebMCP boundary** | Experimental WebMCP is on by default, so its tools and prompt guidance enter ordinary model requests unless the user opts out under Settings → General → Advanced. Chrome page-registered names, descriptions, schemas, frame URLs, annotations, outputs, and errors are page-controlled and always use the untrusted-content wrapper. Calls use opaque IDs. Ask may list tools but cannot invoke them. Because a callback can run arbitrary page logic, every invocation requires Act/Dev, fresh per-call confirmation, and a permission grant for the actual registration-frame origin; a page-authored `readOnly` hint never bypasses those gates. Missing/opaque frame identity fails closed, and the frame plus effective HTTP(S) security origin are revalidated immediately before dispatch to prevent navigation races from borrowing an old grant. | | **API mutation override** | A per-conversation `/allow-api` flag, or the default-on persistent setting under General → Advanced, *waives* the permission prompt for write-method network egress (`fetch_url`/`research_url` with POST/PUT/PATCH/DELETE). Neither option waives GET egress or any other capability. Conversation reset clears only the slash-command override. | | **TypeSafe System One sidecar** | Optional scheduled-task judging and fast decisions send only bounded task/observation state to the documented TypeSafe endpoint. They are off by default, require explicit per-feature switches and a user-provided API key, and Jev has no direct browser executor. Scheduled judging can only downgrade an existing success; fast decisions become ordinary tool calls that still pass the normal policy, permission and completion layers. Strict Secret Mode, cancellation and cost limits apply. Malformed responses fail open to the main model and stop further Jev requests for that run. | | **`done()` blocking** | Before accepting completion, the agent probes for open dialogs/forms. If the summary claims "created"/"saved" but a modal is still open, the agent is forced to continue. | diff --git a/docs/zh-CN/agent-tools.md b/docs/zh-CN/agent-tools.md index 67f46f710..906ad3fc8 100644 --- a/docs/zh-CN/agent-tools.md +++ b/docs/zh-CN/agent-tools.md @@ -111,9 +111,9 @@ FreeSkillz.xyz 技能可暴露 `read_youtube_transcript` 以及 `resolve_public_ `download_public_media`。这些工具未硬编码:技能加载前(或被移除后)它们并不存在。 即使所属技能已加载,Ask 模式仍会过滤变更类和下载类工具。参见[技能](skills.md)。 -**WebMCP(实验性,需选择启用)。** 上表中的 `list_webmcp_tools` / +**WebMCP(实验性,默认启用)。** 上表中的 `list_webmcp_tools` / `execute_webmcp_tool` 行仅在设置 → 常规 → 高级中启用**实验性 WebMCP** 时适用。 -该设置默认关闭;关闭时,这些工具及其提示引导不会包含在模型请求中。诸如 +该设置默认开启;关闭时,这些工具及其提示引导不会包含在模型请求中。诸如 `readOnly` 之类的 WebMCP 注解是页面自行声明的提示,而非安全边界。每次调用都需要 Act 或 Dev 模式、逐次的新确认,以及常规的「能力 × 注册帧来源」权限。WebMCP 目前 需要支持它的 Chrome 构建/页面配置;Firefox 不暴露这些工具。 diff --git a/docs/zh-CN/claude-chrome-comparison.md b/docs/zh-CN/claude-chrome-comparison.md index 43135dd38..105a70f06 100644 --- a/docs/zh-CN/claude-chrome-comparison.md +++ b/docs/zh-CN/claude-chrome-comparison.md @@ -94,7 +94,7 @@ Firefox 不包含 Chrome 独有的 Dev 工具和 `shadow_dom_query`;其余核 | 读取/提取 | `read_page`、`read_pdf`、`read_page_source`、`extract_data`、`inspect_element_styles`、`get_selection`、`find_text` | | Dev 编辑与诊断 | `inject_css`、`remove_injected_css`、`patch_element`、`revert_patch`、`execute_js`、`read_console`、`inspect_network_requests`、`inspect_event_listeners`、`highlight_element` | | Shadow DOM 和框架 | `get_shadow_dom`、`shadow_dom_query`(Chrome)、`get_frames`、`iframe_read`、`iframe_click`、`iframe_type`、`promote_iframe` | -| WebMCP(实验性) | 在兼容的 Chrome 构建中启用后提供 `list_webmcp_tools`、`execute_webmcp_tool` | +| WebMCP(实验性,默认启用) | 在兼容的 Chrome 构建中启用后提供 `list_webmcp_tools`、`execute_webmcp_tool` | | 网络和文件 | `fetch_url`、`research_url`、`list_downloads`、`read_downloaded_file`、`download_resource_from_page`、`download_files`、`upload_file` | | 长时间运行的工作 | `schedule_resume`、`schedule_task`、`scratchpad_write`、`progress_update`、`progress_read` | | 安全/工作流 | `verify_form`、`clarify`、`done`、`solve_captcha` | diff --git a/src/chrome/src/agent/agent.js b/src/chrome/src/agent/agent.js index c7ba30d23..2cf091836 100644 --- a/src/chrome/src/agent/agent.js +++ b/src/chrome/src/agent/agent.js @@ -1018,10 +1018,9 @@ export class Agent extends LoopDetector { // Defaults to true at extension runtime via background.js and Settings. this.strictSecretMode = false; - // Experimental Chrome WebMCP integration. On by default so supported - // pages can expose structured tools without an opt-in step. Users can - // opt out from Settings → General → Advanced. - this.webMcpEnabled = true; + // Keep WebMCP unavailable until the persisted setting is successfully + // hydrated. A missing value defaults on, while storage failures fail closed. + this.webMcpEnabled = false; // Profile auto-fill: when enabled, the user's profile text (name, // email, throwaway password, etc.) is appended to the system prompt diff --git a/src/chrome/src/background.js b/src/chrome/src/background.js index 9b79e0cd4..9a6626e8c 100644 --- a/src/chrome/src/background.js +++ b/src/chrome/src/background.js @@ -595,7 +595,9 @@ async function loadWebMCPEnabled() { const stored = await chrome.storage.local.get('webMcpEnabled'); agent.setWebMCPEnabled(stored.webMcpEnabled !== false); } -const webMcpEnabledReady = loadWebMCPEnabled().catch(() => {}); +const webMcpEnabledReady = loadWebMCPEnabled().catch(() => { + agent.setWebMCPEnabled(false); +}); // Profile auto-fill: user-provided text (name, email, etc.) that gets // appended to the system prompt when enabled. Plaintext in storage — diff --git a/src/chrome/src/ui/locales/ar.js b/src/chrome/src/ui/locales/ar.js index e891eeaab..d01156655 100644 --- a/src/chrome/src/ui/locales/ar.js +++ b/src/chrome/src/ui/locales/ar.js @@ -837,7 +837,7 @@ export default { 'st.display.plan_before_act.strict': 'تخطيط صارم', 'st.display.plan_before_act.off': 'معطل', "st.display.webmcp.label": "WebMCP تجريبي", - "st.display.webmcp.desc": "اسمح لـ WebBrain باكتشاف وتشغيل الأدوات المنظمة التي تعرضها صفحات Chrome المدعومة. يؤدي التفعيل إلى إضافة أدوات WebMCP التجريبية وإرشاداتها إلى سياق النموذج. معطل افتراضيًا.", + "st.display.webmcp.desc": "اسمح لـ WebBrain باكتشاف وتشغيل الأدوات المنظمة التي تعرضها صفحات Chrome المدعومة. يؤدي التفعيل إلى إضافة أدوات WebMCP التجريبية وإرشاداتها إلى سياق النموذج. مفعّل افتراضيًا.", // --- Recording, attachments, queue, progress, and voice input --- "sp.record.full_screen_started_html": "بدأ تسجيل الشاشة/النافذة. أوقفه بزر إيقاف في شريط التسجيل، أو بالضغط على Escape مرتين في WebBrain أو في صفحة المتصفح، أو باستخدام زر إيقاف المشاركة في Chrome. أضف --hide-recording-indicator لإبقاء الشريط خارج الفيديو.", "sp.record.full_screen_started_hidden_html": "بدأ تسجيل الشاشة/النافذة. اضغط على Escape مرتين في WebBrain أو في صفحة المتصفح للإيقاف، أو استخدم زر إيقاف المشاركة في Chrome.", diff --git a/src/chrome/src/ui/locales/bn.js b/src/chrome/src/ui/locales/bn.js index 1eafc9f59..343e3aded 100644 --- a/src/chrome/src/ui/locales/bn.js +++ b/src/chrome/src/ui/locales/bn.js @@ -651,7 +651,7 @@ export default { 'st.display.api_mutation_observer.label': "API মিউটেশন পর্যবেক্ষক", 'st.display.api_mutation_observer.desc': "একই-ট্যাব XHR/ফেচ অনুরোধ URL এবং পদ্ধতিগুলি পর্যবেক্ষণ করুন যাতে WebBrain বারবার UI অ্যাকশন সনাক্ত করতে পারে এবং API শর্টকাট প্যাটার্নের পরামর্শ দিতে পারে। ডিফল্টভাবে চালু।", 'st.display.webmcp.label': "পরীক্ষামূলক WebMCP", - 'st.display.webmcp.desc': "WebBrain সমর্থিত Chrome পৃষ্ঠাগুলির দ্বারা প্রকাশিত কাঠামোগত সরঞ্জামগুলি আবিষ্কার এবং চালানোর অনুমতি দিন৷ এটি সক্ষম করলে মডেল প্রসঙ্গে পরীক্ষামূলক WebMCP টুল এবং নির্দেশিকা যোগ হয়। ডিফল্টরূপে বন্ধ।", + 'st.display.webmcp.desc': "WebBrain সমর্থিত Chrome পৃষ্ঠাগুলির দ্বারা প্রকাশিত কাঠামোগত সরঞ্জামগুলি আবিষ্কার এবং চালানোর অনুমতি দিন৷ এটি সক্ষম করলে মডেল প্রসঙ্গে পরীক্ষামূলক WebMCP টুল এবং নির্দেশিকা যোগ হয়। ডিফল্টরূপে চালু।", 'st.display.openai_ask_streaming.label': "Ask মোডে প্রতিক্রিয়া স্ট্রিম করুন", 'st.display.openai_ask_streaming.desc': "সমর্থিত প্রদানকারীদের জন্য Ask মোডে পাঠ্য আসার সাথে সাথেই দেখান। বিঘ্নিত স্ট্রিম একটি বিজ্ঞপ্তি দেখায় এবং স্ট্রিম ছাড়াই একবার পুনরায় চেষ্টা করে; প্রদানকারী/API ত্রুটিগুলি এখনও দেখানো হয়। টুল কল স্ট্রিম শেষ হওয়ার অপেক্ষা করে; Act, Dev, নির্ধারিত, ক্লাউড ও Continue চালনা স্ট্রিমবিহীন থাকে। ডিফল্টভাবে চালু।", 'st.display.plan_before_act.label': "আইনের আগে পরিকল্পনা করুন", diff --git a/src/chrome/src/ui/locales/es.js b/src/chrome/src/ui/locales/es.js index effab9548..19f8f23e7 100644 --- a/src/chrome/src/ui/locales/es.js +++ b/src/chrome/src/ui/locales/es.js @@ -837,7 +837,7 @@ export default { 'st.display.plan_before_act.strict': 'Planificación estricta', 'st.display.plan_before_act.off': 'Desactivado', "st.display.webmcp.label": "WebMCP experimental", - "st.display.webmcp.desc": "Permite que WebBrain descubra y ejecute herramientas estructuradas expuestas por páginas de Chrome compatibles. Al activarlo, se añaden herramientas WebMCP experimentales y sus indicaciones al contexto del modelo. Desactivado por defecto.", + "st.display.webmcp.desc": "Permite que WebBrain descubra y ejecute herramientas estructuradas expuestas por páginas de Chrome compatibles. Al activarlo, se añaden herramientas WebMCP experimentales y sus indicaciones al contexto del modelo. Activado por defecto.", // --- Recording, attachments, queue, progress, and voice input --- "sp.record.full_screen_started_html": "Grabación de pantalla/ventana iniciada. Detenla con Detener en el banner de grabación, pulsando Escape dos veces en WebBrain o en una página del navegador, o con el control Dejar de compartir de Chrome. Añade --hide-recording-indicator para que el banner no aparezca en el vídeo.", "sp.record.full_screen_started_hidden_html": "Grabación de pantalla/ventana iniciada. Pulsa Escape dos veces en WebBrain o en una página del navegador para detenerla, o usa el control Dejar de compartir de Chrome.", diff --git a/src/chrome/src/ui/locales/fa.js b/src/chrome/src/ui/locales/fa.js index bf7c62420..65337c470 100644 --- a/src/chrome/src/ui/locales/fa.js +++ b/src/chrome/src/ui/locales/fa.js @@ -651,7 +651,7 @@ export default { 'st.display.api_mutation_observer.label': "مشاهده گر جهش API", 'st.display.api_mutation_observer.desc': "نشانی‌های وب و روش‌های درخواستی XHR/واکشی همان تب را مشاهده کنید تا WebBrain بتواند اقدامات مکرر UI را تشخیص دهد و الگوهای میانبر API را پیشنهاد کند. به‌طور پیش‌فرض روشن است.", 'st.display.webmcp.label': "WebMCP آزمایشی", - 'st.display.webmcp.desc': "به WebBrain اجازه دهید ابزارهای ساخت یافته ای را که توسط صفحات پشتیبانی شده Chrome در معرض دید قرار گرفته اند را کشف و اجرا کند. فعال کردن این، ابزارهای آزمایشی WebMCP و راهنمایی را به بافت مدل اضافه می کند. به طور پیش فرض خاموش است.", + 'st.display.webmcp.desc': "به WebBrain اجازه دهید ابزارهای ساخت یافته ای را که توسط صفحات پشتیبانی شده Chrome در معرض دید قرار گرفته اند را کشف و اجرا کند. فعال کردن این، ابزارهای آزمایشی WebMCP و راهنمایی را به بافت مدل اضافه می کند. به طور پیش فرض روشن است.", 'st.display.openai_ask_streaming.label': "پخش پاسخ‌ها در حالت Ask", 'st.display.openai_ask_streaming.desc': "متن را هنگام رسیدن در حالت Ask برای ارائه‌دهندگان پشتیبانی‌شده نمایش می‌دهد. جریان‌های قطع‌شده یک اعلان نشان می‌دهند و یک بار بدون پخش، دوباره تلاش می‌کنند؛ خطاهای ارائه‌دهنده/API همچنان نمایش داده می‌شوند. فراخوانی ابزارها منتظر تکمیل جریان می‌مانند؛ اجراهای Act، Dev، زمان‌بندی‌شده، ابری و Continue بدون پخش باقی می‌مانند. به‌صورت پیش‌فرض روشن است.", 'st.display.plan_before_act.label': "قبل از قانون برنامه ریزی کنید", diff --git a/src/chrome/src/ui/locales/fr.js b/src/chrome/src/ui/locales/fr.js index 1fc9147f9..95c686859 100644 --- a/src/chrome/src/ui/locales/fr.js +++ b/src/chrome/src/ui/locales/fr.js @@ -837,7 +837,7 @@ export default { 'st.display.plan_before_act.strict': 'Planification stricte', 'st.display.plan_before_act.off': 'Désactivé', "st.display.webmcp.label": "WebMCP expérimental", - "st.display.webmcp.desc": "Autorise WebBrain à découvrir et exécuter les outils structurés proposés par les pages Chrome compatibles. Son activation ajoute les outils WebMCP expérimentaux et leurs instructions au contexte du modèle. Désactivé par défaut.", + "st.display.webmcp.desc": "Autorise WebBrain à découvrir et exécuter les outils structurés proposés par les pages Chrome compatibles. Son activation ajoute les outils WebMCP expérimentaux et leurs instructions au contexte du modèle. Activé par défaut.", // --- Recording, attachments, queue, progress, and voice input --- "sp.record.full_screen_started_html": "L’enregistrement de l’écran/la fenêtre a démarré. Arrêtez-le avec Arrêter dans la bannière d’enregistrement, en appuyant deux fois sur Escape dans WebBrain ou dans une page du navigateur, ou avec le contrôle Arrêter le partage de Chrome. Ajoutez --hide-recording-indicator pour que la bannière n’apparaisse pas dans la vidéo.", "sp.record.full_screen_started_hidden_html": "L’enregistrement de l’écran/la fenêtre a démarré. Appuyez deux fois sur Escape dans WebBrain ou dans une page du navigateur pour l’arrêter, ou utilisez le contrôle Arrêter le partage de Chrome.", diff --git a/src/chrome/src/ui/locales/he.js b/src/chrome/src/ui/locales/he.js index 567c0c8d9..19e71e557 100644 --- a/src/chrome/src/ui/locales/he.js +++ b/src/chrome/src/ui/locales/he.js @@ -637,7 +637,7 @@ export default { 'st.display.openai_ask_streaming.label': "הזרמת תשובות במצב Ask", 'st.display.openai_ask_streaming.desc': "הצג טקסט בזמן הגעתו במצב Ask עבור ספקים נתמכים. זרמים שהופסקו מציגים הודעה ומנסים שוב פעם אחת ללא הזרמה; שגיאות של ספק/API עדיין מוצגות. קריאות לכלים ממתינות להשלמת הזרם; ריצות Act, Dev, מתוזמנות, ענן ו-Continue נותרות ללא הזרמה. מופעל כברירת מחדל.", "st.display.webmcp.label": "WebMCP ניסיוני", - "st.display.webmcp.desc": "אפשר ל-WebBrain לגלות ולהפעיל כלים מובנים שדפי Chrome נתמכים חושפים. הפעלה מוסיפה את כלי WebMCP הניסיוניים ואת ההנחיות שלהם להקשר של המודל. כבוי כברירת מחדל.", + "st.display.webmcp.desc": "אפשר ל-WebBrain לגלות ולהפעיל כלים מובנים שדפי Chrome נתמכים חושפים. הפעלה מוסיפה את כלי WebMCP הניסיוניים ואת ההנחיות שלהם להקשר של המודל. מופעל כברירת מחדל.", "st.display.plan_before_act.label": "תכנן לפני מעשה", 'st.display.plan_before_act.desc': "מצבי Act ו-Dev מבצעים תמיד בדיקת כוונה מובנית לפני הפעלת כלים. מצב ניסיון (ברירת המחדל) גם יוצר תוכניות מלאות, אך עשוי להשתמש שוב בתוכנית שאושרה לאחרונה לצורך המשך קצר; מצב קפדני יוצר תוכנית מלאה בכל תור. מצב ניסיון מנסה שוב פעם אחת, ואם הכוונה או התכנון עדיין אינם תקינים הוא ממשיך במצב Act עם אזהרה; מצב קפדני נעצר לפני הכלים.", "st.display.plan_before_act.try": "נסה לתכנן (ברירת מחדל)", diff --git a/src/chrome/src/ui/locales/hi.js b/src/chrome/src/ui/locales/hi.js index 1add7d0a6..e51e954c6 100644 --- a/src/chrome/src/ui/locales/hi.js +++ b/src/chrome/src/ui/locales/hi.js @@ -651,7 +651,7 @@ export default { 'st.display.api_mutation_observer.label': "एपीआई उत्परिवर्तन पर्यवेक्षक", 'st.display.api_mutation_observer.desc': "समान-टैब XHR/फ़ेच अनुरोध URL और विधियों का निरीक्षण करें ताकि WebBrain बार-बार होने वाली UI क्रियाओं का पता लगा सके और API शॉर्टकट पैटर्न सुझा सके। डिफ़ॉल्ट रूप से चालू।", 'st.display.webmcp.label': "प्रायोगिक वेबएमसीपी", - 'st.display.webmcp.desc': "WebBrain को समर्थित Chrome पृष्ठों द्वारा प्रदर्शित संरचित टूल को खोजने और चलाने की अनुमति दें। इसे सक्षम करने से मॉडल संदर्भ में प्रयोगात्मक WebMCP उपकरण और मार्गदर्शन जुड़ जाता है। डिफ़ॉल्ट रूप से बंद.", + 'st.display.webmcp.desc': "WebBrain को समर्थित Chrome पृष्ठों द्वारा प्रदर्शित संरचित टूल को खोजने और चलाने की अनुमति दें। इसे सक्षम करने से मॉडल संदर्भ में प्रयोगात्मक WebMCP उपकरण और मार्गदर्शन जुड़ जाता है। डिफ़ॉल्ट रूप से चालू.", 'st.display.openai_ask_streaming.label': "Ask मोड में उत्तर स्ट्रीम करें", 'st.display.openai_ask_streaming.desc': "समर्थित प्रदाताओं के लिए Ask मोड में आते ही टेक्स्ट दिखाएँ। बाधित स्ट्रीम एक सूचना दिखाती हैं और स्ट्रीमिंग के बिना एक बार फिर प्रयास करती हैं; प्रदाता/API त्रुटियाँ अभी भी दिखाई देती हैं। टूल कॉल स्ट्रीम पूरी होने की प्रतीक्षा करते हैं; Act, Dev, निर्धारित, क्लाउड और Continue रन बिना स्ट्रीमिंग के रहते हैं। डिफ़ॉल्ट रूप से चालू।", 'st.display.plan_before_act.label': "अधिनियम से पहले योजना बनाएं", diff --git a/src/chrome/src/ui/locales/id.js b/src/chrome/src/ui/locales/id.js index c9ff08e87..d0c0d754e 100644 --- a/src/chrome/src/ui/locales/id.js +++ b/src/chrome/src/ui/locales/id.js @@ -837,7 +837,7 @@ export default { 'st.display.plan_before_act.strict': 'Perencanaan ketat', 'st.display.plan_before_act.off': 'Nonaktif', "st.display.webmcp.label": "WebMCP eksperimental", - "st.display.webmcp.desc": "Izinkan WebBrain menemukan dan menjalankan alat terstruktur yang disediakan oleh halaman Chrome yang didukung. Mengaktifkannya menambahkan alat WebMCP eksperimental dan panduannya ke konteks model. Dinonaktifkan secara bawaan.", + "st.display.webmcp.desc": "Izinkan WebBrain menemukan dan menjalankan alat terstruktur yang disediakan oleh halaman Chrome yang didukung. Mengaktifkannya menambahkan alat WebMCP eksperimental dan panduannya ke konteks model. Diaktifkan secara bawaan.", // --- Recording, attachments, queue, progress, and voice input --- "sp.record.full_screen_started_html": "Perekaman layar/jendela dimulai. Hentikan dengan Hentikan di banner perekaman, dengan menekan Escape dua kali di WebBrain atau halaman browser, atau dengan kontrol Berhenti berbagi milik Chrome. Tambahkan --hide-recording-indicator agar banner tidak ikut terekam.", "sp.record.full_screen_started_hidden_html": "Perekaman layar/jendela dimulai. Tekan Escape dua kali di WebBrain atau halaman browser untuk berhenti, atau gunakan kontrol Berhenti berbagi milik Chrome.", diff --git a/src/chrome/src/ui/locales/ja.js b/src/chrome/src/ui/locales/ja.js index 0c39f25f7..ec91ad59e 100644 --- a/src/chrome/src/ui/locales/ja.js +++ b/src/chrome/src/ui/locales/ja.js @@ -837,7 +837,7 @@ export default { 'st.display.plan_before_act.strict': '厳格な計画', 'st.display.plan_before_act.off': 'オフ', "st.display.webmcp.label": "試験的な WebMCP", - "st.display.webmcp.desc": "対応する Chrome ページが公開する構造化ツールを WebBrain が検出して実行できるようにします。有効にすると、試験的な WebMCP ツールとガイダンスがモデルのコンテキストに追加されます。既定ではオフです。", + "st.display.webmcp.desc": "対応する Chrome ページが公開する構造化ツールを WebBrain が検出して実行できるようにします。有効にすると、試験的な WebMCP ツールとガイダンスがモデルのコンテキストに追加されます。既定ではオンです。", // --- Recording, attachments, queue, progress, and voice input --- "sp.record.full_screen_started_html": "画面/ウィンドウの録画を開始しました。録画バナーの停止ボタン、WebBrain またはブラウザページで Escape を 2 回押す操作、または Chrome の共有停止コントロールで停止できます。バナーを録画に含めたくない場合は --hide-recording-indicator を追加してください。", "sp.record.full_screen_started_hidden_html": "画面/ウィンドウの録画を開始しました。停止するには、WebBrain またはブラウザページで Escape を 2 回押すか、Chrome の共有停止コントロールを使用してください。", diff --git a/src/chrome/src/ui/locales/ko.js b/src/chrome/src/ui/locales/ko.js index 34b1596a6..e779ed039 100644 --- a/src/chrome/src/ui/locales/ko.js +++ b/src/chrome/src/ui/locales/ko.js @@ -837,7 +837,7 @@ export default { 'st.display.plan_before_act.strict': '엄격한 계획', 'st.display.plan_before_act.off': '끄기', "st.display.webmcp.label": "실험적 WebMCP", - "st.display.webmcp.desc": "지원되는 Chrome 페이지가 제공하는 구조화된 도구를 WebBrain이 검색하고 실행하도록 허용합니다. 활성화하면 실험적 WebMCP 도구와 안내가 모델 컨텍스트에 추가됩니다. 기본값은 꺼짐입니다.", + "st.display.webmcp.desc": "지원되는 Chrome 페이지가 제공하는 구조화된 도구를 WebBrain이 검색하고 실행하도록 허용합니다. 활성화하면 실험적 WebMCP 도구와 안내가 모델 컨텍스트에 추가됩니다. 기본값은 켜짐입니다.", // --- Recording, attachments, queue, progress, and voice input --- "sp.record.full_screen_started_html": "화면/창 녹화가 시작되었습니다. 녹화 배너의 중지 버튼, WebBrain 또는 브라우저 페이지에서 Escape를 두 번 누르기, 또는 Chrome의 공유 중지 컨트롤로 중지할 수 있습니다. 배너가 녹화에 나오지 않게 하려면 --hide-recording-indicator를 추가하세요.", "sp.record.full_screen_started_hidden_html": "화면/창 녹화가 시작되었습니다. 중지하려면 WebBrain 또는 브라우저 페이지에서 Escape를 두 번 누르거나 Chrome의 공유 중지 컨트롤을 사용하세요.", diff --git a/src/chrome/src/ui/locales/ms.js b/src/chrome/src/ui/locales/ms.js index fce0711ad..5c9e6da1e 100644 --- a/src/chrome/src/ui/locales/ms.js +++ b/src/chrome/src/ui/locales/ms.js @@ -837,7 +837,7 @@ export default { 'st.display.plan_before_act.strict': 'Perancangan ketat', 'st.display.plan_before_act.off': 'Mati', "st.display.webmcp.label": "WebMCP eksperimental", - "st.display.webmcp.desc": "Benarkan WebBrain menemui dan menjalankan alat berstruktur yang disediakan oleh halaman Chrome yang disokong. Mengaktifkannya menambah alat WebMCP eksperimental dan panduannya pada konteks model. Dimatikan secara lalai.", + "st.display.webmcp.desc": "Benarkan WebBrain menemui dan menjalankan alat berstruktur yang disediakan oleh halaman Chrome yang disokong. Mengaktifkannya menambah alat WebMCP eksperimental dan panduannya pada konteks model. Dihidupkan secara lalai.", // --- Recording, attachments, queue, progress, and voice input --- "sp.record.full_screen_started_html": "Rakaman skrin/tetingkap telah bermula. Hentikannya dengan Henti pada sepanduk rakaman, dengan menekan Escape dua kali dalam WebBrain atau halaman pelayar, atau dengan kawalan Berhenti berkongsi Chrome. Tambah --hide-recording-indicator supaya sepanduk tidak masuk ke dalam rakaman.", "sp.record.full_screen_started_hidden_html": "Rakaman skrin/tetingkap telah bermula. Tekan Escape dua kali dalam WebBrain atau halaman pelayar untuk berhenti, atau gunakan kawalan Berhenti berkongsi Chrome.", diff --git a/src/chrome/src/ui/locales/nl.js b/src/chrome/src/ui/locales/nl.js index e0c11bfa3..d79d629bf 100644 --- a/src/chrome/src/ui/locales/nl.js +++ b/src/chrome/src/ui/locales/nl.js @@ -628,7 +628,7 @@ export default { 'st.display.api_mutation_observer.label': 'API-wijzigingsobserver', 'st.display.api_mutation_observer.desc': 'Observeer XHR/fetch-verzoek-URL\'s en -methoden op hetzelfde tabblad, zodat WebBrain herhaalde UI-acties kan herkennen en API-snelkoppelingen kan voorstellen. Standaard aan.', 'st.display.webmcp.label': 'Experimenteel WebMCP', - 'st.display.webmcp.desc': 'Sta WebBrain toe om gestructureerde tools te ontdekken en uit te voeren die worden aangeboden door ondersteunde Chrome-pagina\'s...', + 'st.display.webmcp.desc': 'Sta WebBrain toe om gestructureerde tools te ontdekken en uit te voeren die worden aangeboden door ondersteunde Chrome-pagina\'s. Door dit in te schakelen worden experimentele WebMCP-tools en -richtlijnen aan de modelcontext toegevoegd. Standaard ingeschakeld.', 'st.display.openai_ask_streaming.label': 'Ask-antwoorden streamen', 'st.display.openai_ask_streaming.desc': 'Toon tekst van ondersteunde providers zodra deze binnenkomt in Ask-modus. Onderbroken streams tonen een melding en worden eenmaal opnieuw geprobeerd zonder streaming. Toolaanroepen wachten op het einde van de stream; Act-, Dev-, geplande, cloud- en Continue-runs blijven niet-streamend. Standaard ingeschakeld.', 'st.display.plan_before_act.label': 'Plannen voor Handelen', diff --git a/src/chrome/src/ui/locales/pl.js b/src/chrome/src/ui/locales/pl.js index 4cd6460ec..91c14e54e 100644 --- a/src/chrome/src/ui/locales/pl.js +++ b/src/chrome/src/ui/locales/pl.js @@ -829,7 +829,7 @@ export default { 'st.display.plan_before_act.strict': 'Ścisłe planowanie', 'st.display.plan_before_act.off': 'Wyłączone', "st.display.webmcp.label": "Eksperymentalny WebMCP", - "st.display.webmcp.desc": "Pozwala WebBrain wykrywać i uruchamiać ustrukturyzowane narzędzia udostępniane przez obsługiwane strony Chrome. Włączenie dodaje eksperymentalne narzędzia WebMCP i wskazówki do kontekstu modelu. Domyślnie wyłączone.", + "st.display.webmcp.desc": "Pozwala WebBrain wykrywać i uruchamiać ustrukturyzowane narzędzia udostępniane przez obsługiwane strony Chrome. Włączenie dodaje eksperymentalne narzędzia WebMCP i wskazówki do kontekstu modelu. Domyślnie włączone.", // --- Recording, attachments, queue, progress, and voice input --- "sp.record.full_screen_started_html": "Rozpoczęto nagrywanie ekranu/okna. Zatrzymaj je przyciskiem Zatrzymaj na banerze nagrywania, naciskając dwa razy Escape w WebBrain lub na stronie przeglądarki, albo kontrolką Chrome Zatrzymaj udostępnianie. Dodaj --hide-recording-indicator, aby baner nie pojawił się w nagraniu.", "sp.record.full_screen_started_hidden_html": "Rozpoczęto nagrywanie ekranu/okna. Naciśnij dwa razy Escape w WebBrain lub na stronie przeglądarki, aby zatrzymać, albo użyj kontrolki Chrome Zatrzymaj udostępnianie.", diff --git a/src/chrome/src/ui/locales/pt.js b/src/chrome/src/ui/locales/pt.js index 2a263cb27..b8c078b1f 100644 --- a/src/chrome/src/ui/locales/pt.js +++ b/src/chrome/src/ui/locales/pt.js @@ -651,7 +651,7 @@ export default { 'st.display.api_mutation_observer.label': "Observador de mutação de API", 'st.display.api_mutation_observer.desc': "Observe URLs e métodos de solicitação de busca/XHR na mesma guia para que WebBrain possa detectar ações repetidas da interface do usuário e sugerir padrões de atalho de API. Ativado por padrão.", 'st.display.webmcp.label': "WebMCP Experimental", - 'st.display.webmcp.desc': "Permitir que WebBrain descubra e execute ferramentas estruturadas expostas pelas páginas Chrome suportadas. Habilitar isso adiciona ferramentas experimentais do WebMCP e orientação ao contexto do modelo. Desativado por padrão.", + 'st.display.webmcp.desc': "Permitir que WebBrain descubra e execute ferramentas estruturadas expostas pelas páginas Chrome suportadas. Habilitar isso adiciona ferramentas experimentais do WebMCP e orientação ao contexto do modelo. Ativado por padrão.", 'st.display.openai_ask_streaming.label': "Transmitir respostas no modo Ask", 'st.display.openai_ask_streaming.desc': "Mostre as respostas do provedor assim que chegarem no modo Ask. As chamadas de ferramenta aguardam um evento final do fluxo; execu??es Act, Dev, agendadas, na nuvem e Continue permanecem sem streaming. Ativado por padr?o.", 'st.display.plan_before_act.label': "Planeje antes de agir", diff --git a/src/chrome/src/ui/locales/ru.js b/src/chrome/src/ui/locales/ru.js index 59b3f3ca5..fc21b576c 100644 --- a/src/chrome/src/ui/locales/ru.js +++ b/src/chrome/src/ui/locales/ru.js @@ -837,7 +837,7 @@ export default { 'st.display.plan_before_act.strict': 'Строгое планирование', 'st.display.plan_before_act.off': 'Выключено', "st.display.webmcp.label": "Экспериментальный WebMCP", - "st.display.webmcp.desc": "Разрешает WebBrain обнаруживать и запускать структурированные инструменты, предоставляемые поддерживаемыми страницами Chrome. При включении экспериментальные инструменты WebMCP и инструкции к ним добавляются в контекст модели. По умолчанию выключено.", + "st.display.webmcp.desc": "Разрешает WebBrain обнаруживать и запускать структурированные инструменты, предоставляемые поддерживаемыми страницами Chrome. При включении экспериментальные инструменты WebMCP и инструкции к ним добавляются в контекст модели. По умолчанию включено.", // --- Recording, attachments, queue, progress, and voice input --- "sp.record.full_screen_started_html": "Запись экрана/окна началась. Остановите её кнопкой Стоп на баннере записи, дважды нажав Escape в WebBrain или на странице браузера, либо кнопкой Chrome «Остановить показ». Добавьте --hide-recording-indicator, чтобы баннер не попал в видео.", "sp.record.full_screen_started_hidden_html": "Запись экрана/окна началась. Чтобы остановить её, дважды нажмите Escape в WebBrain или на странице браузера либо используйте кнопку Chrome «Остановить показ».", diff --git a/src/chrome/src/ui/locales/th.js b/src/chrome/src/ui/locales/th.js index 3d6d2a371..87cb25715 100644 --- a/src/chrome/src/ui/locales/th.js +++ b/src/chrome/src/ui/locales/th.js @@ -837,7 +837,7 @@ export default { 'st.display.plan_before_act.strict': 'การวางแผนที่เข้มงวด', 'st.display.plan_before_act.off': 'ปิด', "st.display.webmcp.label": "WebMCP รุ่นทดลอง", - "st.display.webmcp.desc": "อนุญาตให้ WebBrain ค้นหาและเรียกใช้เครื่องมือแบบมีโครงสร้างที่หน้า Chrome ที่รองรับเปิดให้ใช้ การเปิดใช้งานจะเพิ่มเครื่องมือ WebMCP รุ่นทดลองและคำแนะนำลงในบริบทของโมเดล ปิดไว้เป็นค่าเริ่มต้น", + "st.display.webmcp.desc": "อนุญาตให้ WebBrain ค้นหาและเรียกใช้เครื่องมือแบบมีโครงสร้างที่หน้า Chrome ที่รองรับเปิดให้ใช้ การเปิดใช้งานจะเพิ่มเครื่องมือ WebMCP รุ่นทดลองและคำแนะนำลงในบริบทของโมเดล เปิดไว้เป็นค่าเริ่มต้น", // --- Recording, attachments, queue, progress, and voice input --- "sp.record.full_screen_started_html": "เริ่มบันทึกหน้าจอ/หน้าต่างแล้ว หยุดได้ด้วยปุ่ม หยุด บนแบนเนอร์การบันทึก กด Escape สองครั้งใน WebBrain หรือหน้าเบราว์เซอร์ หรือใช้ปุ่มหยุดแชร์ของ Chrome เพิ่ม --hide-recording-indicator เพื่อไม่ให้แบนเนอร์ติดอยู่ในวิดีโอ", "sp.record.full_screen_started_hidden_html": "เริ่มบันทึกหน้าจอ/หน้าต่างแล้ว กด Escape สองครั้งใน WebBrain หรือหน้าเบราว์เซอร์เพื่อหยุด หรือใช้ปุ่มหยุดแชร์ของ Chrome", diff --git a/src/chrome/src/ui/locales/tl.js b/src/chrome/src/ui/locales/tl.js index 6f9e3ced8..df9c2b767 100644 --- a/src/chrome/src/ui/locales/tl.js +++ b/src/chrome/src/ui/locales/tl.js @@ -837,7 +837,7 @@ export default { 'st.display.plan_before_act.strict': 'Mahigpit na pagpaplano', 'st.display.plan_before_act.off': 'Naka-off', "st.display.webmcp.label": "Eksperimental na WebMCP", - "st.display.webmcp.desc": "Payagan ang WebBrain na tumuklas at magpatakbo ng mga structured tool na inilalantad ng mga suportadong Chrome page. Kapag in-enable, idinaragdag ang mga eksperimental na WebMCP tool at gabay sa context ng model. Naka-off bilang default.", + "st.display.webmcp.desc": "Payagan ang WebBrain na tumuklas at magpatakbo ng mga structured tool na inilalantad ng mga suportadong Chrome page. Kapag in-enable, idinaragdag ang mga eksperimental na WebMCP tool at gabay sa context ng model. Naka-on bilang default.", // --- Recording, attachments, queue, progress, and voice input --- "sp.record.full_screen_started_html": "Nagsimula na ang pag-record ng screen/window. Itigil ito gamit ang Itigil sa recording banner, sa pagpindot ng Escape nang dalawang beses sa WebBrain o sa pahina ng browser, o gamit ang Stop sharing control ng Chrome. Idagdag ang --hide-recording-indicator para hindi lumabas ang banner sa video.", "sp.record.full_screen_started_hidden_html": "Nagsimula na ang pag-record ng screen/window. Pindutin ang Escape nang dalawang beses sa WebBrain o sa pahina ng browser para huminto, o gamitin ang Stop sharing control ng Chrome.", diff --git a/src/chrome/src/ui/locales/tr.js b/src/chrome/src/ui/locales/tr.js index df5ecc570..e16320bb4 100644 --- a/src/chrome/src/ui/locales/tr.js +++ b/src/chrome/src/ui/locales/tr.js @@ -842,7 +842,7 @@ export default { 'st.display.plan_before_act.strict': 'Katı planlama', 'st.display.plan_before_act.off': 'Kapalı', "st.display.webmcp.label": "Deneysel WebMCP", - "st.display.webmcp.desc": "WebBrain'in desteklenen Chrome sayfalarının sunduğu yapılandırılmış araçları keşfetmesine ve çalıştırmasına izin ver. Etkinleştirildiğinde deneysel WebMCP araçları ve yönlendirmesi model bağlamına eklenir. Varsayılan olarak kapalıdır.", + "st.display.webmcp.desc": "WebBrain'in desteklenen Chrome sayfalarının sunduğu yapılandırılmış araçları keşfetmesine ve çalıştırmasına izin ver. Etkinleştirildiğinde deneysel WebMCP araçları ve yönlendirmesi model bağlamına eklenir. Varsayılan olarak açıktır.", // --- Recording, attachments, queue, progress, and voice input --- "sp.record.full_screen_started_html": "Ekran/pencere kaydı başladı. Kayıt afişindeki Durdur düğmesiyle, WebBrain’de veya bir tarayıcı sayfasında Escape tuşuna iki kez basarak ya da Chrome’un Paylaşımı durdur denetimiyle durdurabilirsiniz. Afişin videoya girmemesi için --hide-recording-indicator ekleyin.", "sp.record.full_screen_started_hidden_html": "Ekran/pencere kaydı başladı. Durdurmak için WebBrain’de veya bir tarayıcı sayfasında Escape tuşuna iki kez basın ya da Chrome’un Paylaşımı durdur denetimini kullanın.", diff --git a/src/chrome/src/ui/locales/uk.js b/src/chrome/src/ui/locales/uk.js index c0304feed..1e84c34a3 100644 --- a/src/chrome/src/ui/locales/uk.js +++ b/src/chrome/src/ui/locales/uk.js @@ -837,7 +837,7 @@ export default { 'st.display.plan_before_act.strict': 'Суворе планування', 'st.display.plan_before_act.off': 'Вимкнено', "st.display.webmcp.label": "Експериментальний WebMCP", - "st.display.webmcp.desc": "Дозволяє WebBrain виявляти й запускати структуровані інструменти, які надають підтримувані сторінки Chrome. Увімкнення додає експериментальні інструменти WebMCP та підказки до контексту моделі. Типово вимкнено.", + "st.display.webmcp.desc": "Дозволяє WebBrain виявляти й запускати структуровані інструменти, які надають підтримувані сторінки Chrome. Увімкнення додає експериментальні інструменти WebMCP та підказки до контексту моделі. Типово увімкнено.", // --- Recording, attachments, queue, progress, and voice input --- "sp.record.full_screen_started_html": "Запис екрана/вікна розпочато. Зупиніть його кнопкою Зупинити на банері запису, двічі натиснувши Escape у WebBrain або на сторінці браузера, або кнопкою Chrome «Припинити спільний доступ». Додайте --hide-recording-indicator, щоб банер не потрапив у відео.", "sp.record.full_screen_started_hidden_html": "Запис екрана/вікна розпочато. Щоб зупинити, двічі натисніть Escape у WebBrain або на сторінці браузера, або скористайтеся кнопкою Chrome «Припинити спільний доступ».", diff --git a/src/chrome/src/ui/locales/vi.js b/src/chrome/src/ui/locales/vi.js index 616367a71..c04b9885f 100644 --- a/src/chrome/src/ui/locales/vi.js +++ b/src/chrome/src/ui/locales/vi.js @@ -651,7 +651,7 @@ export default { 'st.display.api_mutation_observer.label': "Người quan sát đột biến API", 'st.display.api_mutation_observer.desc': "Quan sát các URL và phương thức yêu cầu XHR/tìm nạp cùng một tab để WebBrain có thể phát hiện các hành động giao diện người dùng lặp lại và đề xuất các mẫu phím tắt API. Bật theo mặc định.", 'st.display.webmcp.label': "WebMCP thử nghiệm", - 'st.display.webmcp.desc': "Cho phép WebBrain khám phá và chạy các công cụ có cấu trúc được hiển thị bởi các trang Chrome được hỗ trợ. Việc kích hoạt tính năng này sẽ bổ sung thêm các công cụ và hướng dẫn WebMCP thử nghiệm vào bối cảnh mô hình. Tắt theo mặc định.", + 'st.display.webmcp.desc': "Cho phép WebBrain khám phá và chạy các công cụ có cấu trúc được hiển thị bởi các trang Chrome được hỗ trợ. Việc kích hoạt tính năng này sẽ bổ sung thêm các công cụ và hướng dẫn WebMCP thử nghiệm vào bối cảnh mô hình. Bật theo mặc định.", 'st.display.openai_ask_streaming.label': "Truy?n tr?c tuy?n c?u tr? l?i ? ch? ?? Ask", 'st.display.openai_ask_streaming.desc': "Hi?n th? c?u tr? l?i c?a nh? cung c?p ngay khi nh?n ???c trong ch? ?? Ask. L?nh g?i c?ng c? ch? s? ki?n k?t th?c lu?ng; c?c l?n ch?y Act, Dev, theo l?ch, ??m m?y v? Continue v?n kh?ng ph?t tr?c tuy?n. B?t theo m?c ??nh.", 'st.display.plan_before_act.label': "Lập kế hoạch trước khi hành động", diff --git a/src/chrome/src/ui/locales/zh.js b/src/chrome/src/ui/locales/zh.js index ee50cec3f..bac0e4df9 100644 --- a/src/chrome/src/ui/locales/zh.js +++ b/src/chrome/src/ui/locales/zh.js @@ -837,7 +837,7 @@ export default { 'st.display.plan_before_act.strict': '严格规划', 'st.display.plan_before_act.off': '关闭', "st.display.webmcp.label": "实验性 WebMCP", - "st.display.webmcp.desc": "允许 WebBrain 发现并运行受支持的 Chrome 页面公开的结构化工具。启用后,实验性 WebMCP 工具及其指引会加入模型上下文。默认关闭。", + "st.display.webmcp.desc": "允许 WebBrain 发现并运行受支持的 Chrome 页面公开的结构化工具。启用后,实验性 WebMCP 工具及其指引会加入模型上下文。默认开启。", // --- Recording, attachments, queue, progress, and voice input --- "sp.record.full_screen_started_html": "屏幕/窗口录制已开始。可点击录制横幅上的停止按钮、在 WebBrain 或浏览器页面中按两次 Escape,或使用 Chrome 的停止共享控件来停止。添加 --hide-recording-indicator 可让横幅不出现在录制内容中。", "sp.record.full_screen_started_hidden_html": "屏幕/窗口录制已开始。要停止,请在 WebBrain 或浏览器页面中按两次 Escape,或使用 Chrome 的停止共享控件。", diff --git a/test/run.js b/test/run.js index 0b443fc79..accfc87f4 100644 --- a/test/run.js +++ b/test/run.js @@ -62003,8 +62003,13 @@ test('Experimental WebMCP is Chrome-only, on by default, and present in default assert.match(settings, /webMcpToggle\.checked = stored\.webMcpEnabled !== false/, 'setting should default on unless explicitly disabled'); assert.match(settings, /webMcpEnabled:\s*webMcpToggle\.checked/, 'setting should persist changes'); assert.match(background, /agent\.setWebMCPEnabled\(stored\.webMcpEnabled !== false\)/, 'background should hydrate the default-on gate'); + assert.match(background, /loadWebMCPEnabled\(\)\.catch\(\(\) => \{\s*agent\.setWebMCPEnabled\(false\);/m, 'failed WebMCP preference hydration must fail closed'); assert.match(background, /changes\.webMcpEnabled[\s\S]*agent\.setWebMCPEnabled\(changes\.webMcpEnabled\.newValue !== false\)/, 'storage changes should update the live gate'); assert.match(locale, /'st\.display\.webmcp\.label': 'Experimental WebMCP'/, 'English setting label missing'); + for (const filename of fs.readdirSync(path.join(ROOT, 'src/chrome/src/ui/locales')).filter((name) => name.endsWith('.js'))) { + const localized = fs.readFileSync(path.join(ROOT, 'src/chrome/src/ui/locales', filename), 'utf8'); + assert.doesNotMatch(localized, /["']st\.display\.webmcp\.desc["'][^\n]*(?:off|disabled|关闭|kapalı|вимк|wyłącz|خاموش|tắt|Desactivado|Désactivé|Desativado|выключ|꺼짐|オフ)/i, `${filename}: WebMCP disclosure must reflect the default-on setting`); + } assert.equal(ConfigTransferCh.DEFAULT_CONFIG_SETTINGS.webMcpEnabled, true, 'Chrome config export should preserve the default-on value'); assert.equal(ConfigTransferFx.DEFAULT_CONFIG_SETTINGS.webMcpEnabled, true, 'Firefox config schema should preserve cross-browser config compatibility'); @@ -62013,7 +62018,8 @@ test('Experimental WebMCP is Chrome-only, on by default, and present in default cdpClientCh.disableAllWebMCP = async () => { cleanupCalls++; return 0; }; try { const agent = new AgentCh({}); - assert.equal(agent.webMcpEnabled, true); + assert.equal(agent.webMcpEnabled, false, 'WebMCP should remain disabled until preference hydration succeeds'); + agent.setWebMCPEnabled(true); assert.match(agent._buildSystemPrompt('ask'), /WEBMCP \(experimental/i, 'default Ask prompt should explain WebMCP'); assert.equal(getToolsForModeCh('ask', { webMcpAvailable: agent.webMcpEnabled }).some(tool => tool.function.name === 'list_webmcp_tools'), true); From a956a4ddac71bf7d5e7930fa9a64837dfbcb5770 Mon Sep 17 00:00:00 2001 From: Emre Sokullu Date: Wed, 23 Sep 2026 00:36:38 +0300 Subject: [PATCH 3/4] Clarify French WebMCP opt-out disclosure --- docs/fr/agent-tools.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/fr/agent-tools.md b/docs/fr/agent-tools.md index 9f56a272a..29c168d82 100644 --- a/docs/fr/agent-tools.md +++ b/docs/fr/agent-tools.md @@ -124,8 +124,8 @@ même lorsque la compétence propriétaire est chargée. Voir **WebMCP (expérimental, activé par défaut).** Les lignes `list_webmcp_tools` / `execute_webmcp_tool` ne s'appliquent que lorsque **WebMCP expérimental** est activé dans Paramètres → Général → Avancé. Le réglage est activé par défaut ; -tant qu'il l'est, les outils et leurs consignes de prompt sont omis des requêtes -au modèle. Les annotations WebMCP telles que `readOnly` sont des indications +lorsqu'il est désactivé, les outils et leurs consignes de prompt sont omis des +requêtes au modèle. Les annotations WebMCP telles que `readOnly` sont des indications écrites par la page, pas une frontière de sécurité. Chaque invocation exige Act ou Dev, une confirmation fraîche à chaque appel, et la permission normale capacité × origine de la frame d'enregistrement. WebMCP nécessite actuellement From e8fc994c92d949a1b6d1eaec300080fca82ffe23 Mon Sep 17 00:00:00 2001 From: Emre Sokullu Date: Wed, 23 Sep 2026 00:45:22 +0300 Subject: [PATCH 4/4] Wait for WebMCP preference before scheduled runs --- src/chrome/src/background.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/chrome/src/background.js b/src/chrome/src/background.js index 9a6626e8c..9237c4d4d 100644 --- a/src/chrome/src/background.js +++ b/src/chrome/src/background.js @@ -263,6 +263,7 @@ const scheduler = new ScheduledJobManager({ await customSkillsReady; await alwaysAllowApiMutationsReady; await strictSecretModeReady; + await webMcpEnabledReady; if (providerManager.providers.size === 0) await providerManager.load(); }, sendUpdate: (tabId, type, data) => {