Галоўная / Артыкулы

WebMCP на практыцы: дошка задач як інструменты для AI-агентаў

WebMCP на практыцы: дошка задач ператвараецца ў інструменты для AI-агентаў — дэкларатыўныя і праграмныя інструменты, зменлівы спіс інструментаў, мост да MCP і адмова.

Выдавец: REACTAPP.TOP14 хв чытання3318 слоў

Крыніцы: WebMCP: When Websites Become AI Tools

Агенты, які здагадваюцца пра ваш веб-сайт

Сэродзішнія AI-агенты, які працуюць з веб-сайтамі, пераважна проста ўздагадванні. Яны беруць скрыншот і шукаюць ўсё, што нагадвае кнопку, або аналізуюць DOM і спадзяюцца, што назвы класаў маюць тое значэнне, якое выглядае. Пасля кліку яны пераканальваюцца, чы не змяніўся сайт так, як гэта могла бы суцэльнаць з успехам. Цэе вражаючы трук, але ён стоіць на слабкай базе, адколі сам сайт ніколі нічога не паведамляе агенту, і кожны вывар выводзіцца на адгукі.

WebMCP — гэта прыказ Chrome для падрыхтавання канцэ на такія здагадванні. Старонка анунцюе свае можлівасці, агент чытае гэты анунс і вызывае функцыю з структураванымі аргументамі, замест таго, каб націлявацца на прасторак на экране. Змяна выглядае незначной, але яна перамешчае інтэлект: замест таго, каб перабудаваць мету прыемлівання з пікселіў і маркапа, агент отрымае гэту мету безпасова ад самай прыемлівання.

Ёнколі трэба было пераканацца, чы гэта працуе ў практыцы, была створана маленькая панель задач, і да яе быў прыкрэплены рэальны агент. Найболей павучальны рэзультат пасягнуўся тады, калі агент катэгорычна адмовіўся ад запіту.

Тры ролі

У кожны момент эксперыменту берае удзел адні з трох учаснікаў.

  • Староніца выступае як прадаўцы. Яна рэўіструе інструменты. Кожны інструмент супакоюе імя з апісаннем, спрамованым да модэлю, JSON Schema, які апісвае аргументы, і функцыяю, якая выканае работу.
  • Браузер выступае як рэўістар. Для кожнага вікна ён зберагае спіс інструментоў, дзе толькі можна, вырахоўвае схемы з вашага HTML і вяршыць, калі інструмент павінен з’явіцца чы знікнуць.
  • Агент — гэта спэрыбнік. Ён запытае браузер пра тое, што ў наявнасці, за дапамою getTools(), і запуска выбраны інструмент за дапамою executeTool(). DOM не ў яго досяжнасці, і ён не мае можлівасці стварыць функцыі, якія сторана ніколі не публікавала.
  • Гэты последні пункт — сэрцо ідэі. Дакументацыя Chrome дастаткова чыста апісвае API, але чытанне пояснення — гэта не тое ж сама, што розумеўце, таму найшырэйшы шлях — стварыць максымальна маленькую версію.

    Дэманстрацыя: панель задач у трох файлах

    Плата складаецца з index.html, app.js і style.css. Не трэба нічога ствараць чы распісваць. Люды можаць дадаць задачы, пазначыць іх як выконаныя і фільтруваць спіс — гэта тып праекта, які можа буць завершаны за адзін полудзень. Новым ў гэтым ёсць тое, што сторанка таксама прадстаўляецца агенту ШЫ як сукупнасьць інструментаў, якія можна вызваць, праз аб’ект, які падае браузер.

    const mc = document.modelContext;   // undefined if WebMCP is off
    

    Эта адначная лінія ўсё ў сабе являе сабою точку входу. Калі об’ект існуе, стораніца можа зарэгістраваць інструменты. Калі яго няма, стораніца ўособлівае ся толькі як панель задач, і самэ так і яе і трэба было б выкорыстоўваць у разы каштальтавання.

    Ёнколі бачыць оба элемента, стораніца-дэманстрацыя размішчае іх па бокі. Злева знаходзіцца панель, тое ўсё, што забезпечвае функцыянаванне. З правага — панель «Прыдуманы агент», якая выступае ў ролі спожывача і выкананае запыты getTools() і executeTool() так, як бы гэта зрабіў рэальны агент, чым усунуліся будзь-якія дадатковыя налаштаванні. Што такая панель, вы пабачыце на кожным з ніжэйшых скрыншотаў.

    WebMCP досягнуў статусу «Прапанована» у Chrome Platform Status і за замовчаннем ня ўвімкнуты нідзе, таму спачатку патрэбна ўстановка спецыяльнага флага.

    Ачыніце chrome://flags/#enable-webmcp-testing, выберыце значэнне «Enabled» і пачніце працу зноў. Без гэтага document.modelContext не ўзначаны. Chrome таксама прысвячае прыгляд WebMCP origin, які стаў доступны з версіі Chrome 149. Шырокі флаг падходзіць для локальных эксперыментаў, тады як прыгляд origin — гэта спосаб, які Chrome выкарыстоўвае для болей шырокіх тэстаў.

    Спачатку завершаны цыкл

    Легча зрозумець API пасля таго, як побачыце, калі ён даў рэзультат. Claude Code быў падключаны да плакату, і яму была дана адна запаведзь, якая прасіла яго дадаць чатыры заведамы: знаходзіць інфармацыю і выканаць даследжэння, пісаць планы блога, стварыць цэлы блог з прыкладамі і опублікаваць яго. З’явіліся чатыры заведамы. Другая запаведзь прасіла яго пазначыць заведамы 3, 4 і 5 як завершаныя, і гэта таксама спрацавало.

    Воблак не зробілі скрыншот дошкі розпакетавання ні не чытаў яе HTML. Ён запытаў браузер пра доступныя інструменты, знайшоў add-task і вызваў яго чатыры разы з структураванымі аргументамі. Гэта той самы момент, паказаны заўтрыч у самам браузеры.

    Чатыры новыя задачы цяпер знаходзяцца пад номерамі #3 да #6 на дошцы, а панель DevTools (Application, потым WebMCP) паказвае всі шысць інструментаў, якія наразе відображае стораніца. Адны з іх, clear-completed, не быў тамы нават за хвіліну раней, і прычына гэтага скора стане зрозумелая. Тры завершэння задач фіксуюцца па кожнам вызове.

    Кожны выклік паказваецца з своімі аргументамі ({"id":3}, {"id":4} і {"id":5}), а у радку падсумку паказваецца, што ўсьго ўсьмо выклікаў, без якіх-леба абэрэнцый, анулюванняў чы выклікаў, якія яшчэ працуюць. Дэбаггін WebMCP тут ведаецца найшырэй, таму што панель паказвае точна тое, што агент апрацаваў.

    Такім чынам, рэчы, напісаныя ў тэрмінале, сталі чатырма структураванымі выклікамі функцый у вікні браузера. Наступны вопыт — што саме павінна была зрабіць сторанка, каб гэта досягнуць.

    Два спосабы публікаціі інструмента

    У першым спосабе зовсім не трэба JavaScript. Існуючы форма атрыбуецца чатырма дадатковымі атрыбутамі.

    <form id="add-form"
          toolname="add-task"
          tooldescription="Add a new task to the user's task board."
          toolautosubmit>
      <input name="title" required maxlength="80"
             toolparamdescription="Short description of the task to add.">
      <select name="priority"
              toolparamdescription="How urgent the task is.">
        <option value="low">low</option>
        <option value="normal" selected>normal</option>
        <option value="high">high</option>
      </select>
      <button type="submit">Add</button>
    </form>
    

    Этая форма — гэта інструмент add-task, які чат-бот Claude выкорыстаў чатыры разы. Назвы поль, атрыбуты required і опцыі <select> чытаюцца браузерам, які сам стварае JSON Schema. Агент бачыць аднае обавязковае строчнае значэнне і энумератыўны спіс з трох значэнняў, прычаму ніхто не запісваў сам шыму. У вялікім застосоўцы гэта, верагодна, найпростыя эксперымент з WebMCP, адтолькі ўжо наявная HTML-форма дае пачатковую перадачу. Усё, што дадаецца, — цэха апісання таго, што форма значыць для агента.

    Ёсць адна дэталі, якую трэба час адчуць: той самы апрацоўшчык submit працюе як для чалавека, які натыкаецца на кнопку «Дадаць», так і для агента, які выклікае інструмент, прычаму ў зместы выкананняя падзеі зазначаецца, які з ніх гэта быў.

    $('#add-form').addEventListener('submit', (e) => {
      e.preventDefault();
      const task = addTask(new FormData(e.target).get('title'), /* ... */);
    
      if (!e.agentInvoked) {
        e.target.reset();          // human — clear the box
      } else {
        e.respondWith?.(Promise.resolve(
          text(`Added task #${task.id}: "${task.title}".`)
        ));
      }
    });
    

    Флаг agentInvoked паведамляе, хто нажаў кнопку, а respondWith() вяртае рэзультат агенту без перайходу на іншую сторону. Існуее адна сцэнарый з двума вызывальнікамі, што ўзято як гарны выбар у дызайне, таму што ніхто не хоча “версію AI” для кожнай дзеянні ў прыёмніку. Тая ж логіка павінна служыць як людзям, так і агентам, калі гэта мае сэнс.

    Дэкларатыўны падход, можа, ёсць менш цікавым, але самэ ўсё ж прывабляе увагу, адтолькі ўсё гэта гарная дэманстрацыя і не выклікае додатковых раздумаў. Там, дзе форма не можа выразіць, і пачынаецца цікавасць. Гэта другі падход — registerTool, які дужа супамінае тое, што можна было бы напісаць для сервера MCP у задній частцы прыёмніка.

    await mc.registerTool({
      name: 'list-tasks',
      description: 'List the tasks on the board. Use this before acting so you know the task IDs.',
      inputSchema: {
        type: 'object',
        properties: {
          status: { type: 'string', enum: ['all', 'open', 'done'] },
        },
      },
      annotations: { readOnlyHint: true },
      async execute({ status = 'all' }) {
        const rows = visible(tasks, status);
        return text(rows.map((t) => `#${t.id} [${t.done ? 'x' : ' '}] ${t.title}`).join('\n'));
      },
    });
    

    Аккуратнае розглядзеце таг description. Ён напісаны для модэлі, а не для распрацоўшчыка, а такія рэчы, як "выкорыстоўваеце гэта пры дзеянні, каб знаты ID заданняў", падказваюць, калі яго трэба вызваць. Апісанні цяпер ўжо ўскладнююць інтэрфейс API, а нечыясныя з іх прыводзяць да таго, што агенты выконваюць дзеянні на адчутку.

    Флаг readOnlyHint сігналізуе, што інструмент можна безпечна вызваць без падтрымкі корыстніка. Ён наявны ў list-tasks і estimate-task; у complete-task і clear-completed яго няма, таму што яны зміняюць стан дадзенняў.

    Інструменты таксама можу працаваць медленна, а агент можа змяніць сваё рашэння пасерэдзе. Інструмент estimate-task спецыяльна чакае тры секунды, і як другі аргумент ён получае AbortSignal.

    async execute({ id }, { signal }) {
      const t = findTask(tasks, id);
    
      if (!t) {
        return text(`No task #${id}.`);
      }
    
      await sleep(3000, signal); // throws if the agent aborts
    
      return text(
        `Task #${t.id} is about ${
          t.priority === 'high' ? '2 hours' : '30 minutes'
        }.`
      );
    }
    

    Калі паслаццаць на гэты сігнал, процэс анулювання будзе працаваць. Калі яго ігнараваць, адміністрацыйны прыстрой продовжыць працаваць пасля таго, як агент пакінуе.

    Спіс адміністрацыйных прыстраёў, які змініцца пад час адкрытага абаротку

    Найважлівэйшая прычына рэўістраціі адміністрацыйных прыстраёў у скрыпцы, у працоўнасці з статычным маніфестам, якраз у тым, што спіс можа змініцца пад час выканання. У сістэме ёсць адміністрацыйны прыстрой clear-completed, які вычышае ўсі завершаны заданні. Гэта мае сэнс толькі тады, калі якае-небудзь заданніе завершана, што і адказвае на тое, чаму ён з’яўіўся на паказцы экрана пасля таго, як тры заданнія былі пазначаныя як завершаныя. Такім чынам, ён існуе толькі ў такія моменты.

    let clearCtl = null;
    
    async function syncClearTool() {
      const has = tasks.some((t) => t.done);
    
      if (has && !clearCtl) {
        const ctl = new AbortController();
        clearCtl = ctl;
    
        await mc.registerTool(
          {
            name: 'clear-completed',
            /* ... */
          },
          {
            signal: ctl.signal
          }
        );
      } else if (!has && clearCtl) {
        const ctl = clearCtl;
        clearCtl = null;
    
        setTimeout(() => ctl.abort(), 0); // abort() IS unregister
      }
    }
    

    Няма такога методу unregisterTool(). Пад час рэгістрацыі вы пасылаеце AbortSignal, а абаранеце ў яго знімае інструмент. Самэлькае ў гэтым дзеянні: сігнал, які анулюее чынны вызов, таксама скасоўвае можлівасць вікорыстання інструмента, тады адна механізма выкананае два заведамы.

    Як толькі задача пазначаецца як завершаная, у спісе агента з’яўляецца clear-completed, а пасля таго, калі яе знімаюць з пазначкі, інструмент знікае. Агент даведаецца пра гэта праз запуск змены toolchange і яму не трэба выкананае польсавання.

    mc.addEventListener('toolchange', refreshTools);
    

    Такім чынам, спіс засобаў — гэта не маніфест, які публікуецца аднойчы. Ён опісвае, што можа робіць дапынг у своем нынешнім стане.

    У чым гэта адрозніцацца ад сервера MCP на бэкэндзе

    Далей ад Claude Code было патрабавана сузіць панель до завершаных задач.

    Агент вызваў filter-tasks з параметрам {"status":"done"}; кнопка «Завершыць» стала актыўной, і на панелі паказаліся толькі завершаныя задачы. Агент не запрашаў фільтраваную копію дадзеных. Ён проста змяніў відображэнне, якое бачыў корыстнік.

    Сервер MCP на бакэндзе не можа гэта здарыць. Знаходзячыся на протыягоўнай стороне меры сеткі, ён працуе з зберажанымі дадзеннямі і нічога не ведае пра тое, што зараз паказваецца на якомнебудзь экране. Адзінкі WebMCP працуюць унутранічна вікна, дзеячы з яго DOM, сесіяй і кукі, таму агент і чалавек бачаюць адны экран, і кожны з іх можа яго зменіць. Гэта як справжня перавага, так і справжнія рызык, прычыму якім прызначана адна з ніжэйшых секцый. Гэта таксама прычына, чаму называнне WebMCP «MCP унутранічна браузер» недае яго паважнага адзначэння. Важна тое, дзе знаходзіцца адзінок, адколі ён прыўязаны да самага стану стораніцы, якую бачыць корыстнік.

    Падключэнне званічнага агента

    Панель Pretend Agent дапамагае пад час разработкі, але ёй мало каліцы, калі ўсё ж такі гэта старонка, якая сама себе вызывае. Для правільнага тэставання патрэбна ўстанова за межамі браузера, якая можа бачыць толькі тое, што аддае getTools(). Таму існуе agent.mjs — маленькі інструмент у команднай лініі, які вікорыстоўвае часткі протаколу Chrome DevTools Protocol і не мае жадных залежнасцей, адтолькі ў Node 22 ёсць глобальны WebSocket. Па сваім прадзеўленні ён можа бачыць толькі тое, што аддае getTools(), і дзеяць толькі праз executeTool(), без можлівасці аналізу DOM.

    node agent.mjs list
    node agent.mjs call add-task '{"title":"Ship the demo","priority":"high"}'
    

    Этыя два каманды перыядаюць інструменты, а пасля вызываюць add-task з заглавлём і прыорытэтам. Настройкі, якія стварылі скрыншоты, ідуць на адзін крок даўжэй. Claude Desktop, Claude Code і ChatGPT выкарыстоўваюць MCP, а не WebMCP, таму mcp-bridge.mjs выступае як адаптар, прычым маленькі, каліха протаколы практычна адносова збігаюцца: tools/list супараджуецца з getTools(), а tools/call — з executeTool(). Claude Code перыядае гэта праз файл .mcp.json.

    {
      "mcpServers": {
        "webmcp-board": {
          "command": "node",
          "args": ["C:\\projects\\web-mcp-demo\\mcp-bridge.mjs"],
          "env": { "PAGE_URL": "https://tusharkanjariya.github.io/web-mcp-demo/" }
        }
      }
    }
    

    Цэлы ланцуг складаецца з таго, што Claude Code выкарыстоўвае MCP для спілкування з брыджам, брыдж выкарыстоўвае CDP для спілкування з Chrome, а Chrome запускае інструменты, якія зарэгістраваны на сторонцы. Гэта чатыры этапы, і старонка на канцы не можа з’ясаваць, які кліент знаходзіцца на іншай стороне.

    Claude Code
        ↓
    MCP
        ↓
    mcp-bridge.mjs
        ↓
    Chrome DevTools Protocol
        ↓
    WebMCP
        ↓
    my task board
    

    Ішчо адна зручна функцыя: калі на порту дыбаггінгу няма адказу, мост сам запускае свой Chrome і ачынае сторанку, калі карточкі няма. Кліент MCP можа запусціць усё з нуля.

    Адказ

    Потым ад агента патрабаваліся выдаліць адзін заведам.

    У верхней частцы скрыншота паказана запіта пра фільтрацыю з ранейшага момента. У ніжней частцы — сама цікавая частка: Claude сказаў, што на гэтым плэншэце ня існуе інструменту delete-task, што ўсё, што можна выдаліць, — гэта clear-completed, які таксама выдаліць заведамы №2, №3, №4 і №5, і што ён не збіраецца гэта робіць.

    Ніякі захоўнія бар’еры, прампты сістэмы чыраў або слоі безпекі не сталі прычыной адмовы. Магчымасць выдаліць адзін заведамасць проста не існавала, і агент гэта заўважыў. Было б памылкай надаўаць занадта велікаг значэння аднаму абмену паведамленнямі ў „іграшковым“ дапаможным прыладзе. Тым не менш, гэта зміняе спосаб, якім выглядае проблема. Агент, які керуе сторанай па пікселях і коордынатах, знайшоў бы ўсё, што магло б служыць для выдалення, і спробаваў бы гэта зробіць, адколі агенты для скрапінгу экрана маюць толькі імпровізацыю як альтэратыўу. Штырый агент перапісаў свае шасць інструментаў, пабачыў, што ніхто з іх не дапамагае выдаліць адзін заведамасць, усвядоміў пасябны наклеп ад найбліжэйшага варыянта і на час зупініўся, каб запытаць.

    Паверхня інструментаў была межой. Ніхто не напісаў правіла проты выдалення чаго-небудзь. Сторана проста ніколі не прымела выдалення як можлівасці, і гэтага было дастатнька, нават які WebMCP не робіць агентаў магічна безпечнымі.

    Дзе Chrome і спецыфікацыя не пагадваюцца

    Адміністрацыя прыстрою выявіла разніцу між документацыяй і прыемлівачам, і ўсуненне эйх разніц патрабавало часткі дня. Тры з іх стосуюцца фармату дадзеных.

    • Аргументы для executeTool(): у спецыфікацыі опісваецца об’ект, але Chrome 151 чакае JSON-строку, і об’ект спрычынае памятку Failed to parse input arguments.
    • RegisteredTool.inputSchema: у спецыфікацыі задаецца як об’ект, але Chrome вяртае JSON-строку, таму яе трэба парсаваць перш чым чытаць properties.
    • Тое, каму прыводзіць executeTool(): у спецыфікацыі зазначаецца DOMString, што ў правіле, але на самай працэ ёй ёсць серыяваны {content:[…]} кантэйнер, які трэба розпакаваць два разы, каб дася да тэксту.

    Нічага з гэтага няўажліва, калі ужо знаеш, як гэта робіць. Два прыбліжна прычынілі проблемы былі багі жыцёвага цыклу, і яны з’яўляюцца толькі тады, калі рэальны агент працуе з сторанайчыкам.

    Выклік form.reset() пад час выканання аплікацыі, запускаемай агентам, анулюе выклік інструмента з паведамленнем Tool execution cancelled by a form reset. Звычны працоўнік, які, як і большасць, спрабоўвае спрагнуць полья пасля аплікацыі, спрычыніў зупінку кожнай аплікацыі add-task, якая веліся агентам. Задача была створана, а адпаведна адпаведзь так і не прыйшла; самэльчына працоўнік, показаны раней, спрагнуе полья толькі пасля аплікацыі ад чалавека.

    У версіях Chrome ранейшых за 153 адзінкаванне інструмента таксама анулювала ўсія яго запыткі, які яшчэ выкананы. Гэта нешкодна, пакуль інструмент не адзінкаваецца сам з-за успеху. clear-completed выдалляе ўсія завершаныя задачы, таму нічога не застаецца незавершаным, і інструмент выйшае. У версіі 151 такі запыткі перарывалі сваю адпаведзь прытаму, што яна ўжо не магла быць вярнутая. Рашэннем яўляецца setTimeout(() => ctl.abort(), 0): адкладэнне перарыву на адну інтэрвал часу дазволяе запытку спачатку завершыцца. Гэта зрозумела метода і яна працуе, але адкладэнне завершэння працы інструмента на адну інтэрвал часу — гэта той тып патча, які варта пераглянуць пасля калькі выданняў Chrome.

    Адправка дэмаверсіі

    Дэманстрацыя ўсё цяпер статычная, таму GitHub Pages можа яе выдаваць без змян, а HTTPS забезпечвае безпечны кантэкст, які трэба для WebMCP. Такім чынам усі маюць працюючую панель задач, але не працюючы WebMCP, адколькі візітары, якія не настроілі спецыяльны флаг, яшчэ бачаюць, што document.modelContext не візначаны. Ёго выправленне вымагае наявнасці токена для праверкі паходжання ў <head>, зарэўнаванага як токен першай стороны, таму што Chrome адхоўляе токены трэціх сторон, размешчаныя ў тагах meta. У чыстым профіле без жадных флагоў modelContext вяртаўся як „object“ разам з усіма шасцьма інструментамі. Пробна версія будзе дзейсніца да Chrome 156.

    Пытанне пра безпеку без адпаведнай адпаведзі

    Інструменты WebMCP выконваюцца ў вікні, у якім ёсць адмаўчанне. Гэта і ёсць сэрца проблемы, а таксама і ўсё, што ў яе ёсць.

    У спефікацыі ёсць элемент untrustedContentHint, які выступае толькі як падказка. Як правільна працэваўка інжэкцыі запытоў застаецца нерашанай, а жадны з элементаў гэтага API не выступае як межа автарызацыі. Калі тэкст, кантролюемы хакерам, можа быць адрасаваны на сторанцы і прачытаны агентам, readOnlyHint не можа гэтаму запамагчы.

    Мост таксама можа быць доступны праз HTTP праз тунель, каб канектары ChatGPT моглі да яго дасягнуць. Ён функцыонуе, але трэба рэштыцаваць рэшткі, перш чым гэта рабіць, адтаколькі тунель адкрывае канец-пункт без автарызацыі, які дазваляе будзь-каму, хто здагадаецца пра адрэсу, запускаць інструменты ў вашай входзячай карточцы браузера. Дваццаць хвілін эксперыментаў — гэта нормальна, але залішаць яго працюючым на ноч чагосць не рабіць.

    Прабаўка ў вашай сабеўскай аплікацыі

    Адміністраторы веб-дзеяння можуць адразу за апоўнач пацэнаваць API, калі ён невялікі. Выберыце будзь-яю існуючую форму, дадзіце ёй атрыбуты toolname і tooldescription, пасля чаго ачыніце панель WebMCP у DevTools і пабачыце, як з’яўляецца адпаведны інструмент. Прыблізна дзесяць хвілін такай працы даюць больш інформацыі, чым ўсё інша гадзіна чытання.

    Гэты падход выходзіць за межы сынтаксісу. Чыстая адказа пра тое, што можа робіць ваша прыкладна програма, стала часткай самай програмы, а не дакументацыі, напісанай пазней. У кансоль вы не маглі выконваць аператыўную дзеянню выдалення адноўказова, таму агент ніколі нічога не выдаліў. Тое, што вяртае getTools(), вялічыць, як агент уяўляе сабе можлівасці вашай прыкладнай програмы, і гэтая уява постаўляее сам інтэрфейс. У дэманстрацыі было шасць інструментаў у трох файлах без жадных залежнасцей, таму падумайце, што ваша сабе стораніца могла б напісаць пра сябе. Ёй воспаваць, увімкніце флаг chrome://flags/#enable-webmcp-testing, а потым выконайце node agent.mjs list. Якшто як адказ будзе шасць інструментаў, значыць, вы размовляеце з веб-стораніцай так, як гэта рабіў бы агент.

    Швяжыя адказы

    Што такое WebMCP? Гэта запраектаваны API для прыгледача, за дапамогай якога сторанка можа публікуваць свае функцыі для агента AI як інструменты, якія можна вызваць, выкарыстоўваючы document.modelContext. Агенты вызываюць гэтыя інструменты безпасяродна, пры чым адмовяюцца ад скрапінгу DOM і коордынацыі клікаў.

    У чым яго адрозненне ад звычайнага сервера MCP? Серверы на бакэндзе працуюць за межамі сеткі і працююць з збераганымі дадзеннямі. Інструменты WebMCP працуюць у вікні прыгледача, таму яны можуць зменіць тое, што бачыць корыстнік, і яны пераўтараюць вікорыстоўванне сесіі і праваў сторанкі. Вызов filter-tasks візуальна змяніў панель.

    Як сторанка рэгіструе інструмент? Можна аддаваць атрыбуты toolname і tooldescription да існуючага формы і дазваляць браузеру вылучыць схему з поль, альбо вызываць document.modelContext.registerTool() з іменем, апісам, JSON Schema і функцыяй execute. Формы падходзяць для простых дзеянняў, а registerTool падтрымлівае все, чаго не можа выразіць форма.

    Чы трэба флаг? Наразе — так. Актывацыяй флага і перзапуск Chrome, альбо запускай яго з параметрам --enable-features=WebMCP. Для візітараў, якія не настаўілі флаг, падойдзе токен прыкладнага кантэкста на сторанцы ў <head>.

    Можае Claude Desktop чы рачат GPT вызваць гэтыя інструменты? Не самыя, таму што яны вікорыстоўваюць MCP замест WebMCP. Невялікі адаптар перадае tools/list на getTools(), а tools/call — на executeTool(). Код, які тут прадстаўлены, складаецца з апошніх 130 ліній, не выкарыстоўвае жадных залежнасцей і працюе праз stdio для локальных кліентаў.

    Чы гэта безпечна? Цяперашняя адпаведзь застаецца відкрытай. untrustedContentHint і readOnlyHint ўсьмо толькі падказкі; жадна з іх не пазначае межы праваў, а спецыфікацыя ўсё ўсё не выявіла проблему втрымкі запытоў. Ствараючы інтэрфейс інструментаў, трэба прыпускаць, што агент можа быць перакананы вызваць будзь-што з таго, што вы адкрываеце.

    Супаўзвязаныя матэрыялы

  • Serena MCP Server: Рэдагаванне коду з урахоўваннем сімвалаў для дапаможнікаў AI — Наладзіце Serena з Docker і SSE, каб Claude Code, VS Code і OpenCode мелі можлівасць абшукаціі сімвалаў за дапамогою LSP, безпечнага перэіменавання і стойкага запам’ятавання дадзеных з меншым колькам токенаў.